@conduction/nextcloud-vue 2.56.0-beta.3 → 2.56.0-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +12 -2
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +1 -2
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
- package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js.map +1 -1
- package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js +0 -3
- package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js.map +1 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +1 -2
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +21 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +12 -5
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +2 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
- package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js +9 -1
- package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js.map +1 -1
- package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js.map +1 -1
- package/dist/esm/components/CnContextMenu/CnContextMenu.vue2.js +6 -1
- package/dist/esm/components/CnContextMenu/CnContextMenu.vue2.js.map +1 -1
- package/dist/esm/components/CnContextMenu/CnContextMenu.vue3.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +116 -15
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +27 -14
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
- package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue2.js +13 -6
- package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue2.js.map +1 -1
- package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue3.js +2 -0
- package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +29 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js.map +1 -1
- package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js +1 -2
- package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +3 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +17 -17
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
- package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue2.js +4 -21
- package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js +0 -13
- package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js +8 -8
- package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue2.js.map +1 -1
- package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue3.js +3 -2
- package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +67 -13
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +15 -8
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/manifestActionDispatch.js +31 -11
- package/dist/esm/components/CnIndexPage/manifestActionDispatch.js.map +1 -1
- package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue2.js.map +1 -1
- package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue3.js +1 -2
- package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue3.js.map +1 -1
- package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js +0 -1
- package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue2.js +2 -17
- package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnLogsPage/CnLogsPage.vue2.js +35 -11
- package/dist/esm/components/CnLogsPage/CnLogsPage.vue2.js.map +1 -1
- package/dist/esm/components/CnLogsPage/CnLogsPage.vue3.js +3 -2
- package/dist/esm/components/CnLogsPage/CnLogsPage.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js +23 -5
- package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js +1 -1
- package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectList/CnObjectList.vue2.js +19 -3
- package/dist/esm/components/CnObjectList/CnObjectList.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectList/CnObjectList.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +45 -15
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +4 -2
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectRow/CnObjectRow.vue2.js +24 -6
- package/dist/esm/components/CnObjectRow/CnObjectRow.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectRow/CnObjectRow.vue3.js +1 -1
- package/dist/esm/components/CnObjectRow/CnObjectRow.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +0 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
- package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js +4 -2
- package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js.map +1 -1
- package/dist/esm/components/CnRowActions/CnRowActions.vue2.js +7 -2
- package/dist/esm/components/CnRowActions/CnRowActions.vue2.js.map +1 -1
- package/dist/esm/components/CnRowActions/CnRowActions.vue3.js.map +1 -1
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js +49 -5
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js.map +1 -1
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js +1 -1
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js.map +1 -1
- package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue2.js +5 -3
- package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTabs/CnTabs.vue2.js.map +1 -1
- package/dist/esm/components/CnTabs/CnTabs.vue3.js.map +1 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js +3 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js +1 -0
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue2.js +3 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js +3 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue2.js +6 -0
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue3.js +68 -53
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue2.js +17 -0
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue3.js +21 -19
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue2.js +3 -1
- package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue2.js +3 -1
- package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/email/CnEmailCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/email/CnEmailCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/email/CnEmailTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/email/CnEmailTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/email/CnEmailTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/flow/CnFlowCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/flow/CnFlowCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/flow/CnFlowCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/flow/CnFlowTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/flow/CnFlowTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/flow/CnFlowTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/flow/CnFlowTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/forms/CnFormsCard.vue2.js +3 -1
- package/dist/esm/integrations/builtin/forms/CnFormsCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/forms/CnFormsCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/forms/CnFormsTab.vue2.js +3 -1
- package/dist/esm/integrations/builtin/forms/CnFormsTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/forms/CnFormsTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/forms/CnFormsTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/maps/CnMapsCard.vue2.js +3 -1
- package/dist/esm/integrations/builtin/maps/CnMapsCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/maps/CnMapsCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/maps/CnMapsTab.vue2.js +3 -1
- package/dist/esm/integrations/builtin/maps/CnMapsTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/maps/CnMapsTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/maps/CnMapsTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue2.js +3 -1
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue2.js +3 -1
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/polls/CnPollsCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/polls/CnPollsCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/polls/CnPollsCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/polls/CnPollsTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/polls/CnPollsTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/polls/CnPollsTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/polls/CnPollsTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/shares/CnSharesTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/shares/CnSharesTab.vue3.js +3 -6
- package/dist/esm/integrations/builtin/shares/CnSharesTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/talk/CnTalkCard.vue2.js +3 -1
- package/dist/esm/integrations/builtin/talk/CnTalkCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/talk/CnTalkCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/talk/CnTalkTab.vue2.js +3 -1
- package/dist/esm/integrations/builtin/talk/CnTalkTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/talk/CnTalkTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/talk/CnTalkTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue2.js +4 -1
- package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue2.js +6 -3
- package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue3.js.map +1 -1
- package/dist/esm/l10n/en.json.js +2 -0
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +2 -0
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/nextcloud-vue.css +78 -7
- package/dist/esm/utils/actionLink.js +5 -0
- package/dist/esm/utils/actionLink.js.map +1 -1
- package/dist/esm/utils/actionsDispatcher.js +16 -1
- package/dist/esm/utils/actionsDispatcher.js.map +1 -1
- package/dist/esm/utils/linkNavigation.js +6 -3
- package/dist/esm/utils/linkNavigation.js.map +1 -1
- package/dist/esm/utils/rowAuxClick.js +30 -5
- package/dist/esm/utils/rowAuxClick.js.map +1 -1
- package/dist/esm/utils/safeHref.js +18 -3
- package/dist/esm/utils/safeHref.js.map +1 -1
- package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +885 -393
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +78 -7
- package/l10n/en.json +2 -0
- package/l10n/nl.json +2 -0
- package/package.json +1 -1
- package/src/components/CnActionsBar/CnActionsBar.vue +14 -5
- package/src/components/CnActionsMenu/CnActionsMenu.vue +0 -3
- package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +1 -2
- package/src/components/CnAppRoot/CnAppRoot.vue +31 -2
- package/src/components/CnBoardView/CnBoardView.vue +13 -5
- package/src/components/CnCardGrid/CnCardGrid.vue +9 -1
- package/src/components/CnContextMenu/CnContextMenu.vue +6 -1
- package/src/components/CnDataTable/CnDataTable.md +1 -1
- package/src/components/CnDataTable/CnDataTable.vue +131 -17
- package/src/components/CnDateAxisView/CnDateAxisView.vue +15 -6
- package/src/components/CnDetailPage/CnDetailPage.md +1 -1
- package/src/components/CnDetailPage/CnDetailPage.vue +29 -1
- package/src/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue +1 -2
- package/src/components/CnFilesBrowser/CnFilesBrowser.vue +5 -3
- package/src/components/CnFilesWidget/CnFilesWidget.vue +4 -21
- package/src/components/CnFlowRunsWidget/CnFlowRunsWidget.vue +8 -21
- package/src/components/CnFlowsPage/CnFlowsPage.vue +2 -1
- package/src/components/CnIndexPage/CnIndexPage.vue +75 -14
- package/src/components/CnIndexPage/manifestActionDispatch.js +31 -11
- package/src/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue +1 -2
- package/src/components/CnInteractionFormWidget/CnInteractionFormWidget.vue +0 -1
- package/src/components/CnLinkButtonWidget/CnLinkButtonWidget.vue +2 -17
- package/src/components/CnLogsPage/CnLogsPage.vue +37 -12
- package/src/components/CnObjectCard/CnObjectCard.vue +24 -6
- package/src/components/CnObjectList/CnObjectList.vue +19 -3
- package/src/components/CnObjectListWidget/CnObjectListWidget.vue +47 -15
- package/src/components/CnObjectRow/CnObjectRow.vue +25 -7
- package/src/components/CnObjectSidebar/CnFilesTab.vue +0 -1
- package/src/components/CnPageRenderer/CnPageRenderer.vue +2 -0
- package/src/components/CnRowActions/CnRowActions.vue +7 -2
- package/src/components/CnSetupWizard/CnSetupWizard.vue +57 -6
- package/src/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue +5 -3
- package/src/components/CnTabs/CnTabs.vue +7 -3
- package/src/components/CnTasksWidget/CnTasksWidget.vue +4 -1
- package/src/css/table.css +26 -0
- package/src/integrations/builtin/analytics/CnAnalyticsCard.vue +3 -2
- package/src/integrations/builtin/analytics/CnAnalyticsTab.vue +5 -6
- package/src/integrations/builtin/bookmarks/CnBookmarksCard.vue +12 -1
- package/src/integrations/builtin/bookmarks/CnBookmarksTab.vue +23 -6
- package/src/integrations/builtin/bookmarks/__tests__/CnBookmarksTab.spec.js +7 -2
- package/src/integrations/builtin/collectives/CnCollectivesCard.vue +3 -2
- package/src/integrations/builtin/collectives/CnCollectivesTab.vue +5 -6
- package/src/integrations/builtin/cospend/CnCospendCard.vue +2 -2
- package/src/integrations/builtin/cospend/CnCospendTab.vue +3 -4
- package/src/integrations/builtin/deck/CnDeckCard.vue +2 -2
- package/src/integrations/builtin/deck/CnDeckTab.vue +3 -4
- package/src/integrations/builtin/email/CnEmailCard.vue +6 -2
- package/src/integrations/builtin/email/CnEmailTab.vue +7 -4
- package/src/integrations/builtin/flow/CnFlowCard.vue +2 -2
- package/src/integrations/builtin/flow/CnFlowTab.vue +3 -4
- package/src/integrations/builtin/forms/CnFormsCard.vue +3 -2
- package/src/integrations/builtin/forms/CnFormsTab.vue +5 -6
- package/src/integrations/builtin/maps/CnMapsCard.vue +3 -2
- package/src/integrations/builtin/maps/CnMapsTab.vue +5 -6
- package/src/integrations/builtin/maps/__tests__/CnMapsTab.spec.js +9 -0
- package/src/integrations/builtin/openproject/CnOpenprojectCard.vue +3 -2
- package/src/integrations/builtin/openproject/CnOpenprojectTab.vue +5 -6
- package/src/integrations/builtin/photos/CnPhotosCard.vue +2 -2
- package/src/integrations/builtin/photos/CnPhotosTab.vue +3 -4
- package/src/integrations/builtin/polls/CnPollsCard.vue +2 -2
- package/src/integrations/builtin/polls/CnPollsTab.vue +3 -4
- package/src/integrations/builtin/shares/CnSharesTab.vue +3 -6
- package/src/integrations/builtin/talk/CnTalkCard.vue +3 -2
- package/src/integrations/builtin/talk/CnTalkTab.vue +5 -6
- package/src/integrations/builtin/time-tracker/CnTimeTrackerCard.vue +2 -2
- package/src/integrations/builtin/time-tracker/CnTimeTrackerTab.vue +3 -4
- package/src/integrations/builtin/xwiki/CnXwikiCard.vue +4 -2
- package/src/integrations/builtin/xwiki/CnXwikiTab.vue +7 -7
- package/src/integrations/builtin/xwiki/__tests__/CnXwikiTab.spec.js +9 -0
- package/src/schemas/app-manifest-v2.schema.json +2 -1
- package/src/utils/actionLink.js +5 -0
- package/src/utils/actionsDispatcher.js +15 -0
- package/src/utils/linkNavigation.js +6 -3
- package/src/utils/rowAuxClick.js +29 -4
- package/src/utils/safeHref.js +18 -3
- package/src/utils/validateManifestV2.compiled.js +2 -2
|
@@ -3,10 +3,10 @@ import { __module as validateManifestV2_compiled } from '../_virtual/validateMan
|
|
|
3
3
|
import '../node_modules/ajv/dist/runtime/ucs2length.js';
|
|
4
4
|
import { __exports as ucs2length } from '../_virtual/ucs2length.js';
|
|
5
5
|
|
|
6
|
-
validateManifestV2_compiled.exports = validate20;validateManifestV2_compiled.exports.default = validate20;const schema31 = {"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://raw.githubusercontent.com/ConductionNL/nextcloud-vue/main/src/schemas/app-manifest-v2.schema.json","title":"Conduction App Manifest v2","description":"v2 schema for the JSON-driven page and navigation manifest consumed by @conduction/nextcloud-vue. Introduces a uniform widgets[] array on every page type with a per-slot grid coordinate system, a typed actions[] discriminator, and the required $schema field for version detection. v1 manifests continue to validate against app-manifest.schema.json (unchanged).","version":"2.41.0","type":"object","required":["$schema","version"],"allOf":[{"$comment":"UI manifests: a manifest that declares pages MUST also declare menu (unchanged v2 coupling).","if":{"required":["pages"]},"then":{"required":["menu"]}},{"$comment":"Observability-only profile: a manifest with no pages MUST carry an observability block. ADR-040 Tier-0 adopters (e.g. nldesign, planix) ship src/manifest.json solely as AppHost engine config — the app renders no manifest-driven UI, so forcing menu/pages on them produced permanently-failing gate-22 manifests (2026-07-06 fleet audit, item 3b).","if":{"not":{"required":["pages"]}},"then":{"required":["observability"]}}],"additionalProperties":false,"properties":{"$schema":{"type":"string","format":"uri","description":"REQUIRED in v2. Must point to the v2 schema URL: https://raw.githubusercontent.com/ConductionNL/nextcloud-vue/main/src/schemas/app-manifest-v2.schema.json. Presence of this field enables the validator to dispatch to the v2 Ajv instance rather than the v1 hand-rolled validator."},"version":{"type":"string","pattern":"^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$","description":"Semver of the manifest content. Bump when the manifest changes meaningfully. Used for cache busting and app-builder migration tracking. Distinct from the schema's own version."},"openbuildEditable":{"type":"boolean","default":true,"description":"Whether the Buildiq in-app edit button (ADR-041) is offered on this app's pages. Default true. Set false to suppress it — e.g. Buildiq's own UI, which does not edit itself with itself. Read by CnAppRoot to gate `cnOpenBuildAvailable`. The property name and the inject key keep their `openbuild` spelling: both are data/runtime contracts that shipped manifests and consumer apps already carry, so the 2026-08-21 OpenBuild → Buildiq rename deliberately left them untouched."},"dependencies":{"type":"array","default":[],"items":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":false,"required":["id"],"properties":{"id":{"type":"string","description":"Nextcloud app id."},"required":{"type":"boolean","default":true,"description":"true (default) = HARD: absence blocks the app shell behind CnDependencyMissing. false = SOFT: an optional integration whose absence surfaces a dismissible in-shell notice and never blocks."},"name":{"type":"string","description":"Human-readable display label; falls back to id."}}}]},"description":"Nextcloud app dependencies. Each entry is either a string (a HARD dependency — the app cannot run without it, absence blocks the shell) or an object { id, required?, name? } where required:false marks a SOFT (optional) dependency (required defaults to true). CnAppRoot checks each via useAppStatus(id); unresolved HARD deps block behind CnDependencyMissing, unresolved SOFT deps show a dismissible NcNoteCard banner. Sentinels (@resolve:*) are NOT allowed here — resolved at build time against known app IDs."},"setup":{"type":"object","additionalProperties":false,"required":["steps"],"description":"First-time setup wizard (ADR-042). Rendered by CnSetupWizard; required steps gate the app via CnAppRoot's setup phase. Steps run privileged server-side actions via /api/setup/action — the wizard never writes OpenRegister objects from the browser.","properties":{"enabled":{"type":"boolean","default":true,"description":"Whether the setup wizard is active for this app."},"version":{"type":"integer","default":1,"description":"Setup contract version; bump to re-trigger setup after a breaking change."},"completionConfigKey":{"type":"string","description":"App-config key storing the completed setup version."},"steps":{"type":"array","description":"Ordered setup steps rendered by CnSetupWizard.","items":{"type":"object","additionalProperties":false,"required":["id","type"],"properties":{"id":{"type":"string","description":"Unique step id; also the #step-<id> slot name."},"type":{"type":"string","enum":["info","config-fields","choice","run-action","summary","component"],"description":"Built-in step renderer."},"title":{"type":"string"},"body":{"type":"string","description":"info: explanatory copy."},"required":{"type":"boolean","default":false,"description":"When true the step gates the app until done."},"schema":{"description":"config-fields: a JSON Schema ref (string) or inline object rendered via fieldsFromSchema."},"configKey":{"type":"string","description":"choice: app-config key the selection is written to."},"configKeys":{"type":"array","items":{"type":"string"},"description":"config-fields: app-config keys the fields write."},"options":{"type":"array","description":"choice: selectable options.","items":{"type":"object","additionalProperties":false,"required":["value","label"],"properties":{"value":{},"label":{"type":"string"}}}},"optionsSource":{"type":"string","description":"choice: where to read the option list from at runtime, instead of declaring it here. Names a key in the app's own GET /api/setup/status document (dots walk into nested objects, e.g. `profiles`). Entries accept `id` for `value` and `name` for `label`, and a numeric `objectCount` becomes the stat a card shows. Use it when the SERVER owns what is on offer, so the manifest cannot drift from it."},"display":{"type":"string","enum":["select","cards"],"default":"select","description":"choice: how the options are rendered. `select` is a dropdown; `cards` is a grid of CnChoiceCards, which shows each option's description and stats. Pick cards when the choice needs explaining."},"dependsOn":{"type":"string","description":"choice: the configKey of a previous choice step this one cascades from. Disabled until the parent is set; its option list is taken from optionsByParent[parentValue] (e.g. organisation-type depends on country)."},"optionsByParent":{"type":"object","description":"choice: map of parent-choice value → options[] for a dependent (dependsOn) choice. Same option item shape as `options`.","additionalProperties":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["value","label"],"properties":{"value":{},"label":{"type":"string"}}}}},"suggestFrom":{"type":"string","description":"choice: the configKey of an earlier choice this step pre-fills a suggestion from. When that value is set and the user has not yet picked here, the option matching suggestMap[parentValue] is auto-selected (still user-overridable)."},"suggestMap":{"type":"object","description":"choice: map of suggestFrom value → suggested option value. Used to auto-suggest a default (e.g. RGS template suggested from organisation type).","additionalProperties":{"type":"string"}},"multiple":{"type":"boolean","default":false,"description":"choice: allow multi-select."},"action":{"type":"string","description":"run-action: actionId POSTed to /api/setup/action/{action}."},"healthCheck":{"type":"boolean","default":false,"description":"summary: render a health recap."},"component":{"type":"string","description":"component: app-registered component name (or use the #step-<id> slot)."}}}}}},"walkthrough":{"type":"object","additionalProperties":false,"description":"Abstract product walkthrough (ADR-043). One or more spotlighted, versioned tours rendered by CnWalkthrough over the live shell.","required":["tours"],"properties":{"enabled":{"type":"boolean","default":true,"description":"Master switch; when false no tour auto-starts."},"version":{"type":"integer","description":"Walkthrough contract version."},"completionConfigKey":{"type":"string","description":"Per-user app-config key holding the last app version whose tour the user has seen."},"tours":{"type":"array","description":"The app's tours.","items":{"type":"object","additionalProperties":false,"required":["id","steps"],"properties":{"id":{"type":"string","description":"Unique tour id (globally unique for cross-app hand-off, e.g. 'pipelinq:lead-to-bill')."},"title":{"type":"string","description":"i18n key / text for the tour name (restart menu)."},"trigger":{"type":"string","enum":["first-visit","version-bump","empty-index","manual"],"default":"manual","description":"When the tour auto-starts."},"minAppVersion":{"type":"string","description":"Semver; the tour is inert below this app version."},"steps":{"type":"array","description":"Ordered steps.","items":{"type":"object","additionalProperties":false,"required":["id","target","advanceOn"],"properties":{"id":{"type":"string","description":"Unique step id within the tour."},"title":{"type":"string","description":"i18n key / text for the coachmark title."},"body":{"type":"string","description":"i18n key / text for the coachmark body; supports {{contextVar}} interpolation."},"task":{"type":"string","description":"Optional 'go do this' instruction; presence + a non-manual advanceOn makes this an enforced action step."},"sinceVersion":{"type":"string","description":"Semver the step was introduced in; drives the 'what's new' composition."},"placement":{"type":"string","enum":["auto","top","bottom","left","right","center"],"default":"auto","description":"Coachmark placement; 'center' renders anchorless with no cutout."},"optional":{"type":"boolean","default":false,"description":"Skip gracefully when the target/condition is absent."},"allowManualNext":{"type":"boolean","default":false,"description":"Show a manual Next escape hatch on an enforced action step."},"handoff":{"type":"object","additionalProperties":false,"required":["url"],"description":"Cross-app hand-off (ADR-043). When present, the coachmark primary action becomes 'Continue in {app}' and navigates to `url` carrying a cn_resume_tour/cn_resume_step token so the destination app resumes the named tour.","properties":{"app":{"type":"string","description":"Destination Conduction app id (label + intent)."},"url":{"type":"string","description":"Destination URL to navigate to."},"tour":{"type":"string","description":"Tour id to resume in the destination (defaults to this tour's id)."},"step":{"type":"string","description":"Step id to resume at (defaults to the destination tour's first step)."}}},"target":{"type":"object","additionalProperties":false,"required":["kind"],"description":"What the step spotlights.","properties":{"kind":{"type":"string","enum":["nav-item","widget","action","page","element","selector"],"description":"Resolution strategy."},"ref":{"type":"string","description":"Stable id: route name (nav-item/page), widgetKey (widget), action id (action), or data-walkthrough-id / data-testid (element)."},"app":{"type":"string","description":"Optional other Conduction app id for a cross-app target (page kind)."},"selector":{"type":"string","description":"Raw CSS selector for kind:selector (last resort)."}}},"advanceOn":{"type":"object","additionalProperties":false,"required":["type"],"description":"Condition that advances the step.","properties":{"type":{"type":"string","enum":["manual","click-target","route-match","element-appears","object-created","delay"],"description":"Advance trigger."},"route":{"type":"string","description":"route-match: the route name to await."},"register":{"type":"string","description":"object-created: OR register slug."},"schema":{"type":"string","description":"object-created: OR schema slug."},"selector":{"type":"string","description":"element-appears: selector to await."},"ms":{"type":"integer","minimum":0,"description":"delay: milliseconds before auto-advance."},"capture":{"type":"object","additionalProperties":{"type":"string"},"description":"Map of contextVar -> ':param' (route-match) or ':id' (object-created) captured into the tour context for {{var}} interpolation."}}}}}}}}}}},"support":{"type":"object","additionalProperties":false,"description":"First-open support and donation note. CnAppRoot mounts CnSupportDialog once per user on first open and reads this block; CnEditSupportModal edits it. Omitting the block keeps the default-on behaviour with the shell's own copy, so an app only declares what it wants to override. The block was read by CnAppRoot and written by CnEditSupportModal before it was declared here, which made `additionalProperties: false` reject every manifest that set it.","properties":{"enabled":{"type":"boolean","description":"Whether the note is shown on first open. Omit for the default (true); set false to suppress it for this app."},"title":{"type":"string","description":"Dialog heading. Blank keeps the shell default."},"appName":{"type":"string","description":"Display name interpolated into the body copy. Defaults to the host app's name."},"bodyParagraphs":{"type":"array","description":"Body copy, one entry per paragraph, replacing the shell's default paragraphs.","items":{"type":"string"}},"founderName":{"type":"string","description":"Signature name."},"founderTitle":{"type":"string","description":"Signature role, shown under the name."},"founderAvatarUrl":{"type":"string","description":"Signature avatar image URL."},"founderProfileUrl":{"type":"string","description":"Profile the signature avatar links to."},"buttons":{"type":"object","additionalProperties":false,"description":"Per-button overrides, keyed by the four built-in button ids. Each may be hidden, relabelled, restyled or re-pointed; omit a key to keep its default.","properties":{"donate":{"$ref":"#/$defs/supportButton"},"support":{"$ref":"#/$defs/supportButton"},"feature-request":{"$ref":"#/$defs/supportButton"},"app-store":{"$ref":"#/$defs/supportButton"}}}}},"personalisation":{"$ref":"#/$defs/personalisation","description":"App defaults for the per-user options CnPersonalPreferences renders, and the switch that turns the personal layer off instance wide."},"nav":{"type":"object","additionalProperties":false,"description":"Navigation-level configuration consumed by CnAppNav.","properties":{"includePersonalSettings":{"type":"boolean","default":true,"description":"Auto-prepend a 'Personal settings' entry at the top of the settings foldout (opens the host's NcAppSettingsDialog via cnOpenUserSettings). Set false for apps with no per-user settings."},"settingsLabel":{"type":"string","description":"Override label for the settings foldout's gear button. Defaults to 'Settings'."},"primaryAction":{"$ref":"#/$defs/primaryAction","description":"App-wide default primary action rendered as an NcAppNavigationNew button above the main menu list. A page-scoped pages[].primaryAction for the current route wins over this default."},"featureRequestRepo":{"type":"string","description":"`<owner>/<repo>` slug on the forge that the in-product feature-request deep-link targets (provided to descendants as `cnFeatureRequestRepo`). Falls back to `Conduction/<appId>` when omitted."},"forge":{"type":"object","additionalProperties":false,"description":"Forge that the in-product feature-request deep-link targets. Switching the whole fleet's forge (onto a self-hosted Forgejo/Gitea, or back to Codeberg) is just this one field. Defaults to GitHub, the only host the fleet publishes to.","properties":{"type":{"type":"string","enum":["codeberg","forgejo","gitea","github"],"default":"github","description":"Forge type. Selects how the 'new issue' form is pre-filled: `github` uses per-field Issue-Form query params; `codeberg`/`forgejo`/`gitea` assemble a Markdown body (only title + body are supported there)."},"baseUrl":{"type":"string","description":"Override the forge host. Required for self-hosted `forgejo`/`gitea`; optional for `codeberg`/`github` (their canonical public hosts are used when omitted)."}}}}},"runtime":{"type":"object","description":"Runtime context data injected into the manifest by the backend (e.g. OpenRegister) at serve time. Carries per-user fields that visibleIf context-path predicates resolve against. The canonical sub-object is 'user', which exposes user-specific flags and role information.","additionalProperties":true,"properties":{"user":{"type":"object","description":"Per-user runtime context. Populated by the backend for authenticated requests. All fields are optional; the FE predicate evaluator treats missing fields as undefined.","additionalProperties":true},"theme":{"$ref":"#/$defs/runtimeTheme","description":"NL Design System scoped theme selection (scoped-theme-applier). Consumed by CnAppRoot's useScopedTheme wiring, not by the backend."}}},"menu":{"type":"array","items":{"$ref":"#/$defs/menuItem"},"description":"Top-level navigation entries rendered by CnAppNav."},"pages":{"type":"array","items":{"$ref":"#/$defs/page"},"description":"Page definitions dispatched by CnPageRenderer. Each page's id is also its vue-router route name. Ids MUST be unique across the array; uniqueness is enforced by validateManifestV2 as a post-schema check."},"adminSettings":{"type":"array","items":{"$ref":"#/$defs/adminSettingsEntry"},"description":"Admin-only settings sections rendered by CnAppRoot's generic admin NcAppSettingsDialog, gated on app-owner-group membership (not OC.isUserAdmin()). An absent key or an empty array yields no admin nav entry and no admin dialog. See the manifest-admin-settings and admin-settings-owner-gating capabilities."},"credentials":{"type":"array","description":"External-provider credentials this app can use via the OpenRegister credential broker (github, gitlab, …). Each entry declares which provider, why, and at what scope; the app never receives the secret — the broker performs the outbound call on the user's behalf. See the credential-broker capability.","items":{"type":"object","required":["provider"],"additionalProperties":false,"properties":{"provider":{"type":"string","description":"Catalogue provider identifier (e.g. \"github\", \"gitlab\") — a key in OpenRegister's credential-providers catalogue."},"reason":{"type":"string","description":"Human-readable reason shown to the user in credential settings (why the app wants this provider)."},"scopes":{"type":"array","items":{"type":"string"},"description":"Advisory scopes the app needs (e.g. [\"repo\"])."}}}},"schedules":{"type":"array","description":"Declarative scheduled tasks (apphost-scheduling capability). Each entry declares a recurring task the OpenRegister AppHost schedule-reconciler turns into an Integriq job that runs on the existing background-job path — so a manifest-driven app (including a pure-virtual Buildiq app with no PHP on disk) can own its ingestion/maintenance cadence without shipping a TimedJob. The temporal peer of `credentials`/`observability`: consumed by the OpenRegister engine, NOT by the Vue renderer. Optional and additive.","items":{"type":"object","required":["id","action"],"additionalProperties":false,"oneOf":[{"required":["interval"],"not":{"required":["cron"]}},{"required":["cron"],"not":{"required":["interval"]}}],"properties":{"id":{"type":"string","description":"Stable identifier for this schedule, unique within the manifest. The reconciled job is keyed on applicationId + this id, so renaming it creates a new job and orphans the old one (which is then garbage-collected)."},"interval":{"type":"integer","minimum":1,"description":"Run cadence in seconds (e.g. 604800 = weekly). Exactly one of `interval` or `cron` must be set."},"cron":{"type":"string","description":"Standard 5-field cron expression (e.g. \"0 3 * * 1\"). The reconciler computes the job's nextRun from it. Exactly one of `interval` or `cron` must be set."},"action":{"type":"string","pattern":"^[a-z0-9]+:[a-z0-9-]+$","description":"A server-allow-listed generic action type, NOT a PHP class name. Only vetted types are accepted (v1: \"openconnector:synchronization\"); the reconciler maps the type to a trusted jobClass — a manifest-supplied class name is never executed. A non-allow-listed action is rejected and logged."},"arguments":{"type":"object","description":"Free-form arguments passed to the action (e.g. the synchronization id/ref). Interpreted by the vetted action, not by the reconciler.","additionalProperties":true},"enabled":{"type":"boolean","description":"Whether this schedule is active. Defaults to true. Setting false disables the reconciled job (preserving its run history) rather than deleting it."}}}},"observability":{"$ref":"#/$defs/observability","description":"Declarative observability block (ADR-040). Consumed at request time by the OpenRegister AppHost observability engine (GenericHealthController + GenericMetricsController), NOT by the Vue renderer. Declares the app's health checks and Prometheus metric descriptors so adopting apps ship zero hand-written observability PHP while keeping their /api/health + /api/metrics URLs and the ADR-006 contract."},"store":{"type":"object","description":"ADR-080 / ADR-114 Decision 4. The declarative store plane. An app that declares this block gets a working Store surface with NO backend of its own: OpenRegister's AppHost aliases /api/store/items and /api/store/items/{slug}/install at its GenericStoreController, which reads this block at request time. Discovery stays in the engine (the SSRF guard, the redirect refusal and the registry token never leave it) and the app builds no registry URL.","additionalProperties":false,"anyOf":[{"required":["schema"],"title":"An objects store names the remote schema its registry serves."},{"required":["types"],"title":"A configuration store names the shareable types it surfaces."}],"properties":{"schema":{"type":"string","description":"Remote schema slug the registry serves (e.g. \"case-type-template\", \"application-template\")."},"register":{"type":"string","description":"Remote register segment, used when the instance's registry_register config is unset or empty."},"localRegister":{"type":"string","description":"The register an install WRITES into. Defaults to the app id. A schema slug is NOT unique across the fleet (`case`, `task` and `document` exist in several apps at once), so an unscoped write can land in another app's register: an app whose OpenRegister register slug differs from its app id must set this."},"installable":{"type":"array","items":{"type":"string"},"description":"Schema slugs an install may write. THIS IS A SECURITY BOUNDARY, not a convenience: a registry is somebody else's server, and without the allowlist an item could name any schema the app owns. An absent or empty list refuses EVERY install rather than permitting every install."},"kinds":{"type":"array","items":{"type":"string"},"description":"Kind quick-filters (ADR-080 Decision 5). Declared ONCE here, beside the allowlist: the engine returns them in the search response and CnStorePage prefers them over its page config. Defaults to the shared vocabulary when omitted."},"types":{"type":"array","items":{"type":"string"},"description":"Shareable configuration type ids this store surfaces (store-over-federated-config). Declaring these makes the store exchange CONFIGURATION rather than rows: an item is a configuration set (`openregister.configset`), a flow (`openregister.flows`), a register with its schemas (`openregister.registers`), or any schema that marked itself `x-openregister-shareable`. Cards come from federated discovery and an install runs through the owning type, so a set arrives as registers, schemas, objects, views, flows, sources and mappings. An app that declares none keeps the remote objects API described by `schema`/`register`, and makes no discovery call at all."},"cardFields":{"type":"object","additionalProperties":{"type":"string"},"description":"Card field to remote property map. Defaults to the field names the fleet's registries already publish."},"builtIn":{"type":"array","description":"The items this app ships itself, rendered when no registry is configured or the registry does not answer. ADR-080 Decision 4 makes this the price of the word Store: a surface that goes blank without a registry was never a store.","items":{"type":"object","additionalProperties":false,"required":["slug","title"],"properties":{"slug":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"kind":{"type":"string"}}}},"_note":{"type":"string","description":"Free-text rationale, ignored at runtime."}}},"deepLinks":{"type":"array","items":{"$ref":"#/$defs/deepLink"},"description":"ADR-040: object deep-link descriptors consumed by the integration registry / cross-app linking, NOT by the Vue renderer. Optional and additive."},"pageTemplates":{"type":"array","items":{"$ref":"#/$defs/pageTemplate"},"description":"Entity-scaffold page templates (manifest-entity-scaffold-templating). A template declares one reusable index/detail page shape ONCE, with `{{param}}` placeholders for the parts that vary per entity (register/schema binding, label, field/column subset) and a declared parameter list. The expander (utils/expandPageTemplates) materialises `pageInstances[]` into concrete `pages[]` at build/boot time, so CnPageRenderer only ever sees concrete pages and is unchanged by templating. Optional and additive: a manifest without pageTemplates is unaffected."},"pageInstances":{"type":"array","items":{"$ref":"#/$defs/pageInstance"},"description":"Per-entity template instantiations. Each entry references a `pageTemplates[]` template by `templateRef` and supplies only the values that vary. The expander substitutes them into the referenced template and appends the resulting concrete pages to `pages[]`. Expansion FAILS (named error) on an unknown templateRef or a missing required template parameter. Optional and additive."},"sets":{"type":"object","description":"Named, reusable field/column/sidebar sets referenced from templates via a `{{set:NAME}}` placeholder, so a repeated field/column/sidebar block is declared ONCE and shared across templates and pages instead of being re-listed. Each value is arbitrary JSON (typically an array of field/column defs or a sidebar object). Optional and additive.","additionalProperties":true},"mcp":{"type":"object","title":"MCP tool visibility hints","description":"OPTIONAL. Advisory visibility/UX hints for MCP tool surfaces (Hermiq agent tool picker, openbuild tool browser). Purely presentational: per ADR-063, OpenRegister's register (x-openregister-mcp dialect + #[McpTool] attributes) is the single source of CRUD-tool truth and OpenRegister RBAC is the authoritative invoke-time gate. This block grants no access and gates nothing; nothing in nextcloud-vue consumes it.","additionalProperties":false,"properties":{"expose":{"type":"boolean","title":"App-level exposure hint","description":"Advisory app-wide default for whether this app's register-derived MCP tools should be shown in agent / tool-picker surfaces. Advisory only — the authoritative gate is OpenRegister RBAC plus per-agent whitelists. Defaults to false (opt-in), matching ADR-063's default-OFF exposure model.","default":false},"pageTools":{"type":"object","title":"Per-page tool hints","description":"Maps a pages[].id to the ordered list of MCP tool ids that are contextually relevant on that page. Advisory grouping for UX surfaces only; it does not grant access. Keys are expected to match an existing pages[].id; the register remains authoritative for whether each listed tool actually exists.","additionalProperties":{"type":"array","title":"Relevant tool ids for a page","description":"Ordered MCP tool ids relevant to the page keyed above. Advisory ordering only.","items":{"type":"string","title":"MCP tool id","description":"A fully-qualified MCP tool id in the register's derived-CRUD shape {appId}.{schemaSlug}.{verb}, verb one of search|get|create|update|delete (ADR-063). Example only: \"pipelinq.lead.search\". The register is authoritative for existence; this is a hint.","pattern":"^[a-z0-9_-]+\\.[a-zA-Z0-9_-]+\\.(search|get|create|update|delete)$"}}},"agentHints":{"type":"object","title":"Agent-facing hints","description":"Advisory metadata for agent surfaces (Hermiq). All values are non-authoritative UX hints. Additional properties are permitted so consuming surfaces can introduce new advisory hints without a schema release (forward compatibility).","additionalProperties":true,"properties":{"summary":{"type":"string","title":"App tool summary","description":"One-line description of what this app's tools help an agent accomplish. Shown in agent / tool-picker surfaces."},"defaultTools":{"type":"array","title":"Default tool ids","description":"MCP tool ids to surface first / preselect when an agent has no page context. Advisory ordering hint only; not a grant.","items":{"type":"string","title":"MCP tool id","description":"Fully-qualified MCP tool id {appId}.{schemaSlug}.{verb}. Example only: \"pipelinq.lead.search\"."}},"keywords":{"type":"array","title":"Discovery keywords","description":"Keywords helping progressive-disclosure / tool-search surfaces (Hermiq) rank this app's tools. Advisory only.","items":{"type":"string","title":"Keyword","description":"A single discovery keyword."}}}}}}},"$defs":{"rowIndicator":{"type":"object","additionalProperties":false,"required":["field","text"],"description":"One declared state indicator on an index page's rows. Renders as an icon with a text alternative and a tooltip, never as colour alone.","properties":{"id":{"type":"string","minLength":1,"description":"Stable id for this indicator, used as its test id and its render key. Defaults to `field`."},"field":{"type":"string","minLength":1,"description":"Dotted path on the row the condition reads."},"equals":{"description":"The indicator applies when the field equals this value exactly."},"in":{"type":"array","description":"The indicator applies when the field's value is one of these."},"icon":{"type":"string","description":"CnIcon name (PascalCase). Defaults to InformationOutline."},"text":{"type":"string","minLength":1,"description":"The text alternative, read out beside the icon. Required: an indicator without one does not render."},"tooltip":{"type":"string","description":"Hover text. Defaults to `text`."}}},"folderSidebarScope":{"type":"object","additionalProperties":true,"description":"One folder in `config.folderSidebar.folders[]`, which doubles as a SCOPE: the three optional list-layout keys below let one index page show each folder the way that folder needs. Every other key (id, name, icon, ...) stays free-form, so an existing folder list validates unchanged. The page's `config.columns` still decides which columns this page HAS; a scope only decides which of them are shown, in what order, sorted by what and searched over what. A scope naming a column the page does not declare is refused by validateManifestV2, not silently rendered.","properties":{"columns":{"type":"array","description":"The columns this scope shows, in order. Same shapes as `config.columns`: a bare key string or a column object. Every key must be one the page's `config.columns` declares. Omit to show the page's own columns.","items":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]}},"defaultSort":{"description":"The sort the fetch carries while this scope is active. One `{ key, order }` entry or a list of them; `order` is 'asc' (default) or 'desc'. `field` is accepted in place of `key`, matching the CnIndexPage `defaultSort` prop.","oneOf":[{"$ref":"#/$defs/folderSidebarScopeSort"},{"type":"array","items":{"$ref":"#/$defs/folderSidebarScopeSort"}}]},"searchFields":{"type":"array","items":{"type":"string","minLength":1},"description":"The fields the search box searches over while this scope is active. Omit to search whatever the page searches by default."}}},"folderSidebarScopeSort":{"type":"object","additionalProperties":false,"description":"One sort entry for a `folderSidebar` scope. Name the column with `key` (manifest spelling) or `field` (the CnIndexPage prop spelling); an entry carrying neither is dropped rather than sent as an empty sort key.","properties":{"key":{"type":"string","minLength":1},"field":{"type":"string","minLength":1},"order":{"type":"string","enum":["asc","desc"],"default":"asc"}}},"supportButton":{"type":"object","additionalProperties":false,"description":"Override for one of the four built-in support-note buttons (donate, support, feature-request, app-store). Every field is optional; omit the whole entry to keep the shell's default for that button.","properties":{"enabled":{"type":"boolean","description":"Show this button. Set false to hide it."},"label":{"type":"string","description":"Button text. Blank keeps the default label."},"url":{"type":"string","description":"Where the button goes. The feature-request and app-store buttons have no useful default, so an app that wants them must set this."},"variant":{"type":"string","enum":["primary","secondary","tertiary","error","warning","success"],"description":"NcButton variant."},"icon":{"type":"string","description":"Material Design Icon component name, e.g. HeartOutline."}}},"runtimeTheme":{"type":"object","additionalProperties":false,"required":["source","tokenSet"],"description":"A leaf app's NL Design token-set selection, as returned by nldesign's GET /api/token-sets catalogue (app-token-set-selection). Applied by CnAppRoot via useScopedTheme — the ONLY consumer; the backend does not read this field.","properties":{"source":{"type":"string","enum":["nldesign"],"description":"Theme provider. Closed to 'nldesign' — the only scoped-theme source this schema (and useScopedTheme) currently supports."},"tokenSet":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","description":"The nldesign token-set id (a GET /api/token-sets entry's `id`), kebab-case. Resolves the token CSS at css/tokens/<tokenSet>.css."},"tokenSetName":{"type":"string","description":"Optional human-readable name (the matching catalogue entry's `name`), cached at selection time so a picker can display it without a second catalogue fetch."},"preview":{"type":"object","additionalProperties":false,"description":"Optional cached swatch preview (the matching catalogue entry's theming colors), for a picker to render a preview chip without re-fetching the catalogue.","properties":{"primaryColor":{"type":"string","description":"Cached theming.primary_color from the catalogue entry."},"backgroundColor":{"type":"string","description":"Cached theming.background_color from the catalogue entry."}}}}},"pageTemplate":{"type":"object","additionalProperties":false,"required":["id","page"],"description":"A reusable page shape declared once and instantiated per entity. `page` is an ordinary v2 page object whose string values may contain `{{param}}` placeholders (and `{{set:NAME}}` set references); `params` declares which placeholders exist and which are required. Fixed structure lives in `page`; only declared params vary per instantiation.","properties":{"id":{"type":"string","description":"Unique template identifier — the `templateRef` target. Uniqueness across pageTemplates[] is enforced by validateManifestV2 as a post-schema check."},"_note":{"type":"string","description":"Free-form maintainer note; ignored by the expander."},"params":{"type":"array","description":"Declared parameters. A placeholder `{{name}}` in `page` is substituted with the instantiation's value for `name`. A `required` param absent from an instantiation is an expansion error; an optional param absent from an instantiation causes its exact-match placeholder key to be omitted from the expanded page.","items":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","description":"Parameter name, referenced as `{{name}}` in the template `page`."},"required":{"type":"boolean","default":false,"description":"When true, an instantiation omitting this parameter is an expansion error."},"description":{"type":"string","description":"Human-readable description of the parameter."}}}},"page":{"type":"object","description":"The parameterised page shape. An ordinary v2 page whose string leaves may embed `{{param}}` placeholders and `{{set:NAME}}` set references. After substitution the result MUST be a valid concrete page (it is validated as part of the expanded pages[])."}}},"pageInstance":{"type":"object","additionalProperties":false,"required":["templateRef"],"description":"A per-entity instantiation of a pageTemplate. Supplies only the values that vary. `register`, `schema` and `label` are first-class shortcuts folded into the parameter map (equivalent to listing them under `params`); `params` may carry any additional declared parameters (e.g. a field/column subset).","properties":{"templateRef":{"type":"string","description":"Id of the `pageTemplates[]` entry to instantiate. An unknown templateRef is an expansion error."},"register":{"type":"string","description":"Shortcut for the `register` parameter."},"schema":{"type":"string","description":"Shortcut for the `schema` parameter."},"label":{"type":"string","description":"Shortcut for the `label` parameter."},"params":{"type":"object","description":"Parameter values keyed by the template's declared parameter names. Values may be any JSON type (a field/column subset is an array value). Overrides the register/schema/label shortcuts on conflict.","additionalProperties":true},"override":{"type":"object","description":"Optional structural delta applied over the substituted page via the SAME base+delta merge semantics as mergeManifestDelta (layered-versioned-app-deltas alignment). Lets an instantiation patch a single widget/field without re-listing the page, and is where a per-user/app override sits on top of the template base. No second merge model is introduced.","additionalProperties":true}}},"sentinelFilterToken":{"type":"string","pattern":"^@(?:me|now|today|monthStart|quarterStart|yearStart)$|^@today[+-][0-9]+d$","description":"Filter-value context: relative fetch-time tokens resolved by resolveFilterTokens (@me, @now, @today, @today±Nd, @monthStart, @quarterStart, @yearStart). Mirrors SENTINEL_TOKEN_PATTERNS.filter in src/utils/sentinelTokens.js (byte-equality enforced by a unit test)."},"sentinelConfigToken":{"type":"string","pattern":"^@resolve:[a-z][a-z0-9_-]*$|^@config\\.[A-Za-z][A-Za-z0-9_.]*\\??$","description":"Config context: IAppConfig-sourced values. @resolve:<key> resolved at manifest-load time; @config.<key> (trailing ? optional) at fetch time. Mirrors SENTINEL_TOKEN_PATTERNS.config."},"sentinelObjectToken":{"type":"string","pattern":"^@objectId$|^@object\\.[A-Za-z][A-Za-z0-9_]*$","description":"Object context: detail-page object tokens (@objectId, @object.<field>) resolved only when a { objectId, object } ctx is supplied. Mirrors SENTINEL_TOKEN_PATTERNS.object."},"sentinelWorkspaceToken":{"type":"string","pattern":"^@workspace\\.[A-Za-z][A-Za-z0-9_]*\\??$","description":"Workspace context: page-level workspace state (@workspace.<key>; trailing ? marks optional). Mirrors SENTINEL_TOKEN_PATTERNS.workspace."},"sentinelRouteToken":{"type":"string","pattern":"^@route\\.[A-Za-z][A-Za-z0-9_-]*$","description":"Route context: vue-router param substitution (@route.<param>) resolved by resolveRouteSentinels. Mirrors SENTINEL_TOKEN_PATTERNS.route."},"sentinelDeclarativeToken":{"type":"string","pattern":"^@self\\.[A-Za-z][A-Za-z0-9_]*$|^@ref:[A-Za-z][A-Za-z0-9_./-]*$|^@aggregate:.+$","description":"Declarative context (OpenRegister direction, resolved server-side): @self.<field> (the object's own field in a cross-object calc), @ref:<path>, @aggregate:<expr>. @ref/@aggregate are first-class members even though currently unused fleet-wide. Mirrors SENTINEL_TOKEN_PATTERNS.declarative."},"sentinelDeprecatedToken":{"type":"string","pattern":"^@currentFiscalYear$|^@page\\.[A-Za-z][A-Za-z0-9_]*$|^@runtime(?:\\.[A-Za-z][A-Za-z0-9_]*)?$","description":"Deprecated single-app inventions kept in the union so deployed manifests still validate during the migration window. The hydra token-vocabulary gate downgrades these to a WARN (see SENTINEL_DEPRECATIONS): @currentFiscalYear → @config.fiscalYear, @page.<key> → @workspace.<key>, @runtime → removal. Mirrors SENTINEL_TOKEN_PATTERNS.deprecated."},"sentinelVisibleWhenToken":{"type":"string","pattern":"^@total$","description":"manifest-form-logic: the shared visibleWhen predicate's source-mode collection-total marker, resolved client-side by evaluateVisibleWhen (utils/visibleWhen.js) — NOT one of the four IAppConfig/OpenRegister resolvers, but a pre-existing convention (already documented on $defs.visibleWhen and the banner widget) reachable through the sentinelGuardedValue-guarded pages[].config subtree for the first time via config.fields[].visibleWhen. Mirrors SENTINEL_TOKEN_PATTERNS.visibleWhen."},"sentinelTokenAny":{"$comment":"Union of every canonical context plus the deprecated-during-window overlay. Single source the shared resolver + gate import.","anyOf":[{"$ref":"#/$defs/sentinelFilterToken"},{"$ref":"#/$defs/sentinelConfigToken"},{"$ref":"#/$defs/sentinelObjectToken"},{"$ref":"#/$defs/sentinelWorkspaceToken"},{"$ref":"#/$defs/sentinelRouteToken"},{"$ref":"#/$defs/sentinelDeclarativeToken"},{"$ref":"#/$defs/sentinelVisibleWhenToken"},{"$ref":"#/$defs/sentinelDeprecatedToken"}]},"sentinelTokenLeaf":{"$comment":"A string leaf: either NOT a sentinel (does not start with @) or a member of the closed vocabulary. An @-prefixed out-of-vocabulary string FAILS here instead of passing through additionalProperties:true.","anyOf":[{"not":{"pattern":"^@"}},{"$ref":"#/$defs/sentinelTokenAny"}]},"sentinelGuardedValue":{"$comment":"Recursive guard applied (via allOf) to pages[].config and widgetEntry so every string leaf anywhere beneath is checked against the closed vocabulary. Additive + backward-compatible: only @-prefixed out-of-vocabulary strings newly fail; all other shapes are untouched.","if":{"type":"string"},"then":{"$ref":"#/$defs/sentinelTokenLeaf"},"else":{"if":{"type":"array"},"then":{"items":{"$ref":"#/$defs/sentinelGuardedValue"}},"else":{"if":{"type":"object"},"then":{"additionalProperties":{"$ref":"#/$defs/sentinelGuardedValue"}}}}},"observability":{"type":"object","additionalProperties":false,"description":"Health checks + metric descriptors executed by the AppHost engine.","properties":{"_note":{"type":"string","description":"Free-form note for maintainers; ignored by the engine."},"health":{"type":"object","additionalProperties":false,"description":"Declarative health checks rendered as the ADR-006 {status, app, version, checks} shape.","properties":{"statusCodePolicy":{"type":"string","enum":["adr006","always200"],"default":"adr006","description":"HTTP status-code policy. 'adr006' returns 503 on a failed critical check; 'always200' always returns 200."},"checks":{"type":"array","description":"Health check descriptors.","items":{"type":"object","additionalProperties":false,"required":["id","type"],"properties":{"id":{"type":"string","description":"Check id, surfaced as the key in the response's checks map."},"type":{"type":"string","enum":["database","filesystem","appEnabled","appConfig","orAvailable"],"description":"Engine check kind."},"severity":{"type":"string","enum":["critical","degraded"],"default":"critical","description":"critical → a failure flips status to error (503 under adr006); degraded → status degraded (200)."},"app":{"type":"string","description":"App id, for the appEnabled check."},"key":{"type":"string","description":"Config key, for the appConfig check."}}}},"cors":{"type":"boolean","default":false,"description":"ADR-040: when true the engine emits permissive CORS headers on the /api/health response."}}},"metrics":{"type":"array","description":"Prometheus metric descriptors. The {app}_ prefix, exposition format, and implicit {app}_info / {app}_up gauges are engine-owned.","items":{"type":"object","additionalProperties":false,"required":["name","type","source"],"properties":{"name":{"type":"string","description":"Metric name (without the {app}_ prefix the engine adds)."},"type":{"type":"string","enum":["gauge","counter"],"description":"Prometheus metric type."},"help":{"type":"string","description":"HELP text for the metric family."},"cacheTtl":{"type":"integer","minimum":0,"description":"ADR-040: optional per-metric cache TTL in seconds."},"source":{"type":"object","additionalProperties":false,"required":["kind"],"description":"Where the engine sources the value.","properties":{"kind":{"type":"string","enum":["tableCount","objectCount","objectSum","appConfig","provider"],"description":"Source kind. tableCount = COUNT over an allowlisted own-table; objectCount = OR objects by register/schema; appConfig = a numeric app-config value; provider = an IMetricsProvider implementation."},"table":{"type":"string","description":"tableCount: allowlisted [a-z0-9_] table name."},"register":{"type":"string","description":"objectCount: OR register slug."},"schema":{"type":"string","description":"objectCount / objectSum: OR schema slug."},"field":{"type":"string","description":"objectSum: the numeric object property to SUM."},"groupBy":{"type":"array","items":{"type":"string"},"description":"Columns to GROUP BY (one label per column)."},"labelMap":{"type":"object","additionalProperties":{"type":"string"},"description":"Rename a groupBy column to a different Prometheus label name."},"labelDefaults":{"type":"object","additionalProperties":{"type":["string","number","boolean"]},"description":"Default label value for NULL/empty group columns."},"filter":{"type":"object","additionalProperties":true,"description":"Per-column operator filters (eq/neq/lt/lte/gt/gte/like)."},"key":{"type":"string","description":"appConfig: the config key whose numeric value is the sample."},"id":{"type":"string","description":"provider: the IMetricsProvider id to invoke."}}}}}}}},"splitView":{"type":"object","additionalProperties":false,"description":"The list and one open record, side by side. Declared on an index page; buildManifestRoutes() then emits a second route <route>/split/:id under the name <pageId>__split, carrying meta.cnSplitOf so CnPageRenderer still resolves it to this page and the list never unmounts.","properties":{"enabled":{"type":"boolean","default":false,"description":"Whether opening a row opens it beside the list. False renders exactly as today: a full page list and a full page detail."},"breakpoint":{"type":"integer","minimum":320,"maximum":2560,"default":1024,"description":"Viewport width in pixels below which the split address renders the full detail page instead of the pane, so a link sent from a laptop opens on a phone."},"paneWidth":{"type":"string","description":"CSS width of the detail pane, e.g. '38%' or '520px'. Defaults to '42%'."}}},"savedViewTree":{"type":"object","additionalProperties":false,"description":"Saved views render as a tree rather than a flat list, carry labels, and may ship with the app. Two hundred personal views in one dropdown is the problem this solves. Index pages only, and only meaningful alongside allowSavedViews: without the dropdown there is no view to put in a tree. Absent, the page renders the flat dropdown it renders today. The view entity itself, its parent, its labels and its slug are OpenRegister's (saved-search-views); this key declares how this page presents them.","properties":{"enabled":{"type":"boolean","default":false,"description":"Whether this page renders its saved views as a tree. False reads as a page that considered it and declined, and renders exactly as a page that never named the key."},"maxDepth":{"type":"integer","minimum":1,"maximum":5,"default":3,"description":"How deep a parent chain may go. A bound rather than a taste: inheritance resolves by walking the chain, so an unbounded depth turns one render into an unbounded walk, and a person who can nest for ever will. Past the bound a save is refused naming the view, which is louder than a tree nobody can read."},"templates":{"type":"array","description":"What a new view may start from. A template presets the columns, the sort and the export field set, and the person may change each. Declare none and Save current view means what it has always meant: the list as it stands.","items":{"type":"object","additionalProperties":false,"required":["slug","name"],"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"name":{"type":"string"},"columns":{"type":"array","items":{"type":"string"}},"defaultSort":{"type":"string"},"exportFields":{"type":"array","items":{"type":"string"}}}}},"landingView":{"type":"object","additionalProperties":false,"description":"Which view a role opens this page on, as { role: slug }. A personal choice always wins and Reset returns here, so this is where somebody starts rather than where they are kept. A role's landing view changing mid-session applies on the next arrival: moving a reader's list out from under them is worse than a stale default.","patternProperties":{"^[A-Za-z0-9_.-]+$":{"type":"string"}}},"columnsPerRole":{"type":"object","additionalProperties":false,"description":"Which columns a role sees, as { role: [column] }. NARROWS index-columns-per-scope rather than replacing it: a role naming a column the scope does not offer gets nothing extra, because a per-role list that could add one would be a second, quieter way to put a field on screen the scope deliberately left off.","patternProperties":{"^[A-Za-z0-9_.-]+$":{"type":"array","items":{"type":"string"}}}},"groupBy":{"type":"string","description":"A field the list groups on, with a count per group. The counts are of the rows the list HOLDS, so on a paged list they are of the page and the surface says so; a second fetch per group is the cost this grouping exists to avoid."},"seeded":{"type":"array","description":"Views that ship with the app. They render as their own group above the user's own, and a user may copy one but not delete it: a view the product promises is not a view one person can remove from everybody's install.","items":{"type":"object","additionalProperties":false,"required":["slug","name"],"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$","description":"The stable name a dashboard widget, an export action or an API caller cites this view by. Lowercase and dash only, because it appears in an address and in a manifest somebody else writes. Required: a seeded view with no slug is a view nothing can call, which is most of the reason to seed it."},"name":{"type":"string","description":"What the view is called in the control. Translatable."},"label":{"type":"string","description":"One label this view carries, for the label filter. A view may carry none and stays reachable when no label filter is active."},"parent":{"type":"string","description":"The slug of the view this one hangs under. Omitted, it sits at the root of the seeded group."},"actions":{"type":"array","description":"The action ids this view offers, so a triage view offers three and not thirty. INTERSECTED with what the reader may run and never added to: a view declaring an action the reader has no right to does not grant it. Declare none and the view offers the page's actions, as today.","items":{"type":"string"},"uniqueItems":true},"inherits":{"type":"array","description":"Which parts this view takes from its parent. Each part resolves independently, so a child may narrow the criteria and keep the parent's columns. Declared on a view with no parent it is a contradiction and the validator refuses it: there is nothing to inherit from.","items":{"type":"string","enum":["criteria","columns","sorting","defaultSort","exportFields"]},"uniqueItems":true}},"allOf":[{"description":"inherits without a parent is a declaration that reads as configured and resolves to nothing. Refused here rather than silently ignored at render, which is the shape this whole change exists to stop.","if":{"required":["inherits"]},"then":{"required":["parent"]}}]}}}},"boardView":{"type":"object","additionalProperties":false,"required":["statusField"],"description":"The board view of this list: one column per stage of a status field. Index pages only, and only offered when `viewModes` also lists `board`. The COLUMNS COME FROM THE SCHEMA, not from the values present in the loaded rows: a board built from the data would lose the stage nothing is in, which is the one you drag a card into, and would reorder itself as work moved. A move goes through the host's transition and never writes the status field, so a board can never move a case past a rule the case page enforces.","properties":{"statusField":{"type":"string","description":"The property the columns come from. Required: a board with no status field has nothing to be a board of. Its enum or lifecycle states are read from the register schema at RUNTIME, so a field with neither cannot be caught here; the view says so on screen instead of drawing empty columns."},"cardFields":{"type":"array","items":{"type":"string"},"description":"The fields a card shows. Keep it short: a card is scanned, not read."},"swimlaneField":{"type":"string","description":"A second field to group the board into rows by, while the columns stay the stages. Cards with no value for it land in one named row, last, rather than being dropped: grouping by handler and hiding the unassigned work turns a board into a picture of what is already somebody's problem."}}},"dateAxisView":{"type":"object","additionalProperties":false,"required":["startField","endField"],"description":"The date-axis view of this list: rows on a time scale, overlaps visible. Index pages only, and only offered when `viewModes` also lists `dateAxis`. IT HIDES NOTHING AND RESCHEDULES NOTHING: overlapping bars get their own track so the lane grows taller rather than losing a bar, rows with no usable dates go to a visible unplanned lane, and the only gesture is opening a row. A view that moved a bar on drag would be changing statutory dates from a picture.","properties":{"startField":{"type":"string","description":"Where a row's start is. Required: a bar needs both ends, and a row missing one is unplanned rather than drawn."},"endField":{"type":"string","description":"Where a row's end is. Required, for the same reason."},"laneField":{"type":"string","description":"What to put in a lane together, usually the person the work is on. Omitted, everything shares one lane."},"labelField":{"type":"string","description":"The field a bar is named by, on screen and in its accessible name. A bar positioned by percentage says nothing at all to a reader who cannot see it."}}},"personalisation":{"type":"object","additionalProperties":false,"description":"The app's own defaults for the per-user options CnPersonalPreferences renders. The values a person chooses are stored in their Nextcloud preferences, never here; this block is only the bottom layer of the app default, administered value, personal value order.","properties":{"enabled":{"type":"boolean","default":true,"description":"Whether the personal layer applies at all. An administrator setting this false collapses it: the options render as unavailable with the reason, rather than being silently ignored."},"disabledReason":{"type":"string","description":"What to tell a person when the personal layer is off. Shown beside the unavailable options."},"landingPage":{"type":"string","description":"Page id the app opens on when a person has chosen nothing."},"dateDisplay":{"type":"string","enum":["absolute","relative"],"default":"absolute","description":"How dates read by default. A relative date always carries its absolute date in the accessible name and the tooltip, because a term read as '3 dagen geleden' hides the date the term runs to."},"rememberLastView":{"type":"boolean","default":false,"description":"Whether each list reopens in the view mode that person last used on it."},"pinnedMenu":{"type":"array","items":{"type":"string"},"description":"Menu ids pinned to the top of the navigation by default. A person may reorder and repin their own."}}},"primaryAction":{"type":"object","required":["label"],"additionalProperties":false,"description":"A primary action declared on either a pages[] entry (active-page scoped) or nav.primaryAction (app-wide default). Rendered above the menu list as an NcAppNavigationNew button.","properties":{"id":{"type":"string","description":"Stable identifier for this action."},"label":{"type":"string","description":"i18n translation key / text for the button."},"icon":{"type":"string","description":"MDI icon name (e.g. 'Plus'). Defaults to 'Plus' when omitted."},"route":{"type":"string","description":"Named vue-router route to navigate to on click."},"href":{"type":"string","description":"External URL opened in a new tab on click."},"payload":{"description":"Free-form payload echoed back to the host inside the @primary-action-click event."}}},"menuItem":{"type":"object","required":["id","label"],"additionalProperties":false,"description":"A top-level navigation entry. May contain one level of nested children.","properties":{"id":{"type":"string","description":"Unique identifier for this menu entry. Sentinels (@resolve:*) are NOT allowed — this is a router invariant."},"label":{"type":"string","description":"i18n translation key resolved by the consuming app's t() function at render time."},"icon":{"type":"string","description":"CSS class for the icon (e.g. 'icon-checkmark') or MDI component name."},"route":{"type":"string","description":"Vue-router route name (matches a pages[].id) that this entry navigates to. Sentinels (@resolve:*) are NOT allowed — this is a router invariant."},"query":{"type":"object","additionalProperties":{"type":["string","number","boolean"]},"description":"Optional vue-router query parameters merged into the target route link (e.g. a filter like { caseType: '<uuid>' }). Deep-links a nav entry to a pre-filtered index page."},"order":{"type":"integer","description":"Display order in the menu. Items without an order render last."},"permission":{"type":"string","description":"Permission string the user must hold for this entry to render."},"section":{"type":"string","enum":["main","footer","settings","integrations"],"default":"main","description":"Where the entry renders inside CnAppNav. 'main' (default) places it in the top list. 'footer' pins the entry to the bottom as a flat item above the settings foldout. 'settings' places it inside the NcAppNavigationSettings gear-icon foldout. 'integrations' renders the entry NOT in the navigation at all but in the Integrations section at the bottom of the per-user settings modal — the destination for links that leave this app for another (ADR-110). An 'integrations' entry MUST be clickable (href); a group with children is meaningless there."},"type":{"type":"string","enum":["item","caption"],"default":"item","description":"Render kind. 'item' (default) renders a clickable NcAppNavigationItem. 'caption' renders an NcAppNavigationCaption section divider — only label, id, order, and section are honoured."},"count":{"oneOf":[{"type":"integer","minimum":0},{"type":"string","enum":["auto"]}],"description":"Counter badge in the entry's #counter slot. Positive integer renders as-is; 'auto' resolves from cnMenuCounts (populated by CnAppRoot from useObjectStore totals) for the entry's resolved index-type page (register + schema)."},"pinned":{"type":"boolean","default":false,"description":"Forwarded to NcAppNavigationItem's pinned prop. NC bottom-pins pinned items inside the parent list region."},"open":{"type":"boolean","default":false,"description":"Initial expansion state for a parent entry with children. When true and children[] is non-empty, the parent renders with :open=\"true\" so children are visible on mount."},"href":{"type":"string","description":"External URL. When set, the entry opens the URL in a new tab instead of dispatching a vue-router navigation."},"action":{"type":"string","enum":["user-settings","admin-settings","replay-walkthrough"],"description":"Built-in action to invoke when the entry is clicked. Closed enum. 'admin-settings' opens the app-level admin-settings dialog (distinct from the per-user settings dialog). 'replay-walkthrough' re-runs the product walkthrough (ADR-043), optionally for a specific tourId."},"tourId":{"type":"string","description":"Tour id for the 'replay-walkthrough' action (ADR-043); replays that tour from its first step. Omit to replay the default tour."},"visibleIf":{"$ref":"#/$defs/visibleIfCondition","description":"Optional display condition evaluated at render time."},"dynamicSource":{"$ref":"#/$defs/dynamicSource","description":"Optional dynamic source for populating nested menu items from a data endpoint. Carry-forward from v1.3.0."},"children":{"type":"array","items":{"$ref":"#/$defs/menuItemLeaf"},"description":"Nested entries. Only one level of nesting is supported."}}},"menuItemLeaf":{"type":"object","required":["id","label"],"additionalProperties":false,"description":"A nested menu entry. Has no further children.","properties":{"id":{"type":"string"},"label":{"type":"string"},"icon":{"type":"string"},"route":{"type":"string"},"query":{"type":"object","additionalProperties":{"type":["string","number","boolean"]},"description":"Optional vue-router query parameters merged into the target route link (e.g. a filter like { caseType: '<uuid>' }). Deep-links a nav entry to a pre-filtered index page."},"order":{"type":"integer"},"permission":{"type":"string"},"section":{"type":"string","enum":["main","footer","settings","integrations"],"default":"main"},"type":{"type":"string","enum":["item","caption"],"default":"item"},"count":{"oneOf":[{"type":"integer","minimum":0},{"type":"string","enum":["auto"]}]},"pinned":{"type":"boolean","default":false},"href":{"type":"string"},"action":{"type":"string","enum":["user-settings","admin-settings","replay-walkthrough"]},"tourId":{"type":"string","description":"Tour id for the 'replay-walkthrough' action (ADR-043)."},"visibleIf":{"$ref":"#/$defs/visibleIfCondition"}}},"dynamicSource":{"type":"object","description":"Dynamic source configuration for populating menu items from a backend endpoint. Carry-forward from v1.3.0 — identical shape to v1.","additionalProperties":true,"properties":{"url":{"type":"string","description":"URL to fetch menu items from."},"method":{"type":"string","enum":["GET","POST"],"default":"GET","description":"HTTP method for the fetch."},"labelField":{"type":"string","description":"Property name in the response items to use as the menu entry label."},"idField":{"type":"string","description":"Property name in the response items to use as the menu entry id."},"routeField":{"type":"string","description":"Property name in the response items to use as the menu entry route."}}},"navCardEntry":{"type":"object","required":["id","label"],"additionalProperties":false,"description":"One card in a nav-card-grid built-in widget (ADR-044 §4 cards-collapse) — an arbitrary navigation link, not an OpenRegister object. Mirrors the menuItem/primaryAction vocabulary: id + label required, route/href are alternative navigation targets and mutually exclusive, count supports the same integer-or-\"auto\" shape as menuItem.count.","properties":{"id":{"type":"string","description":"Unique identifier for this card within its widget's entries[] array."},"label":{"type":"string","description":"i18n translation key / text rendered as the card's title."},"description":{"type":"string","description":"Optional explanatory text rendered below the label, associated to the card via aria-describedby (never aria-label)."},"icon":{"type":"string","description":"MDI icon name (e.g. 'ChartLine'), resolved the same way as menuItem.icon."},"route":{"type":"string","description":"Vue-router route name (matches a pages[].id) this card navigates to. Mutually exclusive with href."},"href":{"type":"string","description":"External URL opened per the rendering component's target handling. Mutually exclusive with route."},"count":{"oneOf":[{"type":"integer","minimum":0},{"type":"string","enum":["auto"]}],"description":"Count badge on the card. Positive integer renders as-is; 'auto' resolves from cnMenuCounts (populated by CnAppRoot) for the card's resolved route page (register + schema), the same mechanism menuItem.count:\"auto\" uses."},"order":{"type":"integer","description":"Display order among sibling cards. Cards without an order render last."},"permission":{"type":"string","description":"Permission string the user must hold for this card to render."},"visibleIf":{"$ref":"#/$defs/visibleIfCondition","description":"Optional display condition evaluated at render time."}},"allOf":[{"description":"route and href are mutually exclusive navigation targets — a card links either in-app or externally, never both.","not":{"required":["route","href"]}}]},"widgetEntry":{"type":"object","required":["widgetKey","slot","gridX","gridY","gridWidth","gridHeight"],"additionalProperties":false,"description":"A uniform widget placement entry used on every page type in v2. Replaces the v1 widgetDef + layoutItem pair with a single shape. Its props/dataSource/filter string leaves are guarded against the closed sentinel vocabulary via the sentinelGuardedValue allOf. The cross-field constraint gridX + gridWidth <= 12 CANNOT be expressed in JSON Schema (arithmetic over sibling fields) — it is documented here and enforced at runtime by validateManifestV2() as a post-schema check. Failure message: \"Widget '{widgetKey}' in slot '{slot}': gridX ({gridX}) + gridWidth ({gridWidth}) exceeds 12\".","properties":{"roles":{"type":"array","items":{"type":"string","minLength":1},"description":"Group ids that may see this widget. A DECLARATION THE HOST APP ENFORCES, not something this library evaluates: the check belongs on the read, where the figures are, because a widget hidden in the browser still had its data in the page payload (ADR-004). Pair it with `visibleWhen` pointing at an endpoint of the app's own, which IS evaluated here and collapses the cell when the fetch or the shape fails, so the declaration and the layout cannot disagree. Omitting it means every reader of the page sees the widget. Added because the key was expressible in the legacy `config.widgets[]` array, whose items are open, and refused here, so the same declaration validated on one page and was rejected on another.","examples":[["controllers","beheerders","admin"]]},"visibleWhen":{"$ref":"#/$defs/visibleWhen","description":"Render this widget only while the predicate holds. The same shape every other surface takes it in. It was already honoured at runtime for widgets (CnDashboardPage reads `def.visibleWhen`) and could not be declared in this shape, so a widget in the uniform entry had no way to express a visibility condition at all while one in the legacy array did."},"requiredApp":{"type":"string","minLength":1,"description":"Nextcloud app id this widget leans on — its data lives in that app's register, or its component comes from that app's integration leaf. When the app is absent the widget renders its normal chrome and a set-up state and issues NO request. Declared rather than inferred from content.register, because a register slug is not always the app id and a widget can depend on an app without querying it."},"id":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","description":"Optional stable, kebab-case identity for this widget entry. Used as the merge key under the `delta` merge mode (mergeManifestDelta keys widgets[] by id) so a stored delta can patch a single widget without resending the array. Omitting it keeps the entry valid; a delta simply cannot target it by key. Must be unique within a page's widgets[]."},"widgetKey":{"type":"string","description":"Registry key identifying the widget component. Resolved against the customComponents map passed to CnAppRoot at boot."},"slot":{"$ref":"#/$defs/slotValue","description":"Placement slot. Valid values: body, sidebar, header-actions, footer, modal (literals) or tab:<id> / section:<id> (pattern). Per-slot grid constraints are enforced via allOf/if-then below."},"gridX":{"type":"integer","minimum":0,"description":"0-based column start position. gridX + gridWidth MUST be <= 12 (enforced by post-schema check, not JSON Schema)."},"gridY":{"type":"integer","minimum":0,"description":"0-based row start position. For header-actions slot, MUST be 0 (enforced by allOf/if-then)."},"gridWidth":{"type":"integer","minimum":1,"maximum":24,"description":"Column span. For the default 12-column slots, 1-12. A page MAY widen a slot via config.slotColumns (up to the schema cap of 24); the real per-slot bound gridX + gridWidth <= resolvedColumns is enforced by the post-schema check, not JSON Schema. For sidebar slot, MUST be exactly 1 (enforced by allOf/if-then)."},"gridHeight":{"type":"integer","minimum":1,"description":"Row span (>= 1)."},"sizeToContent":{"type":["boolean","integer"],"minimum":1,"description":"Opt-in: hand this placement's height to whatever it renders, so a widget that decides AT RUNTIME it has nothing to show costs no row. `true` sizes purely to content; an integer is a row minimum. It makes gridHeight advisory for this widget — right for anything whose height is whatever it turned out to be (a banner whose condition is false, a list that came back empty), wrong for anything with a deliberate size. Maps to CnDashboardGrid's per-item `sizeToContent`."},"props":{"type":"object","description":"Optional widget-specific props passed at render time. Shape is widget-specific; not constrained here.","additionalProperties":true},"tabGroup":{"type":"string","description":"Optional: groups this widget into a named tab within the slot. Only meaningful for tab:* and section:* slots."},"dataSource":{"$ref":"#/$defs/dataSource","description":"Optional declarative data binding. Carry-forward from v1 widgetDef.dataSource — same shape."},"dateChip":{"type":"boolean","default":false,"description":"Opt-in (custom widgets only): when true AND the page's `dateRange.enabled` is true, the shared date-range chip renders in this widget's title bar (chart widgets with a `dataSource.bucket` get it automatically). Carry-forward from v1 layoutItem.dateChip — same semantics."},"_note":{"type":"string","description":"Human-readable note. Optional on most widgets. REQUIRED when the containing page has type 'custom' — in that case this field must document why a standard page type was not feasible."},"ncDashboard":{"type":"object","additionalProperties":false,"description":"Opt-in: also publish this placement as a widget on the native Nextcloud dashboard, alongside the app's own pages. An object rather than a boolean because a Nextcloud panel is a single narrow column with its own title, icon and link, none of which the grid placement carries. Presence of this key REQUIRES an `id` on the same entry (enforced in allOf below), and that id MUST be unique across the WHOLE manifest, not merely within its own page's widgets[] — Nextcloud's widget namespace is per app, so two pages both declaring id 'recent' derive one shared panel. Manifest-wide uniqueness is beyond JSON Schema; validateManifestV2 enforces it post-schema. Omitting the key leaves the widget visible only inside the app.","properties":{"title":{"type":"string","description":"Panel title on the Nextcloud dashboard. Falls back to the widget's own title when omitted."},"icon":{"type":"string","description":"MDI icon name (PascalCase), e.g. ViewDashboardOutline."},"order":{"type":"integer","description":"Initial ordering hint, passed through as IWidget::getOrder(). It decides where the panel first appears; once a user rearranges their own dashboard their arrangement wins, so this is a hint and never a guarantee."},"link":{"type":"string","pattern":"^(?![a-zA-Z][a-zA-Z0-9+.-]*:)(?!//)\\S+$","description":"In-app route the panel header links to, so a reader can open the page where the widget's full context lives. Written the way `pages[].route` is, e.g. '/reporting' — the host resolves it against its own app root with generateUrl() and never renders it bare. A scheme ('https:', and 'javascript:' above all) and a protocol-relative '//host' are both refused: the panel is rendered by Nextcloud's dashboard, outside this app's own pages, so a manifest is not a place to hand it an offsite destination."}}}},"allOf":[{"$ref":"#/$defs/sentinelGuardedValue"},{"description":"ncDashboard requires a stable id. The host derives a permanent Nextcloud widget id from `id`, and Nextcloud stores each user's chosen widgets by that id in its own namespace, which no migration of this app can reach. A widget identified by array position would move onto a different widget whenever the array is reordered, silently changing what a user sees. `id`'s own pattern already refuses an empty string, so requiring the key is the whole of the rule expressible here; the manifest-wide uniqueness half lives in validateManifestV2.","if":{"required":["ncDashboard"]},"then":{"required":["id"]}},{"description":"sidebar slot: gridWidth MUST equal 1. The sidebar is a fixed-width panel; widgets always span the full width.","if":{"properties":{"slot":{"const":"sidebar"}},"required":["slot"]},"then":{"properties":{"gridWidth":{"const":1}}}},{"description":"header-actions slot: gridY MUST equal 0. All header action widgets live in a single row.","if":{"properties":{"slot":{"const":"header-actions"}},"required":["slot"]},"then":{"properties":{"gridY":{"const":0}}}},{"description":"object-table built-in widget: when props declares a `source` it must match the declarative self-fetch shape, an `endpointSource` (Wave 2) must match the shared endpoint binding (exactly one of source | endpointSource — post-schema check), and `actions` must be typed manifest actions (incl. type:'object-op'). Other props stay free-form (pass-through to CnDataTable).","if":{"properties":{"widgetKey":{"const":"object-table"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"source":{"$ref":"#/$defs/objectTableSource"},"endpointSource":{"$ref":"#/$defs/endpointSource","description":"Wave 2 (#91): endpoint-bound rows — the payload at responsePath must be an array; columns / formatters / rowRoute / actions apply unchanged on top. Exactly one of source | endpointSource (post-schema check)."},"actions":{"type":"array","items":{"$ref":"#/$defs/action"},"description":"Declarative row/widget actions rendered by CnWidgetObjectTable. object-op patch/delete render per row; object-op create renders as a widget-scoped footer affordance."},"rowClass":{"type":"array","description":"#91: declarative per-row CSS class rules compiled into CnDataTable's rowClass function. Each rule { when: { field, op?, value }, class } adds `class` to a row when the shared visibleWhen predicate holds against that row (field = dot-path into the row, op = eq|neq|gt|gte|lt|lte default eq, value = literal). Rules evaluate in order and every matching class is space-joined — so overdue / at-risk rows can be highlighted from the manifest. A host-supplied rowClass FUNCTION (runtime-only) still passes straight through.","items":{"type":"object","additionalProperties":false,"required":["when","class"],"properties":{"when":{"type":"object","additionalProperties":false,"required":["field","value"],"description":"The predicate evaluated against the row (shared visibleWhen grammar, LOCAL form).","properties":{"field":{"type":"string","description":"Dot-path into the row."},"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte"],"default":"eq","description":"Comparison operator (default eq)."},"value":{"description":"Literal right-hand side of the comparison."}}},"class":{"type":"string","description":"CSS class added to the row when `when` holds."}}}}}}}}},{"description":"nav-card-grid built-in widget (ADR-044 §4 cards-collapse): props.entries is REQUIRED and each entry must match the navCardEntry shape. Unlike stats-block's optional entries[], nav-card-grid has no dataSource alternative — it renders arbitrary navigation links, not fetched data.","if":{"properties":{"widgetKey":{"const":"nav-card-grid"}},"required":["widgetKey"]},"then":{"required":["props"],"properties":{"props":{"type":"object","required":["entries"],"properties":{"entries":{"type":"array","items":{"$ref":"#/$defs/navCardEntry"},"description":"One card per array entry, rendered by CnNavCardGrid."}}}}}},{"description":"stats-block built-in widget: when props declares `entries[]` each entry must match the statsBlockEntry shape. The exactly-one-of dataSource | props.entries constraint is a cross-field rule enforced by validateManifestV2() as a post-schema check (clear error message), not by JSON Schema.","if":{"properties":{"widgetKey":{"const":"stats-block"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"entries":{"type":"array","items":{"$ref":"#/$defs/statsBlockEntry"},"description":"Multi-entry KPI sources — each entry renders one CnStatsBlock within the widget card. Mutually exclusive with a single dataSource."}}}}}},{"description":"banner built-in widget (CnBannerWidget, Wave 1): a declarative notice banner. props { variant, text, visibleWhen?, route? } — visibleWhen is a simple {endpoint|source, field?, op?, value} predicate evaluated at mount (fail-safe: hidden on fetch failure).","if":{"properties":{"widgetKey":{"const":"banner"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"variant":{"type":"string","enum":["info","warning","error","success"],"description":"Banner severity variant (NcNoteCard type). Default info."},"text":{"type":"string","description":"Pre-translated banner text (required for the banner to render)."},"visibleWhen":{"type":"object","additionalProperties":false,"description":"Optional visibility condition: exactly one of `endpoint` (same-origin JSON URL) or `source` (OpenRegister object query). `field` is a dot-path into the response (source: into the first result; omit or use '@total' for the collection total). Fail-safe: the banner stays hidden until the predicate evaluates true.","properties":{"endpoint":{"type":"string","description":"Same-origin URL returning JSON."},"source":{"type":"object","additionalProperties":false,"required":["register","schema"],"description":"OpenRegister object query; `filter` supports the shared @-token grammar.","properties":{"register":{"type":"string"},"schema":{"type":"string"},"filter":{"type":"object","additionalProperties":true}}},"field":{"type":"string","description":"Dot-path into the response ('@total' or omitted = collection total for a source)."},"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte"],"default":"eq","description":"Comparison operator."},"value":{"description":"Literal right-hand side of the comparison."}}},"route":{"description":"Optional click-through: a vue-router route NAME (string) or a full location object. Makes the banner text an accessible button.","oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]}}}}}},{"description":"audit-trail built-in widget (CnAuditTrailWidget, Wave 1): the object change-log card. All props are optional — register/schema/objectId normally arrive via the detail-page object-context merge; explicit props win.","if":{"properties":{"widgetKey":{"const":"audit-trail"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"register":{"type":"string","description":"OpenRegister register slug/id (context merge fallback when omitted)."},"schema":{"type":"string","description":"OpenRegister schema slug (context merge fallback when omitted)."},"objectId":{"type":"string","description":"The audited object's id (context merge fallback when omitted)."},"title":{"type":"string","description":"Optional card title override."},"maxDisplay":{"type":"integer","minimum":1,"description":"Maximum audit rows to render (default 5)."}}}}}},{"description":"chart widget display passthrough (Wave 1): additive presentation keys forwarded verbatim to CnChartWidget by CnDashboardPage's dispatcher and the v2 grid. Other chart props stay free-form.","if":{"properties":{"widgetKey":{"const":"chart"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"horizontal":{"type":"boolean","description":"Render type:'bar' charts horizontally (row bars)."},"legendPosition":{"type":"string","enum":["top","bottom","left","right"],"description":"Legend placement override (empty/omitted keeps the automatic placement)."},"valueAxisBaseline":{"type":"string","enum":["auto","zero","fit"],"description":"Value-axis baseline: 'auto' (the default — zero for bar/area, a bounded window for line/scatter), 'zero' (force a zero baseline), or 'fit' (let ApexCharts frame the data range, for a series living far from zero such as an SLA hovering 95–99%)."},"valueFormat":{"description":"Named value formatter applied to the value axis + tooltip: 'currency' | 'currency-compact' | 'percent', or the object form { name, currency?, decimals? }.","oneOf":[{"type":"string","enum":["currency","currency-compact","percent"]},{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","enum":["currency","currency-compact","percent"]},"currency":{"type":"string","description":"ISO-4217 code (EUR default; invalid codes fall back to EUR)."},"decimals":{"type":"integer","minimum":0,"description":"Fraction digits override."}}}]},"colorMap":{"type":"object","additionalProperties":{"type":"string"},"description":"Per-category colour map ({ categoryLabel: cssColor }) for pie/donut/radialBar slices and (distributed) bar categories."},"emptyLabel":{"type":"string","description":"Empty-state message rendered instead of the chart when the resolved series contain no data points."},"endpointSource":{"$ref":"#/$defs/chartEndpointSource","description":"Wave 2 (#91): endpoint-bound series/labels — the shared endpoint transport plus the labelsPath / series[] {name, path} response mapping. Exactly one of dataSource | endpointSource (post-schema check)."}}}}}},{"description":"header / text / divider on the v2 grid (Wave 1): the dashboard catalog's content-only presentation widgets reused as built-ins. Each takes a single `props.content` object with the same shape as its dashboard `content` blob.","if":{"properties":{"widgetKey":{"enum":["header","text","divider"]}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"content":{"type":"object","additionalProperties":true,"description":"The widget's content blob — header: { title, subtitle, backgroundImageUrl, overlayMode, height, cta, … }; text: { text, contentMode, fontSize, … }; divider: { style, lineColor, headingText, … }."}}}}}},{"description":"stat / delta catalog widgets on the v2 grid (Wave 2, #91): the KPI tiles take a `props.content` blob (same shape as their dashboard `content`). The endpoint-binding keys are typed here; the rest of the blob stays free-form (label, icon, format, source, …). Exactly one of content.source | content.endpointSource — a cross-field rule enforced by validateManifestV2() as a post-schema check (stats-block precedent), which also covers the legacy pages[].config.widgets[] placement.","if":{"properties":{"widgetKey":{"enum":["stat","delta"]}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"content":{"type":"object","additionalProperties":true,"properties":{"endpointSource":{"$ref":"#/$defs/endpointSource","description":"Wave 2 (#91): endpoint-bound KPI value(s) — exactly one of source | endpointSource (post-schema check)."},"valueField":{"type":"string","description":"Dot-path into the endpoint payload for the displayed (current) value. Omitted = the payload itself."},"previousField":{"type":"string","description":"Dot-path into the endpoint payload for the previous-period value — renders the trend sublabel (arrow + percent-vs-previous; the pipelinq previousPeriod contract)."},"deltaField":{"type":"string","description":"Dot-path into the endpoint payload for a SERVER-computed delta percent — wins over the client-side previousField computation."},"goodDirection":{"type":"string","enum":["up","down"],"default":"up","description":"Which trend direction tints green ('up' default; 'down' for cost-like KPIs). The delta widget's source.goodDirection still wins for the OpenRegister form."},"variantWhen":{"type":"array","description":"First-match threshold styling rules for the stat tile — the matched rule's variant re-tints the value + icon circle, and its optional icon overrides content.icon.","items":{"type":"object","required":["op","value","variant"],"additionalProperties":false,"properties":{"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte"],"description":"Comparison operator against the resolved display value (numeric when both sides coerce; eq/neq fall back to string equality)."},"value":{"description":"Literal right-hand side of the comparison."},"variant":{"type":"string","enum":["default","primary","success","warning","error"],"description":"Colour variant applied on match ('default' keeps the configured colours). The component also accepts 'danger' as an alias of 'error' for doriath-migrated content."},"icon":{"type":"string","description":"Optional MDI icon name overriding content.icon while this rule matches."}}}},"clickRoute":{"description":"Whole-tile click-through: a vue-router route NAME (string) or full location object. Alias of content.route (route wins when both are set).","oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]}}}}}}}},{"description":"workspace-filter catalog widget (#91 Wave 3): a choice list whose selection writes into the page workspace context so sibling widgets refetch. The endpoint/OR-source binding keys of `props.content` are typed here; the rest stays free-form.","if":{"properties":{"widgetKey":{"const":"workspace-filter"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"content":{"type":"object","additionalProperties":true,"properties":{"writes":{"type":"string","description":"The workspace context key the selection writes (`@workspace.<key>` or a bare `<key>`). Sibling widgets whose declarative source interpolates `@workspace.<key>` refetch on change."},"style":{"type":"string","enum":["radio","select"],"default":"radio","description":"Choice style: 'radio' (default) list or 'select' dropdown."},"allLabel":{"type":"string","description":"Optional leading 'All' option — writes the empty string so an optional sibling token (`@workspace.<key>?`) drops (unfiltered set)."},"showCounts":{"type":"boolean","default":true,"description":"Render per-option counts."},"options":{"type":"array","description":"Static options — each { value, label, count? } (or { id, name } / bare strings, normalised).","items":{"type":["object","string","number"]}},"source":{"type":"object","additionalProperties":true,"description":"OpenRegister /grouped facet source { register, schema, groupBy, filter? } — each distinct value becomes an option with its object count.","properties":{"register":{"type":"string"},"schema":{"type":"string"},"groupBy":{"type":"string"},"filter":{"type":"object","additionalProperties":true}}},"endpointSource":{"$ref":"#/$defs/endpointSource","description":"App endpoint returning an array of { value, label, count? } options at responsePath."}}}}}}}},{"description":"kb-search catalog widget (#91 Wave 3): summary-driven knowledge-base search through a PLUGGABLE PROVIDER. The provider seam keys of `props.content` are typed here; the rest stays free-form.","if":{"properties":{"widgetKey":{"const":"kb-search"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"content":{"type":"object","additionalProperties":true,"properties":{"provider":{"type":"string","description":"Provider registry key (default 'default' — the built-in endpoint search). An app registers bespoke providers (the xwiki proxy) on CnAppRoot's kbSearchProviders; the xwiki client stays app-side."},"space":{"type":"string","description":"Provider-specific KB space filter (passed to provider.search)."},"tags":{"description":"Provider-specific tag filter — a single tag or an array.","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"endpoint":{"type":"string","description":"The default provider's search endpoint (OpenRegister xWiki leaf by default)."},"queryParam":{"type":"string","description":"The default provider's query parameter name (default 'q')."},"bindTo":{"type":"string","description":"Workspace context key to auto-search on (default 'activeSummary')."},"minChars":{"type":"integer","minimum":0,"description":"Minimum characters before a search fires (default 3)."},"limit":{"type":"integer","minimum":1,"description":"Result cap passed to the provider (default 8)."},"externalOpen":{"type":"boolean","description":"Whether result links open in a new tab (defaults to the provider's own externalOpen flag)."},"unavailableFallback":{"type":"string","description":"Text shown when the provider rejects / is unavailable (replaces the default 'Knowledge base unavailable')."}}}}}}}}]},"fieldWidget":{"type":"object","required":["id","component"],"additionalProperties":false,"description":"A declarative widget-component slot used inside `form` / `detail` page config. Distinct from the top-level pages[].widgets[] grid placement (which carries widgetKey + grid coordinates). fieldWidget mounts a lib `Cn*` SFC inline as a form field or detail data slot; the renderer resolves `component` against the lib's exported component map, NOT the host-app customComponents registry. Carries serialisable `props` only — handler / function props must be wired via the host App's manifest-level mounts. Replaces the untyped `fieldWidgets[]` key relied on by pipelinq#415 (which rode through on additionalProperties: true). See ConductionNL/nextcloud-vue#314.","properties":{"id":{"type":"string","pattern":"^[a-z][a-zA-Z0-9_-]*$","description":"Unique identifier within the fieldWidgets[] array. Lower-camel-case-ish: must start with a lowercase letter and contain only letters, digits, underscores, or hyphens. Used as the form field key / data binding key by CnFormPage / CnDetailPage."},"component":{"type":"string","pattern":"^Cn[A-Z]\\w+$","description":"Name of a lib component (e.g. CnMarkdownEditor, CnSchemaSelect). MUST be Cn-prefixed and resolved against the @conduction/nextcloud-vue exported component map. Host-app SFCs are not allowed here — those go through pages[].component on a type:'custom' page."},"props":{"type":"object","description":"Serialisable props passed to the resolved component at render time. Shape is component-specific; not constrained here. Handler / function values are not supported through the manifest (the manifest is JSON).","additionalProperties":true},"_note":{"type":"string","description":"Optional human-readable note explaining the role of this declarative widget slot."}}},"slotValue":{"description":"Valid slot value. Either a literal slot name (body, sidebar, header-actions, footer, modal) or a tab:<id> / section:<id> pattern string.","oneOf":[{"type":"string","enum":["body","sidebar","header-actions","footer","modal"],"description":"Literal slot name."},{"type":"string","pattern":"^(tab|section):.+","description":"Named tab or section slot. Format: tab:<id> or section:<id> where <id> is at least one character."}]},"dataSource":{"type":"object","description":"Declarative data binding for widgets. Forms: (a) shorthand {register, schema, filter?, aggregate: 'count'} — the lib builds a count query and resolves to {count}. (b) raw {graphql: {query, variables?, selectors}} — the lib issues the query and runs selectors. (c) #91 Wave 3 chart aggregation — `aggregate` as an OBJECT {groupBy, metric?: count|sum, sumField?, topN?, otherBucket?, labelResolve?} grouped over the schema's objects via OpenRegister's /grouped facet (client-side collection fallback), plus an optional sibling `drilldown` {route, filterParam}. Carry-forward from v1.3.0 widgetDef.dataSource.","additionalProperties":true,"properties":{"register":{"type":"string","description":"Shorthand: register slug."},"schema":{"type":"string","description":"Shorthand: schema slug."},"filter":{"type":"object","description":"Shorthand: filter map inlined into the generated query.","additionalProperties":true},"aggregate":{"description":"Shorthand aggregation. The STRING 'count' builds a GraphQL count query resolving to {count}. The OBJECT form (#91 Wave 3) is a chart-only categorical group-by served by OpenRegister's /grouped facet.","oneOf":[{"type":"string","enum":["count"]},{"type":"object","required":["groupBy"],"additionalProperties":false,"description":"#91 Wave 3 chart aggregation: group the schema's objects by `groupBy`, count (default) or sum `sumField`, keep the `topN` largest (sorted desc) and optionally fold the remainder into a translated 'Other' slice, resolving reference keys to labels/colours via `labelResolve`.","properties":{"groupBy":{"type":"string","description":"The categorical field grouped on."},"metric":{"type":"string","enum":["count","sum"],"default":"count","description":"count (default) | sum. sum requires sumField."},"sumField":{"type":"string","description":"Numeric field summed when metric is 'sum' (required for sum)."},"topN":{"type":"integer","minimum":1,"description":"Keep the N largest groups (sorted by value desc)."},"otherBucket":{"type":"boolean","description":"Fold the post-topN remainder into a single translated 'Other' slice (sum of the rest). The Other bucket never drilldown-navigates."},"labelResolve":{"type":"object","required":["schema"],"additionalProperties":false,"description":"Resolve reference (uuid) group keys to the referenced objects' display labels (and optional per-category colours) through the shared object store — the fkResolve pattern.","properties":{"register":{"type":"string","description":"Register the reference points into (defaults to the dataSource register)."},"schema":{"type":"string","description":"Schema slug the reference points into."},"labelField":{"type":"string","description":"Property used as the display label (default 'name')."},"colorField":{"type":"string","description":"Optional property read as a per-category CSS colour (feeds the chart's colorMap path)."}}}}}]},"drilldown":{"type":"object","required":["route","filterParam"],"additionalProperties":false,"description":"#91 Wave 3 (chart only): a segment/bar click navigates to `route` with the clicked category's RAW key in the query ({ [filterParam]: rawKey }). A `/`-prefixed route is a path, otherwise a route name. Works with the OBJECT `aggregate` and the legacy `groupBy` forms; the folded 'Other' bucket never navigates.","properties":{"route":{"type":"string","description":"Destination route name, or a path when it starts with '/'."},"filterParam":{"type":"string","description":"Query-param name the clicked category's raw key is written to."}}},"graphql":{"type":"object","description":"Raw GraphQL form.","additionalProperties":false,"required":["query","selectors"],"properties":{"query":{"type":"string","description":"GraphQL query document."},"variables":{"type":"object","description":"Variables map passed alongside query.","additionalProperties":true},"selectors":{"type":"object","description":"Map of result-prop name to dot-path selector.","additionalProperties":{"type":"string"}}}}}},"action":{"type":"object","required":["id","label"],"additionalProperties":false,"description":"A typed page action with a discriminator field. The type field determines behaviour: handler (registry function), open-modal (modal by id), open-page (named route), navigate (URL), object-op (declarative OpenRegister mutation via useObjectStore), export (opens the shared CnMassExportDialog export launcher), open-form (schema-driven create dialog — CnActionButtons), refresh (bumps the cn:page:refresh signal), api-call (POST/PUT an app endpoint + toast + refresh — CnActionButtons/dispatchAction), agent (run a governed hermiq agent), run-node (invoke one OpenRegister flow node against the page object, config collected via a dialog sourced from the node's own declared form — CnActionButtons/dispatchAction, or-flow-run-node; distinct from the UNRELATED setup-wizard step type of a similar name, 'run-action'), toggle (two-way state button — CnActionButtons only, NOT dispatchable). When type is omitted, it defaults to 'handler' (back-compatibility with v1.3.0 action declarations). The Ajv instance is compiled with useDefaults: true so the default is applied during validation.","properties":{"id":{"type":"string","description":"Unique action identifier within the page's actions array."},"label":{"type":"string","description":"i18n key resolved by the consuming app's t() function at render time."},"type":{"type":"string","enum":["handler","open-modal","open-page","navigate","object-op","export","open-form","refresh","api-call","agent","run-node","toggle"],"default":"handler","description":"Action behaviour discriminator. Defaults to 'handler' when omitted (back-compat with v1.3.0). handler: calls a registry function; open-modal: opens a modal by target id; open-page: navigates to a named route; navigate: navigates to a URL; object-op: dispatches a declarative mutation (patch | delete | create) of an OpenRegister object via the shared object store; export: opens the shared CnMassExportDialog export launcher configured via entities[]/formats[] — the confirm payload ({format, entity?}) routes to the action's `handler` in the manifest actions map (the app's export service does the download). open-form (#91 Wave 3): CnActionButtons opens a schema-driven create dialog (CnAdvancedFormDialog) for the action's register/schema, saves + toasts + refreshes + optionally navigates to onSuccessRoute. refresh (#91 Wave 3): bumps the page-level cn:page:refresh event-bus signal so every endpoint-bound widget refetches. api-call (#91 Wave 3): POST/PUT the token-interpolated url with payload/params (JSON body, payload resolves @-tokens recursively at any depth) + success/error toast + auto page-refresh (unless refresh:false); confirm gating is surface-consumed intent (object-op precedent); download:true requests a binary blob and triggers a browser file download instead (auto-refresh defaults to OFF in that mode). agent (hermiq#41): run a governed hermiq agent against the page object — POSTs { register, schema, objectId, resultField?, skill?, prompt? } to /apps/hermiq/api/agents/{agent}/run-on-object (object-RBAC-scoped; dispatches the governed AgentRunRequestedEvent). register/schema/objectId default to the page's @register/@schema/@objectId object context. A first-class companion to api-call (which remains the fallback for a bespoke body); hermiq is NOT hard-required — an app-level 404 surfaces a graceful 'agent runtime unavailable' toast. toggle (#91 Wave 3): a stateful two-way state button rendered by CnActionButtons (GET stateSource on mount, optimistic write on click) — NOT dispatchable through dispatchAction. object-op declares mutation INTENT only — authority is enforced server-side by OpenRegister RBAC (ADR-022/ADR-023); authorization-shaped fields have no client-side effect and are not accepted here."},"op":{"type":"string","enum":["patch","delete","create"],"description":"object-op only: the mutation verb. patch merges `values` into the row's object (row-scoped); delete removes the row's object (row-scoped, ALWAYS confirm-gated); create adds a new object built from `values` against the widget's source register/schema (widget-scoped footer/header affordance). Required when type is 'object-op'."},"values":{"type":"object","additionalProperties":true,"description":"object-op only: the verb's payload. For patch: the partial object merged over the row's object. For create: the new object's properties. Omitted for delete."},"confirm":{"type":"boolean","default":false,"description":"Confirm-gating (object-op + #91 Wave 3 api-call / open-form + agent): when true, the action presents a CnConfirmDialog before running (the dispatcher / CnActionButtons runs AFTER confirmation). object-op delete ALWAYS confirms regardless of this flag."},"target":{"type":"string","description":"Destination for open-modal (modal id), open-page (route name), or navigate (URL). Ignored for handler type."},"props":{"type":"object","description":"Additional props forwarded to the handler or modal.","additionalProperties":true},"createOverride":{"type":"string","description":"Registry handler name that owns the persist for an `open-form` action, replacing the default objectStore.saveObject. Resolved exactly as CnIndexPage resolves its own `createOverride` prop (a kind:'create-override' entry's `.handler`, a function-valued registry entry, or a function in the legacy customComponents map). Needed when the schema requires a field the create form cannot supply on its own — a server-minted foreign key, say — where a straight save would 400."},"includeFields":{"type":"array","items":{"type":"string"},"description":"open-form: the only fields the create dialog asks for. One schema often backs two surfaces, a detail page that edits all of it and a header button that collects what someone filing a new one types, and this is how the button says which it is. Omit for the whole schema."},"excludeFields":{"type":"array","items":{"type":"string"},"description":"open-form: fields the create dialog leaves out. Use it to drop a handful; use includeFields when it is easier to name what stays."},"fieldOverrides":{"type":"object","additionalProperties":true,"description":"open-form: per-field overrides passed to fieldsFromSchema, keyed by field. Recognised keys include label, order, hidden, readOnly and widget."},"advanced":{"type":"boolean","default":false,"description":"open-form: open the properties-and-JSON table (CnAdvancedFormDialog) instead of the plain form. The plain form is the default because a header button is aimed at someone filing a record, not at inspecting its schema."},"formTitle":{"type":"string","description":"open-form: overrides the create dialog's heading. Defaults to 'Create {schema title}'."},"size":{"type":"string","enum":["small","normal","large","full"],"default":"normal","description":"open-form: how wide the create dialog is, passed straight to NcDialog. Widen a form that asks enough questions to need scrolling; pair it with columns: 2."},"columns":{"type":"integer","enum":[1,2],"default":1,"description":"open-form: how many columns the fields flow into. 2 pairs them up, which halves the scrolling on a longer form. Textareas and JSON editors still span the full width, and the layout collapses to one column below 700px. Widen the dialog with size: 'large' as well, or two columns are merely two narrow ones."},"handler":{"type":"string","description":"Registry key for type: 'handler'. Resolved across both registries passed to CnAppRoot: a v2 `registry` entry of `kind: 'handler'` exposing the function as `.handler` (or `.fn`), a directly function-valued registry entry, or a function-valued entry in the deprecated `customComponents` map. The same resolution serves actions[], bulkActions[] and headerActions[]. Also the built-in dispatch verb when paired with `route` (handler: 'navigate' → $router.push to `route`)."},"route":{"type":"string","description":"Destination route name for handler: 'navigate'. The dispatcher (manifestActionDispatch) calls $router.push({ name: route, params }). For row-level actions params include { id: row[rowKey] } automatically — do NOT restate it as params: { id: \"{id}\" }, though that placeholder does resolve (see `params`). Page-level header actions navigate without row context (e.g. a 'New X' action to a detail route)."},"icon":{"type":"string","description":"Optional icon for the action, rendered by CnActionsBar. Either an MDI icon name (e.g. 'TextBoxOutline') or a CSS icon class (e.g. 'icon-file')."},"entities":{"type":"array","description":"export only: selectable entity types offered by the export launcher (e.g. Leads / Requests). Optional — when absent the dialog shows only the format picker. Each entry needs an id + pre-translated label.","items":{"type":"object","additionalProperties":false,"required":["id","label"],"properties":{"id":{"type":"string","description":"Entity id handed to the confirm handler."},"label":{"type":"string","description":"Pre-translated display label."}}}},"formats":{"type":"array","description":"export only: the offered export formats — bare ids ('excel', 'csv', 'json' — lifted to {id, label} with an upper-cased label) or full {id, label} entries. Optional — the dialog's built-in Excel/CSV defaults apply when absent.","items":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":false,"required":["id","label"],"properties":{"id":{"type":"string","description":"Format id handed to the confirm handler."},"label":{"type":"string","description":"Pre-translated display label."}}}]}},"description":{"type":"string","description":"export only: pre-translated description shown above the export launcher's pickers."},"url":{"type":"string","description":"api-call / toggle only: the app endpoint (POST/PUT). App-relative (routed through generateUrl) or absolute (http/https). May interpolate @objectId / @object.<field> / @workspace.<key> / @config.<key> tokens inline, as well as the literal {objectId} brace placeholder (unresolved tokens collapse to empty)."},"method":{"type":"string","enum":["POST","PUT"],"description":"api-call: HTTP method (default POST). toggle writeUrl: default PUT."},"payload":{"type":"object","additionalProperties":true,"description":"api-call only: the JSON request body — PREFERRED over `params`, and used instead of it when both are set. Values run the SAME token grammar as `params` (@me, @now, @today±Nd, @monthStart/@quarterStart/@yearStart, @objectId, @object.<field>, @workspace.<key>/@config.<key> with a trailing `?` marking a value OPTIONAL — dropped when unresolved) but resolve RECURSIVELY at ANY nesting depth, including arrays of objects — e.g. a Filinq document-generation body: { \"dataRefs\": [{ \"register\": \"crm\", \"schema\": \"lead\", \"id\": \"@objectId\" }] }. A required (non-`?`) token left unresolved anywhere in the tree BLOCKS the call (error toast) instead of sending the literal token string to the server."},"params":{"type":"object","additionalProperties":true,"description":"Two distinct uses depending on the action's dispatch. (1) api-call / toggle: the JSON request body (legacy — prefer `payload` for anything with nested objects/arrays; ignored when `payload` is set). Values run the shared filter-token grammar ONE level deep (@me, @today±Nd, @workspace.<key>/@config.<key> with a trailing `?` for optional values dropped when unresolved; a required unresolved token skips the call). (2) handler: 'navigate' (index-page row actions, manifestActionDispatch): vue-router params merged OVER the default { id: row[rowKey] }. OMIT it for the ordinary 'open this row's detail page' action — the row id is already injected. String values run the `{field}` ROW-token grammar (NOT the @-token grammar): \"{id}\" resolves to row.id with its type preserved, \"run-{id}\" interpolates as text, and a brace-less \"new\" stays literal (that is what makes a 'New X' action navigate with { id: 'new' }). A token naming a field the row does not carry is dropped with a console.warn — so `id` falls back to the row id — instead of being pushed as a literal %7Bid%7D path segment."},"download":{"type":"boolean","default":false,"description":"api-call only: request the response as a binary blob (axios responseType 'blob') and trigger a browser file download instead of a JSON toast+refresh cycle. The filename is taken from the response's Content-Disposition header, else the token-resolved `filename`, else 'download.pdf'. The success toast still shows; unlike a normal api-call the page does NOT auto-refresh afterwards unless `refresh: true` is explicitly set."},"filename":{"type":"string","description":"api-call `download: true` only: fallback filename used when the response carries no Content-Disposition header (falls back further to 'download.pdf'). Interpolates the same token grammar as `url` (@objectId, @object.<field>, @workspace.<key>, @config.<key>, {objectId})."},"successMessage":{"type":"string","description":"api-call / open-form / agent / run-node / toggle: pre-translated success toast text (a library default applies when absent; agent default 'Run queued')."},"errorMessage":{"type":"string","description":"api-call / agent / run-node / toggle: pre-translated error toast text (falls back to the server's error/message, then a library default; an agent 404 with no structured body toasts 'agent runtime unavailable' instead)."},"refresh":{"type":"boolean","default":true,"description":"api-call / agent / run-node / toggle: bump the page-level cn:page:refresh signal after a successful call (default true; set false to skip). EXCEPTION: for an api-call with download:true the default flips to false — a file download normally shouldn't also force-refetch every widget — set refresh:true explicitly to opt back in."},"flowId":{"type":"string","description":"run-node only (REQUIRED): the published flow's uuid whose node this action invokes. A node's config and eligibility are properties of the flow it lives in (RN-3, OpenRegister's or-flow-run-node), so the manifest names which flow's instance to call rather than a bare node type — two flows could each carry the same node TYPE wired differently."},"nodeId":{"type":"string","description":"run-node only (REQUIRED): the id of the node, within flowId's published graph, to invoke directly. POSTed to /api/flows/{flowId}/nodes/{nodeId}/run — refused (404) unless that node type has opted in to direct invocation (IFlowDirectlyInvokable)."},"subject":{"type":"string","description":"run-node only: the subject object the node acts on and is authorized against (OpenRegister object-RBAC — the caller needs update permission on it; the flow's own flow.run right is deliberately NOT what gates this). Typically @objectId; may interpolate the shared @-token grammar. An unresolved required token BLOCKS the call, matching agent's objectId."},"agent":{"type":"string","description":"agent only (REQUIRED): the hermiq agent uuid to run against the page object. POSTed to /apps/hermiq/api/agents/{agent}/run-on-object (hermiq#41) — object-RBAC-scoped, dispatches the governed AgentRunRequestedEvent. May interpolate the shared @-token grammar (@objectId, @object.<field>, @workspace.<key>, @config.<key>)."},"skill":{"type":"string","description":"agent only: optional skill id folded into the governed run (interpolates the same @-token grammar as `agent`)."},"prompt":{"type":"string","description":"agent only: optional prompt handed to the governed run. Interpolates the shared @-token grammar inline (@objectId, @object.<field>, @workspace.<key>, @config.<key>) so it can be grounded on the page object — e.g. 'Summarise @object.title'."},"resultField":{"type":"string","description":"agent only: the object field the agent's result is written back to (falls back to hermiq's default result field when absent)."},"objectId":{"type":"string","description":"agent only: the target object id. Defaults to the page object context's @objectId; an unresolved required @objectId BLOCKS the call (fail-closed) rather than sending a literal token. May be an explicit id or an @-token string."},"register":{"type":"string","description":"open-form / agent / run-node: OpenRegister register slug. open-form: the create dialog's schema register. agent / run-node: the register the subject object belongs to — falls back to the page object context's @register."},"schema":{"type":"string","description":"open-form / agent / run-node: OpenRegister schema slug. open-form: the create dialog fetches this schema and saves the new object against it. agent / run-node: the schema the subject object belongs to — falls back to the page object context's @schema."},"onSuccessRoute":{"description":"open-form only: optional post-save navigation target (#91). A bare route NAME (string) navigates with the saved object's id merged into the route params under `id` (harmless when the route has no `:id` segment — backward compatible). The object form { name, paramField?, objectParam? } names the id param (`paramField`, default `id`) and, when `objectParam` is set, also passes the whole saved object under that param key (for a props:true detail route to render without a refetch). The id is read from saved.id, then saved.uuid, then saved['@self'].id.","oneOf":[{"type":"string"},{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","description":"The vue-router route NAME pushed after a successful save."},"paramField":{"type":"string","default":"id","description":"Route param name populated from the saved object's id (default `id`)."},"objectParam":{"type":"string","description":"When set, the whole saved object is passed under this route param (props:true detail routes render without a refetch)."}}}]},"labelOn":{"type":"string","description":"toggle only: button label rendered while the state is ON (true). Falls back to `label`."},"labelOff":{"type":"string","description":"toggle only: button label rendered while the state is OFF (false). Falls back to `label`."},"stateSource":{"$ref":"#/$defs/endpointSource","description":"toggle only: the endpoint the initial state is read from on mount (the shared endpointSource shape — url + token-resolved params + responsePath). The `field` dot-path picks the boolean off the payload."},"writeUrl":{"type":"string","description":"toggle only: the endpoint the flipped state is written to on click (interpolates the same tokens as `url`)."},"field":{"type":"string","description":"toggle only: the state field — read off the stateSource payload on mount AND sent (as the flipped boolean) in the write body under this key."},"variant":{"type":"string","description":"CnActionButtons button variant (e.g. 'primary', 'secondary', 'error'). 'error' also styles the confirm dialog as destructive. A 'primary' action is never collapsed into CnActionButtons' overflow menu and consumes none of its `inline` slots: NcActions paints all of its inline actions with one shared variant, so a lone primary among them is not expressible."},"children":{"type":"array","description":"Sub-actions, rendered by CnActionButtons as this action's OWN chevron dropdown beside its button — deliberately not folded into the page's single overflow menu, because NcActions cannot nest and a list that grows per record (app versions, say) would swamp it. Children take the same shape as any action, `visibleWhen` included, and an action carrying them consumes none of the `inline` slots. The parent itself still renders its own button beside the chevron (`type` defaults to 'handler' when omitted), so a parent meant only to group its children needs a `handler` that does something meaningful — an untyped, handler-less parent renders a button that dispatches to nothing.","items":{"$ref":"#/$defs/action"}},"childrenLabel":{"type":"string","description":"i18n key naming the `children` dropdown. Falls back to the parent action's own label, so the chevron is never announced unlabelled."},"visibleWhen":{"$ref":"#/$defs/visibleWhen","description":"#91 Wave 3: an optional predicate gating whether the action renders — the shared banner shape ({ endpoint | source | field, op, value }). The `field`-only LOCAL form evaluates against the page object context (a detail action shown only in the right lifecycle state); endpoint / source forms fetch. Fail-safe: a broken predicate hides the action."}},"allOf":[{"description":"object-op actions MUST declare their mutation verb via `op`.","if":{"properties":{"type":{"const":"object-op"}},"required":["type"]},"then":{"required":["op"]}},{"description":"api-call actions MUST declare their endpoint via `url`.","if":{"properties":{"type":{"const":"api-call"}},"required":["type"]},"then":{"required":["url"]}},{"description":"open-form actions MUST declare the create schema via `schema`.","if":{"properties":{"type":{"const":"open-form"}},"required":["type"]},"then":{"required":["schema"]}},{"description":"agent actions MUST declare the target agent uuid via `agent`.","if":{"properties":{"type":{"const":"agent"}},"required":["type"]},"then":{"required":["agent"]}},{"description":"toggle actions MUST declare their write endpoint via `writeUrl`.","if":{"properties":{"type":{"const":"toggle"}},"required":["type"]},"then":{"required":["writeUrl"]}},{"description":"run-node actions MUST declare which flow and which node within it (RN-3, or-flow-run-node) — a node's config and eligibility are properties of the flow it lives in, so neither can be inferred.","if":{"properties":{"type":{"const":"run-node"}},"required":["type"]},"then":{"required":["flowId","nodeId"]}}]},"fieldValidation":{"type":"object","additionalProperties":false,"description":"manifest-form-logic: per-field validation rules for `type: 'form'` pages, enforced client-side by CnFormPage's validateFieldValue() before dispatch. Per-type semantics: string/password — required = non-empty after trim, min/max = string LENGTH, pattern tested against the value; number — required = finite number, min/max = numeric VALUE, pattern not applicable; boolean — required = value must be true (consent checkboxes), min/max/pattern not applicable; enum — required = a value is selected, min/max/pattern not applicable; json — required = non-null, min/max/pattern not applicable. Type-inapplicable rules are rejected by validateManifestV2() post-schema (pattern only on string/password; min/max only on string/password/number). `message` (i18n-able) overrides the built-in default message for whichever rule fails.","properties":{"required":{"type":"boolean","description":"Whether the field must be filled. Default false. Per-type pass condition — see the fieldValidation description."},"min":{"type":"number","description":"Minimum bound. String length for string/password fields, numeric value for number fields. MUST be <= max when both are set (validateManifestV2 post-schema check)."},"max":{"type":"number","description":"Maximum bound. String length for string/password fields, numeric value for number fields."},"pattern":{"type":"string","description":"ECMAScript regex source tested against string/password values (implicit full-value test via new RegExp(pattern).test(value)). MUST compile — validateManifestV2() post-schema check runs `new RegExp(pattern)` in a try/catch."},"message":{"type":"string","description":"i18n-able override message shown for ANY failing rule on this field, in place of the built-in translated default. Run through the page's `translate` prop, like `field.label`."}}},"visibleWhen":{"type":"object","additionalProperties":false,"description":"#91 Wave 3: the shared visibility predicate (the Wave-1 banner shape). THREE modes: `endpoint` (GET a JSON endpoint, `field` dot-paths into the body), `source` (an OpenRegister { register, schema, filter? } query — `field` into the first result, or omit / use @total for the collection total), or LOCAL (neither endpoint nor source — `field` dot-paths into the caller's object context, e.g. a detail-page record). `op` defaults to eq. Evaluation is FAIL-SAFE (any error → hidden).","properties":{"appInstalled":{"type":"string","minLength":1,"description":"Nextcloud app id that must be installed and enabled for the guarded element to show. A PRECONDITION rather than a fourth mode: it is checked before anything else, and on its own it is the whole condition. Combined with endpoint/source/field it gates that mode too, so both must hold. It exists because the menu's `visibleIf` already spoke this word and `visibleWhen` did not, so the same manifest vocabulary meant two different things in two places. Use it on an action that writes into a sibling app, so an install without that app shows no button rather than a form that saves nowhere."},"endpoint":{"type":"string","description":"A same-origin URL returning JSON; `field` is a dot-path into the body."},"source":{"type":"object","additionalProperties":true,"description":"An OpenRegister object query { register, schema, filter? } (filter supports the shared @-token grammar). `field` dot-paths into the first result; omit it (or use @total) to compare the collection total.","properties":{"register":{"type":"string"},"schema":{"type":"string"},"filter":{"type":"object","additionalProperties":true}}},"field":{"type":"string","description":"Dot-path to the compared value — into the endpoint body, the source's first result, or (LOCAL mode) the caller's object context."},"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte","empty","notEmpty"],"default":"eq","description":"Comparison operator (default eq). eq/neq compare loosely-normalised primitives; ordering operators coerce both sides to Number. `empty` / `notEmpty` take no `value` and treat undefined, null, '' and an empty array alike — the one question eq cannot ask, because an unset field arrives in a shape that depends on the store and String(null) is the word 'null' rather than blank."},"value":{"description":"The right-hand side of the comparison, resolved through the shared @-token grammar so `@me` names the signed-in reader rather than a literal only the server knows. Omitted for `empty` / `notEmpty`."},"all":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/visibleWhen"},"description":"Every listed condition must hold. Use it where a gate is more than one fact — a Claim button that is both 'not closed' and 'nobody holds it'. Each entry is a full visibleWhen and may compose again."},"any":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/visibleWhen"},"description":"At least one listed condition must hold. Ignored when `all` is also present."}}},"objectTableSource":{"type":"object","required":["register","schema"],"additionalProperties":false,"description":"Declarative self-fetch source for the object-table built-in widget (CnWidgetObjectTable). The widget resolves `filter` @-tokens (@me, @today, @today±Nd, @workspace.*, ?-optional suffix) with the shared resolveFilterTokens grammar just before fetching, and drives CnDataTable's existing self-fetch. `register` MAY carry an `@resolve:` sentinel — the widget passes it through unexpanded (resolution is the host loader's responsibility). Externally supplied `rows` always win over `source`.","properties":{"register":{"type":"string","description":"OpenRegister register slug (or an `@resolve:<key>` sentinel, passed through unexpanded by the widget)."},"schema":{"type":"string","description":"OpenRegister schema slug."},"filter":{"type":"object","additionalProperties":true,"description":"Filter map (`{ field: value | value[] | { op: value | value[] } }`). Values may use the shared @-token grammar: `@me` (current user via @nextcloud/auth), `@now`, `@today`, relative-date arithmetic `@today±Nd` at day granularity (e.g. `@today-30d`, `@today+7d`), `@monthStart`/`@quarterStart`/`@yearStart`, `@objectId`/`@object.<field>` (detail context), `@workspace.<key>`/`@config.<key>` with a trailing `?` for optional clauses that drop when unresolved. IN-lists: an ARRAY value (directly, or via `{ in: [...] }`) matches any of its entries — tokens resolve item-by-item and the widget serializes the list as repeated `field[]` params (the shape OpenRegister parses)."},"order":{"type":"object","additionalProperties":{"type":"string","enum":["asc","desc"]},"description":"Fetch ordering: field name to direction map (e.g. { \"dueDate\": \"asc\" })."},"limit":{"type":"integer","minimum":0,"description":"Row cap. 0 (or omitted) shows all fetched rows; a positive value caps the rendered rows and enables the View-all footer when more rows exist."},"extend":{"type":"array","items":{"type":"string"},"description":"OpenRegister `_extend[]` values forwarded on the fetch (e.g. [\"calculations\"]) so read-time virtual/derived fields are hydrated and available as columns. Each entry is passed through verbatim."}}},"endpointSource":{"type":"object","required":["url"],"additionalProperties":false,"description":"Wave 2 (#91): ONE coherent endpoint data binding shared by the stat / delta / object-table widgets (the chart uses the extended $defs/chartEndpointSource). Reads an arbitrary app REST endpoint through the library's useEndpointSource engine: params pass the SAME @-token grammar widget filters use (@me, @today±Nd, @monthStart, @workspace.<key>/@config.<key> with a trailing `?` for optional values that drop when unresolved — a REQUIRED token that stays unresolved blocks the fetch), requests dedupe + short-TTL cache per (method, url, resolved params), and the widget refetches on cn:page:refresh / a matching cn:widget:refresh. Exactly ONE of the widget's OpenRegister source | endpointSource may be configured — a cross-field rule enforced by validateManifestV2() as a post-schema check (clear error message), matching the stats-block precedent.","properties":{"url":{"type":"string","description":"Endpoint URL — app-relative (routed through generateUrl, e.g. '/apps/pipelinq/api/analytics/overview') or absolute (http/https, left untouched). May interpolate @page.<key> / @workspace.<key> / @config.<key> / @objectId / @object.<field> tokens inline; unresolved URL tokens collapse to an empty string."},"method":{"type":"string","enum":["GET","POST"],"default":"GET","description":"HTTP method. GET (default) sends the resolved params as query parameters; POST sends them as the JSON body."},"params":{"type":"object","additionalProperties":true,"description":"Request parameters. Values pass the shared filter-token grammar (resolveFilterTokens): @me, @now, @today, @today±Nd, @monthStart/@quarterStart/@yearStart, @objectId/@object.<field> (detail context), @workspace.<key>/@config.<key> with a trailing `?` for optional values (dropped when unresolved; e.g. `{ \"period\": \"@workspace.datePreset?\" }` rides the dashboard date-range pills). A required token that stays unresolved blocks the fetch until the page context provides it."},"responsePath":{"type":"string","description":"Dot-path pluck of the response payload (e.g. 'summary', 'data.series'). Omitted = the whole response body."}}},"chartEndpointSource":{"type":"object","required":["url"],"additionalProperties":false,"description":"The chart widget's endpoint binding: the $defs/endpointSource transport plus the labels/series response mapping. The mapping keys live INSIDE this block (not as sibling props) because the chart's flat `series` / `labels` props already carry the static data. When the plucked payload is an ARRAY of points (e.g. pipelinq /api/analytics/trends → responsePath 'series'), labelsPath / series[].path are PER-ITEM field paths (labelsPath 'date', series [{ name: 'Leads', path: 'value' }]); when it is an OBJECT they point at parallel arrays. Pie-family charts flatten the FIRST mapped series into the flat value array ApexCharts expects. Exactly ONE of dataSource | endpointSource per chart widget (post-schema check).","properties":{"url":{"type":"string","description":"Endpoint URL — app-relative (generateUrl) or absolute. Same token interpolation as $defs/endpointSource."},"method":{"type":"string","enum":["GET","POST"],"default":"GET","description":"HTTP method. GET (default) sends params as query parameters; POST as the JSON body."},"params":{"type":"object","additionalProperties":true,"description":"Request parameters — the shared filter-token grammar (see $defs/endpointSource.params). Params re-resolve and the chart refetches when the dashboard date range changes (the page publishes dateFrom / dateTo / datePreset into the workspace context)."},"responsePath":{"type":"string","description":"Dot-path pluck of the response payload. Omitted = the whole response body."},"labelsPath":{"type":"string","description":"Labels/categories mapping: a per-item field path for an ARRAY payload ('date'), or the path of a parallel label array for an OBJECT payload ('labels')."},"series":{"type":"array","description":"Series mapping — one entry per rendered series.","items":{"type":"object","required":["path"],"additionalProperties":false,"properties":{"name":{"type":"string","description":"Series display name (legend / tooltip). Defaults to the path."},"path":{"type":"string","description":"Value mapping: a per-item field path for an ARRAY payload ('value'), or the path of a parallel number array for an OBJECT payload ('totals')."}}}}}},"statsBlockEntry":{"type":"object","required":["register","schema"],"additionalProperties":false,"description":"One KPI entry inside a multi-entry stats-block widget (CnStatsBlockWidget `entries[]`). Carries the same source contract as a type:'stat' widget: register + schema + metric + token-resolved filter (@today / @me / @workspace.* and ?-optional clauses), plus per-entry presentation (title, variant, countLabel), an optional route deep link, and hideWhenZero.","properties":{"title":{"type":"string","description":"KPI title rendered by the inner CnStatsBlock."},"register":{"type":"string","description":"OpenRegister register slug for this entry's count."},"schema":{"type":"string","description":"OpenRegister schema slug for this entry's count."},"metric":{"type":"string","description":"Aggregation metric for the REST /value aggregation (default 'count')."},"field":{"type":"string","description":"Field the metric aggregates over (metric-dependent; unused for count)."},"filter":{"type":"object","additionalProperties":true,"description":"Filter map with the shared @-token grammar (@today / @me / @workspace.<key>, trailing `?` for optional clauses)."},"route":{"type":"object","additionalProperties":true,"description":"Optional vue-router location for the KPI's deep link (renders the entry clickable)."},"variant":{"type":"string","enum":["default","primary","success","warning","error"],"description":"Color variant forwarded to the inner CnStatsBlock."},"countLabel":{"type":"string","description":"Label displayed next to the count."},"iconClass":{"type":"string","description":"Optional Nextcloud core icon class (icon-link, icon-mail, …) for the entry."},"hideWhenZero":{"type":"boolean","default":false,"description":"When true, the entry is omitted from the card when its resolved count is 0."}}},"page":{"type":"object","required":["id","route","type","title"],"additionalProperties":false,"description":"A v2 page definition. CnPageRenderer dispatches by type and matches by $route.name === page.id. All page types support a uniform widgets[] array for declarative slot placement. Sentinels (@resolve:*) are NOT allowed in id, route, component, headerComponent, actionsComponent, or slots.* — those are router and registry invariants.","properties":{"requiresApp":{"description":"Soft dependency gating this WHOLE page. When the named Nextcloud app is not installed, the page renders the missing-dependency screen instead of its body. This is for the DEEP LINK: an entry gated by visibleIf.appInstalled is already hidden from the menu, so the remaining ways in are a bookmark, a shared URL, a redirect or an e2e spec, and those otherwise land on an empty page where 'not installed' looks the same as 'no data'. Gate a single WIDGET with visibleIf.appInstalled instead: a detail page may carry many widgets where only one needs the app, and that widget should hide while the page renders normally.","oneOf":[{"type":"string","minLength":1},{"type":"object","required":["id"],"additionalProperties":false,"properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1,"description":"Human-readable app name shown on the screen; defaults to the id."}}}]},"id":{"type":"string","description":"Vue-router route name. MUST be unique across pages[]. Sentinels (@resolve:*) are NOT allowed."},"route":{"type":"string","description":"Path pattern (e.g. '/decisions', '/decisions/:id'). Sentinels (@resolve:*) are NOT allowed."},"type":{"type":"string","enum":["index","detail","dashboard","logs","settings","chat","files","form","map","roadmap","reports","store","search","wiki","flow","flows","flow-detail","custom"],"description":"Page type. Closed enum of 17 supported types. 'flow' opens ONE flow in the editor; the flow LIST is an ordinary 'index' with config.entitySource='flows'. 'flows' and 'flow-detail' are DEPRECATED aliases kept for migration — 'flows' predates named index sources and 'flow-detail' is the old name for 'flow'. 'roadmap' mounts CnFeaturesAndRoadmapPage (features + GitHub-issue-backed roadmap). 'search' mounts CnSearchPage (cross-schema query + facet sidebar + results list; consumers wire the actual search via @search). 'wiki' mounts CnWikiPage (manifest-declared markdown article + optional sidebar tree; MUST declare config.register + config.schema). 'flow' and the deprecated 'flow-detail' both mount CnFlowEditorPage (the shared node/edge canvas) and take config.app to scope to the owning app. A flow lives in OpenRegister's native flow store rather than a register/schema pair, so a single flow cannot be a 'detail' page — but the LIST is a plain 'index' once a named entitySource supplies it, which is why 'flows' is deprecated (ADR-110 Decision 4). 'custom' requires a _note field explaining why a standard type was not feasible."},"title":{"type":"string","description":"i18n translation key for the page title."},"permission":{"type":"string","description":"Optional permission identifier required to access this page."},"component":{"type":"string","description":"For type='custom': name resolved against the app-provided customComponents registry. Sentinels (@resolve:*) are NOT allowed."},"headerComponent":{"type":"string","description":"Optional registry name for a component injected into the page's #header slot. Sentinels (@resolve:*) are NOT allowed."},"actionsComponent":{"type":"string","description":"Optional registry name for a component injected into the page's #actions slot. Sentinels (@resolve:*) are NOT allowed."},"sidebarComponent":{"type":"string","minLength":1,"description":"Optional registry name for a component mounted as the default sidebar content for this page."},"slots":{"type":"object","description":"Generic slot-override map. Each key is a slot name; each value is a registry component name. Sentinels (@resolve:*) are NOT allowed in values.","additionalProperties":{"type":"string"}},"primaryAction":{"$ref":"#/$defs/primaryAction","description":"Active-page-scoped primary action rendered as an NcAppNavigationNew button above the menu list when the current route resolves to this page. Page-scoped declarations win over nav.primaryAction. Also the target of the detail page's skip link: a keyboard user tabs in, follows the link and lands on this action."},"splitView":{"$ref":"#/$defs/splitView","description":"Index pages only. Opens a row beside the list rather than instead of it, at the sibling route <route>/split/:id that buildManifestRoutes() emits. Refused on any other page type."},"board":{"$ref":"#/$defs/boardView","description":"Index pages only. The board view's configuration, handed to CnIndexPage as the `board` prop. The segment appears only when `viewModes` also lists `board`. Refused on any other page type."},"dateAxis":{"$ref":"#/$defs/dateAxisView","description":"Index pages only. The date-axis view's configuration, handed to CnIndexPage as the `dateAxis` prop. The segment appears only when `viewModes` also lists `dateAxis`. Refused on any other page type."},"savedViewTree":{"$ref":"#/$defs/savedViewTree","description":"Index pages only. Renders this page's saved views as a tree with labels, and declares the views that ship with the app. Refused on any other page type: a page with no saved-view dropdown has nothing to put in a tree."},"manualOrder":{"type":"boolean","default":false,"description":"Index pages only. Lets a person drag the rows into an order of their own, held per user and per list in their Nextcloud preferences and never written onto the records. Refused on any other page type."},"tabInAddress":{"type":"boolean","default":false,"description":"Detail pages only. Puts the active tab in the address as ?_tab=<id> so a link points at a tab of a record rather than at the record. The underscore prefix keeps it out of resolveQueryFilters(), which reads every other query key as a filter. Refused on any other page type."},"referencePreview":{"type":"boolean","default":false,"description":"Lets a reference on this page show a summary of the record it points at, on focus and on hover, without leaving the page. Rendered by CnReferencePreview."},"widgets":{"type":"array","items":{"$ref":"#/$defs/widgetEntry"},"description":"Uniform widget placement array. Available on ALL page types in v2 (not just dashboard). Each entry specifies a widget key, slot, and grid coordinates. The cross-field constraint gridX + gridWidth <= 12 is enforced by validateManifestV2() post-schema check. Single-widget dashboards: a type:'dashboard' page with exactly one body widget covering the full 12×12 grid whose widgetKey resolves to a custom (non-library-built-in) registry component is REJECTED — see ADR-036 Decision 1 (single-widget dashboard anti-pattern). Use type:'custom' with component:'<widgetKey>' or split into N>1 widgets instead. Library built-in widget keys are exempt from the rule; the exempt set is LIBRARY_WIDGET_KEYS in src/utils/libraryWidgetKeys.js, which is held to set equality against the BUILT_IN_WIDGETS registry and the dashboard widget catalog by tests/utils/libraryWidgetKeys.spec.js. It is not restated here, because an out-of-date second copy of that list is the defect this replaced. Enforced by validateManifestV2() post-schema check."},"actions":{"type":"array","items":{"$ref":"#/$defs/action"},"description":"Typed page-level actions with a discriminator. Each action has a type field (handler | open-modal | open-page | navigate) that defaults to 'handler' when omitted."},"config":{"type":"object","description":"Type-specific configuration. Shape varies by page type — see v1 schema for per-type config shapes (index, detail, dashboard, logs, settings, chat, files, form, map, custom). Config values under pages[].config may use the closed sentinel vocabulary (see $defs/sentinelTokenAny) — an out-of-vocabulary @-token FAILS validation via the sentinelGuardedValue allOf guard. Carry-forward from v1: register, schema, columns, actions, sidebar, sidebarProps, fields, sections, tabs, content, layout, widgets (dashboard only), cardComponent, columnGroups, etc.","additionalProperties":true,"allOf":[{"$ref":"#/$defs/sentinelGuardedValue"}],"properties":{"entitySource":{"type":"string","enum":["flows","tasks"],"description":"Name a registered NON-OBJECT entity collection for a type='index' page, instead of register+schema. Deliberately NOT called `source`: that key is already taken on page config and is polymorphic (a URL string in some manifests, an object with `params` in others), so reusing it would give one key two meanings and break six deployed shillinq pages. A flow definition is deliberately not an OpenRegister object, so an index had nothing to bind to and such lists became bespoke type='custom' pages. With a source the index loads the list itself. Takes precedence over register/schema; non-empty `objects` still wins over both. Registered sources live in src/composables/indexSources.js. `tasks` lists the viewer's task inbox from OpenRegister's flow-tasks read (cn-tasks-entity-source)."},"app":{"type":"string","description":"Scopes a named `entitySource` to one app (e.g. entitySource='flows' with app='dossiq' lists that app's flows)."},"register":{"type":"string","description":"OpenRegister register slug."},"schema":{"type":"string","description":"OpenRegister schema slug."},"contentField":{"type":"string","description":"type='wiki': property on the article object holding the markdown body. Defaults to 'body'. Maps to CnWikiPage `contentField` prop."},"titleField":{"type":"string","description":"type='wiki': property on the article object holding the page title. Defaults to 'title'. Maps to CnWikiPage `titleField` prop."},"idParam":{"type":"string","description":"type='wiki': $route.params key holding the article id. Defaults to 'id'. Maps to CnWikiPage `idParam` prop."},"treeField":{"type":"string","description":"type='wiki': property on each sidebar tree node holding its child array. Defaults to 'children'. Maps to CnWikiPage `treeField` prop."},"sidebarTitleField":{"type":"string","description":"type='wiki': property on each sidebar tree node holding its label. Defaults to `titleField`. Maps to CnWikiPage `sidebarTitleField` prop."},"sidebarRegister":{"type":"string","description":"type='wiki': register slug for the sidebar tree. Defaults to `register`. Maps to CnWikiPage `sidebarRegister` prop."},"sidebarSchema":{"type":"string","description":"type='wiki': schema slug providing the sidebar tree. When set AND `tree` is non-empty the sidebar renders. Maps to CnWikiPage `sidebarSchema` prop."},"emptyText":{"type":"string","description":"type='wiki': empty-state heading shown when the article is null. Maps to CnWikiPage `emptyText` prop."},"emptyDescription":{"type":"string","description":"type='wiki': empty-state description shown when the article is null. Maps to CnWikiPage `emptyDescription` prop."},"emptyBodyText":{"type":"string","description":"type='wiki': empty-body heading shown when the article has no content. Maps to CnWikiPage `emptyBodyText` prop."},"emptyBodyDescription":{"type":"string","description":"type='wiki': empty-body description shown when the article has no content. Maps to CnWikiPage `emptyBodyDescription` prop."},"cardComponent":{"type":"string","description":"Registry name for a custom card component on index pages. Carry-forward from v1.3.0."},"sidebar":{"description":"Sidebar configuration. For index: object with enabled, show, columnGroups[], facets, etc. For detail: boolean or object with show, enabled, register, schema, tabs[]. Carry-forward from v1.3.0.","oneOf":[{"type":"boolean"},{"type":"object","additionalProperties":true,"properties":{"show":{"type":"boolean","description":"Whether to show the sidebar on this page."},"enabled":{"type":"boolean","description":"Whether the sidebar is enabled."},"columnGroups":{"type":"array","description":"Index sidebar column-visibility groups. Carry-forward from v1.3.0.","items":{"type":"object","additionalProperties":true}}}}]},"tabs":{"type":"array","description":"Settings tabs (for type='settings'). Carry-forward from v1.3.0.","items":{"type":"object","additionalProperties":true}},"sidebarTabs":{"type":"array","description":"Sidebar tabs declaration for type='detail' pages. Each entry is the human-authored source of truth for one tab — `id` + `label` (required), optional `icon`, `order`, `component`. Widgets bound to a tab carry `tabGroup: \"<tab-id>\"` on `slot:\"sidebar\"` entries; cross-reference is validated. The CLI manifest-migrate transform lifts `config.sidebarTabs[].widgets[]` into top-level `widgets[]` with `slot:\"sidebar\"` + `tabGroup`; tab entries declaring only a `component` are carried forward as residual sidebarTabs[]. See src/cli/transforms/liftSidebarTabWidgets.js.","items":{"type":"object","additionalProperties":true,"required":["id","label"],"properties":{"id":{"type":"string","minLength":1,"description":"Unique tab identifier within the page. Referenced from widgets[].tabGroup."},"label":{"type":"string","minLength":1,"description":"i18n key (or literal) for the tab label."},"icon":{"type":"string","description":"Optional icon name (CSS class or MDI identifier) shown next to the label."},"order":{"type":"number","description":"Optional sort key for tab ordering; lower values render first."},"component":{"type":"string","description":"Optional registry name for a full-tab custom component. When set, the tab renders that component directly instead of the per-tab widgets[] grouping. Resolved against the customComponents registry."},"_note":{"type":"string","description":"Optional human note (e.g. lib-gap reason for an undecomposable tab)."}}}},"sections":{"type":"array","description":"Settings sections (for type='settings'). Carry-forward from v1.3.0.","items":{"type":"object","additionalProperties":true}},"fields":{"type":"array","description":"Form fields (for type='form'). Carry-forward from v1.3.0. manifest-form-logic adds two OPTIONAL typed properties — `visibleWhen` (reuses `$defs/visibleWhen`; LOCAL mode resolves `field` as a dot-path into the live form data) and `validation` (`$defs/fieldValidation`) — while every other carry-forward field shape (`key`, `label`, `type`, `enum`, `widget`, `help`, etc.) stays untyped via `additionalProperties: true` on the item.","items":{"type":"object","additionalProperties":true,"properties":{"visibleWhen":{"$ref":"#/$defs/visibleWhen","description":"manifest-form-logic: optional conditional-visibility predicate. LOCAL mode (neither `endpoint` nor `source`) resolves `field` as a dot-path into the live form data — the first dot-segment MUST match a declared `config.fields[].key` (validateManifestV2 post-schema check). `endpoint` / `source` modes keep their existing fail-safe, evaluated-once-at-mount semantics."},"validation":{"$ref":"#/$defs/fieldValidation","description":"manifest-form-logic: optional per-field validation rules, enforced client-side by CnFormPage before dispatch. See `$defs/fieldValidation` for the per-type semantics table."}}}},"steps":{"type":"array","minItems":1,"description":"manifest-form-logic: for type='form' pages, ordered multi-step wizard groups. Each entry is `{ id, title, description?, fields[] }` where `fields[]` is an ordered array of KEY REFERENCES into `config.fields[].key` — steps do not embed field objects (config.fields[] stays the single source of truth). Absent `steps` = single-step form, byte-for-byte the pre-change rendering. When present, validateManifestV2() post-schema requires: step ids unique within the page, every fields[] entry references a declared field key, and every declared field key appears in EXACTLY ONE step (complete partition — an unassigned field would silently never render; a doubly-assigned field would double-render).","items":{"type":"object","required":["id","title","fields"],"additionalProperties":false,"description":"One wizard step. `fields[]` order is the rendering order for that step's fields.","properties":{"id":{"type":"string","minLength":1,"description":"Unique step identifier within the page's `steps[]` array."},"title":{"type":"string","minLength":1,"description":"i18n key (or literal) for the step's title, shown in the step indicator."},"description":{"type":"string","description":"Optional i18n key (or literal) for a short step description/subtitle."},"fields":{"type":"array","minItems":1,"items":{"type":"string","minLength":1},"description":"Ordered field KEYS (referencing `config.fields[].key`) rendered on this step."}}}},"fieldWidgets":{"type":"array","description":"Declarative widget-component slots for type='form' / type='detail' pages. Each entry mounts a lib `Cn*` SFC inline (e.g. CnMarkdownEditor as a markdown field, CnSchemaSelect as a relation picker). Distinct from top-level pages[].widgets[] which uses widgetKey + grid coordinates against the host customComponents registry. Carries serialisable props only. See $defs/fieldWidget and ConductionNL/nextcloud-vue#314.","items":{"$ref":"#/$defs/fieldWidget"}},"columns":{"type":"array","description":"Table columns (for type='index' and type='logs'). Items may be strings (legacy shorthand) or column objects ({ key, label, sortable?, width?, formatter?, formatterOptions?, widget?, widgetProps?, format?, aggregate? }). `formatter` resolves against cnFormatters (built-ins incl. currency / conditionalPhrase — configured via `formatterOptions`); `widget` resolves against cnCellWidgets (built-ins incl. badge / fkResolve / link).","items":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]}},"folderSidebar":{"type":"object","additionalProperties":true,"description":"type='index': the opt-in folder navigation pane (CnFolderSidebar) rendered left of the list. Selecting a folder filters the list by `filterField` (or `field`); \"All\" clears it. Only the per-scope list-layout keys are typed here; the pane's own keys (source, register, schema, idField, nameField, folders, allLabel, title, allowCreate, ...) stay free-form. Maps to CnIndexPage `folderSidebar`.","properties":{"folders":{"type":"array","description":"Explicit folder list for source:'custom', and the place a folder declares its own list layout. Every other folder key stays free-form.","items":{"$ref":"#/$defs/folderSidebarScope"}}}},"layout":{"type":"array","description":"Dashboard layout entries (for type='dashboard', legacy). Carry-forward from v1.","items":{"type":"object","additionalProperties":true}},"content":{"type":"array","description":"Declarative content items for dashboard (widget-ref items). Carry-forward from v1.","items":{"type":"object","additionalProperties":true}},"widgets":{"type":"array","description":"Legacy dashboard widgets array in config (for type='dashboard'). In v2, prefer top-level pages[].widgets[] with the uniform widgetEntry shape. This legacy config.widgets key remains for back-compat.","items":{"type":"object","additionalProperties":true}},"headerActions":{"type":"array","description":"Page-level header actions rendered inside CnActionsBar's overflow dropdown (between the built-in Refresh action and the `#action-items` slot). On a `type:'detail'` page the same entries render in the header's Actions menu, above the Request-a-feature / Report-a-bug / Documentation trio. Same shape as the row-level `actions[]` ($ref action), but handlers receive NO row context — they are page-level. Reserved ids (`refresh`, `import`, `export`, `copy`, `delete`) are dropped at render time to avoid shadowing built-ins. See manifest-icons-and-page-actions for the dispatch semantics.","items":{"$ref":"#/$defs/action"}},"bulkActions":{"type":"array","description":"Bulk actions rendered in the contextual selection strip that appears while rows are selected. Same shape as the row-level `actions[]` ($ref action), but the handler receives the SELECTION rather than a row: `{ actionId, selectedIds, count }`. For `type: \"open-modal\"` the selection is merged into the modal's props as `selectedIds` and `count`, so a manifest-declared modal component can act on the selection without the page hand-writing anything. Reserved ids (`copy`, `delete`) are dropped at render time: the strip already ships both as built-ins. Before this existed the strip had only a `#selection-actions` slot, which only a hand-written host component could fill — so a page declared in a manifest could carry row actions and header actions but never a bulk one.","items":{"$ref":"#/$defs/action"}},"actions":{"type":"array","items":{"type":"object","required":["label"],"additionalProperties":true,"properties":{"label":{"type":"string","minLength":1}}},"description":"Declarative actions on a page. Governed ONLY by \"an object carrying a non-empty label\", deliberately: this key is polymorphic by page type (index rows dispatch $defs/action; detail pages also carry type='lifecycle-transition' entries), so one closed grammar here would reject working manifests. A label is what every dialect needs — CnRowActions renders an entry from its label and icon, so an entry without one became a full-height, clickable, EMPTY row in the overflow menu. Two shapes hit this, both meaning \"show the built-in\": a bare string (\"edit\") and a key-only object ({\"key\": \"edit\"}). Built-ins are enabled with config.actionToggles / the show*Action keys, never by naming them here."},"rowIndicators":{"type":"array","description":"type='index': state indicators the page declares for its rows. Each entry names a `field` (a dotted path on the row), a condition (`equals`, `in`, or plain truthiness when neither is given), an `icon` (a CnIcon name) and a `text` (the text alternative, required). An entry without `text` does not render, because an icon with no text is colour and shape alone. The page declares which indicators exist; a record cannot add one the page has not declared. Maps to CnIndexPage `rowIndicators`.","items":{"$ref":"#/$defs/rowIndicator"}},"rowIndicatorCap":{"type":"integer","minimum":0,"default":3,"description":"type='index': how many declared indicators render on the row itself before the rest move into the row menu. Maps to CnIndexPage `rowIndicatorCap`."},"quickEditFields":{"type":"array","items":{"type":"string","minLength":1},"description":"type='index': the fields a quick edit asks for, opened from a row without leaving the list. The page names them; a record cannot open a form on a field the page did not name. A field this caller may not write (see `writableField`) renders read-only rather than missing. Maps to CnIndexPage `quickEditFields`."},"writableField":{"type":"string","default":"@self.writableFields","description":"type='index': the dotted path where a record lists the fields this caller may write. A row carrying nothing there leaves every field the quick edit named editable; an empty list is a refusal and locks them all. Maps to CnIndexPage `writableField`."},"viewTabs":{"type":"array","items":{"type":"string","minLength":1},"description":"type='index': saved view ids this page renders as tabs instead of as entries in the views control. A view appears in one place or the other, never both. An id naming a view that no longer exists produces no tab, rather than a tab that opens nothing. Maps to CnIndexPage `viewTabs`."},"priorityField":{"type":"string","description":"type='index': the field carrying a record's DERIVED priority. The list reads the value and sorts on it; it never computes one. A record with no priority, or one outside `priorityLevels`, sorts after every ranked record in BOTH directions and stays in the list. Maps to CnIndexPage `priorityField`."},"priorityLevels":{"type":"array","items":{"type":"string","minLength":1},"description":"type='index': the priority values in rank order, lowest first (e.g. ['low', 'medium', 'high']). Needed because a priority does not sort alphabetically into the order a person means. Maps to CnIndexPage `priorityLevels`."},"listShortcuts":{"type":"boolean","default":false,"description":"type='index': offer the list's keyboard shortcuts. Every shortcut is also listed in the command palette and on the help key, from one catalogue, because a shortcut nobody can find does not count. Maps to CnIndexPage `listShortcuts`."},"rowActionField":{"type":"string","description":"type='index': the dotted path on each row where the server lists the actions this caller may run on that record (default '@self.actions'). A row's menu is then the intersection of what `config.actions` declares and what the server allows: an action the server allows but the page does not declare stays out, and an action the page declares but the server refuses stays out with its reason kept. A row carrying nothing at this path leaves the declaration standing. Maps to CnIndexPage `rowActionField`."},"editOpensDetail":{"type":"boolean","description":"type='index': send the Edit row action to the record's detail page instead of opening the edit modal. OPT-IN — CnPageRenderer used to set this wherever a type='detail' page or config.rowRoute existed, and it no longer does: @edit-open is bound to the same navigation as a row click, so a routed Edit just repeats the row click (the split pane, or the detail page) and the form is no longer reachable from the list. Declare true per page when the modal cannot express the record. Maps to CnIndexPage `editOpensDetail`."},"showEditAction":{"type":"boolean","description":"type='detail': show the header Edit button that opens the record's schema form. Set automatically by CnPageRenderer for every schema-bound detail page; declare false to make a detail page read-only. Maps to CnDetailPage `showEditAction`."},"formSize":{"type":"string","enum":["small","normal","large"],"default":"normal","description":"NcDialog size for the page's built-in Add/Edit form dialog (type='index' and type='detail'). A manifest `open-form` header action has always been able to ask for `large`; the built-in dialog could not, so the same app could have a roomy create form on one surface and a cramped one on another. Maps to CnIndexPage / CnDetailPage `formSize`."},"formColumns":{"type":"integer","enum":[1,2],"default":1,"description":"How many columns the page's built-in Add/Edit form flows its fields into. Pair 2 with formSize 'large', or the two columns are merely two narrow ones. CnFormDialog collapses back to one column below 700px, and a textarea or JSON editor spans both columns regardless. Maps to CnIndexPage / CnDetailPage `formColumns`."},"excludeFields":{"type":"array","items":{"type":"string"},"description":"Property names kept OUT of the page's built-in Add/Edit form dialog. Maps to CnIndexPage / CnDetailPage `excludeFields`."},"includeFields":{"type":"array","items":{"type":"string"},"description":"Property names the page's built-in Add/Edit form dialog shows, in this order — a whitelist, so anything absent is hidden regardless of excludeFields. Maps to CnIndexPage / CnDetailPage `includeFields`."},"fieldOverrides":{"type":"object","additionalProperties":true,"description":"Per-field overrides merged over the schema-derived field descriptors in the page's built-in Add/Edit form dialog (e.g. `{ \"description\": { \"widget\": \"textarea\" } }`). Which widget a field renders as belongs to the surface, not to the schema. Maps to CnIndexPage / CnDetailPage `fieldOverrides`."},"createDefaults":{"type":"object","additionalProperties":true,"description":"type='index': seed values for the page's built-in create dialog, never applied on edit. Resolves `@me`/`@now`/`@today` at any depth; `@object.*`/`@workspace.*`/`@config.*` need a context the page does not carry and pass through unchanged. Maps to CnIndexPage `createDefaults`."},"createSuccessRoute":{"oneOf":[{"type":"string"},{"type":"object","properties":{"name":{"type":"string"},"paramField":{"type":"string"},"objectParam":{"type":"string"}},"required":["name"],"additionalProperties":false}],"description":"type='index': route opened after a successful create from the page's built-in Add dialog; the created object's id is merged into the params. Maps to CnIndexPage `createSuccessRoute`."},"createSuccessMessage":{"type":"string","description":"type='index': toast shown after a successful create from the page's built-in Add dialog. Maps to CnIndexPage `createSuccessMessage`."},"savedViewsScope":{"type":"string","description":"type='index': which pages share this page's saved views. By default a view is shared by every page over the same register and schema and by no other, because a view is filters over one schema's fields. Set this to share views across pages over different sources, or to keep two pages over one source apart. Written into the saved view's `query.scope`; views saved before scoping stay visible everywhere. Maps to CnIndexPage `savedViewsScope`."},"splitCloseButton":{"type":"boolean","default":true,"description":"type='index': whether the split pane draws its own close link. Set false when a `#split-pane` slot draws one from the slot's `close`. Maps to CnIndexPage `splitCloseButton`."},"splitCloseLabel":{"type":"string","description":"type='index': accessible name and tooltip for the split pane's close button. Defaults to \"Close\". Maps to CnIndexPage `splitCloseLabel`."},"mapConfig":{"type":"object","additionalProperties":true,"description":"type='index': how rows are plotted when the Map view mode is available. Non-empty (and not excluded by an explicit viewModes) adds a Map segment to the view toggle. Maps to CnIndexPage `mapConfig`.","properties":{"latField":{"type":"string","description":"Object (or `@self`) property path holding the marker's latitude. Dotted paths are supported, e.g. `@self.geo.lat`."},"lngField":{"type":"string","description":"Object (or `@self`) property path holding the marker's longitude."},"geoField":{"type":"string","description":"Alternative single property holding a GeoJSON Point geometry (`{ type: 'Point', coordinates: [lng, lat] }`). Takes precedence over latField/lngField when present and resolvable."},"popupField":{"type":"string","description":"Object property rendered in the marker popup."},"center":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2,"description":"Fallback centre `[lat, lng]` when the filtered set has no plottable rows."},"clustering":{"type":"boolean","default":true,"description":"Whether coincident markers are grouped into a cluster that spiderfies on click. ON by default here — the opposite of CnMapWidget's own default — because an index map plots whatever the filter returns, and several rows at one address is the normal case: unclustered they land on identical pixels, the topmost takes every click and the rest are unreachable with nothing on screen saying they exist. Non-point geometry skips the cluster group, so areas are unaffected. Set false for the old behaviour."}}},"quickFilterMaxVisible":{"type":"integer","minimum":0,"default":0,"description":"type='index', chips mode: how many quickFilters render as pills before the rest move behind one more chip — a `⋯` pill that opens a panel of the hidden lenses, and that wears the label and the active fill of whichever one is on. 0 (the default) renders every lens, which wraps the actions bar onto a second line once a page declares more than a handful. The visible set is the FIRST n entries of quickFilters, so reorder that array to change which lenses stay out. Maps to CnIndexPage `quickFilterMaxVisible`."},"actionToggles":{"type":"object","description":"Built-in action toggles for type='index' pages. Each key is sugar for the matching CnIndexPage prop — manifest authors can hide built-in mass actions / row actions / the Add button without writing a wrapper. Mirrors the CnIndexPage prop names. Explicit config.<key> wins over config.actionToggles.<key> (matches the readOnly precedence rule). Distinct from config.actions[] which is the typed row-actions array.","additionalProperties":true,"properties":{"showAdd":{"type":"boolean","description":"Whether to show the Add button in the actions bar. Maps to CnIndexPage `showAdd`."},"showFormDialog":{"type":"boolean","description":"Whether the built-in create / edit form dialog is enabled. Maps to CnIndexPage `showFormDialog`."},"showEditAction":{"type":"boolean","description":"Whether to add an Edit action to row actions. Maps to CnIndexPage `showEditAction`."},"showCopyAction":{"type":"boolean","description":"Whether to add a Copy action to row actions. Maps to CnIndexPage `showCopyAction`."},"showDeleteAction":{"type":"boolean","description":"Whether to add a Delete action to row actions. Maps to CnIndexPage `showDeleteAction`."},"showMassImport":{"type":"boolean","description":"Whether to show the built-in mass Import action. Maps to CnIndexPage `showMassImport`."},"showMassExport":{"type":"boolean","description":"Whether to show the built-in mass Export action. Maps to CnIndexPage `showMassExport`."},"showMassCopy":{"type":"boolean","description":"Whether to show the built-in mass Copy button. Maps to CnIndexPage `showMassCopy`."},"showMassDelete":{"type":"boolean","description":"Whether to show the built-in mass Delete button. Maps to CnIndexPage `showMassDelete`."},"showViewToggle":{"type":"boolean","description":"Whether to show the table/cards view-mode toggle. Maps to CnIndexPage `showViewToggle`."},"selectable":{"type":"boolean","description":"Whether rows are selectable (driving the mass-action surface). Maps to CnIndexPage `selectable`."}}},"mode":{"type":"string","enum":["edit","create","public"],"description":"Authoring / access mode. type='form': 'edit' loads from `data`, 'create' starts blank, 'public' shows the public-form success banner and skips auth-state requirements. type='detail': 'public' marks the route as unauthenticated (token-scoped reader pages — pair with a route-param token via the @route.<param> sentinel). Maps to CnFormPage / CnDetailPage `mode` prop."},"subscribe":{"type":"boolean","default":true,"description":"Collaborative-editing default for type='detail'. When true (the default) CnDetailPage calls `objectStore.subscribe(objectType, objectId)` on mount via `useObjectSubscription` and unsubscribes on unmount. Set to false for read-only or archive views. Mirrors the `subscribe` Boolean prop on CnDetailPage / CnObjectSidebar. See the `collaborative-editing-defaults` capability."},"lock":{"type":"boolean","default":true,"description":"Collaborative-editing default for type='detail'. When true (the default) the page wires `useObjectLock` so the locked-by-other banner renders when a remote lock is active. Explicit lock acquire/release on the edit toggle is the v2 follow-up; at v1 this flag controls whether read-side `lockState` is wired. Mirrors the `lock` Boolean prop on CnDetailPage / CnObjectSidebar."}}},"sidebar":{"type":"object","description":"Per-page top-level sidebar visibility gate. Sibling of config, applies to every page type. show: boolean gates CnPageRenderer's #sidebar slot.","additionalProperties":true,"properties":{"show":{"type":"boolean","description":"Whether the host App's #sidebar slot renders for this page. Defaults to true."}}},"_note":{"type":"string","description":"Human-readable note. REQUIRED when type is 'custom' — must document why a standard page type was not feasible."}},"allOf":[{"description":"splitView, manualOrder, savedViewTree, board and dateAxis are index-page mechanics. splitView emits a second route beside an index route and mounts the detail pane inside CnIndexPage; manualOrder holds a per-user row order for a list. Declared on a detail, dashboard or custom page they would validate and then do nothing, which is the failure this branch refuses out loud (case-page-and-list-as-a-place).","if":{"not":{"properties":{"type":{"const":"index"}},"required":["type"]}},"then":{"not":{"anyOf":[{"required":["splitView"]},{"required":["manualOrder"]},{"required":["savedViewTree"]},{"required":["board"]},{"required":["dateAxis"]}]}}},{"description":"tabInAddress puts the active tab of a record in the address. Only a detail page has a record and a tab strip, so the key is refused elsewhere rather than validating into a no-op (case-page-and-list-as-a-place).","if":{"not":{"properties":{"type":{"const":"detail"}},"required":["type"]}},"then":{"not":{"required":["tabInAddress"]}}},{"description":"type='wiki' (CnWikiPage) renders one manifest-declared markdown article. It MUST declare both config.register and config.schema as non-empty strings so the manifest stays the source of truth for which OpenRegister register/schema the article body is read from (manifest-wiki-page-type).","if":{"properties":{"type":{"const":"wiki"}},"required":["type"]},"then":{"properties":{"config":{"type":"object","required":["register","schema"],"properties":{"register":{"type":"string","minLength":1},"schema":{"type":"string","minLength":1}}}},"required":["config"]}},{"description":"type='custom' requires _note documenting why decomposition into a standard page type was not feasible. Relaxed by ConductionNL/nextcloud-vue#315: when `component` matches the lib `Cn[A-Z]\\w+` pattern, the component name already documents the choice and _note is optional. When `component` is absent or non-Cn (host-app SFC), _note remains required.","if":{"properties":{"type":{"const":"custom"}},"required":["type"]},"then":{"if":{"properties":{"component":{"type":"string","pattern":"^Cn[A-Z]\\w+$"}},"required":["component"]},"then":{"description":"Lib-SFC custom page: component is self-documenting, _note is optional."},"else":{"description":"Host-app SFC custom page (or no component): _note is required to document why a standard page type was not feasible.","required":["_note"]}}}]},"visibleIfCondition":{"type":"object","description":"A visibleIf condition block. Each key is either a reserved specialised condition (appInstalled) or a dot-separated path into manifest.runtime. Values are predicate expressions (scalar for eq shorthand, or operator object). All conditions are combined with implicit AND.","additionalProperties":true,"properties":{"appInstalled":{"type":"string","minLength":1,"description":"Nextcloud app id that MUST be installed and enabled for this entry to render."}}},"deepLink":{"type":"object","additionalProperties":true,"required":["registerSlug","schemaSlug","urlTemplate"],"description":"ADR-040 object deep-link descriptor. Maps an OR register+schema to an in-app URL template so other apps / the integration registry can resolve a deep link to an object. Permissive: extra keys are tolerated for forward-compatibility.","properties":{"registerSlug":{"type":"string","description":"OR register slug the deep link targets."},"schemaSlug":{"type":"string","description":"OR schema slug the deep link targets."},"urlTemplate":{"type":"string","description":"In-app URL template; {uuid} (and other object placeholders) are substituted at resolve time."},"displayName":{"type":"string","description":"Human-readable label for the linked object type."}}},"adminSettingsEntry":{"type":"object","required":["id","label"],"additionalProperties":false,"oneOf":[{"required":["type"]},{"required":["component"]}],"description":"One admin-only settings section rendered by CnAppRoot's generic admin NcAppSettingsDialog, sorted into the dialog by `order`. Exactly one of `type` (a built-in section) or `component` (a custom section resolved from the renderer registry) MUST be present.","properties":{"id":{"type":"string","description":"Unique identifier for this admin-settings entry; also the rendered NcAppSettingsSection id."},"label":{"type":"string","description":"i18n translation key (English source) resolved by the consuming app's t() function, shown as the section header."},"type":{"type":"string","enum":["organisation-credentials"],"description":"Built-in admin-settings section. Closed enum. 'organisation-credentials' renders CnCredentials with scope=\"organisation\" (the OpenRegister credential broker's organisation-scope pane). Mutually exclusive with `component`."},"component":{"type":"string","description":"Registry key of a custom admin-settings section component, resolved from the CnAppRoot custom-components registry at render time. Mutually exclusive with `type`."},"order":{"type":"integer","description":"Sort order of this section within the admin dialog. Entries without an order render last, in array position."},"permission":{"type":"string","description":"Optional permission string that further narrows visibility of this section WITHIN the already owner-gated admin dialog, reusing the existing per-item permission grammar. Narrow-only: it can never widen access to a caller who is not an owner of the app."},"props":{"type":"object","additionalProperties":true,"description":"Props forwarded to a custom `component` entry. Ignored for built-in `type` entries."}}}}};const schema32 = {"type":"object","additionalProperties":false,"description":"Override for one of the four built-in support-note buttons (donate, support, feature-request, app-store). Every field is optional; omit the whole entry to keep the shell's default for that button.","properties":{"enabled":{"type":"boolean","description":"Show this button. Set false to hide it."},"label":{"type":"string","description":"Button text. Blank keeps the default label."},"url":{"type":"string","description":"Where the button goes. The feature-request and app-store buttons have no useful default, so an app that wants them must set this."},"variant":{"type":"string","enum":["primary","secondary","tertiary","error","warning","success"],"description":"NcButton variant."},"icon":{"type":"string","description":"Material Design Icon component name, e.g. HeartOutline."}}};const schema36 = {"type":"object","additionalProperties":false,"description":"The app's own defaults for the per-user options CnPersonalPreferences renders. The values a person chooses are stored in their Nextcloud preferences, never here; this block is only the bottom layer of the app default, administered value, personal value order.","properties":{"enabled":{"type":"boolean","default":true,"description":"Whether the personal layer applies at all. An administrator setting this false collapses it: the options render as unavailable with the reason, rather than being silently ignored."},"disabledReason":{"type":"string","description":"What to tell a person when the personal layer is off. Shown beside the unavailable options."},"landingPage":{"type":"string","description":"Page id the app opens on when a person has chosen nothing."},"dateDisplay":{"type":"string","enum":["absolute","relative"],"default":"absolute","description":"How dates read by default. A relative date always carries its absolute date in the accessible name and the tooltip, because a term read as '3 dagen geleden' hides the date the term runs to."},"rememberLastView":{"type":"boolean","default":false,"description":"Whether each list reopens in the view mode that person last used on it."},"pinnedMenu":{"type":"array","items":{"type":"string"},"description":"Menu ids pinned to the top of the navigation by default. A person may reorder and repin their own."}}};const schema38 = {"type":"object","additionalProperties":false,"required":["source","tokenSet"],"description":"A leaf app's NL Design token-set selection, as returned by nldesign's GET /api/token-sets catalogue (app-token-set-selection). Applied by CnAppRoot via useScopedTheme — the ONLY consumer; the backend does not read this field.","properties":{"source":{"type":"string","enum":["nldesign"],"description":"Theme provider. Closed to 'nldesign' — the only scoped-theme source this schema (and useScopedTheme) currently supports."},"tokenSet":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","description":"The nldesign token-set id (a GET /api/token-sets entry's `id`), kebab-case. Resolves the token CSS at css/tokens/<tokenSet>.css."},"tokenSetName":{"type":"string","description":"Optional human-readable name (the matching catalogue entry's `name`), cached at selection time so a picker can display it without a second catalogue fetch."},"preview":{"type":"object","additionalProperties":false,"description":"Optional cached swatch preview (the matching catalogue entry's theming colors), for a picker to render a preview chip without re-fetching the catalogue.","properties":{"primaryColor":{"type":"string","description":"Cached theming.primary_color from the catalogue entry."},"backgroundColor":{"type":"string","description":"Cached theming.background_color from the catalogue entry."}}}}};const schema81 = {"type":"object","required":["id","label"],"additionalProperties":false,"oneOf":[{"required":["type"]},{"required":["component"]}],"description":"One admin-only settings section rendered by CnAppRoot's generic admin NcAppSettingsDialog, sorted into the dialog by `order`. Exactly one of `type` (a built-in section) or `component` (a custom section resolved from the renderer registry) MUST be present.","properties":{"id":{"type":"string","description":"Unique identifier for this admin-settings entry; also the rendered NcAppSettingsSection id."},"label":{"type":"string","description":"i18n translation key (English source) resolved by the consuming app's t() function, shown as the section header."},"type":{"type":"string","enum":["organisation-credentials"],"description":"Built-in admin-settings section. Closed enum. 'organisation-credentials' renders CnCredentials with scope=\"organisation\" (the OpenRegister credential broker's organisation-scope pane). Mutually exclusive with `component`."},"component":{"type":"string","description":"Registry key of a custom admin-settings section component, resolved from the CnAppRoot custom-components registry at render time. Mutually exclusive with `type`."},"order":{"type":"integer","description":"Sort order of this section within the admin dialog. Entries without an order render last, in array position."},"permission":{"type":"string","description":"Optional permission string that further narrows visibility of this section WITHIN the already owner-gated admin dialog, reusing the existing per-item permission grammar. Narrow-only: it can never widen access to a caller who is not an owner of the app."},"props":{"type":"object","additionalProperties":true,"description":"Props forwarded to a custom `component` entry. Ignored for built-in `type` entries."}}};const schema82 = {"type":"object","additionalProperties":false,"description":"Health checks + metric descriptors executed by the AppHost engine.","properties":{"_note":{"type":"string","description":"Free-form note for maintainers; ignored by the engine."},"health":{"type":"object","additionalProperties":false,"description":"Declarative health checks rendered as the ADR-006 {status, app, version, checks} shape.","properties":{"statusCodePolicy":{"type":"string","enum":["adr006","always200"],"default":"adr006","description":"HTTP status-code policy. 'adr006' returns 503 on a failed critical check; 'always200' always returns 200."},"checks":{"type":"array","description":"Health check descriptors.","items":{"type":"object","additionalProperties":false,"required":["id","type"],"properties":{"id":{"type":"string","description":"Check id, surfaced as the key in the response's checks map."},"type":{"type":"string","enum":["database","filesystem","appEnabled","appConfig","orAvailable"],"description":"Engine check kind."},"severity":{"type":"string","enum":["critical","degraded"],"default":"critical","description":"critical → a failure flips status to error (503 under adr006); degraded → status degraded (200)."},"app":{"type":"string","description":"App id, for the appEnabled check."},"key":{"type":"string","description":"Config key, for the appConfig check."}}}},"cors":{"type":"boolean","default":false,"description":"ADR-040: when true the engine emits permissive CORS headers on the /api/health response."}}},"metrics":{"type":"array","description":"Prometheus metric descriptors. The {app}_ prefix, exposition format, and implicit {app}_info / {app}_up gauges are engine-owned.","items":{"type":"object","additionalProperties":false,"required":["name","type","source"],"properties":{"name":{"type":"string","description":"Metric name (without the {app}_ prefix the engine adds)."},"type":{"type":"string","enum":["gauge","counter"],"description":"Prometheus metric type."},"help":{"type":"string","description":"HELP text for the metric family."},"cacheTtl":{"type":"integer","minimum":0,"description":"ADR-040: optional per-metric cache TTL in seconds."},"source":{"type":"object","additionalProperties":false,"required":["kind"],"description":"Where the engine sources the value.","properties":{"kind":{"type":"string","enum":["tableCount","objectCount","objectSum","appConfig","provider"],"description":"Source kind. tableCount = COUNT over an allowlisted own-table; objectCount = OR objects by register/schema; appConfig = a numeric app-config value; provider = an IMetricsProvider implementation."},"table":{"type":"string","description":"tableCount: allowlisted [a-z0-9_] table name."},"register":{"type":"string","description":"objectCount: OR register slug."},"schema":{"type":"string","description":"objectCount / objectSum: OR schema slug."},"field":{"type":"string","description":"objectSum: the numeric object property to SUM."},"groupBy":{"type":"array","items":{"type":"string"},"description":"Columns to GROUP BY (one label per column)."},"labelMap":{"type":"object","additionalProperties":{"type":"string"},"description":"Rename a groupBy column to a different Prometheus label name."},"labelDefaults":{"type":"object","additionalProperties":{"type":["string","number","boolean"]},"description":"Default label value for NULL/empty group columns."},"filter":{"type":"object","additionalProperties":true,"description":"Per-column operator filters (eq/neq/lt/lte/gt/gte/like)."},"key":{"type":"string","description":"appConfig: the config key whose numeric value is the sample."},"id":{"type":"string","description":"provider: the IMetricsProvider id to invoke."}}}}}}}};const func1 = Object.prototype.hasOwnProperty;const formats0 = (function(){const NOT_URI_FRAGMENT = /\/|:/;const URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;return function uri(str) {
|
|
6
|
+
validateManifestV2_compiled.exports = validate20;validateManifestV2_compiled.exports.default = validate20;const schema31 = {"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://raw.githubusercontent.com/ConductionNL/nextcloud-vue/main/src/schemas/app-manifest-v2.schema.json","title":"Conduction App Manifest v2","description":"v2 schema for the JSON-driven page and navigation manifest consumed by @conduction/nextcloud-vue. Introduces a uniform widgets[] array on every page type with a per-slot grid coordinate system, a typed actions[] discriminator, and the required $schema field for version detection. v1 manifests continue to validate against app-manifest.schema.json (unchanged).","version":"2.42.0","type":"object","required":["$schema","version"],"allOf":[{"$comment":"UI manifests: a manifest that declares pages MUST also declare menu (unchanged v2 coupling).","if":{"required":["pages"]},"then":{"required":["menu"]}},{"$comment":"Observability-only profile: a manifest with no pages MUST carry an observability block. ADR-040 Tier-0 adopters (e.g. nldesign, planix) ship src/manifest.json solely as AppHost engine config — the app renders no manifest-driven UI, so forcing menu/pages on them produced permanently-failing gate-22 manifests (2026-07-06 fleet audit, item 3b).","if":{"not":{"required":["pages"]}},"then":{"required":["observability"]}}],"additionalProperties":false,"properties":{"$schema":{"type":"string","format":"uri","description":"REQUIRED in v2. Must point to the v2 schema URL: https://raw.githubusercontent.com/ConductionNL/nextcloud-vue/main/src/schemas/app-manifest-v2.schema.json. Presence of this field enables the validator to dispatch to the v2 Ajv instance rather than the v1 hand-rolled validator."},"version":{"type":"string","pattern":"^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$","description":"Semver of the manifest content. Bump when the manifest changes meaningfully. Used for cache busting and app-builder migration tracking. Distinct from the schema's own version."},"openbuildEditable":{"type":"boolean","default":true,"description":"Whether the Buildiq in-app edit button (ADR-041) is offered on this app's pages. Default true. Set false to suppress it — e.g. Buildiq's own UI, which does not edit itself with itself. Read by CnAppRoot to gate `cnOpenBuildAvailable`. The property name and the inject key keep their `openbuild` spelling: both are data/runtime contracts that shipped manifests and consumer apps already carry, so the 2026-08-21 OpenBuild → Buildiq rename deliberately left them untouched."},"dependencies":{"type":"array","default":[],"items":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":false,"required":["id"],"properties":{"id":{"type":"string","description":"Nextcloud app id."},"required":{"type":"boolean","default":true,"description":"true (default) = HARD: absence blocks the app shell behind CnDependencyMissing. false = SOFT: an optional integration whose absence surfaces a dismissible in-shell notice and never blocks."},"name":{"type":"string","description":"Human-readable display label; falls back to id."}}}]},"description":"Nextcloud app dependencies. Each entry is either a string (a HARD dependency — the app cannot run without it, absence blocks the shell) or an object { id, required?, name? } where required:false marks a SOFT (optional) dependency (required defaults to true). CnAppRoot checks each via useAppStatus(id); unresolved HARD deps block behind CnDependencyMissing, unresolved SOFT deps show a dismissible NcNoteCard banner. Sentinels (@resolve:*) are NOT allowed here — resolved at build time against known app IDs."},"setup":{"type":"object","additionalProperties":false,"required":["steps"],"description":"First-time setup wizard (ADR-042). Rendered by CnSetupWizard; required steps gate the app via CnAppRoot's setup phase. Steps run privileged server-side actions via /api/setup/action — the wizard never writes OpenRegister objects from the browser.","properties":{"enabled":{"type":"boolean","default":true,"description":"Whether the setup wizard is active for this app."},"version":{"type":"integer","default":1,"description":"Setup contract version; bump to re-trigger setup after a breaking change."},"completionConfigKey":{"type":"string","description":"App-config key storing the completed setup version."},"steps":{"type":"array","description":"Ordered setup steps rendered by CnSetupWizard.","items":{"type":"object","additionalProperties":false,"required":["id","type"],"properties":{"id":{"type":"string","description":"Unique step id; also the #step-<id> slot name."},"type":{"type":"string","enum":["info","config-fields","choice","run-action","summary","component"],"description":"Built-in step renderer."},"title":{"type":"string"},"body":{"type":"string","description":"info: explanatory copy."},"required":{"type":"boolean","default":false,"description":"When true the step gates the app until done."},"schema":{"description":"config-fields: a JSON Schema ref (string) or inline object rendered via fieldsFromSchema."},"configKey":{"type":"string","description":"choice: app-config key the selection is written to."},"configKeys":{"type":"array","items":{"type":"string"},"description":"config-fields: app-config keys the fields write."},"options":{"type":"array","description":"choice: selectable options.","items":{"type":"object","additionalProperties":false,"required":["value","label"],"properties":{"value":{},"label":{"type":"string"}}}},"optionsSource":{"type":"string","description":"choice: where to read the option list from at runtime, instead of declaring it here. Names a key in the app's own GET /api/setup/status document (dots walk into nested objects, e.g. `profiles`). Entries accept `id` for `value` and `name` for `label`, and a numeric `objectCount` becomes the stat a card shows. Use it when the SERVER owns what is on offer, so the manifest cannot drift from it."},"display":{"type":"string","enum":["select","cards"],"default":"select","description":"choice: how the options are rendered. `select` is a dropdown; `cards` is a grid of CnChoiceCards, which shows each option's description and stats. Pick cards when the choice needs explaining."},"dependsOn":{"type":"string","description":"choice: the configKey of a previous choice step this one cascades from. Disabled until the parent is set; its option list is taken from optionsByParent[parentValue] (e.g. organisation-type depends on country)."},"optionsByParent":{"type":"object","description":"choice: map of parent-choice value → options[] for a dependent (dependsOn) choice. Same option item shape as `options`.","additionalProperties":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["value","label"],"properties":{"value":{},"label":{"type":"string"}}}}},"suggestFrom":{"type":"string","description":"choice: the configKey of an earlier choice this step pre-fills a suggestion from. When that value is set and the user has not yet picked here, the option matching suggestMap[parentValue] is auto-selected (still user-overridable)."},"suggestMap":{"type":"object","description":"choice: map of suggestFrom value → suggested option value. Used to auto-suggest a default (e.g. RGS template suggested from organisation type).","additionalProperties":{"type":"string"}},"multiple":{"type":"boolean","default":false,"description":"choice: allow multi-select."},"action":{"type":"string","description":"run-action: actionId POSTed to /api/setup/action/{action}."},"onDemand":{"type":"boolean","default":false,"description":"run-action: the step runs only when the user clicks Run, never automatically, and is never outstanding work (it does not open the wizard or decide where a resumed wizard starts). The summary ticks it only when its action succeeded in the current session and shows it as not run otherwise, whatever the server reports. For destructive steps an app reports as done on purpose so they never auto-run, such as removing example data."},"healthCheck":{"type":"boolean","default":false,"description":"summary: render a health recap."},"component":{"type":"string","description":"component: app-registered component name (or use the #step-<id> slot)."}}}}}},"walkthrough":{"type":"object","additionalProperties":false,"description":"Abstract product walkthrough (ADR-043). One or more spotlighted, versioned tours rendered by CnWalkthrough over the live shell.","required":["tours"],"properties":{"enabled":{"type":"boolean","default":true,"description":"Master switch; when false no tour auto-starts."},"version":{"type":"integer","description":"Walkthrough contract version."},"completionConfigKey":{"type":"string","description":"Per-user app-config key holding the last app version whose tour the user has seen."},"tours":{"type":"array","description":"The app's tours.","items":{"type":"object","additionalProperties":false,"required":["id","steps"],"properties":{"id":{"type":"string","description":"Unique tour id (globally unique for cross-app hand-off, e.g. 'pipelinq:lead-to-bill')."},"title":{"type":"string","description":"i18n key / text for the tour name (restart menu)."},"trigger":{"type":"string","enum":["first-visit","version-bump","empty-index","manual"],"default":"manual","description":"When the tour auto-starts."},"minAppVersion":{"type":"string","description":"Semver; the tour is inert below this app version."},"steps":{"type":"array","description":"Ordered steps.","items":{"type":"object","additionalProperties":false,"required":["id","target","advanceOn"],"properties":{"id":{"type":"string","description":"Unique step id within the tour."},"title":{"type":"string","description":"i18n key / text for the coachmark title."},"body":{"type":"string","description":"i18n key / text for the coachmark body; supports {{contextVar}} interpolation."},"task":{"type":"string","description":"Optional 'go do this' instruction; presence + a non-manual advanceOn makes this an enforced action step."},"sinceVersion":{"type":"string","description":"Semver the step was introduced in; drives the 'what's new' composition."},"placement":{"type":"string","enum":["auto","top","bottom","left","right","center"],"default":"auto","description":"Coachmark placement; 'center' renders anchorless with no cutout."},"optional":{"type":"boolean","default":false,"description":"Skip gracefully when the target/condition is absent."},"allowManualNext":{"type":"boolean","default":false,"description":"Show a manual Next escape hatch on an enforced action step."},"handoff":{"type":"object","additionalProperties":false,"required":["url"],"description":"Cross-app hand-off (ADR-043). When present, the coachmark primary action becomes 'Continue in {app}' and navigates to `url` carrying a cn_resume_tour/cn_resume_step token so the destination app resumes the named tour.","properties":{"app":{"type":"string","description":"Destination Conduction app id (label + intent)."},"url":{"type":"string","description":"Destination URL to navigate to."},"tour":{"type":"string","description":"Tour id to resume in the destination (defaults to this tour's id)."},"step":{"type":"string","description":"Step id to resume at (defaults to the destination tour's first step)."}}},"target":{"type":"object","additionalProperties":false,"required":["kind"],"description":"What the step spotlights.","properties":{"kind":{"type":"string","enum":["nav-item","widget","action","page","element","selector"],"description":"Resolution strategy."},"ref":{"type":"string","description":"Stable id: route name (nav-item/page), widgetKey (widget), action id (action), or data-walkthrough-id / data-testid (element)."},"app":{"type":"string","description":"Optional other Conduction app id for a cross-app target (page kind)."},"selector":{"type":"string","description":"Raw CSS selector for kind:selector (last resort)."}}},"advanceOn":{"type":"object","additionalProperties":false,"required":["type"],"description":"Condition that advances the step.","properties":{"type":{"type":"string","enum":["manual","click-target","route-match","element-appears","object-created","delay"],"description":"Advance trigger."},"route":{"type":"string","description":"route-match: the route name to await."},"register":{"type":"string","description":"object-created: OR register slug."},"schema":{"type":"string","description":"object-created: OR schema slug."},"selector":{"type":"string","description":"element-appears: selector to await."},"ms":{"type":"integer","minimum":0,"description":"delay: milliseconds before auto-advance."},"capture":{"type":"object","additionalProperties":{"type":"string"},"description":"Map of contextVar -> ':param' (route-match) or ':id' (object-created) captured into the tour context for {{var}} interpolation."}}}}}}}}}}},"support":{"type":"object","additionalProperties":false,"description":"First-open support and donation note. CnAppRoot mounts CnSupportDialog once per user on first open and reads this block; CnEditSupportModal edits it. Omitting the block keeps the default-on behaviour with the shell's own copy, so an app only declares what it wants to override. The block was read by CnAppRoot and written by CnEditSupportModal before it was declared here, which made `additionalProperties: false` reject every manifest that set it.","properties":{"enabled":{"type":"boolean","description":"Whether the note is shown on first open. Omit for the default (true); set false to suppress it for this app."},"title":{"type":"string","description":"Dialog heading. Blank keeps the shell default."},"appName":{"type":"string","description":"Display name interpolated into the body copy. Defaults to the host app's name."},"bodyParagraphs":{"type":"array","description":"Body copy, one entry per paragraph, replacing the shell's default paragraphs.","items":{"type":"string"}},"founderName":{"type":"string","description":"Signature name."},"founderTitle":{"type":"string","description":"Signature role, shown under the name."},"founderAvatarUrl":{"type":"string","description":"Signature avatar image URL."},"founderProfileUrl":{"type":"string","description":"Profile the signature avatar links to."},"buttons":{"type":"object","additionalProperties":false,"description":"Per-button overrides, keyed by the four built-in button ids. Each may be hidden, relabelled, restyled or re-pointed; omit a key to keep its default.","properties":{"donate":{"$ref":"#/$defs/supportButton"},"support":{"$ref":"#/$defs/supportButton"},"feature-request":{"$ref":"#/$defs/supportButton"},"app-store":{"$ref":"#/$defs/supportButton"}}}}},"personalisation":{"$ref":"#/$defs/personalisation","description":"App defaults for the per-user options CnPersonalPreferences renders, and the switch that turns the personal layer off instance wide."},"nav":{"type":"object","additionalProperties":false,"description":"Navigation-level configuration consumed by CnAppNav.","properties":{"includePersonalSettings":{"type":"boolean","default":true,"description":"Auto-prepend a 'Personal settings' entry at the top of the settings foldout (opens the host's NcAppSettingsDialog via cnOpenUserSettings). Set false for apps with no per-user settings."},"settingsLabel":{"type":"string","description":"Override label for the settings foldout's gear button. Defaults to 'Settings'."},"primaryAction":{"$ref":"#/$defs/primaryAction","description":"App-wide default primary action rendered as an NcAppNavigationNew button above the main menu list. A page-scoped pages[].primaryAction for the current route wins over this default."},"featureRequestRepo":{"type":"string","description":"`<owner>/<repo>` slug on the forge that the in-product feature-request deep-link targets (provided to descendants as `cnFeatureRequestRepo`). Falls back to `Conduction/<appId>` when omitted."},"forge":{"type":"object","additionalProperties":false,"description":"Forge that the in-product feature-request deep-link targets. Switching the whole fleet's forge (onto a self-hosted Forgejo/Gitea, or back to Codeberg) is just this one field. Defaults to GitHub, the only host the fleet publishes to.","properties":{"type":{"type":"string","enum":["codeberg","forgejo","gitea","github"],"default":"github","description":"Forge type. Selects how the 'new issue' form is pre-filled: `github` uses per-field Issue-Form query params; `codeberg`/`forgejo`/`gitea` assemble a Markdown body (only title + body are supported there)."},"baseUrl":{"type":"string","description":"Override the forge host. Required for self-hosted `forgejo`/`gitea`; optional for `codeberg`/`github` (their canonical public hosts are used when omitted)."}}}}},"runtime":{"type":"object","description":"Runtime context data injected into the manifest by the backend (e.g. OpenRegister) at serve time. Carries per-user fields that visibleIf context-path predicates resolve against. The canonical sub-object is 'user', which exposes user-specific flags and role information.","additionalProperties":true,"properties":{"user":{"type":"object","description":"Per-user runtime context. Populated by the backend for authenticated requests. All fields are optional; the FE predicate evaluator treats missing fields as undefined.","additionalProperties":true},"theme":{"$ref":"#/$defs/runtimeTheme","description":"NL Design System scoped theme selection (scoped-theme-applier). Consumed by CnAppRoot's useScopedTheme wiring, not by the backend."}}},"menu":{"type":"array","items":{"$ref":"#/$defs/menuItem"},"description":"Top-level navigation entries rendered by CnAppNav."},"pages":{"type":"array","items":{"$ref":"#/$defs/page"},"description":"Page definitions dispatched by CnPageRenderer. Each page's id is also its vue-router route name. Ids MUST be unique across the array; uniqueness is enforced by validateManifestV2 as a post-schema check."},"adminSettings":{"type":"array","items":{"$ref":"#/$defs/adminSettingsEntry"},"description":"Admin-only settings sections rendered by CnAppRoot's generic admin NcAppSettingsDialog, gated on app-owner-group membership (not OC.isUserAdmin()). An absent key or an empty array yields no admin nav entry and no admin dialog. See the manifest-admin-settings and admin-settings-owner-gating capabilities."},"credentials":{"type":"array","description":"External-provider credentials this app can use via the OpenRegister credential broker (github, gitlab, …). Each entry declares which provider, why, and at what scope; the app never receives the secret — the broker performs the outbound call on the user's behalf. See the credential-broker capability.","items":{"type":"object","required":["provider"],"additionalProperties":false,"properties":{"provider":{"type":"string","description":"Catalogue provider identifier (e.g. \"github\", \"gitlab\") — a key in OpenRegister's credential-providers catalogue."},"reason":{"type":"string","description":"Human-readable reason shown to the user in credential settings (why the app wants this provider)."},"scopes":{"type":"array","items":{"type":"string"},"description":"Advisory scopes the app needs (e.g. [\"repo\"])."}}}},"schedules":{"type":"array","description":"Declarative scheduled tasks (apphost-scheduling capability). Each entry declares a recurring task the OpenRegister AppHost schedule-reconciler turns into an Integriq job that runs on the existing background-job path — so a manifest-driven app (including a pure-virtual Buildiq app with no PHP on disk) can own its ingestion/maintenance cadence without shipping a TimedJob. The temporal peer of `credentials`/`observability`: consumed by the OpenRegister engine, NOT by the Vue renderer. Optional and additive.","items":{"type":"object","required":["id","action"],"additionalProperties":false,"oneOf":[{"required":["interval"],"not":{"required":["cron"]}},{"required":["cron"],"not":{"required":["interval"]}}],"properties":{"id":{"type":"string","description":"Stable identifier for this schedule, unique within the manifest. The reconciled job is keyed on applicationId + this id, so renaming it creates a new job and orphans the old one (which is then garbage-collected)."},"interval":{"type":"integer","minimum":1,"description":"Run cadence in seconds (e.g. 604800 = weekly). Exactly one of `interval` or `cron` must be set."},"cron":{"type":"string","description":"Standard 5-field cron expression (e.g. \"0 3 * * 1\"). The reconciler computes the job's nextRun from it. Exactly one of `interval` or `cron` must be set."},"action":{"type":"string","pattern":"^[a-z0-9]+:[a-z0-9-]+$","description":"A server-allow-listed generic action type, NOT a PHP class name. Only vetted types are accepted (v1: \"openconnector:synchronization\"); the reconciler maps the type to a trusted jobClass — a manifest-supplied class name is never executed. A non-allow-listed action is rejected and logged."},"arguments":{"type":"object","description":"Free-form arguments passed to the action (e.g. the synchronization id/ref). Interpreted by the vetted action, not by the reconciler.","additionalProperties":true},"enabled":{"type":"boolean","description":"Whether this schedule is active. Defaults to true. Setting false disables the reconciled job (preserving its run history) rather than deleting it."}}}},"observability":{"$ref":"#/$defs/observability","description":"Declarative observability block (ADR-040). Consumed at request time by the OpenRegister AppHost observability engine (GenericHealthController + GenericMetricsController), NOT by the Vue renderer. Declares the app's health checks and Prometheus metric descriptors so adopting apps ship zero hand-written observability PHP while keeping their /api/health + /api/metrics URLs and the ADR-006 contract."},"store":{"type":"object","description":"ADR-080 / ADR-114 Decision 4. The declarative store plane. An app that declares this block gets a working Store surface with NO backend of its own: OpenRegister's AppHost aliases /api/store/items and /api/store/items/{slug}/install at its GenericStoreController, which reads this block at request time. Discovery stays in the engine (the SSRF guard, the redirect refusal and the registry token never leave it) and the app builds no registry URL.","additionalProperties":false,"anyOf":[{"required":["schema"],"title":"An objects store names the remote schema its registry serves."},{"required":["types"],"title":"A configuration store names the shareable types it surfaces."}],"properties":{"schema":{"type":"string","description":"Remote schema slug the registry serves (e.g. \"case-type-template\", \"application-template\")."},"register":{"type":"string","description":"Remote register segment, used when the instance's registry_register config is unset or empty."},"localRegister":{"type":"string","description":"The register an install WRITES into. Defaults to the app id. A schema slug is NOT unique across the fleet (`case`, `task` and `document` exist in several apps at once), so an unscoped write can land in another app's register: an app whose OpenRegister register slug differs from its app id must set this."},"installable":{"type":"array","items":{"type":"string"},"description":"Schema slugs an install may write. THIS IS A SECURITY BOUNDARY, not a convenience: a registry is somebody else's server, and without the allowlist an item could name any schema the app owns. An absent or empty list refuses EVERY install rather than permitting every install."},"kinds":{"type":"array","items":{"type":"string"},"description":"Kind quick-filters (ADR-080 Decision 5). Declared ONCE here, beside the allowlist: the engine returns them in the search response and CnStorePage prefers them over its page config. Defaults to the shared vocabulary when omitted."},"types":{"type":"array","items":{"type":"string"},"description":"Shareable configuration type ids this store surfaces (store-over-federated-config). Declaring these makes the store exchange CONFIGURATION rather than rows: an item is a configuration set (`openregister.configset`), a flow (`openregister.flows`), a register with its schemas (`openregister.registers`), or any schema that marked itself `x-openregister-shareable`. Cards come from federated discovery and an install runs through the owning type, so a set arrives as registers, schemas, objects, views, flows, sources and mappings. An app that declares none keeps the remote objects API described by `schema`/`register`, and makes no discovery call at all."},"cardFields":{"type":"object","additionalProperties":{"type":"string"},"description":"Card field to remote property map. Defaults to the field names the fleet's registries already publish."},"builtIn":{"type":"array","description":"The items this app ships itself, rendered when no registry is configured or the registry does not answer. ADR-080 Decision 4 makes this the price of the word Store: a surface that goes blank without a registry was never a store.","items":{"type":"object","additionalProperties":false,"required":["slug","title"],"properties":{"slug":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"kind":{"type":"string"}}}},"_note":{"type":"string","description":"Free-text rationale, ignored at runtime."}}},"deepLinks":{"type":"array","items":{"$ref":"#/$defs/deepLink"},"description":"ADR-040: object deep-link descriptors consumed by the integration registry / cross-app linking, NOT by the Vue renderer. Optional and additive."},"pageTemplates":{"type":"array","items":{"$ref":"#/$defs/pageTemplate"},"description":"Entity-scaffold page templates (manifest-entity-scaffold-templating). A template declares one reusable index/detail page shape ONCE, with `{{param}}` placeholders for the parts that vary per entity (register/schema binding, label, field/column subset) and a declared parameter list. The expander (utils/expandPageTemplates) materialises `pageInstances[]` into concrete `pages[]` at build/boot time, so CnPageRenderer only ever sees concrete pages and is unchanged by templating. Optional and additive: a manifest without pageTemplates is unaffected."},"pageInstances":{"type":"array","items":{"$ref":"#/$defs/pageInstance"},"description":"Per-entity template instantiations. Each entry references a `pageTemplates[]` template by `templateRef` and supplies only the values that vary. The expander substitutes them into the referenced template and appends the resulting concrete pages to `pages[]`. Expansion FAILS (named error) on an unknown templateRef or a missing required template parameter. Optional and additive."},"sets":{"type":"object","description":"Named, reusable field/column/sidebar sets referenced from templates via a `{{set:NAME}}` placeholder, so a repeated field/column/sidebar block is declared ONCE and shared across templates and pages instead of being re-listed. Each value is arbitrary JSON (typically an array of field/column defs or a sidebar object). Optional and additive.","additionalProperties":true},"mcp":{"type":"object","title":"MCP tool visibility hints","description":"OPTIONAL. Advisory visibility/UX hints for MCP tool surfaces (Hermiq agent tool picker, openbuild tool browser). Purely presentational: per ADR-063, OpenRegister's register (x-openregister-mcp dialect + #[McpTool] attributes) is the single source of CRUD-tool truth and OpenRegister RBAC is the authoritative invoke-time gate. This block grants no access and gates nothing; nothing in nextcloud-vue consumes it.","additionalProperties":false,"properties":{"expose":{"type":"boolean","title":"App-level exposure hint","description":"Advisory app-wide default for whether this app's register-derived MCP tools should be shown in agent / tool-picker surfaces. Advisory only — the authoritative gate is OpenRegister RBAC plus per-agent whitelists. Defaults to false (opt-in), matching ADR-063's default-OFF exposure model.","default":false},"pageTools":{"type":"object","title":"Per-page tool hints","description":"Maps a pages[].id to the ordered list of MCP tool ids that are contextually relevant on that page. Advisory grouping for UX surfaces only; it does not grant access. Keys are expected to match an existing pages[].id; the register remains authoritative for whether each listed tool actually exists.","additionalProperties":{"type":"array","title":"Relevant tool ids for a page","description":"Ordered MCP tool ids relevant to the page keyed above. Advisory ordering only.","items":{"type":"string","title":"MCP tool id","description":"A fully-qualified MCP tool id in the register's derived-CRUD shape {appId}.{schemaSlug}.{verb}, verb one of search|get|create|update|delete (ADR-063). Example only: \"pipelinq.lead.search\". The register is authoritative for existence; this is a hint.","pattern":"^[a-z0-9_-]+\\.[a-zA-Z0-9_-]+\\.(search|get|create|update|delete)$"}}},"agentHints":{"type":"object","title":"Agent-facing hints","description":"Advisory metadata for agent surfaces (Hermiq). All values are non-authoritative UX hints. Additional properties are permitted so consuming surfaces can introduce new advisory hints without a schema release (forward compatibility).","additionalProperties":true,"properties":{"summary":{"type":"string","title":"App tool summary","description":"One-line description of what this app's tools help an agent accomplish. Shown in agent / tool-picker surfaces."},"defaultTools":{"type":"array","title":"Default tool ids","description":"MCP tool ids to surface first / preselect when an agent has no page context. Advisory ordering hint only; not a grant.","items":{"type":"string","title":"MCP tool id","description":"Fully-qualified MCP tool id {appId}.{schemaSlug}.{verb}. Example only: \"pipelinq.lead.search\"."}},"keywords":{"type":"array","title":"Discovery keywords","description":"Keywords helping progressive-disclosure / tool-search surfaces (Hermiq) rank this app's tools. Advisory only.","items":{"type":"string","title":"Keyword","description":"A single discovery keyword."}}}}}}},"$defs":{"rowIndicator":{"type":"object","additionalProperties":false,"required":["field","text"],"description":"One declared state indicator on an index page's rows. Renders as an icon with a text alternative and a tooltip, never as colour alone.","properties":{"id":{"type":"string","minLength":1,"description":"Stable id for this indicator, used as its test id and its render key. Defaults to `field`."},"field":{"type":"string","minLength":1,"description":"Dotted path on the row the condition reads."},"equals":{"description":"The indicator applies when the field equals this value exactly."},"in":{"type":"array","description":"The indicator applies when the field's value is one of these."},"icon":{"type":"string","description":"CnIcon name (PascalCase). Defaults to InformationOutline."},"text":{"type":"string","minLength":1,"description":"The text alternative, read out beside the icon. Required: an indicator without one does not render."},"tooltip":{"type":"string","description":"Hover text. Defaults to `text`."}}},"folderSidebarScope":{"type":"object","additionalProperties":true,"description":"One folder in `config.folderSidebar.folders[]`, which doubles as a SCOPE: the three optional list-layout keys below let one index page show each folder the way that folder needs. Every other key (id, name, icon, ...) stays free-form, so an existing folder list validates unchanged. The page's `config.columns` still decides which columns this page HAS; a scope only decides which of them are shown, in what order, sorted by what and searched over what. A scope naming a column the page does not declare is refused by validateManifestV2, not silently rendered.","properties":{"columns":{"type":"array","description":"The columns this scope shows, in order. Same shapes as `config.columns`: a bare key string or a column object. Every key must be one the page's `config.columns` declares. Omit to show the page's own columns.","items":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]}},"defaultSort":{"description":"The sort the fetch carries while this scope is active. One `{ key, order }` entry or a list of them; `order` is 'asc' (default) or 'desc'. `field` is accepted in place of `key`, matching the CnIndexPage `defaultSort` prop.","oneOf":[{"$ref":"#/$defs/folderSidebarScopeSort"},{"type":"array","items":{"$ref":"#/$defs/folderSidebarScopeSort"}}]},"searchFields":{"type":"array","items":{"type":"string","minLength":1},"description":"The fields the search box searches over while this scope is active. Omit to search whatever the page searches by default."}}},"folderSidebarScopeSort":{"type":"object","additionalProperties":false,"description":"One sort entry for a `folderSidebar` scope. Name the column with `key` (manifest spelling) or `field` (the CnIndexPage prop spelling); an entry carrying neither is dropped rather than sent as an empty sort key.","properties":{"key":{"type":"string","minLength":1},"field":{"type":"string","minLength":1},"order":{"type":"string","enum":["asc","desc"],"default":"asc"}}},"supportButton":{"type":"object","additionalProperties":false,"description":"Override for one of the four built-in support-note buttons (donate, support, feature-request, app-store). Every field is optional; omit the whole entry to keep the shell's default for that button.","properties":{"enabled":{"type":"boolean","description":"Show this button. Set false to hide it."},"label":{"type":"string","description":"Button text. Blank keeps the default label."},"url":{"type":"string","description":"Where the button goes. The feature-request and app-store buttons have no useful default, so an app that wants them must set this."},"variant":{"type":"string","enum":["primary","secondary","tertiary","error","warning","success"],"description":"NcButton variant."},"icon":{"type":"string","description":"Material Design Icon component name, e.g. HeartOutline."}}},"runtimeTheme":{"type":"object","additionalProperties":false,"required":["source","tokenSet"],"description":"A leaf app's NL Design token-set selection, as returned by nldesign's GET /api/token-sets catalogue (app-token-set-selection). Applied by CnAppRoot via useScopedTheme — the ONLY consumer; the backend does not read this field.","properties":{"source":{"type":"string","enum":["nldesign"],"description":"Theme provider. Closed to 'nldesign' — the only scoped-theme source this schema (and useScopedTheme) currently supports."},"tokenSet":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","description":"The nldesign token-set id (a GET /api/token-sets entry's `id`), kebab-case. Resolves the token CSS at css/tokens/<tokenSet>.css."},"tokenSetName":{"type":"string","description":"Optional human-readable name (the matching catalogue entry's `name`), cached at selection time so a picker can display it without a second catalogue fetch."},"preview":{"type":"object","additionalProperties":false,"description":"Optional cached swatch preview (the matching catalogue entry's theming colors), for a picker to render a preview chip without re-fetching the catalogue.","properties":{"primaryColor":{"type":"string","description":"Cached theming.primary_color from the catalogue entry."},"backgroundColor":{"type":"string","description":"Cached theming.background_color from the catalogue entry."}}}}},"pageTemplate":{"type":"object","additionalProperties":false,"required":["id","page"],"description":"A reusable page shape declared once and instantiated per entity. `page` is an ordinary v2 page object whose string values may contain `{{param}}` placeholders (and `{{set:NAME}}` set references); `params` declares which placeholders exist and which are required. Fixed structure lives in `page`; only declared params vary per instantiation.","properties":{"id":{"type":"string","description":"Unique template identifier — the `templateRef` target. Uniqueness across pageTemplates[] is enforced by validateManifestV2 as a post-schema check."},"_note":{"type":"string","description":"Free-form maintainer note; ignored by the expander."},"params":{"type":"array","description":"Declared parameters. A placeholder `{{name}}` in `page` is substituted with the instantiation's value for `name`. A `required` param absent from an instantiation is an expansion error; an optional param absent from an instantiation causes its exact-match placeholder key to be omitted from the expanded page.","items":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","description":"Parameter name, referenced as `{{name}}` in the template `page`."},"required":{"type":"boolean","default":false,"description":"When true, an instantiation omitting this parameter is an expansion error."},"description":{"type":"string","description":"Human-readable description of the parameter."}}}},"page":{"type":"object","description":"The parameterised page shape. An ordinary v2 page whose string leaves may embed `{{param}}` placeholders and `{{set:NAME}}` set references. After substitution the result MUST be a valid concrete page (it is validated as part of the expanded pages[])."}}},"pageInstance":{"type":"object","additionalProperties":false,"required":["templateRef"],"description":"A per-entity instantiation of a pageTemplate. Supplies only the values that vary. `register`, `schema` and `label` are first-class shortcuts folded into the parameter map (equivalent to listing them under `params`); `params` may carry any additional declared parameters (e.g. a field/column subset).","properties":{"templateRef":{"type":"string","description":"Id of the `pageTemplates[]` entry to instantiate. An unknown templateRef is an expansion error."},"register":{"type":"string","description":"Shortcut for the `register` parameter."},"schema":{"type":"string","description":"Shortcut for the `schema` parameter."},"label":{"type":"string","description":"Shortcut for the `label` parameter."},"params":{"type":"object","description":"Parameter values keyed by the template's declared parameter names. Values may be any JSON type (a field/column subset is an array value). Overrides the register/schema/label shortcuts on conflict.","additionalProperties":true},"override":{"type":"object","description":"Optional structural delta applied over the substituted page via the SAME base+delta merge semantics as mergeManifestDelta (layered-versioned-app-deltas alignment). Lets an instantiation patch a single widget/field without re-listing the page, and is where a per-user/app override sits on top of the template base. No second merge model is introduced.","additionalProperties":true}}},"sentinelFilterToken":{"type":"string","pattern":"^@(?:me|now|today|monthStart|quarterStart|yearStart)$|^@today[+-][0-9]+d$","description":"Filter-value context: relative fetch-time tokens resolved by resolveFilterTokens (@me, @now, @today, @today±Nd, @monthStart, @quarterStart, @yearStart). Mirrors SENTINEL_TOKEN_PATTERNS.filter in src/utils/sentinelTokens.js (byte-equality enforced by a unit test)."},"sentinelConfigToken":{"type":"string","pattern":"^@resolve:[a-z][a-z0-9_-]*$|^@config\\.[A-Za-z][A-Za-z0-9_.]*\\??$","description":"Config context: IAppConfig-sourced values. @resolve:<key> resolved at manifest-load time; @config.<key> (trailing ? optional) at fetch time. Mirrors SENTINEL_TOKEN_PATTERNS.config."},"sentinelObjectToken":{"type":"string","pattern":"^@objectId$|^@object\\.[A-Za-z][A-Za-z0-9_]*$","description":"Object context: detail-page object tokens (@objectId, @object.<field>) resolved only when a { objectId, object } ctx is supplied. Mirrors SENTINEL_TOKEN_PATTERNS.object."},"sentinelWorkspaceToken":{"type":"string","pattern":"^@workspace\\.[A-Za-z][A-Za-z0-9_]*\\??$","description":"Workspace context: page-level workspace state (@workspace.<key>; trailing ? marks optional). Mirrors SENTINEL_TOKEN_PATTERNS.workspace."},"sentinelRouteToken":{"type":"string","pattern":"^@route\\.[A-Za-z][A-Za-z0-9_-]*$","description":"Route context: vue-router param substitution (@route.<param>) resolved by resolveRouteSentinels. Mirrors SENTINEL_TOKEN_PATTERNS.route."},"sentinelDeclarativeToken":{"type":"string","pattern":"^@self\\.[A-Za-z][A-Za-z0-9_]*$|^@ref:[A-Za-z][A-Za-z0-9_./-]*$|^@aggregate:.+$","description":"Declarative context (OpenRegister direction, resolved server-side): @self.<field> (the object's own field in a cross-object calc), @ref:<path>, @aggregate:<expr>. @ref/@aggregate are first-class members even though currently unused fleet-wide. Mirrors SENTINEL_TOKEN_PATTERNS.declarative."},"sentinelDeprecatedToken":{"type":"string","pattern":"^@currentFiscalYear$|^@page\\.[A-Za-z][A-Za-z0-9_]*$|^@runtime(?:\\.[A-Za-z][A-Za-z0-9_]*)?$","description":"Deprecated single-app inventions kept in the union so deployed manifests still validate during the migration window. The hydra token-vocabulary gate downgrades these to a WARN (see SENTINEL_DEPRECATIONS): @currentFiscalYear → @config.fiscalYear, @page.<key> → @workspace.<key>, @runtime → removal. Mirrors SENTINEL_TOKEN_PATTERNS.deprecated."},"sentinelVisibleWhenToken":{"type":"string","pattern":"^@total$","description":"manifest-form-logic: the shared visibleWhen predicate's source-mode collection-total marker, resolved client-side by evaluateVisibleWhen (utils/visibleWhen.js) — NOT one of the four IAppConfig/OpenRegister resolvers, but a pre-existing convention (already documented on $defs.visibleWhen and the banner widget) reachable through the sentinelGuardedValue-guarded pages[].config subtree for the first time via config.fields[].visibleWhen. Mirrors SENTINEL_TOKEN_PATTERNS.visibleWhen."},"sentinelTokenAny":{"$comment":"Union of every canonical context plus the deprecated-during-window overlay. Single source the shared resolver + gate import.","anyOf":[{"$ref":"#/$defs/sentinelFilterToken"},{"$ref":"#/$defs/sentinelConfigToken"},{"$ref":"#/$defs/sentinelObjectToken"},{"$ref":"#/$defs/sentinelWorkspaceToken"},{"$ref":"#/$defs/sentinelRouteToken"},{"$ref":"#/$defs/sentinelDeclarativeToken"},{"$ref":"#/$defs/sentinelVisibleWhenToken"},{"$ref":"#/$defs/sentinelDeprecatedToken"}]},"sentinelTokenLeaf":{"$comment":"A string leaf: either NOT a sentinel (does not start with @) or a member of the closed vocabulary. An @-prefixed out-of-vocabulary string FAILS here instead of passing through additionalProperties:true.","anyOf":[{"not":{"pattern":"^@"}},{"$ref":"#/$defs/sentinelTokenAny"}]},"sentinelGuardedValue":{"$comment":"Recursive guard applied (via allOf) to pages[].config and widgetEntry so every string leaf anywhere beneath is checked against the closed vocabulary. Additive + backward-compatible: only @-prefixed out-of-vocabulary strings newly fail; all other shapes are untouched.","if":{"type":"string"},"then":{"$ref":"#/$defs/sentinelTokenLeaf"},"else":{"if":{"type":"array"},"then":{"items":{"$ref":"#/$defs/sentinelGuardedValue"}},"else":{"if":{"type":"object"},"then":{"additionalProperties":{"$ref":"#/$defs/sentinelGuardedValue"}}}}},"observability":{"type":"object","additionalProperties":false,"description":"Health checks + metric descriptors executed by the AppHost engine.","properties":{"_note":{"type":"string","description":"Free-form note for maintainers; ignored by the engine."},"health":{"type":"object","additionalProperties":false,"description":"Declarative health checks rendered as the ADR-006 {status, app, version, checks} shape.","properties":{"statusCodePolicy":{"type":"string","enum":["adr006","always200"],"default":"adr006","description":"HTTP status-code policy. 'adr006' returns 503 on a failed critical check; 'always200' always returns 200."},"checks":{"type":"array","description":"Health check descriptors.","items":{"type":"object","additionalProperties":false,"required":["id","type"],"properties":{"id":{"type":"string","description":"Check id, surfaced as the key in the response's checks map."},"type":{"type":"string","enum":["database","filesystem","appEnabled","appConfig","orAvailable"],"description":"Engine check kind."},"severity":{"type":"string","enum":["critical","degraded"],"default":"critical","description":"critical → a failure flips status to error (503 under adr006); degraded → status degraded (200)."},"app":{"type":"string","description":"App id, for the appEnabled check."},"key":{"type":"string","description":"Config key, for the appConfig check."}}}},"cors":{"type":"boolean","default":false,"description":"ADR-040: when true the engine emits permissive CORS headers on the /api/health response."}}},"metrics":{"type":"array","description":"Prometheus metric descriptors. The {app}_ prefix, exposition format, and implicit {app}_info / {app}_up gauges are engine-owned.","items":{"type":"object","additionalProperties":false,"required":["name","type","source"],"properties":{"name":{"type":"string","description":"Metric name (without the {app}_ prefix the engine adds)."},"type":{"type":"string","enum":["gauge","counter"],"description":"Prometheus metric type."},"help":{"type":"string","description":"HELP text for the metric family."},"cacheTtl":{"type":"integer","minimum":0,"description":"ADR-040: optional per-metric cache TTL in seconds."},"source":{"type":"object","additionalProperties":false,"required":["kind"],"description":"Where the engine sources the value.","properties":{"kind":{"type":"string","enum":["tableCount","objectCount","objectSum","appConfig","provider"],"description":"Source kind. tableCount = COUNT over an allowlisted own-table; objectCount = OR objects by register/schema; appConfig = a numeric app-config value; provider = an IMetricsProvider implementation."},"table":{"type":"string","description":"tableCount: allowlisted [a-z0-9_] table name."},"register":{"type":"string","description":"objectCount: OR register slug."},"schema":{"type":"string","description":"objectCount / objectSum: OR schema slug."},"field":{"type":"string","description":"objectSum: the numeric object property to SUM."},"groupBy":{"type":"array","items":{"type":"string"},"description":"Columns to GROUP BY (one label per column)."},"labelMap":{"type":"object","additionalProperties":{"type":"string"},"description":"Rename a groupBy column to a different Prometheus label name."},"labelDefaults":{"type":"object","additionalProperties":{"type":["string","number","boolean"]},"description":"Default label value for NULL/empty group columns."},"filter":{"type":"object","additionalProperties":true,"description":"Per-column operator filters (eq/neq/lt/lte/gt/gte/like)."},"key":{"type":"string","description":"appConfig: the config key whose numeric value is the sample."},"id":{"type":"string","description":"provider: the IMetricsProvider id to invoke."}}}}}}}},"splitView":{"type":"object","additionalProperties":false,"description":"The list and one open record, side by side. Declared on an index page; buildManifestRoutes() then emits a second route <route>/split/:id under the name <pageId>__split, carrying meta.cnSplitOf so CnPageRenderer still resolves it to this page and the list never unmounts.","properties":{"enabled":{"type":"boolean","default":false,"description":"Whether opening a row opens it beside the list. False renders exactly as today: a full page list and a full page detail."},"breakpoint":{"type":"integer","minimum":320,"maximum":2560,"default":1024,"description":"Viewport width in pixels below which the split address renders the full detail page instead of the pane, so a link sent from a laptop opens on a phone."},"paneWidth":{"type":"string","description":"CSS width of the detail pane, e.g. '38%' or '520px'. Defaults to '42%'."}}},"savedViewTree":{"type":"object","additionalProperties":false,"description":"Saved views render as a tree rather than a flat list, carry labels, and may ship with the app. Two hundred personal views in one dropdown is the problem this solves. Index pages only, and only meaningful alongside allowSavedViews: without the dropdown there is no view to put in a tree. Absent, the page renders the flat dropdown it renders today. The view entity itself, its parent, its labels and its slug are OpenRegister's (saved-search-views); this key declares how this page presents them.","properties":{"enabled":{"type":"boolean","default":false,"description":"Whether this page renders its saved views as a tree. False reads as a page that considered it and declined, and renders exactly as a page that never named the key."},"maxDepth":{"type":"integer","minimum":1,"maximum":5,"default":3,"description":"How deep a parent chain may go. A bound rather than a taste: inheritance resolves by walking the chain, so an unbounded depth turns one render into an unbounded walk, and a person who can nest for ever will. Past the bound a save is refused naming the view, which is louder than a tree nobody can read."},"templates":{"type":"array","description":"What a new view may start from. A template presets the columns, the sort and the export field set, and the person may change each. Declare none and Save current view means what it has always meant: the list as it stands.","items":{"type":"object","additionalProperties":false,"required":["slug","name"],"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"name":{"type":"string"},"columns":{"type":"array","items":{"type":"string"}},"defaultSort":{"type":"string"},"exportFields":{"type":"array","items":{"type":"string"}}}}},"landingView":{"type":"object","additionalProperties":false,"description":"Which view a role opens this page on, as { role: slug }. A personal choice always wins and Reset returns here, so this is where somebody starts rather than where they are kept. A role's landing view changing mid-session applies on the next arrival: moving a reader's list out from under them is worse than a stale default.","patternProperties":{"^[A-Za-z0-9_.-]+$":{"type":"string"}}},"columnsPerRole":{"type":"object","additionalProperties":false,"description":"Which columns a role sees, as { role: [column] }. NARROWS index-columns-per-scope rather than replacing it: a role naming a column the scope does not offer gets nothing extra, because a per-role list that could add one would be a second, quieter way to put a field on screen the scope deliberately left off.","patternProperties":{"^[A-Za-z0-9_.-]+$":{"type":"array","items":{"type":"string"}}}},"groupBy":{"type":"string","description":"A field the list groups on, with a count per group. The counts are of the rows the list HOLDS, so on a paged list they are of the page and the surface says so; a second fetch per group is the cost this grouping exists to avoid."},"seeded":{"type":"array","description":"Views that ship with the app. They render as their own group above the user's own, and a user may copy one but not delete it: a view the product promises is not a view one person can remove from everybody's install.","items":{"type":"object","additionalProperties":false,"required":["slug","name"],"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$","description":"The stable name a dashboard widget, an export action or an API caller cites this view by. Lowercase and dash only, because it appears in an address and in a manifest somebody else writes. Required: a seeded view with no slug is a view nothing can call, which is most of the reason to seed it."},"name":{"type":"string","description":"What the view is called in the control. Translatable."},"label":{"type":"string","description":"One label this view carries, for the label filter. A view may carry none and stays reachable when no label filter is active."},"parent":{"type":"string","description":"The slug of the view this one hangs under. Omitted, it sits at the root of the seeded group."},"actions":{"type":"array","description":"The action ids this view offers, so a triage view offers three and not thirty. INTERSECTED with what the reader may run and never added to: a view declaring an action the reader has no right to does not grant it. Declare none and the view offers the page's actions, as today.","items":{"type":"string"},"uniqueItems":true},"inherits":{"type":"array","description":"Which parts this view takes from its parent. Each part resolves independently, so a child may narrow the criteria and keep the parent's columns. Declared on a view with no parent it is a contradiction and the validator refuses it: there is nothing to inherit from.","items":{"type":"string","enum":["criteria","columns","sorting","defaultSort","exportFields"]},"uniqueItems":true}},"allOf":[{"description":"inherits without a parent is a declaration that reads as configured and resolves to nothing. Refused here rather than silently ignored at render, which is the shape this whole change exists to stop.","if":{"required":["inherits"]},"then":{"required":["parent"]}}]}}}},"boardView":{"type":"object","additionalProperties":false,"required":["statusField"],"description":"The board view of this list: one column per stage of a status field. Index pages only, and only offered when `viewModes` also lists `board`. The COLUMNS COME FROM THE SCHEMA, not from the values present in the loaded rows: a board built from the data would lose the stage nothing is in, which is the one you drag a card into, and would reorder itself as work moved. A move goes through the host's transition and never writes the status field, so a board can never move a case past a rule the case page enforces.","properties":{"statusField":{"type":"string","description":"The property the columns come from. Required: a board with no status field has nothing to be a board of. Its enum or lifecycle states are read from the register schema at RUNTIME, so a field with neither cannot be caught here; the view says so on screen instead of drawing empty columns."},"cardFields":{"type":"array","items":{"type":"string"},"description":"The fields a card shows. Keep it short: a card is scanned, not read."},"swimlaneField":{"type":"string","description":"A second field to group the board into rows by, while the columns stay the stages. Cards with no value for it land in one named row, last, rather than being dropped: grouping by handler and hiding the unassigned work turns a board into a picture of what is already somebody's problem."}}},"dateAxisView":{"type":"object","additionalProperties":false,"required":["startField","endField"],"description":"The date-axis view of this list: rows on a time scale, overlaps visible. Index pages only, and only offered when `viewModes` also lists `dateAxis`. IT HIDES NOTHING AND RESCHEDULES NOTHING: overlapping bars get their own track so the lane grows taller rather than losing a bar, rows with no usable dates go to a visible unplanned lane, and the only gesture is opening a row. A view that moved a bar on drag would be changing statutory dates from a picture.","properties":{"startField":{"type":"string","description":"Where a row's start is. Required: a bar needs both ends, and a row missing one is unplanned rather than drawn."},"endField":{"type":"string","description":"Where a row's end is. Required, for the same reason."},"laneField":{"type":"string","description":"What to put in a lane together, usually the person the work is on. Omitted, everything shares one lane."},"labelField":{"type":"string","description":"The field a bar is named by, on screen and in its accessible name. A bar positioned by percentage says nothing at all to a reader who cannot see it."}}},"personalisation":{"type":"object","additionalProperties":false,"description":"The app's own defaults for the per-user options CnPersonalPreferences renders. The values a person chooses are stored in their Nextcloud preferences, never here; this block is only the bottom layer of the app default, administered value, personal value order.","properties":{"enabled":{"type":"boolean","default":true,"description":"Whether the personal layer applies at all. An administrator setting this false collapses it: the options render as unavailable with the reason, rather than being silently ignored."},"disabledReason":{"type":"string","description":"What to tell a person when the personal layer is off. Shown beside the unavailable options."},"landingPage":{"type":"string","description":"Page id the app opens on when a person has chosen nothing."},"dateDisplay":{"type":"string","enum":["absolute","relative"],"default":"absolute","description":"How dates read by default. A relative date always carries its absolute date in the accessible name and the tooltip, because a term read as '3 dagen geleden' hides the date the term runs to."},"rememberLastView":{"type":"boolean","default":false,"description":"Whether each list reopens in the view mode that person last used on it."},"pinnedMenu":{"type":"array","items":{"type":"string"},"description":"Menu ids pinned to the top of the navigation by default. A person may reorder and repin their own."}}},"primaryAction":{"type":"object","required":["label"],"additionalProperties":false,"description":"A primary action declared on either a pages[] entry (active-page scoped) or nav.primaryAction (app-wide default). Rendered above the menu list as an NcAppNavigationNew button.","properties":{"id":{"type":"string","description":"Stable identifier for this action."},"label":{"type":"string","description":"i18n translation key / text for the button."},"icon":{"type":"string","description":"MDI icon name (e.g. 'Plus'). Defaults to 'Plus' when omitted."},"route":{"type":"string","description":"Named vue-router route to navigate to on click."},"href":{"type":"string","description":"External URL opened in a new tab on click."},"payload":{"description":"Free-form payload echoed back to the host inside the @primary-action-click event."}}},"menuItem":{"type":"object","required":["id","label"],"additionalProperties":false,"description":"A top-level navigation entry. May contain one level of nested children.","properties":{"id":{"type":"string","description":"Unique identifier for this menu entry. Sentinels (@resolve:*) are NOT allowed — this is a router invariant."},"label":{"type":"string","description":"i18n translation key resolved by the consuming app's t() function at render time."},"icon":{"type":"string","description":"CSS class for the icon (e.g. 'icon-checkmark') or MDI component name."},"route":{"type":"string","description":"Vue-router route name (matches a pages[].id) that this entry navigates to. Sentinels (@resolve:*) are NOT allowed — this is a router invariant."},"query":{"type":"object","additionalProperties":{"type":["string","number","boolean"]},"description":"Optional vue-router query parameters merged into the target route link (e.g. a filter like { caseType: '<uuid>' }). Deep-links a nav entry to a pre-filtered index page."},"order":{"type":"integer","description":"Display order in the menu. Items without an order render last."},"permission":{"type":"string","description":"Permission string the user must hold for this entry to render."},"section":{"type":"string","enum":["main","footer","settings","integrations"],"default":"main","description":"Where the entry renders inside CnAppNav. 'main' (default) places it in the top list. 'footer' pins the entry to the bottom as a flat item above the settings foldout. 'settings' places it inside the NcAppNavigationSettings gear-icon foldout. 'integrations' renders the entry NOT in the navigation at all but in the Integrations section at the bottom of the per-user settings modal — the destination for links that leave this app for another (ADR-110). An 'integrations' entry MUST be clickable (href); a group with children is meaningless there."},"type":{"type":"string","enum":["item","caption"],"default":"item","description":"Render kind. 'item' (default) renders a clickable NcAppNavigationItem. 'caption' renders an NcAppNavigationCaption section divider — only label, id, order, and section are honoured."},"count":{"oneOf":[{"type":"integer","minimum":0},{"type":"string","enum":["auto"]}],"description":"Counter badge in the entry's #counter slot. Positive integer renders as-is; 'auto' resolves from cnMenuCounts (populated by CnAppRoot from useObjectStore totals) for the entry's resolved index-type page (register + schema)."},"pinned":{"type":"boolean","default":false,"description":"Forwarded to NcAppNavigationItem's pinned prop. NC bottom-pins pinned items inside the parent list region."},"open":{"type":"boolean","default":false,"description":"Initial expansion state for a parent entry with children. When true and children[] is non-empty, the parent renders with :open=\"true\" so children are visible on mount."},"href":{"type":"string","description":"External URL. When set, the entry opens the URL in a new tab instead of dispatching a vue-router navigation."},"action":{"type":"string","enum":["user-settings","admin-settings","replay-walkthrough"],"description":"Built-in action to invoke when the entry is clicked. Closed enum. 'admin-settings' opens the app-level admin-settings dialog (distinct from the per-user settings dialog). 'replay-walkthrough' re-runs the product walkthrough (ADR-043), optionally for a specific tourId."},"tourId":{"type":"string","description":"Tour id for the 'replay-walkthrough' action (ADR-043); replays that tour from its first step. Omit to replay the default tour."},"visibleIf":{"$ref":"#/$defs/visibleIfCondition","description":"Optional display condition evaluated at render time."},"dynamicSource":{"$ref":"#/$defs/dynamicSource","description":"Optional dynamic source for populating nested menu items from a data endpoint. Carry-forward from v1.3.0."},"children":{"type":"array","items":{"$ref":"#/$defs/menuItemLeaf"},"description":"Nested entries. Only one level of nesting is supported."}}},"menuItemLeaf":{"type":"object","required":["id","label"],"additionalProperties":false,"description":"A nested menu entry. Has no further children.","properties":{"id":{"type":"string"},"label":{"type":"string"},"icon":{"type":"string"},"route":{"type":"string"},"query":{"type":"object","additionalProperties":{"type":["string","number","boolean"]},"description":"Optional vue-router query parameters merged into the target route link (e.g. a filter like { caseType: '<uuid>' }). Deep-links a nav entry to a pre-filtered index page."},"order":{"type":"integer"},"permission":{"type":"string"},"section":{"type":"string","enum":["main","footer","settings","integrations"],"default":"main"},"type":{"type":"string","enum":["item","caption"],"default":"item"},"count":{"oneOf":[{"type":"integer","minimum":0},{"type":"string","enum":["auto"]}]},"pinned":{"type":"boolean","default":false},"href":{"type":"string"},"action":{"type":"string","enum":["user-settings","admin-settings","replay-walkthrough"]},"tourId":{"type":"string","description":"Tour id for the 'replay-walkthrough' action (ADR-043)."},"visibleIf":{"$ref":"#/$defs/visibleIfCondition"}}},"dynamicSource":{"type":"object","description":"Dynamic source configuration for populating menu items from a backend endpoint. Carry-forward from v1.3.0 — identical shape to v1.","additionalProperties":true,"properties":{"url":{"type":"string","description":"URL to fetch menu items from."},"method":{"type":"string","enum":["GET","POST"],"default":"GET","description":"HTTP method for the fetch."},"labelField":{"type":"string","description":"Property name in the response items to use as the menu entry label."},"idField":{"type":"string","description":"Property name in the response items to use as the menu entry id."},"routeField":{"type":"string","description":"Property name in the response items to use as the menu entry route."}}},"navCardEntry":{"type":"object","required":["id","label"],"additionalProperties":false,"description":"One card in a nav-card-grid built-in widget (ADR-044 §4 cards-collapse) — an arbitrary navigation link, not an OpenRegister object. Mirrors the menuItem/primaryAction vocabulary: id + label required, route/href are alternative navigation targets and mutually exclusive, count supports the same integer-or-\"auto\" shape as menuItem.count.","properties":{"id":{"type":"string","description":"Unique identifier for this card within its widget's entries[] array."},"label":{"type":"string","description":"i18n translation key / text rendered as the card's title."},"description":{"type":"string","description":"Optional explanatory text rendered below the label, associated to the card via aria-describedby (never aria-label)."},"icon":{"type":"string","description":"MDI icon name (e.g. 'ChartLine'), resolved the same way as menuItem.icon."},"route":{"type":"string","description":"Vue-router route name (matches a pages[].id) this card navigates to. Mutually exclusive with href."},"href":{"type":"string","description":"External URL opened per the rendering component's target handling. Mutually exclusive with route."},"count":{"oneOf":[{"type":"integer","minimum":0},{"type":"string","enum":["auto"]}],"description":"Count badge on the card. Positive integer renders as-is; 'auto' resolves from cnMenuCounts (populated by CnAppRoot) for the card's resolved route page (register + schema), the same mechanism menuItem.count:\"auto\" uses."},"order":{"type":"integer","description":"Display order among sibling cards. Cards without an order render last."},"permission":{"type":"string","description":"Permission string the user must hold for this card to render."},"visibleIf":{"$ref":"#/$defs/visibleIfCondition","description":"Optional display condition evaluated at render time."}},"allOf":[{"description":"route and href are mutually exclusive navigation targets — a card links either in-app or externally, never both.","not":{"required":["route","href"]}}]},"widgetEntry":{"type":"object","required":["widgetKey","slot","gridX","gridY","gridWidth","gridHeight"],"additionalProperties":false,"description":"A uniform widget placement entry used on every page type in v2. Replaces the v1 widgetDef + layoutItem pair with a single shape. Its props/dataSource/filter string leaves are guarded against the closed sentinel vocabulary via the sentinelGuardedValue allOf. The cross-field constraint gridX + gridWidth <= 12 CANNOT be expressed in JSON Schema (arithmetic over sibling fields) — it is documented here and enforced at runtime by validateManifestV2() as a post-schema check. Failure message: \"Widget '{widgetKey}' in slot '{slot}': gridX ({gridX}) + gridWidth ({gridWidth}) exceeds 12\".","properties":{"roles":{"type":"array","items":{"type":"string","minLength":1},"description":"Group ids that may see this widget. A DECLARATION THE HOST APP ENFORCES, not something this library evaluates: the check belongs on the read, where the figures are, because a widget hidden in the browser still had its data in the page payload (ADR-004). Pair it with `visibleWhen` pointing at an endpoint of the app's own, which IS evaluated here and collapses the cell when the fetch or the shape fails, so the declaration and the layout cannot disagree. Omitting it means every reader of the page sees the widget. Added because the key was expressible in the legacy `config.widgets[]` array, whose items are open, and refused here, so the same declaration validated on one page and was rejected on another.","examples":[["controllers","beheerders","admin"]]},"visibleWhen":{"$ref":"#/$defs/visibleWhen","description":"Render this widget only while the predicate holds. The same shape every other surface takes it in. It was already honoured at runtime for widgets (CnDashboardPage reads `def.visibleWhen`) and could not be declared in this shape, so a widget in the uniform entry had no way to express a visibility condition at all while one in the legacy array did."},"requiredApp":{"type":"string","minLength":1,"description":"Nextcloud app id this widget leans on — its data lives in that app's register, or its component comes from that app's integration leaf. When the app is absent the widget renders its normal chrome and a set-up state and issues NO request. Declared rather than inferred from content.register, because a register slug is not always the app id and a widget can depend on an app without querying it."},"id":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","description":"Optional stable, kebab-case identity for this widget entry. Used as the merge key under the `delta` merge mode (mergeManifestDelta keys widgets[] by id) so a stored delta can patch a single widget without resending the array. Omitting it keeps the entry valid; a delta simply cannot target it by key. Must be unique within a page's widgets[]."},"widgetKey":{"type":"string","description":"Registry key identifying the widget component. Resolved against the customComponents map passed to CnAppRoot at boot."},"slot":{"$ref":"#/$defs/slotValue","description":"Placement slot. Valid values: body, sidebar, header-actions, footer, modal (literals) or tab:<id> / section:<id> (pattern). Per-slot grid constraints are enforced via allOf/if-then below."},"gridX":{"type":"integer","minimum":0,"description":"0-based column start position. gridX + gridWidth MUST be <= 12 (enforced by post-schema check, not JSON Schema)."},"gridY":{"type":"integer","minimum":0,"description":"0-based row start position. For header-actions slot, MUST be 0 (enforced by allOf/if-then)."},"gridWidth":{"type":"integer","minimum":1,"maximum":24,"description":"Column span. For the default 12-column slots, 1-12. A page MAY widen a slot via config.slotColumns (up to the schema cap of 24); the real per-slot bound gridX + gridWidth <= resolvedColumns is enforced by the post-schema check, not JSON Schema. For sidebar slot, MUST be exactly 1 (enforced by allOf/if-then)."},"gridHeight":{"type":"integer","minimum":1,"description":"Row span (>= 1)."},"sizeToContent":{"type":["boolean","integer"],"minimum":1,"description":"Opt-in: hand this placement's height to whatever it renders, so a widget that decides AT RUNTIME it has nothing to show costs no row. `true` sizes purely to content; an integer is a row minimum. It makes gridHeight advisory for this widget — right for anything whose height is whatever it turned out to be (a banner whose condition is false, a list that came back empty), wrong for anything with a deliberate size. Maps to CnDashboardGrid's per-item `sizeToContent`."},"props":{"type":"object","description":"Optional widget-specific props passed at render time. Shape is widget-specific; not constrained here.","additionalProperties":true},"tabGroup":{"type":"string","description":"Optional: groups this widget into a named tab within the slot. Only meaningful for tab:* and section:* slots."},"dataSource":{"$ref":"#/$defs/dataSource","description":"Optional declarative data binding. Carry-forward from v1 widgetDef.dataSource — same shape."},"dateChip":{"type":"boolean","default":false,"description":"Opt-in (custom widgets only): when true AND the page's `dateRange.enabled` is true, the shared date-range chip renders in this widget's title bar (chart widgets with a `dataSource.bucket` get it automatically). Carry-forward from v1 layoutItem.dateChip — same semantics."},"_note":{"type":"string","description":"Human-readable note. Optional on most widgets. REQUIRED when the containing page has type 'custom' — in that case this field must document why a standard page type was not feasible."},"ncDashboard":{"type":"object","additionalProperties":false,"description":"Opt-in: also publish this placement as a widget on the native Nextcloud dashboard, alongside the app's own pages. An object rather than a boolean because a Nextcloud panel is a single narrow column with its own title, icon and link, none of which the grid placement carries. Presence of this key REQUIRES an `id` on the same entry (enforced in allOf below), and that id MUST be unique across the WHOLE manifest, not merely within its own page's widgets[] — Nextcloud's widget namespace is per app, so two pages both declaring id 'recent' derive one shared panel. Manifest-wide uniqueness is beyond JSON Schema; validateManifestV2 enforces it post-schema. Omitting the key leaves the widget visible only inside the app.","properties":{"title":{"type":"string","description":"Panel title on the Nextcloud dashboard. Falls back to the widget's own title when omitted."},"icon":{"type":"string","description":"MDI icon name (PascalCase), e.g. ViewDashboardOutline."},"order":{"type":"integer","description":"Initial ordering hint, passed through as IWidget::getOrder(). It decides where the panel first appears; once a user rearranges their own dashboard their arrangement wins, so this is a hint and never a guarantee."},"link":{"type":"string","pattern":"^(?![a-zA-Z][a-zA-Z0-9+.-]*:)(?!//)\\S+$","description":"In-app route the panel header links to, so a reader can open the page where the widget's full context lives. Written the way `pages[].route` is, e.g. '/reporting' — the host resolves it against its own app root with generateUrl() and never renders it bare. A scheme ('https:', and 'javascript:' above all) and a protocol-relative '//host' are both refused: the panel is rendered by Nextcloud's dashboard, outside this app's own pages, so a manifest is not a place to hand it an offsite destination."}}}},"allOf":[{"$ref":"#/$defs/sentinelGuardedValue"},{"description":"ncDashboard requires a stable id. The host derives a permanent Nextcloud widget id from `id`, and Nextcloud stores each user's chosen widgets by that id in its own namespace, which no migration of this app can reach. A widget identified by array position would move onto a different widget whenever the array is reordered, silently changing what a user sees. `id`'s own pattern already refuses an empty string, so requiring the key is the whole of the rule expressible here; the manifest-wide uniqueness half lives in validateManifestV2.","if":{"required":["ncDashboard"]},"then":{"required":["id"]}},{"description":"sidebar slot: gridWidth MUST equal 1. The sidebar is a fixed-width panel; widgets always span the full width.","if":{"properties":{"slot":{"const":"sidebar"}},"required":["slot"]},"then":{"properties":{"gridWidth":{"const":1}}}},{"description":"header-actions slot: gridY MUST equal 0. All header action widgets live in a single row.","if":{"properties":{"slot":{"const":"header-actions"}},"required":["slot"]},"then":{"properties":{"gridY":{"const":0}}}},{"description":"object-table built-in widget: when props declares a `source` it must match the declarative self-fetch shape, an `endpointSource` (Wave 2) must match the shared endpoint binding (exactly one of source | endpointSource — post-schema check), and `actions` must be typed manifest actions (incl. type:'object-op'). Other props stay free-form (pass-through to CnDataTable).","if":{"properties":{"widgetKey":{"const":"object-table"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"source":{"$ref":"#/$defs/objectTableSource"},"endpointSource":{"$ref":"#/$defs/endpointSource","description":"Wave 2 (#91): endpoint-bound rows — the payload at responsePath must be an array; columns / formatters / rowRoute / actions apply unchanged on top. Exactly one of source | endpointSource (post-schema check)."},"actions":{"type":"array","items":{"$ref":"#/$defs/action"},"description":"Declarative row/widget actions rendered by CnWidgetObjectTable. object-op patch/delete render per row; object-op create renders as a widget-scoped footer affordance."},"rowClass":{"type":"array","description":"#91: declarative per-row CSS class rules compiled into CnDataTable's rowClass function. Each rule { when: { field, op?, value }, class } adds `class` to a row when the shared visibleWhen predicate holds against that row (field = dot-path into the row, op = eq|neq|gt|gte|lt|lte default eq, value = literal). Rules evaluate in order and every matching class is space-joined — so overdue / at-risk rows can be highlighted from the manifest. A host-supplied rowClass FUNCTION (runtime-only) still passes straight through.","items":{"type":"object","additionalProperties":false,"required":["when","class"],"properties":{"when":{"type":"object","additionalProperties":false,"required":["field","value"],"description":"The predicate evaluated against the row (shared visibleWhen grammar, LOCAL form).","properties":{"field":{"type":"string","description":"Dot-path into the row."},"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte"],"default":"eq","description":"Comparison operator (default eq)."},"value":{"description":"Literal right-hand side of the comparison."}}},"class":{"type":"string","description":"CSS class added to the row when `when` holds."}}}}}}}}},{"description":"nav-card-grid built-in widget (ADR-044 §4 cards-collapse): props.entries is REQUIRED and each entry must match the navCardEntry shape. Unlike stats-block's optional entries[], nav-card-grid has no dataSource alternative — it renders arbitrary navigation links, not fetched data.","if":{"properties":{"widgetKey":{"const":"nav-card-grid"}},"required":["widgetKey"]},"then":{"required":["props"],"properties":{"props":{"type":"object","required":["entries"],"properties":{"entries":{"type":"array","items":{"$ref":"#/$defs/navCardEntry"},"description":"One card per array entry, rendered by CnNavCardGrid."}}}}}},{"description":"stats-block built-in widget: when props declares `entries[]` each entry must match the statsBlockEntry shape. The exactly-one-of dataSource | props.entries constraint is a cross-field rule enforced by validateManifestV2() as a post-schema check (clear error message), not by JSON Schema.","if":{"properties":{"widgetKey":{"const":"stats-block"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"entries":{"type":"array","items":{"$ref":"#/$defs/statsBlockEntry"},"description":"Multi-entry KPI sources — each entry renders one CnStatsBlock within the widget card. Mutually exclusive with a single dataSource."}}}}}},{"description":"banner built-in widget (CnBannerWidget, Wave 1): a declarative notice banner. props { variant, text, visibleWhen?, route? } — visibleWhen is a simple {endpoint|source, field?, op?, value} predicate evaluated at mount (fail-safe: hidden on fetch failure).","if":{"properties":{"widgetKey":{"const":"banner"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"variant":{"type":"string","enum":["info","warning","error","success"],"description":"Banner severity variant (NcNoteCard type). Default info."},"text":{"type":"string","description":"Pre-translated banner text (required for the banner to render)."},"visibleWhen":{"type":"object","additionalProperties":false,"description":"Optional visibility condition: exactly one of `endpoint` (same-origin JSON URL) or `source` (OpenRegister object query). `field` is a dot-path into the response (source: into the first result; omit or use '@total' for the collection total). Fail-safe: the banner stays hidden until the predicate evaluates true.","properties":{"endpoint":{"type":"string","description":"Same-origin URL returning JSON."},"source":{"type":"object","additionalProperties":false,"required":["register","schema"],"description":"OpenRegister object query; `filter` supports the shared @-token grammar.","properties":{"register":{"type":"string"},"schema":{"type":"string"},"filter":{"type":"object","additionalProperties":true}}},"field":{"type":"string","description":"Dot-path into the response ('@total' or omitted = collection total for a source)."},"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte"],"default":"eq","description":"Comparison operator."},"value":{"description":"Literal right-hand side of the comparison."}}},"route":{"description":"Optional click-through: a vue-router route NAME (string) or a full location object. Makes the banner text an accessible button.","oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]}}}}}},{"description":"audit-trail built-in widget (CnAuditTrailWidget, Wave 1): the object change-log card. All props are optional — register/schema/objectId normally arrive via the detail-page object-context merge; explicit props win.","if":{"properties":{"widgetKey":{"const":"audit-trail"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"register":{"type":"string","description":"OpenRegister register slug/id (context merge fallback when omitted)."},"schema":{"type":"string","description":"OpenRegister schema slug (context merge fallback when omitted)."},"objectId":{"type":"string","description":"The audited object's id (context merge fallback when omitted)."},"title":{"type":"string","description":"Optional card title override."},"maxDisplay":{"type":"integer","minimum":1,"description":"Maximum audit rows to render (default 5)."}}}}}},{"description":"chart widget display passthrough (Wave 1): additive presentation keys forwarded verbatim to CnChartWidget by CnDashboardPage's dispatcher and the v2 grid. Other chart props stay free-form.","if":{"properties":{"widgetKey":{"const":"chart"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"horizontal":{"type":"boolean","description":"Render type:'bar' charts horizontally (row bars)."},"legendPosition":{"type":"string","enum":["top","bottom","left","right"],"description":"Legend placement override (empty/omitted keeps the automatic placement)."},"valueAxisBaseline":{"type":"string","enum":["auto","zero","fit"],"description":"Value-axis baseline: 'auto' (the default — zero for bar/area, a bounded window for line/scatter), 'zero' (force a zero baseline), or 'fit' (let ApexCharts frame the data range, for a series living far from zero such as an SLA hovering 95–99%)."},"valueFormat":{"description":"Named value formatter applied to the value axis + tooltip: 'currency' | 'currency-compact' | 'percent', or the object form { name, currency?, decimals? }.","oneOf":[{"type":"string","enum":["currency","currency-compact","percent"]},{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","enum":["currency","currency-compact","percent"]},"currency":{"type":"string","description":"ISO-4217 code (EUR default; invalid codes fall back to EUR)."},"decimals":{"type":"integer","minimum":0,"description":"Fraction digits override."}}}]},"colorMap":{"type":"object","additionalProperties":{"type":"string"},"description":"Per-category colour map ({ categoryLabel: cssColor }) for pie/donut/radialBar slices and (distributed) bar categories."},"emptyLabel":{"type":"string","description":"Empty-state message rendered instead of the chart when the resolved series contain no data points."},"endpointSource":{"$ref":"#/$defs/chartEndpointSource","description":"Wave 2 (#91): endpoint-bound series/labels — the shared endpoint transport plus the labelsPath / series[] {name, path} response mapping. Exactly one of dataSource | endpointSource (post-schema check)."}}}}}},{"description":"header / text / divider on the v2 grid (Wave 1): the dashboard catalog's content-only presentation widgets reused as built-ins. Each takes a single `props.content` object with the same shape as its dashboard `content` blob.","if":{"properties":{"widgetKey":{"enum":["header","text","divider"]}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"content":{"type":"object","additionalProperties":true,"description":"The widget's content blob — header: { title, subtitle, backgroundImageUrl, overlayMode, height, cta, … }; text: { text, contentMode, fontSize, … }; divider: { style, lineColor, headingText, … }."}}}}}},{"description":"stat / delta catalog widgets on the v2 grid (Wave 2, #91): the KPI tiles take a `props.content` blob (same shape as their dashboard `content`). The endpoint-binding keys are typed here; the rest of the blob stays free-form (label, icon, format, source, …). Exactly one of content.source | content.endpointSource — a cross-field rule enforced by validateManifestV2() as a post-schema check (stats-block precedent), which also covers the legacy pages[].config.widgets[] placement.","if":{"properties":{"widgetKey":{"enum":["stat","delta"]}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"content":{"type":"object","additionalProperties":true,"properties":{"endpointSource":{"$ref":"#/$defs/endpointSource","description":"Wave 2 (#91): endpoint-bound KPI value(s) — exactly one of source | endpointSource (post-schema check)."},"valueField":{"type":"string","description":"Dot-path into the endpoint payload for the displayed (current) value. Omitted = the payload itself."},"previousField":{"type":"string","description":"Dot-path into the endpoint payload for the previous-period value — renders the trend sublabel (arrow + percent-vs-previous; the pipelinq previousPeriod contract)."},"deltaField":{"type":"string","description":"Dot-path into the endpoint payload for a SERVER-computed delta percent — wins over the client-side previousField computation."},"goodDirection":{"type":"string","enum":["up","down"],"default":"up","description":"Which trend direction tints green ('up' default; 'down' for cost-like KPIs). The delta widget's source.goodDirection still wins for the OpenRegister form."},"variantWhen":{"type":"array","description":"First-match threshold styling rules for the stat tile — the matched rule's variant re-tints the value + icon circle, and its optional icon overrides content.icon.","items":{"type":"object","required":["op","value","variant"],"additionalProperties":false,"properties":{"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte"],"description":"Comparison operator against the resolved display value (numeric when both sides coerce; eq/neq fall back to string equality)."},"value":{"description":"Literal right-hand side of the comparison."},"variant":{"type":"string","enum":["default","primary","success","warning","error"],"description":"Colour variant applied on match ('default' keeps the configured colours). The component also accepts 'danger' as an alias of 'error' for doriath-migrated content."},"icon":{"type":"string","description":"Optional MDI icon name overriding content.icon while this rule matches."}}}},"clickRoute":{"description":"Whole-tile click-through: a vue-router route NAME (string) or full location object. Alias of content.route (route wins when both are set).","oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]}}}}}}}},{"description":"workspace-filter catalog widget (#91 Wave 3): a choice list whose selection writes into the page workspace context so sibling widgets refetch. The endpoint/OR-source binding keys of `props.content` are typed here; the rest stays free-form.","if":{"properties":{"widgetKey":{"const":"workspace-filter"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"content":{"type":"object","additionalProperties":true,"properties":{"writes":{"type":"string","description":"The workspace context key the selection writes (`@workspace.<key>` or a bare `<key>`). Sibling widgets whose declarative source interpolates `@workspace.<key>` refetch on change."},"style":{"type":"string","enum":["radio","select"],"default":"radio","description":"Choice style: 'radio' (default) list or 'select' dropdown."},"allLabel":{"type":"string","description":"Optional leading 'All' option — writes the empty string so an optional sibling token (`@workspace.<key>?`) drops (unfiltered set)."},"showCounts":{"type":"boolean","default":true,"description":"Render per-option counts."},"options":{"type":"array","description":"Static options — each { value, label, count? } (or { id, name } / bare strings, normalised).","items":{"type":["object","string","number"]}},"source":{"type":"object","additionalProperties":true,"description":"OpenRegister /grouped facet source { register, schema, groupBy, filter? } — each distinct value becomes an option with its object count.","properties":{"register":{"type":"string"},"schema":{"type":"string"},"groupBy":{"type":"string"},"filter":{"type":"object","additionalProperties":true}}},"endpointSource":{"$ref":"#/$defs/endpointSource","description":"App endpoint returning an array of { value, label, count? } options at responsePath."}}}}}}}},{"description":"kb-search catalog widget (#91 Wave 3): summary-driven knowledge-base search through a PLUGGABLE PROVIDER. The provider seam keys of `props.content` are typed here; the rest stays free-form.","if":{"properties":{"widgetKey":{"const":"kb-search"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"content":{"type":"object","additionalProperties":true,"properties":{"provider":{"type":"string","description":"Provider registry key (default 'default' — the built-in endpoint search). An app registers bespoke providers (the xwiki proxy) on CnAppRoot's kbSearchProviders; the xwiki client stays app-side."},"space":{"type":"string","description":"Provider-specific KB space filter (passed to provider.search)."},"tags":{"description":"Provider-specific tag filter — a single tag or an array.","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"endpoint":{"type":"string","description":"The default provider's search endpoint (OpenRegister xWiki leaf by default)."},"queryParam":{"type":"string","description":"The default provider's query parameter name (default 'q')."},"bindTo":{"type":"string","description":"Workspace context key to auto-search on (default 'activeSummary')."},"minChars":{"type":"integer","minimum":0,"description":"Minimum characters before a search fires (default 3)."},"limit":{"type":"integer","minimum":1,"description":"Result cap passed to the provider (default 8)."},"externalOpen":{"type":"boolean","description":"Whether result links open in a new tab (defaults to the provider's own externalOpen flag)."},"unavailableFallback":{"type":"string","description":"Text shown when the provider rejects / is unavailable (replaces the default 'Knowledge base unavailable')."}}}}}}}}]},"fieldWidget":{"type":"object","required":["id","component"],"additionalProperties":false,"description":"A declarative widget-component slot used inside `form` / `detail` page config. Distinct from the top-level pages[].widgets[] grid placement (which carries widgetKey + grid coordinates). fieldWidget mounts a lib `Cn*` SFC inline as a form field or detail data slot; the renderer resolves `component` against the lib's exported component map, NOT the host-app customComponents registry. Carries serialisable `props` only — handler / function props must be wired via the host App's manifest-level mounts. Replaces the untyped `fieldWidgets[]` key relied on by pipelinq#415 (which rode through on additionalProperties: true). See ConductionNL/nextcloud-vue#314.","properties":{"id":{"type":"string","pattern":"^[a-z][a-zA-Z0-9_-]*$","description":"Unique identifier within the fieldWidgets[] array. Lower-camel-case-ish: must start with a lowercase letter and contain only letters, digits, underscores, or hyphens. Used as the form field key / data binding key by CnFormPage / CnDetailPage."},"component":{"type":"string","pattern":"^Cn[A-Z]\\w+$","description":"Name of a lib component (e.g. CnMarkdownEditor, CnSchemaSelect). MUST be Cn-prefixed and resolved against the @conduction/nextcloud-vue exported component map. Host-app SFCs are not allowed here — those go through pages[].component on a type:'custom' page."},"props":{"type":"object","description":"Serialisable props passed to the resolved component at render time. Shape is component-specific; not constrained here. Handler / function values are not supported through the manifest (the manifest is JSON).","additionalProperties":true},"_note":{"type":"string","description":"Optional human-readable note explaining the role of this declarative widget slot."}}},"slotValue":{"description":"Valid slot value. Either a literal slot name (body, sidebar, header-actions, footer, modal) or a tab:<id> / section:<id> pattern string.","oneOf":[{"type":"string","enum":["body","sidebar","header-actions","footer","modal"],"description":"Literal slot name."},{"type":"string","pattern":"^(tab|section):.+","description":"Named tab or section slot. Format: tab:<id> or section:<id> where <id> is at least one character."}]},"dataSource":{"type":"object","description":"Declarative data binding for widgets. Forms: (a) shorthand {register, schema, filter?, aggregate: 'count'} — the lib builds a count query and resolves to {count}. (b) raw {graphql: {query, variables?, selectors}} — the lib issues the query and runs selectors. (c) #91 Wave 3 chart aggregation — `aggregate` as an OBJECT {groupBy, metric?: count|sum, sumField?, topN?, otherBucket?, labelResolve?} grouped over the schema's objects via OpenRegister's /grouped facet (client-side collection fallback), plus an optional sibling `drilldown` {route, filterParam}. Carry-forward from v1.3.0 widgetDef.dataSource.","additionalProperties":true,"properties":{"register":{"type":"string","description":"Shorthand: register slug."},"schema":{"type":"string","description":"Shorthand: schema slug."},"filter":{"type":"object","description":"Shorthand: filter map inlined into the generated query.","additionalProperties":true},"aggregate":{"description":"Shorthand aggregation. The STRING 'count' builds a GraphQL count query resolving to {count}. The OBJECT form (#91 Wave 3) is a chart-only categorical group-by served by OpenRegister's /grouped facet.","oneOf":[{"type":"string","enum":["count"]},{"type":"object","required":["groupBy"],"additionalProperties":false,"description":"#91 Wave 3 chart aggregation: group the schema's objects by `groupBy`, count (default) or sum `sumField`, keep the `topN` largest (sorted desc) and optionally fold the remainder into a translated 'Other' slice, resolving reference keys to labels/colours via `labelResolve`.","properties":{"groupBy":{"type":"string","description":"The categorical field grouped on."},"metric":{"type":"string","enum":["count","sum"],"default":"count","description":"count (default) | sum. sum requires sumField."},"sumField":{"type":"string","description":"Numeric field summed when metric is 'sum' (required for sum)."},"topN":{"type":"integer","minimum":1,"description":"Keep the N largest groups (sorted by value desc)."},"otherBucket":{"type":"boolean","description":"Fold the post-topN remainder into a single translated 'Other' slice (sum of the rest). The Other bucket never drilldown-navigates."},"labelResolve":{"type":"object","required":["schema"],"additionalProperties":false,"description":"Resolve reference (uuid) group keys to the referenced objects' display labels (and optional per-category colours) through the shared object store — the fkResolve pattern.","properties":{"register":{"type":"string","description":"Register the reference points into (defaults to the dataSource register)."},"schema":{"type":"string","description":"Schema slug the reference points into."},"labelField":{"type":"string","description":"Property used as the display label (default 'name')."},"colorField":{"type":"string","description":"Optional property read as a per-category CSS colour (feeds the chart's colorMap path)."}}}}}]},"drilldown":{"type":"object","required":["route","filterParam"],"additionalProperties":false,"description":"#91 Wave 3 (chart only): a segment/bar click navigates to `route` with the clicked category's RAW key in the query ({ [filterParam]: rawKey }). A `/`-prefixed route is a path, otherwise a route name. Works with the OBJECT `aggregate` and the legacy `groupBy` forms; the folded 'Other' bucket never navigates.","properties":{"route":{"type":"string","description":"Destination route name, or a path when it starts with '/'."},"filterParam":{"type":"string","description":"Query-param name the clicked category's raw key is written to."}}},"graphql":{"type":"object","description":"Raw GraphQL form.","additionalProperties":false,"required":["query","selectors"],"properties":{"query":{"type":"string","description":"GraphQL query document."},"variables":{"type":"object","description":"Variables map passed alongside query.","additionalProperties":true},"selectors":{"type":"object","description":"Map of result-prop name to dot-path selector.","additionalProperties":{"type":"string"}}}}}},"action":{"type":"object","required":["id","label"],"additionalProperties":false,"description":"A typed page action with a discriminator field. The type field determines behaviour: handler (registry function), open-modal (modal by id), open-page (named route), navigate (URL), object-op (declarative OpenRegister mutation via useObjectStore), export (opens the shared CnMassExportDialog export launcher), open-form (schema-driven create dialog — CnActionButtons), refresh (bumps the cn:page:refresh signal), api-call (POST/PUT an app endpoint + toast + refresh — CnActionButtons/dispatchAction), agent (run a governed hermiq agent), run-node (invoke one OpenRegister flow node against the page object, config collected via a dialog sourced from the node's own declared form — CnActionButtons/dispatchAction, or-flow-run-node; distinct from the UNRELATED setup-wizard step type of a similar name, 'run-action'), toggle (two-way state button — CnActionButtons only, NOT dispatchable). When type is omitted, it defaults to 'handler' (back-compatibility with v1.3.0 action declarations). The Ajv instance is compiled with useDefaults: true so the default is applied during validation.","properties":{"id":{"type":"string","description":"Unique action identifier within the page's actions array."},"label":{"type":"string","description":"i18n key resolved by the consuming app's t() function at render time."},"type":{"type":"string","enum":["handler","open-modal","open-page","navigate","object-op","export","open-form","refresh","api-call","agent","run-node","toggle"],"default":"handler","description":"Action behaviour discriminator. Defaults to 'handler' when omitted (back-compat with v1.3.0). handler: calls a registry function; open-modal: opens a modal by target id; open-page: navigates to a named route; navigate: navigates to a URL; object-op: dispatches a declarative mutation (patch | delete | create) of an OpenRegister object via the shared object store; export: opens the shared CnMassExportDialog export launcher configured via entities[]/formats[] — the confirm payload ({format, entity?}) routes to the action's `handler` in the manifest actions map (the app's export service does the download). open-form (#91 Wave 3): CnActionButtons opens a schema-driven create dialog (CnAdvancedFormDialog) for the action's register/schema, saves + toasts + refreshes + optionally navigates to onSuccessRoute. refresh (#91 Wave 3): bumps the page-level cn:page:refresh event-bus signal so every endpoint-bound widget refetches. api-call (#91 Wave 3): POST/PUT the token-interpolated url with payload/params (JSON body, payload resolves @-tokens recursively at any depth) + success/error toast + auto page-refresh (unless refresh:false); confirm gating is surface-consumed intent (object-op precedent); download:true requests a binary blob and triggers a browser file download instead (auto-refresh defaults to OFF in that mode). agent (hermiq#41): run a governed hermiq agent against the page object — POSTs { register, schema, objectId, resultField?, skill?, prompt? } to /apps/hermiq/api/agents/{agent}/run-on-object (object-RBAC-scoped; dispatches the governed AgentRunRequestedEvent). register/schema/objectId default to the page's @register/@schema/@objectId object context. A first-class companion to api-call (which remains the fallback for a bespoke body); hermiq is NOT hard-required — an app-level 404 surfaces a graceful 'agent runtime unavailable' toast. toggle (#91 Wave 3): a stateful two-way state button rendered by CnActionButtons (GET stateSource on mount, optimistic write on click) — NOT dispatchable through dispatchAction. object-op declares mutation INTENT only — authority is enforced server-side by OpenRegister RBAC (ADR-022/ADR-023); authorization-shaped fields have no client-side effect and are not accepted here."},"op":{"type":"string","enum":["patch","delete","create"],"description":"object-op only: the mutation verb. patch merges `values` into the row's object (row-scoped); delete removes the row's object (row-scoped, ALWAYS confirm-gated); create adds a new object built from `values` against the widget's source register/schema (widget-scoped footer/header affordance). Required when type is 'object-op'."},"values":{"type":"object","additionalProperties":true,"description":"object-op only: the verb's payload. For patch: the partial object merged over the row's object. For create: the new object's properties. Omitted for delete."},"confirm":{"type":"boolean","default":false,"description":"Confirm-gating (object-op + #91 Wave 3 api-call / open-form + agent): when true, the action presents a CnConfirmDialog before running (the dispatcher / CnActionButtons runs AFTER confirmation). object-op delete ALWAYS confirms regardless of this flag."},"target":{"type":"string","description":"Destination for open-modal (modal id), open-page (route name), or navigate (URL). Ignored for handler type."},"props":{"type":"object","description":"Additional props forwarded to the handler or modal.","additionalProperties":true},"createOverride":{"type":"string","description":"Registry handler name that owns the persist for an `open-form` action, replacing the default objectStore.saveObject. Resolved exactly as CnIndexPage resolves its own `createOverride` prop (a kind:'create-override' entry's `.handler`, a function-valued registry entry, or a function in the legacy customComponents map). Needed when the schema requires a field the create form cannot supply on its own — a server-minted foreign key, say — where a straight save would 400."},"includeFields":{"type":"array","items":{"type":"string"},"description":"open-form: the only fields the create dialog asks for. One schema often backs two surfaces, a detail page that edits all of it and a header button that collects what someone filing a new one types, and this is how the button says which it is. Omit for the whole schema."},"excludeFields":{"type":"array","items":{"type":"string"},"description":"open-form: fields the create dialog leaves out. Use it to drop a handful; use includeFields when it is easier to name what stays."},"fieldOverrides":{"type":"object","additionalProperties":true,"description":"open-form: per-field overrides passed to fieldsFromSchema, keyed by field. Recognised keys include label, order, hidden, readOnly and widget."},"advanced":{"type":"boolean","default":false,"description":"open-form: open the properties-and-JSON table (CnAdvancedFormDialog) instead of the plain form. The plain form is the default because a header button is aimed at someone filing a record, not at inspecting its schema."},"formTitle":{"type":"string","description":"open-form: overrides the create dialog's heading. Defaults to 'Create {schema title}'."},"size":{"type":"string","enum":["small","normal","large","full"],"default":"normal","description":"open-form: how wide the create dialog is, passed straight to NcDialog. Widen a form that asks enough questions to need scrolling; pair it with columns: 2."},"columns":{"type":"integer","enum":[1,2],"default":1,"description":"open-form: how many columns the fields flow into. 2 pairs them up, which halves the scrolling on a longer form. Textareas and JSON editors still span the full width, and the layout collapses to one column below 700px. Widen the dialog with size: 'large' as well, or two columns are merely two narrow ones."},"handler":{"type":"string","description":"Registry key for type: 'handler'. Resolved across both registries passed to CnAppRoot: a v2 `registry` entry of `kind: 'handler'` exposing the function as `.handler` (or `.fn`), a directly function-valued registry entry, or a function-valued entry in the deprecated `customComponents` map. The same resolution serves actions[], bulkActions[] and headerActions[]. Also the built-in dispatch verb when paired with `route` (handler: 'navigate' → $router.push to `route`)."},"route":{"type":"string","description":"Destination route name for handler: 'navigate'. The dispatcher (manifestActionDispatch) calls $router.push({ name: route, params }). For row-level actions params include { id: row[rowKey] } automatically — do NOT restate it as params: { id: \"{id}\" }, though that placeholder does resolve (see `params`). Page-level header actions navigate without row context (e.g. a 'New X' action to a detail route)."},"icon":{"type":"string","description":"Optional icon for the action, rendered by CnActionsBar. Either an MDI icon name (e.g. 'TextBoxOutline') or a CSS icon class (e.g. 'icon-file')."},"entities":{"type":"array","description":"export only: selectable entity types offered by the export launcher (e.g. Leads / Requests). Optional — when absent the dialog shows only the format picker. Each entry needs an id + pre-translated label.","items":{"type":"object","additionalProperties":false,"required":["id","label"],"properties":{"id":{"type":"string","description":"Entity id handed to the confirm handler."},"label":{"type":"string","description":"Pre-translated display label."}}}},"formats":{"type":"array","description":"export only: the offered export formats — bare ids ('excel', 'csv', 'json' — lifted to {id, label} with an upper-cased label) or full {id, label} entries. Optional — the dialog's built-in Excel/CSV defaults apply when absent.","items":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":false,"required":["id","label"],"properties":{"id":{"type":"string","description":"Format id handed to the confirm handler."},"label":{"type":"string","description":"Pre-translated display label."}}}]}},"description":{"type":"string","description":"export only: pre-translated description shown above the export launcher's pickers."},"url":{"type":"string","description":"api-call / toggle only: the app endpoint (POST/PUT). App-relative (routed through generateUrl) or absolute (http/https). May interpolate @objectId / @object.<field> / @workspace.<key> / @config.<key> tokens inline, as well as the literal {objectId} brace placeholder (unresolved tokens collapse to empty)."},"method":{"type":"string","enum":["POST","PUT"],"description":"api-call: HTTP method (default POST). toggle writeUrl: default PUT."},"payload":{"type":"object","additionalProperties":true,"description":"api-call only: the JSON request body — PREFERRED over `params`, and used instead of it when both are set. Values run the SAME token grammar as `params` (@me, @now, @today±Nd, @monthStart/@quarterStart/@yearStart, @objectId, @object.<field>, @workspace.<key>/@config.<key> with a trailing `?` marking a value OPTIONAL — dropped when unresolved) but resolve RECURSIVELY at ANY nesting depth, including arrays of objects — e.g. a Filinq document-generation body: { \"dataRefs\": [{ \"register\": \"crm\", \"schema\": \"lead\", \"id\": \"@objectId\" }] }. A required (non-`?`) token left unresolved anywhere in the tree BLOCKS the call (error toast) instead of sending the literal token string to the server."},"params":{"type":"object","additionalProperties":true,"description":"Two distinct uses depending on the action's dispatch. (1) api-call / toggle: the JSON request body (legacy — prefer `payload` for anything with nested objects/arrays; ignored when `payload` is set). Values run the shared filter-token grammar ONE level deep (@me, @today±Nd, @workspace.<key>/@config.<key> with a trailing `?` for optional values dropped when unresolved; a required unresolved token skips the call). (2) handler: 'navigate' (index-page row actions, manifestActionDispatch): vue-router params merged OVER the default { id: row[rowKey] }. OMIT it for the ordinary 'open this row's detail page' action — the row id is already injected. String values run the `{field}` ROW-token grammar (NOT the @-token grammar): \"{id}\" resolves to row.id with its type preserved, \"run-{id}\" interpolates as text, and a brace-less \"new\" stays literal (that is what makes a 'New X' action navigate with { id: 'new' }). A token naming a field the row does not carry is dropped with a console.warn — so `id` falls back to the row id — instead of being pushed as a literal %7Bid%7D path segment."},"download":{"type":"boolean","default":false,"description":"api-call only: request the response as a binary blob (axios responseType 'blob') and trigger a browser file download instead of a JSON toast+refresh cycle. The filename is taken from the response's Content-Disposition header, else the token-resolved `filename`, else 'download.pdf'. The success toast still shows; unlike a normal api-call the page does NOT auto-refresh afterwards unless `refresh: true` is explicitly set."},"filename":{"type":"string","description":"api-call `download: true` only: fallback filename used when the response carries no Content-Disposition header (falls back further to 'download.pdf'). Interpolates the same token grammar as `url` (@objectId, @object.<field>, @workspace.<key>, @config.<key>, {objectId})."},"successMessage":{"type":"string","description":"api-call / open-form / agent / run-node / toggle: pre-translated success toast text (a library default applies when absent; agent default 'Run queued')."},"errorMessage":{"type":"string","description":"api-call / agent / run-node / toggle: pre-translated error toast text (falls back to the server's error/message, then a library default; an agent 404 with no structured body toasts 'agent runtime unavailable' instead)."},"refresh":{"type":"boolean","default":true,"description":"api-call / agent / run-node / toggle: bump the page-level cn:page:refresh signal after a successful call (default true; set false to skip). EXCEPTION: for an api-call with download:true the default flips to false — a file download normally shouldn't also force-refetch every widget — set refresh:true explicitly to opt back in."},"flowId":{"type":"string","description":"run-node only (REQUIRED): the published flow's uuid whose node this action invokes. A node's config and eligibility are properties of the flow it lives in (RN-3, OpenRegister's or-flow-run-node), so the manifest names which flow's instance to call rather than a bare node type — two flows could each carry the same node TYPE wired differently."},"nodeId":{"type":"string","description":"run-node only (REQUIRED): the id of the node, within flowId's published graph, to invoke directly. POSTed to /api/flows/{flowId}/nodes/{nodeId}/run — refused (404) unless that node type has opted in to direct invocation (IFlowDirectlyInvokable)."},"subject":{"type":"string","description":"run-node only: the subject object the node acts on and is authorized against (OpenRegister object-RBAC — the caller needs update permission on it; the flow's own flow.run right is deliberately NOT what gates this). Typically @objectId; may interpolate the shared @-token grammar. An unresolved required token BLOCKS the call, matching agent's objectId."},"agent":{"type":"string","description":"agent only (REQUIRED): the hermiq agent uuid to run against the page object. POSTed to /apps/hermiq/api/agents/{agent}/run-on-object (hermiq#41) — object-RBAC-scoped, dispatches the governed AgentRunRequestedEvent. May interpolate the shared @-token grammar (@objectId, @object.<field>, @workspace.<key>, @config.<key>)."},"skill":{"type":"string","description":"agent only: optional skill id folded into the governed run (interpolates the same @-token grammar as `agent`)."},"prompt":{"type":"string","description":"agent only: optional prompt handed to the governed run. Interpolates the shared @-token grammar inline (@objectId, @object.<field>, @workspace.<key>, @config.<key>) so it can be grounded on the page object — e.g. 'Summarise @object.title'."},"resultField":{"type":"string","description":"agent only: the object field the agent's result is written back to (falls back to hermiq's default result field when absent)."},"objectId":{"type":"string","description":"agent only: the target object id. Defaults to the page object context's @objectId; an unresolved required @objectId BLOCKS the call (fail-closed) rather than sending a literal token. May be an explicit id or an @-token string."},"register":{"type":"string","description":"open-form / agent / run-node: OpenRegister register slug. open-form: the create dialog's schema register. agent / run-node: the register the subject object belongs to — falls back to the page object context's @register."},"schema":{"type":"string","description":"open-form / agent / run-node: OpenRegister schema slug. open-form: the create dialog fetches this schema and saves the new object against it. agent / run-node: the schema the subject object belongs to — falls back to the page object context's @schema."},"onSuccessRoute":{"description":"open-form only: optional post-save navigation target (#91). A bare route NAME (string) navigates with the saved object's id merged into the route params under `id` (harmless when the route has no `:id` segment — backward compatible). The object form { name, paramField?, objectParam? } names the id param (`paramField`, default `id`) and, when `objectParam` is set, also passes the whole saved object under that param key (for a props:true detail route to render without a refetch). The id is read from saved.id, then saved.uuid, then saved['@self'].id.","oneOf":[{"type":"string"},{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","description":"The vue-router route NAME pushed after a successful save."},"paramField":{"type":"string","default":"id","description":"Route param name populated from the saved object's id (default `id`)."},"objectParam":{"type":"string","description":"When set, the whole saved object is passed under this route param (props:true detail routes render without a refetch)."}}}]},"labelOn":{"type":"string","description":"toggle only: button label rendered while the state is ON (true). Falls back to `label`."},"labelOff":{"type":"string","description":"toggle only: button label rendered while the state is OFF (false). Falls back to `label`."},"stateSource":{"$ref":"#/$defs/endpointSource","description":"toggle only: the endpoint the initial state is read from on mount (the shared endpointSource shape — url + token-resolved params + responsePath). The `field` dot-path picks the boolean off the payload."},"writeUrl":{"type":"string","description":"toggle only: the endpoint the flipped state is written to on click (interpolates the same tokens as `url`)."},"field":{"type":"string","description":"toggle only: the state field — read off the stateSource payload on mount AND sent (as the flipped boolean) in the write body under this key."},"variant":{"type":"string","description":"CnActionButtons button variant (e.g. 'primary', 'secondary', 'error'). 'error' also styles the confirm dialog as destructive. A 'primary' action is never collapsed into CnActionButtons' overflow menu and consumes none of its `inline` slots: NcActions paints all of its inline actions with one shared variant, so a lone primary among them is not expressible."},"children":{"type":"array","description":"Sub-actions, rendered by CnActionButtons as this action's OWN chevron dropdown beside its button — deliberately not folded into the page's single overflow menu, because NcActions cannot nest and a list that grows per record (app versions, say) would swamp it. Children take the same shape as any action, `visibleWhen` included, and an action carrying them consumes none of the `inline` slots. The parent itself still renders its own button beside the chevron (`type` defaults to 'handler' when omitted), so a parent meant only to group its children needs a `handler` that does something meaningful — an untyped, handler-less parent renders a button that dispatches to nothing.","items":{"$ref":"#/$defs/action"}},"childrenLabel":{"type":"string","description":"i18n key naming the `children` dropdown. Falls back to the parent action's own label, so the chevron is never announced unlabelled."},"visibleWhen":{"$ref":"#/$defs/visibleWhen","description":"#91 Wave 3: an optional predicate gating whether the action renders — the shared banner shape ({ endpoint | source | field, op, value }). The `field`-only LOCAL form evaluates against the page object context (a detail action shown only in the right lifecycle state); endpoint / source forms fetch. Fail-safe: a broken predicate hides the action."}},"allOf":[{"description":"object-op actions MUST declare their mutation verb via `op`.","if":{"properties":{"type":{"const":"object-op"}},"required":["type"]},"then":{"required":["op"]}},{"description":"api-call actions MUST declare their endpoint via `url`.","if":{"properties":{"type":{"const":"api-call"}},"required":["type"]},"then":{"required":["url"]}},{"description":"open-form actions MUST declare the create schema via `schema`.","if":{"properties":{"type":{"const":"open-form"}},"required":["type"]},"then":{"required":["schema"]}},{"description":"agent actions MUST declare the target agent uuid via `agent`.","if":{"properties":{"type":{"const":"agent"}},"required":["type"]},"then":{"required":["agent"]}},{"description":"toggle actions MUST declare their write endpoint via `writeUrl`.","if":{"properties":{"type":{"const":"toggle"}},"required":["type"]},"then":{"required":["writeUrl"]}},{"description":"run-node actions MUST declare which flow and which node within it (RN-3, or-flow-run-node) — a node's config and eligibility are properties of the flow it lives in, so neither can be inferred.","if":{"properties":{"type":{"const":"run-node"}},"required":["type"]},"then":{"required":["flowId","nodeId"]}}]},"fieldValidation":{"type":"object","additionalProperties":false,"description":"manifest-form-logic: per-field validation rules for `type: 'form'` pages, enforced client-side by CnFormPage's validateFieldValue() before dispatch. Per-type semantics: string/password — required = non-empty after trim, min/max = string LENGTH, pattern tested against the value; number — required = finite number, min/max = numeric VALUE, pattern not applicable; boolean — required = value must be true (consent checkboxes), min/max/pattern not applicable; enum — required = a value is selected, min/max/pattern not applicable; json — required = non-null, min/max/pattern not applicable. Type-inapplicable rules are rejected by validateManifestV2() post-schema (pattern only on string/password; min/max only on string/password/number). `message` (i18n-able) overrides the built-in default message for whichever rule fails.","properties":{"required":{"type":"boolean","description":"Whether the field must be filled. Default false. Per-type pass condition — see the fieldValidation description."},"min":{"type":"number","description":"Minimum bound. String length for string/password fields, numeric value for number fields. MUST be <= max when both are set (validateManifestV2 post-schema check)."},"max":{"type":"number","description":"Maximum bound. String length for string/password fields, numeric value for number fields."},"pattern":{"type":"string","description":"ECMAScript regex source tested against string/password values (implicit full-value test via new RegExp(pattern).test(value)). MUST compile — validateManifestV2() post-schema check runs `new RegExp(pattern)` in a try/catch."},"message":{"type":"string","description":"i18n-able override message shown for ANY failing rule on this field, in place of the built-in translated default. Run through the page's `translate` prop, like `field.label`."}}},"visibleWhen":{"type":"object","additionalProperties":false,"description":"#91 Wave 3: the shared visibility predicate (the Wave-1 banner shape). THREE modes: `endpoint` (GET a JSON endpoint, `field` dot-paths into the body), `source` (an OpenRegister { register, schema, filter? } query — `field` into the first result, or omit / use @total for the collection total), or LOCAL (neither endpoint nor source — `field` dot-paths into the caller's object context, e.g. a detail-page record). `op` defaults to eq. Evaluation is FAIL-SAFE (any error → hidden).","properties":{"appInstalled":{"type":"string","minLength":1,"description":"Nextcloud app id that must be installed and enabled for the guarded element to show. A PRECONDITION rather than a fourth mode: it is checked before anything else, and on its own it is the whole condition. Combined with endpoint/source/field it gates that mode too, so both must hold. It exists because the menu's `visibleIf` already spoke this word and `visibleWhen` did not, so the same manifest vocabulary meant two different things in two places. Use it on an action that writes into a sibling app, so an install without that app shows no button rather than a form that saves nowhere."},"endpoint":{"type":"string","description":"A same-origin URL returning JSON; `field` is a dot-path into the body."},"source":{"type":"object","additionalProperties":true,"description":"An OpenRegister object query { register, schema, filter? } (filter supports the shared @-token grammar). `field` dot-paths into the first result; omit it (or use @total) to compare the collection total.","properties":{"register":{"type":"string"},"schema":{"type":"string"},"filter":{"type":"object","additionalProperties":true}}},"field":{"type":"string","description":"Dot-path to the compared value — into the endpoint body, the source's first result, or (LOCAL mode) the caller's object context."},"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte","empty","notEmpty"],"default":"eq","description":"Comparison operator (default eq). eq/neq compare loosely-normalised primitives; ordering operators coerce both sides to Number. `empty` / `notEmpty` take no `value` and treat undefined, null, '' and an empty array alike — the one question eq cannot ask, because an unset field arrives in a shape that depends on the store and String(null) is the word 'null' rather than blank."},"value":{"description":"The right-hand side of the comparison, resolved through the shared @-token grammar so `@me` names the signed-in reader rather than a literal only the server knows. Omitted for `empty` / `notEmpty`."},"all":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/visibleWhen"},"description":"Every listed condition must hold. Use it where a gate is more than one fact — a Claim button that is both 'not closed' and 'nobody holds it'. Each entry is a full visibleWhen and may compose again."},"any":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/visibleWhen"},"description":"At least one listed condition must hold. Ignored when `all` is also present."}}},"objectTableSource":{"type":"object","required":["register","schema"],"additionalProperties":false,"description":"Declarative self-fetch source for the object-table built-in widget (CnWidgetObjectTable). The widget resolves `filter` @-tokens (@me, @today, @today±Nd, @workspace.*, ?-optional suffix) with the shared resolveFilterTokens grammar just before fetching, and drives CnDataTable's existing self-fetch. `register` MAY carry an `@resolve:` sentinel — the widget passes it through unexpanded (resolution is the host loader's responsibility). Externally supplied `rows` always win over `source`.","properties":{"register":{"type":"string","description":"OpenRegister register slug (or an `@resolve:<key>` sentinel, passed through unexpanded by the widget)."},"schema":{"type":"string","description":"OpenRegister schema slug."},"filter":{"type":"object","additionalProperties":true,"description":"Filter map (`{ field: value | value[] | { op: value | value[] } }`). Values may use the shared @-token grammar: `@me` (current user via @nextcloud/auth), `@now`, `@today`, relative-date arithmetic `@today±Nd` at day granularity (e.g. `@today-30d`, `@today+7d`), `@monthStart`/`@quarterStart`/`@yearStart`, `@objectId`/`@object.<field>` (detail context), `@workspace.<key>`/`@config.<key>` with a trailing `?` for optional clauses that drop when unresolved. IN-lists: an ARRAY value (directly, or via `{ in: [...] }`) matches any of its entries — tokens resolve item-by-item and the widget serializes the list as repeated `field[]` params (the shape OpenRegister parses)."},"order":{"type":"object","additionalProperties":{"type":"string","enum":["asc","desc"]},"description":"Fetch ordering: field name to direction map (e.g. { \"dueDate\": \"asc\" })."},"limit":{"type":"integer","minimum":0,"description":"Row cap. 0 (or omitted) shows all fetched rows; a positive value caps the rendered rows and enables the View-all footer when more rows exist."},"extend":{"type":"array","items":{"type":"string"},"description":"OpenRegister `_extend[]` values forwarded on the fetch (e.g. [\"calculations\"]) so read-time virtual/derived fields are hydrated and available as columns. Each entry is passed through verbatim."}}},"endpointSource":{"type":"object","required":["url"],"additionalProperties":false,"description":"Wave 2 (#91): ONE coherent endpoint data binding shared by the stat / delta / object-table widgets (the chart uses the extended $defs/chartEndpointSource). Reads an arbitrary app REST endpoint through the library's useEndpointSource engine: params pass the SAME @-token grammar widget filters use (@me, @today±Nd, @monthStart, @workspace.<key>/@config.<key> with a trailing `?` for optional values that drop when unresolved — a REQUIRED token that stays unresolved blocks the fetch), requests dedupe + short-TTL cache per (method, url, resolved params), and the widget refetches on cn:page:refresh / a matching cn:widget:refresh. Exactly ONE of the widget's OpenRegister source | endpointSource may be configured — a cross-field rule enforced by validateManifestV2() as a post-schema check (clear error message), matching the stats-block precedent.","properties":{"url":{"type":"string","description":"Endpoint URL — app-relative (routed through generateUrl, e.g. '/apps/pipelinq/api/analytics/overview') or absolute (http/https, left untouched). May interpolate @page.<key> / @workspace.<key> / @config.<key> / @objectId / @object.<field> tokens inline; unresolved URL tokens collapse to an empty string."},"method":{"type":"string","enum":["GET","POST"],"default":"GET","description":"HTTP method. GET (default) sends the resolved params as query parameters; POST sends them as the JSON body."},"params":{"type":"object","additionalProperties":true,"description":"Request parameters. Values pass the shared filter-token grammar (resolveFilterTokens): @me, @now, @today, @today±Nd, @monthStart/@quarterStart/@yearStart, @objectId/@object.<field> (detail context), @workspace.<key>/@config.<key> with a trailing `?` for optional values (dropped when unresolved; e.g. `{ \"period\": \"@workspace.datePreset?\" }` rides the dashboard date-range pills). A required token that stays unresolved blocks the fetch until the page context provides it."},"responsePath":{"type":"string","description":"Dot-path pluck of the response payload (e.g. 'summary', 'data.series'). Omitted = the whole response body."}}},"chartEndpointSource":{"type":"object","required":["url"],"additionalProperties":false,"description":"The chart widget's endpoint binding: the $defs/endpointSource transport plus the labels/series response mapping. The mapping keys live INSIDE this block (not as sibling props) because the chart's flat `series` / `labels` props already carry the static data. When the plucked payload is an ARRAY of points (e.g. pipelinq /api/analytics/trends → responsePath 'series'), labelsPath / series[].path are PER-ITEM field paths (labelsPath 'date', series [{ name: 'Leads', path: 'value' }]); when it is an OBJECT they point at parallel arrays. Pie-family charts flatten the FIRST mapped series into the flat value array ApexCharts expects. Exactly ONE of dataSource | endpointSource per chart widget (post-schema check).","properties":{"url":{"type":"string","description":"Endpoint URL — app-relative (generateUrl) or absolute. Same token interpolation as $defs/endpointSource."},"method":{"type":"string","enum":["GET","POST"],"default":"GET","description":"HTTP method. GET (default) sends params as query parameters; POST as the JSON body."},"params":{"type":"object","additionalProperties":true,"description":"Request parameters — the shared filter-token grammar (see $defs/endpointSource.params). Params re-resolve and the chart refetches when the dashboard date range changes (the page publishes dateFrom / dateTo / datePreset into the workspace context)."},"responsePath":{"type":"string","description":"Dot-path pluck of the response payload. Omitted = the whole response body."},"labelsPath":{"type":"string","description":"Labels/categories mapping: a per-item field path for an ARRAY payload ('date'), or the path of a parallel label array for an OBJECT payload ('labels')."},"series":{"type":"array","description":"Series mapping — one entry per rendered series.","items":{"type":"object","required":["path"],"additionalProperties":false,"properties":{"name":{"type":"string","description":"Series display name (legend / tooltip). Defaults to the path."},"path":{"type":"string","description":"Value mapping: a per-item field path for an ARRAY payload ('value'), or the path of a parallel number array for an OBJECT payload ('totals')."}}}}}},"statsBlockEntry":{"type":"object","required":["register","schema"],"additionalProperties":false,"description":"One KPI entry inside a multi-entry stats-block widget (CnStatsBlockWidget `entries[]`). Carries the same source contract as a type:'stat' widget: register + schema + metric + token-resolved filter (@today / @me / @workspace.* and ?-optional clauses), plus per-entry presentation (title, variant, countLabel), an optional route deep link, and hideWhenZero.","properties":{"title":{"type":"string","description":"KPI title rendered by the inner CnStatsBlock."},"register":{"type":"string","description":"OpenRegister register slug for this entry's count."},"schema":{"type":"string","description":"OpenRegister schema slug for this entry's count."},"metric":{"type":"string","description":"Aggregation metric for the REST /value aggregation (default 'count')."},"field":{"type":"string","description":"Field the metric aggregates over (metric-dependent; unused for count)."},"filter":{"type":"object","additionalProperties":true,"description":"Filter map with the shared @-token grammar (@today / @me / @workspace.<key>, trailing `?` for optional clauses)."},"route":{"type":"object","additionalProperties":true,"description":"Optional vue-router location for the KPI's deep link (renders the entry clickable)."},"variant":{"type":"string","enum":["default","primary","success","warning","error"],"description":"Color variant forwarded to the inner CnStatsBlock."},"countLabel":{"type":"string","description":"Label displayed next to the count."},"iconClass":{"type":"string","description":"Optional Nextcloud core icon class (icon-link, icon-mail, …) for the entry."},"hideWhenZero":{"type":"boolean","default":false,"description":"When true, the entry is omitted from the card when its resolved count is 0."}}},"page":{"type":"object","required":["id","route","type","title"],"additionalProperties":false,"description":"A v2 page definition. CnPageRenderer dispatches by type and matches by $route.name === page.id. All page types support a uniform widgets[] array for declarative slot placement. Sentinels (@resolve:*) are NOT allowed in id, route, component, headerComponent, actionsComponent, or slots.* — those are router and registry invariants.","properties":{"requiresApp":{"description":"Soft dependency gating this WHOLE page. When the named Nextcloud app is not installed, the page renders the missing-dependency screen instead of its body. This is for the DEEP LINK: an entry gated by visibleIf.appInstalled is already hidden from the menu, so the remaining ways in are a bookmark, a shared URL, a redirect or an e2e spec, and those otherwise land on an empty page where 'not installed' looks the same as 'no data'. Gate a single WIDGET with visibleIf.appInstalled instead: a detail page may carry many widgets where only one needs the app, and that widget should hide while the page renders normally.","oneOf":[{"type":"string","minLength":1},{"type":"object","required":["id"],"additionalProperties":false,"properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1,"description":"Human-readable app name shown on the screen; defaults to the id."}}}]},"id":{"type":"string","description":"Vue-router route name. MUST be unique across pages[]. Sentinels (@resolve:*) are NOT allowed."},"route":{"type":"string","description":"Path pattern (e.g. '/decisions', '/decisions/:id'). Sentinels (@resolve:*) are NOT allowed."},"type":{"type":"string","enum":["index","detail","dashboard","logs","settings","chat","files","form","map","roadmap","reports","store","search","wiki","flow","flows","flow-detail","custom"],"description":"Page type. Closed enum of 17 supported types. 'flow' opens ONE flow in the editor; the flow LIST is an ordinary 'index' with config.entitySource='flows'. 'flows' and 'flow-detail' are DEPRECATED aliases kept for migration — 'flows' predates named index sources and 'flow-detail' is the old name for 'flow'. 'roadmap' mounts CnFeaturesAndRoadmapPage (features + GitHub-issue-backed roadmap). 'search' mounts CnSearchPage (cross-schema query + facet sidebar + results list; consumers wire the actual search via @search). 'wiki' mounts CnWikiPage (manifest-declared markdown article + optional sidebar tree; MUST declare config.register + config.schema). 'flow' and the deprecated 'flow-detail' both mount CnFlowEditorPage (the shared node/edge canvas) and take config.app to scope to the owning app. A flow lives in OpenRegister's native flow store rather than a register/schema pair, so a single flow cannot be a 'detail' page — but the LIST is a plain 'index' once a named entitySource supplies it, which is why 'flows' is deprecated (ADR-110 Decision 4). 'custom' requires a _note field explaining why a standard type was not feasible."},"title":{"type":"string","description":"i18n translation key for the page title."},"permission":{"type":"string","description":"Optional permission identifier required to access this page."},"component":{"type":"string","description":"For type='custom': name resolved against the app-provided customComponents registry. Sentinels (@resolve:*) are NOT allowed."},"headerComponent":{"type":"string","description":"Optional registry name for a component injected into the page's #header slot. Sentinels (@resolve:*) are NOT allowed."},"actionsComponent":{"type":"string","description":"Optional registry name for a component injected into the page's #actions slot. Sentinels (@resolve:*) are NOT allowed."},"sidebarComponent":{"type":"string","minLength":1,"description":"Optional registry name for a component mounted as the default sidebar content for this page."},"slots":{"type":"object","description":"Generic slot-override map. Each key is a slot name; each value is a registry component name. Sentinels (@resolve:*) are NOT allowed in values.","additionalProperties":{"type":"string"}},"primaryAction":{"$ref":"#/$defs/primaryAction","description":"Active-page-scoped primary action rendered as an NcAppNavigationNew button above the menu list when the current route resolves to this page. Page-scoped declarations win over nav.primaryAction. Also the target of the detail page's skip link: a keyboard user tabs in, follows the link and lands on this action."},"splitView":{"$ref":"#/$defs/splitView","description":"Index pages only. Opens a row beside the list rather than instead of it, at the sibling route <route>/split/:id that buildManifestRoutes() emits. Refused on any other page type."},"board":{"$ref":"#/$defs/boardView","description":"Index pages only. The board view's configuration, handed to CnIndexPage as the `board` prop. The segment appears only when `viewModes` also lists `board`. Refused on any other page type."},"dateAxis":{"$ref":"#/$defs/dateAxisView","description":"Index pages only. The date-axis view's configuration, handed to CnIndexPage as the `dateAxis` prop. The segment appears only when `viewModes` also lists `dateAxis`. Refused on any other page type."},"savedViewTree":{"$ref":"#/$defs/savedViewTree","description":"Index pages only. Renders this page's saved views as a tree with labels, and declares the views that ship with the app. Refused on any other page type: a page with no saved-view dropdown has nothing to put in a tree."},"manualOrder":{"type":"boolean","default":false,"description":"Index pages only. Lets a person drag the rows into an order of their own, held per user and per list in their Nextcloud preferences and never written onto the records. Refused on any other page type."},"tabInAddress":{"type":"boolean","default":false,"description":"Detail pages only. Puts the active tab in the address as ?_tab=<id> so a link points at a tab of a record rather than at the record. The underscore prefix keeps it out of resolveQueryFilters(), which reads every other query key as a filter. Refused on any other page type."},"referencePreview":{"type":"boolean","default":false,"description":"Lets a reference on this page show a summary of the record it points at, on focus and on hover, without leaving the page. Rendered by CnReferencePreview."},"widgets":{"type":"array","items":{"$ref":"#/$defs/widgetEntry"},"description":"Uniform widget placement array. Available on ALL page types in v2 (not just dashboard). Each entry specifies a widget key, slot, and grid coordinates. The cross-field constraint gridX + gridWidth <= 12 is enforced by validateManifestV2() post-schema check. Single-widget dashboards: a type:'dashboard' page with exactly one body widget covering the full 12×12 grid whose widgetKey resolves to a custom (non-library-built-in) registry component is REJECTED — see ADR-036 Decision 1 (single-widget dashboard anti-pattern). Use type:'custom' with component:'<widgetKey>' or split into N>1 widgets instead. Library built-in widget keys are exempt from the rule; the exempt set is LIBRARY_WIDGET_KEYS in src/utils/libraryWidgetKeys.js, which is held to set equality against the BUILT_IN_WIDGETS registry and the dashboard widget catalog by tests/utils/libraryWidgetKeys.spec.js. It is not restated here, because an out-of-date second copy of that list is the defect this replaced. Enforced by validateManifestV2() post-schema check."},"actions":{"type":"array","items":{"$ref":"#/$defs/action"},"description":"Typed page-level actions with a discriminator. Each action has a type field (handler | open-modal | open-page | navigate) that defaults to 'handler' when omitted."},"config":{"type":"object","description":"Type-specific configuration. Shape varies by page type — see v1 schema for per-type config shapes (index, detail, dashboard, logs, settings, chat, files, form, map, custom). Config values under pages[].config may use the closed sentinel vocabulary (see $defs/sentinelTokenAny) — an out-of-vocabulary @-token FAILS validation via the sentinelGuardedValue allOf guard. Carry-forward from v1: register, schema, columns, actions, sidebar, sidebarProps, fields, sections, tabs, content, layout, widgets (dashboard only), cardComponent, columnGroups, etc.","additionalProperties":true,"allOf":[{"$ref":"#/$defs/sentinelGuardedValue"}],"properties":{"entitySource":{"type":"string","enum":["flows","tasks"],"description":"Name a registered NON-OBJECT entity collection for a type='index' page, instead of register+schema. Deliberately NOT called `source`: that key is already taken on page config and is polymorphic (a URL string in some manifests, an object with `params` in others), so reusing it would give one key two meanings and break six deployed shillinq pages. A flow definition is deliberately not an OpenRegister object, so an index had nothing to bind to and such lists became bespoke type='custom' pages. With a source the index loads the list itself. Takes precedence over register/schema; non-empty `objects` still wins over both. Registered sources live in src/composables/indexSources.js. `tasks` lists the viewer's task inbox from OpenRegister's flow-tasks read (cn-tasks-entity-source)."},"app":{"type":"string","description":"Scopes a named `entitySource` to one app (e.g. entitySource='flows' with app='dossiq' lists that app's flows)."},"register":{"type":"string","description":"OpenRegister register slug."},"schema":{"type":"string","description":"OpenRegister schema slug."},"contentField":{"type":"string","description":"type='wiki': property on the article object holding the markdown body. Defaults to 'body'. Maps to CnWikiPage `contentField` prop."},"titleField":{"type":"string","description":"type='wiki': property on the article object holding the page title. Defaults to 'title'. Maps to CnWikiPage `titleField` prop."},"idParam":{"type":"string","description":"type='wiki': $route.params key holding the article id. Defaults to 'id'. Maps to CnWikiPage `idParam` prop."},"treeField":{"type":"string","description":"type='wiki': property on each sidebar tree node holding its child array. Defaults to 'children'. Maps to CnWikiPage `treeField` prop."},"sidebarTitleField":{"type":"string","description":"type='wiki': property on each sidebar tree node holding its label. Defaults to `titleField`. Maps to CnWikiPage `sidebarTitleField` prop."},"sidebarRegister":{"type":"string","description":"type='wiki': register slug for the sidebar tree. Defaults to `register`. Maps to CnWikiPage `sidebarRegister` prop."},"sidebarSchema":{"type":"string","description":"type='wiki': schema slug providing the sidebar tree. When set AND `tree` is non-empty the sidebar renders. Maps to CnWikiPage `sidebarSchema` prop."},"emptyText":{"type":"string","description":"type='wiki': empty-state heading shown when the article is null. Maps to CnWikiPage `emptyText` prop."},"emptyDescription":{"type":"string","description":"type='wiki': empty-state description shown when the article is null. Maps to CnWikiPage `emptyDescription` prop."},"emptyBodyText":{"type":"string","description":"type='wiki': empty-body heading shown when the article has no content. Maps to CnWikiPage `emptyBodyText` prop."},"emptyBodyDescription":{"type":"string","description":"type='wiki': empty-body description shown when the article has no content. Maps to CnWikiPage `emptyBodyDescription` prop."},"cardComponent":{"type":"string","description":"Registry name for a custom card component on index pages. Carry-forward from v1.3.0."},"sidebar":{"description":"Sidebar configuration. For index: object with enabled, show, columnGroups[], facets, etc. For detail: boolean or object with show, enabled, register, schema, tabs[]. Carry-forward from v1.3.0.","oneOf":[{"type":"boolean"},{"type":"object","additionalProperties":true,"properties":{"show":{"type":"boolean","description":"Whether to show the sidebar on this page."},"enabled":{"type":"boolean","description":"Whether the sidebar is enabled."},"columnGroups":{"type":"array","description":"Index sidebar column-visibility groups. Carry-forward from v1.3.0.","items":{"type":"object","additionalProperties":true}}}}]},"tabs":{"type":"array","description":"Settings tabs (for type='settings'). Carry-forward from v1.3.0.","items":{"type":"object","additionalProperties":true}},"sidebarTabs":{"type":"array","description":"Sidebar tabs declaration for type='detail' pages. Each entry is the human-authored source of truth for one tab — `id` + `label` (required), optional `icon`, `order`, `component`. Widgets bound to a tab carry `tabGroup: \"<tab-id>\"` on `slot:\"sidebar\"` entries; cross-reference is validated. The CLI manifest-migrate transform lifts `config.sidebarTabs[].widgets[]` into top-level `widgets[]` with `slot:\"sidebar\"` + `tabGroup`; tab entries declaring only a `component` are carried forward as residual sidebarTabs[]. See src/cli/transforms/liftSidebarTabWidgets.js.","items":{"type":"object","additionalProperties":true,"required":["id","label"],"properties":{"id":{"type":"string","minLength":1,"description":"Unique tab identifier within the page. Referenced from widgets[].tabGroup."},"label":{"type":"string","minLength":1,"description":"i18n key (or literal) for the tab label."},"icon":{"type":"string","description":"Optional icon name (CSS class or MDI identifier) shown next to the label."},"order":{"type":"number","description":"Optional sort key for tab ordering; lower values render first."},"component":{"type":"string","description":"Optional registry name for a full-tab custom component. When set, the tab renders that component directly instead of the per-tab widgets[] grouping. Resolved against the customComponents registry."},"_note":{"type":"string","description":"Optional human note (e.g. lib-gap reason for an undecomposable tab)."}}}},"sections":{"type":"array","description":"Settings sections (for type='settings'). Carry-forward from v1.3.0.","items":{"type":"object","additionalProperties":true}},"fields":{"type":"array","description":"Form fields (for type='form'). Carry-forward from v1.3.0. manifest-form-logic adds two OPTIONAL typed properties — `visibleWhen` (reuses `$defs/visibleWhen`; LOCAL mode resolves `field` as a dot-path into the live form data) and `validation` (`$defs/fieldValidation`) — while every other carry-forward field shape (`key`, `label`, `type`, `enum`, `widget`, `help`, etc.) stays untyped via `additionalProperties: true` on the item.","items":{"type":"object","additionalProperties":true,"properties":{"visibleWhen":{"$ref":"#/$defs/visibleWhen","description":"manifest-form-logic: optional conditional-visibility predicate. LOCAL mode (neither `endpoint` nor `source`) resolves `field` as a dot-path into the live form data — the first dot-segment MUST match a declared `config.fields[].key` (validateManifestV2 post-schema check). `endpoint` / `source` modes keep their existing fail-safe, evaluated-once-at-mount semantics."},"validation":{"$ref":"#/$defs/fieldValidation","description":"manifest-form-logic: optional per-field validation rules, enforced client-side by CnFormPage before dispatch. See `$defs/fieldValidation` for the per-type semantics table."}}}},"steps":{"type":"array","minItems":1,"description":"manifest-form-logic: for type='form' pages, ordered multi-step wizard groups. Each entry is `{ id, title, description?, fields[] }` where `fields[]` is an ordered array of KEY REFERENCES into `config.fields[].key` — steps do not embed field objects (config.fields[] stays the single source of truth). Absent `steps` = single-step form, byte-for-byte the pre-change rendering. When present, validateManifestV2() post-schema requires: step ids unique within the page, every fields[] entry references a declared field key, and every declared field key appears in EXACTLY ONE step (complete partition — an unassigned field would silently never render; a doubly-assigned field would double-render).","items":{"type":"object","required":["id","title","fields"],"additionalProperties":false,"description":"One wizard step. `fields[]` order is the rendering order for that step's fields.","properties":{"id":{"type":"string","minLength":1,"description":"Unique step identifier within the page's `steps[]` array."},"title":{"type":"string","minLength":1,"description":"i18n key (or literal) for the step's title, shown in the step indicator."},"description":{"type":"string","description":"Optional i18n key (or literal) for a short step description/subtitle."},"fields":{"type":"array","minItems":1,"items":{"type":"string","minLength":1},"description":"Ordered field KEYS (referencing `config.fields[].key`) rendered on this step."}}}},"fieldWidgets":{"type":"array","description":"Declarative widget-component slots for type='form' / type='detail' pages. Each entry mounts a lib `Cn*` SFC inline (e.g. CnMarkdownEditor as a markdown field, CnSchemaSelect as a relation picker). Distinct from top-level pages[].widgets[] which uses widgetKey + grid coordinates against the host customComponents registry. Carries serialisable props only. See $defs/fieldWidget and ConductionNL/nextcloud-vue#314.","items":{"$ref":"#/$defs/fieldWidget"}},"columns":{"type":"array","description":"Table columns (for type='index' and type='logs'). Items may be strings (legacy shorthand) or column objects ({ key, label, sortable?, width?, formatter?, formatterOptions?, widget?, widgetProps?, format?, aggregate? }). `formatter` resolves against cnFormatters (built-ins incl. currency / conditionalPhrase — configured via `formatterOptions`); `widget` resolves against cnCellWidgets (built-ins incl. badge / fkResolve / link).","items":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]}},"folderSidebar":{"type":"object","additionalProperties":true,"description":"type='index': the opt-in folder navigation pane (CnFolderSidebar) rendered left of the list. Selecting a folder filters the list by `filterField` (or `field`); \"All\" clears it. Only the per-scope list-layout keys are typed here; the pane's own keys (source, register, schema, idField, nameField, folders, allLabel, title, allowCreate, ...) stay free-form. Maps to CnIndexPage `folderSidebar`.","properties":{"folders":{"type":"array","description":"Explicit folder list for source:'custom', and the place a folder declares its own list layout. Every other folder key stays free-form.","items":{"$ref":"#/$defs/folderSidebarScope"}}}},"layout":{"type":"array","description":"Dashboard layout entries (for type='dashboard', legacy). Carry-forward from v1.","items":{"type":"object","additionalProperties":true}},"content":{"type":"array","description":"Declarative content items for dashboard (widget-ref items). Carry-forward from v1.","items":{"type":"object","additionalProperties":true}},"widgets":{"type":"array","description":"Legacy dashboard widgets array in config (for type='dashboard'). In v2, prefer top-level pages[].widgets[] with the uniform widgetEntry shape. This legacy config.widgets key remains for back-compat.","items":{"type":"object","additionalProperties":true}},"headerActions":{"type":"array","description":"Page-level header actions rendered inside CnActionsBar's overflow dropdown (between the built-in Refresh action and the `#action-items` slot). On a `type:'detail'` page the same entries render in the header's Actions menu, above the Request-a-feature / Report-a-bug / Documentation trio. Same shape as the row-level `actions[]` ($ref action), but handlers receive NO row context — they are page-level. Reserved ids (`refresh`, `import`, `export`, `copy`, `delete`) are dropped at render time to avoid shadowing built-ins. See manifest-icons-and-page-actions for the dispatch semantics.","items":{"$ref":"#/$defs/action"}},"bulkActions":{"type":"array","description":"Bulk actions rendered in the contextual selection strip that appears while rows are selected. Same shape as the row-level `actions[]` ($ref action), but the handler receives the SELECTION rather than a row: `{ actionId, selectedIds, count }`. For `type: \"open-modal\"` the selection is merged into the modal's props as `selectedIds` and `count`, so a manifest-declared modal component can act on the selection without the page hand-writing anything. Reserved ids (`copy`, `delete`) are dropped at render time: the strip already ships both as built-ins. Before this existed the strip had only a `#selection-actions` slot, which only a hand-written host component could fill — so a page declared in a manifest could carry row actions and header actions but never a bulk one.","items":{"$ref":"#/$defs/action"}},"actions":{"type":"array","items":{"type":"object","required":["label"],"additionalProperties":true,"properties":{"label":{"type":"string","minLength":1}}},"description":"Declarative actions on a page. Governed ONLY by \"an object carrying a non-empty label\", deliberately: this key is polymorphic by page type (index rows dispatch $defs/action; detail pages also carry type='lifecycle-transition' entries), so one closed grammar here would reject working manifests. A label is what every dialect needs — CnRowActions renders an entry from its label and icon, so an entry without one became a full-height, clickable, EMPTY row in the overflow menu. Two shapes hit this, both meaning \"show the built-in\": a bare string (\"edit\") and a key-only object ({\"key\": \"edit\"}). Built-ins are enabled with config.actionToggles / the show*Action keys, never by naming them here."},"rowIndicators":{"type":"array","description":"type='index': state indicators the page declares for its rows. Each entry names a `field` (a dotted path on the row), a condition (`equals`, `in`, or plain truthiness when neither is given), an `icon` (a CnIcon name) and a `text` (the text alternative, required). An entry without `text` does not render, because an icon with no text is colour and shape alone. The page declares which indicators exist; a record cannot add one the page has not declared. Maps to CnIndexPage `rowIndicators`.","items":{"$ref":"#/$defs/rowIndicator"}},"rowIndicatorCap":{"type":"integer","minimum":0,"default":3,"description":"type='index': how many declared indicators render on the row itself before the rest move into the row menu. Maps to CnIndexPage `rowIndicatorCap`."},"quickEditFields":{"type":"array","items":{"type":"string","minLength":1},"description":"type='index': the fields a quick edit asks for, opened from a row without leaving the list. The page names them; a record cannot open a form on a field the page did not name. A field this caller may not write (see `writableField`) renders read-only rather than missing. Maps to CnIndexPage `quickEditFields`."},"writableField":{"type":"string","default":"@self.writableFields","description":"type='index': the dotted path where a record lists the fields this caller may write. A row carrying nothing there leaves every field the quick edit named editable; an empty list is a refusal and locks them all. Maps to CnIndexPage `writableField`."},"viewTabs":{"type":"array","items":{"type":"string","minLength":1},"description":"type='index': saved view ids this page renders as tabs instead of as entries in the views control. A view appears in one place or the other, never both. An id naming a view that no longer exists produces no tab, rather than a tab that opens nothing. Maps to CnIndexPage `viewTabs`."},"priorityField":{"type":"string","description":"type='index': the field carrying a record's DERIVED priority. The list reads the value and sorts on it; it never computes one. A record with no priority, or one outside `priorityLevels`, sorts after every ranked record in BOTH directions and stays in the list. Maps to CnIndexPage `priorityField`."},"priorityLevels":{"type":"array","items":{"type":"string","minLength":1},"description":"type='index': the priority values in rank order, lowest first (e.g. ['low', 'medium', 'high']). Needed because a priority does not sort alphabetically into the order a person means. Maps to CnIndexPage `priorityLevels`."},"listShortcuts":{"type":"boolean","default":false,"description":"type='index': offer the list's keyboard shortcuts. Every shortcut is also listed in the command palette and on the help key, from one catalogue, because a shortcut nobody can find does not count. Maps to CnIndexPage `listShortcuts`."},"rowActionField":{"type":"string","description":"type='index': the dotted path on each row where the server lists the actions this caller may run on that record (default '@self.actions'). A row's menu is then the intersection of what `config.actions` declares and what the server allows: an action the server allows but the page does not declare stays out, and an action the page declares but the server refuses stays out with its reason kept. A row carrying nothing at this path leaves the declaration standing. Maps to CnIndexPage `rowActionField`."},"editOpensDetail":{"type":"boolean","description":"type='index': send the Edit row action to the record's detail page instead of opening the edit modal. OPT-IN — CnPageRenderer used to set this wherever a type='detail' page or config.rowRoute existed, and it no longer does: @edit-open is bound to the same navigation as a row click, so a routed Edit just repeats the row click (the split pane, or the detail page) and the form is no longer reachable from the list. Declare true per page when the modal cannot express the record. Maps to CnIndexPage `editOpensDetail`."},"showEditAction":{"type":"boolean","description":"type='detail': show the header Edit button that opens the record's schema form. Set automatically by CnPageRenderer for every schema-bound detail page; declare false to make a detail page read-only. Maps to CnDetailPage `showEditAction`."},"formSize":{"type":"string","enum":["small","normal","large"],"default":"normal","description":"NcDialog size for the page's built-in Add/Edit form dialog (type='index' and type='detail'). A manifest `open-form` header action has always been able to ask for `large`; the built-in dialog could not, so the same app could have a roomy create form on one surface and a cramped one on another. Maps to CnIndexPage / CnDetailPage `formSize`."},"formColumns":{"type":"integer","enum":[1,2],"default":1,"description":"How many columns the page's built-in Add/Edit form flows its fields into. Pair 2 with formSize 'large', or the two columns are merely two narrow ones. CnFormDialog collapses back to one column below 700px, and a textarea or JSON editor spans both columns regardless. Maps to CnIndexPage / CnDetailPage `formColumns`."},"excludeFields":{"type":"array","items":{"type":"string"},"description":"Property names kept OUT of the page's built-in Add/Edit form dialog. Maps to CnIndexPage / CnDetailPage `excludeFields`."},"includeFields":{"type":"array","items":{"type":"string"},"description":"Property names the page's built-in Add/Edit form dialog shows, in this order — a whitelist, so anything absent is hidden regardless of excludeFields. Maps to CnIndexPage / CnDetailPage `includeFields`."},"fieldOverrides":{"type":"object","additionalProperties":true,"description":"Per-field overrides merged over the schema-derived field descriptors in the page's built-in Add/Edit form dialog (e.g. `{ \"description\": { \"widget\": \"textarea\" } }`). Which widget a field renders as belongs to the surface, not to the schema. Maps to CnIndexPage / CnDetailPage `fieldOverrides`."},"createDefaults":{"type":"object","additionalProperties":true,"description":"type='index': seed values for the page's built-in create dialog, never applied on edit. Resolves `@me`/`@now`/`@today` at any depth; `@object.*`/`@workspace.*`/`@config.*` need a context the page does not carry and pass through unchanged. Maps to CnIndexPage `createDefaults`."},"createSuccessRoute":{"oneOf":[{"type":"string"},{"type":"object","properties":{"name":{"type":"string"},"paramField":{"type":"string"},"objectParam":{"type":"string"}},"required":["name"],"additionalProperties":false}],"description":"type='index': route opened after a successful create from the page's built-in Add dialog; the created object's id is merged into the params. Maps to CnIndexPage `createSuccessRoute`."},"createSuccessMessage":{"type":"string","description":"type='index': toast shown after a successful create from the page's built-in Add dialog. Maps to CnIndexPage `createSuccessMessage`."},"savedViewsScope":{"type":"string","description":"type='index': which pages share this page's saved views. By default a view is shared by every page over the same register and schema and by no other, because a view is filters over one schema's fields. Set this to share views across pages over different sources, or to keep two pages over one source apart. Written into the saved view's `query.scope`; views saved before scoping stay visible everywhere. Maps to CnIndexPage `savedViewsScope`."},"splitCloseButton":{"type":"boolean","default":true,"description":"type='index': whether the split pane draws its own close link. Set false when a `#split-pane` slot draws one from the slot's `close`. Maps to CnIndexPage `splitCloseButton`."},"splitCloseLabel":{"type":"string","description":"type='index': accessible name and tooltip for the split pane's close button. Defaults to \"Close\". Maps to CnIndexPage `splitCloseLabel`."},"mapConfig":{"type":"object","additionalProperties":true,"description":"type='index': how rows are plotted when the Map view mode is available. Non-empty (and not excluded by an explicit viewModes) adds a Map segment to the view toggle. Maps to CnIndexPage `mapConfig`.","properties":{"latField":{"type":"string","description":"Object (or `@self`) property path holding the marker's latitude. Dotted paths are supported, e.g. `@self.geo.lat`."},"lngField":{"type":"string","description":"Object (or `@self`) property path holding the marker's longitude."},"geoField":{"type":"string","description":"Alternative single property holding a GeoJSON Point geometry (`{ type: 'Point', coordinates: [lng, lat] }`). Takes precedence over latField/lngField when present and resolvable."},"popupField":{"type":"string","description":"Object property rendered in the marker popup."},"center":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2,"description":"Fallback centre `[lat, lng]` when the filtered set has no plottable rows."},"clustering":{"type":"boolean","default":true,"description":"Whether coincident markers are grouped into a cluster that spiderfies on click. ON by default here — the opposite of CnMapWidget's own default — because an index map plots whatever the filter returns, and several rows at one address is the normal case: unclustered they land on identical pixels, the topmost takes every click and the rest are unreachable with nothing on screen saying they exist. Non-point geometry skips the cluster group, so areas are unaffected. Set false for the old behaviour."}}},"quickFilterMaxVisible":{"type":"integer","minimum":0,"default":0,"description":"type='index', chips mode: how many quickFilters render as pills before the rest move behind one more chip — a `⋯` pill that opens a panel of the hidden lenses, and that wears the label and the active fill of whichever one is on. 0 (the default) renders every lens, which wraps the actions bar onto a second line once a page declares more than a handful. The visible set is the FIRST n entries of quickFilters, so reorder that array to change which lenses stay out. Maps to CnIndexPage `quickFilterMaxVisible`."},"actionToggles":{"type":"object","description":"Built-in action toggles for type='index' pages. Each key is sugar for the matching CnIndexPage prop — manifest authors can hide built-in mass actions / row actions / the Add button without writing a wrapper. Mirrors the CnIndexPage prop names. Explicit config.<key> wins over config.actionToggles.<key> (matches the readOnly precedence rule). Distinct from config.actions[] which is the typed row-actions array.","additionalProperties":true,"properties":{"showAdd":{"type":"boolean","description":"Whether to show the Add button in the actions bar. Maps to CnIndexPage `showAdd`."},"showFormDialog":{"type":"boolean","description":"Whether the built-in create / edit form dialog is enabled. Maps to CnIndexPage `showFormDialog`."},"showEditAction":{"type":"boolean","description":"Whether to add an Edit action to row actions. Maps to CnIndexPage `showEditAction`."},"showCopyAction":{"type":"boolean","description":"Whether to add a Copy action to row actions. Maps to CnIndexPage `showCopyAction`."},"showDeleteAction":{"type":"boolean","description":"Whether to add a Delete action to row actions. Maps to CnIndexPage `showDeleteAction`."},"showMassImport":{"type":"boolean","description":"Whether to show the built-in mass Import action. Maps to CnIndexPage `showMassImport`."},"showMassExport":{"type":"boolean","description":"Whether to show the built-in mass Export action. Maps to CnIndexPage `showMassExport`."},"showMassCopy":{"type":"boolean","description":"Whether to show the built-in mass Copy button. Maps to CnIndexPage `showMassCopy`."},"showMassDelete":{"type":"boolean","description":"Whether to show the built-in mass Delete button. Maps to CnIndexPage `showMassDelete`."},"showViewToggle":{"type":"boolean","description":"Whether to show the table/cards view-mode toggle. Maps to CnIndexPage `showViewToggle`."},"selectable":{"type":"boolean","description":"Whether rows are selectable (driving the mass-action surface). Maps to CnIndexPage `selectable`."}}},"mode":{"type":"string","enum":["edit","create","public"],"description":"Authoring / access mode. type='form': 'edit' loads from `data`, 'create' starts blank, 'public' shows the public-form success banner and skips auth-state requirements. type='detail': 'public' marks the route as unauthenticated (token-scoped reader pages — pair with a route-param token via the @route.<param> sentinel). Maps to CnFormPage / CnDetailPage `mode` prop."},"subscribe":{"type":"boolean","default":true,"description":"Collaborative-editing default for type='detail'. When true (the default) CnDetailPage calls `objectStore.subscribe(objectType, objectId)` on mount via `useObjectSubscription` and unsubscribes on unmount. Set to false for read-only or archive views. Mirrors the `subscribe` Boolean prop on CnDetailPage / CnObjectSidebar. See the `collaborative-editing-defaults` capability."},"lock":{"type":"boolean","default":true,"description":"Collaborative-editing default for type='detail'. When true (the default) the page wires `useObjectLock` so the locked-by-other banner renders when a remote lock is active. Explicit lock acquire/release on the edit toggle is the v2 follow-up; at v1 this flag controls whether read-side `lockState` is wired. Mirrors the `lock` Boolean prop on CnDetailPage / CnObjectSidebar."}}},"sidebar":{"type":"object","description":"Per-page top-level sidebar visibility gate. Sibling of config, applies to every page type. show: boolean gates CnPageRenderer's #sidebar slot.","additionalProperties":true,"properties":{"show":{"type":"boolean","description":"Whether the host App's #sidebar slot renders for this page. Defaults to true."}}},"_note":{"type":"string","description":"Human-readable note. REQUIRED when type is 'custom' — must document why a standard page type was not feasible."}},"allOf":[{"description":"splitView, manualOrder, savedViewTree, board and dateAxis are index-page mechanics. splitView emits a second route beside an index route and mounts the detail pane inside CnIndexPage; manualOrder holds a per-user row order for a list. Declared on a detail, dashboard or custom page they would validate and then do nothing, which is the failure this branch refuses out loud (case-page-and-list-as-a-place).","if":{"not":{"properties":{"type":{"const":"index"}},"required":["type"]}},"then":{"not":{"anyOf":[{"required":["splitView"]},{"required":["manualOrder"]},{"required":["savedViewTree"]},{"required":["board"]},{"required":["dateAxis"]}]}}},{"description":"tabInAddress puts the active tab of a record in the address. Only a detail page has a record and a tab strip, so the key is refused elsewhere rather than validating into a no-op (case-page-and-list-as-a-place).","if":{"not":{"properties":{"type":{"const":"detail"}},"required":["type"]}},"then":{"not":{"required":["tabInAddress"]}}},{"description":"type='wiki' (CnWikiPage) renders one manifest-declared markdown article. It MUST declare both config.register and config.schema as non-empty strings so the manifest stays the source of truth for which OpenRegister register/schema the article body is read from (manifest-wiki-page-type).","if":{"properties":{"type":{"const":"wiki"}},"required":["type"]},"then":{"properties":{"config":{"type":"object","required":["register","schema"],"properties":{"register":{"type":"string","minLength":1},"schema":{"type":"string","minLength":1}}}},"required":["config"]}},{"description":"type='custom' requires _note documenting why decomposition into a standard page type was not feasible. Relaxed by ConductionNL/nextcloud-vue#315: when `component` matches the lib `Cn[A-Z]\\w+` pattern, the component name already documents the choice and _note is optional. When `component` is absent or non-Cn (host-app SFC), _note remains required.","if":{"properties":{"type":{"const":"custom"}},"required":["type"]},"then":{"if":{"properties":{"component":{"type":"string","pattern":"^Cn[A-Z]\\w+$"}},"required":["component"]},"then":{"description":"Lib-SFC custom page: component is self-documenting, _note is optional."},"else":{"description":"Host-app SFC custom page (or no component): _note is required to document why a standard page type was not feasible.","required":["_note"]}}}]},"visibleIfCondition":{"type":"object","description":"A visibleIf condition block. Each key is either a reserved specialised condition (appInstalled) or a dot-separated path into manifest.runtime. Values are predicate expressions (scalar for eq shorthand, or operator object). All conditions are combined with implicit AND.","additionalProperties":true,"properties":{"appInstalled":{"type":"string","minLength":1,"description":"Nextcloud app id that MUST be installed and enabled for this entry to render."}}},"deepLink":{"type":"object","additionalProperties":true,"required":["registerSlug","schemaSlug","urlTemplate"],"description":"ADR-040 object deep-link descriptor. Maps an OR register+schema to an in-app URL template so other apps / the integration registry can resolve a deep link to an object. Permissive: extra keys are tolerated for forward-compatibility.","properties":{"registerSlug":{"type":"string","description":"OR register slug the deep link targets."},"schemaSlug":{"type":"string","description":"OR schema slug the deep link targets."},"urlTemplate":{"type":"string","description":"In-app URL template; {uuid} (and other object placeholders) are substituted at resolve time."},"displayName":{"type":"string","description":"Human-readable label for the linked object type."}}},"adminSettingsEntry":{"type":"object","required":["id","label"],"additionalProperties":false,"oneOf":[{"required":["type"]},{"required":["component"]}],"description":"One admin-only settings section rendered by CnAppRoot's generic admin NcAppSettingsDialog, sorted into the dialog by `order`. Exactly one of `type` (a built-in section) or `component` (a custom section resolved from the renderer registry) MUST be present.","properties":{"id":{"type":"string","description":"Unique identifier for this admin-settings entry; also the rendered NcAppSettingsSection id."},"label":{"type":"string","description":"i18n translation key (English source) resolved by the consuming app's t() function, shown as the section header."},"type":{"type":"string","enum":["organisation-credentials"],"description":"Built-in admin-settings section. Closed enum. 'organisation-credentials' renders CnCredentials with scope=\"organisation\" (the OpenRegister credential broker's organisation-scope pane). Mutually exclusive with `component`."},"component":{"type":"string","description":"Registry key of a custom admin-settings section component, resolved from the CnAppRoot custom-components registry at render time. Mutually exclusive with `type`."},"order":{"type":"integer","description":"Sort order of this section within the admin dialog. Entries without an order render last, in array position."},"permission":{"type":"string","description":"Optional permission string that further narrows visibility of this section WITHIN the already owner-gated admin dialog, reusing the existing per-item permission grammar. Narrow-only: it can never widen access to a caller who is not an owner of the app."},"props":{"type":"object","additionalProperties":true,"description":"Props forwarded to a custom `component` entry. Ignored for built-in `type` entries."}}}}};const schema32 = {"type":"object","additionalProperties":false,"description":"Override for one of the four built-in support-note buttons (donate, support, feature-request, app-store). Every field is optional; omit the whole entry to keep the shell's default for that button.","properties":{"enabled":{"type":"boolean","description":"Show this button. Set false to hide it."},"label":{"type":"string","description":"Button text. Blank keeps the default label."},"url":{"type":"string","description":"Where the button goes. The feature-request and app-store buttons have no useful default, so an app that wants them must set this."},"variant":{"type":"string","enum":["primary","secondary","tertiary","error","warning","success"],"description":"NcButton variant."},"icon":{"type":"string","description":"Material Design Icon component name, e.g. HeartOutline."}}};const schema36 = {"type":"object","additionalProperties":false,"description":"The app's own defaults for the per-user options CnPersonalPreferences renders. The values a person chooses are stored in their Nextcloud preferences, never here; this block is only the bottom layer of the app default, administered value, personal value order.","properties":{"enabled":{"type":"boolean","default":true,"description":"Whether the personal layer applies at all. An administrator setting this false collapses it: the options render as unavailable with the reason, rather than being silently ignored."},"disabledReason":{"type":"string","description":"What to tell a person when the personal layer is off. Shown beside the unavailable options."},"landingPage":{"type":"string","description":"Page id the app opens on when a person has chosen nothing."},"dateDisplay":{"type":"string","enum":["absolute","relative"],"default":"absolute","description":"How dates read by default. A relative date always carries its absolute date in the accessible name and the tooltip, because a term read as '3 dagen geleden' hides the date the term runs to."},"rememberLastView":{"type":"boolean","default":false,"description":"Whether each list reopens in the view mode that person last used on it."},"pinnedMenu":{"type":"array","items":{"type":"string"},"description":"Menu ids pinned to the top of the navigation by default. A person may reorder and repin their own."}}};const schema38 = {"type":"object","additionalProperties":false,"required":["source","tokenSet"],"description":"A leaf app's NL Design token-set selection, as returned by nldesign's GET /api/token-sets catalogue (app-token-set-selection). Applied by CnAppRoot via useScopedTheme — the ONLY consumer; the backend does not read this field.","properties":{"source":{"type":"string","enum":["nldesign"],"description":"Theme provider. Closed to 'nldesign' — the only scoped-theme source this schema (and useScopedTheme) currently supports."},"tokenSet":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","description":"The nldesign token-set id (a GET /api/token-sets entry's `id`), kebab-case. Resolves the token CSS at css/tokens/<tokenSet>.css."},"tokenSetName":{"type":"string","description":"Optional human-readable name (the matching catalogue entry's `name`), cached at selection time so a picker can display it without a second catalogue fetch."},"preview":{"type":"object","additionalProperties":false,"description":"Optional cached swatch preview (the matching catalogue entry's theming colors), for a picker to render a preview chip without re-fetching the catalogue.","properties":{"primaryColor":{"type":"string","description":"Cached theming.primary_color from the catalogue entry."},"backgroundColor":{"type":"string","description":"Cached theming.background_color from the catalogue entry."}}}}};const schema81 = {"type":"object","required":["id","label"],"additionalProperties":false,"oneOf":[{"required":["type"]},{"required":["component"]}],"description":"One admin-only settings section rendered by CnAppRoot's generic admin NcAppSettingsDialog, sorted into the dialog by `order`. Exactly one of `type` (a built-in section) or `component` (a custom section resolved from the renderer registry) MUST be present.","properties":{"id":{"type":"string","description":"Unique identifier for this admin-settings entry; also the rendered NcAppSettingsSection id."},"label":{"type":"string","description":"i18n translation key (English source) resolved by the consuming app's t() function, shown as the section header."},"type":{"type":"string","enum":["organisation-credentials"],"description":"Built-in admin-settings section. Closed enum. 'organisation-credentials' renders CnCredentials with scope=\"organisation\" (the OpenRegister credential broker's organisation-scope pane). Mutually exclusive with `component`."},"component":{"type":"string","description":"Registry key of a custom admin-settings section component, resolved from the CnAppRoot custom-components registry at render time. Mutually exclusive with `type`."},"order":{"type":"integer","description":"Sort order of this section within the admin dialog. Entries without an order render last, in array position."},"permission":{"type":"string","description":"Optional permission string that further narrows visibility of this section WITHIN the already owner-gated admin dialog, reusing the existing per-item permission grammar. Narrow-only: it can never widen access to a caller who is not an owner of the app."},"props":{"type":"object","additionalProperties":true,"description":"Props forwarded to a custom `component` entry. Ignored for built-in `type` entries."}}};const schema82 = {"type":"object","additionalProperties":false,"description":"Health checks + metric descriptors executed by the AppHost engine.","properties":{"_note":{"type":"string","description":"Free-form note for maintainers; ignored by the engine."},"health":{"type":"object","additionalProperties":false,"description":"Declarative health checks rendered as the ADR-006 {status, app, version, checks} shape.","properties":{"statusCodePolicy":{"type":"string","enum":["adr006","always200"],"default":"adr006","description":"HTTP status-code policy. 'adr006' returns 503 on a failed critical check; 'always200' always returns 200."},"checks":{"type":"array","description":"Health check descriptors.","items":{"type":"object","additionalProperties":false,"required":["id","type"],"properties":{"id":{"type":"string","description":"Check id, surfaced as the key in the response's checks map."},"type":{"type":"string","enum":["database","filesystem","appEnabled","appConfig","orAvailable"],"description":"Engine check kind."},"severity":{"type":"string","enum":["critical","degraded"],"default":"critical","description":"critical → a failure flips status to error (503 under adr006); degraded → status degraded (200)."},"app":{"type":"string","description":"App id, for the appEnabled check."},"key":{"type":"string","description":"Config key, for the appConfig check."}}}},"cors":{"type":"boolean","default":false,"description":"ADR-040: when true the engine emits permissive CORS headers on the /api/health response."}}},"metrics":{"type":"array","description":"Prometheus metric descriptors. The {app}_ prefix, exposition format, and implicit {app}_info / {app}_up gauges are engine-owned.","items":{"type":"object","additionalProperties":false,"required":["name","type","source"],"properties":{"name":{"type":"string","description":"Metric name (without the {app}_ prefix the engine adds)."},"type":{"type":"string","enum":["gauge","counter"],"description":"Prometheus metric type."},"help":{"type":"string","description":"HELP text for the metric family."},"cacheTtl":{"type":"integer","minimum":0,"description":"ADR-040: optional per-metric cache TTL in seconds."},"source":{"type":"object","additionalProperties":false,"required":["kind"],"description":"Where the engine sources the value.","properties":{"kind":{"type":"string","enum":["tableCount","objectCount","objectSum","appConfig","provider"],"description":"Source kind. tableCount = COUNT over an allowlisted own-table; objectCount = OR objects by register/schema; appConfig = a numeric app-config value; provider = an IMetricsProvider implementation."},"table":{"type":"string","description":"tableCount: allowlisted [a-z0-9_] table name."},"register":{"type":"string","description":"objectCount: OR register slug."},"schema":{"type":"string","description":"objectCount / objectSum: OR schema slug."},"field":{"type":"string","description":"objectSum: the numeric object property to SUM."},"groupBy":{"type":"array","items":{"type":"string"},"description":"Columns to GROUP BY (one label per column)."},"labelMap":{"type":"object","additionalProperties":{"type":"string"},"description":"Rename a groupBy column to a different Prometheus label name."},"labelDefaults":{"type":"object","additionalProperties":{"type":["string","number","boolean"]},"description":"Default label value for NULL/empty group columns."},"filter":{"type":"object","additionalProperties":true,"description":"Per-column operator filters (eq/neq/lt/lte/gt/gte/like)."},"key":{"type":"string","description":"appConfig: the config key whose numeric value is the sample."},"id":{"type":"string","description":"provider: the IMetricsProvider id to invoke."}}}}}}}};const func1 = Object.prototype.hasOwnProperty;const formats0 = (function(){const NOT_URI_FRAGMENT = /\/|:/;const URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;return function uri(str) {
|
|
7
7
|
// http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "."
|
|
8
8
|
return NOT_URI_FRAGMENT.test(str) && URI.test(str);
|
|
9
|
-
};})();const pattern4 = new RegExp("^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$", "u");const pattern5 = new RegExp("^[a-z0-9]+(?:-[a-z0-9]+)*$", "u");const pattern27 = new RegExp("^[a-z0-9]+:[a-z0-9-]+$", "u");const pattern28 = new RegExp("^[a-z0-9_-]+\\.[a-zA-Z0-9_-]+\\.(search|get|create|update|delete)$", "u");const schema39 = {"type":"object","required":["id","label"],"additionalProperties":false,"description":"A top-level navigation entry. May contain one level of nested children.","properties":{"id":{"type":"string","description":"Unique identifier for this menu entry. Sentinels (@resolve:*) are NOT allowed — this is a router invariant."},"label":{"type":"string","description":"i18n translation key resolved by the consuming app's t() function at render time."},"icon":{"type":"string","description":"CSS class for the icon (e.g. 'icon-checkmark') or MDI component name."},"route":{"type":"string","description":"Vue-router route name (matches a pages[].id) that this entry navigates to. Sentinels (@resolve:*) are NOT allowed — this is a router invariant."},"query":{"type":"object","additionalProperties":{"type":["string","number","boolean"]},"description":"Optional vue-router query parameters merged into the target route link (e.g. a filter like { caseType: '<uuid>' }). Deep-links a nav entry to a pre-filtered index page."},"order":{"type":"integer","description":"Display order in the menu. Items without an order render last."},"permission":{"type":"string","description":"Permission string the user must hold for this entry to render."},"section":{"type":"string","enum":["main","footer","settings","integrations"],"default":"main","description":"Where the entry renders inside CnAppNav. 'main' (default) places it in the top list. 'footer' pins the entry to the bottom as a flat item above the settings foldout. 'settings' places it inside the NcAppNavigationSettings gear-icon foldout. 'integrations' renders the entry NOT in the navigation at all but in the Integrations section at the bottom of the per-user settings modal — the destination for links that leave this app for another (ADR-110). An 'integrations' entry MUST be clickable (href); a group with children is meaningless there."},"type":{"type":"string","enum":["item","caption"],"default":"item","description":"Render kind. 'item' (default) renders a clickable NcAppNavigationItem. 'caption' renders an NcAppNavigationCaption section divider — only label, id, order, and section are honoured."},"count":{"oneOf":[{"type":"integer","minimum":0},{"type":"string","enum":["auto"]}],"description":"Counter badge in the entry's #counter slot. Positive integer renders as-is; 'auto' resolves from cnMenuCounts (populated by CnAppRoot from useObjectStore totals) for the entry's resolved index-type page (register + schema)."},"pinned":{"type":"boolean","default":false,"description":"Forwarded to NcAppNavigationItem's pinned prop. NC bottom-pins pinned items inside the parent list region."},"open":{"type":"boolean","default":false,"description":"Initial expansion state for a parent entry with children. When true and children[] is non-empty, the parent renders with :open=\"true\" so children are visible on mount."},"href":{"type":"string","description":"External URL. When set, the entry opens the URL in a new tab instead of dispatching a vue-router navigation."},"action":{"type":"string","enum":["user-settings","admin-settings","replay-walkthrough"],"description":"Built-in action to invoke when the entry is clicked. Closed enum. 'admin-settings' opens the app-level admin-settings dialog (distinct from the per-user settings dialog). 'replay-walkthrough' re-runs the product walkthrough (ADR-043), optionally for a specific tourId."},"tourId":{"type":"string","description":"Tour id for the 'replay-walkthrough' action (ADR-043); replays that tour from its first step. Omit to replay the default tour."},"visibleIf":{"$ref":"#/$defs/visibleIfCondition","description":"Optional display condition evaluated at render time."},"dynamicSource":{"$ref":"#/$defs/dynamicSource","description":"Optional dynamic source for populating nested menu items from a data endpoint. Carry-forward from v1.3.0."},"children":{"type":"array","items":{"$ref":"#/$defs/menuItemLeaf"},"description":"Nested entries. Only one level of nesting is supported."}}};const schema41 = {"type":"object","description":"Dynamic source configuration for populating menu items from a backend endpoint. Carry-forward from v1.3.0 — identical shape to v1.","additionalProperties":true,"properties":{"url":{"type":"string","description":"URL to fetch menu items from."},"method":{"type":"string","enum":["GET","POST"],"default":"GET","description":"HTTP method for the fetch."},"labelField":{"type":"string","description":"Property name in the response items to use as the menu entry label."},"idField":{"type":"string","description":"Property name in the response items to use as the menu entry id."},"routeField":{"type":"string","description":"Property name in the response items to use as the menu entry route."}}};const func6 = ucs2length.default;const schema42 = {"type":"object","required":["id","label"],"additionalProperties":false,"description":"A nested menu entry. Has no further children.","properties":{"id":{"type":"string"},"label":{"type":"string"},"icon":{"type":"string"},"route":{"type":"string"},"query":{"type":"object","additionalProperties":{"type":["string","number","boolean"]},"description":"Optional vue-router query parameters merged into the target route link (e.g. a filter like { caseType: '<uuid>' }). Deep-links a nav entry to a pre-filtered index page."},"order":{"type":"integer"},"permission":{"type":"string"},"section":{"type":"string","enum":["main","footer","settings","integrations"],"default":"main"},"type":{"type":"string","enum":["item","caption"],"default":"item"},"count":{"oneOf":[{"type":"integer","minimum":0},{"type":"string","enum":["auto"]}]},"pinned":{"type":"boolean","default":false},"href":{"type":"string"},"action":{"type":"string","enum":["user-settings","admin-settings","replay-walkthrough"]},"tourId":{"type":"string","description":"Tour id for the 'replay-walkthrough' action (ADR-043)."},"visibleIf":{"$ref":"#/$defs/visibleIfCondition"}}};function validate22(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate22.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}if(data && typeof data == "object" && !Array.isArray(data)){if(data.section === undefined){data.section = "main";}if(data.type === undefined){data.type = "item";}if(data.pinned === undefined){data.pinned = false;}if(data.id === undefined){const err0 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}if(data.label === undefined){const err1 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}for(const key0 in data){if(!(func1.call(schema42.properties, key0))){const err2 = {instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}}if(data.id !== undefined){if(typeof data.id !== "string"){const err3 = {instancePath:instancePath+"/id",schemaPath:"#/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}}if(data.label !== undefined){if(typeof data.label !== "string"){const err4 = {instancePath:instancePath+"/label",schemaPath:"#/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}}if(data.icon !== undefined){if(typeof data.icon !== "string"){const err5 = {instancePath:instancePath+"/icon",schemaPath:"#/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}if(data.route !== undefined){if(typeof data.route !== "string"){const err6 = {instancePath:instancePath+"/route",schemaPath:"#/properties/route/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}}if(data.query !== undefined){let data4 = data.query;if(data4 && typeof data4 == "object" && !Array.isArray(data4)){for(const key1 in data4){let data5 = data4[key1];if(((typeof data5 !== "string") && (!(typeof data5 == "number"))) && (typeof data5 !== "boolean")){const err7 = {instancePath:instancePath+"/query/" + key1.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/properties/query/additionalProperties/type",keyword:"type",params:{type: schema42.properties.query.additionalProperties.type},message:"must be string,number,boolean"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}}}else {const err8 = {instancePath:instancePath+"/query",schemaPath:"#/properties/query/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}}if(data.order !== undefined){let data6 = data.order;if(!((typeof data6 == "number") && (!(data6 % 1) && !isNaN(data6)))){const err9 = {instancePath:instancePath+"/order",schemaPath:"#/properties/order/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}}if(data.permission !== undefined){if(typeof data.permission !== "string"){const err10 = {instancePath:instancePath+"/permission",schemaPath:"#/properties/permission/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}}let data8 = data.section;if(typeof data8 !== "string"){const err11 = {instancePath:instancePath+"/section",schemaPath:"#/properties/section/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}if(!((((data8 === "main") || (data8 === "footer")) || (data8 === "settings")) || (data8 === "integrations"))){const err12 = {instancePath:instancePath+"/section",schemaPath:"#/properties/section/enum",keyword:"enum",params:{allowedValues: schema42.properties.section.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}let data9 = data.type;if(typeof data9 !== "string"){const err13 = {instancePath:instancePath+"/type",schemaPath:"#/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}if(!((data9 === "item") || (data9 === "caption"))){const err14 = {instancePath:instancePath+"/type",schemaPath:"#/properties/type/enum",keyword:"enum",params:{allowedValues: schema42.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}if(data.count !== undefined){let data10 = data.count;const _errs24 = errors;let valid2 = false;let passing0 = null;const _errs25 = errors;if(!((typeof data10 == "number") && (!(data10 % 1) && !isNaN(data10)))){const err15 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/0/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}if(typeof data10 == "number"){if(data10 < 0 || isNaN(data10)){const err16 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/0/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err16];}else {vErrors.push(err16);}errors++;}}var _valid0 = _errs25 === errors;if(_valid0){valid2 = true;passing0 = 0;}const _errs27 = errors;if(typeof data10 !== "string"){const err17 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/1/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err17];}else {vErrors.push(err17);}errors++;}if(!(data10 === "auto")){const err18 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/1/enum",keyword:"enum",params:{allowedValues: schema42.properties.count.oneOf[1].enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err18];}else {vErrors.push(err18);}errors++;}var _valid0 = _errs27 === errors;if(_valid0 && valid2){valid2 = false;passing0 = [passing0, 1];}else {if(_valid0){valid2 = true;passing0 = 1;}}if(!valid2){const err19 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf",keyword:"oneOf",params:{passingSchemas: passing0},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err19];}else {vErrors.push(err19);}errors++;}else {errors = _errs24;if(vErrors !== null){if(_errs24){vErrors.length = _errs24;}else {vErrors = null;}}}}if(typeof data.pinned !== "boolean"){const err20 = {instancePath:instancePath+"/pinned",schemaPath:"#/properties/pinned/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err20];}else {vErrors.push(err20);}errors++;}if(data.href !== undefined){if(typeof data.href !== "string"){const err21 = {instancePath:instancePath+"/href",schemaPath:"#/properties/href/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err21];}else {vErrors.push(err21);}errors++;}}if(data.action !== undefined){let data13 = data.action;if(typeof data13 !== "string"){const err22 = {instancePath:instancePath+"/action",schemaPath:"#/properties/action/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err22];}else {vErrors.push(err22);}errors++;}if(!(((data13 === "user-settings") || (data13 === "admin-settings")) || (data13 === "replay-walkthrough"))){const err23 = {instancePath:instancePath+"/action",schemaPath:"#/properties/action/enum",keyword:"enum",params:{allowedValues: schema42.properties.action.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err23];}else {vErrors.push(err23);}errors++;}}if(data.tourId !== undefined){if(typeof data.tourId !== "string"){const err24 = {instancePath:instancePath+"/tourId",schemaPath:"#/properties/tourId/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err24];}else {vErrors.push(err24);}errors++;}}if(data.visibleIf !== undefined){let data15 = data.visibleIf;if(data15 && typeof data15 == "object" && !Array.isArray(data15)){if(data15.appInstalled !== undefined){let data16 = data15.appInstalled;if(typeof data16 === "string"){if(func6(data16) < 1){const err25 = {instancePath:instancePath+"/visibleIf/appInstalled",schemaPath:"#/$defs/visibleIfCondition/properties/appInstalled/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err25];}else {vErrors.push(err25);}errors++;}}else {const err26 = {instancePath:instancePath+"/visibleIf/appInstalled",schemaPath:"#/$defs/visibleIfCondition/properties/appInstalled/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err26];}else {vErrors.push(err26);}errors++;}}}else {const err27 = {instancePath:instancePath+"/visibleIf",schemaPath:"#/$defs/visibleIfCondition/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err27];}else {vErrors.push(err27);}errors++;}}}else {const err28 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err28];}else {vErrors.push(err28);}errors++;}validate22.errors = vErrors;return errors === 0;}validate22.evaluated = {"props":true,"dynamicProps":false,"dynamicItems":false};function validate21(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate21.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}if(data && typeof data == "object" && !Array.isArray(data)){if(data.section === undefined){data.section = "main";}if(data.type === undefined){data.type = "item";}if(data.pinned === undefined){data.pinned = false;}if(data.open === undefined){data.open = false;}if(data.id === undefined){const err0 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}if(data.label === undefined){const err1 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}for(const key0 in data){if(!(func1.call(schema39.properties, key0))){const err2 = {instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}}if(data.id !== undefined){if(typeof data.id !== "string"){const err3 = {instancePath:instancePath+"/id",schemaPath:"#/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}}if(data.label !== undefined){if(typeof data.label !== "string"){const err4 = {instancePath:instancePath+"/label",schemaPath:"#/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}}if(data.icon !== undefined){if(typeof data.icon !== "string"){const err5 = {instancePath:instancePath+"/icon",schemaPath:"#/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}if(data.route !== undefined){if(typeof data.route !== "string"){const err6 = {instancePath:instancePath+"/route",schemaPath:"#/properties/route/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}}if(data.query !== undefined){let data4 = data.query;if(data4 && typeof data4 == "object" && !Array.isArray(data4)){for(const key1 in data4){let data5 = data4[key1];if(((typeof data5 !== "string") && (!(typeof data5 == "number"))) && (typeof data5 !== "boolean")){const err7 = {instancePath:instancePath+"/query/" + key1.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/properties/query/additionalProperties/type",keyword:"type",params:{type: schema39.properties.query.additionalProperties.type},message:"must be string,number,boolean"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}}}else {const err8 = {instancePath:instancePath+"/query",schemaPath:"#/properties/query/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}}if(data.order !== undefined){let data6 = data.order;if(!((typeof data6 == "number") && (!(data6 % 1) && !isNaN(data6)))){const err9 = {instancePath:instancePath+"/order",schemaPath:"#/properties/order/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}}if(data.permission !== undefined){if(typeof data.permission !== "string"){const err10 = {instancePath:instancePath+"/permission",schemaPath:"#/properties/permission/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}}let data8 = data.section;if(typeof data8 !== "string"){const err11 = {instancePath:instancePath+"/section",schemaPath:"#/properties/section/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}if(!((((data8 === "main") || (data8 === "footer")) || (data8 === "settings")) || (data8 === "integrations"))){const err12 = {instancePath:instancePath+"/section",schemaPath:"#/properties/section/enum",keyword:"enum",params:{allowedValues: schema39.properties.section.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}let data9 = data.type;if(typeof data9 !== "string"){const err13 = {instancePath:instancePath+"/type",schemaPath:"#/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}if(!((data9 === "item") || (data9 === "caption"))){const err14 = {instancePath:instancePath+"/type",schemaPath:"#/properties/type/enum",keyword:"enum",params:{allowedValues: schema39.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}if(data.count !== undefined){let data10 = data.count;const _errs24 = errors;let valid2 = false;let passing0 = null;const _errs25 = errors;if(!((typeof data10 == "number") && (!(data10 % 1) && !isNaN(data10)))){const err15 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/0/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}if(typeof data10 == "number"){if(data10 < 0 || isNaN(data10)){const err16 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/0/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err16];}else {vErrors.push(err16);}errors++;}}var _valid0 = _errs25 === errors;if(_valid0){valid2 = true;passing0 = 0;}const _errs27 = errors;if(typeof data10 !== "string"){const err17 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/1/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err17];}else {vErrors.push(err17);}errors++;}if(!(data10 === "auto")){const err18 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/1/enum",keyword:"enum",params:{allowedValues: schema39.properties.count.oneOf[1].enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err18];}else {vErrors.push(err18);}errors++;}var _valid0 = _errs27 === errors;if(_valid0 && valid2){valid2 = false;passing0 = [passing0, 1];}else {if(_valid0){valid2 = true;passing0 = 1;}}if(!valid2){const err19 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf",keyword:"oneOf",params:{passingSchemas: passing0},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err19];}else {vErrors.push(err19);}errors++;}else {errors = _errs24;if(vErrors !== null){if(_errs24){vErrors.length = _errs24;}else {vErrors = null;}}}}if(typeof data.pinned !== "boolean"){const err20 = {instancePath:instancePath+"/pinned",schemaPath:"#/properties/pinned/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err20];}else {vErrors.push(err20);}errors++;}if(typeof data.open !== "boolean"){const err21 = {instancePath:instancePath+"/open",schemaPath:"#/properties/open/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err21];}else {vErrors.push(err21);}errors++;}if(data.href !== undefined){if(typeof data.href !== "string"){const err22 = {instancePath:instancePath+"/href",schemaPath:"#/properties/href/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err22];}else {vErrors.push(err22);}errors++;}}if(data.action !== undefined){let data14 = data.action;if(typeof data14 !== "string"){const err23 = {instancePath:instancePath+"/action",schemaPath:"#/properties/action/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err23];}else {vErrors.push(err23);}errors++;}if(!(((data14 === "user-settings") || (data14 === "admin-settings")) || (data14 === "replay-walkthrough"))){const err24 = {instancePath:instancePath+"/action",schemaPath:"#/properties/action/enum",keyword:"enum",params:{allowedValues: schema39.properties.action.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err24];}else {vErrors.push(err24);}errors++;}}if(data.tourId !== undefined){if(typeof data.tourId !== "string"){const err25 = {instancePath:instancePath+"/tourId",schemaPath:"#/properties/tourId/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err25];}else {vErrors.push(err25);}errors++;}}if(data.visibleIf !== undefined){let data16 = data.visibleIf;if(data16 && typeof data16 == "object" && !Array.isArray(data16)){if(data16.appInstalled !== undefined){let data17 = data16.appInstalled;if(typeof data17 === "string"){if(func6(data17) < 1){const err26 = {instancePath:instancePath+"/visibleIf/appInstalled",schemaPath:"#/$defs/visibleIfCondition/properties/appInstalled/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err26];}else {vErrors.push(err26);}errors++;}}else {const err27 = {instancePath:instancePath+"/visibleIf/appInstalled",schemaPath:"#/$defs/visibleIfCondition/properties/appInstalled/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err27];}else {vErrors.push(err27);}errors++;}}}else {const err28 = {instancePath:instancePath+"/visibleIf",schemaPath:"#/$defs/visibleIfCondition/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err28];}else {vErrors.push(err28);}errors++;}}if(data.dynamicSource !== undefined){let data18 = data.dynamicSource;if(data18 && typeof data18 == "object" && !Array.isArray(data18)){if(data18.method === undefined){data18.method = "GET";}if(data18.url !== undefined){if(typeof data18.url !== "string"){const err29 = {instancePath:instancePath+"/dynamicSource/url",schemaPath:"#/$defs/dynamicSource/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err29];}else {vErrors.push(err29);}errors++;}}let data20 = data18.method;if(typeof data20 !== "string"){const err30 = {instancePath:instancePath+"/dynamicSource/method",schemaPath:"#/$defs/dynamicSource/properties/method/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err30];}else {vErrors.push(err30);}errors++;}if(!((data20 === "GET") || (data20 === "POST"))){const err31 = {instancePath:instancePath+"/dynamicSource/method",schemaPath:"#/$defs/dynamicSource/properties/method/enum",keyword:"enum",params:{allowedValues: schema41.properties.method.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err31];}else {vErrors.push(err31);}errors++;}if(data18.labelField !== undefined){if(typeof data18.labelField !== "string"){const err32 = {instancePath:instancePath+"/dynamicSource/labelField",schemaPath:"#/$defs/dynamicSource/properties/labelField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err32];}else {vErrors.push(err32);}errors++;}}if(data18.idField !== undefined){if(typeof data18.idField !== "string"){const err33 = {instancePath:instancePath+"/dynamicSource/idField",schemaPath:"#/$defs/dynamicSource/properties/idField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err33];}else {vErrors.push(err33);}errors++;}}if(data18.routeField !== undefined){if(typeof data18.routeField !== "string"){const err34 = {instancePath:instancePath+"/dynamicSource/routeField",schemaPath:"#/$defs/dynamicSource/properties/routeField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err34];}else {vErrors.push(err34);}errors++;}}}else {const err35 = {instancePath:instancePath+"/dynamicSource",schemaPath:"#/$defs/dynamicSource/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err35];}else {vErrors.push(err35);}errors++;}}if(data.children !== undefined){let data24 = data.children;if(Array.isArray(data24)){const len0 = data24.length;for(let i0=0; i0<len0; i0++){if(!(validate22(data24[i0], {instancePath:instancePath+"/children/" + i0,parentData:data24,parentDataProperty:i0,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate22.errors : vErrors.concat(validate22.errors);errors = vErrors.length;}}}else {const err36 = {instancePath:instancePath+"/children",schemaPath:"#/properties/children/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err36];}else {vErrors.push(err36);}errors++;}}}else {const err37 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err37];}else {vErrors.push(err37);}errors++;}validate21.errors = vErrors;return errors === 0;}validate21.evaluated = {"props":true,"dynamicProps":false,"dynamicItems":false};const schema44 = {"type":"object","required":["id","route","type","title"],"additionalProperties":false,"description":"A v2 page definition. CnPageRenderer dispatches by type and matches by $route.name === page.id. All page types support a uniform widgets[] array for declarative slot placement. Sentinels (@resolve:*) are NOT allowed in id, route, component, headerComponent, actionsComponent, or slots.* — those are router and registry invariants.","properties":{"requiresApp":{"description":"Soft dependency gating this WHOLE page. When the named Nextcloud app is not installed, the page renders the missing-dependency screen instead of its body. This is for the DEEP LINK: an entry gated by visibleIf.appInstalled is already hidden from the menu, so the remaining ways in are a bookmark, a shared URL, a redirect or an e2e spec, and those otherwise land on an empty page where 'not installed' looks the same as 'no data'. Gate a single WIDGET with visibleIf.appInstalled instead: a detail page may carry many widgets where only one needs the app, and that widget should hide while the page renders normally.","oneOf":[{"type":"string","minLength":1},{"type":"object","required":["id"],"additionalProperties":false,"properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1,"description":"Human-readable app name shown on the screen; defaults to the id."}}}]},"id":{"type":"string","description":"Vue-router route name. MUST be unique across pages[]. Sentinels (@resolve:*) are NOT allowed."},"route":{"type":"string","description":"Path pattern (e.g. '/decisions', '/decisions/:id'). Sentinels (@resolve:*) are NOT allowed."},"type":{"type":"string","enum":["index","detail","dashboard","logs","settings","chat","files","form","map","roadmap","reports","store","search","wiki","flow","flows","flow-detail","custom"],"description":"Page type. Closed enum of 17 supported types. 'flow' opens ONE flow in the editor; the flow LIST is an ordinary 'index' with config.entitySource='flows'. 'flows' and 'flow-detail' are DEPRECATED aliases kept for migration — 'flows' predates named index sources and 'flow-detail' is the old name for 'flow'. 'roadmap' mounts CnFeaturesAndRoadmapPage (features + GitHub-issue-backed roadmap). 'search' mounts CnSearchPage (cross-schema query + facet sidebar + results list; consumers wire the actual search via @search). 'wiki' mounts CnWikiPage (manifest-declared markdown article + optional sidebar tree; MUST declare config.register + config.schema). 'flow' and the deprecated 'flow-detail' both mount CnFlowEditorPage (the shared node/edge canvas) and take config.app to scope to the owning app. A flow lives in OpenRegister's native flow store rather than a register/schema pair, so a single flow cannot be a 'detail' page — but the LIST is a plain 'index' once a named entitySource supplies it, which is why 'flows' is deprecated (ADR-110 Decision 4). 'custom' requires a _note field explaining why a standard type was not feasible."},"title":{"type":"string","description":"i18n translation key for the page title."},"permission":{"type":"string","description":"Optional permission identifier required to access this page."},"component":{"type":"string","description":"For type='custom': name resolved against the app-provided customComponents registry. Sentinels (@resolve:*) are NOT allowed."},"headerComponent":{"type":"string","description":"Optional registry name for a component injected into the page's #header slot. Sentinels (@resolve:*) are NOT allowed."},"actionsComponent":{"type":"string","description":"Optional registry name for a component injected into the page's #actions slot. Sentinels (@resolve:*) are NOT allowed."},"sidebarComponent":{"type":"string","minLength":1,"description":"Optional registry name for a component mounted as the default sidebar content for this page."},"slots":{"type":"object","description":"Generic slot-override map. Each key is a slot name; each value is a registry component name. Sentinels (@resolve:*) are NOT allowed in values.","additionalProperties":{"type":"string"}},"primaryAction":{"$ref":"#/$defs/primaryAction","description":"Active-page-scoped primary action rendered as an NcAppNavigationNew button above the menu list when the current route resolves to this page. Page-scoped declarations win over nav.primaryAction. Also the target of the detail page's skip link: a keyboard user tabs in, follows the link and lands on this action."},"splitView":{"$ref":"#/$defs/splitView","description":"Index pages only. Opens a row beside the list rather than instead of it, at the sibling route <route>/split/:id that buildManifestRoutes() emits. Refused on any other page type."},"board":{"$ref":"#/$defs/boardView","description":"Index pages only. The board view's configuration, handed to CnIndexPage as the `board` prop. The segment appears only when `viewModes` also lists `board`. Refused on any other page type."},"dateAxis":{"$ref":"#/$defs/dateAxisView","description":"Index pages only. The date-axis view's configuration, handed to CnIndexPage as the `dateAxis` prop. The segment appears only when `viewModes` also lists `dateAxis`. Refused on any other page type."},"savedViewTree":{"$ref":"#/$defs/savedViewTree","description":"Index pages only. Renders this page's saved views as a tree with labels, and declares the views that ship with the app. Refused on any other page type: a page with no saved-view dropdown has nothing to put in a tree."},"manualOrder":{"type":"boolean","default":false,"description":"Index pages only. Lets a person drag the rows into an order of their own, held per user and per list in their Nextcloud preferences and never written onto the records. Refused on any other page type."},"tabInAddress":{"type":"boolean","default":false,"description":"Detail pages only. Puts the active tab in the address as ?_tab=<id> so a link points at a tab of a record rather than at the record. The underscore prefix keeps it out of resolveQueryFilters(), which reads every other query key as a filter. Refused on any other page type."},"referencePreview":{"type":"boolean","default":false,"description":"Lets a reference on this page show a summary of the record it points at, on focus and on hover, without leaving the page. Rendered by CnReferencePreview."},"widgets":{"type":"array","items":{"$ref":"#/$defs/widgetEntry"},"description":"Uniform widget placement array. Available on ALL page types in v2 (not just dashboard). Each entry specifies a widget key, slot, and grid coordinates. The cross-field constraint gridX + gridWidth <= 12 is enforced by validateManifestV2() post-schema check. Single-widget dashboards: a type:'dashboard' page with exactly one body widget covering the full 12×12 grid whose widgetKey resolves to a custom (non-library-built-in) registry component is REJECTED — see ADR-036 Decision 1 (single-widget dashboard anti-pattern). Use type:'custom' with component:'<widgetKey>' or split into N>1 widgets instead. Library built-in widget keys are exempt from the rule; the exempt set is LIBRARY_WIDGET_KEYS in src/utils/libraryWidgetKeys.js, which is held to set equality against the BUILT_IN_WIDGETS registry and the dashboard widget catalog by tests/utils/libraryWidgetKeys.spec.js. It is not restated here, because an out-of-date second copy of that list is the defect this replaced. Enforced by validateManifestV2() post-schema check."},"actions":{"type":"array","items":{"$ref":"#/$defs/action"},"description":"Typed page-level actions with a discriminator. Each action has a type field (handler | open-modal | open-page | navigate) that defaults to 'handler' when omitted."},"config":{"type":"object","description":"Type-specific configuration. Shape varies by page type — see v1 schema for per-type config shapes (index, detail, dashboard, logs, settings, chat, files, form, map, custom). Config values under pages[].config may use the closed sentinel vocabulary (see $defs/sentinelTokenAny) — an out-of-vocabulary @-token FAILS validation via the sentinelGuardedValue allOf guard. Carry-forward from v1: register, schema, columns, actions, sidebar, sidebarProps, fields, sections, tabs, content, layout, widgets (dashboard only), cardComponent, columnGroups, etc.","additionalProperties":true,"allOf":[{"$ref":"#/$defs/sentinelGuardedValue"}],"properties":{"entitySource":{"type":"string","enum":["flows","tasks"],"description":"Name a registered NON-OBJECT entity collection for a type='index' page, instead of register+schema. Deliberately NOT called `source`: that key is already taken on page config and is polymorphic (a URL string in some manifests, an object with `params` in others), so reusing it would give one key two meanings and break six deployed shillinq pages. A flow definition is deliberately not an OpenRegister object, so an index had nothing to bind to and such lists became bespoke type='custom' pages. With a source the index loads the list itself. Takes precedence over register/schema; non-empty `objects` still wins over both. Registered sources live in src/composables/indexSources.js. `tasks` lists the viewer's task inbox from OpenRegister's flow-tasks read (cn-tasks-entity-source)."},"app":{"type":"string","description":"Scopes a named `entitySource` to one app (e.g. entitySource='flows' with app='dossiq' lists that app's flows)."},"register":{"type":"string","description":"OpenRegister register slug."},"schema":{"type":"string","description":"OpenRegister schema slug."},"contentField":{"type":"string","description":"type='wiki': property on the article object holding the markdown body. Defaults to 'body'. Maps to CnWikiPage `contentField` prop."},"titleField":{"type":"string","description":"type='wiki': property on the article object holding the page title. Defaults to 'title'. Maps to CnWikiPage `titleField` prop."},"idParam":{"type":"string","description":"type='wiki': $route.params key holding the article id. Defaults to 'id'. Maps to CnWikiPage `idParam` prop."},"treeField":{"type":"string","description":"type='wiki': property on each sidebar tree node holding its child array. Defaults to 'children'. Maps to CnWikiPage `treeField` prop."},"sidebarTitleField":{"type":"string","description":"type='wiki': property on each sidebar tree node holding its label. Defaults to `titleField`. Maps to CnWikiPage `sidebarTitleField` prop."},"sidebarRegister":{"type":"string","description":"type='wiki': register slug for the sidebar tree. Defaults to `register`. Maps to CnWikiPage `sidebarRegister` prop."},"sidebarSchema":{"type":"string","description":"type='wiki': schema slug providing the sidebar tree. When set AND `tree` is non-empty the sidebar renders. Maps to CnWikiPage `sidebarSchema` prop."},"emptyText":{"type":"string","description":"type='wiki': empty-state heading shown when the article is null. Maps to CnWikiPage `emptyText` prop."},"emptyDescription":{"type":"string","description":"type='wiki': empty-state description shown when the article is null. Maps to CnWikiPage `emptyDescription` prop."},"emptyBodyText":{"type":"string","description":"type='wiki': empty-body heading shown when the article has no content. Maps to CnWikiPage `emptyBodyText` prop."},"emptyBodyDescription":{"type":"string","description":"type='wiki': empty-body description shown when the article has no content. Maps to CnWikiPage `emptyBodyDescription` prop."},"cardComponent":{"type":"string","description":"Registry name for a custom card component on index pages. Carry-forward from v1.3.0."},"sidebar":{"description":"Sidebar configuration. For index: object with enabled, show, columnGroups[], facets, etc. For detail: boolean or object with show, enabled, register, schema, tabs[]. Carry-forward from v1.3.0.","oneOf":[{"type":"boolean"},{"type":"object","additionalProperties":true,"properties":{"show":{"type":"boolean","description":"Whether to show the sidebar on this page."},"enabled":{"type":"boolean","description":"Whether the sidebar is enabled."},"columnGroups":{"type":"array","description":"Index sidebar column-visibility groups. Carry-forward from v1.3.0.","items":{"type":"object","additionalProperties":true}}}}]},"tabs":{"type":"array","description":"Settings tabs (for type='settings'). Carry-forward from v1.3.0.","items":{"type":"object","additionalProperties":true}},"sidebarTabs":{"type":"array","description":"Sidebar tabs declaration for type='detail' pages. Each entry is the human-authored source of truth for one tab — `id` + `label` (required), optional `icon`, `order`, `component`. Widgets bound to a tab carry `tabGroup: \"<tab-id>\"` on `slot:\"sidebar\"` entries; cross-reference is validated. The CLI manifest-migrate transform lifts `config.sidebarTabs[].widgets[]` into top-level `widgets[]` with `slot:\"sidebar\"` + `tabGroup`; tab entries declaring only a `component` are carried forward as residual sidebarTabs[]. See src/cli/transforms/liftSidebarTabWidgets.js.","items":{"type":"object","additionalProperties":true,"required":["id","label"],"properties":{"id":{"type":"string","minLength":1,"description":"Unique tab identifier within the page. Referenced from widgets[].tabGroup."},"label":{"type":"string","minLength":1,"description":"i18n key (or literal) for the tab label."},"icon":{"type":"string","description":"Optional icon name (CSS class or MDI identifier) shown next to the label."},"order":{"type":"number","description":"Optional sort key for tab ordering; lower values render first."},"component":{"type":"string","description":"Optional registry name for a full-tab custom component. When set, the tab renders that component directly instead of the per-tab widgets[] grouping. Resolved against the customComponents registry."},"_note":{"type":"string","description":"Optional human note (e.g. lib-gap reason for an undecomposable tab)."}}}},"sections":{"type":"array","description":"Settings sections (for type='settings'). Carry-forward from v1.3.0.","items":{"type":"object","additionalProperties":true}},"fields":{"type":"array","description":"Form fields (for type='form'). Carry-forward from v1.3.0. manifest-form-logic adds two OPTIONAL typed properties — `visibleWhen` (reuses `$defs/visibleWhen`; LOCAL mode resolves `field` as a dot-path into the live form data) and `validation` (`$defs/fieldValidation`) — while every other carry-forward field shape (`key`, `label`, `type`, `enum`, `widget`, `help`, etc.) stays untyped via `additionalProperties: true` on the item.","items":{"type":"object","additionalProperties":true,"properties":{"visibleWhen":{"$ref":"#/$defs/visibleWhen","description":"manifest-form-logic: optional conditional-visibility predicate. LOCAL mode (neither `endpoint` nor `source`) resolves `field` as a dot-path into the live form data — the first dot-segment MUST match a declared `config.fields[].key` (validateManifestV2 post-schema check). `endpoint` / `source` modes keep their existing fail-safe, evaluated-once-at-mount semantics."},"validation":{"$ref":"#/$defs/fieldValidation","description":"manifest-form-logic: optional per-field validation rules, enforced client-side by CnFormPage before dispatch. See `$defs/fieldValidation` for the per-type semantics table."}}}},"steps":{"type":"array","minItems":1,"description":"manifest-form-logic: for type='form' pages, ordered multi-step wizard groups. Each entry is `{ id, title, description?, fields[] }` where `fields[]` is an ordered array of KEY REFERENCES into `config.fields[].key` — steps do not embed field objects (config.fields[] stays the single source of truth). Absent `steps` = single-step form, byte-for-byte the pre-change rendering. When present, validateManifestV2() post-schema requires: step ids unique within the page, every fields[] entry references a declared field key, and every declared field key appears in EXACTLY ONE step (complete partition — an unassigned field would silently never render; a doubly-assigned field would double-render).","items":{"type":"object","required":["id","title","fields"],"additionalProperties":false,"description":"One wizard step. `fields[]` order is the rendering order for that step's fields.","properties":{"id":{"type":"string","minLength":1,"description":"Unique step identifier within the page's `steps[]` array."},"title":{"type":"string","minLength":1,"description":"i18n key (or literal) for the step's title, shown in the step indicator."},"description":{"type":"string","description":"Optional i18n key (or literal) for a short step description/subtitle."},"fields":{"type":"array","minItems":1,"items":{"type":"string","minLength":1},"description":"Ordered field KEYS (referencing `config.fields[].key`) rendered on this step."}}}},"fieldWidgets":{"type":"array","description":"Declarative widget-component slots for type='form' / type='detail' pages. Each entry mounts a lib `Cn*` SFC inline (e.g. CnMarkdownEditor as a markdown field, CnSchemaSelect as a relation picker). Distinct from top-level pages[].widgets[] which uses widgetKey + grid coordinates against the host customComponents registry. Carries serialisable props only. See $defs/fieldWidget and ConductionNL/nextcloud-vue#314.","items":{"$ref":"#/$defs/fieldWidget"}},"columns":{"type":"array","description":"Table columns (for type='index' and type='logs'). Items may be strings (legacy shorthand) or column objects ({ key, label, sortable?, width?, formatter?, formatterOptions?, widget?, widgetProps?, format?, aggregate? }). `formatter` resolves against cnFormatters (built-ins incl. currency / conditionalPhrase — configured via `formatterOptions`); `widget` resolves against cnCellWidgets (built-ins incl. badge / fkResolve / link).","items":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]}},"folderSidebar":{"type":"object","additionalProperties":true,"description":"type='index': the opt-in folder navigation pane (CnFolderSidebar) rendered left of the list. Selecting a folder filters the list by `filterField` (or `field`); \"All\" clears it. Only the per-scope list-layout keys are typed here; the pane's own keys (source, register, schema, idField, nameField, folders, allLabel, title, allowCreate, ...) stay free-form. Maps to CnIndexPage `folderSidebar`.","properties":{"folders":{"type":"array","description":"Explicit folder list for source:'custom', and the place a folder declares its own list layout. Every other folder key stays free-form.","items":{"$ref":"#/$defs/folderSidebarScope"}}}},"layout":{"type":"array","description":"Dashboard layout entries (for type='dashboard', legacy). Carry-forward from v1.","items":{"type":"object","additionalProperties":true}},"content":{"type":"array","description":"Declarative content items for dashboard (widget-ref items). Carry-forward from v1.","items":{"type":"object","additionalProperties":true}},"widgets":{"type":"array","description":"Legacy dashboard widgets array in config (for type='dashboard'). In v2, prefer top-level pages[].widgets[] with the uniform widgetEntry shape. This legacy config.widgets key remains for back-compat.","items":{"type":"object","additionalProperties":true}},"headerActions":{"type":"array","description":"Page-level header actions rendered inside CnActionsBar's overflow dropdown (between the built-in Refresh action and the `#action-items` slot). On a `type:'detail'` page the same entries render in the header's Actions menu, above the Request-a-feature / Report-a-bug / Documentation trio. Same shape as the row-level `actions[]` ($ref action), but handlers receive NO row context — they are page-level. Reserved ids (`refresh`, `import`, `export`, `copy`, `delete`) are dropped at render time to avoid shadowing built-ins. See manifest-icons-and-page-actions for the dispatch semantics.","items":{"$ref":"#/$defs/action"}},"bulkActions":{"type":"array","description":"Bulk actions rendered in the contextual selection strip that appears while rows are selected. Same shape as the row-level `actions[]` ($ref action), but the handler receives the SELECTION rather than a row: `{ actionId, selectedIds, count }`. For `type: \"open-modal\"` the selection is merged into the modal's props as `selectedIds` and `count`, so a manifest-declared modal component can act on the selection without the page hand-writing anything. Reserved ids (`copy`, `delete`) are dropped at render time: the strip already ships both as built-ins. Before this existed the strip had only a `#selection-actions` slot, which only a hand-written host component could fill — so a page declared in a manifest could carry row actions and header actions but never a bulk one.","items":{"$ref":"#/$defs/action"}},"actions":{"type":"array","items":{"type":"object","required":["label"],"additionalProperties":true,"properties":{"label":{"type":"string","minLength":1}}},"description":"Declarative actions on a page. Governed ONLY by \"an object carrying a non-empty label\", deliberately: this key is polymorphic by page type (index rows dispatch $defs/action; detail pages also carry type='lifecycle-transition' entries), so one closed grammar here would reject working manifests. A label is what every dialect needs — CnRowActions renders an entry from its label and icon, so an entry without one became a full-height, clickable, EMPTY row in the overflow menu. Two shapes hit this, both meaning \"show the built-in\": a bare string (\"edit\") and a key-only object ({\"key\": \"edit\"}). Built-ins are enabled with config.actionToggles / the show*Action keys, never by naming them here."},"rowIndicators":{"type":"array","description":"type='index': state indicators the page declares for its rows. Each entry names a `field` (a dotted path on the row), a condition (`equals`, `in`, or plain truthiness when neither is given), an `icon` (a CnIcon name) and a `text` (the text alternative, required). An entry without `text` does not render, because an icon with no text is colour and shape alone. The page declares which indicators exist; a record cannot add one the page has not declared. Maps to CnIndexPage `rowIndicators`.","items":{"$ref":"#/$defs/rowIndicator"}},"rowIndicatorCap":{"type":"integer","minimum":0,"default":3,"description":"type='index': how many declared indicators render on the row itself before the rest move into the row menu. Maps to CnIndexPage `rowIndicatorCap`."},"quickEditFields":{"type":"array","items":{"type":"string","minLength":1},"description":"type='index': the fields a quick edit asks for, opened from a row without leaving the list. The page names them; a record cannot open a form on a field the page did not name. A field this caller may not write (see `writableField`) renders read-only rather than missing. Maps to CnIndexPage `quickEditFields`."},"writableField":{"type":"string","default":"@self.writableFields","description":"type='index': the dotted path where a record lists the fields this caller may write. A row carrying nothing there leaves every field the quick edit named editable; an empty list is a refusal and locks them all. Maps to CnIndexPage `writableField`."},"viewTabs":{"type":"array","items":{"type":"string","minLength":1},"description":"type='index': saved view ids this page renders as tabs instead of as entries in the views control. A view appears in one place or the other, never both. An id naming a view that no longer exists produces no tab, rather than a tab that opens nothing. Maps to CnIndexPage `viewTabs`."},"priorityField":{"type":"string","description":"type='index': the field carrying a record's DERIVED priority. The list reads the value and sorts on it; it never computes one. A record with no priority, or one outside `priorityLevels`, sorts after every ranked record in BOTH directions and stays in the list. Maps to CnIndexPage `priorityField`."},"priorityLevels":{"type":"array","items":{"type":"string","minLength":1},"description":"type='index': the priority values in rank order, lowest first (e.g. ['low', 'medium', 'high']). Needed because a priority does not sort alphabetically into the order a person means. Maps to CnIndexPage `priorityLevels`."},"listShortcuts":{"type":"boolean","default":false,"description":"type='index': offer the list's keyboard shortcuts. Every shortcut is also listed in the command palette and on the help key, from one catalogue, because a shortcut nobody can find does not count. Maps to CnIndexPage `listShortcuts`."},"rowActionField":{"type":"string","description":"type='index': the dotted path on each row where the server lists the actions this caller may run on that record (default '@self.actions'). A row's menu is then the intersection of what `config.actions` declares and what the server allows: an action the server allows but the page does not declare stays out, and an action the page declares but the server refuses stays out with its reason kept. A row carrying nothing at this path leaves the declaration standing. Maps to CnIndexPage `rowActionField`."},"editOpensDetail":{"type":"boolean","description":"type='index': send the Edit row action to the record's detail page instead of opening the edit modal. OPT-IN — CnPageRenderer used to set this wherever a type='detail' page or config.rowRoute existed, and it no longer does: @edit-open is bound to the same navigation as a row click, so a routed Edit just repeats the row click (the split pane, or the detail page) and the form is no longer reachable from the list. Declare true per page when the modal cannot express the record. Maps to CnIndexPage `editOpensDetail`."},"showEditAction":{"type":"boolean","description":"type='detail': show the header Edit button that opens the record's schema form. Set automatically by CnPageRenderer for every schema-bound detail page; declare false to make a detail page read-only. Maps to CnDetailPage `showEditAction`."},"formSize":{"type":"string","enum":["small","normal","large"],"default":"normal","description":"NcDialog size for the page's built-in Add/Edit form dialog (type='index' and type='detail'). A manifest `open-form` header action has always been able to ask for `large`; the built-in dialog could not, so the same app could have a roomy create form on one surface and a cramped one on another. Maps to CnIndexPage / CnDetailPage `formSize`."},"formColumns":{"type":"integer","enum":[1,2],"default":1,"description":"How many columns the page's built-in Add/Edit form flows its fields into. Pair 2 with formSize 'large', or the two columns are merely two narrow ones. CnFormDialog collapses back to one column below 700px, and a textarea or JSON editor spans both columns regardless. Maps to CnIndexPage / CnDetailPage `formColumns`."},"excludeFields":{"type":"array","items":{"type":"string"},"description":"Property names kept OUT of the page's built-in Add/Edit form dialog. Maps to CnIndexPage / CnDetailPage `excludeFields`."},"includeFields":{"type":"array","items":{"type":"string"},"description":"Property names the page's built-in Add/Edit form dialog shows, in this order — a whitelist, so anything absent is hidden regardless of excludeFields. Maps to CnIndexPage / CnDetailPage `includeFields`."},"fieldOverrides":{"type":"object","additionalProperties":true,"description":"Per-field overrides merged over the schema-derived field descriptors in the page's built-in Add/Edit form dialog (e.g. `{ \"description\": { \"widget\": \"textarea\" } }`). Which widget a field renders as belongs to the surface, not to the schema. Maps to CnIndexPage / CnDetailPage `fieldOverrides`."},"createDefaults":{"type":"object","additionalProperties":true,"description":"type='index': seed values for the page's built-in create dialog, never applied on edit. Resolves `@me`/`@now`/`@today` at any depth; `@object.*`/`@workspace.*`/`@config.*` need a context the page does not carry and pass through unchanged. Maps to CnIndexPage `createDefaults`."},"createSuccessRoute":{"oneOf":[{"type":"string"},{"type":"object","properties":{"name":{"type":"string"},"paramField":{"type":"string"},"objectParam":{"type":"string"}},"required":["name"],"additionalProperties":false}],"description":"type='index': route opened after a successful create from the page's built-in Add dialog; the created object's id is merged into the params. Maps to CnIndexPage `createSuccessRoute`."},"createSuccessMessage":{"type":"string","description":"type='index': toast shown after a successful create from the page's built-in Add dialog. Maps to CnIndexPage `createSuccessMessage`."},"savedViewsScope":{"type":"string","description":"type='index': which pages share this page's saved views. By default a view is shared by every page over the same register and schema and by no other, because a view is filters over one schema's fields. Set this to share views across pages over different sources, or to keep two pages over one source apart. Written into the saved view's `query.scope`; views saved before scoping stay visible everywhere. Maps to CnIndexPage `savedViewsScope`."},"splitCloseButton":{"type":"boolean","default":true,"description":"type='index': whether the split pane draws its own close link. Set false when a `#split-pane` slot draws one from the slot's `close`. Maps to CnIndexPage `splitCloseButton`."},"splitCloseLabel":{"type":"string","description":"type='index': accessible name and tooltip for the split pane's close button. Defaults to \"Close\". Maps to CnIndexPage `splitCloseLabel`."},"mapConfig":{"type":"object","additionalProperties":true,"description":"type='index': how rows are plotted when the Map view mode is available. Non-empty (and not excluded by an explicit viewModes) adds a Map segment to the view toggle. Maps to CnIndexPage `mapConfig`.","properties":{"latField":{"type":"string","description":"Object (or `@self`) property path holding the marker's latitude. Dotted paths are supported, e.g. `@self.geo.lat`."},"lngField":{"type":"string","description":"Object (or `@self`) property path holding the marker's longitude."},"geoField":{"type":"string","description":"Alternative single property holding a GeoJSON Point geometry (`{ type: 'Point', coordinates: [lng, lat] }`). Takes precedence over latField/lngField when present and resolvable."},"popupField":{"type":"string","description":"Object property rendered in the marker popup."},"center":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2,"description":"Fallback centre `[lat, lng]` when the filtered set has no plottable rows."},"clustering":{"type":"boolean","default":true,"description":"Whether coincident markers are grouped into a cluster that spiderfies on click. ON by default here — the opposite of CnMapWidget's own default — because an index map plots whatever the filter returns, and several rows at one address is the normal case: unclustered they land on identical pixels, the topmost takes every click and the rest are unreachable with nothing on screen saying they exist. Non-point geometry skips the cluster group, so areas are unaffected. Set false for the old behaviour."}}},"quickFilterMaxVisible":{"type":"integer","minimum":0,"default":0,"description":"type='index', chips mode: how many quickFilters render as pills before the rest move behind one more chip — a `⋯` pill that opens a panel of the hidden lenses, and that wears the label and the active fill of whichever one is on. 0 (the default) renders every lens, which wraps the actions bar onto a second line once a page declares more than a handful. The visible set is the FIRST n entries of quickFilters, so reorder that array to change which lenses stay out. Maps to CnIndexPage `quickFilterMaxVisible`."},"actionToggles":{"type":"object","description":"Built-in action toggles for type='index' pages. Each key is sugar for the matching CnIndexPage prop — manifest authors can hide built-in mass actions / row actions / the Add button without writing a wrapper. Mirrors the CnIndexPage prop names. Explicit config.<key> wins over config.actionToggles.<key> (matches the readOnly precedence rule). Distinct from config.actions[] which is the typed row-actions array.","additionalProperties":true,"properties":{"showAdd":{"type":"boolean","description":"Whether to show the Add button in the actions bar. Maps to CnIndexPage `showAdd`."},"showFormDialog":{"type":"boolean","description":"Whether the built-in create / edit form dialog is enabled. Maps to CnIndexPage `showFormDialog`."},"showEditAction":{"type":"boolean","description":"Whether to add an Edit action to row actions. Maps to CnIndexPage `showEditAction`."},"showCopyAction":{"type":"boolean","description":"Whether to add a Copy action to row actions. Maps to CnIndexPage `showCopyAction`."},"showDeleteAction":{"type":"boolean","description":"Whether to add a Delete action to row actions. Maps to CnIndexPage `showDeleteAction`."},"showMassImport":{"type":"boolean","description":"Whether to show the built-in mass Import action. Maps to CnIndexPage `showMassImport`."},"showMassExport":{"type":"boolean","description":"Whether to show the built-in mass Export action. Maps to CnIndexPage `showMassExport`."},"showMassCopy":{"type":"boolean","description":"Whether to show the built-in mass Copy button. Maps to CnIndexPage `showMassCopy`."},"showMassDelete":{"type":"boolean","description":"Whether to show the built-in mass Delete button. Maps to CnIndexPage `showMassDelete`."},"showViewToggle":{"type":"boolean","description":"Whether to show the table/cards view-mode toggle. Maps to CnIndexPage `showViewToggle`."},"selectable":{"type":"boolean","description":"Whether rows are selectable (driving the mass-action surface). Maps to CnIndexPage `selectable`."}}},"mode":{"type":"string","enum":["edit","create","public"],"description":"Authoring / access mode. type='form': 'edit' loads from `data`, 'create' starts blank, 'public' shows the public-form success banner and skips auth-state requirements. type='detail': 'public' marks the route as unauthenticated (token-scoped reader pages — pair with a route-param token via the @route.<param> sentinel). Maps to CnFormPage / CnDetailPage `mode` prop."},"subscribe":{"type":"boolean","default":true,"description":"Collaborative-editing default for type='detail'. When true (the default) CnDetailPage calls `objectStore.subscribe(objectType, objectId)` on mount via `useObjectSubscription` and unsubscribes on unmount. Set to false for read-only or archive views. Mirrors the `subscribe` Boolean prop on CnDetailPage / CnObjectSidebar. See the `collaborative-editing-defaults` capability."},"lock":{"type":"boolean","default":true,"description":"Collaborative-editing default for type='detail'. When true (the default) the page wires `useObjectLock` so the locked-by-other banner renders when a remote lock is active. Explicit lock acquire/release on the edit toggle is the v2 follow-up; at v1 this flag controls whether read-side `lockState` is wired. Mirrors the `lock` Boolean prop on CnDetailPage / CnObjectSidebar."}}},"sidebar":{"type":"object","description":"Per-page top-level sidebar visibility gate. Sibling of config, applies to every page type. show: boolean gates CnPageRenderer's #sidebar slot.","additionalProperties":true,"properties":{"show":{"type":"boolean","description":"Whether the host App's #sidebar slot renders for this page. Defaults to true."}}},"_note":{"type":"string","description":"Human-readable note. REQUIRED when type is 'custom' — must document why a standard page type was not feasible."}},"allOf":[{"description":"splitView, manualOrder, savedViewTree, board and dateAxis are index-page mechanics. splitView emits a second route beside an index route and mounts the detail pane inside CnIndexPage; manualOrder holds a per-user row order for a list. Declared on a detail, dashboard or custom page they would validate and then do nothing, which is the failure this branch refuses out loud (case-page-and-list-as-a-place).","if":{"not":{"properties":{"type":{"const":"index"}},"required":["type"]}},"then":{"not":{"anyOf":[{"required":["splitView"]},{"required":["manualOrder"]},{"required":["savedViewTree"]},{"required":["board"]},{"required":["dateAxis"]}]}}},{"description":"tabInAddress puts the active tab of a record in the address. Only a detail page has a record and a tab strip, so the key is refused elsewhere rather than validating into a no-op (case-page-and-list-as-a-place).","if":{"not":{"properties":{"type":{"const":"detail"}},"required":["type"]}},"then":{"not":{"required":["tabInAddress"]}}},{"description":"type='wiki' (CnWikiPage) renders one manifest-declared markdown article. It MUST declare both config.register and config.schema as non-empty strings so the manifest stays the source of truth for which OpenRegister register/schema the article body is read from (manifest-wiki-page-type).","if":{"properties":{"type":{"const":"wiki"}},"required":["type"]},"then":{"properties":{"config":{"type":"object","required":["register","schema"],"properties":{"register":{"type":"string","minLength":1},"schema":{"type":"string","minLength":1}}}},"required":["config"]}},{"description":"type='custom' requires _note documenting why decomposition into a standard page type was not feasible. Relaxed by ConductionNL/nextcloud-vue#315: when `component` matches the lib `Cn[A-Z]\\w+` pattern, the component name already documents the choice and _note is optional. When `component` is absent or non-Cn (host-app SFC), _note remains required.","if":{"properties":{"type":{"const":"custom"}},"required":["type"]},"then":{"if":{"properties":{"component":{"type":"string","pattern":"^Cn[A-Z]\\w+$"}},"required":["component"]},"then":{"description":"Lib-SFC custom page: component is self-documenting, _note is optional."},"else":{"description":"Host-app SFC custom page (or no component): _note is required to document why a standard page type was not feasible.","required":["_note"]}}}]};const schema49 = {"type":"object","additionalProperties":false,"description":"Saved views render as a tree rather than a flat list, carry labels, and may ship with the app. Two hundred personal views in one dropdown is the problem this solves. Index pages only, and only meaningful alongside allowSavedViews: without the dropdown there is no view to put in a tree. Absent, the page renders the flat dropdown it renders today. The view entity itself, its parent, its labels and its slug are OpenRegister's (saved-search-views); this key declares how this page presents them.","properties":{"enabled":{"type":"boolean","default":false,"description":"Whether this page renders its saved views as a tree. False reads as a page that considered it and declined, and renders exactly as a page that never named the key."},"maxDepth":{"type":"integer","minimum":1,"maximum":5,"default":3,"description":"How deep a parent chain may go. A bound rather than a taste: inheritance resolves by walking the chain, so an unbounded depth turns one render into an unbounded walk, and a person who can nest for ever will. Past the bound a save is refused naming the view, which is louder than a tree nobody can read."},"templates":{"type":"array","description":"What a new view may start from. A template presets the columns, the sort and the export field set, and the person may change each. Declare none and Save current view means what it has always meant: the list as it stands.","items":{"type":"object","additionalProperties":false,"required":["slug","name"],"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"name":{"type":"string"},"columns":{"type":"array","items":{"type":"string"}},"defaultSort":{"type":"string"},"exportFields":{"type":"array","items":{"type":"string"}}}}},"landingView":{"type":"object","additionalProperties":false,"description":"Which view a role opens this page on, as { role: slug }. A personal choice always wins and Reset returns here, so this is where somebody starts rather than where they are kept. A role's landing view changing mid-session applies on the next arrival: moving a reader's list out from under them is worse than a stale default.","patternProperties":{"^[A-Za-z0-9_.-]+$":{"type":"string"}}},"columnsPerRole":{"type":"object","additionalProperties":false,"description":"Which columns a role sees, as { role: [column] }. NARROWS index-columns-per-scope rather than replacing it: a role naming a column the scope does not offer gets nothing extra, because a per-role list that could add one would be a second, quieter way to put a field on screen the scope deliberately left off.","patternProperties":{"^[A-Za-z0-9_.-]+$":{"type":"array","items":{"type":"string"}}}},"groupBy":{"type":"string","description":"A field the list groups on, with a count per group. The counts are of the rows the list HOLDS, so on a paged list they are of the page and the surface says so; a second fetch per group is the cost this grouping exists to avoid."},"seeded":{"type":"array","description":"Views that ship with the app. They render as their own group above the user's own, and a user may copy one but not delete it: a view the product promises is not a view one person can remove from everybody's install.","items":{"type":"object","additionalProperties":false,"required":["slug","name"],"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$","description":"The stable name a dashboard widget, an export action or an API caller cites this view by. Lowercase and dash only, because it appears in an address and in a manifest somebody else writes. Required: a seeded view with no slug is a view nothing can call, which is most of the reason to seed it."},"name":{"type":"string","description":"What the view is called in the control. Translatable."},"label":{"type":"string","description":"One label this view carries, for the label filter. A view may carry none and stays reachable when no label filter is active."},"parent":{"type":"string","description":"The slug of the view this one hangs under. Omitted, it sits at the root of the seeded group."},"actions":{"type":"array","description":"The action ids this view offers, so a triage view offers three and not thirty. INTERSECTED with what the reader may run and never added to: a view declaring an action the reader has no right to does not grant it. Declare none and the view offers the page's actions, as today.","items":{"type":"string"},"uniqueItems":true},"inherits":{"type":"array","description":"Which parts this view takes from its parent. Each part resolves independently, so a child may narrow the criteria and keep the parent's columns. Declared on a view with no parent it is a contradiction and the validator refuses it: there is nothing to inherit from.","items":{"type":"string","enum":["criteria","columns","sorting","defaultSort","exportFields"]},"uniqueItems":true}},"allOf":[{"description":"inherits without a parent is a declaration that reads as configured and resolves to nothing. Refused here rather than silently ignored at render, which is the shape this whole change exists to stop.","if":{"required":["inherits"]},"then":{"required":["parent"]}}]}}}};const pattern6 = new RegExp("^Cn[A-Z]\\w+$", "u");const pattern7 = new RegExp("^[a-z0-9][a-z0-9-]*$", "u");const pattern8 = new RegExp("^[A-Za-z0-9_.-]+$", "u");const pattern25 = new RegExp("^[a-z][a-zA-Z0-9_-]*$", "u");const schema50 = {"type":"object","required":["widgetKey","slot","gridX","gridY","gridWidth","gridHeight"],"additionalProperties":false,"description":"A uniform widget placement entry used on every page type in v2. Replaces the v1 widgetDef + layoutItem pair with a single shape. Its props/dataSource/filter string leaves are guarded against the closed sentinel vocabulary via the sentinelGuardedValue allOf. The cross-field constraint gridX + gridWidth <= 12 CANNOT be expressed in JSON Schema (arithmetic over sibling fields) — it is documented here and enforced at runtime by validateManifestV2() as a post-schema check. Failure message: \"Widget '{widgetKey}' in slot '{slot}': gridX ({gridX}) + gridWidth ({gridWidth}) exceeds 12\".","properties":{"roles":{"type":"array","items":{"type":"string","minLength":1},"description":"Group ids that may see this widget. A DECLARATION THE HOST APP ENFORCES, not something this library evaluates: the check belongs on the read, where the figures are, because a widget hidden in the browser still had its data in the page payload (ADR-004). Pair it with `visibleWhen` pointing at an endpoint of the app's own, which IS evaluated here and collapses the cell when the fetch or the shape fails, so the declaration and the layout cannot disagree. Omitting it means every reader of the page sees the widget. Added because the key was expressible in the legacy `config.widgets[]` array, whose items are open, and refused here, so the same declaration validated on one page and was rejected on another.","examples":[["controllers","beheerders","admin"]]},"visibleWhen":{"$ref":"#/$defs/visibleWhen","description":"Render this widget only while the predicate holds. The same shape every other surface takes it in. It was already honoured at runtime for widgets (CnDashboardPage reads `def.visibleWhen`) and could not be declared in this shape, so a widget in the uniform entry had no way to express a visibility condition at all while one in the legacy array did."},"requiredApp":{"type":"string","minLength":1,"description":"Nextcloud app id this widget leans on — its data lives in that app's register, or its component comes from that app's integration leaf. When the app is absent the widget renders its normal chrome and a set-up state and issues NO request. Declared rather than inferred from content.register, because a register slug is not always the app id and a widget can depend on an app without querying it."},"id":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","description":"Optional stable, kebab-case identity for this widget entry. Used as the merge key under the `delta` merge mode (mergeManifestDelta keys widgets[] by id) so a stored delta can patch a single widget without resending the array. Omitting it keeps the entry valid; a delta simply cannot target it by key. Must be unique within a page's widgets[]."},"widgetKey":{"type":"string","description":"Registry key identifying the widget component. Resolved against the customComponents map passed to CnAppRoot at boot."},"slot":{"$ref":"#/$defs/slotValue","description":"Placement slot. Valid values: body, sidebar, header-actions, footer, modal (literals) or tab:<id> / section:<id> (pattern). Per-slot grid constraints are enforced via allOf/if-then below."},"gridX":{"type":"integer","minimum":0,"description":"0-based column start position. gridX + gridWidth MUST be <= 12 (enforced by post-schema check, not JSON Schema)."},"gridY":{"type":"integer","minimum":0,"description":"0-based row start position. For header-actions slot, MUST be 0 (enforced by allOf/if-then)."},"gridWidth":{"type":"integer","minimum":1,"maximum":24,"description":"Column span. For the default 12-column slots, 1-12. A page MAY widen a slot via config.slotColumns (up to the schema cap of 24); the real per-slot bound gridX + gridWidth <= resolvedColumns is enforced by the post-schema check, not JSON Schema. For sidebar slot, MUST be exactly 1 (enforced by allOf/if-then)."},"gridHeight":{"type":"integer","minimum":1,"description":"Row span (>= 1)."},"sizeToContent":{"type":["boolean","integer"],"minimum":1,"description":"Opt-in: hand this placement's height to whatever it renders, so a widget that decides AT RUNTIME it has nothing to show costs no row. `true` sizes purely to content; an integer is a row minimum. It makes gridHeight advisory for this widget — right for anything whose height is whatever it turned out to be (a banner whose condition is false, a list that came back empty), wrong for anything with a deliberate size. Maps to CnDashboardGrid's per-item `sizeToContent`."},"props":{"type":"object","description":"Optional widget-specific props passed at render time. Shape is widget-specific; not constrained here.","additionalProperties":true},"tabGroup":{"type":"string","description":"Optional: groups this widget into a named tab within the slot. Only meaningful for tab:* and section:* slots."},"dataSource":{"$ref":"#/$defs/dataSource","description":"Optional declarative data binding. Carry-forward from v1 widgetDef.dataSource — same shape."},"dateChip":{"type":"boolean","default":false,"description":"Opt-in (custom widgets only): when true AND the page's `dateRange.enabled` is true, the shared date-range chip renders in this widget's title bar (chart widgets with a `dataSource.bucket` get it automatically). Carry-forward from v1 layoutItem.dateChip — same semantics."},"_note":{"type":"string","description":"Human-readable note. Optional on most widgets. REQUIRED when the containing page has type 'custom' — in that case this field must document why a standard page type was not feasible."},"ncDashboard":{"type":"object","additionalProperties":false,"description":"Opt-in: also publish this placement as a widget on the native Nextcloud dashboard, alongside the app's own pages. An object rather than a boolean because a Nextcloud panel is a single narrow column with its own title, icon and link, none of which the grid placement carries. Presence of this key REQUIRES an `id` on the same entry (enforced in allOf below), and that id MUST be unique across the WHOLE manifest, not merely within its own page's widgets[] — Nextcloud's widget namespace is per app, so two pages both declaring id 'recent' derive one shared panel. Manifest-wide uniqueness is beyond JSON Schema; validateManifestV2 enforces it post-schema. Omitting the key leaves the widget visible only inside the app.","properties":{"title":{"type":"string","description":"Panel title on the Nextcloud dashboard. Falls back to the widget's own title when omitted."},"icon":{"type":"string","description":"MDI icon name (PascalCase), e.g. ViewDashboardOutline."},"order":{"type":"integer","description":"Initial ordering hint, passed through as IWidget::getOrder(). It decides where the panel first appears; once a user rearranges their own dashboard their arrangement wins, so this is a hint and never a guarantee."},"link":{"type":"string","pattern":"^(?![a-zA-Z][a-zA-Z0-9+.-]*:)(?!//)\\S+$","description":"In-app route the panel header links to, so a reader can open the page where the widget's full context lives. Written the way `pages[].route` is, e.g. '/reporting' — the host resolves it against its own app root with generateUrl() and never renders it bare. A scheme ('https:', and 'javascript:' above all) and a protocol-relative '//host' are both refused: the panel is rendered by Nextcloud's dashboard, outside this app's own pages, so a manifest is not a place to hand it an offsite destination."}}}},"allOf":[{"$ref":"#/$defs/sentinelGuardedValue"},{"description":"ncDashboard requires a stable id. The host derives a permanent Nextcloud widget id from `id`, and Nextcloud stores each user's chosen widgets by that id in its own namespace, which no migration of this app can reach. A widget identified by array position would move onto a different widget whenever the array is reordered, silently changing what a user sees. `id`'s own pattern already refuses an empty string, so requiring the key is the whole of the rule expressible here; the manifest-wide uniqueness half lives in validateManifestV2.","if":{"required":["ncDashboard"]},"then":{"required":["id"]}},{"description":"sidebar slot: gridWidth MUST equal 1. The sidebar is a fixed-width panel; widgets always span the full width.","if":{"properties":{"slot":{"const":"sidebar"}},"required":["slot"]},"then":{"properties":{"gridWidth":{"const":1}}}},{"description":"header-actions slot: gridY MUST equal 0. All header action widgets live in a single row.","if":{"properties":{"slot":{"const":"header-actions"}},"required":["slot"]},"then":{"properties":{"gridY":{"const":0}}}},{"description":"object-table built-in widget: when props declares a `source` it must match the declarative self-fetch shape, an `endpointSource` (Wave 2) must match the shared endpoint binding (exactly one of source | endpointSource — post-schema check), and `actions` must be typed manifest actions (incl. type:'object-op'). Other props stay free-form (pass-through to CnDataTable).","if":{"properties":{"widgetKey":{"const":"object-table"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"source":{"$ref":"#/$defs/objectTableSource"},"endpointSource":{"$ref":"#/$defs/endpointSource","description":"Wave 2 (#91): endpoint-bound rows — the payload at responsePath must be an array; columns / formatters / rowRoute / actions apply unchanged on top. Exactly one of source | endpointSource (post-schema check)."},"actions":{"type":"array","items":{"$ref":"#/$defs/action"},"description":"Declarative row/widget actions rendered by CnWidgetObjectTable. object-op patch/delete render per row; object-op create renders as a widget-scoped footer affordance."},"rowClass":{"type":"array","description":"#91: declarative per-row CSS class rules compiled into CnDataTable's rowClass function. Each rule { when: { field, op?, value }, class } adds `class` to a row when the shared visibleWhen predicate holds against that row (field = dot-path into the row, op = eq|neq|gt|gte|lt|lte default eq, value = literal). Rules evaluate in order and every matching class is space-joined — so overdue / at-risk rows can be highlighted from the manifest. A host-supplied rowClass FUNCTION (runtime-only) still passes straight through.","items":{"type":"object","additionalProperties":false,"required":["when","class"],"properties":{"when":{"type":"object","additionalProperties":false,"required":["field","value"],"description":"The predicate evaluated against the row (shared visibleWhen grammar, LOCAL form).","properties":{"field":{"type":"string","description":"Dot-path into the row."},"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte"],"default":"eq","description":"Comparison operator (default eq)."},"value":{"description":"Literal right-hand side of the comparison."}}},"class":{"type":"string","description":"CSS class added to the row when `when` holds."}}}}}}}}},{"description":"nav-card-grid built-in widget (ADR-044 §4 cards-collapse): props.entries is REQUIRED and each entry must match the navCardEntry shape. Unlike stats-block's optional entries[], nav-card-grid has no dataSource alternative — it renders arbitrary navigation links, not fetched data.","if":{"properties":{"widgetKey":{"const":"nav-card-grid"}},"required":["widgetKey"]},"then":{"required":["props"],"properties":{"props":{"type":"object","required":["entries"],"properties":{"entries":{"type":"array","items":{"$ref":"#/$defs/navCardEntry"},"description":"One card per array entry, rendered by CnNavCardGrid."}}}}}},{"description":"stats-block built-in widget: when props declares `entries[]` each entry must match the statsBlockEntry shape. The exactly-one-of dataSource | props.entries constraint is a cross-field rule enforced by validateManifestV2() as a post-schema check (clear error message), not by JSON Schema.","if":{"properties":{"widgetKey":{"const":"stats-block"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"entries":{"type":"array","items":{"$ref":"#/$defs/statsBlockEntry"},"description":"Multi-entry KPI sources — each entry renders one CnStatsBlock within the widget card. Mutually exclusive with a single dataSource."}}}}}},{"description":"banner built-in widget (CnBannerWidget, Wave 1): a declarative notice banner. props { variant, text, visibleWhen?, route? } — visibleWhen is a simple {endpoint|source, field?, op?, value} predicate evaluated at mount (fail-safe: hidden on fetch failure).","if":{"properties":{"widgetKey":{"const":"banner"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"variant":{"type":"string","enum":["info","warning","error","success"],"description":"Banner severity variant (NcNoteCard type). Default info."},"text":{"type":"string","description":"Pre-translated banner text (required for the banner to render)."},"visibleWhen":{"type":"object","additionalProperties":false,"description":"Optional visibility condition: exactly one of `endpoint` (same-origin JSON URL) or `source` (OpenRegister object query). `field` is a dot-path into the response (source: into the first result; omit or use '@total' for the collection total). Fail-safe: the banner stays hidden until the predicate evaluates true.","properties":{"endpoint":{"type":"string","description":"Same-origin URL returning JSON."},"source":{"type":"object","additionalProperties":false,"required":["register","schema"],"description":"OpenRegister object query; `filter` supports the shared @-token grammar.","properties":{"register":{"type":"string"},"schema":{"type":"string"},"filter":{"type":"object","additionalProperties":true}}},"field":{"type":"string","description":"Dot-path into the response ('@total' or omitted = collection total for a source)."},"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte"],"default":"eq","description":"Comparison operator."},"value":{"description":"Literal right-hand side of the comparison."}}},"route":{"description":"Optional click-through: a vue-router route NAME (string) or a full location object. Makes the banner text an accessible button.","oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]}}}}}},{"description":"audit-trail built-in widget (CnAuditTrailWidget, Wave 1): the object change-log card. All props are optional — register/schema/objectId normally arrive via the detail-page object-context merge; explicit props win.","if":{"properties":{"widgetKey":{"const":"audit-trail"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"register":{"type":"string","description":"OpenRegister register slug/id (context merge fallback when omitted)."},"schema":{"type":"string","description":"OpenRegister schema slug (context merge fallback when omitted)."},"objectId":{"type":"string","description":"The audited object's id (context merge fallback when omitted)."},"title":{"type":"string","description":"Optional card title override."},"maxDisplay":{"type":"integer","minimum":1,"description":"Maximum audit rows to render (default 5)."}}}}}},{"description":"chart widget display passthrough (Wave 1): additive presentation keys forwarded verbatim to CnChartWidget by CnDashboardPage's dispatcher and the v2 grid. Other chart props stay free-form.","if":{"properties":{"widgetKey":{"const":"chart"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"horizontal":{"type":"boolean","description":"Render type:'bar' charts horizontally (row bars)."},"legendPosition":{"type":"string","enum":["top","bottom","left","right"],"description":"Legend placement override (empty/omitted keeps the automatic placement)."},"valueAxisBaseline":{"type":"string","enum":["auto","zero","fit"],"description":"Value-axis baseline: 'auto' (the default — zero for bar/area, a bounded window for line/scatter), 'zero' (force a zero baseline), or 'fit' (let ApexCharts frame the data range, for a series living far from zero such as an SLA hovering 95–99%)."},"valueFormat":{"description":"Named value formatter applied to the value axis + tooltip: 'currency' | 'currency-compact' | 'percent', or the object form { name, currency?, decimals? }.","oneOf":[{"type":"string","enum":["currency","currency-compact","percent"]},{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","enum":["currency","currency-compact","percent"]},"currency":{"type":"string","description":"ISO-4217 code (EUR default; invalid codes fall back to EUR)."},"decimals":{"type":"integer","minimum":0,"description":"Fraction digits override."}}}]},"colorMap":{"type":"object","additionalProperties":{"type":"string"},"description":"Per-category colour map ({ categoryLabel: cssColor }) for pie/donut/radialBar slices and (distributed) bar categories."},"emptyLabel":{"type":"string","description":"Empty-state message rendered instead of the chart when the resolved series contain no data points."},"endpointSource":{"$ref":"#/$defs/chartEndpointSource","description":"Wave 2 (#91): endpoint-bound series/labels — the shared endpoint transport plus the labelsPath / series[] {name, path} response mapping. Exactly one of dataSource | endpointSource (post-schema check)."}}}}}},{"description":"header / text / divider on the v2 grid (Wave 1): the dashboard catalog's content-only presentation widgets reused as built-ins. Each takes a single `props.content` object with the same shape as its dashboard `content` blob.","if":{"properties":{"widgetKey":{"enum":["header","text","divider"]}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"content":{"type":"object","additionalProperties":true,"description":"The widget's content blob — header: { title, subtitle, backgroundImageUrl, overlayMode, height, cta, … }; text: { text, contentMode, fontSize, … }; divider: { style, lineColor, headingText, … }."}}}}}},{"description":"stat / delta catalog widgets on the v2 grid (Wave 2, #91): the KPI tiles take a `props.content` blob (same shape as their dashboard `content`). The endpoint-binding keys are typed here; the rest of the blob stays free-form (label, icon, format, source, …). Exactly one of content.source | content.endpointSource — a cross-field rule enforced by validateManifestV2() as a post-schema check (stats-block precedent), which also covers the legacy pages[].config.widgets[] placement.","if":{"properties":{"widgetKey":{"enum":["stat","delta"]}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"content":{"type":"object","additionalProperties":true,"properties":{"endpointSource":{"$ref":"#/$defs/endpointSource","description":"Wave 2 (#91): endpoint-bound KPI value(s) — exactly one of source | endpointSource (post-schema check)."},"valueField":{"type":"string","description":"Dot-path into the endpoint payload for the displayed (current) value. Omitted = the payload itself."},"previousField":{"type":"string","description":"Dot-path into the endpoint payload for the previous-period value — renders the trend sublabel (arrow + percent-vs-previous; the pipelinq previousPeriod contract)."},"deltaField":{"type":"string","description":"Dot-path into the endpoint payload for a SERVER-computed delta percent — wins over the client-side previousField computation."},"goodDirection":{"type":"string","enum":["up","down"],"default":"up","description":"Which trend direction tints green ('up' default; 'down' for cost-like KPIs). The delta widget's source.goodDirection still wins for the OpenRegister form."},"variantWhen":{"type":"array","description":"First-match threshold styling rules for the stat tile — the matched rule's variant re-tints the value + icon circle, and its optional icon overrides content.icon.","items":{"type":"object","required":["op","value","variant"],"additionalProperties":false,"properties":{"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte"],"description":"Comparison operator against the resolved display value (numeric when both sides coerce; eq/neq fall back to string equality)."},"value":{"description":"Literal right-hand side of the comparison."},"variant":{"type":"string","enum":["default","primary","success","warning","error"],"description":"Colour variant applied on match ('default' keeps the configured colours). The component also accepts 'danger' as an alias of 'error' for doriath-migrated content."},"icon":{"type":"string","description":"Optional MDI icon name overriding content.icon while this rule matches."}}}},"clickRoute":{"description":"Whole-tile click-through: a vue-router route NAME (string) or full location object. Alias of content.route (route wins when both are set).","oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]}}}}}}}},{"description":"workspace-filter catalog widget (#91 Wave 3): a choice list whose selection writes into the page workspace context so sibling widgets refetch. The endpoint/OR-source binding keys of `props.content` are typed here; the rest stays free-form.","if":{"properties":{"widgetKey":{"const":"workspace-filter"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"content":{"type":"object","additionalProperties":true,"properties":{"writes":{"type":"string","description":"The workspace context key the selection writes (`@workspace.<key>` or a bare `<key>`). Sibling widgets whose declarative source interpolates `@workspace.<key>` refetch on change."},"style":{"type":"string","enum":["radio","select"],"default":"radio","description":"Choice style: 'radio' (default) list or 'select' dropdown."},"allLabel":{"type":"string","description":"Optional leading 'All' option — writes the empty string so an optional sibling token (`@workspace.<key>?`) drops (unfiltered set)."},"showCounts":{"type":"boolean","default":true,"description":"Render per-option counts."},"options":{"type":"array","description":"Static options — each { value, label, count? } (or { id, name } / bare strings, normalised).","items":{"type":["object","string","number"]}},"source":{"type":"object","additionalProperties":true,"description":"OpenRegister /grouped facet source { register, schema, groupBy, filter? } — each distinct value becomes an option with its object count.","properties":{"register":{"type":"string"},"schema":{"type":"string"},"groupBy":{"type":"string"},"filter":{"type":"object","additionalProperties":true}}},"endpointSource":{"$ref":"#/$defs/endpointSource","description":"App endpoint returning an array of { value, label, count? } options at responsePath."}}}}}}}},{"description":"kb-search catalog widget (#91 Wave 3): summary-driven knowledge-base search through a PLUGGABLE PROVIDER. The provider seam keys of `props.content` are typed here; the rest stays free-form.","if":{"properties":{"widgetKey":{"const":"kb-search"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"content":{"type":"object","additionalProperties":true,"properties":{"provider":{"type":"string","description":"Provider registry key (default 'default' — the built-in endpoint search). An app registers bespoke providers (the xwiki proxy) on CnAppRoot's kbSearchProviders; the xwiki client stays app-side."},"space":{"type":"string","description":"Provider-specific KB space filter (passed to provider.search)."},"tags":{"description":"Provider-specific tag filter — a single tag or an array.","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"endpoint":{"type":"string","description":"The default provider's search endpoint (OpenRegister xWiki leaf by default)."},"queryParam":{"type":"string","description":"The default provider's query parameter name (default 'q')."},"bindTo":{"type":"string","description":"Workspace context key to auto-search on (default 'activeSummary')."},"minChars":{"type":"integer","minimum":0,"description":"Minimum characters before a search fires (default 3)."},"limit":{"type":"integer","minimum":1,"description":"Result cap passed to the provider (default 8)."},"externalOpen":{"type":"boolean","description":"Whether result links open in a new tab (defaults to the provider's own externalOpen flag)."},"unavailableFallback":{"type":"string","description":"Text shown when the provider rejects / is unavailable (replaces the default 'Knowledge base unavailable')."}}}}}}}}]};const schema62 = {"type":"object","required":["register","schema"],"additionalProperties":false,"description":"Declarative self-fetch source for the object-table built-in widget (CnWidgetObjectTable). The widget resolves `filter` @-tokens (@me, @today, @today±Nd, @workspace.*, ?-optional suffix) with the shared resolveFilterTokens grammar just before fetching, and drives CnDataTable's existing self-fetch. `register` MAY carry an `@resolve:` sentinel — the widget passes it through unexpanded (resolution is the host loader's responsibility). Externally supplied `rows` always win over `source`.","properties":{"register":{"type":"string","description":"OpenRegister register slug (or an `@resolve:<key>` sentinel, passed through unexpanded by the widget)."},"schema":{"type":"string","description":"OpenRegister schema slug."},"filter":{"type":"object","additionalProperties":true,"description":"Filter map (`{ field: value | value[] | { op: value | value[] } }`). Values may use the shared @-token grammar: `@me` (current user via @nextcloud/auth), `@now`, `@today`, relative-date arithmetic `@today±Nd` at day granularity (e.g. `@today-30d`, `@today+7d`), `@monthStart`/`@quarterStart`/`@yearStart`, `@objectId`/`@object.<field>` (detail context), `@workspace.<key>`/`@config.<key>` with a trailing `?` for optional clauses that drop when unresolved. IN-lists: an ARRAY value (directly, or via `{ in: [...] }`) matches any of its entries — tokens resolve item-by-item and the widget serializes the list as repeated `field[]` params (the shape OpenRegister parses)."},"order":{"type":"object","additionalProperties":{"type":"string","enum":["asc","desc"]},"description":"Fetch ordering: field name to direction map (e.g. { \"dueDate\": \"asc\" })."},"limit":{"type":"integer","minimum":0,"description":"Row cap. 0 (or omitted) shows all fetched rows; a positive value caps the rendered rows and enables the View-all footer when more rows exist."},"extend":{"type":"array","items":{"type":"string"},"description":"OpenRegister `_extend[]` values forwarded on the fetch (e.g. [\"calculations\"]) so read-time virtual/derived fields are hydrated and available as columns. Each entry is passed through verbatim."}}};const schema63 = {"type":"object","required":["url"],"additionalProperties":false,"description":"Wave 2 (#91): ONE coherent endpoint data binding shared by the stat / delta / object-table widgets (the chart uses the extended $defs/chartEndpointSource). Reads an arbitrary app REST endpoint through the library's useEndpointSource engine: params pass the SAME @-token grammar widget filters use (@me, @today±Nd, @monthStart, @workspace.<key>/@config.<key> with a trailing `?` for optional values that drop when unresolved — a REQUIRED token that stays unresolved blocks the fetch), requests dedupe + short-TTL cache per (method, url, resolved params), and the widget refetches on cn:page:refresh / a matching cn:widget:refresh. Exactly ONE of the widget's OpenRegister source | endpointSource may be configured — a cross-field rule enforced by validateManifestV2() as a post-schema check (clear error message), matching the stats-block precedent.","properties":{"url":{"type":"string","description":"Endpoint URL — app-relative (routed through generateUrl, e.g. '/apps/pipelinq/api/analytics/overview') or absolute (http/https, left untouched). May interpolate @page.<key> / @workspace.<key> / @config.<key> / @objectId / @object.<field> tokens inline; unresolved URL tokens collapse to an empty string."},"method":{"type":"string","enum":["GET","POST"],"default":"GET","description":"HTTP method. GET (default) sends the resolved params as query parameters; POST sends them as the JSON body."},"params":{"type":"object","additionalProperties":true,"description":"Request parameters. Values pass the shared filter-token grammar (resolveFilterTokens): @me, @now, @today, @today±Nd, @monthStart/@quarterStart/@yearStart, @objectId/@object.<field> (detail context), @workspace.<key>/@config.<key> with a trailing `?` for optional values (dropped when unresolved; e.g. `{ \"period\": \"@workspace.datePreset?\" }` rides the dashboard date-range pills). A required token that stays unresolved blocks the fetch until the page context provides it."},"responsePath":{"type":"string","description":"Dot-path pluck of the response payload (e.g. 'summary', 'data.series'). Omitted = the whole response body."}}};const schema69 = {"type":"object","required":["register","schema"],"additionalProperties":false,"description":"One KPI entry inside a multi-entry stats-block widget (CnStatsBlockWidget `entries[]`). Carries the same source contract as a type:'stat' widget: register + schema + metric + token-resolved filter (@today / @me / @workspace.* and ?-optional clauses), plus per-entry presentation (title, variant, countLabel), an optional route deep link, and hideWhenZero.","properties":{"title":{"type":"string","description":"KPI title rendered by the inner CnStatsBlock."},"register":{"type":"string","description":"OpenRegister register slug for this entry's count."},"schema":{"type":"string","description":"OpenRegister schema slug for this entry's count."},"metric":{"type":"string","description":"Aggregation metric for the REST /value aggregation (default 'count')."},"field":{"type":"string","description":"Field the metric aggregates over (metric-dependent; unused for count)."},"filter":{"type":"object","additionalProperties":true,"description":"Filter map with the shared @-token grammar (@today / @me / @workspace.<key>, trailing `?` for optional clauses)."},"route":{"type":"object","additionalProperties":true,"description":"Optional vue-router location for the KPI's deep link (renders the entry clickable)."},"variant":{"type":"string","enum":["default","primary","success","warning","error"],"description":"Color variant forwarded to the inner CnStatsBlock."},"countLabel":{"type":"string","description":"Label displayed next to the count."},"iconClass":{"type":"string","description":"Optional Nextcloud core icon class (icon-link, icon-mail, …) for the entry."},"hideWhenZero":{"type":"boolean","default":false,"description":"When true, the entry is omitted from the card when its resolved count is 0."}}};const schema70 = {"type":"object","required":["url"],"additionalProperties":false,"description":"The chart widget's endpoint binding: the $defs/endpointSource transport plus the labels/series response mapping. The mapping keys live INSIDE this block (not as sibling props) because the chart's flat `series` / `labels` props already carry the static data. When the plucked payload is an ARRAY of points (e.g. pipelinq /api/analytics/trends → responsePath 'series'), labelsPath / series[].path are PER-ITEM field paths (labelsPath 'date', series [{ name: 'Leads', path: 'value' }]); when it is an OBJECT they point at parallel arrays. Pie-family charts flatten the FIRST mapped series into the flat value array ApexCharts expects. Exactly ONE of dataSource | endpointSource per chart widget (post-schema check).","properties":{"url":{"type":"string","description":"Endpoint URL — app-relative (generateUrl) or absolute. Same token interpolation as $defs/endpointSource."},"method":{"type":"string","enum":["GET","POST"],"default":"GET","description":"HTTP method. GET (default) sends params as query parameters; POST as the JSON body."},"params":{"type":"object","additionalProperties":true,"description":"Request parameters — the shared filter-token grammar (see $defs/endpointSource.params). Params re-resolve and the chart refetches when the dashboard date range changes (the page publishes dateFrom / dateTo / datePreset into the workspace context)."},"responsePath":{"type":"string","description":"Dot-path pluck of the response payload. Omitted = the whole response body."},"labelsPath":{"type":"string","description":"Labels/categories mapping: a per-item field path for an ARRAY payload ('date'), or the path of a parallel label array for an OBJECT payload ('labels')."},"series":{"type":"array","description":"Series mapping — one entry per rendered series.","items":{"type":"object","required":["path"],"additionalProperties":false,"properties":{"name":{"type":"string","description":"Series display name (legend / tooltip). Defaults to the path."},"path":{"type":"string","description":"Value mapping: a per-item field path for an ARRAY payload ('value'), or the path of a parallel number array for an OBJECT payload ('totals')."}}}}}};const schema73 = {"description":"Valid slot value. Either a literal slot name (body, sidebar, header-actions, footer, modal) or a tab:<id> / section:<id> pattern string.","oneOf":[{"type":"string","enum":["body","sidebar","header-actions","footer","modal"],"description":"Literal slot name."},{"type":"string","pattern":"^(tab|section):.+","description":"Named tab or section slot. Format: tab:<id> or section:<id> where <id> is at least one character."}]};const schema74 = {"type":"object","description":"Declarative data binding for widgets. Forms: (a) shorthand {register, schema, filter?, aggregate: 'count'} — the lib builds a count query and resolves to {count}. (b) raw {graphql: {query, variables?, selectors}} — the lib issues the query and runs selectors. (c) #91 Wave 3 chart aggregation — `aggregate` as an OBJECT {groupBy, metric?: count|sum, sumField?, topN?, otherBucket?, labelResolve?} grouped over the schema's objects via OpenRegister's /grouped facet (client-side collection fallback), plus an optional sibling `drilldown` {route, filterParam}. Carry-forward from v1.3.0 widgetDef.dataSource.","additionalProperties":true,"properties":{"register":{"type":"string","description":"Shorthand: register slug."},"schema":{"type":"string","description":"Shorthand: schema slug."},"filter":{"type":"object","description":"Shorthand: filter map inlined into the generated query.","additionalProperties":true},"aggregate":{"description":"Shorthand aggregation. The STRING 'count' builds a GraphQL count query resolving to {count}. The OBJECT form (#91 Wave 3) is a chart-only categorical group-by served by OpenRegister's /grouped facet.","oneOf":[{"type":"string","enum":["count"]},{"type":"object","required":["groupBy"],"additionalProperties":false,"description":"#91 Wave 3 chart aggregation: group the schema's objects by `groupBy`, count (default) or sum `sumField`, keep the `topN` largest (sorted desc) and optionally fold the remainder into a translated 'Other' slice, resolving reference keys to labels/colours via `labelResolve`.","properties":{"groupBy":{"type":"string","description":"The categorical field grouped on."},"metric":{"type":"string","enum":["count","sum"],"default":"count","description":"count (default) | sum. sum requires sumField."},"sumField":{"type":"string","description":"Numeric field summed when metric is 'sum' (required for sum)."},"topN":{"type":"integer","minimum":1,"description":"Keep the N largest groups (sorted by value desc)."},"otherBucket":{"type":"boolean","description":"Fold the post-topN remainder into a single translated 'Other' slice (sum of the rest). The Other bucket never drilldown-navigates."},"labelResolve":{"type":"object","required":["schema"],"additionalProperties":false,"description":"Resolve reference (uuid) group keys to the referenced objects' display labels (and optional per-category colours) through the shared object store — the fkResolve pattern.","properties":{"register":{"type":"string","description":"Register the reference points into (defaults to the dataSource register)."},"schema":{"type":"string","description":"Schema slug the reference points into."},"labelField":{"type":"string","description":"Property used as the display label (default 'name')."},"colorField":{"type":"string","description":"Optional property read as a per-category CSS colour (feeds the chart's colorMap path)."}}}}}]},"drilldown":{"type":"object","required":["route","filterParam"],"additionalProperties":false,"description":"#91 Wave 3 (chart only): a segment/bar click navigates to `route` with the clicked category's RAW key in the query ({ [filterParam]: rawKey }). A `/`-prefixed route is a path, otherwise a route name. Works with the OBJECT `aggregate` and the legacy `groupBy` forms; the folded 'Other' bucket never navigates.","properties":{"route":{"type":"string","description":"Destination route name, or a path when it starts with '/'."},"filterParam":{"type":"string","description":"Query-param name the clicked category's raw key is written to."}}},"graphql":{"type":"object","description":"Raw GraphQL form.","additionalProperties":false,"required":["query","selectors"],"properties":{"query":{"type":"string","description":"GraphQL query document."},"variables":{"type":"object","description":"Variables map passed alongside query.","additionalProperties":true},"selectors":{"type":"object","description":"Map of result-prop name to dot-path selector.","additionalProperties":{"type":"string"}}}}}};const pattern13 = new RegExp("^@", "u");const pattern14 = new RegExp("^@(?:me|now|today|monthStart|quarterStart|yearStart)$|^@today[+-][0-9]+d$", "u");const pattern15 = new RegExp("^@resolve:[a-z][a-z0-9_-]*$|^@config\\.[A-Za-z][A-Za-z0-9_.]*\\??$", "u");const pattern16 = new RegExp("^@objectId$|^@object\\.[A-Za-z][A-Za-z0-9_]*$", "u");const pattern17 = new RegExp("^@workspace\\.[A-Za-z][A-Za-z0-9_]*\\??$", "u");const pattern18 = new RegExp("^@route\\.[A-Za-z][A-Za-z0-9_-]*$", "u");const pattern19 = new RegExp("^@self\\.[A-Za-z][A-Za-z0-9_]*$|^@ref:[A-Za-z][A-Za-z0-9_./-]*$|^@aggregate:.+$", "u");const pattern20 = new RegExp("^@total$", "u");const pattern21 = new RegExp("^@currentFiscalYear$|^@page\\.[A-Za-z][A-Za-z0-9_]*$|^@runtime(?:\\.[A-Za-z][A-Za-z0-9_]*)?$", "u");function validate29(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate29.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}const _errs1 = errors;let valid0 = false;const _errs2 = errors;if(typeof data === "string"){if(!pattern14.test(data)){const err0 = {instancePath,schemaPath:"#/$defs/sentinelFilterToken/pattern",keyword:"pattern",params:{pattern: "^@(?:me|now|today|monthStart|quarterStart|yearStart)$|^@today[+-][0-9]+d$"},message:"must match pattern \""+"^@(?:me|now|today|monthStart|quarterStart|yearStart)$|^@today[+-][0-9]+d$"+"\""};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}}else {const err1 = {instancePath,schemaPath:"#/$defs/sentinelFilterToken/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}var _valid0 = _errs2 === errors;valid0 = valid0 || _valid0;const _errs5 = errors;if(typeof data === "string"){if(!pattern15.test(data)){const err2 = {instancePath,schemaPath:"#/$defs/sentinelConfigToken/pattern",keyword:"pattern",params:{pattern: "^@resolve:[a-z][a-z0-9_-]*$|^@config\\.[A-Za-z][A-Za-z0-9_.]*\\??$"},message:"must match pattern \""+"^@resolve:[a-z][a-z0-9_-]*$|^@config\\.[A-Za-z][A-Za-z0-9_.]*\\??$"+"\""};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}}else {const err3 = {instancePath,schemaPath:"#/$defs/sentinelConfigToken/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}var _valid0 = _errs5 === errors;valid0 = valid0 || _valid0;const _errs8 = errors;if(typeof data === "string"){if(!pattern16.test(data)){const err4 = {instancePath,schemaPath:"#/$defs/sentinelObjectToken/pattern",keyword:"pattern",params:{pattern: "^@objectId$|^@object\\.[A-Za-z][A-Za-z0-9_]*$"},message:"must match pattern \""+"^@objectId$|^@object\\.[A-Za-z][A-Za-z0-9_]*$"+"\""};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}}else {const err5 = {instancePath,schemaPath:"#/$defs/sentinelObjectToken/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}var _valid0 = _errs8 === errors;valid0 = valid0 || _valid0;const _errs11 = errors;if(typeof data === "string"){if(!pattern17.test(data)){const err6 = {instancePath,schemaPath:"#/$defs/sentinelWorkspaceToken/pattern",keyword:"pattern",params:{pattern: "^@workspace\\.[A-Za-z][A-Za-z0-9_]*\\??$"},message:"must match pattern \""+"^@workspace\\.[A-Za-z][A-Za-z0-9_]*\\??$"+"\""};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}}else {const err7 = {instancePath,schemaPath:"#/$defs/sentinelWorkspaceToken/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}var _valid0 = _errs11 === errors;valid0 = valid0 || _valid0;const _errs14 = errors;if(typeof data === "string"){if(!pattern18.test(data)){const err8 = {instancePath,schemaPath:"#/$defs/sentinelRouteToken/pattern",keyword:"pattern",params:{pattern: "^@route\\.[A-Za-z][A-Za-z0-9_-]*$"},message:"must match pattern \""+"^@route\\.[A-Za-z][A-Za-z0-9_-]*$"+"\""};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}}else {const err9 = {instancePath,schemaPath:"#/$defs/sentinelRouteToken/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}var _valid0 = _errs14 === errors;valid0 = valid0 || _valid0;const _errs17 = errors;if(typeof data === "string"){if(!pattern19.test(data)){const err10 = {instancePath,schemaPath:"#/$defs/sentinelDeclarativeToken/pattern",keyword:"pattern",params:{pattern: "^@self\\.[A-Za-z][A-Za-z0-9_]*$|^@ref:[A-Za-z][A-Za-z0-9_./-]*$|^@aggregate:.+$"},message:"must match pattern \""+"^@self\\.[A-Za-z][A-Za-z0-9_]*$|^@ref:[A-Za-z][A-Za-z0-9_./-]*$|^@aggregate:.+$"+"\""};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}}else {const err11 = {instancePath,schemaPath:"#/$defs/sentinelDeclarativeToken/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}var _valid0 = _errs17 === errors;valid0 = valid0 || _valid0;const _errs20 = errors;if(typeof data === "string"){if(!pattern20.test(data)){const err12 = {instancePath,schemaPath:"#/$defs/sentinelVisibleWhenToken/pattern",keyword:"pattern",params:{pattern: "^@total$"},message:"must match pattern \""+"^@total$"+"\""};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}}else {const err13 = {instancePath,schemaPath:"#/$defs/sentinelVisibleWhenToken/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}var _valid0 = _errs20 === errors;valid0 = valid0 || _valid0;const _errs23 = errors;if(typeof data === "string"){if(!pattern21.test(data)){const err14 = {instancePath,schemaPath:"#/$defs/sentinelDeprecatedToken/pattern",keyword:"pattern",params:{pattern: "^@currentFiscalYear$|^@page\\.[A-Za-z][A-Za-z0-9_]*$|^@runtime(?:\\.[A-Za-z][A-Za-z0-9_]*)?$"},message:"must match pattern \""+"^@currentFiscalYear$|^@page\\.[A-Za-z][A-Za-z0-9_]*$|^@runtime(?:\\.[A-Za-z][A-Za-z0-9_]*)?$"+"\""};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}}else {const err15 = {instancePath,schemaPath:"#/$defs/sentinelDeprecatedToken/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}var _valid0 = _errs23 === errors;valid0 = valid0 || _valid0;if(!valid0){const err16 = {instancePath,schemaPath:"#/anyOf",keyword:"anyOf",params:{},message:"must match a schema in anyOf"};if(vErrors === null){vErrors = [err16];}else {vErrors.push(err16);}errors++;}else {errors = _errs1;if(vErrors !== null){if(_errs1){vErrors.length = _errs1;}else {vErrors = null;}}}validate29.errors = vErrors;return errors === 0;}validate29.evaluated = {"dynamicProps":false,"dynamicItems":false};function validate28(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate28.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}const _errs1 = errors;let valid0 = false;const _errs2 = errors;const _errs3 = errors;const _errs4 = errors;if(typeof data === "string"){if(!pattern13.test(data)){const err0 = {};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}}var valid1 = _errs4 === errors;if(valid1){const err1 = {instancePath,schemaPath:"#/anyOf/0/not",keyword:"not",params:{},message:"must NOT be valid"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}else {errors = _errs3;if(vErrors !== null){if(_errs3){vErrors.length = _errs3;}else {vErrors = null;}}}var _valid0 = _errs2 === errors;valid0 = valid0 || _valid0;const _errs5 = errors;if(!(validate29(data, {instancePath,parentData,parentDataProperty,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate29.errors : vErrors.concat(validate29.errors);errors = vErrors.length;}var _valid0 = _errs5 === errors;valid0 = valid0 || _valid0;if(!valid0){const err2 = {instancePath,schemaPath:"#/anyOf",keyword:"anyOf",params:{},message:"must match a schema in anyOf"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}else {errors = _errs1;if(vErrors !== null){if(_errs1){vErrors.length = _errs1;}else {vErrors = null;}}}validate28.errors = vErrors;return errors === 0;}validate28.evaluated = {"dynamicProps":false,"dynamicItems":false};const wrapper0 = {validate: validate27};function validate27(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate27.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}const _errs1 = errors;let valid0 = true;const _errs2 = errors;if(typeof data !== "string"){const err0 = {};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}var _valid0 = _errs2 === errors;errors = _errs1;if(vErrors !== null){if(_errs1){vErrors.length = _errs1;}else {vErrors = null;}}let ifClause0;if(_valid0){const _errs4 = errors;if(!(validate28(data, {instancePath,parentData,parentDataProperty,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate28.errors : vErrors.concat(validate28.errors);errors = vErrors.length;}var _valid0 = _errs4 === errors;valid0 = _valid0;ifClause0 = "then";}else {const _errs5 = errors;const _errs6 = errors;let valid1 = true;const _errs7 = errors;if(!(Array.isArray(data))){const err1 = {};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}var _valid1 = _errs7 === errors;errors = _errs6;if(vErrors !== null){if(_errs6){vErrors.length = _errs6;}else {vErrors = null;}}let ifClause1;if(_valid1){const _errs9 = errors;if(Array.isArray(data)){const len0 = data.length;for(let i0=0; i0<len0; i0++){if(!(wrapper0.validate(data[i0], {instancePath:instancePath+"/" + i0,parentData:data,parentDataProperty:i0,rootData,dynamicAnchors}))){vErrors = vErrors === null ? wrapper0.validate.errors : vErrors.concat(wrapper0.validate.errors);errors = vErrors.length;}}}var _valid1 = _errs9 === errors;valid1 = _valid1;if(valid1){var items1 = true;}ifClause1 = "then";}else {const _errs11 = errors;const _errs12 = errors;let valid4 = true;const _errs13 = errors;if(!(data && typeof data == "object" && !Array.isArray(data))){const err2 = {};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}var _valid2 = _errs13 === errors;errors = _errs12;if(vErrors !== null){if(_errs12){vErrors.length = _errs12;}else {vErrors = null;}}if(_valid2){const _errs15 = errors;if(data && typeof data == "object" && !Array.isArray(data)){for(const key0 in data){if(!(wrapper0.validate(data[key0], {instancePath:instancePath+"/" + key0.replace(/~/g, "~0").replace(/\//g, "~1"),parentData:data,parentDataProperty:key0,rootData,dynamicAnchors}))){vErrors = vErrors === null ? wrapper0.validate.errors : vErrors.concat(wrapper0.validate.errors);errors = vErrors.length;}}}var _valid2 = _errs15 === errors;valid4 = _valid2;if(valid4){var props2 = true;}}if(!valid4){const err3 = {instancePath,schemaPath:"#/else/else/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}var _valid1 = _errs11 === errors;valid1 = _valid1;ifClause1 = "else";}if(!valid1){const err4 = {instancePath,schemaPath:"#/else/if",keyword:"if",params:{failingKeyword: ifClause1},message:"must match \""+ifClause1+"\" schema"};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}var _valid0 = _errs5 === errors;valid0 = _valid0;ifClause0 = "else";}if(!valid0){const err5 = {instancePath,schemaPath:"#/if",keyword:"if",params:{failingKeyword: ifClause0},message:"must match \""+ifClause0+"\" schema"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}validate27.errors = vErrors;evaluated0.props = props2;evaluated0.items = items1;return errors === 0;}validate27.evaluated = {"dynamicProps":true,"dynamicItems":true};const schema64 = {"type":"object","required":["id","label"],"additionalProperties":false,"description":"A typed page action with a discriminator field. The type field determines behaviour: handler (registry function), open-modal (modal by id), open-page (named route), navigate (URL), object-op (declarative OpenRegister mutation via useObjectStore), export (opens the shared CnMassExportDialog export launcher), open-form (schema-driven create dialog — CnActionButtons), refresh (bumps the cn:page:refresh signal), api-call (POST/PUT an app endpoint + toast + refresh — CnActionButtons/dispatchAction), agent (run a governed hermiq agent), run-node (invoke one OpenRegister flow node against the page object, config collected via a dialog sourced from the node's own declared form — CnActionButtons/dispatchAction, or-flow-run-node; distinct from the UNRELATED setup-wizard step type of a similar name, 'run-action'), toggle (two-way state button — CnActionButtons only, NOT dispatchable). When type is omitted, it defaults to 'handler' (back-compatibility with v1.3.0 action declarations). The Ajv instance is compiled with useDefaults: true so the default is applied during validation.","properties":{"id":{"type":"string","description":"Unique action identifier within the page's actions array."},"label":{"type":"string","description":"i18n key resolved by the consuming app's t() function at render time."},"type":{"type":"string","enum":["handler","open-modal","open-page","navigate","object-op","export","open-form","refresh","api-call","agent","run-node","toggle"],"default":"handler","description":"Action behaviour discriminator. Defaults to 'handler' when omitted (back-compat with v1.3.0). handler: calls a registry function; open-modal: opens a modal by target id; open-page: navigates to a named route; navigate: navigates to a URL; object-op: dispatches a declarative mutation (patch | delete | create) of an OpenRegister object via the shared object store; export: opens the shared CnMassExportDialog export launcher configured via entities[]/formats[] — the confirm payload ({format, entity?}) routes to the action's `handler` in the manifest actions map (the app's export service does the download). open-form (#91 Wave 3): CnActionButtons opens a schema-driven create dialog (CnAdvancedFormDialog) for the action's register/schema, saves + toasts + refreshes + optionally navigates to onSuccessRoute. refresh (#91 Wave 3): bumps the page-level cn:page:refresh event-bus signal so every endpoint-bound widget refetches. api-call (#91 Wave 3): POST/PUT the token-interpolated url with payload/params (JSON body, payload resolves @-tokens recursively at any depth) + success/error toast + auto page-refresh (unless refresh:false); confirm gating is surface-consumed intent (object-op precedent); download:true requests a binary blob and triggers a browser file download instead (auto-refresh defaults to OFF in that mode). agent (hermiq#41): run a governed hermiq agent against the page object — POSTs { register, schema, objectId, resultField?, skill?, prompt? } to /apps/hermiq/api/agents/{agent}/run-on-object (object-RBAC-scoped; dispatches the governed AgentRunRequestedEvent). register/schema/objectId default to the page's @register/@schema/@objectId object context. A first-class companion to api-call (which remains the fallback for a bespoke body); hermiq is NOT hard-required — an app-level 404 surfaces a graceful 'agent runtime unavailable' toast. toggle (#91 Wave 3): a stateful two-way state button rendered by CnActionButtons (GET stateSource on mount, optimistic write on click) — NOT dispatchable through dispatchAction. object-op declares mutation INTENT only — authority is enforced server-side by OpenRegister RBAC (ADR-022/ADR-023); authorization-shaped fields have no client-side effect and are not accepted here."},"op":{"type":"string","enum":["patch","delete","create"],"description":"object-op only: the mutation verb. patch merges `values` into the row's object (row-scoped); delete removes the row's object (row-scoped, ALWAYS confirm-gated); create adds a new object built from `values` against the widget's source register/schema (widget-scoped footer/header affordance). Required when type is 'object-op'."},"values":{"type":"object","additionalProperties":true,"description":"object-op only: the verb's payload. For patch: the partial object merged over the row's object. For create: the new object's properties. Omitted for delete."},"confirm":{"type":"boolean","default":false,"description":"Confirm-gating (object-op + #91 Wave 3 api-call / open-form + agent): when true, the action presents a CnConfirmDialog before running (the dispatcher / CnActionButtons runs AFTER confirmation). object-op delete ALWAYS confirms regardless of this flag."},"target":{"type":"string","description":"Destination for open-modal (modal id), open-page (route name), or navigate (URL). Ignored for handler type."},"props":{"type":"object","description":"Additional props forwarded to the handler or modal.","additionalProperties":true},"createOverride":{"type":"string","description":"Registry handler name that owns the persist for an `open-form` action, replacing the default objectStore.saveObject. Resolved exactly as CnIndexPage resolves its own `createOverride` prop (a kind:'create-override' entry's `.handler`, a function-valued registry entry, or a function in the legacy customComponents map). Needed when the schema requires a field the create form cannot supply on its own — a server-minted foreign key, say — where a straight save would 400."},"includeFields":{"type":"array","items":{"type":"string"},"description":"open-form: the only fields the create dialog asks for. One schema often backs two surfaces, a detail page that edits all of it and a header button that collects what someone filing a new one types, and this is how the button says which it is. Omit for the whole schema."},"excludeFields":{"type":"array","items":{"type":"string"},"description":"open-form: fields the create dialog leaves out. Use it to drop a handful; use includeFields when it is easier to name what stays."},"fieldOverrides":{"type":"object","additionalProperties":true,"description":"open-form: per-field overrides passed to fieldsFromSchema, keyed by field. Recognised keys include label, order, hidden, readOnly and widget."},"advanced":{"type":"boolean","default":false,"description":"open-form: open the properties-and-JSON table (CnAdvancedFormDialog) instead of the plain form. The plain form is the default because a header button is aimed at someone filing a record, not at inspecting its schema."},"formTitle":{"type":"string","description":"open-form: overrides the create dialog's heading. Defaults to 'Create {schema title}'."},"size":{"type":"string","enum":["small","normal","large","full"],"default":"normal","description":"open-form: how wide the create dialog is, passed straight to NcDialog. Widen a form that asks enough questions to need scrolling; pair it with columns: 2."},"columns":{"type":"integer","enum":[1,2],"default":1,"description":"open-form: how many columns the fields flow into. 2 pairs them up, which halves the scrolling on a longer form. Textareas and JSON editors still span the full width, and the layout collapses to one column below 700px. Widen the dialog with size: 'large' as well, or two columns are merely two narrow ones."},"handler":{"type":"string","description":"Registry key for type: 'handler'. Resolved across both registries passed to CnAppRoot: a v2 `registry` entry of `kind: 'handler'` exposing the function as `.handler` (or `.fn`), a directly function-valued registry entry, or a function-valued entry in the deprecated `customComponents` map. The same resolution serves actions[], bulkActions[] and headerActions[]. Also the built-in dispatch verb when paired with `route` (handler: 'navigate' → $router.push to `route`)."},"route":{"type":"string","description":"Destination route name for handler: 'navigate'. The dispatcher (manifestActionDispatch) calls $router.push({ name: route, params }). For row-level actions params include { id: row[rowKey] } automatically — do NOT restate it as params: { id: \"{id}\" }, though that placeholder does resolve (see `params`). Page-level header actions navigate without row context (e.g. a 'New X' action to a detail route)."},"icon":{"type":"string","description":"Optional icon for the action, rendered by CnActionsBar. Either an MDI icon name (e.g. 'TextBoxOutline') or a CSS icon class (e.g. 'icon-file')."},"entities":{"type":"array","description":"export only: selectable entity types offered by the export launcher (e.g. Leads / Requests). Optional — when absent the dialog shows only the format picker. Each entry needs an id + pre-translated label.","items":{"type":"object","additionalProperties":false,"required":["id","label"],"properties":{"id":{"type":"string","description":"Entity id handed to the confirm handler."},"label":{"type":"string","description":"Pre-translated display label."}}}},"formats":{"type":"array","description":"export only: the offered export formats — bare ids ('excel', 'csv', 'json' — lifted to {id, label} with an upper-cased label) or full {id, label} entries. Optional — the dialog's built-in Excel/CSV defaults apply when absent.","items":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":false,"required":["id","label"],"properties":{"id":{"type":"string","description":"Format id handed to the confirm handler."},"label":{"type":"string","description":"Pre-translated display label."}}}]}},"description":{"type":"string","description":"export only: pre-translated description shown above the export launcher's pickers."},"url":{"type":"string","description":"api-call / toggle only: the app endpoint (POST/PUT). App-relative (routed through generateUrl) or absolute (http/https). May interpolate @objectId / @object.<field> / @workspace.<key> / @config.<key> tokens inline, as well as the literal {objectId} brace placeholder (unresolved tokens collapse to empty)."},"method":{"type":"string","enum":["POST","PUT"],"description":"api-call: HTTP method (default POST). toggle writeUrl: default PUT."},"payload":{"type":"object","additionalProperties":true,"description":"api-call only: the JSON request body — PREFERRED over `params`, and used instead of it when both are set. Values run the SAME token grammar as `params` (@me, @now, @today±Nd, @monthStart/@quarterStart/@yearStart, @objectId, @object.<field>, @workspace.<key>/@config.<key> with a trailing `?` marking a value OPTIONAL — dropped when unresolved) but resolve RECURSIVELY at ANY nesting depth, including arrays of objects — e.g. a Filinq document-generation body: { \"dataRefs\": [{ \"register\": \"crm\", \"schema\": \"lead\", \"id\": \"@objectId\" }] }. A required (non-`?`) token left unresolved anywhere in the tree BLOCKS the call (error toast) instead of sending the literal token string to the server."},"params":{"type":"object","additionalProperties":true,"description":"Two distinct uses depending on the action's dispatch. (1) api-call / toggle: the JSON request body (legacy — prefer `payload` for anything with nested objects/arrays; ignored when `payload` is set). Values run the shared filter-token grammar ONE level deep (@me, @today±Nd, @workspace.<key>/@config.<key> with a trailing `?` for optional values dropped when unresolved; a required unresolved token skips the call). (2) handler: 'navigate' (index-page row actions, manifestActionDispatch): vue-router params merged OVER the default { id: row[rowKey] }. OMIT it for the ordinary 'open this row's detail page' action — the row id is already injected. String values run the `{field}` ROW-token grammar (NOT the @-token grammar): \"{id}\" resolves to row.id with its type preserved, \"run-{id}\" interpolates as text, and a brace-less \"new\" stays literal (that is what makes a 'New X' action navigate with { id: 'new' }). A token naming a field the row does not carry is dropped with a console.warn — so `id` falls back to the row id — instead of being pushed as a literal %7Bid%7D path segment."},"download":{"type":"boolean","default":false,"description":"api-call only: request the response as a binary blob (axios responseType 'blob') and trigger a browser file download instead of a JSON toast+refresh cycle. The filename is taken from the response's Content-Disposition header, else the token-resolved `filename`, else 'download.pdf'. The success toast still shows; unlike a normal api-call the page does NOT auto-refresh afterwards unless `refresh: true` is explicitly set."},"filename":{"type":"string","description":"api-call `download: true` only: fallback filename used when the response carries no Content-Disposition header (falls back further to 'download.pdf'). Interpolates the same token grammar as `url` (@objectId, @object.<field>, @workspace.<key>, @config.<key>, {objectId})."},"successMessage":{"type":"string","description":"api-call / open-form / agent / run-node / toggle: pre-translated success toast text (a library default applies when absent; agent default 'Run queued')."},"errorMessage":{"type":"string","description":"api-call / agent / run-node / toggle: pre-translated error toast text (falls back to the server's error/message, then a library default; an agent 404 with no structured body toasts 'agent runtime unavailable' instead)."},"refresh":{"type":"boolean","default":true,"description":"api-call / agent / run-node / toggle: bump the page-level cn:page:refresh signal after a successful call (default true; set false to skip). EXCEPTION: for an api-call with download:true the default flips to false — a file download normally shouldn't also force-refetch every widget — set refresh:true explicitly to opt back in."},"flowId":{"type":"string","description":"run-node only (REQUIRED): the published flow's uuid whose node this action invokes. A node's config and eligibility are properties of the flow it lives in (RN-3, OpenRegister's or-flow-run-node), so the manifest names which flow's instance to call rather than a bare node type — two flows could each carry the same node TYPE wired differently."},"nodeId":{"type":"string","description":"run-node only (REQUIRED): the id of the node, within flowId's published graph, to invoke directly. POSTed to /api/flows/{flowId}/nodes/{nodeId}/run — refused (404) unless that node type has opted in to direct invocation (IFlowDirectlyInvokable)."},"subject":{"type":"string","description":"run-node only: the subject object the node acts on and is authorized against (OpenRegister object-RBAC — the caller needs update permission on it; the flow's own flow.run right is deliberately NOT what gates this). Typically @objectId; may interpolate the shared @-token grammar. An unresolved required token BLOCKS the call, matching agent's objectId."},"agent":{"type":"string","description":"agent only (REQUIRED): the hermiq agent uuid to run against the page object. POSTed to /apps/hermiq/api/agents/{agent}/run-on-object (hermiq#41) — object-RBAC-scoped, dispatches the governed AgentRunRequestedEvent. May interpolate the shared @-token grammar (@objectId, @object.<field>, @workspace.<key>, @config.<key>)."},"skill":{"type":"string","description":"agent only: optional skill id folded into the governed run (interpolates the same @-token grammar as `agent`)."},"prompt":{"type":"string","description":"agent only: optional prompt handed to the governed run. Interpolates the shared @-token grammar inline (@objectId, @object.<field>, @workspace.<key>, @config.<key>) so it can be grounded on the page object — e.g. 'Summarise @object.title'."},"resultField":{"type":"string","description":"agent only: the object field the agent's result is written back to (falls back to hermiq's default result field when absent)."},"objectId":{"type":"string","description":"agent only: the target object id. Defaults to the page object context's @objectId; an unresolved required @objectId BLOCKS the call (fail-closed) rather than sending a literal token. May be an explicit id or an @-token string."},"register":{"type":"string","description":"open-form / agent / run-node: OpenRegister register slug. open-form: the create dialog's schema register. agent / run-node: the register the subject object belongs to — falls back to the page object context's @register."},"schema":{"type":"string","description":"open-form / agent / run-node: OpenRegister schema slug. open-form: the create dialog fetches this schema and saves the new object against it. agent / run-node: the schema the subject object belongs to — falls back to the page object context's @schema."},"onSuccessRoute":{"description":"open-form only: optional post-save navigation target (#91). A bare route NAME (string) navigates with the saved object's id merged into the route params under `id` (harmless when the route has no `:id` segment — backward compatible). The object form { name, paramField?, objectParam? } names the id param (`paramField`, default `id`) and, when `objectParam` is set, also passes the whole saved object under that param key (for a props:true detail route to render without a refetch). The id is read from saved.id, then saved.uuid, then saved['@self'].id.","oneOf":[{"type":"string"},{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","description":"The vue-router route NAME pushed after a successful save."},"paramField":{"type":"string","default":"id","description":"Route param name populated from the saved object's id (default `id`)."},"objectParam":{"type":"string","description":"When set, the whole saved object is passed under this route param (props:true detail routes render without a refetch)."}}}]},"labelOn":{"type":"string","description":"toggle only: button label rendered while the state is ON (true). Falls back to `label`."},"labelOff":{"type":"string","description":"toggle only: button label rendered while the state is OFF (false). Falls back to `label`."},"stateSource":{"$ref":"#/$defs/endpointSource","description":"toggle only: the endpoint the initial state is read from on mount (the shared endpointSource shape — url + token-resolved params + responsePath). The `field` dot-path picks the boolean off the payload."},"writeUrl":{"type":"string","description":"toggle only: the endpoint the flipped state is written to on click (interpolates the same tokens as `url`)."},"field":{"type":"string","description":"toggle only: the state field — read off the stateSource payload on mount AND sent (as the flipped boolean) in the write body under this key."},"variant":{"type":"string","description":"CnActionButtons button variant (e.g. 'primary', 'secondary', 'error'). 'error' also styles the confirm dialog as destructive. A 'primary' action is never collapsed into CnActionButtons' overflow menu and consumes none of its `inline` slots: NcActions paints all of its inline actions with one shared variant, so a lone primary among them is not expressible."},"children":{"type":"array","description":"Sub-actions, rendered by CnActionButtons as this action's OWN chevron dropdown beside its button — deliberately not folded into the page's single overflow menu, because NcActions cannot nest and a list that grows per record (app versions, say) would swamp it. Children take the same shape as any action, `visibleWhen` included, and an action carrying them consumes none of the `inline` slots. The parent itself still renders its own button beside the chevron (`type` defaults to 'handler' when omitted), so a parent meant only to group its children needs a `handler` that does something meaningful — an untyped, handler-less parent renders a button that dispatches to nothing.","items":{"$ref":"#/$defs/action"}},"childrenLabel":{"type":"string","description":"i18n key naming the `children` dropdown. Falls back to the parent action's own label, so the chevron is never announced unlabelled."},"visibleWhen":{"$ref":"#/$defs/visibleWhen","description":"#91 Wave 3: an optional predicate gating whether the action renders — the shared banner shape ({ endpoint | source | field, op, value }). The `field`-only LOCAL form evaluates against the page object context (a detail action shown only in the right lifecycle state); endpoint / source forms fetch. Fail-safe: a broken predicate hides the action."}},"allOf":[{"description":"object-op actions MUST declare their mutation verb via `op`.","if":{"properties":{"type":{"const":"object-op"}},"required":["type"]},"then":{"required":["op"]}},{"description":"api-call actions MUST declare their endpoint via `url`.","if":{"properties":{"type":{"const":"api-call"}},"required":["type"]},"then":{"required":["url"]}},{"description":"open-form actions MUST declare the create schema via `schema`.","if":{"properties":{"type":{"const":"open-form"}},"required":["type"]},"then":{"required":["schema"]}},{"description":"agent actions MUST declare the target agent uuid via `agent`.","if":{"properties":{"type":{"const":"agent"}},"required":["type"]},"then":{"required":["agent"]}},{"description":"toggle actions MUST declare their write endpoint via `writeUrl`.","if":{"properties":{"type":{"const":"toggle"}},"required":["type"]},"then":{"required":["writeUrl"]}},{"description":"run-node actions MUST declare which flow and which node within it (RN-3, or-flow-run-node) — a node's config and eligibility are properties of the flow it lives in, so neither can be inferred.","if":{"properties":{"type":{"const":"run-node"}},"required":["type"]},"then":{"required":["flowId","nodeId"]}}]};const wrapper2 = {validate: validate33};const schema66 = {"type":"object","additionalProperties":false,"description":"#91 Wave 3: the shared visibility predicate (the Wave-1 banner shape). THREE modes: `endpoint` (GET a JSON endpoint, `field` dot-paths into the body), `source` (an OpenRegister { register, schema, filter? } query — `field` into the first result, or omit / use @total for the collection total), or LOCAL (neither endpoint nor source — `field` dot-paths into the caller's object context, e.g. a detail-page record). `op` defaults to eq. Evaluation is FAIL-SAFE (any error → hidden).","properties":{"appInstalled":{"type":"string","minLength":1,"description":"Nextcloud app id that must be installed and enabled for the guarded element to show. A PRECONDITION rather than a fourth mode: it is checked before anything else, and on its own it is the whole condition. Combined with endpoint/source/field it gates that mode too, so both must hold. It exists because the menu's `visibleIf` already spoke this word and `visibleWhen` did not, so the same manifest vocabulary meant two different things in two places. Use it on an action that writes into a sibling app, so an install without that app shows no button rather than a form that saves nowhere."},"endpoint":{"type":"string","description":"A same-origin URL returning JSON; `field` is a dot-path into the body."},"source":{"type":"object","additionalProperties":true,"description":"An OpenRegister object query { register, schema, filter? } (filter supports the shared @-token grammar). `field` dot-paths into the first result; omit it (or use @total) to compare the collection total.","properties":{"register":{"type":"string"},"schema":{"type":"string"},"filter":{"type":"object","additionalProperties":true}}},"field":{"type":"string","description":"Dot-path to the compared value — into the endpoint body, the source's first result, or (LOCAL mode) the caller's object context."},"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte","empty","notEmpty"],"default":"eq","description":"Comparison operator (default eq). eq/neq compare loosely-normalised primitives; ordering operators coerce both sides to Number. `empty` / `notEmpty` take no `value` and treat undefined, null, '' and an empty array alike — the one question eq cannot ask, because an unset field arrives in a shape that depends on the store and String(null) is the word 'null' rather than blank."},"value":{"description":"The right-hand side of the comparison, resolved through the shared @-token grammar so `@me` names the signed-in reader rather than a literal only the server knows. Omitted for `empty` / `notEmpty`."},"all":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/visibleWhen"},"description":"Every listed condition must hold. Use it where a gate is more than one fact — a Claim button that is both 'not closed' and 'nobody holds it'. Each entry is a full visibleWhen and may compose again."},"any":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/visibleWhen"},"description":"At least one listed condition must hold. Ignored when `all` is also present."}}};const wrapper3 = {validate: validate34};function validate34(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate34.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}if(data && typeof data == "object" && !Array.isArray(data)){if(data.op === undefined){data.op = "eq";}for(const key0 in data){if(!((((((((key0 === "appInstalled") || (key0 === "endpoint")) || (key0 === "source")) || (key0 === "field")) || (key0 === "op")) || (key0 === "value")) || (key0 === "all")) || (key0 === "any"))){const err0 = {instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}}if(data.appInstalled !== undefined){let data0 = data.appInstalled;if(typeof data0 === "string"){if(func6(data0) < 1){const err1 = {instancePath:instancePath+"/appInstalled",schemaPath:"#/properties/appInstalled/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}}else {const err2 = {instancePath:instancePath+"/appInstalled",schemaPath:"#/properties/appInstalled/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}}if(data.endpoint !== undefined){if(typeof data.endpoint !== "string"){const err3 = {instancePath:instancePath+"/endpoint",schemaPath:"#/properties/endpoint/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}}if(data.source !== undefined){let data2 = data.source;if(data2 && typeof data2 == "object" && !Array.isArray(data2)){if(data2.register !== undefined){if(typeof data2.register !== "string"){const err4 = {instancePath:instancePath+"/source/register",schemaPath:"#/properties/source/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}}if(data2.schema !== undefined){if(typeof data2.schema !== "string"){const err5 = {instancePath:instancePath+"/source/schema",schemaPath:"#/properties/source/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}if(data2.filter !== undefined){let data5 = data2.filter;if(data5 && typeof data5 == "object" && !Array.isArray(data5));else {const err6 = {instancePath:instancePath+"/source/filter",schemaPath:"#/properties/source/properties/filter/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}}}else {const err7 = {instancePath:instancePath+"/source",schemaPath:"#/properties/source/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}}if(data.field !== undefined){if(typeof data.field !== "string"){const err8 = {instancePath:instancePath+"/field",schemaPath:"#/properties/field/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}}let data7 = data.op;if(typeof data7 !== "string"){const err9 = {instancePath:instancePath+"/op",schemaPath:"#/properties/op/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}if(!((((((((data7 === "eq") || (data7 === "neq")) || (data7 === "gt")) || (data7 === "gte")) || (data7 === "lt")) || (data7 === "lte")) || (data7 === "empty")) || (data7 === "notEmpty"))){const err10 = {instancePath:instancePath+"/op",schemaPath:"#/properties/op/enum",keyword:"enum",params:{allowedValues: schema66.properties.op.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}if(data.all !== undefined){let data8 = data.all;if(Array.isArray(data8)){if(data8.length < 1){const err11 = {instancePath:instancePath+"/all",schemaPath:"#/properties/all/minItems",keyword:"minItems",params:{limit: 1},message:"must NOT have fewer than 1 items"};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}const len0 = data8.length;for(let i0=0; i0<len0; i0++){if(!(wrapper3.validate(data8[i0], {instancePath:instancePath+"/all/" + i0,parentData:data8,parentDataProperty:i0,rootData,dynamicAnchors}))){vErrors = vErrors === null ? wrapper3.validate.errors : vErrors.concat(wrapper3.validate.errors);errors = vErrors.length;}}}else {const err12 = {instancePath:instancePath+"/all",schemaPath:"#/properties/all/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}}if(data.any !== undefined){let data10 = data.any;if(Array.isArray(data10)){if(data10.length < 1){const err13 = {instancePath:instancePath+"/any",schemaPath:"#/properties/any/minItems",keyword:"minItems",params:{limit: 1},message:"must NOT have fewer than 1 items"};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}const len1 = data10.length;for(let i1=0; i1<len1; i1++){if(!(wrapper3.validate(data10[i1], {instancePath:instancePath+"/any/" + i1,parentData:data10,parentDataProperty:i1,rootData,dynamicAnchors}))){vErrors = vErrors === null ? wrapper3.validate.errors : vErrors.concat(wrapper3.validate.errors);errors = vErrors.length;}}}else {const err14 = {instancePath:instancePath+"/any",schemaPath:"#/properties/any/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}}}else {const err15 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}validate34.errors = vErrors;return errors === 0;}validate34.evaluated = {"props":true,"dynamicProps":false,"dynamicItems":false};function validate33(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate33.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}const _errs2 = errors;let valid1 = true;const _errs3 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err0 = {};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}else {if(data.type !== undefined){if("object-op" !== data.type){const err1 = {};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}}}}var _valid0 = _errs3 === errors;errors = _errs2;if(vErrors !== null){if(_errs2){vErrors.length = _errs2;}else {vErrors = null;}}if(_valid0){const _errs5 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.op === undefined){const err2 = {instancePath,schemaPath:"#/allOf/0/then/required",keyword:"required",params:{missingProperty: "op"},message:"must have required property '"+"op"+"'"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}}var _valid0 = _errs5 === errors;valid1 = _valid0;}if(!valid1){const err3 = {instancePath,schemaPath:"#/allOf/0/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}const _errs7 = errors;let valid3 = true;const _errs8 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err4 = {};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}else {if(data.type !== undefined){if("api-call" !== data.type){const err5 = {};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}}}var _valid1 = _errs8 === errors;errors = _errs7;if(vErrors !== null){if(_errs7){vErrors.length = _errs7;}else {vErrors = null;}}if(_valid1){const _errs10 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.url === undefined){const err6 = {instancePath,schemaPath:"#/allOf/1/then/required",keyword:"required",params:{missingProperty: "url"},message:"must have required property '"+"url"+"'"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}}var _valid1 = _errs10 === errors;valid3 = _valid1;}if(!valid3){const err7 = {instancePath,schemaPath:"#/allOf/1/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}const _errs12 = errors;let valid5 = true;const _errs13 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err8 = {};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}else {if(data.type !== undefined){if("open-form" !== data.type){const err9 = {};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}}}}var _valid2 = _errs13 === errors;errors = _errs12;if(vErrors !== null){if(_errs12){vErrors.length = _errs12;}else {vErrors = null;}}if(_valid2){const _errs15 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.schema === undefined){const err10 = {instancePath,schemaPath:"#/allOf/2/then/required",keyword:"required",params:{missingProperty: "schema"},message:"must have required property '"+"schema"+"'"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}}var _valid2 = _errs15 === errors;valid5 = _valid2;}if(!valid5){const err11 = {instancePath,schemaPath:"#/allOf/2/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}const _errs17 = errors;let valid7 = true;const _errs18 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err12 = {};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}else {if(data.type !== undefined){if("agent" !== data.type){const err13 = {};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}}}}var _valid3 = _errs18 === errors;errors = _errs17;if(vErrors !== null){if(_errs17){vErrors.length = _errs17;}else {vErrors = null;}}if(_valid3){const _errs20 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.agent === undefined){const err14 = {instancePath,schemaPath:"#/allOf/3/then/required",keyword:"required",params:{missingProperty: "agent"},message:"must have required property '"+"agent"+"'"};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}}var _valid3 = _errs20 === errors;valid7 = _valid3;}if(!valid7){const err15 = {instancePath,schemaPath:"#/allOf/3/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}const _errs22 = errors;let valid9 = true;const _errs23 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err16 = {};if(vErrors === null){vErrors = [err16];}else {vErrors.push(err16);}errors++;}else {if(data.type !== undefined){if("toggle" !== data.type){const err17 = {};if(vErrors === null){vErrors = [err17];}else {vErrors.push(err17);}errors++;}}}}var _valid4 = _errs23 === errors;errors = _errs22;if(vErrors !== null){if(_errs22){vErrors.length = _errs22;}else {vErrors = null;}}if(_valid4){const _errs25 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.writeUrl === undefined){const err18 = {instancePath,schemaPath:"#/allOf/4/then/required",keyword:"required",params:{missingProperty: "writeUrl"},message:"must have required property '"+"writeUrl"+"'"};if(vErrors === null){vErrors = [err18];}else {vErrors.push(err18);}errors++;}}var _valid4 = _errs25 === errors;valid9 = _valid4;}if(!valid9){const err19 = {instancePath,schemaPath:"#/allOf/4/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err19];}else {vErrors.push(err19);}errors++;}const _errs27 = errors;let valid11 = true;const _errs28 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err20 = {};if(vErrors === null){vErrors = [err20];}else {vErrors.push(err20);}errors++;}else {if(data.type !== undefined){if("run-node" !== data.type){const err21 = {};if(vErrors === null){vErrors = [err21];}else {vErrors.push(err21);}errors++;}}}}var _valid5 = _errs28 === errors;errors = _errs27;if(vErrors !== null){if(_errs27){vErrors.length = _errs27;}else {vErrors = null;}}if(_valid5){const _errs30 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.flowId === undefined){const err22 = {instancePath,schemaPath:"#/allOf/5/then/required",keyword:"required",params:{missingProperty: "flowId"},message:"must have required property '"+"flowId"+"'"};if(vErrors === null){vErrors = [err22];}else {vErrors.push(err22);}errors++;}if(data.nodeId === undefined){const err23 = {instancePath,schemaPath:"#/allOf/5/then/required",keyword:"required",params:{missingProperty: "nodeId"},message:"must have required property '"+"nodeId"+"'"};if(vErrors === null){vErrors = [err23];}else {vErrors.push(err23);}errors++;}}var _valid5 = _errs30 === errors;valid11 = _valid5;}if(!valid11){const err24 = {instancePath,schemaPath:"#/allOf/5/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err24];}else {vErrors.push(err24);}errors++;}if(data && typeof data == "object" && !Array.isArray(data)){if(data.type === undefined){data.type = "handler";}if(data.confirm === undefined){data.confirm = false;}if(data.advanced === undefined){data.advanced = false;}if(data.size === undefined){data.size = "normal";}if(data.columns === undefined){data.columns = 1;}if(data.download === undefined){data.download = false;}if(data.refresh === undefined){data.refresh = true;}if(data.id === undefined){const err25 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err25];}else {vErrors.push(err25);}errors++;}if(data.label === undefined){const err26 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err26];}else {vErrors.push(err26);}errors++;}for(const key0 in data){if(!(func1.call(schema64.properties, key0))){const err27 = {instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err27];}else {vErrors.push(err27);}errors++;}}if(data.id !== undefined){if(typeof data.id !== "string"){const err28 = {instancePath:instancePath+"/id",schemaPath:"#/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err28];}else {vErrors.push(err28);}errors++;}}if(data.label !== undefined){if(typeof data.label !== "string"){const err29 = {instancePath:instancePath+"/label",schemaPath:"#/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err29];}else {vErrors.push(err29);}errors++;}}let data8 = data.type;if(typeof data8 !== "string"){const err30 = {instancePath:instancePath+"/type",schemaPath:"#/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err30];}else {vErrors.push(err30);}errors++;}if(!((((((((((((data8 === "handler") || (data8 === "open-modal")) || (data8 === "open-page")) || (data8 === "navigate")) || (data8 === "object-op")) || (data8 === "export")) || (data8 === "open-form")) || (data8 === "refresh")) || (data8 === "api-call")) || (data8 === "agent")) || (data8 === "run-node")) || (data8 === "toggle"))){const err31 = {instancePath:instancePath+"/type",schemaPath:"#/properties/type/enum",keyword:"enum",params:{allowedValues: schema64.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err31];}else {vErrors.push(err31);}errors++;}if(data.op !== undefined){let data9 = data.op;if(typeof data9 !== "string"){const err32 = {instancePath:instancePath+"/op",schemaPath:"#/properties/op/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err32];}else {vErrors.push(err32);}errors++;}if(!(((data9 === "patch") || (data9 === "delete")) || (data9 === "create"))){const err33 = {instancePath:instancePath+"/op",schemaPath:"#/properties/op/enum",keyword:"enum",params:{allowedValues: schema64.properties.op.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err33];}else {vErrors.push(err33);}errors++;}}if(data.values !== undefined){let data10 = data.values;if(data10 && typeof data10 == "object" && !Array.isArray(data10));else {const err34 = {instancePath:instancePath+"/values",schemaPath:"#/properties/values/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err34];}else {vErrors.push(err34);}errors++;}}if(typeof data.confirm !== "boolean"){const err35 = {instancePath:instancePath+"/confirm",schemaPath:"#/properties/confirm/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err35];}else {vErrors.push(err35);}errors++;}if(data.target !== undefined){if(typeof data.target !== "string"){const err36 = {instancePath:instancePath+"/target",schemaPath:"#/properties/target/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err36];}else {vErrors.push(err36);}errors++;}}if(data.props !== undefined){let data13 = data.props;if(data13 && typeof data13 == "object" && !Array.isArray(data13));else {const err37 = {instancePath:instancePath+"/props",schemaPath:"#/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err37];}else {vErrors.push(err37);}errors++;}}if(data.createOverride !== undefined){if(typeof data.createOverride !== "string"){const err38 = {instancePath:instancePath+"/createOverride",schemaPath:"#/properties/createOverride/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err38];}else {vErrors.push(err38);}errors++;}}if(data.includeFields !== undefined){let data15 = data.includeFields;if(Array.isArray(data15)){const len0 = data15.length;for(let i0=0; i0<len0; i0++){if(typeof data15[i0] !== "string"){const err39 = {instancePath:instancePath+"/includeFields/" + i0,schemaPath:"#/properties/includeFields/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err39];}else {vErrors.push(err39);}errors++;}}}else {const err40 = {instancePath:instancePath+"/includeFields",schemaPath:"#/properties/includeFields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err40];}else {vErrors.push(err40);}errors++;}}if(data.excludeFields !== undefined){let data17 = data.excludeFields;if(Array.isArray(data17)){const len1 = data17.length;for(let i1=0; i1<len1; i1++){if(typeof data17[i1] !== "string"){const err41 = {instancePath:instancePath+"/excludeFields/" + i1,schemaPath:"#/properties/excludeFields/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err41];}else {vErrors.push(err41);}errors++;}}}else {const err42 = {instancePath:instancePath+"/excludeFields",schemaPath:"#/properties/excludeFields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err42];}else {vErrors.push(err42);}errors++;}}if(data.fieldOverrides !== undefined){let data19 = data.fieldOverrides;if(data19 && typeof data19 == "object" && !Array.isArray(data19));else {const err43 = {instancePath:instancePath+"/fieldOverrides",schemaPath:"#/properties/fieldOverrides/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err43];}else {vErrors.push(err43);}errors++;}}if(typeof data.advanced !== "boolean"){const err44 = {instancePath:instancePath+"/advanced",schemaPath:"#/properties/advanced/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err44];}else {vErrors.push(err44);}errors++;}if(data.formTitle !== undefined){if(typeof data.formTitle !== "string"){const err45 = {instancePath:instancePath+"/formTitle",schemaPath:"#/properties/formTitle/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err45];}else {vErrors.push(err45);}errors++;}}let data22 = data.size;if(typeof data22 !== "string"){const err46 = {instancePath:instancePath+"/size",schemaPath:"#/properties/size/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err46];}else {vErrors.push(err46);}errors++;}if(!((((data22 === "small") || (data22 === "normal")) || (data22 === "large")) || (data22 === "full"))){const err47 = {instancePath:instancePath+"/size",schemaPath:"#/properties/size/enum",keyword:"enum",params:{allowedValues: schema64.properties.size.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err47];}else {vErrors.push(err47);}errors++;}let data23 = data.columns;if(!((typeof data23 == "number") && (!(data23 % 1) && !isNaN(data23)))){const err48 = {instancePath:instancePath+"/columns",schemaPath:"#/properties/columns/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err48];}else {vErrors.push(err48);}errors++;}if(!((data23 === 1) || (data23 === 2))){const err49 = {instancePath:instancePath+"/columns",schemaPath:"#/properties/columns/enum",keyword:"enum",params:{allowedValues: schema64.properties.columns.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err49];}else {vErrors.push(err49);}errors++;}if(data.handler !== undefined){if(typeof data.handler !== "string"){const err50 = {instancePath:instancePath+"/handler",schemaPath:"#/properties/handler/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err50];}else {vErrors.push(err50);}errors++;}}if(data.route !== undefined){if(typeof data.route !== "string"){const err51 = {instancePath:instancePath+"/route",schemaPath:"#/properties/route/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err51];}else {vErrors.push(err51);}errors++;}}if(data.icon !== undefined){if(typeof data.icon !== "string"){const err52 = {instancePath:instancePath+"/icon",schemaPath:"#/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err52];}else {vErrors.push(err52);}errors++;}}if(data.entities !== undefined){let data27 = data.entities;if(Array.isArray(data27)){const len2 = data27.length;for(let i2=0; i2<len2; i2++){let data28 = data27[i2];if(data28 && typeof data28 == "object" && !Array.isArray(data28)){if(data28.id === undefined){const err53 = {instancePath:instancePath+"/entities/" + i2,schemaPath:"#/properties/entities/items/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err53];}else {vErrors.push(err53);}errors++;}if(data28.label === undefined){const err54 = {instancePath:instancePath+"/entities/" + i2,schemaPath:"#/properties/entities/items/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err54];}else {vErrors.push(err54);}errors++;}for(const key1 in data28){if(!((key1 === "id") || (key1 === "label"))){const err55 = {instancePath:instancePath+"/entities/" + i2,schemaPath:"#/properties/entities/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key1},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err55];}else {vErrors.push(err55);}errors++;}}if(data28.id !== undefined){if(typeof data28.id !== "string"){const err56 = {instancePath:instancePath+"/entities/" + i2+"/id",schemaPath:"#/properties/entities/items/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err56];}else {vErrors.push(err56);}errors++;}}if(data28.label !== undefined){if(typeof data28.label !== "string"){const err57 = {instancePath:instancePath+"/entities/" + i2+"/label",schemaPath:"#/properties/entities/items/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err57];}else {vErrors.push(err57);}errors++;}}}else {const err58 = {instancePath:instancePath+"/entities/" + i2,schemaPath:"#/properties/entities/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err58];}else {vErrors.push(err58);}errors++;}}}else {const err59 = {instancePath:instancePath+"/entities",schemaPath:"#/properties/entities/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err59];}else {vErrors.push(err59);}errors++;}}if(data.formats !== undefined){let data31 = data.formats;if(Array.isArray(data31)){const len3 = data31.length;for(let i3=0; i3<len3; i3++){let data32 = data31[i3];const _errs89 = errors;let valid23 = false;let passing0 = null;const _errs90 = errors;if(typeof data32 !== "string"){const err60 = {instancePath:instancePath+"/formats/" + i3,schemaPath:"#/properties/formats/items/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err60];}else {vErrors.push(err60);}errors++;}var _valid6 = _errs90 === errors;if(_valid6){valid23 = true;passing0 = 0;}const _errs92 = errors;if(data32 && typeof data32 == "object" && !Array.isArray(data32)){if(data32.id === undefined){const err61 = {instancePath:instancePath+"/formats/" + i3,schemaPath:"#/properties/formats/items/oneOf/1/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err61];}else {vErrors.push(err61);}errors++;}if(data32.label === undefined){const err62 = {instancePath:instancePath+"/formats/" + i3,schemaPath:"#/properties/formats/items/oneOf/1/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err62];}else {vErrors.push(err62);}errors++;}for(const key2 in data32){if(!((key2 === "id") || (key2 === "label"))){const err63 = {instancePath:instancePath+"/formats/" + i3,schemaPath:"#/properties/formats/items/oneOf/1/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key2},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err63];}else {vErrors.push(err63);}errors++;}}if(data32.id !== undefined){if(typeof data32.id !== "string"){const err64 = {instancePath:instancePath+"/formats/" + i3+"/id",schemaPath:"#/properties/formats/items/oneOf/1/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err64];}else {vErrors.push(err64);}errors++;}}if(data32.label !== undefined){if(typeof data32.label !== "string"){const err65 = {instancePath:instancePath+"/formats/" + i3+"/label",schemaPath:"#/properties/formats/items/oneOf/1/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err65];}else {vErrors.push(err65);}errors++;}}}else {const err66 = {instancePath:instancePath+"/formats/" + i3,schemaPath:"#/properties/formats/items/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err66];}else {vErrors.push(err66);}errors++;}var _valid6 = _errs92 === errors;if(_valid6 && valid23){valid23 = false;passing0 = [passing0, 1];}else {if(_valid6){valid23 = true;passing0 = 1;}}if(!valid23){const err67 = {instancePath:instancePath+"/formats/" + i3,schemaPath:"#/properties/formats/items/oneOf",keyword:"oneOf",params:{passingSchemas: passing0},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err67];}else {vErrors.push(err67);}errors++;}else {errors = _errs89;if(vErrors !== null){if(_errs89){vErrors.length = _errs89;}else {vErrors = null;}}}}}else {const err68 = {instancePath:instancePath+"/formats",schemaPath:"#/properties/formats/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err68];}else {vErrors.push(err68);}errors++;}}if(data.description !== undefined){if(typeof data.description !== "string"){const err69 = {instancePath:instancePath+"/description",schemaPath:"#/properties/description/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err69];}else {vErrors.push(err69);}errors++;}}if(data.url !== undefined){if(typeof data.url !== "string"){const err70 = {instancePath:instancePath+"/url",schemaPath:"#/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err70];}else {vErrors.push(err70);}errors++;}}if(data.method !== undefined){let data37 = data.method;if(typeof data37 !== "string"){const err71 = {instancePath:instancePath+"/method",schemaPath:"#/properties/method/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err71];}else {vErrors.push(err71);}errors++;}if(!((data37 === "POST") || (data37 === "PUT"))){const err72 = {instancePath:instancePath+"/method",schemaPath:"#/properties/method/enum",keyword:"enum",params:{allowedValues: schema64.properties.method.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err72];}else {vErrors.push(err72);}errors++;}}if(data.payload !== undefined){let data38 = data.payload;if(data38 && typeof data38 == "object" && !Array.isArray(data38));else {const err73 = {instancePath:instancePath+"/payload",schemaPath:"#/properties/payload/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err73];}else {vErrors.push(err73);}errors++;}}if(data.params !== undefined){let data39 = data.params;if(data39 && typeof data39 == "object" && !Array.isArray(data39));else {const err74 = {instancePath:instancePath+"/params",schemaPath:"#/properties/params/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err74];}else {vErrors.push(err74);}errors++;}}if(typeof data.download !== "boolean"){const err75 = {instancePath:instancePath+"/download",schemaPath:"#/properties/download/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err75];}else {vErrors.push(err75);}errors++;}if(data.filename !== undefined){if(typeof data.filename !== "string"){const err76 = {instancePath:instancePath+"/filename",schemaPath:"#/properties/filename/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err76];}else {vErrors.push(err76);}errors++;}}if(data.successMessage !== undefined){if(typeof data.successMessage !== "string"){const err77 = {instancePath:instancePath+"/successMessage",schemaPath:"#/properties/successMessage/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err77];}else {vErrors.push(err77);}errors++;}}if(data.errorMessage !== undefined){if(typeof data.errorMessage !== "string"){const err78 = {instancePath:instancePath+"/errorMessage",schemaPath:"#/properties/errorMessage/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err78];}else {vErrors.push(err78);}errors++;}}if(typeof data.refresh !== "boolean"){const err79 = {instancePath:instancePath+"/refresh",schemaPath:"#/properties/refresh/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err79];}else {vErrors.push(err79);}errors++;}if(data.flowId !== undefined){if(typeof data.flowId !== "string"){const err80 = {instancePath:instancePath+"/flowId",schemaPath:"#/properties/flowId/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err80];}else {vErrors.push(err80);}errors++;}}if(data.nodeId !== undefined){if(typeof data.nodeId !== "string"){const err81 = {instancePath:instancePath+"/nodeId",schemaPath:"#/properties/nodeId/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err81];}else {vErrors.push(err81);}errors++;}}if(data.subject !== undefined){if(typeof data.subject !== "string"){const err82 = {instancePath:instancePath+"/subject",schemaPath:"#/properties/subject/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err82];}else {vErrors.push(err82);}errors++;}}if(data.agent !== undefined){if(typeof data.agent !== "string"){const err83 = {instancePath:instancePath+"/agent",schemaPath:"#/properties/agent/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err83];}else {vErrors.push(err83);}errors++;}}if(data.skill !== undefined){if(typeof data.skill !== "string"){const err84 = {instancePath:instancePath+"/skill",schemaPath:"#/properties/skill/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err84];}else {vErrors.push(err84);}errors++;}}if(data.prompt !== undefined){if(typeof data.prompt !== "string"){const err85 = {instancePath:instancePath+"/prompt",schemaPath:"#/properties/prompt/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err85];}else {vErrors.push(err85);}errors++;}}if(data.resultField !== undefined){if(typeof data.resultField !== "string"){const err86 = {instancePath:instancePath+"/resultField",schemaPath:"#/properties/resultField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err86];}else {vErrors.push(err86);}errors++;}}if(data.objectId !== undefined){if(typeof data.objectId !== "string"){const err87 = {instancePath:instancePath+"/objectId",schemaPath:"#/properties/objectId/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err87];}else {vErrors.push(err87);}errors++;}}if(data.register !== undefined){if(typeof data.register !== "string"){const err88 = {instancePath:instancePath+"/register",schemaPath:"#/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err88];}else {vErrors.push(err88);}errors++;}}if(data.schema !== undefined){if(typeof data.schema !== "string"){const err89 = {instancePath:instancePath+"/schema",schemaPath:"#/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err89];}else {vErrors.push(err89);}errors++;}}if(data.onSuccessRoute !== undefined){let data55 = data.onSuccessRoute;const _errs142 = errors;let valid25 = false;let passing1 = null;const _errs143 = errors;if(typeof data55 !== "string"){const err90 = {instancePath:instancePath+"/onSuccessRoute",schemaPath:"#/properties/onSuccessRoute/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err90];}else {vErrors.push(err90);}errors++;}var _valid7 = _errs143 === errors;if(_valid7){valid25 = true;passing1 = 0;}const _errs145 = errors;if(data55 && typeof data55 == "object" && !Array.isArray(data55)){if(data55.name === undefined){const err91 = {instancePath:instancePath+"/onSuccessRoute",schemaPath:"#/properties/onSuccessRoute/oneOf/1/required",keyword:"required",params:{missingProperty: "name"},message:"must have required property '"+"name"+"'"};if(vErrors === null){vErrors = [err91];}else {vErrors.push(err91);}errors++;}for(const key3 in data55){if(!(((key3 === "name") || (key3 === "paramField")) || (key3 === "objectParam"))){const err92 = {instancePath:instancePath+"/onSuccessRoute",schemaPath:"#/properties/onSuccessRoute/oneOf/1/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key3},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err92];}else {vErrors.push(err92);}errors++;}}if(data55.name !== undefined){if(typeof data55.name !== "string"){const err93 = {instancePath:instancePath+"/onSuccessRoute/name",schemaPath:"#/properties/onSuccessRoute/oneOf/1/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err93];}else {vErrors.push(err93);}errors++;}}if(data55.paramField !== undefined){if(typeof data55.paramField !== "string"){const err94 = {instancePath:instancePath+"/onSuccessRoute/paramField",schemaPath:"#/properties/onSuccessRoute/oneOf/1/properties/paramField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err94];}else {vErrors.push(err94);}errors++;}}if(data55.objectParam !== undefined){if(typeof data55.objectParam !== "string"){const err95 = {instancePath:instancePath+"/onSuccessRoute/objectParam",schemaPath:"#/properties/onSuccessRoute/oneOf/1/properties/objectParam/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err95];}else {vErrors.push(err95);}errors++;}}}else {const err96 = {instancePath:instancePath+"/onSuccessRoute",schemaPath:"#/properties/onSuccessRoute/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err96];}else {vErrors.push(err96);}errors++;}var _valid7 = _errs145 === errors;if(_valid7 && valid25){valid25 = false;passing1 = [passing1, 1];}else {if(_valid7){valid25 = true;passing1 = 1;}}if(!valid25){const err97 = {instancePath:instancePath+"/onSuccessRoute",schemaPath:"#/properties/onSuccessRoute/oneOf",keyword:"oneOf",params:{passingSchemas: passing1},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err97];}else {vErrors.push(err97);}errors++;}else {errors = _errs142;if(vErrors !== null){if(_errs142){vErrors.length = _errs142;}else {vErrors = null;}}}}if(data.labelOn !== undefined){if(typeof data.labelOn !== "string"){const err98 = {instancePath:instancePath+"/labelOn",schemaPath:"#/properties/labelOn/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err98];}else {vErrors.push(err98);}errors++;}}if(data.labelOff !== undefined){if(typeof data.labelOff !== "string"){const err99 = {instancePath:instancePath+"/labelOff",schemaPath:"#/properties/labelOff/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err99];}else {vErrors.push(err99);}errors++;}}if(data.stateSource !== undefined){let data61 = data.stateSource;if(data61 && typeof data61 == "object" && !Array.isArray(data61)){if(data61.method === undefined){data61.method = "GET";}if(data61.url === undefined){const err100 = {instancePath:instancePath+"/stateSource",schemaPath:"#/$defs/endpointSource/required",keyword:"required",params:{missingProperty: "url"},message:"must have required property '"+"url"+"'"};if(vErrors === null){vErrors = [err100];}else {vErrors.push(err100);}errors++;}for(const key4 in data61){if(!((((key4 === "url") || (key4 === "method")) || (key4 === "params")) || (key4 === "responsePath"))){const err101 = {instancePath:instancePath+"/stateSource",schemaPath:"#/$defs/endpointSource/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key4},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err101];}else {vErrors.push(err101);}errors++;}}if(data61.url !== undefined){if(typeof data61.url !== "string"){const err102 = {instancePath:instancePath+"/stateSource/url",schemaPath:"#/$defs/endpointSource/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err102];}else {vErrors.push(err102);}errors++;}}let data63 = data61.method;if(typeof data63 !== "string"){const err103 = {instancePath:instancePath+"/stateSource/method",schemaPath:"#/$defs/endpointSource/properties/method/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err103];}else {vErrors.push(err103);}errors++;}if(!((data63 === "GET") || (data63 === "POST"))){const err104 = {instancePath:instancePath+"/stateSource/method",schemaPath:"#/$defs/endpointSource/properties/method/enum",keyword:"enum",params:{allowedValues: schema63.properties.method.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err104];}else {vErrors.push(err104);}errors++;}if(data61.params !== undefined){let data64 = data61.params;if(data64 && typeof data64 == "object" && !Array.isArray(data64));else {const err105 = {instancePath:instancePath+"/stateSource/params",schemaPath:"#/$defs/endpointSource/properties/params/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err105];}else {vErrors.push(err105);}errors++;}}if(data61.responsePath !== undefined){if(typeof data61.responsePath !== "string"){const err106 = {instancePath:instancePath+"/stateSource/responsePath",schemaPath:"#/$defs/endpointSource/properties/responsePath/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err106];}else {vErrors.push(err106);}errors++;}}}else {const err107 = {instancePath:instancePath+"/stateSource",schemaPath:"#/$defs/endpointSource/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err107];}else {vErrors.push(err107);}errors++;}}if(data.writeUrl !== undefined){if(typeof data.writeUrl !== "string"){const err108 = {instancePath:instancePath+"/writeUrl",schemaPath:"#/properties/writeUrl/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err108];}else {vErrors.push(err108);}errors++;}}if(data.field !== undefined){if(typeof data.field !== "string"){const err109 = {instancePath:instancePath+"/field",schemaPath:"#/properties/field/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err109];}else {vErrors.push(err109);}errors++;}}if(data.variant !== undefined){if(typeof data.variant !== "string"){const err110 = {instancePath:instancePath+"/variant",schemaPath:"#/properties/variant/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err110];}else {vErrors.push(err110);}errors++;}}if(data.children !== undefined){let data69 = data.children;if(Array.isArray(data69)){const len4 = data69.length;for(let i4=0; i4<len4; i4++){if(!(wrapper2.validate(data69[i4], {instancePath:instancePath+"/children/" + i4,parentData:data69,parentDataProperty:i4,rootData,dynamicAnchors}))){vErrors = vErrors === null ? wrapper2.validate.errors : vErrors.concat(wrapper2.validate.errors);errors = vErrors.length;}}}else {const err111 = {instancePath:instancePath+"/children",schemaPath:"#/properties/children/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err111];}else {vErrors.push(err111);}errors++;}}if(data.childrenLabel !== undefined){if(typeof data.childrenLabel !== "string"){const err112 = {instancePath:instancePath+"/childrenLabel",schemaPath:"#/properties/childrenLabel/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err112];}else {vErrors.push(err112);}errors++;}}if(data.visibleWhen !== undefined){if(!(validate34(data.visibleWhen, {instancePath:instancePath+"/visibleWhen",parentData:data,parentDataProperty:"visibleWhen",rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate34.errors : vErrors.concat(validate34.errors);errors = vErrors.length;}}}else {const err113 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err113];}else {vErrors.push(err113);}errors++;}validate33.errors = vErrors;return errors === 0;}validate33.evaluated = {"props":true,"dynamicProps":false,"dynamicItems":false};const schema67 = {"type":"object","required":["id","label"],"additionalProperties":false,"description":"One card in a nav-card-grid built-in widget (ADR-044 §4 cards-collapse) — an arbitrary navigation link, not an OpenRegister object. Mirrors the menuItem/primaryAction vocabulary: id + label required, route/href are alternative navigation targets and mutually exclusive, count supports the same integer-or-\"auto\" shape as menuItem.count.","properties":{"id":{"type":"string","description":"Unique identifier for this card within its widget's entries[] array."},"label":{"type":"string","description":"i18n translation key / text rendered as the card's title."},"description":{"type":"string","description":"Optional explanatory text rendered below the label, associated to the card via aria-describedby (never aria-label)."},"icon":{"type":"string","description":"MDI icon name (e.g. 'ChartLine'), resolved the same way as menuItem.icon."},"route":{"type":"string","description":"Vue-router route name (matches a pages[].id) this card navigates to. Mutually exclusive with href."},"href":{"type":"string","description":"External URL opened per the rendering component's target handling. Mutually exclusive with route."},"count":{"oneOf":[{"type":"integer","minimum":0},{"type":"string","enum":["auto"]}],"description":"Count badge on the card. Positive integer renders as-is; 'auto' resolves from cnMenuCounts (populated by CnAppRoot) for the card's resolved route page (register + schema), the same mechanism menuItem.count:\"auto\" uses."},"order":{"type":"integer","description":"Display order among sibling cards. Cards without an order render last."},"permission":{"type":"string","description":"Permission string the user must hold for this card to render."},"visibleIf":{"$ref":"#/$defs/visibleIfCondition","description":"Optional display condition evaluated at render time."}},"allOf":[{"description":"route and href are mutually exclusive navigation targets — a card links either in-app or externally, never both.","not":{"required":["route","href"]}}]};function validate37(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate37.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}const _errs2 = errors;const _errs3 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(((data.route === undefined) && ("route")) || ((data.href === undefined) && ("href"))){const err0 = {};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}}var valid1 = _errs3 === errors;if(valid1){const err1 = {instancePath,schemaPath:"#/allOf/0/not",keyword:"not",params:{},message:"must NOT be valid"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}else {errors = _errs2;if(vErrors !== null){if(_errs2){vErrors.length = _errs2;}else {vErrors = null;}}}if(data && typeof data == "object" && !Array.isArray(data)){if(data.id === undefined){const err2 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}if(data.label === undefined){const err3 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}for(const key0 in data){if(!(func1.call(schema67.properties, key0))){const err4 = {instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}}if(data.id !== undefined){if(typeof data.id !== "string"){const err5 = {instancePath:instancePath+"/id",schemaPath:"#/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}if(data.label !== undefined){if(typeof data.label !== "string"){const err6 = {instancePath:instancePath+"/label",schemaPath:"#/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}}if(data.description !== undefined){if(typeof data.description !== "string"){const err7 = {instancePath:instancePath+"/description",schemaPath:"#/properties/description/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}}if(data.icon !== undefined){if(typeof data.icon !== "string"){const err8 = {instancePath:instancePath+"/icon",schemaPath:"#/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}}if(data.route !== undefined){if(typeof data.route !== "string"){const err9 = {instancePath:instancePath+"/route",schemaPath:"#/properties/route/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}}if(data.href !== undefined){if(typeof data.href !== "string"){const err10 = {instancePath:instancePath+"/href",schemaPath:"#/properties/href/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}}if(data.count !== undefined){let data6 = data.count;const _errs18 = errors;let valid3 = false;let passing0 = null;const _errs19 = errors;if(!((typeof data6 == "number") && (!(data6 % 1) && !isNaN(data6)))){const err11 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/0/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}if(typeof data6 == "number"){if(data6 < 0 || isNaN(data6)){const err12 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/0/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}}var _valid0 = _errs19 === errors;if(_valid0){valid3 = true;passing0 = 0;}const _errs21 = errors;if(typeof data6 !== "string"){const err13 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/1/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}if(!(data6 === "auto")){const err14 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/1/enum",keyword:"enum",params:{allowedValues: schema67.properties.count.oneOf[1].enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}var _valid0 = _errs21 === errors;if(_valid0 && valid3){valid3 = false;passing0 = [passing0, 1];}else {if(_valid0){valid3 = true;passing0 = 1;}}if(!valid3){const err15 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf",keyword:"oneOf",params:{passingSchemas: passing0},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}else {errors = _errs18;if(vErrors !== null){if(_errs18){vErrors.length = _errs18;}else {vErrors = null;}}}}if(data.order !== undefined){let data7 = data.order;if(!((typeof data7 == "number") && (!(data7 % 1) && !isNaN(data7)))){const err16 = {instancePath:instancePath+"/order",schemaPath:"#/properties/order/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err16];}else {vErrors.push(err16);}errors++;}}if(data.permission !== undefined){if(typeof data.permission !== "string"){const err17 = {instancePath:instancePath+"/permission",schemaPath:"#/properties/permission/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err17];}else {vErrors.push(err17);}errors++;}}if(data.visibleIf !== undefined){let data9 = data.visibleIf;if(data9 && typeof data9 == "object" && !Array.isArray(data9)){if(data9.appInstalled !== undefined){let data10 = data9.appInstalled;if(typeof data10 === "string"){if(func6(data10) < 1){const err18 = {instancePath:instancePath+"/visibleIf/appInstalled",schemaPath:"#/$defs/visibleIfCondition/properties/appInstalled/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err18];}else {vErrors.push(err18);}errors++;}}else {const err19 = {instancePath:instancePath+"/visibleIf/appInstalled",schemaPath:"#/$defs/visibleIfCondition/properties/appInstalled/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err19];}else {vErrors.push(err19);}errors++;}}}else {const err20 = {instancePath:instancePath+"/visibleIf",schemaPath:"#/$defs/visibleIfCondition/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err20];}else {vErrors.push(err20);}errors++;}}}else {const err21 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err21];}else {vErrors.push(err21);}errors++;}validate37.errors = vErrors;return errors === 0;}validate37.evaluated = {"props":true,"dynamicProps":false,"dynamicItems":false};const pattern23 = new RegExp("^(tab|section):.+", "u");const pattern24 = new RegExp("^(?![a-zA-Z][a-zA-Z0-9+.-]*:)(?!//)\\S+$", "u");function validate26(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate26.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}if(!(validate27(data, {instancePath,parentData,parentDataProperty,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate27.errors : vErrors.concat(validate27.errors);errors = vErrors.length;}else {var props0 = validate27.evaluated.props;var items0 = validate27.evaluated.items;}const _errs3 = errors;let valid1 = true;const _errs4 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.ncDashboard === undefined) && ("ncDashboard")){const err0 = {};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}}var _valid0 = _errs4 === errors;errors = _errs3;if(vErrors !== null){if(_errs3){vErrors.length = _errs3;}else {vErrors = null;}}if(_valid0){const _errs5 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.id === undefined){const err1 = {instancePath,schemaPath:"#/allOf/1/then/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}}var _valid0 = _errs5 === errors;valid1 = _valid0;}if(!valid1){const err2 = {instancePath,schemaPath:"#/allOf/1/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}const _errs7 = errors;let valid2 = true;const _errs8 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.slot === undefined) && ("slot")){const err3 = {};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}else {if(data.slot !== undefined){if("sidebar" !== data.slot){const err4 = {};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}}}}var _valid1 = _errs8 === errors;errors = _errs7;if(vErrors !== null){if(_errs7){vErrors.length = _errs7;}else {vErrors = null;}}if(_valid1){const _errs10 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.gridWidth !== undefined){if(1 !== data.gridWidth){const err5 = {instancePath:instancePath+"/gridWidth",schemaPath:"#/allOf/2/then/properties/gridWidth/const",keyword:"const",params:{allowedValue: 1},message:"must be equal to constant"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}}var _valid1 = _errs10 === errors;valid2 = _valid1;if(valid2){var props1 = {};props1.gridWidth = true;props1.slot = true;}}if(!valid2){const err6 = {instancePath,schemaPath:"#/allOf/2/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}if(props0 !== true && props1 !== undefined){if(props1 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props1);}}const _errs13 = errors;let valid5 = true;const _errs14 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.slot === undefined) && ("slot")){const err7 = {};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}else {if(data.slot !== undefined){if("header-actions" !== data.slot){const err8 = {};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}}}}var _valid2 = _errs14 === errors;errors = _errs13;if(vErrors !== null){if(_errs13){vErrors.length = _errs13;}else {vErrors = null;}}if(_valid2){const _errs16 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.gridY !== undefined){if(0 !== data.gridY){const err9 = {instancePath:instancePath+"/gridY",schemaPath:"#/allOf/3/then/properties/gridY/const",keyword:"const",params:{allowedValue: 0},message:"must be equal to constant"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}}}var _valid2 = _errs16 === errors;valid5 = _valid2;if(valid5){var props2 = {};props2.gridY = true;props2.slot = true;}}if(!valid5){const err10 = {instancePath,schemaPath:"#/allOf/3/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}if(props0 !== true && props2 !== undefined){if(props2 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props2);}}const _errs19 = errors;let valid8 = true;const _errs20 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err11 = {};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}else {if(data.widgetKey !== undefined){if("object-table" !== data.widgetKey){const err12 = {};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}}}}var _valid3 = _errs20 === errors;errors = _errs19;if(vErrors !== null){if(_errs19){vErrors.length = _errs19;}else {vErrors = null;}}if(_valid3){const _errs22 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props !== undefined){let data5 = data.props;if(data5 && typeof data5 == "object" && !Array.isArray(data5)){if(data5.source !== undefined){let data6 = data5.source;if(data6 && typeof data6 == "object" && !Array.isArray(data6)){if(data6.register === undefined){const err13 = {instancePath:instancePath+"/props/source",schemaPath:"#/$defs/objectTableSource/required",keyword:"required",params:{missingProperty: "register"},message:"must have required property '"+"register"+"'"};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}if(data6.schema === undefined){const err14 = {instancePath:instancePath+"/props/source",schemaPath:"#/$defs/objectTableSource/required",keyword:"required",params:{missingProperty: "schema"},message:"must have required property '"+"schema"+"'"};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}for(const key0 in data6){if(!((((((key0 === "register") || (key0 === "schema")) || (key0 === "filter")) || (key0 === "order")) || (key0 === "limit")) || (key0 === "extend"))){const err15 = {instancePath:instancePath+"/props/source",schemaPath:"#/$defs/objectTableSource/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}}if(data6.register !== undefined){if(typeof data6.register !== "string"){const err16 = {instancePath:instancePath+"/props/source/register",schemaPath:"#/$defs/objectTableSource/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err16];}else {vErrors.push(err16);}errors++;}}if(data6.schema !== undefined){if(typeof data6.schema !== "string"){const err17 = {instancePath:instancePath+"/props/source/schema",schemaPath:"#/$defs/objectTableSource/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err17];}else {vErrors.push(err17);}errors++;}}if(data6.filter !== undefined){let data9 = data6.filter;if(data9 && typeof data9 == "object" && !Array.isArray(data9));else {const err18 = {instancePath:instancePath+"/props/source/filter",schemaPath:"#/$defs/objectTableSource/properties/filter/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err18];}else {vErrors.push(err18);}errors++;}}if(data6.order !== undefined){let data10 = data6.order;if(data10 && typeof data10 == "object" && !Array.isArray(data10)){for(const key1 in data10){let data11 = data10[key1];if(typeof data11 !== "string"){const err19 = {instancePath:instancePath+"/props/source/order/" + key1.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/$defs/objectTableSource/properties/order/additionalProperties/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err19];}else {vErrors.push(err19);}errors++;}if(!((data11 === "asc") || (data11 === "desc"))){const err20 = {instancePath:instancePath+"/props/source/order/" + key1.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/$defs/objectTableSource/properties/order/additionalProperties/enum",keyword:"enum",params:{allowedValues: schema62.properties.order.additionalProperties.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err20];}else {vErrors.push(err20);}errors++;}}}else {const err21 = {instancePath:instancePath+"/props/source/order",schemaPath:"#/$defs/objectTableSource/properties/order/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err21];}else {vErrors.push(err21);}errors++;}}if(data6.limit !== undefined){let data12 = data6.limit;if(!((typeof data12 == "number") && (!(data12 % 1) && !isNaN(data12)))){const err22 = {instancePath:instancePath+"/props/source/limit",schemaPath:"#/$defs/objectTableSource/properties/limit/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err22];}else {vErrors.push(err22);}errors++;}if(typeof data12 == "number"){if(data12 < 0 || isNaN(data12)){const err23 = {instancePath:instancePath+"/props/source/limit",schemaPath:"#/$defs/objectTableSource/properties/limit/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err23];}else {vErrors.push(err23);}errors++;}}}if(data6.extend !== undefined){let data13 = data6.extend;if(Array.isArray(data13)){const len0 = data13.length;for(let i0=0; i0<len0; i0++){if(typeof data13[i0] !== "string"){const err24 = {instancePath:instancePath+"/props/source/extend/" + i0,schemaPath:"#/$defs/objectTableSource/properties/extend/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err24];}else {vErrors.push(err24);}errors++;}}}else {const err25 = {instancePath:instancePath+"/props/source/extend",schemaPath:"#/$defs/objectTableSource/properties/extend/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err25];}else {vErrors.push(err25);}errors++;}}}else {const err26 = {instancePath:instancePath+"/props/source",schemaPath:"#/$defs/objectTableSource/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err26];}else {vErrors.push(err26);}errors++;}}if(data5.endpointSource !== undefined){let data15 = data5.endpointSource;if(data15 && typeof data15 == "object" && !Array.isArray(data15)){if(data15.method === undefined){data15.method = "GET";}if(data15.url === undefined){const err27 = {instancePath:instancePath+"/props/endpointSource",schemaPath:"#/$defs/endpointSource/required",keyword:"required",params:{missingProperty: "url"},message:"must have required property '"+"url"+"'"};if(vErrors === null){vErrors = [err27];}else {vErrors.push(err27);}errors++;}for(const key2 in data15){if(!((((key2 === "url") || (key2 === "method")) || (key2 === "params")) || (key2 === "responsePath"))){const err28 = {instancePath:instancePath+"/props/endpointSource",schemaPath:"#/$defs/endpointSource/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key2},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err28];}else {vErrors.push(err28);}errors++;}}if(data15.url !== undefined){if(typeof data15.url !== "string"){const err29 = {instancePath:instancePath+"/props/endpointSource/url",schemaPath:"#/$defs/endpointSource/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err29];}else {vErrors.push(err29);}errors++;}}let data17 = data15.method;if(typeof data17 !== "string"){const err30 = {instancePath:instancePath+"/props/endpointSource/method",schemaPath:"#/$defs/endpointSource/properties/method/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err30];}else {vErrors.push(err30);}errors++;}if(!((data17 === "GET") || (data17 === "POST"))){const err31 = {instancePath:instancePath+"/props/endpointSource/method",schemaPath:"#/$defs/endpointSource/properties/method/enum",keyword:"enum",params:{allowedValues: schema63.properties.method.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err31];}else {vErrors.push(err31);}errors++;}if(data15.params !== undefined){let data18 = data15.params;if(data18 && typeof data18 == "object" && !Array.isArray(data18));else {const err32 = {instancePath:instancePath+"/props/endpointSource/params",schemaPath:"#/$defs/endpointSource/properties/params/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err32];}else {vErrors.push(err32);}errors++;}}if(data15.responsePath !== undefined){if(typeof data15.responsePath !== "string"){const err33 = {instancePath:instancePath+"/props/endpointSource/responsePath",schemaPath:"#/$defs/endpointSource/properties/responsePath/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err33];}else {vErrors.push(err33);}errors++;}}}else {const err34 = {instancePath:instancePath+"/props/endpointSource",schemaPath:"#/$defs/endpointSource/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err34];}else {vErrors.push(err34);}errors++;}}if(data5.actions !== undefined){let data20 = data5.actions;if(Array.isArray(data20)){const len1 = data20.length;for(let i1=0; i1<len1; i1++){if(!(validate33(data20[i1], {instancePath:instancePath+"/props/actions/" + i1,parentData:data20,parentDataProperty:i1,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate33.errors : vErrors.concat(validate33.errors);errors = vErrors.length;}}}else {const err35 = {instancePath:instancePath+"/props/actions",schemaPath:"#/allOf/4/then/properties/props/properties/actions/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err35];}else {vErrors.push(err35);}errors++;}}if(data5.rowClass !== undefined){let data22 = data5.rowClass;if(Array.isArray(data22)){const len2 = data22.length;for(let i2=0; i2<len2; i2++){let data23 = data22[i2];if(data23 && typeof data23 == "object" && !Array.isArray(data23)){if(data23.when === undefined){const err36 = {instancePath:instancePath+"/props/rowClass/" + i2,schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/required",keyword:"required",params:{missingProperty: "when"},message:"must have required property '"+"when"+"'"};if(vErrors === null){vErrors = [err36];}else {vErrors.push(err36);}errors++;}if(data23.class === undefined){const err37 = {instancePath:instancePath+"/props/rowClass/" + i2,schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/required",keyword:"required",params:{missingProperty: "class"},message:"must have required property '"+"class"+"'"};if(vErrors === null){vErrors = [err37];}else {vErrors.push(err37);}errors++;}for(const key3 in data23){if(!((key3 === "when") || (key3 === "class"))){const err38 = {instancePath:instancePath+"/props/rowClass/" + i2,schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key3},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err38];}else {vErrors.push(err38);}errors++;}}if(data23.when !== undefined){let data24 = data23.when;if(data24 && typeof data24 == "object" && !Array.isArray(data24)){if(data24.op === undefined){data24.op = "eq";}if(data24.field === undefined){const err39 = {instancePath:instancePath+"/props/rowClass/" + i2+"/when",schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/properties/when/required",keyword:"required",params:{missingProperty: "field"},message:"must have required property '"+"field"+"'"};if(vErrors === null){vErrors = [err39];}else {vErrors.push(err39);}errors++;}if(data24.value === undefined){const err40 = {instancePath:instancePath+"/props/rowClass/" + i2+"/when",schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/properties/when/required",keyword:"required",params:{missingProperty: "value"},message:"must have required property '"+"value"+"'"};if(vErrors === null){vErrors = [err40];}else {vErrors.push(err40);}errors++;}for(const key4 in data24){if(!(((key4 === "field") || (key4 === "op")) || (key4 === "value"))){const err41 = {instancePath:instancePath+"/props/rowClass/" + i2+"/when",schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/properties/when/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key4},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err41];}else {vErrors.push(err41);}errors++;}}if(data24.field !== undefined){if(typeof data24.field !== "string"){const err42 = {instancePath:instancePath+"/props/rowClass/" + i2+"/when/field",schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/properties/when/properties/field/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err42];}else {vErrors.push(err42);}errors++;}}let data26 = data24.op;if(typeof data26 !== "string"){const err43 = {instancePath:instancePath+"/props/rowClass/" + i2+"/when/op",schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/properties/when/properties/op/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err43];}else {vErrors.push(err43);}errors++;}if(!((((((data26 === "eq") || (data26 === "neq")) || (data26 === "gt")) || (data26 === "gte")) || (data26 === "lt")) || (data26 === "lte"))){const err44 = {instancePath:instancePath+"/props/rowClass/" + i2+"/when/op",schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/properties/when/properties/op/enum",keyword:"enum",params:{allowedValues: schema50.allOf[4].then.properties.props.properties.rowClass.items.properties.when.properties.op.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err44];}else {vErrors.push(err44);}errors++;}}else {const err45 = {instancePath:instancePath+"/props/rowClass/" + i2+"/when",schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/properties/when/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err45];}else {vErrors.push(err45);}errors++;}}if(data23.class !== undefined){if(typeof data23.class !== "string"){const err46 = {instancePath:instancePath+"/props/rowClass/" + i2+"/class",schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/properties/class/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err46];}else {vErrors.push(err46);}errors++;}}}else {const err47 = {instancePath:instancePath+"/props/rowClass/" + i2,schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err47];}else {vErrors.push(err47);}errors++;}}}else {const err48 = {instancePath:instancePath+"/props/rowClass",schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err48];}else {vErrors.push(err48);}errors++;}}}else {const err49 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/4/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err49];}else {vErrors.push(err49);}errors++;}}}var _valid3 = _errs22 === errors;valid8 = _valid3;if(valid8){var props3 = {};props3.props = true;props3.widgetKey = true;}}if(!valid8){const err50 = {instancePath,schemaPath:"#/allOf/4/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err50];}else {vErrors.push(err50);}errors++;}if(props0 !== true && props3 !== undefined){if(props3 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props3);}}const _errs78 = errors;let valid25 = true;const _errs79 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err51 = {};if(vErrors === null){vErrors = [err51];}else {vErrors.push(err51);}errors++;}else {if(data.widgetKey !== undefined){if("nav-card-grid" !== data.widgetKey){const err52 = {};if(vErrors === null){vErrors = [err52];}else {vErrors.push(err52);}errors++;}}}}var _valid4 = _errs79 === errors;errors = _errs78;if(vErrors !== null){if(_errs78){vErrors.length = _errs78;}else {vErrors = null;}}if(_valid4){const _errs81 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props === undefined){const err53 = {instancePath,schemaPath:"#/allOf/5/then/required",keyword:"required",params:{missingProperty: "props"},message:"must have required property '"+"props"+"'"};if(vErrors === null){vErrors = [err53];}else {vErrors.push(err53);}errors++;}if(data.props !== undefined){let data29 = data.props;if(data29 && typeof data29 == "object" && !Array.isArray(data29)){if(data29.entries === undefined){const err54 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/5/then/properties/props/required",keyword:"required",params:{missingProperty: "entries"},message:"must have required property '"+"entries"+"'"};if(vErrors === null){vErrors = [err54];}else {vErrors.push(err54);}errors++;}if(data29.entries !== undefined){let data30 = data29.entries;if(Array.isArray(data30)){const len3 = data30.length;for(let i3=0; i3<len3; i3++){if(!(validate37(data30[i3], {instancePath:instancePath+"/props/entries/" + i3,parentData:data30,parentDataProperty:i3,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate37.errors : vErrors.concat(validate37.errors);errors = vErrors.length;}}}else {const err55 = {instancePath:instancePath+"/props/entries",schemaPath:"#/allOf/5/then/properties/props/properties/entries/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err55];}else {vErrors.push(err55);}errors++;}}}else {const err56 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/5/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err56];}else {vErrors.push(err56);}errors++;}}}var _valid4 = _errs81 === errors;valid25 = _valid4;if(valid25){var props4 = {};props4.props = true;props4.widgetKey = true;}}if(!valid25){const err57 = {instancePath,schemaPath:"#/allOf/5/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err57];}else {vErrors.push(err57);}errors++;}if(props0 !== true && props4 !== undefined){if(props4 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props4);}}const _errs88 = errors;let valid31 = true;const _errs89 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err58 = {};if(vErrors === null){vErrors = [err58];}else {vErrors.push(err58);}errors++;}else {if(data.widgetKey !== undefined){if("stats-block" !== data.widgetKey){const err59 = {};if(vErrors === null){vErrors = [err59];}else {vErrors.push(err59);}errors++;}}}}var _valid5 = _errs89 === errors;errors = _errs88;if(vErrors !== null){if(_errs88){vErrors.length = _errs88;}else {vErrors = null;}}if(_valid5){const _errs91 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props !== undefined){let data33 = data.props;if(data33 && typeof data33 == "object" && !Array.isArray(data33)){if(data33.entries !== undefined){let data34 = data33.entries;if(Array.isArray(data34)){const len4 = data34.length;for(let i4=0; i4<len4; i4++){let data35 = data34[i4];if(data35 && typeof data35 == "object" && !Array.isArray(data35)){if(data35.hideWhenZero === undefined){data35.hideWhenZero = false;}if(data35.register === undefined){const err60 = {instancePath:instancePath+"/props/entries/" + i4,schemaPath:"#/$defs/statsBlockEntry/required",keyword:"required",params:{missingProperty: "register"},message:"must have required property '"+"register"+"'"};if(vErrors === null){vErrors = [err60];}else {vErrors.push(err60);}errors++;}if(data35.schema === undefined){const err61 = {instancePath:instancePath+"/props/entries/" + i4,schemaPath:"#/$defs/statsBlockEntry/required",keyword:"required",params:{missingProperty: "schema"},message:"must have required property '"+"schema"+"'"};if(vErrors === null){vErrors = [err61];}else {vErrors.push(err61);}errors++;}for(const key5 in data35){if(!(func1.call(schema69.properties, key5))){const err62 = {instancePath:instancePath+"/props/entries/" + i4,schemaPath:"#/$defs/statsBlockEntry/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key5},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err62];}else {vErrors.push(err62);}errors++;}}if(data35.title !== undefined){if(typeof data35.title !== "string"){const err63 = {instancePath:instancePath+"/props/entries/" + i4+"/title",schemaPath:"#/$defs/statsBlockEntry/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err63];}else {vErrors.push(err63);}errors++;}}if(data35.register !== undefined){if(typeof data35.register !== "string"){const err64 = {instancePath:instancePath+"/props/entries/" + i4+"/register",schemaPath:"#/$defs/statsBlockEntry/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err64];}else {vErrors.push(err64);}errors++;}}if(data35.schema !== undefined){if(typeof data35.schema !== "string"){const err65 = {instancePath:instancePath+"/props/entries/" + i4+"/schema",schemaPath:"#/$defs/statsBlockEntry/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err65];}else {vErrors.push(err65);}errors++;}}if(data35.metric !== undefined){if(typeof data35.metric !== "string"){const err66 = {instancePath:instancePath+"/props/entries/" + i4+"/metric",schemaPath:"#/$defs/statsBlockEntry/properties/metric/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err66];}else {vErrors.push(err66);}errors++;}}if(data35.field !== undefined){if(typeof data35.field !== "string"){const err67 = {instancePath:instancePath+"/props/entries/" + i4+"/field",schemaPath:"#/$defs/statsBlockEntry/properties/field/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err67];}else {vErrors.push(err67);}errors++;}}if(data35.filter !== undefined){let data41 = data35.filter;if(data41 && typeof data41 == "object" && !Array.isArray(data41));else {const err68 = {instancePath:instancePath+"/props/entries/" + i4+"/filter",schemaPath:"#/$defs/statsBlockEntry/properties/filter/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err68];}else {vErrors.push(err68);}errors++;}}if(data35.route !== undefined){let data42 = data35.route;if(data42 && typeof data42 == "object" && !Array.isArray(data42));else {const err69 = {instancePath:instancePath+"/props/entries/" + i4+"/route",schemaPath:"#/$defs/statsBlockEntry/properties/route/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err69];}else {vErrors.push(err69);}errors++;}}if(data35.variant !== undefined){let data43 = data35.variant;if(typeof data43 !== "string"){const err70 = {instancePath:instancePath+"/props/entries/" + i4+"/variant",schemaPath:"#/$defs/statsBlockEntry/properties/variant/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err70];}else {vErrors.push(err70);}errors++;}if(!(((((data43 === "default") || (data43 === "primary")) || (data43 === "success")) || (data43 === "warning")) || (data43 === "error"))){const err71 = {instancePath:instancePath+"/props/entries/" + i4+"/variant",schemaPath:"#/$defs/statsBlockEntry/properties/variant/enum",keyword:"enum",params:{allowedValues: schema69.properties.variant.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err71];}else {vErrors.push(err71);}errors++;}}if(data35.countLabel !== undefined){if(typeof data35.countLabel !== "string"){const err72 = {instancePath:instancePath+"/props/entries/" + i4+"/countLabel",schemaPath:"#/$defs/statsBlockEntry/properties/countLabel/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err72];}else {vErrors.push(err72);}errors++;}}if(data35.iconClass !== undefined){if(typeof data35.iconClass !== "string"){const err73 = {instancePath:instancePath+"/props/entries/" + i4+"/iconClass",schemaPath:"#/$defs/statsBlockEntry/properties/iconClass/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err73];}else {vErrors.push(err73);}errors++;}}if(typeof data35.hideWhenZero !== "boolean"){const err74 = {instancePath:instancePath+"/props/entries/" + i4+"/hideWhenZero",schemaPath:"#/$defs/statsBlockEntry/properties/hideWhenZero/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err74];}else {vErrors.push(err74);}errors++;}}else {const err75 = {instancePath:instancePath+"/props/entries/" + i4,schemaPath:"#/$defs/statsBlockEntry/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err75];}else {vErrors.push(err75);}errors++;}}}else {const err76 = {instancePath:instancePath+"/props/entries",schemaPath:"#/allOf/6/then/properties/props/properties/entries/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err76];}else {vErrors.push(err76);}errors++;}}}else {const err77 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/6/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err77];}else {vErrors.push(err77);}errors++;}}}var _valid5 = _errs91 === errors;valid31 = _valid5;if(valid31){var props5 = {};props5.props = true;props5.widgetKey = true;}}if(!valid31){const err78 = {instancePath,schemaPath:"#/allOf/6/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err78];}else {vErrors.push(err78);}errors++;}if(props0 !== true && props5 !== undefined){if(props5 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props5);}}const _errs125 = errors;let valid39 = true;const _errs126 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err79 = {};if(vErrors === null){vErrors = [err79];}else {vErrors.push(err79);}errors++;}else {if(data.widgetKey !== undefined){if("banner" !== data.widgetKey){const err80 = {};if(vErrors === null){vErrors = [err80];}else {vErrors.push(err80);}errors++;}}}}var _valid6 = _errs126 === errors;errors = _errs125;if(vErrors !== null){if(_errs125){vErrors.length = _errs125;}else {vErrors = null;}}if(_valid6){const _errs128 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props !== undefined){let data48 = data.props;if(data48 && typeof data48 == "object" && !Array.isArray(data48)){if(data48.variant !== undefined){let data49 = data48.variant;if(typeof data49 !== "string"){const err81 = {instancePath:instancePath+"/props/variant",schemaPath:"#/allOf/7/then/properties/props/properties/variant/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err81];}else {vErrors.push(err81);}errors++;}if(!((((data49 === "info") || (data49 === "warning")) || (data49 === "error")) || (data49 === "success"))){const err82 = {instancePath:instancePath+"/props/variant",schemaPath:"#/allOf/7/then/properties/props/properties/variant/enum",keyword:"enum",params:{allowedValues: schema50.allOf[7].then.properties.props.properties.variant.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err82];}else {vErrors.push(err82);}errors++;}}if(data48.text !== undefined){if(typeof data48.text !== "string"){const err83 = {instancePath:instancePath+"/props/text",schemaPath:"#/allOf/7/then/properties/props/properties/text/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err83];}else {vErrors.push(err83);}errors++;}}if(data48.visibleWhen !== undefined){let data51 = data48.visibleWhen;if(data51 && typeof data51 == "object" && !Array.isArray(data51)){if(data51.op === undefined){data51.op = "eq";}for(const key6 in data51){if(!(((((key6 === "endpoint") || (key6 === "source")) || (key6 === "field")) || (key6 === "op")) || (key6 === "value"))){const err84 = {instancePath:instancePath+"/props/visibleWhen",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key6},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err84];}else {vErrors.push(err84);}errors++;}}if(data51.endpoint !== undefined){if(typeof data51.endpoint !== "string"){const err85 = {instancePath:instancePath+"/props/visibleWhen/endpoint",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/endpoint/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err85];}else {vErrors.push(err85);}errors++;}}if(data51.source !== undefined){let data53 = data51.source;if(data53 && typeof data53 == "object" && !Array.isArray(data53)){if(data53.register === undefined){const err86 = {instancePath:instancePath+"/props/visibleWhen/source",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/source/required",keyword:"required",params:{missingProperty: "register"},message:"must have required property '"+"register"+"'"};if(vErrors === null){vErrors = [err86];}else {vErrors.push(err86);}errors++;}if(data53.schema === undefined){const err87 = {instancePath:instancePath+"/props/visibleWhen/source",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/source/required",keyword:"required",params:{missingProperty: "schema"},message:"must have required property '"+"schema"+"'"};if(vErrors === null){vErrors = [err87];}else {vErrors.push(err87);}errors++;}for(const key7 in data53){if(!(((key7 === "register") || (key7 === "schema")) || (key7 === "filter"))){const err88 = {instancePath:instancePath+"/props/visibleWhen/source",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/source/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key7},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err88];}else {vErrors.push(err88);}errors++;}}if(data53.register !== undefined){if(typeof data53.register !== "string"){const err89 = {instancePath:instancePath+"/props/visibleWhen/source/register",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/source/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err89];}else {vErrors.push(err89);}errors++;}}if(data53.schema !== undefined){if(typeof data53.schema !== "string"){const err90 = {instancePath:instancePath+"/props/visibleWhen/source/schema",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/source/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err90];}else {vErrors.push(err90);}errors++;}}if(data53.filter !== undefined){let data56 = data53.filter;if(data56 && typeof data56 == "object" && !Array.isArray(data56));else {const err91 = {instancePath:instancePath+"/props/visibleWhen/source/filter",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/source/properties/filter/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err91];}else {vErrors.push(err91);}errors++;}}}else {const err92 = {instancePath:instancePath+"/props/visibleWhen/source",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/source/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err92];}else {vErrors.push(err92);}errors++;}}if(data51.field !== undefined){if(typeof data51.field !== "string"){const err93 = {instancePath:instancePath+"/props/visibleWhen/field",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/field/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err93];}else {vErrors.push(err93);}errors++;}}let data58 = data51.op;if(typeof data58 !== "string"){const err94 = {instancePath:instancePath+"/props/visibleWhen/op",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/op/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err94];}else {vErrors.push(err94);}errors++;}if(!((((((data58 === "eq") || (data58 === "neq")) || (data58 === "gt")) || (data58 === "gte")) || (data58 === "lt")) || (data58 === "lte"))){const err95 = {instancePath:instancePath+"/props/visibleWhen/op",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/op/enum",keyword:"enum",params:{allowedValues: schema50.allOf[7].then.properties.props.properties.visibleWhen.properties.op.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err95];}else {vErrors.push(err95);}errors++;}}else {const err96 = {instancePath:instancePath+"/props/visibleWhen",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err96];}else {vErrors.push(err96);}errors++;}}if(data48.route !== undefined){let data59 = data48.route;const _errs155 = errors;let valid45 = false;let passing0 = null;const _errs156 = errors;if(typeof data59 !== "string"){const err97 = {instancePath:instancePath+"/props/route",schemaPath:"#/allOf/7/then/properties/props/properties/route/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err97];}else {vErrors.push(err97);}errors++;}var _valid7 = _errs156 === errors;if(_valid7){valid45 = true;passing0 = 0;}const _errs158 = errors;if(data59 && typeof data59 == "object" && !Array.isArray(data59));else {const err98 = {instancePath:instancePath+"/props/route",schemaPath:"#/allOf/7/then/properties/props/properties/route/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err98];}else {vErrors.push(err98);}errors++;}var _valid7 = _errs158 === errors;if(_valid7 && valid45){valid45 = false;passing0 = [passing0, 1];}else {if(_valid7){valid45 = true;passing0 = 1;}}if(!valid45){const err99 = {instancePath:instancePath+"/props/route",schemaPath:"#/allOf/7/then/properties/props/properties/route/oneOf",keyword:"oneOf",params:{passingSchemas: passing0},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err99];}else {vErrors.push(err99);}errors++;}else {errors = _errs155;if(vErrors !== null){if(_errs155){vErrors.length = _errs155;}else {vErrors = null;}}}}}else {const err100 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/7/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err100];}else {vErrors.push(err100);}errors++;}}}var _valid6 = _errs128 === errors;valid39 = _valid6;if(valid39){var props7 = {};props7.props = true;props7.widgetKey = true;}}if(!valid39){const err101 = {instancePath,schemaPath:"#/allOf/7/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err101];}else {vErrors.push(err101);}errors++;}if(props0 !== true && props7 !== undefined){if(props7 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props7);}}const _errs162 = errors;let valid46 = true;const _errs163 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err102 = {};if(vErrors === null){vErrors = [err102];}else {vErrors.push(err102);}errors++;}else {if(data.widgetKey !== undefined){if("audit-trail" !== data.widgetKey){const err103 = {};if(vErrors === null){vErrors = [err103];}else {vErrors.push(err103);}errors++;}}}}var _valid8 = _errs163 === errors;errors = _errs162;if(vErrors !== null){if(_errs162){vErrors.length = _errs162;}else {vErrors = null;}}if(_valid8){const _errs165 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props !== undefined){let data61 = data.props;if(data61 && typeof data61 == "object" && !Array.isArray(data61)){if(data61.register !== undefined){if(typeof data61.register !== "string"){const err104 = {instancePath:instancePath+"/props/register",schemaPath:"#/allOf/8/then/properties/props/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err104];}else {vErrors.push(err104);}errors++;}}if(data61.schema !== undefined){if(typeof data61.schema !== "string"){const err105 = {instancePath:instancePath+"/props/schema",schemaPath:"#/allOf/8/then/properties/props/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err105];}else {vErrors.push(err105);}errors++;}}if(data61.objectId !== undefined){if(typeof data61.objectId !== "string"){const err106 = {instancePath:instancePath+"/props/objectId",schemaPath:"#/allOf/8/then/properties/props/properties/objectId/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err106];}else {vErrors.push(err106);}errors++;}}if(data61.title !== undefined){if(typeof data61.title !== "string"){const err107 = {instancePath:instancePath+"/props/title",schemaPath:"#/allOf/8/then/properties/props/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err107];}else {vErrors.push(err107);}errors++;}}if(data61.maxDisplay !== undefined){let data66 = data61.maxDisplay;if(!((typeof data66 == "number") && (!(data66 % 1) && !isNaN(data66)))){const err108 = {instancePath:instancePath+"/props/maxDisplay",schemaPath:"#/allOf/8/then/properties/props/properties/maxDisplay/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err108];}else {vErrors.push(err108);}errors++;}if(typeof data66 == "number"){if(data66 < 1 || isNaN(data66)){const err109 = {instancePath:instancePath+"/props/maxDisplay",schemaPath:"#/allOf/8/then/properties/props/properties/maxDisplay/minimum",keyword:"minimum",params:{comparison: ">=", limit: 1},message:"must be >= 1"};if(vErrors === null){vErrors = [err109];}else {vErrors.push(err109);}errors++;}}}}else {const err110 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/8/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err110];}else {vErrors.push(err110);}errors++;}}}var _valid8 = _errs165 === errors;valid46 = _valid8;if(valid46){var props8 = {};props8.props = true;props8.widgetKey = true;}}if(!valid46){const err111 = {instancePath,schemaPath:"#/allOf/8/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err111];}else {vErrors.push(err111);}errors++;}if(props0 !== true && props8 !== undefined){if(props8 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props8);}}const _errs179 = errors;let valid50 = true;const _errs180 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err112 = {};if(vErrors === null){vErrors = [err112];}else {vErrors.push(err112);}errors++;}else {if(data.widgetKey !== undefined){if("chart" !== data.widgetKey){const err113 = {};if(vErrors === null){vErrors = [err113];}else {vErrors.push(err113);}errors++;}}}}var _valid9 = _errs180 === errors;errors = _errs179;if(vErrors !== null){if(_errs179){vErrors.length = _errs179;}else {vErrors = null;}}if(_valid9){const _errs182 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props !== undefined){let data68 = data.props;if(data68 && typeof data68 == "object" && !Array.isArray(data68)){if(data68.horizontal !== undefined){if(typeof data68.horizontal !== "boolean"){const err114 = {instancePath:instancePath+"/props/horizontal",schemaPath:"#/allOf/9/then/properties/props/properties/horizontal/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err114];}else {vErrors.push(err114);}errors++;}}if(data68.legendPosition !== undefined){let data70 = data68.legendPosition;if(typeof data70 !== "string"){const err115 = {instancePath:instancePath+"/props/legendPosition",schemaPath:"#/allOf/9/then/properties/props/properties/legendPosition/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err115];}else {vErrors.push(err115);}errors++;}if(!((((data70 === "top") || (data70 === "bottom")) || (data70 === "left")) || (data70 === "right"))){const err116 = {instancePath:instancePath+"/props/legendPosition",schemaPath:"#/allOf/9/then/properties/props/properties/legendPosition/enum",keyword:"enum",params:{allowedValues: schema50.allOf[9].then.properties.props.properties.legendPosition.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err116];}else {vErrors.push(err116);}errors++;}}if(data68.valueAxisBaseline !== undefined){let data71 = data68.valueAxisBaseline;if(typeof data71 !== "string"){const err117 = {instancePath:instancePath+"/props/valueAxisBaseline",schemaPath:"#/allOf/9/then/properties/props/properties/valueAxisBaseline/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err117];}else {vErrors.push(err117);}errors++;}if(!(((data71 === "auto") || (data71 === "zero")) || (data71 === "fit"))){const err118 = {instancePath:instancePath+"/props/valueAxisBaseline",schemaPath:"#/allOf/9/then/properties/props/properties/valueAxisBaseline/enum",keyword:"enum",params:{allowedValues: schema50.allOf[9].then.properties.props.properties.valueAxisBaseline.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err118];}else {vErrors.push(err118);}errors++;}}if(data68.valueFormat !== undefined){let data72 = data68.valueFormat;const _errs192 = errors;let valid54 = false;let passing1 = null;const _errs193 = errors;if(typeof data72 !== "string"){const err119 = {instancePath:instancePath+"/props/valueFormat",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err119];}else {vErrors.push(err119);}errors++;}if(!(((data72 === "currency") || (data72 === "currency-compact")) || (data72 === "percent"))){const err120 = {instancePath:instancePath+"/props/valueFormat",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/0/enum",keyword:"enum",params:{allowedValues: schema50.allOf[9].then.properties.props.properties.valueFormat.oneOf[0].enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err120];}else {vErrors.push(err120);}errors++;}var _valid10 = _errs193 === errors;if(_valid10){valid54 = true;passing1 = 0;}const _errs195 = errors;if(data72 && typeof data72 == "object" && !Array.isArray(data72)){if(data72.name === undefined){const err121 = {instancePath:instancePath+"/props/valueFormat",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/1/required",keyword:"required",params:{missingProperty: "name"},message:"must have required property '"+"name"+"'"};if(vErrors === null){vErrors = [err121];}else {vErrors.push(err121);}errors++;}for(const key8 in data72){if(!(((key8 === "name") || (key8 === "currency")) || (key8 === "decimals"))){const err122 = {instancePath:instancePath+"/props/valueFormat",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/1/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key8},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err122];}else {vErrors.push(err122);}errors++;}}if(data72.name !== undefined){let data73 = data72.name;if(typeof data73 !== "string"){const err123 = {instancePath:instancePath+"/props/valueFormat/name",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/1/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err123];}else {vErrors.push(err123);}errors++;}if(!(((data73 === "currency") || (data73 === "currency-compact")) || (data73 === "percent"))){const err124 = {instancePath:instancePath+"/props/valueFormat/name",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/1/properties/name/enum",keyword:"enum",params:{allowedValues: schema50.allOf[9].then.properties.props.properties.valueFormat.oneOf[1].properties.name.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err124];}else {vErrors.push(err124);}errors++;}}if(data72.currency !== undefined){if(typeof data72.currency !== "string"){const err125 = {instancePath:instancePath+"/props/valueFormat/currency",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/1/properties/currency/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err125];}else {vErrors.push(err125);}errors++;}}if(data72.decimals !== undefined){let data75 = data72.decimals;if(!((typeof data75 == "number") && (!(data75 % 1) && !isNaN(data75)))){const err126 = {instancePath:instancePath+"/props/valueFormat/decimals",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/1/properties/decimals/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err126];}else {vErrors.push(err126);}errors++;}if(typeof data75 == "number"){if(data75 < 0 || isNaN(data75)){const err127 = {instancePath:instancePath+"/props/valueFormat/decimals",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/1/properties/decimals/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err127];}else {vErrors.push(err127);}errors++;}}}}else {const err128 = {instancePath:instancePath+"/props/valueFormat",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err128];}else {vErrors.push(err128);}errors++;}var _valid10 = _errs195 === errors;if(_valid10 && valid54){valid54 = false;passing1 = [passing1, 1];}else {if(_valid10){valid54 = true;passing1 = 1;}}if(!valid54){const err129 = {instancePath:instancePath+"/props/valueFormat",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf",keyword:"oneOf",params:{passingSchemas: passing1},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err129];}else {vErrors.push(err129);}errors++;}else {errors = _errs192;if(vErrors !== null){if(_errs192){vErrors.length = _errs192;}else {vErrors = null;}}}}if(data68.colorMap !== undefined){let data76 = data68.colorMap;if(data76 && typeof data76 == "object" && !Array.isArray(data76)){for(const key9 in data76){if(typeof data76[key9] !== "string"){const err130 = {instancePath:instancePath+"/props/colorMap/" + key9.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/allOf/9/then/properties/props/properties/colorMap/additionalProperties/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err130];}else {vErrors.push(err130);}errors++;}}}else {const err131 = {instancePath:instancePath+"/props/colorMap",schemaPath:"#/allOf/9/then/properties/props/properties/colorMap/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err131];}else {vErrors.push(err131);}errors++;}}if(data68.emptyLabel !== undefined){if(typeof data68.emptyLabel !== "string"){const err132 = {instancePath:instancePath+"/props/emptyLabel",schemaPath:"#/allOf/9/then/properties/props/properties/emptyLabel/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err132];}else {vErrors.push(err132);}errors++;}}if(data68.endpointSource !== undefined){let data79 = data68.endpointSource;if(data79 && typeof data79 == "object" && !Array.isArray(data79)){if(data79.method === undefined){data79.method = "GET";}if(data79.url === undefined){const err133 = {instancePath:instancePath+"/props/endpointSource",schemaPath:"#/$defs/chartEndpointSource/required",keyword:"required",params:{missingProperty: "url"},message:"must have required property '"+"url"+"'"};if(vErrors === null){vErrors = [err133];}else {vErrors.push(err133);}errors++;}for(const key10 in data79){if(!((((((key10 === "url") || (key10 === "method")) || (key10 === "params")) || (key10 === "responsePath")) || (key10 === "labelsPath")) || (key10 === "series"))){const err134 = {instancePath:instancePath+"/props/endpointSource",schemaPath:"#/$defs/chartEndpointSource/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key10},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err134];}else {vErrors.push(err134);}errors++;}}if(data79.url !== undefined){if(typeof data79.url !== "string"){const err135 = {instancePath:instancePath+"/props/endpointSource/url",schemaPath:"#/$defs/chartEndpointSource/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err135];}else {vErrors.push(err135);}errors++;}}let data81 = data79.method;if(typeof data81 !== "string"){const err136 = {instancePath:instancePath+"/props/endpointSource/method",schemaPath:"#/$defs/chartEndpointSource/properties/method/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err136];}else {vErrors.push(err136);}errors++;}if(!((data81 === "GET") || (data81 === "POST"))){const err137 = {instancePath:instancePath+"/props/endpointSource/method",schemaPath:"#/$defs/chartEndpointSource/properties/method/enum",keyword:"enum",params:{allowedValues: schema70.properties.method.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err137];}else {vErrors.push(err137);}errors++;}if(data79.params !== undefined){let data82 = data79.params;if(data82 && typeof data82 == "object" && !Array.isArray(data82));else {const err138 = {instancePath:instancePath+"/props/endpointSource/params",schemaPath:"#/$defs/chartEndpointSource/properties/params/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err138];}else {vErrors.push(err138);}errors++;}}if(data79.responsePath !== undefined){if(typeof data79.responsePath !== "string"){const err139 = {instancePath:instancePath+"/props/endpointSource/responsePath",schemaPath:"#/$defs/chartEndpointSource/properties/responsePath/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err139];}else {vErrors.push(err139);}errors++;}}if(data79.labelsPath !== undefined){if(typeof data79.labelsPath !== "string"){const err140 = {instancePath:instancePath+"/props/endpointSource/labelsPath",schemaPath:"#/$defs/chartEndpointSource/properties/labelsPath/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err140];}else {vErrors.push(err140);}errors++;}}if(data79.series !== undefined){let data85 = data79.series;if(Array.isArray(data85)){const len5 = data85.length;for(let i5=0; i5<len5; i5++){let data86 = data85[i5];if(data86 && typeof data86 == "object" && !Array.isArray(data86)){if(data86.path === undefined){const err141 = {instancePath:instancePath+"/props/endpointSource/series/" + i5,schemaPath:"#/$defs/chartEndpointSource/properties/series/items/required",keyword:"required",params:{missingProperty: "path"},message:"must have required property '"+"path"+"'"};if(vErrors === null){vErrors = [err141];}else {vErrors.push(err141);}errors++;}for(const key11 in data86){if(!((key11 === "name") || (key11 === "path"))){const err142 = {instancePath:instancePath+"/props/endpointSource/series/" + i5,schemaPath:"#/$defs/chartEndpointSource/properties/series/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key11},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err142];}else {vErrors.push(err142);}errors++;}}if(data86.name !== undefined){if(typeof data86.name !== "string"){const err143 = {instancePath:instancePath+"/props/endpointSource/series/" + i5+"/name",schemaPath:"#/$defs/chartEndpointSource/properties/series/items/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err143];}else {vErrors.push(err143);}errors++;}}if(data86.path !== undefined){if(typeof data86.path !== "string"){const err144 = {instancePath:instancePath+"/props/endpointSource/series/" + i5+"/path",schemaPath:"#/$defs/chartEndpointSource/properties/series/items/properties/path/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err144];}else {vErrors.push(err144);}errors++;}}}else {const err145 = {instancePath:instancePath+"/props/endpointSource/series/" + i5,schemaPath:"#/$defs/chartEndpointSource/properties/series/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err145];}else {vErrors.push(err145);}errors++;}}}else {const err146 = {instancePath:instancePath+"/props/endpointSource/series",schemaPath:"#/$defs/chartEndpointSource/properties/series/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err146];}else {vErrors.push(err146);}errors++;}}}else {const err147 = {instancePath:instancePath+"/props/endpointSource",schemaPath:"#/$defs/chartEndpointSource/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err147];}else {vErrors.push(err147);}errors++;}}}else {const err148 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/9/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err148];}else {vErrors.push(err148);}errors++;}}}var _valid9 = _errs182 === errors;valid50 = _valid9;if(valid50){var props10 = {};props10.props = true;props10.widgetKey = true;}}if(!valid50){const err149 = {instancePath,schemaPath:"#/allOf/9/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err149];}else {vErrors.push(err149);}errors++;}if(props0 !== true && props10 !== undefined){if(props10 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props10);}}const _errs236 = errors;let valid62 = true;const _errs237 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err150 = {};if(vErrors === null){vErrors = [err150];}else {vErrors.push(err150);}errors++;}else {if(data.widgetKey !== undefined){let data89 = data.widgetKey;if(!(((data89 === "header") || (data89 === "text")) || (data89 === "divider"))){const err151 = {};if(vErrors === null){vErrors = [err151];}else {vErrors.push(err151);}errors++;}}}}var _valid11 = _errs237 === errors;errors = _errs236;if(vErrors !== null){if(_errs236){vErrors.length = _errs236;}else {vErrors = null;}}if(_valid11){const _errs239 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props !== undefined){let data90 = data.props;if(data90 && typeof data90 == "object" && !Array.isArray(data90)){if(data90.content !== undefined){let data91 = data90.content;if(data91 && typeof data91 == "object" && !Array.isArray(data91));else {const err152 = {instancePath:instancePath+"/props/content",schemaPath:"#/allOf/10/then/properties/props/properties/content/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err152];}else {vErrors.push(err152);}errors++;}}}else {const err153 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/10/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err153];}else {vErrors.push(err153);}errors++;}}}var _valid11 = _errs239 === errors;valid62 = _valid11;if(valid62){var props11 = {};props11.props = true;props11.widgetKey = true;}}if(!valid62){const err154 = {instancePath,schemaPath:"#/allOf/10/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err154];}else {vErrors.push(err154);}errors++;}if(props0 !== true && props11 !== undefined){if(props11 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props11);}}const _errs246 = errors;let valid66 = true;const _errs247 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err155 = {};if(vErrors === null){vErrors = [err155];}else {vErrors.push(err155);}errors++;}else {if(data.widgetKey !== undefined){let data92 = data.widgetKey;if(!((data92 === "stat") || (data92 === "delta"))){const err156 = {};if(vErrors === null){vErrors = [err156];}else {vErrors.push(err156);}errors++;}}}}var _valid12 = _errs247 === errors;errors = _errs246;if(vErrors !== null){if(_errs246){vErrors.length = _errs246;}else {vErrors = null;}}if(_valid12){const _errs249 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props !== undefined){let data93 = data.props;if(data93 && typeof data93 == "object" && !Array.isArray(data93)){if(data93.content !== undefined){let data94 = data93.content;if(data94 && typeof data94 == "object" && !Array.isArray(data94)){if(data94.goodDirection === undefined){data94.goodDirection = "up";}if(data94.endpointSource !== undefined){let data95 = data94.endpointSource;if(data95 && typeof data95 == "object" && !Array.isArray(data95)){if(data95.method === undefined){data95.method = "GET";}if(data95.url === undefined){const err157 = {instancePath:instancePath+"/props/content/endpointSource",schemaPath:"#/$defs/endpointSource/required",keyword:"required",params:{missingProperty: "url"},message:"must have required property '"+"url"+"'"};if(vErrors === null){vErrors = [err157];}else {vErrors.push(err157);}errors++;}for(const key12 in data95){if(!((((key12 === "url") || (key12 === "method")) || (key12 === "params")) || (key12 === "responsePath"))){const err158 = {instancePath:instancePath+"/props/content/endpointSource",schemaPath:"#/$defs/endpointSource/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key12},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err158];}else {vErrors.push(err158);}errors++;}}if(data95.url !== undefined){if(typeof data95.url !== "string"){const err159 = {instancePath:instancePath+"/props/content/endpointSource/url",schemaPath:"#/$defs/endpointSource/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err159];}else {vErrors.push(err159);}errors++;}}let data97 = data95.method;if(typeof data97 !== "string"){const err160 = {instancePath:instancePath+"/props/content/endpointSource/method",schemaPath:"#/$defs/endpointSource/properties/method/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err160];}else {vErrors.push(err160);}errors++;}if(!((data97 === "GET") || (data97 === "POST"))){const err161 = {instancePath:instancePath+"/props/content/endpointSource/method",schemaPath:"#/$defs/endpointSource/properties/method/enum",keyword:"enum",params:{allowedValues: schema63.properties.method.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err161];}else {vErrors.push(err161);}errors++;}if(data95.params !== undefined){let data98 = data95.params;if(data98 && typeof data98 == "object" && !Array.isArray(data98));else {const err162 = {instancePath:instancePath+"/props/content/endpointSource/params",schemaPath:"#/$defs/endpointSource/properties/params/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err162];}else {vErrors.push(err162);}errors++;}}if(data95.responsePath !== undefined){if(typeof data95.responsePath !== "string"){const err163 = {instancePath:instancePath+"/props/content/endpointSource/responsePath",schemaPath:"#/$defs/endpointSource/properties/responsePath/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err163];}else {vErrors.push(err163);}errors++;}}}else {const err164 = {instancePath:instancePath+"/props/content/endpointSource",schemaPath:"#/$defs/endpointSource/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err164];}else {vErrors.push(err164);}errors++;}}if(data94.valueField !== undefined){if(typeof data94.valueField !== "string"){const err165 = {instancePath:instancePath+"/props/content/valueField",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/valueField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err165];}else {vErrors.push(err165);}errors++;}}if(data94.previousField !== undefined){if(typeof data94.previousField !== "string"){const err166 = {instancePath:instancePath+"/props/content/previousField",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/previousField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err166];}else {vErrors.push(err166);}errors++;}}if(data94.deltaField !== undefined){if(typeof data94.deltaField !== "string"){const err167 = {instancePath:instancePath+"/props/content/deltaField",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/deltaField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err167];}else {vErrors.push(err167);}errors++;}}let data103 = data94.goodDirection;if(typeof data103 !== "string"){const err168 = {instancePath:instancePath+"/props/content/goodDirection",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/goodDirection/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err168];}else {vErrors.push(err168);}errors++;}if(!((data103 === "up") || (data103 === "down"))){const err169 = {instancePath:instancePath+"/props/content/goodDirection",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/goodDirection/enum",keyword:"enum",params:{allowedValues: schema50.allOf[11].then.properties.props.properties.content.properties.goodDirection.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err169];}else {vErrors.push(err169);}errors++;}if(data94.variantWhen !== undefined){let data104 = data94.variantWhen;if(Array.isArray(data104)){const len6 = data104.length;for(let i6=0; i6<len6; i6++){let data105 = data104[i6];if(data105 && typeof data105 == "object" && !Array.isArray(data105)){if(data105.op === undefined){const err170 = {instancePath:instancePath+"/props/content/variantWhen/" + i6,schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/required",keyword:"required",params:{missingProperty: "op"},message:"must have required property '"+"op"+"'"};if(vErrors === null){vErrors = [err170];}else {vErrors.push(err170);}errors++;}if(data105.value === undefined){const err171 = {instancePath:instancePath+"/props/content/variantWhen/" + i6,schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/required",keyword:"required",params:{missingProperty: "value"},message:"must have required property '"+"value"+"'"};if(vErrors === null){vErrors = [err171];}else {vErrors.push(err171);}errors++;}if(data105.variant === undefined){const err172 = {instancePath:instancePath+"/props/content/variantWhen/" + i6,schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/required",keyword:"required",params:{missingProperty: "variant"},message:"must have required property '"+"variant"+"'"};if(vErrors === null){vErrors = [err172];}else {vErrors.push(err172);}errors++;}for(const key13 in data105){if(!((((key13 === "op") || (key13 === "value")) || (key13 === "variant")) || (key13 === "icon"))){const err173 = {instancePath:instancePath+"/props/content/variantWhen/" + i6,schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key13},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err173];}else {vErrors.push(err173);}errors++;}}if(data105.op !== undefined){let data106 = data105.op;if(typeof data106 !== "string"){const err174 = {instancePath:instancePath+"/props/content/variantWhen/" + i6+"/op",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/properties/op/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err174];}else {vErrors.push(err174);}errors++;}if(!((((((data106 === "eq") || (data106 === "neq")) || (data106 === "gt")) || (data106 === "gte")) || (data106 === "lt")) || (data106 === "lte"))){const err175 = {instancePath:instancePath+"/props/content/variantWhen/" + i6+"/op",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/properties/op/enum",keyword:"enum",params:{allowedValues: schema50.allOf[11].then.properties.props.properties.content.properties.variantWhen.items.properties.op.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err175];}else {vErrors.push(err175);}errors++;}}if(data105.variant !== undefined){let data107 = data105.variant;if(typeof data107 !== "string"){const err176 = {instancePath:instancePath+"/props/content/variantWhen/" + i6+"/variant",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/properties/variant/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err176];}else {vErrors.push(err176);}errors++;}if(!(((((data107 === "default") || (data107 === "primary")) || (data107 === "success")) || (data107 === "warning")) || (data107 === "error"))){const err177 = {instancePath:instancePath+"/props/content/variantWhen/" + i6+"/variant",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/properties/variant/enum",keyword:"enum",params:{allowedValues: schema50.allOf[11].then.properties.props.properties.content.properties.variantWhen.items.properties.variant.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err177];}else {vErrors.push(err177);}errors++;}}if(data105.icon !== undefined){if(typeof data105.icon !== "string"){const err178 = {instancePath:instancePath+"/props/content/variantWhen/" + i6+"/icon",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err178];}else {vErrors.push(err178);}errors++;}}}else {const err179 = {instancePath:instancePath+"/props/content/variantWhen/" + i6,schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err179];}else {vErrors.push(err179);}errors++;}}}else {const err180 = {instancePath:instancePath+"/props/content/variantWhen",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err180];}else {vErrors.push(err180);}errors++;}}if(data94.clickRoute !== undefined){let data109 = data94.clickRoute;const _errs288 = errors;let valid76 = false;let passing2 = null;const _errs289 = errors;if(typeof data109 !== "string"){const err181 = {instancePath:instancePath+"/props/content/clickRoute",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/clickRoute/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err181];}else {vErrors.push(err181);}errors++;}var _valid13 = _errs289 === errors;if(_valid13){valid76 = true;passing2 = 0;}const _errs291 = errors;if(data109 && typeof data109 == "object" && !Array.isArray(data109));else {const err182 = {instancePath:instancePath+"/props/content/clickRoute",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/clickRoute/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err182];}else {vErrors.push(err182);}errors++;}var _valid13 = _errs291 === errors;if(_valid13 && valid76){valid76 = false;passing2 = [passing2, 1];}else {if(_valid13){valid76 = true;passing2 = 1;}}if(!valid76){const err183 = {instancePath:instancePath+"/props/content/clickRoute",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/clickRoute/oneOf",keyword:"oneOf",params:{passingSchemas: passing2},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err183];}else {vErrors.push(err183);}errors++;}else {errors = _errs288;if(vErrors !== null){if(_errs288){vErrors.length = _errs288;}else {vErrors = null;}}}}}else {const err184 = {instancePath:instancePath+"/props/content",schemaPath:"#/allOf/11/then/properties/props/properties/content/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err184];}else {vErrors.push(err184);}errors++;}}}else {const err185 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/11/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err185];}else {vErrors.push(err185);}errors++;}}}var _valid12 = _errs249 === errors;valid66 = _valid12;if(valid66){var props13 = {};props13.props = true;props13.widgetKey = true;}}if(!valid66){const err186 = {instancePath,schemaPath:"#/allOf/11/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err186];}else {vErrors.push(err186);}errors++;}if(props0 !== true && props13 !== undefined){if(props13 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props13);}}const _errs295 = errors;let valid77 = true;const _errs296 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err187 = {};if(vErrors === null){vErrors = [err187];}else {vErrors.push(err187);}errors++;}else {if(data.widgetKey !== undefined){if("workspace-filter" !== data.widgetKey){const err188 = {};if(vErrors === null){vErrors = [err188];}else {vErrors.push(err188);}errors++;}}}}var _valid14 = _errs296 === errors;errors = _errs295;if(vErrors !== null){if(_errs295){vErrors.length = _errs295;}else {vErrors = null;}}if(_valid14){const _errs298 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props !== undefined){let data111 = data.props;if(data111 && typeof data111 == "object" && !Array.isArray(data111)){if(data111.content !== undefined){let data112 = data111.content;if(data112 && typeof data112 == "object" && !Array.isArray(data112)){if(data112.style === undefined){data112.style = "radio";}if(data112.showCounts === undefined){data112.showCounts = true;}if(data112.writes !== undefined){if(typeof data112.writes !== "string"){const err189 = {instancePath:instancePath+"/props/content/writes",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/writes/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err189];}else {vErrors.push(err189);}errors++;}}let data114 = data112.style;if(typeof data114 !== "string"){const err190 = {instancePath:instancePath+"/props/content/style",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/style/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err190];}else {vErrors.push(err190);}errors++;}if(!((data114 === "radio") || (data114 === "select"))){const err191 = {instancePath:instancePath+"/props/content/style",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/style/enum",keyword:"enum",params:{allowedValues: schema50.allOf[12].then.properties.props.properties.content.properties.style.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err191];}else {vErrors.push(err191);}errors++;}if(data112.allLabel !== undefined){if(typeof data112.allLabel !== "string"){const err192 = {instancePath:instancePath+"/props/content/allLabel",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/allLabel/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err192];}else {vErrors.push(err192);}errors++;}}if(typeof data112.showCounts !== "boolean"){const err193 = {instancePath:instancePath+"/props/content/showCounts",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/showCounts/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err193];}else {vErrors.push(err193);}errors++;}if(data112.options !== undefined){let data117 = data112.options;if(Array.isArray(data117)){const len7 = data117.length;for(let i7=0; i7<len7; i7++){let data118 = data117[i7];if(((!(data118 && typeof data118 == "object" && !Array.isArray(data118))) && (typeof data118 !== "string")) && (!(typeof data118 == "number"))){const err194 = {instancePath:instancePath+"/props/content/options/" + i7,schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/options/items/type",keyword:"type",params:{type: schema50.allOf[12].then.properties.props.properties.content.properties.options.items.type},message:"must be object,string,number"};if(vErrors === null){vErrors = [err194];}else {vErrors.push(err194);}errors++;}}}else {const err195 = {instancePath:instancePath+"/props/content/options",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/options/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err195];}else {vErrors.push(err195);}errors++;}}if(data112.source !== undefined){let data119 = data112.source;if(data119 && typeof data119 == "object" && !Array.isArray(data119)){if(data119.register !== undefined){if(typeof data119.register !== "string"){const err196 = {instancePath:instancePath+"/props/content/source/register",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/source/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err196];}else {vErrors.push(err196);}errors++;}}if(data119.schema !== undefined){if(typeof data119.schema !== "string"){const err197 = {instancePath:instancePath+"/props/content/source/schema",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/source/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err197];}else {vErrors.push(err197);}errors++;}}if(data119.groupBy !== undefined){if(typeof data119.groupBy !== "string"){const err198 = {instancePath:instancePath+"/props/content/source/groupBy",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/source/properties/groupBy/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err198];}else {vErrors.push(err198);}errors++;}}if(data119.filter !== undefined){let data123 = data119.filter;if(data123 && typeof data123 == "object" && !Array.isArray(data123));else {const err199 = {instancePath:instancePath+"/props/content/source/filter",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/source/properties/filter/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err199];}else {vErrors.push(err199);}errors++;}}}else {const err200 = {instancePath:instancePath+"/props/content/source",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/source/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err200];}else {vErrors.push(err200);}errors++;}}if(data112.endpointSource !== undefined){let data124 = data112.endpointSource;if(data124 && typeof data124 == "object" && !Array.isArray(data124)){if(data124.method === undefined){data124.method = "GET";}if(data124.url === undefined){const err201 = {instancePath:instancePath+"/props/content/endpointSource",schemaPath:"#/$defs/endpointSource/required",keyword:"required",params:{missingProperty: "url"},message:"must have required property '"+"url"+"'"};if(vErrors === null){vErrors = [err201];}else {vErrors.push(err201);}errors++;}for(const key14 in data124){if(!((((key14 === "url") || (key14 === "method")) || (key14 === "params")) || (key14 === "responsePath"))){const err202 = {instancePath:instancePath+"/props/content/endpointSource",schemaPath:"#/$defs/endpointSource/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key14},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err202];}else {vErrors.push(err202);}errors++;}}if(data124.url !== undefined){if(typeof data124.url !== "string"){const err203 = {instancePath:instancePath+"/props/content/endpointSource/url",schemaPath:"#/$defs/endpointSource/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err203];}else {vErrors.push(err203);}errors++;}}let data126 = data124.method;if(typeof data126 !== "string"){const err204 = {instancePath:instancePath+"/props/content/endpointSource/method",schemaPath:"#/$defs/endpointSource/properties/method/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err204];}else {vErrors.push(err204);}errors++;}if(!((data126 === "GET") || (data126 === "POST"))){const err205 = {instancePath:instancePath+"/props/content/endpointSource/method",schemaPath:"#/$defs/endpointSource/properties/method/enum",keyword:"enum",params:{allowedValues: schema63.properties.method.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err205];}else {vErrors.push(err205);}errors++;}if(data124.params !== undefined){let data127 = data124.params;if(data127 && typeof data127 == "object" && !Array.isArray(data127));else {const err206 = {instancePath:instancePath+"/props/content/endpointSource/params",schemaPath:"#/$defs/endpointSource/properties/params/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err206];}else {vErrors.push(err206);}errors++;}}if(data124.responsePath !== undefined){if(typeof data124.responsePath !== "string"){const err207 = {instancePath:instancePath+"/props/content/endpointSource/responsePath",schemaPath:"#/$defs/endpointSource/properties/responsePath/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err207];}else {vErrors.push(err207);}errors++;}}}else {const err208 = {instancePath:instancePath+"/props/content/endpointSource",schemaPath:"#/$defs/endpointSource/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err208];}else {vErrors.push(err208);}errors++;}}}else {const err209 = {instancePath:instancePath+"/props/content",schemaPath:"#/allOf/12/then/properties/props/properties/content/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err209];}else {vErrors.push(err209);}errors++;}}}else {const err210 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/12/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err210];}else {vErrors.push(err210);}errors++;}}}var _valid14 = _errs298 === errors;valid77 = _valid14;if(valid77){var props14 = {};props14.props = true;props14.widgetKey = true;}}if(!valid77){const err211 = {instancePath,schemaPath:"#/allOf/12/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err211];}else {vErrors.push(err211);}errors++;}if(props0 !== true && props14 !== undefined){if(props14 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props14);}}const _errs342 = errors;let valid87 = true;const _errs343 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err212 = {};if(vErrors === null){vErrors = [err212];}else {vErrors.push(err212);}errors++;}else {if(data.widgetKey !== undefined){if("kb-search" !== data.widgetKey){const err213 = {};if(vErrors === null){vErrors = [err213];}else {vErrors.push(err213);}errors++;}}}}var _valid15 = _errs343 === errors;errors = _errs342;if(vErrors !== null){if(_errs342){vErrors.length = _errs342;}else {vErrors = null;}}if(_valid15){const _errs345 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props !== undefined){let data130 = data.props;if(data130 && typeof data130 == "object" && !Array.isArray(data130)){if(data130.content !== undefined){let data131 = data130.content;if(data131 && typeof data131 == "object" && !Array.isArray(data131)){if(data131.provider !== undefined){if(typeof data131.provider !== "string"){const err214 = {instancePath:instancePath+"/props/content/provider",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/provider/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err214];}else {vErrors.push(err214);}errors++;}}if(data131.space !== undefined){if(typeof data131.space !== "string"){const err215 = {instancePath:instancePath+"/props/content/space",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/space/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err215];}else {vErrors.push(err215);}errors++;}}if(data131.tags !== undefined){let data134 = data131.tags;const _errs356 = errors;let valid92 = false;let passing3 = null;const _errs357 = errors;if(typeof data134 !== "string"){const err216 = {instancePath:instancePath+"/props/content/tags",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/tags/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err216];}else {vErrors.push(err216);}errors++;}var _valid16 = _errs357 === errors;if(_valid16){valid92 = true;passing3 = 0;}const _errs359 = errors;if(Array.isArray(data134)){const len8 = data134.length;for(let i8=0; i8<len8; i8++){if(typeof data134[i8] !== "string"){const err217 = {instancePath:instancePath+"/props/content/tags/" + i8,schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/tags/oneOf/1/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err217];}else {vErrors.push(err217);}errors++;}}}else {const err218 = {instancePath:instancePath+"/props/content/tags",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/tags/oneOf/1/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err218];}else {vErrors.push(err218);}errors++;}var _valid16 = _errs359 === errors;if(_valid16 && valid92){valid92 = false;passing3 = [passing3, 1];}else {if(_valid16){valid92 = true;passing3 = 1;}}if(!valid92){const err219 = {instancePath:instancePath+"/props/content/tags",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/tags/oneOf",keyword:"oneOf",params:{passingSchemas: passing3},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err219];}else {vErrors.push(err219);}errors++;}else {errors = _errs356;if(vErrors !== null){if(_errs356){vErrors.length = _errs356;}else {vErrors = null;}}}}if(data131.endpoint !== undefined){if(typeof data131.endpoint !== "string"){const err220 = {instancePath:instancePath+"/props/content/endpoint",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/endpoint/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err220];}else {vErrors.push(err220);}errors++;}}if(data131.queryParam !== undefined){if(typeof data131.queryParam !== "string"){const err221 = {instancePath:instancePath+"/props/content/queryParam",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/queryParam/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err221];}else {vErrors.push(err221);}errors++;}}if(data131.bindTo !== undefined){if(typeof data131.bindTo !== "string"){const err222 = {instancePath:instancePath+"/props/content/bindTo",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/bindTo/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err222];}else {vErrors.push(err222);}errors++;}}if(data131.minChars !== undefined){let data139 = data131.minChars;if(!((typeof data139 == "number") && (!(data139 % 1) && !isNaN(data139)))){const err223 = {instancePath:instancePath+"/props/content/minChars",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/minChars/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err223];}else {vErrors.push(err223);}errors++;}if(typeof data139 == "number"){if(data139 < 0 || isNaN(data139)){const err224 = {instancePath:instancePath+"/props/content/minChars",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/minChars/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err224];}else {vErrors.push(err224);}errors++;}}}if(data131.limit !== undefined){let data140 = data131.limit;if(!((typeof data140 == "number") && (!(data140 % 1) && !isNaN(data140)))){const err225 = {instancePath:instancePath+"/props/content/limit",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/limit/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err225];}else {vErrors.push(err225);}errors++;}if(typeof data140 == "number"){if(data140 < 1 || isNaN(data140)){const err226 = {instancePath:instancePath+"/props/content/limit",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/limit/minimum",keyword:"minimum",params:{comparison: ">=", limit: 1},message:"must be >= 1"};if(vErrors === null){vErrors = [err226];}else {vErrors.push(err226);}errors++;}}}if(data131.externalOpen !== undefined){if(typeof data131.externalOpen !== "boolean"){const err227 = {instancePath:instancePath+"/props/content/externalOpen",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/externalOpen/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err227];}else {vErrors.push(err227);}errors++;}}if(data131.unavailableFallback !== undefined){if(typeof data131.unavailableFallback !== "string"){const err228 = {instancePath:instancePath+"/props/content/unavailableFallback",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/unavailableFallback/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err228];}else {vErrors.push(err228);}errors++;}}}else {const err229 = {instancePath:instancePath+"/props/content",schemaPath:"#/allOf/13/then/properties/props/properties/content/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err229];}else {vErrors.push(err229);}errors++;}}}else {const err230 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/13/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err230];}else {vErrors.push(err230);}errors++;}}}var _valid15 = _errs345 === errors;valid87 = _valid15;if(valid87){var props15 = {};props15.props = true;props15.widgetKey = true;}}if(!valid87){const err231 = {instancePath,schemaPath:"#/allOf/13/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err231];}else {vErrors.push(err231);}errors++;}if(props0 !== true && props15 !== undefined){if(props15 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props15);}}if(data && typeof data == "object" && !Array.isArray(data)){if(data.dateChip === undefined){data.dateChip = false;}if(data.widgetKey === undefined){const err232 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "widgetKey"},message:"must have required property '"+"widgetKey"+"'"};if(vErrors === null){vErrors = [err232];}else {vErrors.push(err232);}errors++;}if(data.slot === undefined){const err233 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "slot"},message:"must have required property '"+"slot"+"'"};if(vErrors === null){vErrors = [err233];}else {vErrors.push(err233);}errors++;}if(data.gridX === undefined){const err234 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "gridX"},message:"must have required property '"+"gridX"+"'"};if(vErrors === null){vErrors = [err234];}else {vErrors.push(err234);}errors++;}if(data.gridY === undefined){const err235 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "gridY"},message:"must have required property '"+"gridY"+"'"};if(vErrors === null){vErrors = [err235];}else {vErrors.push(err235);}errors++;}if(data.gridWidth === undefined){const err236 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "gridWidth"},message:"must have required property '"+"gridWidth"+"'"};if(vErrors === null){vErrors = [err236];}else {vErrors.push(err236);}errors++;}if(data.gridHeight === undefined){const err237 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "gridHeight"},message:"must have required property '"+"gridHeight"+"'"};if(vErrors === null){vErrors = [err237];}else {vErrors.push(err237);}errors++;}for(const key15 in data){if(!(func1.call(schema50.properties, key15))){const err238 = {instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key15},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err238];}else {vErrors.push(err238);}errors++;}}if(data.roles !== undefined){let data143 = data.roles;if(Array.isArray(data143)){const len9 = data143.length;for(let i9=0; i9<len9; i9++){let data144 = data143[i9];if(typeof data144 === "string"){if(func6(data144) < 1){const err239 = {instancePath:instancePath+"/roles/" + i9,schemaPath:"#/properties/roles/items/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err239];}else {vErrors.push(err239);}errors++;}}else {const err240 = {instancePath:instancePath+"/roles/" + i9,schemaPath:"#/properties/roles/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err240];}else {vErrors.push(err240);}errors++;}}}else {const err241 = {instancePath:instancePath+"/roles",schemaPath:"#/properties/roles/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err241];}else {vErrors.push(err241);}errors++;}}if(data.visibleWhen !== undefined){if(!(validate34(data.visibleWhen, {instancePath:instancePath+"/visibleWhen",parentData:data,parentDataProperty:"visibleWhen",rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate34.errors : vErrors.concat(validate34.errors);errors = vErrors.length;}}if(data.requiredApp !== undefined){let data146 = data.requiredApp;if(typeof data146 === "string"){if(func6(data146) < 1){const err242 = {instancePath:instancePath+"/requiredApp",schemaPath:"#/properties/requiredApp/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err242];}else {vErrors.push(err242);}errors++;}}else {const err243 = {instancePath:instancePath+"/requiredApp",schemaPath:"#/properties/requiredApp/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err243];}else {vErrors.push(err243);}errors++;}}if(data.id !== undefined){let data147 = data.id;if(typeof data147 === "string"){if(!pattern5.test(data147)){const err244 = {instancePath:instancePath+"/id",schemaPath:"#/properties/id/pattern",keyword:"pattern",params:{pattern: "^[a-z0-9]+(?:-[a-z0-9]+)*$"},message:"must match pattern \""+"^[a-z0-9]+(?:-[a-z0-9]+)*$"+"\""};if(vErrors === null){vErrors = [err244];}else {vErrors.push(err244);}errors++;}}else {const err245 = {instancePath:instancePath+"/id",schemaPath:"#/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err245];}else {vErrors.push(err245);}errors++;}}if(data.widgetKey !== undefined){if(typeof data.widgetKey !== "string"){const err246 = {instancePath:instancePath+"/widgetKey",schemaPath:"#/properties/widgetKey/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err246];}else {vErrors.push(err246);}errors++;}}if(data.slot !== undefined){let data149 = data.slot;const _errs391 = errors;let valid99 = false;let passing4 = null;const _errs392 = errors;if(typeof data149 !== "string"){const err247 = {instancePath:instancePath+"/slot",schemaPath:"#/$defs/slotValue/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err247];}else {vErrors.push(err247);}errors++;}if(!(((((data149 === "body") || (data149 === "sidebar")) || (data149 === "header-actions")) || (data149 === "footer")) || (data149 === "modal"))){const err248 = {instancePath:instancePath+"/slot",schemaPath:"#/$defs/slotValue/oneOf/0/enum",keyword:"enum",params:{allowedValues: schema73.oneOf[0].enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err248];}else {vErrors.push(err248);}errors++;}var _valid17 = _errs392 === errors;if(_valid17){valid99 = true;passing4 = 0;}const _errs394 = errors;if(typeof data149 === "string"){if(!pattern23.test(data149)){const err249 = {instancePath:instancePath+"/slot",schemaPath:"#/$defs/slotValue/oneOf/1/pattern",keyword:"pattern",params:{pattern: "^(tab|section):.+"},message:"must match pattern \""+"^(tab|section):.+"+"\""};if(vErrors === null){vErrors = [err249];}else {vErrors.push(err249);}errors++;}}else {const err250 = {instancePath:instancePath+"/slot",schemaPath:"#/$defs/slotValue/oneOf/1/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err250];}else {vErrors.push(err250);}errors++;}var _valid17 = _errs394 === errors;if(_valid17 && valid99){valid99 = false;passing4 = [passing4, 1];}else {if(_valid17){valid99 = true;passing4 = 1;}}if(!valid99){const err251 = {instancePath:instancePath+"/slot",schemaPath:"#/$defs/slotValue/oneOf",keyword:"oneOf",params:{passingSchemas: passing4},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err251];}else {vErrors.push(err251);}errors++;}else {errors = _errs391;if(vErrors !== null){if(_errs391){vErrors.length = _errs391;}else {vErrors = null;}}}}if(data.gridX !== undefined){let data150 = data.gridX;if(!((typeof data150 == "number") && (!(data150 % 1) && !isNaN(data150)))){const err252 = {instancePath:instancePath+"/gridX",schemaPath:"#/properties/gridX/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err252];}else {vErrors.push(err252);}errors++;}if(typeof data150 == "number"){if(data150 < 0 || isNaN(data150)){const err253 = {instancePath:instancePath+"/gridX",schemaPath:"#/properties/gridX/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err253];}else {vErrors.push(err253);}errors++;}}}if(data.gridY !== undefined){let data151 = data.gridY;if(!((typeof data151 == "number") && (!(data151 % 1) && !isNaN(data151)))){const err254 = {instancePath:instancePath+"/gridY",schemaPath:"#/properties/gridY/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err254];}else {vErrors.push(err254);}errors++;}if(typeof data151 == "number"){if(data151 < 0 || isNaN(data151)){const err255 = {instancePath:instancePath+"/gridY",schemaPath:"#/properties/gridY/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err255];}else {vErrors.push(err255);}errors++;}}}if(data.gridWidth !== undefined){let data152 = data.gridWidth;if(!((typeof data152 == "number") && (!(data152 % 1) && !isNaN(data152)))){const err256 = {instancePath:instancePath+"/gridWidth",schemaPath:"#/properties/gridWidth/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err256];}else {vErrors.push(err256);}errors++;}if(typeof data152 == "number"){if(data152 > 24 || isNaN(data152)){const err257 = {instancePath:instancePath+"/gridWidth",schemaPath:"#/properties/gridWidth/maximum",keyword:"maximum",params:{comparison: "<=", limit: 24},message:"must be <= 24"};if(vErrors === null){vErrors = [err257];}else {vErrors.push(err257);}errors++;}if(data152 < 1 || isNaN(data152)){const err258 = {instancePath:instancePath+"/gridWidth",schemaPath:"#/properties/gridWidth/minimum",keyword:"minimum",params:{comparison: ">=", limit: 1},message:"must be >= 1"};if(vErrors === null){vErrors = [err258];}else {vErrors.push(err258);}errors++;}}}if(data.gridHeight !== undefined){let data153 = data.gridHeight;if(!((typeof data153 == "number") && (!(data153 % 1) && !isNaN(data153)))){const err259 = {instancePath:instancePath+"/gridHeight",schemaPath:"#/properties/gridHeight/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err259];}else {vErrors.push(err259);}errors++;}if(typeof data153 == "number"){if(data153 < 1 || isNaN(data153)){const err260 = {instancePath:instancePath+"/gridHeight",schemaPath:"#/properties/gridHeight/minimum",keyword:"minimum",params:{comparison: ">=", limit: 1},message:"must be >= 1"};if(vErrors === null){vErrors = [err260];}else {vErrors.push(err260);}errors++;}}}if(data.sizeToContent !== undefined){let data154 = data.sizeToContent;if((typeof data154 !== "boolean") && (!((typeof data154 == "number") && (!(data154 % 1) && !isNaN(data154))))){const err261 = {instancePath:instancePath+"/sizeToContent",schemaPath:"#/properties/sizeToContent/type",keyword:"type",params:{type: schema50.properties.sizeToContent.type},message:"must be boolean,integer"};if(vErrors === null){vErrors = [err261];}else {vErrors.push(err261);}errors++;}if(typeof data154 == "number"){if(data154 < 1 || isNaN(data154)){const err262 = {instancePath:instancePath+"/sizeToContent",schemaPath:"#/properties/sizeToContent/minimum",keyword:"minimum",params:{comparison: ">=", limit: 1},message:"must be >= 1"};if(vErrors === null){vErrors = [err262];}else {vErrors.push(err262);}errors++;}}}if(data.props !== undefined){let data155 = data.props;if(data155 && typeof data155 == "object" && !Array.isArray(data155));else {const err263 = {instancePath:instancePath+"/props",schemaPath:"#/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err263];}else {vErrors.push(err263);}errors++;}}if(data.tabGroup !== undefined){if(typeof data.tabGroup !== "string"){const err264 = {instancePath:instancePath+"/tabGroup",schemaPath:"#/properties/tabGroup/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err264];}else {vErrors.push(err264);}errors++;}}if(data.dataSource !== undefined){let data157 = data.dataSource;if(data157 && typeof data157 == "object" && !Array.isArray(data157)){if(data157.register !== undefined){if(typeof data157.register !== "string"){const err265 = {instancePath:instancePath+"/dataSource/register",schemaPath:"#/$defs/dataSource/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err265];}else {vErrors.push(err265);}errors++;}}if(data157.schema !== undefined){if(typeof data157.schema !== "string"){const err266 = {instancePath:instancePath+"/dataSource/schema",schemaPath:"#/$defs/dataSource/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err266];}else {vErrors.push(err266);}errors++;}}if(data157.filter !== undefined){let data160 = data157.filter;if(data160 && typeof data160 == "object" && !Array.isArray(data160));else {const err267 = {instancePath:instancePath+"/dataSource/filter",schemaPath:"#/$defs/dataSource/properties/filter/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err267];}else {vErrors.push(err267);}errors++;}}if(data157.aggregate !== undefined){let data161 = data157.aggregate;const _errs423 = errors;let valid102 = false;let passing5 = null;const _errs424 = errors;if(typeof data161 !== "string"){const err268 = {instancePath:instancePath+"/dataSource/aggregate",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err268];}else {vErrors.push(err268);}errors++;}if(!(data161 === "count")){const err269 = {instancePath:instancePath+"/dataSource/aggregate",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/0/enum",keyword:"enum",params:{allowedValues: schema74.properties.aggregate.oneOf[0].enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err269];}else {vErrors.push(err269);}errors++;}var _valid18 = _errs424 === errors;if(_valid18){valid102 = true;passing5 = 0;}const _errs426 = errors;if(data161 && typeof data161 == "object" && !Array.isArray(data161)){if(data161.groupBy === undefined){const err270 = {instancePath:instancePath+"/dataSource/aggregate",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/required",keyword:"required",params:{missingProperty: "groupBy"},message:"must have required property '"+"groupBy"+"'"};if(vErrors === null){vErrors = [err270];}else {vErrors.push(err270);}errors++;}for(const key16 in data161){if(!((((((key16 === "groupBy") || (key16 === "metric")) || (key16 === "sumField")) || (key16 === "topN")) || (key16 === "otherBucket")) || (key16 === "labelResolve"))){const err271 = {instancePath:instancePath+"/dataSource/aggregate",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key16},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err271];}else {vErrors.push(err271);}errors++;}}if(data161.groupBy !== undefined){if(typeof data161.groupBy !== "string"){const err272 = {instancePath:instancePath+"/dataSource/aggregate/groupBy",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/groupBy/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err272];}else {vErrors.push(err272);}errors++;}}if(data161.metric !== undefined){let data163 = data161.metric;if(typeof data163 !== "string"){const err273 = {instancePath:instancePath+"/dataSource/aggregate/metric",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/metric/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err273];}else {vErrors.push(err273);}errors++;}if(!((data163 === "count") || (data163 === "sum"))){const err274 = {instancePath:instancePath+"/dataSource/aggregate/metric",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/metric/enum",keyword:"enum",params:{allowedValues: schema74.properties.aggregate.oneOf[1].properties.metric.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err274];}else {vErrors.push(err274);}errors++;}}if(data161.sumField !== undefined){if(typeof data161.sumField !== "string"){const err275 = {instancePath:instancePath+"/dataSource/aggregate/sumField",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/sumField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err275];}else {vErrors.push(err275);}errors++;}}if(data161.topN !== undefined){let data165 = data161.topN;if(!((typeof data165 == "number") && (!(data165 % 1) && !isNaN(data165)))){const err276 = {instancePath:instancePath+"/dataSource/aggregate/topN",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/topN/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err276];}else {vErrors.push(err276);}errors++;}if(typeof data165 == "number"){if(data165 < 1 || isNaN(data165)){const err277 = {instancePath:instancePath+"/dataSource/aggregate/topN",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/topN/minimum",keyword:"minimum",params:{comparison: ">=", limit: 1},message:"must be >= 1"};if(vErrors === null){vErrors = [err277];}else {vErrors.push(err277);}errors++;}}}if(data161.otherBucket !== undefined){if(typeof data161.otherBucket !== "boolean"){const err278 = {instancePath:instancePath+"/dataSource/aggregate/otherBucket",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/otherBucket/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err278];}else {vErrors.push(err278);}errors++;}}if(data161.labelResolve !== undefined){let data167 = data161.labelResolve;if(data167 && typeof data167 == "object" && !Array.isArray(data167)){if(data167.schema === undefined){const err279 = {instancePath:instancePath+"/dataSource/aggregate/labelResolve",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/labelResolve/required",keyword:"required",params:{missingProperty: "schema"},message:"must have required property '"+"schema"+"'"};if(vErrors === null){vErrors = [err279];}else {vErrors.push(err279);}errors++;}for(const key17 in data167){if(!((((key17 === "register") || (key17 === "schema")) || (key17 === "labelField")) || (key17 === "colorField"))){const err280 = {instancePath:instancePath+"/dataSource/aggregate/labelResolve",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/labelResolve/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key17},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err280];}else {vErrors.push(err280);}errors++;}}if(data167.register !== undefined){if(typeof data167.register !== "string"){const err281 = {instancePath:instancePath+"/dataSource/aggregate/labelResolve/register",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/labelResolve/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err281];}else {vErrors.push(err281);}errors++;}}if(data167.schema !== undefined){if(typeof data167.schema !== "string"){const err282 = {instancePath:instancePath+"/dataSource/aggregate/labelResolve/schema",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/labelResolve/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err282];}else {vErrors.push(err282);}errors++;}}if(data167.labelField !== undefined){if(typeof data167.labelField !== "string"){const err283 = {instancePath:instancePath+"/dataSource/aggregate/labelResolve/labelField",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/labelResolve/properties/labelField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err283];}else {vErrors.push(err283);}errors++;}}if(data167.colorField !== undefined){if(typeof data167.colorField !== "string"){const err284 = {instancePath:instancePath+"/dataSource/aggregate/labelResolve/colorField",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/labelResolve/properties/colorField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err284];}else {vErrors.push(err284);}errors++;}}}else {const err285 = {instancePath:instancePath+"/dataSource/aggregate/labelResolve",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/labelResolve/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err285];}else {vErrors.push(err285);}errors++;}}}else {const err286 = {instancePath:instancePath+"/dataSource/aggregate",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err286];}else {vErrors.push(err286);}errors++;}var _valid18 = _errs426 === errors;if(_valid18 && valid102){valid102 = false;passing5 = [passing5, 1];}else {if(_valid18){valid102 = true;passing5 = 1;}}if(!valid102){const err287 = {instancePath:instancePath+"/dataSource/aggregate",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf",keyword:"oneOf",params:{passingSchemas: passing5},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err287];}else {vErrors.push(err287);}errors++;}else {errors = _errs423;if(vErrors !== null){if(_errs423){vErrors.length = _errs423;}else {vErrors = null;}}}}if(data157.drilldown !== undefined){let data172 = data157.drilldown;if(data172 && typeof data172 == "object" && !Array.isArray(data172)){if(data172.route === undefined){const err288 = {instancePath:instancePath+"/dataSource/drilldown",schemaPath:"#/$defs/dataSource/properties/drilldown/required",keyword:"required",params:{missingProperty: "route"},message:"must have required property '"+"route"+"'"};if(vErrors === null){vErrors = [err288];}else {vErrors.push(err288);}errors++;}if(data172.filterParam === undefined){const err289 = {instancePath:instancePath+"/dataSource/drilldown",schemaPath:"#/$defs/dataSource/properties/drilldown/required",keyword:"required",params:{missingProperty: "filterParam"},message:"must have required property '"+"filterParam"+"'"};if(vErrors === null){vErrors = [err289];}else {vErrors.push(err289);}errors++;}for(const key18 in data172){if(!((key18 === "route") || (key18 === "filterParam"))){const err290 = {instancePath:instancePath+"/dataSource/drilldown",schemaPath:"#/$defs/dataSource/properties/drilldown/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key18},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err290];}else {vErrors.push(err290);}errors++;}}if(data172.route !== undefined){if(typeof data172.route !== "string"){const err291 = {instancePath:instancePath+"/dataSource/drilldown/route",schemaPath:"#/$defs/dataSource/properties/drilldown/properties/route/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err291];}else {vErrors.push(err291);}errors++;}}if(data172.filterParam !== undefined){if(typeof data172.filterParam !== "string"){const err292 = {instancePath:instancePath+"/dataSource/drilldown/filterParam",schemaPath:"#/$defs/dataSource/properties/drilldown/properties/filterParam/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err292];}else {vErrors.push(err292);}errors++;}}}else {const err293 = {instancePath:instancePath+"/dataSource/drilldown",schemaPath:"#/$defs/dataSource/properties/drilldown/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err293];}else {vErrors.push(err293);}errors++;}}if(data157.graphql !== undefined){let data175 = data157.graphql;if(data175 && typeof data175 == "object" && !Array.isArray(data175)){if(data175.query === undefined){const err294 = {instancePath:instancePath+"/dataSource/graphql",schemaPath:"#/$defs/dataSource/properties/graphql/required",keyword:"required",params:{missingProperty: "query"},message:"must have required property '"+"query"+"'"};if(vErrors === null){vErrors = [err294];}else {vErrors.push(err294);}errors++;}if(data175.selectors === undefined){const err295 = {instancePath:instancePath+"/dataSource/graphql",schemaPath:"#/$defs/dataSource/properties/graphql/required",keyword:"required",params:{missingProperty: "selectors"},message:"must have required property '"+"selectors"+"'"};if(vErrors === null){vErrors = [err295];}else {vErrors.push(err295);}errors++;}for(const key19 in data175){if(!(((key19 === "query") || (key19 === "variables")) || (key19 === "selectors"))){const err296 = {instancePath:instancePath+"/dataSource/graphql",schemaPath:"#/$defs/dataSource/properties/graphql/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key19},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err296];}else {vErrors.push(err296);}errors++;}}if(data175.query !== undefined){if(typeof data175.query !== "string"){const err297 = {instancePath:instancePath+"/dataSource/graphql/query",schemaPath:"#/$defs/dataSource/properties/graphql/properties/query/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err297];}else {vErrors.push(err297);}errors++;}}if(data175.variables !== undefined){let data177 = data175.variables;if(data177 && typeof data177 == "object" && !Array.isArray(data177));else {const err298 = {instancePath:instancePath+"/dataSource/graphql/variables",schemaPath:"#/$defs/dataSource/properties/graphql/properties/variables/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err298];}else {vErrors.push(err298);}errors++;}}if(data175.selectors !== undefined){let data178 = data175.selectors;if(data178 && typeof data178 == "object" && !Array.isArray(data178)){for(const key20 in data178){if(typeof data178[key20] !== "string"){const err299 = {instancePath:instancePath+"/dataSource/graphql/selectors/" + key20.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/$defs/dataSource/properties/graphql/properties/selectors/additionalProperties/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err299];}else {vErrors.push(err299);}errors++;}}}else {const err300 = {instancePath:instancePath+"/dataSource/graphql/selectors",schemaPath:"#/$defs/dataSource/properties/graphql/properties/selectors/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err300];}else {vErrors.push(err300);}errors++;}}}else {const err301 = {instancePath:instancePath+"/dataSource/graphql",schemaPath:"#/$defs/dataSource/properties/graphql/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err301];}else {vErrors.push(err301);}errors++;}}}else {const err302 = {instancePath:instancePath+"/dataSource",schemaPath:"#/$defs/dataSource/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err302];}else {vErrors.push(err302);}errors++;}}if(typeof data.dateChip !== "boolean"){const err303 = {instancePath:instancePath+"/dateChip",schemaPath:"#/properties/dateChip/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err303];}else {vErrors.push(err303);}errors++;}if(data._note !== undefined){if(typeof data._note !== "string"){const err304 = {instancePath:instancePath+"/_note",schemaPath:"#/properties/_note/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err304];}else {vErrors.push(err304);}errors++;}}if(data.ncDashboard !== undefined){let data182 = data.ncDashboard;if(data182 && typeof data182 == "object" && !Array.isArray(data182)){for(const key21 in data182){if(!((((key21 === "title") || (key21 === "icon")) || (key21 === "order")) || (key21 === "link"))){const err305 = {instancePath:instancePath+"/ncDashboard",schemaPath:"#/properties/ncDashboard/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key21},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err305];}else {vErrors.push(err305);}errors++;}}if(data182.title !== undefined){if(typeof data182.title !== "string"){const err306 = {instancePath:instancePath+"/ncDashboard/title",schemaPath:"#/properties/ncDashboard/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err306];}else {vErrors.push(err306);}errors++;}}if(data182.icon !== undefined){if(typeof data182.icon !== "string"){const err307 = {instancePath:instancePath+"/ncDashboard/icon",schemaPath:"#/properties/ncDashboard/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err307];}else {vErrors.push(err307);}errors++;}}if(data182.order !== undefined){let data185 = data182.order;if(!((typeof data185 == "number") && (!(data185 % 1) && !isNaN(data185)))){const err308 = {instancePath:instancePath+"/ncDashboard/order",schemaPath:"#/properties/ncDashboard/properties/order/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err308];}else {vErrors.push(err308);}errors++;}}if(data182.link !== undefined){let data186 = data182.link;if(typeof data186 === "string"){if(!pattern24.test(data186)){const err309 = {instancePath:instancePath+"/ncDashboard/link",schemaPath:"#/properties/ncDashboard/properties/link/pattern",keyword:"pattern",params:{pattern: "^(?![a-zA-Z][a-zA-Z0-9+.-]*:)(?!//)\\S+$"},message:"must match pattern \""+"^(?![a-zA-Z][a-zA-Z0-9+.-]*:)(?!//)\\S+$"+"\""};if(vErrors === null){vErrors = [err309];}else {vErrors.push(err309);}errors++;}}else {const err310 = {instancePath:instancePath+"/ncDashboard/link",schemaPath:"#/properties/ncDashboard/properties/link/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err310];}else {vErrors.push(err310);}errors++;}}}else {const err311 = {instancePath:instancePath+"/ncDashboard",schemaPath:"#/properties/ncDashboard/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err311];}else {vErrors.push(err311);}errors++;}}}else {const err312 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err312];}else {vErrors.push(err312);}errors++;}validate26.errors = vErrors;evaluated0.items = items0;return errors === 0;}validate26.evaluated = {"props":true,"dynamicProps":false,"dynamicItems":true};const schema78 = {"type":"object","additionalProperties":false,"description":"One sort entry for a `folderSidebar` scope. Name the column with `key` (manifest spelling) or `field` (the CnIndexPage prop spelling); an entry carrying neither is dropped rather than sent as an empty sort key.","properties":{"key":{"type":"string","minLength":1},"field":{"type":"string","minLength":1},"order":{"type":"string","enum":["asc","desc"],"default":"asc"}}};function validate44(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate44.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}if(data && typeof data == "object" && !Array.isArray(data)){if(data.columns !== undefined){let data0 = data.columns;if(Array.isArray(data0)){const len0 = data0.length;for(let i0=0; i0<len0; i0++){let data1 = data0[i0];const _errs5 = errors;let valid3 = false;let passing0 = null;const _errs6 = errors;if(typeof data1 !== "string"){const err0 = {instancePath:instancePath+"/columns/" + i0,schemaPath:"#/properties/columns/items/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}var _valid0 = _errs6 === errors;if(_valid0){valid3 = true;passing0 = 0;}const _errs8 = errors;if(data1 && typeof data1 == "object" && !Array.isArray(data1));else {const err1 = {instancePath:instancePath+"/columns/" + i0,schemaPath:"#/properties/columns/items/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}var _valid0 = _errs8 === errors;if(_valid0 && valid3){valid3 = false;passing0 = [passing0, 1];}else {if(_valid0){valid3 = true;passing0 = 1;}}if(!valid3){const err2 = {instancePath:instancePath+"/columns/" + i0,schemaPath:"#/properties/columns/items/oneOf",keyword:"oneOf",params:{passingSchemas: passing0},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}else {errors = _errs5;if(vErrors !== null){if(_errs5){vErrors.length = _errs5;}else {vErrors = null;}}}}}else {const err3 = {instancePath:instancePath+"/columns",schemaPath:"#/properties/columns/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}}if(data.defaultSort !== undefined){let data2 = data.defaultSort;const _errs12 = errors;let valid4 = false;let passing1 = null;const _errs13 = errors;if(data2 && typeof data2 == "object" && !Array.isArray(data2)){for(const key0 in data2){if(!(((key0 === "key") || (key0 === "field")) || (key0 === "order"))){const err4 = {instancePath:instancePath+"/defaultSort",schemaPath:"#/$defs/folderSidebarScopeSort/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}}if(data2.key !== undefined){let data3 = data2.key;if(typeof data3 === "string"){if(func6(data3) < 1){const err5 = {instancePath:instancePath+"/defaultSort/key",schemaPath:"#/$defs/folderSidebarScopeSort/properties/key/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}else {const err6 = {instancePath:instancePath+"/defaultSort/key",schemaPath:"#/$defs/folderSidebarScopeSort/properties/key/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}}if(data2.field !== undefined){let data4 = data2.field;if(typeof data4 === "string"){if(func6(data4) < 1){const err7 = {instancePath:instancePath+"/defaultSort/field",schemaPath:"#/$defs/folderSidebarScopeSort/properties/field/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}}else {const err8 = {instancePath:instancePath+"/defaultSort/field",schemaPath:"#/$defs/folderSidebarScopeSort/properties/field/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}}if(data2.order !== undefined){let data5 = data2.order;if(typeof data5 !== "string"){const err9 = {instancePath:instancePath+"/defaultSort/order",schemaPath:"#/$defs/folderSidebarScopeSort/properties/order/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}if(!((data5 === "asc") || (data5 === "desc"))){const err10 = {instancePath:instancePath+"/defaultSort/order",schemaPath:"#/$defs/folderSidebarScopeSort/properties/order/enum",keyword:"enum",params:{allowedValues: schema78.properties.order.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}}}else {const err11 = {instancePath:instancePath+"/defaultSort",schemaPath:"#/$defs/folderSidebarScopeSort/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}var _valid1 = _errs13 === errors;if(_valid1){valid4 = true;passing1 = 0;}const _errs23 = errors;if(Array.isArray(data2)){const len1 = data2.length;for(let i1=0; i1<len1; i1++){let data6 = data2[i1];if(data6 && typeof data6 == "object" && !Array.isArray(data6)){for(const key1 in data6){if(!(((key1 === "key") || (key1 === "field")) || (key1 === "order"))){const err12 = {instancePath:instancePath+"/defaultSort/" + i1,schemaPath:"#/$defs/folderSidebarScopeSort/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key1},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}}if(data6.key !== undefined){let data7 = data6.key;if(typeof data7 === "string"){if(func6(data7) < 1){const err13 = {instancePath:instancePath+"/defaultSort/" + i1+"/key",schemaPath:"#/$defs/folderSidebarScopeSort/properties/key/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}}else {const err14 = {instancePath:instancePath+"/defaultSort/" + i1+"/key",schemaPath:"#/$defs/folderSidebarScopeSort/properties/key/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}}if(data6.field !== undefined){let data8 = data6.field;if(typeof data8 === "string"){if(func6(data8) < 1){const err15 = {instancePath:instancePath+"/defaultSort/" + i1+"/field",schemaPath:"#/$defs/folderSidebarScopeSort/properties/field/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}}else {const err16 = {instancePath:instancePath+"/defaultSort/" + i1+"/field",schemaPath:"#/$defs/folderSidebarScopeSort/properties/field/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err16];}else {vErrors.push(err16);}errors++;}}if(data6.order !== undefined){let data9 = data6.order;if(typeof data9 !== "string"){const err17 = {instancePath:instancePath+"/defaultSort/" + i1+"/order",schemaPath:"#/$defs/folderSidebarScopeSort/properties/order/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err17];}else {vErrors.push(err17);}errors++;}if(!((data9 === "asc") || (data9 === "desc"))){const err18 = {instancePath:instancePath+"/defaultSort/" + i1+"/order",schemaPath:"#/$defs/folderSidebarScopeSort/properties/order/enum",keyword:"enum",params:{allowedValues: schema78.properties.order.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err18];}else {vErrors.push(err18);}errors++;}}}else {const err19 = {instancePath:instancePath+"/defaultSort/" + i1,schemaPath:"#/$defs/folderSidebarScopeSort/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err19];}else {vErrors.push(err19);}errors++;}}}else {const err20 = {instancePath:instancePath+"/defaultSort",schemaPath:"#/properties/defaultSort/oneOf/1/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err20];}else {vErrors.push(err20);}errors++;}var _valid1 = _errs23 === errors;if(_valid1 && valid4){valid4 = false;passing1 = [passing1, 1];}else {if(_valid1){valid4 = true;passing1 = 1;}}if(!valid4){const err21 = {instancePath:instancePath+"/defaultSort",schemaPath:"#/properties/defaultSort/oneOf",keyword:"oneOf",params:{passingSchemas: passing1},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err21];}else {vErrors.push(err21);}errors++;}else {errors = _errs12;if(vErrors !== null){if(_errs12){vErrors.length = _errs12;}else {vErrors = null;}}}}if(data.searchFields !== undefined){let data10 = data.searchFields;if(Array.isArray(data10)){const len2 = data10.length;for(let i2=0; i2<len2; i2++){let data11 = data10[i2];if(typeof data11 === "string"){if(func6(data11) < 1){const err22 = {instancePath:instancePath+"/searchFields/" + i2,schemaPath:"#/properties/searchFields/items/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err22];}else {vErrors.push(err22);}errors++;}}else {const err23 = {instancePath:instancePath+"/searchFields/" + i2,schemaPath:"#/properties/searchFields/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err23];}else {vErrors.push(err23);}errors++;}}}else {const err24 = {instancePath:instancePath+"/searchFields",schemaPath:"#/properties/searchFields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err24];}else {vErrors.push(err24);}errors++;}}}else {const err25 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err25];}else {vErrors.push(err25);}errors++;}validate44.errors = vErrors;return errors === 0;}validate44.evaluated = {"props":true,"dynamicProps":false,"dynamicItems":false};function validate25(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate25.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}const _errs2 = errors;let valid1 = true;const _errs3 = errors;const _errs4 = errors;const _errs5 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err0 = {};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}else {if(data.type !== undefined){if("index" !== data.type){const err1 = {};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}}}}var valid2 = _errs5 === errors;if(valid2){const err2 = {};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}else {errors = _errs4;if(vErrors !== null){if(_errs4){vErrors.length = _errs4;}else {vErrors = null;}}}var _valid0 = _errs3 === errors;errors = _errs2;if(vErrors !== null){if(_errs2){vErrors.length = _errs2;}else {vErrors = null;}}if(_valid0){const _errs7 = errors;const _errs8 = errors;const _errs9 = errors;const _errs10 = errors;let valid5 = false;const _errs11 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.splitView === undefined) && ("splitView")){const err3 = {};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}}var _valid1 = _errs11 === errors;valid5 = valid5 || _valid1;const _errs12 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.manualOrder === undefined) && ("manualOrder")){const err4 = {};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}}var _valid1 = _errs12 === errors;valid5 = valid5 || _valid1;const _errs13 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.savedViewTree === undefined) && ("savedViewTree")){const err5 = {};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}var _valid1 = _errs13 === errors;valid5 = valid5 || _valid1;const _errs14 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.board === undefined) && ("board")){const err6 = {};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}}var _valid1 = _errs14 === errors;valid5 = valid5 || _valid1;const _errs15 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.dateAxis === undefined) && ("dateAxis")){const err7 = {};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}}var _valid1 = _errs15 === errors;valid5 = valid5 || _valid1;if(!valid5){const err8 = {};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}else {errors = _errs10;if(vErrors !== null){if(_errs10){vErrors.length = _errs10;}else {vErrors = null;}}}var valid4 = _errs9 === errors;if(valid4){const err9 = {instancePath,schemaPath:"#/allOf/0/then/not",keyword:"not",params:{},message:"must NOT be valid"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}else {errors = _errs8;if(vErrors !== null){if(_errs8){vErrors.length = _errs8;}else {vErrors = null;}}}var _valid0 = _errs7 === errors;valid1 = _valid0;}if(!valid1){const err10 = {instancePath,schemaPath:"#/allOf/0/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}const _errs17 = errors;let valid6 = true;const _errs18 = errors;const _errs19 = errors;const _errs20 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err11 = {};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}else {if(data.type !== undefined){if("detail" !== data.type){const err12 = {};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}}}}var valid7 = _errs20 === errors;if(valid7){const err13 = {};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}else {errors = _errs19;if(vErrors !== null){if(_errs19){vErrors.length = _errs19;}else {vErrors = null;}}}var _valid2 = _errs18 === errors;errors = _errs17;if(vErrors !== null){if(_errs17){vErrors.length = _errs17;}else {vErrors = null;}}if(_valid2){const _errs22 = errors;const _errs23 = errors;const _errs24 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.tabInAddress === undefined) && ("tabInAddress")){const err14 = {};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}}var valid9 = _errs24 === errors;if(valid9){const err15 = {instancePath,schemaPath:"#/allOf/1/then/not",keyword:"not",params:{},message:"must NOT be valid"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}else {errors = _errs23;if(vErrors !== null){if(_errs23){vErrors.length = _errs23;}else {vErrors = null;}}}var _valid2 = _errs22 === errors;valid6 = _valid2;}if(!valid6){const err16 = {instancePath,schemaPath:"#/allOf/1/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err16];}else {vErrors.push(err16);}errors++;}const _errs26 = errors;let valid10 = true;const _errs27 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err17 = {};if(vErrors === null){vErrors = [err17];}else {vErrors.push(err17);}errors++;}else {if(data.type !== undefined){if("wiki" !== data.type){const err18 = {};if(vErrors === null){vErrors = [err18];}else {vErrors.push(err18);}errors++;}}}}var _valid3 = _errs27 === errors;errors = _errs26;if(vErrors !== null){if(_errs26){vErrors.length = _errs26;}else {vErrors = null;}}if(_valid3){const _errs29 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.config === undefined){const err19 = {instancePath,schemaPath:"#/allOf/2/then/required",keyword:"required",params:{missingProperty: "config"},message:"must have required property '"+"config"+"'"};if(vErrors === null){vErrors = [err19];}else {vErrors.push(err19);}errors++;}if(data.config !== undefined){let data3 = data.config;if(data3 && typeof data3 == "object" && !Array.isArray(data3)){if(data3.register === undefined){const err20 = {instancePath:instancePath+"/config",schemaPath:"#/allOf/2/then/properties/config/required",keyword:"required",params:{missingProperty: "register"},message:"must have required property '"+"register"+"'"};if(vErrors === null){vErrors = [err20];}else {vErrors.push(err20);}errors++;}if(data3.schema === undefined){const err21 = {instancePath:instancePath+"/config",schemaPath:"#/allOf/2/then/properties/config/required",keyword:"required",params:{missingProperty: "schema"},message:"must have required property '"+"schema"+"'"};if(vErrors === null){vErrors = [err21];}else {vErrors.push(err21);}errors++;}if(data3.register !== undefined){let data4 = data3.register;if(typeof data4 === "string"){if(func6(data4) < 1){const err22 = {instancePath:instancePath+"/config/register",schemaPath:"#/allOf/2/then/properties/config/properties/register/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err22];}else {vErrors.push(err22);}errors++;}}else {const err23 = {instancePath:instancePath+"/config/register",schemaPath:"#/allOf/2/then/properties/config/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err23];}else {vErrors.push(err23);}errors++;}}if(data3.schema !== undefined){let data5 = data3.schema;if(typeof data5 === "string"){if(func6(data5) < 1){const err24 = {instancePath:instancePath+"/config/schema",schemaPath:"#/allOf/2/then/properties/config/properties/schema/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err24];}else {vErrors.push(err24);}errors++;}}else {const err25 = {instancePath:instancePath+"/config/schema",schemaPath:"#/allOf/2/then/properties/config/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err25];}else {vErrors.push(err25);}errors++;}}}else {const err26 = {instancePath:instancePath+"/config",schemaPath:"#/allOf/2/then/properties/config/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err26];}else {vErrors.push(err26);}errors++;}}}var _valid3 = _errs29 === errors;valid10 = _valid3;if(valid10){var props0 = {};props0.config = true;props0.type = true;}}if(!valid10){const err27 = {instancePath,schemaPath:"#/allOf/2/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err27];}else {vErrors.push(err27);}errors++;}const _errs37 = errors;let valid14 = true;const _errs38 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err28 = {};if(vErrors === null){vErrors = [err28];}else {vErrors.push(err28);}errors++;}else {if(data.type !== undefined){if("custom" !== data.type){const err29 = {};if(vErrors === null){vErrors = [err29];}else {vErrors.push(err29);}errors++;}}}}var _valid4 = _errs38 === errors;errors = _errs37;if(vErrors !== null){if(_errs37){vErrors.length = _errs37;}else {vErrors = null;}}if(_valid4){const _errs40 = errors;const _errs41 = errors;let valid16 = true;const _errs42 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.component === undefined) && ("component")){const err30 = {};if(vErrors === null){vErrors = [err30];}else {vErrors.push(err30);}errors++;}else {if(data.component !== undefined){let data7 = data.component;const _errs43 = errors;if(errors === _errs43){if(typeof data7 === "string"){if(!pattern6.test(data7)){const err31 = {};if(vErrors === null){vErrors = [err31];}else {vErrors.push(err31);}errors++;}}else {const err32 = {};if(vErrors === null){vErrors = [err32];}else {vErrors.push(err32);}errors++;}}}}}var _valid5 = _errs42 === errors;errors = _errs41;if(vErrors !== null){if(_errs41){vErrors.length = _errs41;}else {vErrors = null;}}if(!_valid5){const _errs45 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data._note === undefined){const err33 = {instancePath,schemaPath:"#/allOf/3/then/else/required",keyword:"required",params:{missingProperty: "_note"},message:"must have required property '"+"_note"+"'"};if(vErrors === null){vErrors = [err33];}else {vErrors.push(err33);}errors++;}}var _valid5 = _errs45 === errors;valid16 = _valid5;}if(!valid16){const err34 = {instancePath,schemaPath:"#/allOf/3/then/if",keyword:"if",params:{failingKeyword: "else"},message:"must match \"else\" schema"};if(vErrors === null){vErrors = [err34];}else {vErrors.push(err34);}errors++;}var _valid4 = _errs40 === errors;valid14 = _valid4;if(valid14){var props1 = {};props1.component = true;props1.type = true;}}if(!valid14){const err35 = {instancePath,schemaPath:"#/allOf/3/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err35];}else {vErrors.push(err35);}errors++;}if(props0 !== true && props1 !== undefined){if(props1 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props1);}}if(data && typeof data == "object" && !Array.isArray(data)){if(data.manualOrder === undefined){data.manualOrder = false;}if(data.tabInAddress === undefined){data.tabInAddress = false;}if(data.referencePreview === undefined){data.referencePreview = false;}if(data.id === undefined){const err36 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err36];}else {vErrors.push(err36);}errors++;}if(data.route === undefined){const err37 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "route"},message:"must have required property '"+"route"+"'"};if(vErrors === null){vErrors = [err37];}else {vErrors.push(err37);}errors++;}if(data.type === undefined){const err38 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "type"},message:"must have required property '"+"type"+"'"};if(vErrors === null){vErrors = [err38];}else {vErrors.push(err38);}errors++;}if(data.title === undefined){const err39 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "title"},message:"must have required property '"+"title"+"'"};if(vErrors === null){vErrors = [err39];}else {vErrors.push(err39);}errors++;}for(const key0 in data){if(!(func1.call(schema44.properties, key0))){const err40 = {instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err40];}else {vErrors.push(err40);}errors++;}}if(data.requiresApp !== undefined){let data8 = data.requiresApp;const _errs48 = errors;let valid19 = false;let passing0 = null;const _errs49 = errors;if(typeof data8 === "string"){if(func6(data8) < 1){const err41 = {instancePath:instancePath+"/requiresApp",schemaPath:"#/properties/requiresApp/oneOf/0/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err41];}else {vErrors.push(err41);}errors++;}}else {const err42 = {instancePath:instancePath+"/requiresApp",schemaPath:"#/properties/requiresApp/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err42];}else {vErrors.push(err42);}errors++;}var _valid6 = _errs49 === errors;if(_valid6){valid19 = true;passing0 = 0;}const _errs51 = errors;if(data8 && typeof data8 == "object" && !Array.isArray(data8)){if(data8.id === undefined){const err43 = {instancePath:instancePath+"/requiresApp",schemaPath:"#/properties/requiresApp/oneOf/1/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err43];}else {vErrors.push(err43);}errors++;}for(const key1 in data8){if(!((key1 === "id") || (key1 === "name"))){const err44 = {instancePath:instancePath+"/requiresApp",schemaPath:"#/properties/requiresApp/oneOf/1/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key1},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err44];}else {vErrors.push(err44);}errors++;}}if(data8.id !== undefined){let data9 = data8.id;if(typeof data9 === "string"){if(func6(data9) < 1){const err45 = {instancePath:instancePath+"/requiresApp/id",schemaPath:"#/properties/requiresApp/oneOf/1/properties/id/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err45];}else {vErrors.push(err45);}errors++;}}else {const err46 = {instancePath:instancePath+"/requiresApp/id",schemaPath:"#/properties/requiresApp/oneOf/1/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err46];}else {vErrors.push(err46);}errors++;}}if(data8.name !== undefined){let data10 = data8.name;if(typeof data10 === "string"){if(func6(data10) < 1){const err47 = {instancePath:instancePath+"/requiresApp/name",schemaPath:"#/properties/requiresApp/oneOf/1/properties/name/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err47];}else {vErrors.push(err47);}errors++;}}else {const err48 = {instancePath:instancePath+"/requiresApp/name",schemaPath:"#/properties/requiresApp/oneOf/1/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err48];}else {vErrors.push(err48);}errors++;}}}else {const err49 = {instancePath:instancePath+"/requiresApp",schemaPath:"#/properties/requiresApp/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err49];}else {vErrors.push(err49);}errors++;}var _valid6 = _errs51 === errors;if(_valid6 && valid19){valid19 = false;passing0 = [passing0, 1];}else {if(_valid6){valid19 = true;passing0 = 1;}}if(!valid19){const err50 = {instancePath:instancePath+"/requiresApp",schemaPath:"#/properties/requiresApp/oneOf",keyword:"oneOf",params:{passingSchemas: passing0},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err50];}else {vErrors.push(err50);}errors++;}else {errors = _errs48;if(vErrors !== null){if(_errs48){vErrors.length = _errs48;}else {vErrors = null;}}}}if(data.id !== undefined){if(typeof data.id !== "string"){const err51 = {instancePath:instancePath+"/id",schemaPath:"#/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err51];}else {vErrors.push(err51);}errors++;}}if(data.route !== undefined){if(typeof data.route !== "string"){const err52 = {instancePath:instancePath+"/route",schemaPath:"#/properties/route/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err52];}else {vErrors.push(err52);}errors++;}}if(data.type !== undefined){let data13 = data.type;if(typeof data13 !== "string"){const err53 = {instancePath:instancePath+"/type",schemaPath:"#/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err53];}else {vErrors.push(err53);}errors++;}if(!((((((((((((((((((data13 === "index") || (data13 === "detail")) || (data13 === "dashboard")) || (data13 === "logs")) || (data13 === "settings")) || (data13 === "chat")) || (data13 === "files")) || (data13 === "form")) || (data13 === "map")) || (data13 === "roadmap")) || (data13 === "reports")) || (data13 === "store")) || (data13 === "search")) || (data13 === "wiki")) || (data13 === "flow")) || (data13 === "flows")) || (data13 === "flow-detail")) || (data13 === "custom"))){const err54 = {instancePath:instancePath+"/type",schemaPath:"#/properties/type/enum",keyword:"enum",params:{allowedValues: schema44.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err54];}else {vErrors.push(err54);}errors++;}}if(data.title !== undefined){if(typeof data.title !== "string"){const err55 = {instancePath:instancePath+"/title",schemaPath:"#/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err55];}else {vErrors.push(err55);}errors++;}}if(data.permission !== undefined){if(typeof data.permission !== "string"){const err56 = {instancePath:instancePath+"/permission",schemaPath:"#/properties/permission/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err56];}else {vErrors.push(err56);}errors++;}}if(data.component !== undefined){if(typeof data.component !== "string"){const err57 = {instancePath:instancePath+"/component",schemaPath:"#/properties/component/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err57];}else {vErrors.push(err57);}errors++;}}if(data.headerComponent !== undefined){if(typeof data.headerComponent !== "string"){const err58 = {instancePath:instancePath+"/headerComponent",schemaPath:"#/properties/headerComponent/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err58];}else {vErrors.push(err58);}errors++;}}if(data.actionsComponent !== undefined){if(typeof data.actionsComponent !== "string"){const err59 = {instancePath:instancePath+"/actionsComponent",schemaPath:"#/properties/actionsComponent/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err59];}else {vErrors.push(err59);}errors++;}}if(data.sidebarComponent !== undefined){let data19 = data.sidebarComponent;if(typeof data19 === "string"){if(func6(data19) < 1){const err60 = {instancePath:instancePath+"/sidebarComponent",schemaPath:"#/properties/sidebarComponent/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err60];}else {vErrors.push(err60);}errors++;}}else {const err61 = {instancePath:instancePath+"/sidebarComponent",schemaPath:"#/properties/sidebarComponent/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err61];}else {vErrors.push(err61);}errors++;}}if(data.slots !== undefined){let data20 = data.slots;if(data20 && typeof data20 == "object" && !Array.isArray(data20)){for(const key2 in data20){if(typeof data20[key2] !== "string"){const err62 = {instancePath:instancePath+"/slots/" + key2.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/properties/slots/additionalProperties/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err62];}else {vErrors.push(err62);}errors++;}}}else {const err63 = {instancePath:instancePath+"/slots",schemaPath:"#/properties/slots/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err63];}else {vErrors.push(err63);}errors++;}}if(data.primaryAction !== undefined){let data22 = data.primaryAction;if(data22 && typeof data22 == "object" && !Array.isArray(data22)){if(data22.label === undefined){const err64 = {instancePath:instancePath+"/primaryAction",schemaPath:"#/$defs/primaryAction/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err64];}else {vErrors.push(err64);}errors++;}for(const key3 in data22){if(!((((((key3 === "id") || (key3 === "label")) || (key3 === "icon")) || (key3 === "route")) || (key3 === "href")) || (key3 === "payload"))){const err65 = {instancePath:instancePath+"/primaryAction",schemaPath:"#/$defs/primaryAction/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key3},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err65];}else {vErrors.push(err65);}errors++;}}if(data22.id !== undefined){if(typeof data22.id !== "string"){const err66 = {instancePath:instancePath+"/primaryAction/id",schemaPath:"#/$defs/primaryAction/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err66];}else {vErrors.push(err66);}errors++;}}if(data22.label !== undefined){if(typeof data22.label !== "string"){const err67 = {instancePath:instancePath+"/primaryAction/label",schemaPath:"#/$defs/primaryAction/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err67];}else {vErrors.push(err67);}errors++;}}if(data22.icon !== undefined){if(typeof data22.icon !== "string"){const err68 = {instancePath:instancePath+"/primaryAction/icon",schemaPath:"#/$defs/primaryAction/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err68];}else {vErrors.push(err68);}errors++;}}if(data22.route !== undefined){if(typeof data22.route !== "string"){const err69 = {instancePath:instancePath+"/primaryAction/route",schemaPath:"#/$defs/primaryAction/properties/route/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err69];}else {vErrors.push(err69);}errors++;}}if(data22.href !== undefined){if(typeof data22.href !== "string"){const err70 = {instancePath:instancePath+"/primaryAction/href",schemaPath:"#/$defs/primaryAction/properties/href/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err70];}else {vErrors.push(err70);}errors++;}}}else {const err71 = {instancePath:instancePath+"/primaryAction",schemaPath:"#/$defs/primaryAction/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err71];}else {vErrors.push(err71);}errors++;}}if(data.splitView !== undefined){let data28 = data.splitView;if(data28 && typeof data28 == "object" && !Array.isArray(data28)){if(data28.enabled === undefined){data28.enabled = false;}if(data28.breakpoint === undefined){data28.breakpoint = 1024;}for(const key4 in data28){if(!(((key4 === "enabled") || (key4 === "breakpoint")) || (key4 === "paneWidth"))){const err72 = {instancePath:instancePath+"/splitView",schemaPath:"#/$defs/splitView/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key4},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err72];}else {vErrors.push(err72);}errors++;}}if(typeof data28.enabled !== "boolean"){const err73 = {instancePath:instancePath+"/splitView/enabled",schemaPath:"#/$defs/splitView/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err73];}else {vErrors.push(err73);}errors++;}let data30 = data28.breakpoint;if(!((typeof data30 == "number") && (!(data30 % 1) && !isNaN(data30)))){const err74 = {instancePath:instancePath+"/splitView/breakpoint",schemaPath:"#/$defs/splitView/properties/breakpoint/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err74];}else {vErrors.push(err74);}errors++;}if(typeof data30 == "number"){if(data30 > 2560 || isNaN(data30)){const err75 = {instancePath:instancePath+"/splitView/breakpoint",schemaPath:"#/$defs/splitView/properties/breakpoint/maximum",keyword:"maximum",params:{comparison: "<=", limit: 2560},message:"must be <= 2560"};if(vErrors === null){vErrors = [err75];}else {vErrors.push(err75);}errors++;}if(data30 < 320 || isNaN(data30)){const err76 = {instancePath:instancePath+"/splitView/breakpoint",schemaPath:"#/$defs/splitView/properties/breakpoint/minimum",keyword:"minimum",params:{comparison: ">=", limit: 320},message:"must be >= 320"};if(vErrors === null){vErrors = [err76];}else {vErrors.push(err76);}errors++;}}if(data28.paneWidth !== undefined){if(typeof data28.paneWidth !== "string"){const err77 = {instancePath:instancePath+"/splitView/paneWidth",schemaPath:"#/$defs/splitView/properties/paneWidth/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err77];}else {vErrors.push(err77);}errors++;}}}else {const err78 = {instancePath:instancePath+"/splitView",schemaPath:"#/$defs/splitView/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err78];}else {vErrors.push(err78);}errors++;}}if(data.board !== undefined){let data32 = data.board;if(data32 && typeof data32 == "object" && !Array.isArray(data32)){if(data32.statusField === undefined){const err79 = {instancePath:instancePath+"/board",schemaPath:"#/$defs/boardView/required",keyword:"required",params:{missingProperty: "statusField"},message:"must have required property '"+"statusField"+"'"};if(vErrors === null){vErrors = [err79];}else {vErrors.push(err79);}errors++;}for(const key5 in data32){if(!(((key5 === "statusField") || (key5 === "cardFields")) || (key5 === "swimlaneField"))){const err80 = {instancePath:instancePath+"/board",schemaPath:"#/$defs/boardView/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key5},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err80];}else {vErrors.push(err80);}errors++;}}if(data32.statusField !== undefined){if(typeof data32.statusField !== "string"){const err81 = {instancePath:instancePath+"/board/statusField",schemaPath:"#/$defs/boardView/properties/statusField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err81];}else {vErrors.push(err81);}errors++;}}if(data32.cardFields !== undefined){let data34 = data32.cardFields;if(Array.isArray(data34)){const len0 = data34.length;for(let i0=0; i0<len0; i0++){if(typeof data34[i0] !== "string"){const err82 = {instancePath:instancePath+"/board/cardFields/" + i0,schemaPath:"#/$defs/boardView/properties/cardFields/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err82];}else {vErrors.push(err82);}errors++;}}}else {const err83 = {instancePath:instancePath+"/board/cardFields",schemaPath:"#/$defs/boardView/properties/cardFields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err83];}else {vErrors.push(err83);}errors++;}}if(data32.swimlaneField !== undefined){if(typeof data32.swimlaneField !== "string"){const err84 = {instancePath:instancePath+"/board/swimlaneField",schemaPath:"#/$defs/boardView/properties/swimlaneField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err84];}else {vErrors.push(err84);}errors++;}}}else {const err85 = {instancePath:instancePath+"/board",schemaPath:"#/$defs/boardView/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err85];}else {vErrors.push(err85);}errors++;}}if(data.dateAxis !== undefined){let data37 = data.dateAxis;if(data37 && typeof data37 == "object" && !Array.isArray(data37)){if(data37.startField === undefined){const err86 = {instancePath:instancePath+"/dateAxis",schemaPath:"#/$defs/dateAxisView/required",keyword:"required",params:{missingProperty: "startField"},message:"must have required property '"+"startField"+"'"};if(vErrors === null){vErrors = [err86];}else {vErrors.push(err86);}errors++;}if(data37.endField === undefined){const err87 = {instancePath:instancePath+"/dateAxis",schemaPath:"#/$defs/dateAxisView/required",keyword:"required",params:{missingProperty: "endField"},message:"must have required property '"+"endField"+"'"};if(vErrors === null){vErrors = [err87];}else {vErrors.push(err87);}errors++;}for(const key6 in data37){if(!((((key6 === "startField") || (key6 === "endField")) || (key6 === "laneField")) || (key6 === "labelField"))){const err88 = {instancePath:instancePath+"/dateAxis",schemaPath:"#/$defs/dateAxisView/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key6},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err88];}else {vErrors.push(err88);}errors++;}}if(data37.startField !== undefined){if(typeof data37.startField !== "string"){const err89 = {instancePath:instancePath+"/dateAxis/startField",schemaPath:"#/$defs/dateAxisView/properties/startField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err89];}else {vErrors.push(err89);}errors++;}}if(data37.endField !== undefined){if(typeof data37.endField !== "string"){const err90 = {instancePath:instancePath+"/dateAxis/endField",schemaPath:"#/$defs/dateAxisView/properties/endField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err90];}else {vErrors.push(err90);}errors++;}}if(data37.laneField !== undefined){if(typeof data37.laneField !== "string"){const err91 = {instancePath:instancePath+"/dateAxis/laneField",schemaPath:"#/$defs/dateAxisView/properties/laneField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err91];}else {vErrors.push(err91);}errors++;}}if(data37.labelField !== undefined){if(typeof data37.labelField !== "string"){const err92 = {instancePath:instancePath+"/dateAxis/labelField",schemaPath:"#/$defs/dateAxisView/properties/labelField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err92];}else {vErrors.push(err92);}errors++;}}}else {const err93 = {instancePath:instancePath+"/dateAxis",schemaPath:"#/$defs/dateAxisView/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err93];}else {vErrors.push(err93);}errors++;}}if(data.savedViewTree !== undefined){let data42 = data.savedViewTree;if(data42 && typeof data42 == "object" && !Array.isArray(data42)){if(data42.enabled === undefined){data42.enabled = false;}if(data42.maxDepth === undefined){data42.maxDepth = 3;}for(const key7 in data42){if(!(((((((key7 === "enabled") || (key7 === "maxDepth")) || (key7 === "templates")) || (key7 === "landingView")) || (key7 === "columnsPerRole")) || (key7 === "groupBy")) || (key7 === "seeded"))){const err94 = {instancePath:instancePath+"/savedViewTree",schemaPath:"#/$defs/savedViewTree/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key7},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err94];}else {vErrors.push(err94);}errors++;}}if(typeof data42.enabled !== "boolean"){const err95 = {instancePath:instancePath+"/savedViewTree/enabled",schemaPath:"#/$defs/savedViewTree/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err95];}else {vErrors.push(err95);}errors++;}let data44 = data42.maxDepth;if(!((typeof data44 == "number") && (!(data44 % 1) && !isNaN(data44)))){const err96 = {instancePath:instancePath+"/savedViewTree/maxDepth",schemaPath:"#/$defs/savedViewTree/properties/maxDepth/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err96];}else {vErrors.push(err96);}errors++;}if(typeof data44 == "number"){if(data44 > 5 || isNaN(data44)){const err97 = {instancePath:instancePath+"/savedViewTree/maxDepth",schemaPath:"#/$defs/savedViewTree/properties/maxDepth/maximum",keyword:"maximum",params:{comparison: "<=", limit: 5},message:"must be <= 5"};if(vErrors === null){vErrors = [err97];}else {vErrors.push(err97);}errors++;}if(data44 < 1 || isNaN(data44)){const err98 = {instancePath:instancePath+"/savedViewTree/maxDepth",schemaPath:"#/$defs/savedViewTree/properties/maxDepth/minimum",keyword:"minimum",params:{comparison: ">=", limit: 1},message:"must be >= 1"};if(vErrors === null){vErrors = [err98];}else {vErrors.push(err98);}errors++;}}if(data42.templates !== undefined){let data45 = data42.templates;if(Array.isArray(data45)){const len1 = data45.length;for(let i1=0; i1<len1; i1++){let data46 = data45[i1];if(data46 && typeof data46 == "object" && !Array.isArray(data46)){if(data46.slug === undefined){const err99 = {instancePath:instancePath+"/savedViewTree/templates/" + i1,schemaPath:"#/$defs/savedViewTree/properties/templates/items/required",keyword:"required",params:{missingProperty: "slug"},message:"must have required property '"+"slug"+"'"};if(vErrors === null){vErrors = [err99];}else {vErrors.push(err99);}errors++;}if(data46.name === undefined){const err100 = {instancePath:instancePath+"/savedViewTree/templates/" + i1,schemaPath:"#/$defs/savedViewTree/properties/templates/items/required",keyword:"required",params:{missingProperty: "name"},message:"must have required property '"+"name"+"'"};if(vErrors === null){vErrors = [err100];}else {vErrors.push(err100);}errors++;}for(const key8 in data46){if(!(((((key8 === "slug") || (key8 === "name")) || (key8 === "columns")) || (key8 === "defaultSort")) || (key8 === "exportFields"))){const err101 = {instancePath:instancePath+"/savedViewTree/templates/" + i1,schemaPath:"#/$defs/savedViewTree/properties/templates/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key8},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err101];}else {vErrors.push(err101);}errors++;}}if(data46.slug !== undefined){let data47 = data46.slug;if(typeof data47 === "string"){if(!pattern7.test(data47)){const err102 = {instancePath:instancePath+"/savedViewTree/templates/" + i1+"/slug",schemaPath:"#/$defs/savedViewTree/properties/templates/items/properties/slug/pattern",keyword:"pattern",params:{pattern: "^[a-z0-9][a-z0-9-]*$"},message:"must match pattern \""+"^[a-z0-9][a-z0-9-]*$"+"\""};if(vErrors === null){vErrors = [err102];}else {vErrors.push(err102);}errors++;}}else {const err103 = {instancePath:instancePath+"/savedViewTree/templates/" + i1+"/slug",schemaPath:"#/$defs/savedViewTree/properties/templates/items/properties/slug/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err103];}else {vErrors.push(err103);}errors++;}}if(data46.name !== undefined){if(typeof data46.name !== "string"){const err104 = {instancePath:instancePath+"/savedViewTree/templates/" + i1+"/name",schemaPath:"#/$defs/savedViewTree/properties/templates/items/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err104];}else {vErrors.push(err104);}errors++;}}if(data46.columns !== undefined){let data49 = data46.columns;if(Array.isArray(data49)){const len2 = data49.length;for(let i2=0; i2<len2; i2++){if(typeof data49[i2] !== "string"){const err105 = {instancePath:instancePath+"/savedViewTree/templates/" + i1+"/columns/" + i2,schemaPath:"#/$defs/savedViewTree/properties/templates/items/properties/columns/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err105];}else {vErrors.push(err105);}errors++;}}}else {const err106 = {instancePath:instancePath+"/savedViewTree/templates/" + i1+"/columns",schemaPath:"#/$defs/savedViewTree/properties/templates/items/properties/columns/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err106];}else {vErrors.push(err106);}errors++;}}if(data46.defaultSort !== undefined){if(typeof data46.defaultSort !== "string"){const err107 = {instancePath:instancePath+"/savedViewTree/templates/" + i1+"/defaultSort",schemaPath:"#/$defs/savedViewTree/properties/templates/items/properties/defaultSort/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err107];}else {vErrors.push(err107);}errors++;}}if(data46.exportFields !== undefined){let data52 = data46.exportFields;if(Array.isArray(data52)){const len3 = data52.length;for(let i3=0; i3<len3; i3++){if(typeof data52[i3] !== "string"){const err108 = {instancePath:instancePath+"/savedViewTree/templates/" + i1+"/exportFields/" + i3,schemaPath:"#/$defs/savedViewTree/properties/templates/items/properties/exportFields/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err108];}else {vErrors.push(err108);}errors++;}}}else {const err109 = {instancePath:instancePath+"/savedViewTree/templates/" + i1+"/exportFields",schemaPath:"#/$defs/savedViewTree/properties/templates/items/properties/exportFields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err109];}else {vErrors.push(err109);}errors++;}}}else {const err110 = {instancePath:instancePath+"/savedViewTree/templates/" + i1,schemaPath:"#/$defs/savedViewTree/properties/templates/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err110];}else {vErrors.push(err110);}errors++;}}}else {const err111 = {instancePath:instancePath+"/savedViewTree/templates",schemaPath:"#/$defs/savedViewTree/properties/templates/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err111];}else {vErrors.push(err111);}errors++;}}if(data42.landingView !== undefined){let data54 = data42.landingView;if(data54 && typeof data54 == "object" && !Array.isArray(data54)){for(const key9 in data54){if(!(pattern8.test(key9))){const err112 = {instancePath:instancePath+"/savedViewTree/landingView",schemaPath:"#/$defs/savedViewTree/properties/landingView/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key9},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err112];}else {vErrors.push(err112);}errors++;}}for(const key10 in data54){if(pattern8.test(key10)){if(typeof data54[key10] !== "string"){const err113 = {instancePath:instancePath+"/savedViewTree/landingView/" + key10.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/$defs/savedViewTree/properties/landingView/patternProperties/%5E%5BA-Za-z0-9_.-%5D%2B%24/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err113];}else {vErrors.push(err113);}errors++;}}}}else {const err114 = {instancePath:instancePath+"/savedViewTree/landingView",schemaPath:"#/$defs/savedViewTree/properties/landingView/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err114];}else {vErrors.push(err114);}errors++;}}if(data42.columnsPerRole !== undefined){let data56 = data42.columnsPerRole;if(data56 && typeof data56 == "object" && !Array.isArray(data56)){for(const key11 in data56){if(!(pattern8.test(key11))){const err115 = {instancePath:instancePath+"/savedViewTree/columnsPerRole",schemaPath:"#/$defs/savedViewTree/properties/columnsPerRole/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key11},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err115];}else {vErrors.push(err115);}errors++;}}for(const key12 in data56){if(pattern8.test(key12)){let data57 = data56[key12];if(Array.isArray(data57)){const len4 = data57.length;for(let i4=0; i4<len4; i4++){if(typeof data57[i4] !== "string"){const err116 = {instancePath:instancePath+"/savedViewTree/columnsPerRole/" + key12.replace(/~/g, "~0").replace(/\//g, "~1")+"/" + i4,schemaPath:"#/$defs/savedViewTree/properties/columnsPerRole/patternProperties/%5E%5BA-Za-z0-9_.-%5D%2B%24/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err116];}else {vErrors.push(err116);}errors++;}}}else {const err117 = {instancePath:instancePath+"/savedViewTree/columnsPerRole/" + key12.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/$defs/savedViewTree/properties/columnsPerRole/patternProperties/%5E%5BA-Za-z0-9_.-%5D%2B%24/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err117];}else {vErrors.push(err117);}errors++;}}}}else {const err118 = {instancePath:instancePath+"/savedViewTree/columnsPerRole",schemaPath:"#/$defs/savedViewTree/properties/columnsPerRole/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err118];}else {vErrors.push(err118);}errors++;}}if(data42.groupBy !== undefined){if(typeof data42.groupBy !== "string"){const err119 = {instancePath:instancePath+"/savedViewTree/groupBy",schemaPath:"#/$defs/savedViewTree/properties/groupBy/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err119];}else {vErrors.push(err119);}errors++;}}if(data42.seeded !== undefined){let data60 = data42.seeded;if(Array.isArray(data60)){const len5 = data60.length;for(let i5=0; i5<len5; i5++){let data61 = data60[i5];const _errs175 = errors;let valid48 = true;const _errs176 = errors;if(data61 && typeof data61 == "object" && !Array.isArray(data61)){if((data61.inherits === undefined) && ("inherits")){const err120 = {};if(vErrors === null){vErrors = [err120];}else {vErrors.push(err120);}errors++;}}var _valid7 = _errs176 === errors;errors = _errs175;if(vErrors !== null){if(_errs175){vErrors.length = _errs175;}else {vErrors = null;}}if(_valid7){const _errs177 = errors;if(data61 && typeof data61 == "object" && !Array.isArray(data61)){if(data61.parent === undefined){const err121 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5,schemaPath:"#/$defs/savedViewTree/properties/seeded/items/allOf/0/then/required",keyword:"required",params:{missingProperty: "parent"},message:"must have required property '"+"parent"+"'"};if(vErrors === null){vErrors = [err121];}else {vErrors.push(err121);}errors++;}}var _valid7 = _errs177 === errors;valid48 = _valid7;}if(!valid48){const err122 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5,schemaPath:"#/$defs/savedViewTree/properties/seeded/items/allOf/0/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err122];}else {vErrors.push(err122);}errors++;}if(data61 && typeof data61 == "object" && !Array.isArray(data61)){if(data61.slug === undefined){const err123 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5,schemaPath:"#/$defs/savedViewTree/properties/seeded/items/required",keyword:"required",params:{missingProperty: "slug"},message:"must have required property '"+"slug"+"'"};if(vErrors === null){vErrors = [err123];}else {vErrors.push(err123);}errors++;}if(data61.name === undefined){const err124 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5,schemaPath:"#/$defs/savedViewTree/properties/seeded/items/required",keyword:"required",params:{missingProperty: "name"},message:"must have required property '"+"name"+"'"};if(vErrors === null){vErrors = [err124];}else {vErrors.push(err124);}errors++;}for(const key13 in data61){if(!((((((key13 === "slug") || (key13 === "name")) || (key13 === "label")) || (key13 === "parent")) || (key13 === "actions")) || (key13 === "inherits"))){const err125 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5,schemaPath:"#/$defs/savedViewTree/properties/seeded/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key13},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err125];}else {vErrors.push(err125);}errors++;}}if(data61.slug !== undefined){let data62 = data61.slug;if(typeof data62 === "string"){if(!pattern7.test(data62)){const err126 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/slug",schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/slug/pattern",keyword:"pattern",params:{pattern: "^[a-z0-9][a-z0-9-]*$"},message:"must match pattern \""+"^[a-z0-9][a-z0-9-]*$"+"\""};if(vErrors === null){vErrors = [err126];}else {vErrors.push(err126);}errors++;}}else {const err127 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/slug",schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/slug/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err127];}else {vErrors.push(err127);}errors++;}}if(data61.name !== undefined){if(typeof data61.name !== "string"){const err128 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/name",schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err128];}else {vErrors.push(err128);}errors++;}}if(data61.label !== undefined){if(typeof data61.label !== "string"){const err129 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/label",schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err129];}else {vErrors.push(err129);}errors++;}}if(data61.parent !== undefined){if(typeof data61.parent !== "string"){const err130 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/parent",schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/parent/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err130];}else {vErrors.push(err130);}errors++;}}if(data61.actions !== undefined){let data66 = data61.actions;if(Array.isArray(data66)){const len6 = data66.length;for(let i6=0; i6<len6; i6++){if(typeof data66[i6] !== "string"){const err131 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/actions/" + i6,schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/actions/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err131];}else {vErrors.push(err131);}errors++;}}let i7 = data66.length;let j0;if(i7 > 1){const indices0 = {};for(;i7--;){let item0 = data66[i7];if(typeof item0 !== "string"){continue;}if(typeof indices0[item0] == "number"){j0 = indices0[item0];const err132 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/actions",schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/actions/uniqueItems",keyword:"uniqueItems",params:{i: i7, j: j0},message:"must NOT have duplicate items (items ## "+j0+" and "+i7+" are identical)"};if(vErrors === null){vErrors = [err132];}else {vErrors.push(err132);}errors++;break;}indices0[item0] = i7;}}}else {const err133 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/actions",schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/actions/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err133];}else {vErrors.push(err133);}errors++;}}if(data61.inherits !== undefined){let data68 = data61.inherits;if(Array.isArray(data68)){const len7 = data68.length;for(let i8=0; i8<len7; i8++){let data69 = data68[i8];if(typeof data69 !== "string"){const err134 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/inherits/" + i8,schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/inherits/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err134];}else {vErrors.push(err134);}errors++;}if(!(((((data69 === "criteria") || (data69 === "columns")) || (data69 === "sorting")) || (data69 === "defaultSort")) || (data69 === "exportFields"))){const err135 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/inherits/" + i8,schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/inherits/items/enum",keyword:"enum",params:{allowedValues: schema49.properties.seeded.items.properties.inherits.items.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err135];}else {vErrors.push(err135);}errors++;}}let i9 = data68.length;let j1;if(i9 > 1){const indices1 = {};for(;i9--;){let item1 = data68[i9];if(typeof item1 !== "string"){continue;}if(typeof indices1[item1] == "number"){j1 = indices1[item1];const err136 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/inherits",schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/inherits/uniqueItems",keyword:"uniqueItems",params:{i: i9, j: j1},message:"must NOT have duplicate items (items ## "+j1+" and "+i9+" are identical)"};if(vErrors === null){vErrors = [err136];}else {vErrors.push(err136);}errors++;break;}indices1[item1] = i9;}}}else {const err137 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/inherits",schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/inherits/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err137];}else {vErrors.push(err137);}errors++;}}}else {const err138 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5,schemaPath:"#/$defs/savedViewTree/properties/seeded/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err138];}else {vErrors.push(err138);}errors++;}}}else {const err139 = {instancePath:instancePath+"/savedViewTree/seeded",schemaPath:"#/$defs/savedViewTree/properties/seeded/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err139];}else {vErrors.push(err139);}errors++;}}}else {const err140 = {instancePath:instancePath+"/savedViewTree",schemaPath:"#/$defs/savedViewTree/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err140];}else {vErrors.push(err140);}errors++;}}if(typeof data.manualOrder !== "boolean"){const err141 = {instancePath:instancePath+"/manualOrder",schemaPath:"#/properties/manualOrder/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err141];}else {vErrors.push(err141);}errors++;}if(typeof data.tabInAddress !== "boolean"){const err142 = {instancePath:instancePath+"/tabInAddress",schemaPath:"#/properties/tabInAddress/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err142];}else {vErrors.push(err142);}errors++;}if(typeof data.referencePreview !== "boolean"){const err143 = {instancePath:instancePath+"/referencePreview",schemaPath:"#/properties/referencePreview/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err143];}else {vErrors.push(err143);}errors++;}if(data.widgets !== undefined){let data73 = data.widgets;if(Array.isArray(data73)){const len8 = data73.length;for(let i10=0; i10<len8; i10++){if(!(validate26(data73[i10], {instancePath:instancePath+"/widgets/" + i10,parentData:data73,parentDataProperty:i10,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate26.errors : vErrors.concat(validate26.errors);errors = vErrors.length;}}}else {const err144 = {instancePath:instancePath+"/widgets",schemaPath:"#/properties/widgets/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err144];}else {vErrors.push(err144);}errors++;}}if(data.actions !== undefined){let data75 = data.actions;if(Array.isArray(data75)){const len9 = data75.length;for(let i11=0; i11<len9; i11++){if(!(validate33(data75[i11], {instancePath:instancePath+"/actions/" + i11,parentData:data75,parentDataProperty:i11,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate33.errors : vErrors.concat(validate33.errors);errors = vErrors.length;}}}else {const err145 = {instancePath:instancePath+"/actions",schemaPath:"#/properties/actions/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err145];}else {vErrors.push(err145);}errors++;}}if(data.config !== undefined){let data77 = data.config;if(!(validate27(data77, {instancePath:instancePath+"/config",parentData:data,parentDataProperty:"config",rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate27.errors : vErrors.concat(validate27.errors);errors = vErrors.length;}if(data77 && typeof data77 == "object" && !Array.isArray(data77)){if(data77.rowIndicatorCap === undefined){data77.rowIndicatorCap = 3;}if(data77.writableField === undefined){data77.writableField = "@self.writableFields";}if(data77.listShortcuts === undefined){data77.listShortcuts = false;}if(data77.formSize === undefined){data77.formSize = "normal";}if(data77.formColumns === undefined){data77.formColumns = 1;}if(data77.splitCloseButton === undefined){data77.splitCloseButton = true;}if(data77.quickFilterMaxVisible === undefined){data77.quickFilterMaxVisible = 0;}if(data77.subscribe === undefined){data77.subscribe = true;}if(data77.lock === undefined){data77.lock = true;}if(data77.entitySource !== undefined){let data78 = data77.entitySource;if(typeof data78 !== "string"){const err146 = {instancePath:instancePath+"/config/entitySource",schemaPath:"#/properties/config/properties/entitySource/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err146];}else {vErrors.push(err146);}errors++;}if(!((data78 === "flows") || (data78 === "tasks"))){const err147 = {instancePath:instancePath+"/config/entitySource",schemaPath:"#/properties/config/properties/entitySource/enum",keyword:"enum",params:{allowedValues: schema44.properties.config.properties.entitySource.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err147];}else {vErrors.push(err147);}errors++;}}if(data77.app !== undefined){if(typeof data77.app !== "string"){const err148 = {instancePath:instancePath+"/config/app",schemaPath:"#/properties/config/properties/app/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err148];}else {vErrors.push(err148);}errors++;}}if(data77.register !== undefined){if(typeof data77.register !== "string"){const err149 = {instancePath:instancePath+"/config/register",schemaPath:"#/properties/config/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err149];}else {vErrors.push(err149);}errors++;}}if(data77.schema !== undefined){if(typeof data77.schema !== "string"){const err150 = {instancePath:instancePath+"/config/schema",schemaPath:"#/properties/config/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err150];}else {vErrors.push(err150);}errors++;}}if(data77.contentField !== undefined){if(typeof data77.contentField !== "string"){const err151 = {instancePath:instancePath+"/config/contentField",schemaPath:"#/properties/config/properties/contentField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err151];}else {vErrors.push(err151);}errors++;}}if(data77.titleField !== undefined){if(typeof data77.titleField !== "string"){const err152 = {instancePath:instancePath+"/config/titleField",schemaPath:"#/properties/config/properties/titleField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err152];}else {vErrors.push(err152);}errors++;}}if(data77.idParam !== undefined){if(typeof data77.idParam !== "string"){const err153 = {instancePath:instancePath+"/config/idParam",schemaPath:"#/properties/config/properties/idParam/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err153];}else {vErrors.push(err153);}errors++;}}if(data77.treeField !== undefined){if(typeof data77.treeField !== "string"){const err154 = {instancePath:instancePath+"/config/treeField",schemaPath:"#/properties/config/properties/treeField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err154];}else {vErrors.push(err154);}errors++;}}if(data77.sidebarTitleField !== undefined){if(typeof data77.sidebarTitleField !== "string"){const err155 = {instancePath:instancePath+"/config/sidebarTitleField",schemaPath:"#/properties/config/properties/sidebarTitleField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err155];}else {vErrors.push(err155);}errors++;}}if(data77.sidebarRegister !== undefined){if(typeof data77.sidebarRegister !== "string"){const err156 = {instancePath:instancePath+"/config/sidebarRegister",schemaPath:"#/properties/config/properties/sidebarRegister/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err156];}else {vErrors.push(err156);}errors++;}}if(data77.sidebarSchema !== undefined){if(typeof data77.sidebarSchema !== "string"){const err157 = {instancePath:instancePath+"/config/sidebarSchema",schemaPath:"#/properties/config/properties/sidebarSchema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err157];}else {vErrors.push(err157);}errors++;}}if(data77.emptyText !== undefined){if(typeof data77.emptyText !== "string"){const err158 = {instancePath:instancePath+"/config/emptyText",schemaPath:"#/properties/config/properties/emptyText/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err158];}else {vErrors.push(err158);}errors++;}}if(data77.emptyDescription !== undefined){if(typeof data77.emptyDescription !== "string"){const err159 = {instancePath:instancePath+"/config/emptyDescription",schemaPath:"#/properties/config/properties/emptyDescription/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err159];}else {vErrors.push(err159);}errors++;}}if(data77.emptyBodyText !== undefined){if(typeof data77.emptyBodyText !== "string"){const err160 = {instancePath:instancePath+"/config/emptyBodyText",schemaPath:"#/properties/config/properties/emptyBodyText/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err160];}else {vErrors.push(err160);}errors++;}}if(data77.emptyBodyDescription !== undefined){if(typeof data77.emptyBodyDescription !== "string"){const err161 = {instancePath:instancePath+"/config/emptyBodyDescription",schemaPath:"#/properties/config/properties/emptyBodyDescription/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err161];}else {vErrors.push(err161);}errors++;}}if(data77.cardComponent !== undefined){if(typeof data77.cardComponent !== "string"){const err162 = {instancePath:instancePath+"/config/cardComponent",schemaPath:"#/properties/config/properties/cardComponent/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err162];}else {vErrors.push(err162);}errors++;}}if(data77.sidebar !== undefined){let data94 = data77.sidebar;const _errs244 = errors;let valid62 = false;let passing1 = null;const _errs245 = errors;if(typeof data94 !== "boolean"){const err163 = {instancePath:instancePath+"/config/sidebar",schemaPath:"#/properties/config/properties/sidebar/oneOf/0/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err163];}else {vErrors.push(err163);}errors++;}var _valid8 = _errs245 === errors;if(_valid8){valid62 = true;passing1 = 0;}const _errs247 = errors;if(data94 && typeof data94 == "object" && !Array.isArray(data94)){if(data94.show !== undefined){if(typeof data94.show !== "boolean"){const err164 = {instancePath:instancePath+"/config/sidebar/show",schemaPath:"#/properties/config/properties/sidebar/oneOf/1/properties/show/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err164];}else {vErrors.push(err164);}errors++;}}if(data94.enabled !== undefined){if(typeof data94.enabled !== "boolean"){const err165 = {instancePath:instancePath+"/config/sidebar/enabled",schemaPath:"#/properties/config/properties/sidebar/oneOf/1/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err165];}else {vErrors.push(err165);}errors++;}}if(data94.columnGroups !== undefined){let data97 = data94.columnGroups;if(Array.isArray(data97)){const len10 = data97.length;for(let i12=0; i12<len10; i12++){let data98 = data97[i12];if(data98 && typeof data98 == "object" && !Array.isArray(data98));else {const err166 = {instancePath:instancePath+"/config/sidebar/columnGroups/" + i12,schemaPath:"#/properties/config/properties/sidebar/oneOf/1/properties/columnGroups/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err166];}else {vErrors.push(err166);}errors++;}}}else {const err167 = {instancePath:instancePath+"/config/sidebar/columnGroups",schemaPath:"#/properties/config/properties/sidebar/oneOf/1/properties/columnGroups/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err167];}else {vErrors.push(err167);}errors++;}}}else {const err168 = {instancePath:instancePath+"/config/sidebar",schemaPath:"#/properties/config/properties/sidebar/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err168];}else {vErrors.push(err168);}errors++;}var _valid8 = _errs247 === errors;if(_valid8 && valid62){valid62 = false;passing1 = [passing1, 1];}else {if(_valid8){valid62 = true;passing1 = 1;}}if(!valid62){const err169 = {instancePath:instancePath+"/config/sidebar",schemaPath:"#/properties/config/properties/sidebar/oneOf",keyword:"oneOf",params:{passingSchemas: passing1},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err169];}else {vErrors.push(err169);}errors++;}else {errors = _errs244;if(vErrors !== null){if(_errs244){vErrors.length = _errs244;}else {vErrors = null;}}}}if(data77.tabs !== undefined){let data99 = data77.tabs;if(Array.isArray(data99)){const len11 = data99.length;for(let i13=0; i13<len11; i13++){let data100 = data99[i13];if(data100 && typeof data100 == "object" && !Array.isArray(data100));else {const err170 = {instancePath:instancePath+"/config/tabs/" + i13,schemaPath:"#/properties/config/properties/tabs/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err170];}else {vErrors.push(err170);}errors++;}}}else {const err171 = {instancePath:instancePath+"/config/tabs",schemaPath:"#/properties/config/properties/tabs/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err171];}else {vErrors.push(err171);}errors++;}}if(data77.sidebarTabs !== undefined){let data101 = data77.sidebarTabs;if(Array.isArray(data101)){const len12 = data101.length;for(let i14=0; i14<len12; i14++){let data102 = data101[i14];if(data102 && typeof data102 == "object" && !Array.isArray(data102)){if(data102.id === undefined){const err172 = {instancePath:instancePath+"/config/sidebarTabs/" + i14,schemaPath:"#/properties/config/properties/sidebarTabs/items/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err172];}else {vErrors.push(err172);}errors++;}if(data102.label === undefined){const err173 = {instancePath:instancePath+"/config/sidebarTabs/" + i14,schemaPath:"#/properties/config/properties/sidebarTabs/items/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err173];}else {vErrors.push(err173);}errors++;}if(data102.id !== undefined){let data103 = data102.id;if(typeof data103 === "string"){if(func6(data103) < 1){const err174 = {instancePath:instancePath+"/config/sidebarTabs/" + i14+"/id",schemaPath:"#/properties/config/properties/sidebarTabs/items/properties/id/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err174];}else {vErrors.push(err174);}errors++;}}else {const err175 = {instancePath:instancePath+"/config/sidebarTabs/" + i14+"/id",schemaPath:"#/properties/config/properties/sidebarTabs/items/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err175];}else {vErrors.push(err175);}errors++;}}if(data102.label !== undefined){let data104 = data102.label;if(typeof data104 === "string"){if(func6(data104) < 1){const err176 = {instancePath:instancePath+"/config/sidebarTabs/" + i14+"/label",schemaPath:"#/properties/config/properties/sidebarTabs/items/properties/label/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err176];}else {vErrors.push(err176);}errors++;}}else {const err177 = {instancePath:instancePath+"/config/sidebarTabs/" + i14+"/label",schemaPath:"#/properties/config/properties/sidebarTabs/items/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err177];}else {vErrors.push(err177);}errors++;}}if(data102.icon !== undefined){if(typeof data102.icon !== "string"){const err178 = {instancePath:instancePath+"/config/sidebarTabs/" + i14+"/icon",schemaPath:"#/properties/config/properties/sidebarTabs/items/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err178];}else {vErrors.push(err178);}errors++;}}if(data102.order !== undefined){if(!(typeof data102.order == "number")){const err179 = {instancePath:instancePath+"/config/sidebarTabs/" + i14+"/order",schemaPath:"#/properties/config/properties/sidebarTabs/items/properties/order/type",keyword:"type",params:{type: "number"},message:"must be number"};if(vErrors === null){vErrors = [err179];}else {vErrors.push(err179);}errors++;}}if(data102.component !== undefined){if(typeof data102.component !== "string"){const err180 = {instancePath:instancePath+"/config/sidebarTabs/" + i14+"/component",schemaPath:"#/properties/config/properties/sidebarTabs/items/properties/component/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err180];}else {vErrors.push(err180);}errors++;}}if(data102._note !== undefined){if(typeof data102._note !== "string"){const err181 = {instancePath:instancePath+"/config/sidebarTabs/" + i14+"/_note",schemaPath:"#/properties/config/properties/sidebarTabs/items/properties/_note/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err181];}else {vErrors.push(err181);}errors++;}}}else {const err182 = {instancePath:instancePath+"/config/sidebarTabs/" + i14,schemaPath:"#/properties/config/properties/sidebarTabs/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err182];}else {vErrors.push(err182);}errors++;}}}else {const err183 = {instancePath:instancePath+"/config/sidebarTabs",schemaPath:"#/properties/config/properties/sidebarTabs/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err183];}else {vErrors.push(err183);}errors++;}}if(data77.sections !== undefined){let data109 = data77.sections;if(Array.isArray(data109)){const len13 = data109.length;for(let i15=0; i15<len13; i15++){let data110 = data109[i15];if(data110 && typeof data110 == "object" && !Array.isArray(data110));else {const err184 = {instancePath:instancePath+"/config/sections/" + i15,schemaPath:"#/properties/config/properties/sections/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err184];}else {vErrors.push(err184);}errors++;}}}else {const err185 = {instancePath:instancePath+"/config/sections",schemaPath:"#/properties/config/properties/sections/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err185];}else {vErrors.push(err185);}errors++;}}if(data77.fields !== undefined){let data111 = data77.fields;if(Array.isArray(data111)){const len14 = data111.length;for(let i16=0; i16<len14; i16++){let data112 = data111[i16];if(data112 && typeof data112 == "object" && !Array.isArray(data112)){if(data112.visibleWhen !== undefined){if(!(validate34(data112.visibleWhen, {instancePath:instancePath+"/config/fields/" + i16+"/visibleWhen",parentData:data112,parentDataProperty:"visibleWhen",rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate34.errors : vErrors.concat(validate34.errors);errors = vErrors.length;}}if(data112.validation !== undefined){let data114 = data112.validation;if(data114 && typeof data114 == "object" && !Array.isArray(data114)){for(const key14 in data114){if(!(((((key14 === "required") || (key14 === "min")) || (key14 === "max")) || (key14 === "pattern")) || (key14 === "message"))){const err186 = {instancePath:instancePath+"/config/fields/" + i16+"/validation",schemaPath:"#/$defs/fieldValidation/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key14},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err186];}else {vErrors.push(err186);}errors++;}}if(data114.required !== undefined){if(typeof data114.required !== "boolean"){const err187 = {instancePath:instancePath+"/config/fields/" + i16+"/validation/required",schemaPath:"#/$defs/fieldValidation/properties/required/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err187];}else {vErrors.push(err187);}errors++;}}if(data114.min !== undefined){if(!(typeof data114.min == "number")){const err188 = {instancePath:instancePath+"/config/fields/" + i16+"/validation/min",schemaPath:"#/$defs/fieldValidation/properties/min/type",keyword:"type",params:{type: "number"},message:"must be number"};if(vErrors === null){vErrors = [err188];}else {vErrors.push(err188);}errors++;}}if(data114.max !== undefined){if(!(typeof data114.max == "number")){const err189 = {instancePath:instancePath+"/config/fields/" + i16+"/validation/max",schemaPath:"#/$defs/fieldValidation/properties/max/type",keyword:"type",params:{type: "number"},message:"must be number"};if(vErrors === null){vErrors = [err189];}else {vErrors.push(err189);}errors++;}}if(data114.pattern !== undefined){if(typeof data114.pattern !== "string"){const err190 = {instancePath:instancePath+"/config/fields/" + i16+"/validation/pattern",schemaPath:"#/$defs/fieldValidation/properties/pattern/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err190];}else {vErrors.push(err190);}errors++;}}if(data114.message !== undefined){if(typeof data114.message !== "string"){const err191 = {instancePath:instancePath+"/config/fields/" + i16+"/validation/message",schemaPath:"#/$defs/fieldValidation/properties/message/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err191];}else {vErrors.push(err191);}errors++;}}}else {const err192 = {instancePath:instancePath+"/config/fields/" + i16+"/validation",schemaPath:"#/$defs/fieldValidation/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err192];}else {vErrors.push(err192);}errors++;}}}else {const err193 = {instancePath:instancePath+"/config/fields/" + i16,schemaPath:"#/properties/config/properties/fields/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err193];}else {vErrors.push(err193);}errors++;}}}else {const err194 = {instancePath:instancePath+"/config/fields",schemaPath:"#/properties/config/properties/fields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err194];}else {vErrors.push(err194);}errors++;}}if(data77.steps !== undefined){let data120 = data77.steps;if(Array.isArray(data120)){if(data120.length < 1){const err195 = {instancePath:instancePath+"/config/steps",schemaPath:"#/properties/config/properties/steps/minItems",keyword:"minItems",params:{limit: 1},message:"must NOT have fewer than 1 items"};if(vErrors === null){vErrors = [err195];}else {vErrors.push(err195);}errors++;}const len15 = data120.length;for(let i17=0; i17<len15; i17++){let data121 = data120[i17];if(data121 && typeof data121 == "object" && !Array.isArray(data121)){if(data121.id === undefined){const err196 = {instancePath:instancePath+"/config/steps/" + i17,schemaPath:"#/properties/config/properties/steps/items/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err196];}else {vErrors.push(err196);}errors++;}if(data121.title === undefined){const err197 = {instancePath:instancePath+"/config/steps/" + i17,schemaPath:"#/properties/config/properties/steps/items/required",keyword:"required",params:{missingProperty: "title"},message:"must have required property '"+"title"+"'"};if(vErrors === null){vErrors = [err197];}else {vErrors.push(err197);}errors++;}if(data121.fields === undefined){const err198 = {instancePath:instancePath+"/config/steps/" + i17,schemaPath:"#/properties/config/properties/steps/items/required",keyword:"required",params:{missingProperty: "fields"},message:"must have required property '"+"fields"+"'"};if(vErrors === null){vErrors = [err198];}else {vErrors.push(err198);}errors++;}for(const key15 in data121){if(!((((key15 === "id") || (key15 === "title")) || (key15 === "description")) || (key15 === "fields"))){const err199 = {instancePath:instancePath+"/config/steps/" + i17,schemaPath:"#/properties/config/properties/steps/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key15},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err199];}else {vErrors.push(err199);}errors++;}}if(data121.id !== undefined){let data122 = data121.id;if(typeof data122 === "string"){if(func6(data122) < 1){const err200 = {instancePath:instancePath+"/config/steps/" + i17+"/id",schemaPath:"#/properties/config/properties/steps/items/properties/id/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err200];}else {vErrors.push(err200);}errors++;}}else {const err201 = {instancePath:instancePath+"/config/steps/" + i17+"/id",schemaPath:"#/properties/config/properties/steps/items/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err201];}else {vErrors.push(err201);}errors++;}}if(data121.title !== undefined){let data123 = data121.title;if(typeof data123 === "string"){if(func6(data123) < 1){const err202 = {instancePath:instancePath+"/config/steps/" + i17+"/title",schemaPath:"#/properties/config/properties/steps/items/properties/title/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err202];}else {vErrors.push(err202);}errors++;}}else {const err203 = {instancePath:instancePath+"/config/steps/" + i17+"/title",schemaPath:"#/properties/config/properties/steps/items/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err203];}else {vErrors.push(err203);}errors++;}}if(data121.description !== undefined){if(typeof data121.description !== "string"){const err204 = {instancePath:instancePath+"/config/steps/" + i17+"/description",schemaPath:"#/properties/config/properties/steps/items/properties/description/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err204];}else {vErrors.push(err204);}errors++;}}if(data121.fields !== undefined){let data125 = data121.fields;if(Array.isArray(data125)){if(data125.length < 1){const err205 = {instancePath:instancePath+"/config/steps/" + i17+"/fields",schemaPath:"#/properties/config/properties/steps/items/properties/fields/minItems",keyword:"minItems",params:{limit: 1},message:"must NOT have fewer than 1 items"};if(vErrors === null){vErrors = [err205];}else {vErrors.push(err205);}errors++;}const len16 = data125.length;for(let i18=0; i18<len16; i18++){let data126 = data125[i18];if(typeof data126 === "string"){if(func6(data126) < 1){const err206 = {instancePath:instancePath+"/config/steps/" + i17+"/fields/" + i18,schemaPath:"#/properties/config/properties/steps/items/properties/fields/items/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err206];}else {vErrors.push(err206);}errors++;}}else {const err207 = {instancePath:instancePath+"/config/steps/" + i17+"/fields/" + i18,schemaPath:"#/properties/config/properties/steps/items/properties/fields/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err207];}else {vErrors.push(err207);}errors++;}}}else {const err208 = {instancePath:instancePath+"/config/steps/" + i17+"/fields",schemaPath:"#/properties/config/properties/steps/items/properties/fields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err208];}else {vErrors.push(err208);}errors++;}}}else {const err209 = {instancePath:instancePath+"/config/steps/" + i17,schemaPath:"#/properties/config/properties/steps/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err209];}else {vErrors.push(err209);}errors++;}}}else {const err210 = {instancePath:instancePath+"/config/steps",schemaPath:"#/properties/config/properties/steps/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err210];}else {vErrors.push(err210);}errors++;}}if(data77.fieldWidgets !== undefined){let data127 = data77.fieldWidgets;if(Array.isArray(data127)){const len17 = data127.length;for(let i19=0; i19<len17; i19++){let data128 = data127[i19];if(data128 && typeof data128 == "object" && !Array.isArray(data128)){if(data128.id === undefined){const err211 = {instancePath:instancePath+"/config/fieldWidgets/" + i19,schemaPath:"#/$defs/fieldWidget/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err211];}else {vErrors.push(err211);}errors++;}if(data128.component === undefined){const err212 = {instancePath:instancePath+"/config/fieldWidgets/" + i19,schemaPath:"#/$defs/fieldWidget/required",keyword:"required",params:{missingProperty: "component"},message:"must have required property '"+"component"+"'"};if(vErrors === null){vErrors = [err212];}else {vErrors.push(err212);}errors++;}for(const key16 in data128){if(!((((key16 === "id") || (key16 === "component")) || (key16 === "props")) || (key16 === "_note"))){const err213 = {instancePath:instancePath+"/config/fieldWidgets/" + i19,schemaPath:"#/$defs/fieldWidget/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key16},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err213];}else {vErrors.push(err213);}errors++;}}if(data128.id !== undefined){let data129 = data128.id;if(typeof data129 === "string"){if(!pattern25.test(data129)){const err214 = {instancePath:instancePath+"/config/fieldWidgets/" + i19+"/id",schemaPath:"#/$defs/fieldWidget/properties/id/pattern",keyword:"pattern",params:{pattern: "^[a-z][a-zA-Z0-9_-]*$"},message:"must match pattern \""+"^[a-z][a-zA-Z0-9_-]*$"+"\""};if(vErrors === null){vErrors = [err214];}else {vErrors.push(err214);}errors++;}}else {const err215 = {instancePath:instancePath+"/config/fieldWidgets/" + i19+"/id",schemaPath:"#/$defs/fieldWidget/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err215];}else {vErrors.push(err215);}errors++;}}if(data128.component !== undefined){let data130 = data128.component;if(typeof data130 === "string"){if(!pattern6.test(data130)){const err216 = {instancePath:instancePath+"/config/fieldWidgets/" + i19+"/component",schemaPath:"#/$defs/fieldWidget/properties/component/pattern",keyword:"pattern",params:{pattern: "^Cn[A-Z]\\w+$"},message:"must match pattern \""+"^Cn[A-Z]\\w+$"+"\""};if(vErrors === null){vErrors = [err216];}else {vErrors.push(err216);}errors++;}}else {const err217 = {instancePath:instancePath+"/config/fieldWidgets/" + i19+"/component",schemaPath:"#/$defs/fieldWidget/properties/component/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err217];}else {vErrors.push(err217);}errors++;}}if(data128.props !== undefined){let data131 = data128.props;if(data131 && typeof data131 == "object" && !Array.isArray(data131));else {const err218 = {instancePath:instancePath+"/config/fieldWidgets/" + i19+"/props",schemaPath:"#/$defs/fieldWidget/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err218];}else {vErrors.push(err218);}errors++;}}if(data128._note !== undefined){if(typeof data128._note !== "string"){const err219 = {instancePath:instancePath+"/config/fieldWidgets/" + i19+"/_note",schemaPath:"#/$defs/fieldWidget/properties/_note/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err219];}else {vErrors.push(err219);}errors++;}}}else {const err220 = {instancePath:instancePath+"/config/fieldWidgets/" + i19,schemaPath:"#/$defs/fieldWidget/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err220];}else {vErrors.push(err220);}errors++;}}}else {const err221 = {instancePath:instancePath+"/config/fieldWidgets",schemaPath:"#/properties/config/properties/fieldWidgets/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err221];}else {vErrors.push(err221);}errors++;}}if(data77.columns !== undefined){let data133 = data77.columns;if(Array.isArray(data133)){const len18 = data133.length;for(let i20=0; i20<len18; i20++){let data134 = data133[i20];const _errs339 = errors;let valid89 = false;let passing2 = null;const _errs340 = errors;if(typeof data134 !== "string"){const err222 = {instancePath:instancePath+"/config/columns/" + i20,schemaPath:"#/properties/config/properties/columns/items/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err222];}else {vErrors.push(err222);}errors++;}var _valid9 = _errs340 === errors;if(_valid9){valid89 = true;passing2 = 0;}const _errs342 = errors;if(data134 && typeof data134 == "object" && !Array.isArray(data134));else {const err223 = {instancePath:instancePath+"/config/columns/" + i20,schemaPath:"#/properties/config/properties/columns/items/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err223];}else {vErrors.push(err223);}errors++;}var _valid9 = _errs342 === errors;if(_valid9 && valid89){valid89 = false;passing2 = [passing2, 1];}else {if(_valid9){valid89 = true;passing2 = 1;}}if(!valid89){const err224 = {instancePath:instancePath+"/config/columns/" + i20,schemaPath:"#/properties/config/properties/columns/items/oneOf",keyword:"oneOf",params:{passingSchemas: passing2},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err224];}else {vErrors.push(err224);}errors++;}else {errors = _errs339;if(vErrors !== null){if(_errs339){vErrors.length = _errs339;}else {vErrors = null;}}}}}else {const err225 = {instancePath:instancePath+"/config/columns",schemaPath:"#/properties/config/properties/columns/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err225];}else {vErrors.push(err225);}errors++;}}if(data77.folderSidebar !== undefined){let data135 = data77.folderSidebar;if(data135 && typeof data135 == "object" && !Array.isArray(data135)){if(data135.folders !== undefined){let data136 = data135.folders;if(Array.isArray(data136)){const len19 = data136.length;for(let i21=0; i21<len19; i21++){if(!(validate44(data136[i21], {instancePath:instancePath+"/config/folderSidebar/folders/" + i21,parentData:data136,parentDataProperty:i21,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate44.errors : vErrors.concat(validate44.errors);errors = vErrors.length;}}}else {const err226 = {instancePath:instancePath+"/config/folderSidebar/folders",schemaPath:"#/properties/config/properties/folderSidebar/properties/folders/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err226];}else {vErrors.push(err226);}errors++;}}}else {const err227 = {instancePath:instancePath+"/config/folderSidebar",schemaPath:"#/properties/config/properties/folderSidebar/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err227];}else {vErrors.push(err227);}errors++;}}if(data77.layout !== undefined){let data138 = data77.layout;if(Array.isArray(data138)){const len20 = data138.length;for(let i22=0; i22<len20; i22++){let data139 = data138[i22];if(data139 && typeof data139 == "object" && !Array.isArray(data139));else {const err228 = {instancePath:instancePath+"/config/layout/" + i22,schemaPath:"#/properties/config/properties/layout/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err228];}else {vErrors.push(err228);}errors++;}}}else {const err229 = {instancePath:instancePath+"/config/layout",schemaPath:"#/properties/config/properties/layout/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err229];}else {vErrors.push(err229);}errors++;}}if(data77.content !== undefined){let data140 = data77.content;if(Array.isArray(data140)){const len21 = data140.length;for(let i23=0; i23<len21; i23++){let data141 = data140[i23];if(data141 && typeof data141 == "object" && !Array.isArray(data141));else {const err230 = {instancePath:instancePath+"/config/content/" + i23,schemaPath:"#/properties/config/properties/content/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err230];}else {vErrors.push(err230);}errors++;}}}else {const err231 = {instancePath:instancePath+"/config/content",schemaPath:"#/properties/config/properties/content/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err231];}else {vErrors.push(err231);}errors++;}}if(data77.widgets !== undefined){let data142 = data77.widgets;if(Array.isArray(data142)){const len22 = data142.length;for(let i24=0; i24<len22; i24++){let data143 = data142[i24];if(data143 && typeof data143 == "object" && !Array.isArray(data143));else {const err232 = {instancePath:instancePath+"/config/widgets/" + i24,schemaPath:"#/properties/config/properties/widgets/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err232];}else {vErrors.push(err232);}errors++;}}}else {const err233 = {instancePath:instancePath+"/config/widgets",schemaPath:"#/properties/config/properties/widgets/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err233];}else {vErrors.push(err233);}errors++;}}if(data77.headerActions !== undefined){let data144 = data77.headerActions;if(Array.isArray(data144)){const len23 = data144.length;for(let i25=0; i25<len23; i25++){if(!(validate33(data144[i25], {instancePath:instancePath+"/config/headerActions/" + i25,parentData:data144,parentDataProperty:i25,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate33.errors : vErrors.concat(validate33.errors);errors = vErrors.length;}}}else {const err234 = {instancePath:instancePath+"/config/headerActions",schemaPath:"#/properties/config/properties/headerActions/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err234];}else {vErrors.push(err234);}errors++;}}if(data77.bulkActions !== undefined){let data146 = data77.bulkActions;if(Array.isArray(data146)){const len24 = data146.length;for(let i26=0; i26<len24; i26++){if(!(validate33(data146[i26], {instancePath:instancePath+"/config/bulkActions/" + i26,parentData:data146,parentDataProperty:i26,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate33.errors : vErrors.concat(validate33.errors);errors = vErrors.length;}}}else {const err235 = {instancePath:instancePath+"/config/bulkActions",schemaPath:"#/properties/config/properties/bulkActions/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err235];}else {vErrors.push(err235);}errors++;}}if(data77.actions !== undefined){let data148 = data77.actions;if(Array.isArray(data148)){const len25 = data148.length;for(let i27=0; i27<len25; i27++){let data149 = data148[i27];if(data149 && typeof data149 == "object" && !Array.isArray(data149)){if(data149.label === undefined){const err236 = {instancePath:instancePath+"/config/actions/" + i27,schemaPath:"#/properties/config/properties/actions/items/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err236];}else {vErrors.push(err236);}errors++;}if(data149.label !== undefined){let data150 = data149.label;if(typeof data150 === "string"){if(func6(data150) < 1){const err237 = {instancePath:instancePath+"/config/actions/" + i27+"/label",schemaPath:"#/properties/config/properties/actions/items/properties/label/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err237];}else {vErrors.push(err237);}errors++;}}else {const err238 = {instancePath:instancePath+"/config/actions/" + i27+"/label",schemaPath:"#/properties/config/properties/actions/items/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err238];}else {vErrors.push(err238);}errors++;}}}else {const err239 = {instancePath:instancePath+"/config/actions/" + i27,schemaPath:"#/properties/config/properties/actions/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err239];}else {vErrors.push(err239);}errors++;}}}else {const err240 = {instancePath:instancePath+"/config/actions",schemaPath:"#/properties/config/properties/actions/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err240];}else {vErrors.push(err240);}errors++;}}if(data77.rowIndicators !== undefined){let data151 = data77.rowIndicators;if(Array.isArray(data151)){const len26 = data151.length;for(let i28=0; i28<len26; i28++){let data152 = data151[i28];if(data152 && typeof data152 == "object" && !Array.isArray(data152)){if(data152.field === undefined){const err241 = {instancePath:instancePath+"/config/rowIndicators/" + i28,schemaPath:"#/$defs/rowIndicator/required",keyword:"required",params:{missingProperty: "field"},message:"must have required property '"+"field"+"'"};if(vErrors === null){vErrors = [err241];}else {vErrors.push(err241);}errors++;}if(data152.text === undefined){const err242 = {instancePath:instancePath+"/config/rowIndicators/" + i28,schemaPath:"#/$defs/rowIndicator/required",keyword:"required",params:{missingProperty: "text"},message:"must have required property '"+"text"+"'"};if(vErrors === null){vErrors = [err242];}else {vErrors.push(err242);}errors++;}for(const key17 in data152){if(!(((((((key17 === "id") || (key17 === "field")) || (key17 === "equals")) || (key17 === "in")) || (key17 === "icon")) || (key17 === "text")) || (key17 === "tooltip"))){const err243 = {instancePath:instancePath+"/config/rowIndicators/" + i28,schemaPath:"#/$defs/rowIndicator/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key17},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err243];}else {vErrors.push(err243);}errors++;}}if(data152.id !== undefined){let data153 = data152.id;if(typeof data153 === "string"){if(func6(data153) < 1){const err244 = {instancePath:instancePath+"/config/rowIndicators/" + i28+"/id",schemaPath:"#/$defs/rowIndicator/properties/id/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err244];}else {vErrors.push(err244);}errors++;}}else {const err245 = {instancePath:instancePath+"/config/rowIndicators/" + i28+"/id",schemaPath:"#/$defs/rowIndicator/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err245];}else {vErrors.push(err245);}errors++;}}if(data152.field !== undefined){let data154 = data152.field;if(typeof data154 === "string"){if(func6(data154) < 1){const err246 = {instancePath:instancePath+"/config/rowIndicators/" + i28+"/field",schemaPath:"#/$defs/rowIndicator/properties/field/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err246];}else {vErrors.push(err246);}errors++;}}else {const err247 = {instancePath:instancePath+"/config/rowIndicators/" + i28+"/field",schemaPath:"#/$defs/rowIndicator/properties/field/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err247];}else {vErrors.push(err247);}errors++;}}if(data152.in !== undefined){if(!(Array.isArray(data152.in))){const err248 = {instancePath:instancePath+"/config/rowIndicators/" + i28+"/in",schemaPath:"#/$defs/rowIndicator/properties/in/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err248];}else {vErrors.push(err248);}errors++;}}if(data152.icon !== undefined){if(typeof data152.icon !== "string"){const err249 = {instancePath:instancePath+"/config/rowIndicators/" + i28+"/icon",schemaPath:"#/$defs/rowIndicator/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err249];}else {vErrors.push(err249);}errors++;}}if(data152.text !== undefined){let data157 = data152.text;if(typeof data157 === "string"){if(func6(data157) < 1){const err250 = {instancePath:instancePath+"/config/rowIndicators/" + i28+"/text",schemaPath:"#/$defs/rowIndicator/properties/text/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err250];}else {vErrors.push(err250);}errors++;}}else {const err251 = {instancePath:instancePath+"/config/rowIndicators/" + i28+"/text",schemaPath:"#/$defs/rowIndicator/properties/text/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err251];}else {vErrors.push(err251);}errors++;}}if(data152.tooltip !== undefined){if(typeof data152.tooltip !== "string"){const err252 = {instancePath:instancePath+"/config/rowIndicators/" + i28+"/tooltip",schemaPath:"#/$defs/rowIndicator/properties/tooltip/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err252];}else {vErrors.push(err252);}errors++;}}}else {const err253 = {instancePath:instancePath+"/config/rowIndicators/" + i28,schemaPath:"#/$defs/rowIndicator/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err253];}else {vErrors.push(err253);}errors++;}}}else {const err254 = {instancePath:instancePath+"/config/rowIndicators",schemaPath:"#/properties/config/properties/rowIndicators/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err254];}else {vErrors.push(err254);}errors++;}}let data159 = data77.rowIndicatorCap;if(!((typeof data159 == "number") && (!(data159 % 1) && !isNaN(data159)))){const err255 = {instancePath:instancePath+"/config/rowIndicatorCap",schemaPath:"#/properties/config/properties/rowIndicatorCap/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err255];}else {vErrors.push(err255);}errors++;}if(typeof data159 == "number"){if(data159 < 0 || isNaN(data159)){const err256 = {instancePath:instancePath+"/config/rowIndicatorCap",schemaPath:"#/properties/config/properties/rowIndicatorCap/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err256];}else {vErrors.push(err256);}errors++;}}if(data77.quickEditFields !== undefined){let data160 = data77.quickEditFields;if(Array.isArray(data160)){const len27 = data160.length;for(let i29=0; i29<len27; i29++){let data161 = data160[i29];if(typeof data161 === "string"){if(func6(data161) < 1){const err257 = {instancePath:instancePath+"/config/quickEditFields/" + i29,schemaPath:"#/properties/config/properties/quickEditFields/items/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err257];}else {vErrors.push(err257);}errors++;}}else {const err258 = {instancePath:instancePath+"/config/quickEditFields/" + i29,schemaPath:"#/properties/config/properties/quickEditFields/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err258];}else {vErrors.push(err258);}errors++;}}}else {const err259 = {instancePath:instancePath+"/config/quickEditFields",schemaPath:"#/properties/config/properties/quickEditFields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err259];}else {vErrors.push(err259);}errors++;}}if(typeof data77.writableField !== "string"){const err260 = {instancePath:instancePath+"/config/writableField",schemaPath:"#/properties/config/properties/writableField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err260];}else {vErrors.push(err260);}errors++;}if(data77.viewTabs !== undefined){let data163 = data77.viewTabs;if(Array.isArray(data163)){const len28 = data163.length;for(let i30=0; i30<len28; i30++){let data164 = data163[i30];if(typeof data164 === "string"){if(func6(data164) < 1){const err261 = {instancePath:instancePath+"/config/viewTabs/" + i30,schemaPath:"#/properties/config/properties/viewTabs/items/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err261];}else {vErrors.push(err261);}errors++;}}else {const err262 = {instancePath:instancePath+"/config/viewTabs/" + i30,schemaPath:"#/properties/config/properties/viewTabs/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err262];}else {vErrors.push(err262);}errors++;}}}else {const err263 = {instancePath:instancePath+"/config/viewTabs",schemaPath:"#/properties/config/properties/viewTabs/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err263];}else {vErrors.push(err263);}errors++;}}if(data77.priorityField !== undefined){if(typeof data77.priorityField !== "string"){const err264 = {instancePath:instancePath+"/config/priorityField",schemaPath:"#/properties/config/properties/priorityField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err264];}else {vErrors.push(err264);}errors++;}}if(data77.priorityLevels !== undefined){let data166 = data77.priorityLevels;if(Array.isArray(data166)){const len29 = data166.length;for(let i31=0; i31<len29; i31++){let data167 = data166[i31];if(typeof data167 === "string"){if(func6(data167) < 1){const err265 = {instancePath:instancePath+"/config/priorityLevels/" + i31,schemaPath:"#/properties/config/properties/priorityLevels/items/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err265];}else {vErrors.push(err265);}errors++;}}else {const err266 = {instancePath:instancePath+"/config/priorityLevels/" + i31,schemaPath:"#/properties/config/properties/priorityLevels/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err266];}else {vErrors.push(err266);}errors++;}}}else {const err267 = {instancePath:instancePath+"/config/priorityLevels",schemaPath:"#/properties/config/properties/priorityLevels/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err267];}else {vErrors.push(err267);}errors++;}}if(typeof data77.listShortcuts !== "boolean"){const err268 = {instancePath:instancePath+"/config/listShortcuts",schemaPath:"#/properties/config/properties/listShortcuts/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err268];}else {vErrors.push(err268);}errors++;}if(data77.rowActionField !== undefined){if(typeof data77.rowActionField !== "string"){const err269 = {instancePath:instancePath+"/config/rowActionField",schemaPath:"#/properties/config/properties/rowActionField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err269];}else {vErrors.push(err269);}errors++;}}if(data77.editOpensDetail !== undefined){if(typeof data77.editOpensDetail !== "boolean"){const err270 = {instancePath:instancePath+"/config/editOpensDetail",schemaPath:"#/properties/config/properties/editOpensDetail/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err270];}else {vErrors.push(err270);}errors++;}}if(data77.showEditAction !== undefined){if(typeof data77.showEditAction !== "boolean"){const err271 = {instancePath:instancePath+"/config/showEditAction",schemaPath:"#/properties/config/properties/showEditAction/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err271];}else {vErrors.push(err271);}errors++;}}let data172 = data77.formSize;if(typeof data172 !== "string"){const err272 = {instancePath:instancePath+"/config/formSize",schemaPath:"#/properties/config/properties/formSize/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err272];}else {vErrors.push(err272);}errors++;}if(!(((data172 === "small") || (data172 === "normal")) || (data172 === "large"))){const err273 = {instancePath:instancePath+"/config/formSize",schemaPath:"#/properties/config/properties/formSize/enum",keyword:"enum",params:{allowedValues: schema44.properties.config.properties.formSize.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err273];}else {vErrors.push(err273);}errors++;}let data173 = data77.formColumns;if(!((typeof data173 == "number") && (!(data173 % 1) && !isNaN(data173)))){const err274 = {instancePath:instancePath+"/config/formColumns",schemaPath:"#/properties/config/properties/formColumns/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err274];}else {vErrors.push(err274);}errors++;}if(!((data173 === 1) || (data173 === 2))){const err275 = {instancePath:instancePath+"/config/formColumns",schemaPath:"#/properties/config/properties/formColumns/enum",keyword:"enum",params:{allowedValues: schema44.properties.config.properties.formColumns.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err275];}else {vErrors.push(err275);}errors++;}if(data77.excludeFields !== undefined){let data174 = data77.excludeFields;if(Array.isArray(data174)){const len30 = data174.length;for(let i32=0; i32<len30; i32++){if(typeof data174[i32] !== "string"){const err276 = {instancePath:instancePath+"/config/excludeFields/" + i32,schemaPath:"#/properties/config/properties/excludeFields/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err276];}else {vErrors.push(err276);}errors++;}}}else {const err277 = {instancePath:instancePath+"/config/excludeFields",schemaPath:"#/properties/config/properties/excludeFields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err277];}else {vErrors.push(err277);}errors++;}}if(data77.includeFields !== undefined){let data176 = data77.includeFields;if(Array.isArray(data176)){const len31 = data176.length;for(let i33=0; i33<len31; i33++){if(typeof data176[i33] !== "string"){const err278 = {instancePath:instancePath+"/config/includeFields/" + i33,schemaPath:"#/properties/config/properties/includeFields/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err278];}else {vErrors.push(err278);}errors++;}}}else {const err279 = {instancePath:instancePath+"/config/includeFields",schemaPath:"#/properties/config/properties/includeFields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err279];}else {vErrors.push(err279);}errors++;}}if(data77.fieldOverrides !== undefined){let data178 = data77.fieldOverrides;if(data178 && typeof data178 == "object" && !Array.isArray(data178));else {const err280 = {instancePath:instancePath+"/config/fieldOverrides",schemaPath:"#/properties/config/properties/fieldOverrides/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err280];}else {vErrors.push(err280);}errors++;}}if(data77.createDefaults !== undefined){let data179 = data77.createDefaults;if(data179 && typeof data179 == "object" && !Array.isArray(data179));else {const err281 = {instancePath:instancePath+"/config/createDefaults",schemaPath:"#/properties/config/properties/createDefaults/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err281];}else {vErrors.push(err281);}errors++;}}if(data77.createSuccessRoute !== undefined){let data180 = data77.createSuccessRoute;const _errs442 = errors;let valid120 = false;let passing3 = null;const _errs443 = errors;if(typeof data180 !== "string"){const err282 = {instancePath:instancePath+"/config/createSuccessRoute",schemaPath:"#/properties/config/properties/createSuccessRoute/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err282];}else {vErrors.push(err282);}errors++;}var _valid10 = _errs443 === errors;if(_valid10){valid120 = true;passing3 = 0;}const _errs445 = errors;if(data180 && typeof data180 == "object" && !Array.isArray(data180)){if(data180.name === undefined){const err283 = {instancePath:instancePath+"/config/createSuccessRoute",schemaPath:"#/properties/config/properties/createSuccessRoute/oneOf/1/required",keyword:"required",params:{missingProperty: "name"},message:"must have required property '"+"name"+"'"};if(vErrors === null){vErrors = [err283];}else {vErrors.push(err283);}errors++;}for(const key18 in data180){if(!(((key18 === "name") || (key18 === "paramField")) || (key18 === "objectParam"))){const err284 = {instancePath:instancePath+"/config/createSuccessRoute",schemaPath:"#/properties/config/properties/createSuccessRoute/oneOf/1/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key18},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err284];}else {vErrors.push(err284);}errors++;}}if(data180.name !== undefined){if(typeof data180.name !== "string"){const err285 = {instancePath:instancePath+"/config/createSuccessRoute/name",schemaPath:"#/properties/config/properties/createSuccessRoute/oneOf/1/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err285];}else {vErrors.push(err285);}errors++;}}if(data180.paramField !== undefined){if(typeof data180.paramField !== "string"){const err286 = {instancePath:instancePath+"/config/createSuccessRoute/paramField",schemaPath:"#/properties/config/properties/createSuccessRoute/oneOf/1/properties/paramField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err286];}else {vErrors.push(err286);}errors++;}}if(data180.objectParam !== undefined){if(typeof data180.objectParam !== "string"){const err287 = {instancePath:instancePath+"/config/createSuccessRoute/objectParam",schemaPath:"#/properties/config/properties/createSuccessRoute/oneOf/1/properties/objectParam/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err287];}else {vErrors.push(err287);}errors++;}}}else {const err288 = {instancePath:instancePath+"/config/createSuccessRoute",schemaPath:"#/properties/config/properties/createSuccessRoute/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err288];}else {vErrors.push(err288);}errors++;}var _valid10 = _errs445 === errors;if(_valid10 && valid120){valid120 = false;passing3 = [passing3, 1];}else {if(_valid10){valid120 = true;passing3 = 1;}}if(!valid120){const err289 = {instancePath:instancePath+"/config/createSuccessRoute",schemaPath:"#/properties/config/properties/createSuccessRoute/oneOf",keyword:"oneOf",params:{passingSchemas: passing3},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err289];}else {vErrors.push(err289);}errors++;}else {errors = _errs442;if(vErrors !== null){if(_errs442){vErrors.length = _errs442;}else {vErrors = null;}}}}if(data77.createSuccessMessage !== undefined){if(typeof data77.createSuccessMessage !== "string"){const err290 = {instancePath:instancePath+"/config/createSuccessMessage",schemaPath:"#/properties/config/properties/createSuccessMessage/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err290];}else {vErrors.push(err290);}errors++;}}if(data77.savedViewsScope !== undefined){if(typeof data77.savedViewsScope !== "string"){const err291 = {instancePath:instancePath+"/config/savedViewsScope",schemaPath:"#/properties/config/properties/savedViewsScope/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err291];}else {vErrors.push(err291);}errors++;}}if(typeof data77.splitCloseButton !== "boolean"){const err292 = {instancePath:instancePath+"/config/splitCloseButton",schemaPath:"#/properties/config/properties/splitCloseButton/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err292];}else {vErrors.push(err292);}errors++;}if(data77.splitCloseLabel !== undefined){if(typeof data77.splitCloseLabel !== "string"){const err293 = {instancePath:instancePath+"/config/splitCloseLabel",schemaPath:"#/properties/config/properties/splitCloseLabel/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err293];}else {vErrors.push(err293);}errors++;}}if(data77.mapConfig !== undefined){let data188 = data77.mapConfig;if(data188 && typeof data188 == "object" && !Array.isArray(data188)){if(data188.clustering === undefined){data188.clustering = true;}if(data188.latField !== undefined){if(typeof data188.latField !== "string"){const err294 = {instancePath:instancePath+"/config/mapConfig/latField",schemaPath:"#/properties/config/properties/mapConfig/properties/latField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err294];}else {vErrors.push(err294);}errors++;}}if(data188.lngField !== undefined){if(typeof data188.lngField !== "string"){const err295 = {instancePath:instancePath+"/config/mapConfig/lngField",schemaPath:"#/properties/config/properties/mapConfig/properties/lngField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err295];}else {vErrors.push(err295);}errors++;}}if(data188.geoField !== undefined){if(typeof data188.geoField !== "string"){const err296 = {instancePath:instancePath+"/config/mapConfig/geoField",schemaPath:"#/properties/config/properties/mapConfig/properties/geoField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err296];}else {vErrors.push(err296);}errors++;}}if(data188.popupField !== undefined){if(typeof data188.popupField !== "string"){const err297 = {instancePath:instancePath+"/config/mapConfig/popupField",schemaPath:"#/properties/config/properties/mapConfig/properties/popupField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err297];}else {vErrors.push(err297);}errors++;}}if(data188.center !== undefined){let data193 = data188.center;if(Array.isArray(data193)){if(data193.length > 2){const err298 = {instancePath:instancePath+"/config/mapConfig/center",schemaPath:"#/properties/config/properties/mapConfig/properties/center/maxItems",keyword:"maxItems",params:{limit: 2},message:"must NOT have more than 2 items"};if(vErrors === null){vErrors = [err298];}else {vErrors.push(err298);}errors++;}if(data193.length < 2){const err299 = {instancePath:instancePath+"/config/mapConfig/center",schemaPath:"#/properties/config/properties/mapConfig/properties/center/minItems",keyword:"minItems",params:{limit: 2},message:"must NOT have fewer than 2 items"};if(vErrors === null){vErrors = [err299];}else {vErrors.push(err299);}errors++;}const len32 = data193.length;for(let i34=0; i34<len32; i34++){if(!(typeof data193[i34] == "number")){const err300 = {instancePath:instancePath+"/config/mapConfig/center/" + i34,schemaPath:"#/properties/config/properties/mapConfig/properties/center/items/type",keyword:"type",params:{type: "number"},message:"must be number"};if(vErrors === null){vErrors = [err300];}else {vErrors.push(err300);}errors++;}}}else {const err301 = {instancePath:instancePath+"/config/mapConfig/center",schemaPath:"#/properties/config/properties/mapConfig/properties/center/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err301];}else {vErrors.push(err301);}errors++;}}if(typeof data188.clustering !== "boolean"){const err302 = {instancePath:instancePath+"/config/mapConfig/clustering",schemaPath:"#/properties/config/properties/mapConfig/properties/clustering/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err302];}else {vErrors.push(err302);}errors++;}}else {const err303 = {instancePath:instancePath+"/config/mapConfig",schemaPath:"#/properties/config/properties/mapConfig/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err303];}else {vErrors.push(err303);}errors++;}}let data196 = data77.quickFilterMaxVisible;if(!((typeof data196 == "number") && (!(data196 % 1) && !isNaN(data196)))){const err304 = {instancePath:instancePath+"/config/quickFilterMaxVisible",schemaPath:"#/properties/config/properties/quickFilterMaxVisible/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err304];}else {vErrors.push(err304);}errors++;}if(typeof data196 == "number"){if(data196 < 0 || isNaN(data196)){const err305 = {instancePath:instancePath+"/config/quickFilterMaxVisible",schemaPath:"#/properties/config/properties/quickFilterMaxVisible/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err305];}else {vErrors.push(err305);}errors++;}}if(data77.actionToggles !== undefined){let data197 = data77.actionToggles;if(data197 && typeof data197 == "object" && !Array.isArray(data197)){if(data197.showAdd !== undefined){if(typeof data197.showAdd !== "boolean"){const err306 = {instancePath:instancePath+"/config/actionToggles/showAdd",schemaPath:"#/properties/config/properties/actionToggles/properties/showAdd/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err306];}else {vErrors.push(err306);}errors++;}}if(data197.showFormDialog !== undefined){if(typeof data197.showFormDialog !== "boolean"){const err307 = {instancePath:instancePath+"/config/actionToggles/showFormDialog",schemaPath:"#/properties/config/properties/actionToggles/properties/showFormDialog/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err307];}else {vErrors.push(err307);}errors++;}}if(data197.showEditAction !== undefined){if(typeof data197.showEditAction !== "boolean"){const err308 = {instancePath:instancePath+"/config/actionToggles/showEditAction",schemaPath:"#/properties/config/properties/actionToggles/properties/showEditAction/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err308];}else {vErrors.push(err308);}errors++;}}if(data197.showCopyAction !== undefined){if(typeof data197.showCopyAction !== "boolean"){const err309 = {instancePath:instancePath+"/config/actionToggles/showCopyAction",schemaPath:"#/properties/config/properties/actionToggles/properties/showCopyAction/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err309];}else {vErrors.push(err309);}errors++;}}if(data197.showDeleteAction !== undefined){if(typeof data197.showDeleteAction !== "boolean"){const err310 = {instancePath:instancePath+"/config/actionToggles/showDeleteAction",schemaPath:"#/properties/config/properties/actionToggles/properties/showDeleteAction/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err310];}else {vErrors.push(err310);}errors++;}}if(data197.showMassImport !== undefined){if(typeof data197.showMassImport !== "boolean"){const err311 = {instancePath:instancePath+"/config/actionToggles/showMassImport",schemaPath:"#/properties/config/properties/actionToggles/properties/showMassImport/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err311];}else {vErrors.push(err311);}errors++;}}if(data197.showMassExport !== undefined){if(typeof data197.showMassExport !== "boolean"){const err312 = {instancePath:instancePath+"/config/actionToggles/showMassExport",schemaPath:"#/properties/config/properties/actionToggles/properties/showMassExport/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err312];}else {vErrors.push(err312);}errors++;}}if(data197.showMassCopy !== undefined){if(typeof data197.showMassCopy !== "boolean"){const err313 = {instancePath:instancePath+"/config/actionToggles/showMassCopy",schemaPath:"#/properties/config/properties/actionToggles/properties/showMassCopy/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err313];}else {vErrors.push(err313);}errors++;}}if(data197.showMassDelete !== undefined){if(typeof data197.showMassDelete !== "boolean"){const err314 = {instancePath:instancePath+"/config/actionToggles/showMassDelete",schemaPath:"#/properties/config/properties/actionToggles/properties/showMassDelete/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err314];}else {vErrors.push(err314);}errors++;}}if(data197.showViewToggle !== undefined){if(typeof data197.showViewToggle !== "boolean"){const err315 = {instancePath:instancePath+"/config/actionToggles/showViewToggle",schemaPath:"#/properties/config/properties/actionToggles/properties/showViewToggle/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err315];}else {vErrors.push(err315);}errors++;}}if(data197.selectable !== undefined){if(typeof data197.selectable !== "boolean"){const err316 = {instancePath:instancePath+"/config/actionToggles/selectable",schemaPath:"#/properties/config/properties/actionToggles/properties/selectable/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err316];}else {vErrors.push(err316);}errors++;}}}else {const err317 = {instancePath:instancePath+"/config/actionToggles",schemaPath:"#/properties/config/properties/actionToggles/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err317];}else {vErrors.push(err317);}errors++;}}if(data77.mode !== undefined){let data209 = data77.mode;if(typeof data209 !== "string"){const err318 = {instancePath:instancePath+"/config/mode",schemaPath:"#/properties/config/properties/mode/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err318];}else {vErrors.push(err318);}errors++;}if(!(((data209 === "edit") || (data209 === "create")) || (data209 === "public"))){const err319 = {instancePath:instancePath+"/config/mode",schemaPath:"#/properties/config/properties/mode/enum",keyword:"enum",params:{allowedValues: schema44.properties.config.properties.mode.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err319];}else {vErrors.push(err319);}errors++;}}if(typeof data77.subscribe !== "boolean"){const err320 = {instancePath:instancePath+"/config/subscribe",schemaPath:"#/properties/config/properties/subscribe/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err320];}else {vErrors.push(err320);}errors++;}if(typeof data77.lock !== "boolean"){const err321 = {instancePath:instancePath+"/config/lock",schemaPath:"#/properties/config/properties/lock/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err321];}else {vErrors.push(err321);}errors++;}}else {const err322 = {instancePath:instancePath+"/config",schemaPath:"#/properties/config/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err322];}else {vErrors.push(err322);}errors++;}}if(data.sidebar !== undefined){let data212 = data.sidebar;if(data212 && typeof data212 == "object" && !Array.isArray(data212)){if(data212.show !== undefined){if(typeof data212.show !== "boolean"){const err323 = {instancePath:instancePath+"/sidebar/show",schemaPath:"#/properties/sidebar/properties/show/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err323];}else {vErrors.push(err323);}errors++;}}}else {const err324 = {instancePath:instancePath+"/sidebar",schemaPath:"#/properties/sidebar/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err324];}else {vErrors.push(err324);}errors++;}}if(data._note !== undefined){if(typeof data._note !== "string"){const err325 = {instancePath:instancePath+"/_note",schemaPath:"#/properties/_note/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err325];}else {vErrors.push(err325);}errors++;}}}else {const err326 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err326];}else {vErrors.push(err326);}errors++;}validate25.errors = vErrors;return errors === 0;}validate25.evaluated = {"props":true,"dynamicProps":false,"dynamicItems":false};function validate20(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate20.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}const _errs3 = errors;let valid1 = true;const _errs4 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.pages === undefined) && ("pages")){const err0 = {};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}}var _valid0 = _errs4 === errors;errors = _errs3;if(vErrors !== null){if(_errs3){vErrors.length = _errs3;}else {vErrors = null;}}if(_valid0){const _errs5 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.menu === undefined){const err1 = {instancePath,schemaPath:"#/allOf/0/then/required",keyword:"required",params:{missingProperty: "menu"},message:"must have required property '"+"menu"+"'"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}}var _valid0 = _errs5 === errors;valid1 = _valid0;}if(!valid1){const err2 = {instancePath,schemaPath:"#/allOf/0/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}const _errs8 = errors;let valid2 = true;const _errs9 = errors;const _errs10 = errors;const _errs11 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.pages === undefined) && ("pages")){const err3 = {};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}}var valid3 = _errs11 === errors;if(valid3){const err4 = {};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}else {errors = _errs10;if(vErrors !== null){if(_errs10){vErrors.length = _errs10;}else {vErrors = null;}}}var _valid1 = _errs9 === errors;errors = _errs8;if(vErrors !== null){if(_errs8){vErrors.length = _errs8;}else {vErrors = null;}}if(_valid1){const _errs12 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.observability === undefined){const err5 = {instancePath,schemaPath:"#/allOf/1/then/required",keyword:"required",params:{missingProperty: "observability"},message:"must have required property '"+"observability"+"'"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}var _valid1 = _errs12 === errors;valid2 = _valid1;}if(!valid2){const err6 = {instancePath,schemaPath:"#/allOf/1/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}if(data && typeof data == "object" && !Array.isArray(data)){if(data.openbuildEditable === undefined){data.openbuildEditable = true;}if(data.dependencies === undefined){data.dependencies = [];}if(data.$schema === undefined){const err7 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "$schema"},message:"must have required property '"+"$schema"+"'"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}if(data.version === undefined){const err8 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "version"},message:"must have required property '"+"version"+"'"};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}for(const key0 in data){if(!(func1.call(schema31.properties, key0))){const err9 = {instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}}if(data.$schema !== undefined){let data0 = data.$schema;if(typeof data0 === "string"){if(!(formats0(data0))){const err10 = {instancePath:instancePath+"/$schema",schemaPath:"#/properties/%24schema/format",keyword:"format",params:{format: "uri"},message:"must match format \""+"uri"+"\""};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}}else {const err11 = {instancePath:instancePath+"/$schema",schemaPath:"#/properties/%24schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}}if(data.version !== undefined){let data1 = data.version;if(typeof data1 === "string"){if(!pattern4.test(data1)){const err12 = {instancePath:instancePath+"/version",schemaPath:"#/properties/version/pattern",keyword:"pattern",params:{pattern: "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$"},message:"must match pattern \""+"^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$"+"\""};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}}else {const err13 = {instancePath:instancePath+"/version",schemaPath:"#/properties/version/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}}if(typeof data.openbuildEditable !== "boolean"){const err14 = {instancePath:instancePath+"/openbuildEditable",schemaPath:"#/properties/openbuildEditable/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}let data3 = data.dependencies;if(Array.isArray(data3)){const len0 = data3.length;for(let i0=0; i0<len0; i0++){let data4 = data3[i0];const _errs23 = errors;let valid7 = false;let passing0 = null;const _errs24 = errors;if(typeof data4 !== "string"){const err15 = {instancePath:instancePath+"/dependencies/" + i0,schemaPath:"#/properties/dependencies/items/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}var _valid2 = _errs24 === errors;if(_valid2){valid7 = true;passing0 = 0;}const _errs26 = errors;if(data4 && typeof data4 == "object" && !Array.isArray(data4)){if(data4.id === undefined){const err16 = {instancePath:instancePath+"/dependencies/" + i0,schemaPath:"#/properties/dependencies/items/oneOf/1/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err16];}else {vErrors.push(err16);}errors++;}for(const key1 in data4){if(!(((key1 === "id") || (key1 === "required")) || (key1 === "name"))){const err17 = {instancePath:instancePath+"/dependencies/" + i0,schemaPath:"#/properties/dependencies/items/oneOf/1/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key1},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err17];}else {vErrors.push(err17);}errors++;}}if(data4.id !== undefined){if(typeof data4.id !== "string"){const err18 = {instancePath:instancePath+"/dependencies/" + i0+"/id",schemaPath:"#/properties/dependencies/items/oneOf/1/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err18];}else {vErrors.push(err18);}errors++;}}if(data4.required !== undefined){if(typeof data4.required !== "boolean"){const err19 = {instancePath:instancePath+"/dependencies/" + i0+"/required",schemaPath:"#/properties/dependencies/items/oneOf/1/properties/required/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err19];}else {vErrors.push(err19);}errors++;}}if(data4.name !== undefined){if(typeof data4.name !== "string"){const err20 = {instancePath:instancePath+"/dependencies/" + i0+"/name",schemaPath:"#/properties/dependencies/items/oneOf/1/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err20];}else {vErrors.push(err20);}errors++;}}}else {const err21 = {instancePath:instancePath+"/dependencies/" + i0,schemaPath:"#/properties/dependencies/items/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err21];}else {vErrors.push(err21);}errors++;}var _valid2 = _errs26 === errors;if(_valid2 && valid7){valid7 = false;passing0 = [passing0, 1];}else {if(_valid2){valid7 = true;passing0 = 1;}}if(!valid7){const err22 = {instancePath:instancePath+"/dependencies/" + i0,schemaPath:"#/properties/dependencies/items/oneOf",keyword:"oneOf",params:{passingSchemas: passing0},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err22];}else {vErrors.push(err22);}errors++;}else {errors = _errs23;if(vErrors !== null){if(_errs23){vErrors.length = _errs23;}else {vErrors = null;}}}}}else {const err23 = {instancePath:instancePath+"/dependencies",schemaPath:"#/properties/dependencies/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err23];}else {vErrors.push(err23);}errors++;}if(data.setup !== undefined){let data8 = data.setup;if(data8 && typeof data8 == "object" && !Array.isArray(data8)){if(data8.enabled === undefined){data8.enabled = true;}if(data8.version === undefined){data8.version = 1;}if(data8.steps === undefined){const err24 = {instancePath:instancePath+"/setup",schemaPath:"#/properties/setup/required",keyword:"required",params:{missingProperty: "steps"},message:"must have required property '"+"steps"+"'"};if(vErrors === null){vErrors = [err24];}else {vErrors.push(err24);}errors++;}for(const key2 in data8){if(!((((key2 === "enabled") || (key2 === "version")) || (key2 === "completionConfigKey")) || (key2 === "steps"))){const err25 = {instancePath:instancePath+"/setup",schemaPath:"#/properties/setup/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key2},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err25];}else {vErrors.push(err25);}errors++;}}if(typeof data8.enabled !== "boolean"){const err26 = {instancePath:instancePath+"/setup/enabled",schemaPath:"#/properties/setup/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err26];}else {vErrors.push(err26);}errors++;}let data10 = data8.version;if(!((typeof data10 == "number") && (!(data10 % 1) && !isNaN(data10)))){const err27 = {instancePath:instancePath+"/setup/version",schemaPath:"#/properties/setup/properties/version/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err27];}else {vErrors.push(err27);}errors++;}if(data8.completionConfigKey !== undefined){if(typeof data8.completionConfigKey !== "string"){const err28 = {instancePath:instancePath+"/setup/completionConfigKey",schemaPath:"#/properties/setup/properties/completionConfigKey/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err28];}else {vErrors.push(err28);}errors++;}}if(data8.steps !== undefined){let data12 = data8.steps;if(Array.isArray(data12)){const len1 = data12.length;for(let i1=0; i1<len1; i1++){let data13 = data12[i1];if(data13 && typeof data13 == "object" && !Array.isArray(data13)){if(data13.required === undefined){data13.required = false;}if(data13.display === undefined){data13.display = "select";}if(data13.multiple === undefined){data13.multiple = false;}if(data13.healthCheck === undefined){data13.healthCheck = false;}if(data13.id === undefined){const err29 = {instancePath:instancePath+"/setup/steps/" + i1,schemaPath:"#/properties/setup/properties/steps/items/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err29];}else {vErrors.push(err29);}errors++;}if(data13.type === undefined){const err30 = {instancePath:instancePath+"/setup/steps/" + i1,schemaPath:"#/properties/setup/properties/steps/items/required",keyword:"required",params:{missingProperty: "type"},message:"must have required property '"+"type"+"'"};if(vErrors === null){vErrors = [err30];}else {vErrors.push(err30);}errors++;}for(const key3 in data13){if(!(func1.call(schema31.properties.setup.properties.steps.items.properties, key3))){const err31 = {instancePath:instancePath+"/setup/steps/" + i1,schemaPath:"#/properties/setup/properties/steps/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key3},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err31];}else {vErrors.push(err31);}errors++;}}if(data13.id !== undefined){if(typeof data13.id !== "string"){const err32 = {instancePath:instancePath+"/setup/steps/" + i1+"/id",schemaPath:"#/properties/setup/properties/steps/items/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err32];}else {vErrors.push(err32);}errors++;}}if(data13.type !== undefined){let data15 = data13.type;if(typeof data15 !== "string"){const err33 = {instancePath:instancePath+"/setup/steps/" + i1+"/type",schemaPath:"#/properties/setup/properties/steps/items/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err33];}else {vErrors.push(err33);}errors++;}if(!((((((data15 === "info") || (data15 === "config-fields")) || (data15 === "choice")) || (data15 === "run-action")) || (data15 === "summary")) || (data15 === "component"))){const err34 = {instancePath:instancePath+"/setup/steps/" + i1+"/type",schemaPath:"#/properties/setup/properties/steps/items/properties/type/enum",keyword:"enum",params:{allowedValues: schema31.properties.setup.properties.steps.items.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err34];}else {vErrors.push(err34);}errors++;}}if(data13.title !== undefined){if(typeof data13.title !== "string"){const err35 = {instancePath:instancePath+"/setup/steps/" + i1+"/title",schemaPath:"#/properties/setup/properties/steps/items/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err35];}else {vErrors.push(err35);}errors++;}}if(data13.body !== undefined){if(typeof data13.body !== "string"){const err36 = {instancePath:instancePath+"/setup/steps/" + i1+"/body",schemaPath:"#/properties/setup/properties/steps/items/properties/body/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err36];}else {vErrors.push(err36);}errors++;}}if(typeof data13.required !== "boolean"){const err37 = {instancePath:instancePath+"/setup/steps/" + i1+"/required",schemaPath:"#/properties/setup/properties/steps/items/properties/required/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err37];}else {vErrors.push(err37);}errors++;}if(data13.configKey !== undefined){if(typeof data13.configKey !== "string"){const err38 = {instancePath:instancePath+"/setup/steps/" + i1+"/configKey",schemaPath:"#/properties/setup/properties/steps/items/properties/configKey/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err38];}else {vErrors.push(err38);}errors++;}}if(data13.configKeys !== undefined){let data20 = data13.configKeys;if(Array.isArray(data20)){const len2 = data20.length;for(let i2=0; i2<len2; i2++){if(typeof data20[i2] !== "string"){const err39 = {instancePath:instancePath+"/setup/steps/" + i1+"/configKeys/" + i2,schemaPath:"#/properties/setup/properties/steps/items/properties/configKeys/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err39];}else {vErrors.push(err39);}errors++;}}}else {const err40 = {instancePath:instancePath+"/setup/steps/" + i1+"/configKeys",schemaPath:"#/properties/setup/properties/steps/items/properties/configKeys/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err40];}else {vErrors.push(err40);}errors++;}}if(data13.options !== undefined){let data22 = data13.options;if(Array.isArray(data22)){const len3 = data22.length;for(let i3=0; i3<len3; i3++){let data23 = data22[i3];if(data23 && typeof data23 == "object" && !Array.isArray(data23)){if(data23.value === undefined){const err41 = {instancePath:instancePath+"/setup/steps/" + i1+"/options/" + i3,schemaPath:"#/properties/setup/properties/steps/items/properties/options/items/required",keyword:"required",params:{missingProperty: "value"},message:"must have required property '"+"value"+"'"};if(vErrors === null){vErrors = [err41];}else {vErrors.push(err41);}errors++;}if(data23.label === undefined){const err42 = {instancePath:instancePath+"/setup/steps/" + i1+"/options/" + i3,schemaPath:"#/properties/setup/properties/steps/items/properties/options/items/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err42];}else {vErrors.push(err42);}errors++;}for(const key4 in data23){if(!((key4 === "value") || (key4 === "label"))){const err43 = {instancePath:instancePath+"/setup/steps/" + i1+"/options/" + i3,schemaPath:"#/properties/setup/properties/steps/items/properties/options/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key4},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err43];}else {vErrors.push(err43);}errors++;}}if(data23.label !== undefined){if(typeof data23.label !== "string"){const err44 = {instancePath:instancePath+"/setup/steps/" + i1+"/options/" + i3+"/label",schemaPath:"#/properties/setup/properties/steps/items/properties/options/items/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err44];}else {vErrors.push(err44);}errors++;}}}else {const err45 = {instancePath:instancePath+"/setup/steps/" + i1+"/options/" + i3,schemaPath:"#/properties/setup/properties/steps/items/properties/options/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err45];}else {vErrors.push(err45);}errors++;}}}else {const err46 = {instancePath:instancePath+"/setup/steps/" + i1+"/options",schemaPath:"#/properties/setup/properties/steps/items/properties/options/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err46];}else {vErrors.push(err46);}errors++;}}if(data13.optionsSource !== undefined){if(typeof data13.optionsSource !== "string"){const err47 = {instancePath:instancePath+"/setup/steps/" + i1+"/optionsSource",schemaPath:"#/properties/setup/properties/steps/items/properties/optionsSource/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err47];}else {vErrors.push(err47);}errors++;}}let data26 = data13.display;if(typeof data26 !== "string"){const err48 = {instancePath:instancePath+"/setup/steps/" + i1+"/display",schemaPath:"#/properties/setup/properties/steps/items/properties/display/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err48];}else {vErrors.push(err48);}errors++;}if(!((data26 === "select") || (data26 === "cards"))){const err49 = {instancePath:instancePath+"/setup/steps/" + i1+"/display",schemaPath:"#/properties/setup/properties/steps/items/properties/display/enum",keyword:"enum",params:{allowedValues: schema31.properties.setup.properties.steps.items.properties.display.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err49];}else {vErrors.push(err49);}errors++;}if(data13.dependsOn !== undefined){if(typeof data13.dependsOn !== "string"){const err50 = {instancePath:instancePath+"/setup/steps/" + i1+"/dependsOn",schemaPath:"#/properties/setup/properties/steps/items/properties/dependsOn/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err50];}else {vErrors.push(err50);}errors++;}}if(data13.optionsByParent !== undefined){let data28 = data13.optionsByParent;if(data28 && typeof data28 == "object" && !Array.isArray(data28)){for(const key5 in data28){let data29 = data28[key5];if(Array.isArray(data29)){const len4 = data29.length;for(let i4=0; i4<len4; i4++){let data30 = data29[i4];if(data30 && typeof data30 == "object" && !Array.isArray(data30)){if(data30.value === undefined){const err51 = {instancePath:instancePath+"/setup/steps/" + i1+"/optionsByParent/" + key5.replace(/~/g, "~0").replace(/\//g, "~1")+"/" + i4,schemaPath:"#/properties/setup/properties/steps/items/properties/optionsByParent/additionalProperties/items/required",keyword:"required",params:{missingProperty: "value"},message:"must have required property '"+"value"+"'"};if(vErrors === null){vErrors = [err51];}else {vErrors.push(err51);}errors++;}if(data30.label === undefined){const err52 = {instancePath:instancePath+"/setup/steps/" + i1+"/optionsByParent/" + key5.replace(/~/g, "~0").replace(/\//g, "~1")+"/" + i4,schemaPath:"#/properties/setup/properties/steps/items/properties/optionsByParent/additionalProperties/items/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err52];}else {vErrors.push(err52);}errors++;}for(const key6 in data30){if(!((key6 === "value") || (key6 === "label"))){const err53 = {instancePath:instancePath+"/setup/steps/" + i1+"/optionsByParent/" + key5.replace(/~/g, "~0").replace(/\//g, "~1")+"/" + i4,schemaPath:"#/properties/setup/properties/steps/items/properties/optionsByParent/additionalProperties/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key6},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err53];}else {vErrors.push(err53);}errors++;}}if(data30.label !== undefined){if(typeof data30.label !== "string"){const err54 = {instancePath:instancePath+"/setup/steps/" + i1+"/optionsByParent/" + key5.replace(/~/g, "~0").replace(/\//g, "~1")+"/" + i4+"/label",schemaPath:"#/properties/setup/properties/steps/items/properties/optionsByParent/additionalProperties/items/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err54];}else {vErrors.push(err54);}errors++;}}}else {const err55 = {instancePath:instancePath+"/setup/steps/" + i1+"/optionsByParent/" + key5.replace(/~/g, "~0").replace(/\//g, "~1")+"/" + i4,schemaPath:"#/properties/setup/properties/steps/items/properties/optionsByParent/additionalProperties/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err55];}else {vErrors.push(err55);}errors++;}}}else {const err56 = {instancePath:instancePath+"/setup/steps/" + i1+"/optionsByParent/" + key5.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/properties/setup/properties/steps/items/properties/optionsByParent/additionalProperties/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err56];}else {vErrors.push(err56);}errors++;}}}else {const err57 = {instancePath:instancePath+"/setup/steps/" + i1+"/optionsByParent",schemaPath:"#/properties/setup/properties/steps/items/properties/optionsByParent/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err57];}else {vErrors.push(err57);}errors++;}}if(data13.suggestFrom !== undefined){if(typeof data13.suggestFrom !== "string"){const err58 = {instancePath:instancePath+"/setup/steps/" + i1+"/suggestFrom",schemaPath:"#/properties/setup/properties/steps/items/properties/suggestFrom/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err58];}else {vErrors.push(err58);}errors++;}}if(data13.suggestMap !== undefined){let data33 = data13.suggestMap;if(data33 && typeof data33 == "object" && !Array.isArray(data33)){for(const key7 in data33){if(typeof data33[key7] !== "string"){const err59 = {instancePath:instancePath+"/setup/steps/" + i1+"/suggestMap/" + key7.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/properties/setup/properties/steps/items/properties/suggestMap/additionalProperties/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err59];}else {vErrors.push(err59);}errors++;}}}else {const err60 = {instancePath:instancePath+"/setup/steps/" + i1+"/suggestMap",schemaPath:"#/properties/setup/properties/steps/items/properties/suggestMap/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err60];}else {vErrors.push(err60);}errors++;}}if(typeof data13.multiple !== "boolean"){const err61 = {instancePath:instancePath+"/setup/steps/" + i1+"/multiple",schemaPath:"#/properties/setup/properties/steps/items/properties/multiple/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err61];}else {vErrors.push(err61);}errors++;}if(data13.action !== undefined){if(typeof data13.action !== "string"){const err62 = {instancePath:instancePath+"/setup/steps/" + i1+"/action",schemaPath:"#/properties/setup/properties/steps/items/properties/action/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err62];}else {vErrors.push(err62);}errors++;}}if(typeof data13.healthCheck !== "boolean"){const err63 = {instancePath:instancePath+"/setup/steps/" + i1+"/healthCheck",schemaPath:"#/properties/setup/properties/steps/items/properties/healthCheck/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err63];}else {vErrors.push(err63);}errors++;}if(data13.component !== undefined){if(typeof data13.component !== "string"){const err64 = {instancePath:instancePath+"/setup/steps/" + i1+"/component",schemaPath:"#/properties/setup/properties/steps/items/properties/component/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err64];}else {vErrors.push(err64);}errors++;}}}else {const err65 = {instancePath:instancePath+"/setup/steps/" + i1,schemaPath:"#/properties/setup/properties/steps/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err65];}else {vErrors.push(err65);}errors++;}}}else {const err66 = {instancePath:instancePath+"/setup/steps",schemaPath:"#/properties/setup/properties/steps/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err66];}else {vErrors.push(err66);}errors++;}}}else {const err67 = {instancePath:instancePath+"/setup",schemaPath:"#/properties/setup/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err67];}else {vErrors.push(err67);}errors++;}}if(data.walkthrough !== undefined){let data39 = data.walkthrough;if(data39 && typeof data39 == "object" && !Array.isArray(data39)){if(data39.enabled === undefined){data39.enabled = true;}if(data39.tours === undefined){const err68 = {instancePath:instancePath+"/walkthrough",schemaPath:"#/properties/walkthrough/required",keyword:"required",params:{missingProperty: "tours"},message:"must have required property '"+"tours"+"'"};if(vErrors === null){vErrors = [err68];}else {vErrors.push(err68);}errors++;}for(const key8 in data39){if(!((((key8 === "enabled") || (key8 === "version")) || (key8 === "completionConfigKey")) || (key8 === "tours"))){const err69 = {instancePath:instancePath+"/walkthrough",schemaPath:"#/properties/walkthrough/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key8},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err69];}else {vErrors.push(err69);}errors++;}}if(typeof data39.enabled !== "boolean"){const err70 = {instancePath:instancePath+"/walkthrough/enabled",schemaPath:"#/properties/walkthrough/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err70];}else {vErrors.push(err70);}errors++;}if(data39.version !== undefined){let data41 = data39.version;if(!((typeof data41 == "number") && (!(data41 % 1) && !isNaN(data41)))){const err71 = {instancePath:instancePath+"/walkthrough/version",schemaPath:"#/properties/walkthrough/properties/version/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err71];}else {vErrors.push(err71);}errors++;}}if(data39.completionConfigKey !== undefined){if(typeof data39.completionConfigKey !== "string"){const err72 = {instancePath:instancePath+"/walkthrough/completionConfigKey",schemaPath:"#/properties/walkthrough/properties/completionConfigKey/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err72];}else {vErrors.push(err72);}errors++;}}if(data39.tours !== undefined){let data43 = data39.tours;if(Array.isArray(data43)){const len5 = data43.length;for(let i5=0; i5<len5; i5++){let data44 = data43[i5];if(data44 && typeof data44 == "object" && !Array.isArray(data44)){if(data44.trigger === undefined){data44.trigger = "manual";}if(data44.id === undefined){const err73 = {instancePath:instancePath+"/walkthrough/tours/" + i5,schemaPath:"#/properties/walkthrough/properties/tours/items/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err73];}else {vErrors.push(err73);}errors++;}if(data44.steps === undefined){const err74 = {instancePath:instancePath+"/walkthrough/tours/" + i5,schemaPath:"#/properties/walkthrough/properties/tours/items/required",keyword:"required",params:{missingProperty: "steps"},message:"must have required property '"+"steps"+"'"};if(vErrors === null){vErrors = [err74];}else {vErrors.push(err74);}errors++;}for(const key9 in data44){if(!(((((key9 === "id") || (key9 === "title")) || (key9 === "trigger")) || (key9 === "minAppVersion")) || (key9 === "steps"))){const err75 = {instancePath:instancePath+"/walkthrough/tours/" + i5,schemaPath:"#/properties/walkthrough/properties/tours/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key9},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err75];}else {vErrors.push(err75);}errors++;}}if(data44.id !== undefined){if(typeof data44.id !== "string"){const err76 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/id",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err76];}else {vErrors.push(err76);}errors++;}}if(data44.title !== undefined){if(typeof data44.title !== "string"){const err77 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/title",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err77];}else {vErrors.push(err77);}errors++;}}let data47 = data44.trigger;if(typeof data47 !== "string"){const err78 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/trigger",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/trigger/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err78];}else {vErrors.push(err78);}errors++;}if(!((((data47 === "first-visit") || (data47 === "version-bump")) || (data47 === "empty-index")) || (data47 === "manual"))){const err79 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/trigger",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/trigger/enum",keyword:"enum",params:{allowedValues: schema31.properties.walkthrough.properties.tours.items.properties.trigger.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err79];}else {vErrors.push(err79);}errors++;}if(data44.minAppVersion !== undefined){if(typeof data44.minAppVersion !== "string"){const err80 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/minAppVersion",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/minAppVersion/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err80];}else {vErrors.push(err80);}errors++;}}if(data44.steps !== undefined){let data49 = data44.steps;if(Array.isArray(data49)){const len6 = data49.length;for(let i6=0; i6<len6; i6++){let data50 = data49[i6];if(data50 && typeof data50 == "object" && !Array.isArray(data50)){if(data50.placement === undefined){data50.placement = "auto";}if(data50.optional === undefined){data50.optional = false;}if(data50.allowManualNext === undefined){data50.allowManualNext = false;}if(data50.id === undefined){const err81 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6,schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err81];}else {vErrors.push(err81);}errors++;}if(data50.target === undefined){const err82 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6,schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/required",keyword:"required",params:{missingProperty: "target"},message:"must have required property '"+"target"+"'"};if(vErrors === null){vErrors = [err82];}else {vErrors.push(err82);}errors++;}if(data50.advanceOn === undefined){const err83 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6,schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/required",keyword:"required",params:{missingProperty: "advanceOn"},message:"must have required property '"+"advanceOn"+"'"};if(vErrors === null){vErrors = [err83];}else {vErrors.push(err83);}errors++;}for(const key10 in data50){if(!(func1.call(schema31.properties.walkthrough.properties.tours.items.properties.steps.items.properties, key10))){const err84 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6,schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key10},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err84];}else {vErrors.push(err84);}errors++;}}if(data50.id !== undefined){if(typeof data50.id !== "string"){const err85 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/id",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err85];}else {vErrors.push(err85);}errors++;}}if(data50.title !== undefined){if(typeof data50.title !== "string"){const err86 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/title",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err86];}else {vErrors.push(err86);}errors++;}}if(data50.body !== undefined){if(typeof data50.body !== "string"){const err87 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/body",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/body/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err87];}else {vErrors.push(err87);}errors++;}}if(data50.task !== undefined){if(typeof data50.task !== "string"){const err88 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/task",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/task/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err88];}else {vErrors.push(err88);}errors++;}}if(data50.sinceVersion !== undefined){if(typeof data50.sinceVersion !== "string"){const err89 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/sinceVersion",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/sinceVersion/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err89];}else {vErrors.push(err89);}errors++;}}let data56 = data50.placement;if(typeof data56 !== "string"){const err90 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/placement",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/placement/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err90];}else {vErrors.push(err90);}errors++;}if(!((((((data56 === "auto") || (data56 === "top")) || (data56 === "bottom")) || (data56 === "left")) || (data56 === "right")) || (data56 === "center"))){const err91 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/placement",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/placement/enum",keyword:"enum",params:{allowedValues: schema31.properties.walkthrough.properties.tours.items.properties.steps.items.properties.placement.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err91];}else {vErrors.push(err91);}errors++;}if(typeof data50.optional !== "boolean"){const err92 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/optional",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/optional/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err92];}else {vErrors.push(err92);}errors++;}if(typeof data50.allowManualNext !== "boolean"){const err93 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/allowManualNext",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/allowManualNext/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err93];}else {vErrors.push(err93);}errors++;}if(data50.handoff !== undefined){let data59 = data50.handoff;if(data59 && typeof data59 == "object" && !Array.isArray(data59)){if(data59.url === undefined){const err94 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/handoff",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/handoff/required",keyword:"required",params:{missingProperty: "url"},message:"must have required property '"+"url"+"'"};if(vErrors === null){vErrors = [err94];}else {vErrors.push(err94);}errors++;}for(const key11 in data59){if(!((((key11 === "app") || (key11 === "url")) || (key11 === "tour")) || (key11 === "step"))){const err95 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/handoff",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/handoff/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key11},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err95];}else {vErrors.push(err95);}errors++;}}if(data59.app !== undefined){if(typeof data59.app !== "string"){const err96 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/handoff/app",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/handoff/properties/app/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err96];}else {vErrors.push(err96);}errors++;}}if(data59.url !== undefined){if(typeof data59.url !== "string"){const err97 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/handoff/url",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/handoff/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err97];}else {vErrors.push(err97);}errors++;}}if(data59.tour !== undefined){if(typeof data59.tour !== "string"){const err98 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/handoff/tour",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/handoff/properties/tour/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err98];}else {vErrors.push(err98);}errors++;}}if(data59.step !== undefined){if(typeof data59.step !== "string"){const err99 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/handoff/step",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/handoff/properties/step/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err99];}else {vErrors.push(err99);}errors++;}}}else {const err100 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/handoff",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/handoff/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err100];}else {vErrors.push(err100);}errors++;}}if(data50.target !== undefined){let data64 = data50.target;if(data64 && typeof data64 == "object" && !Array.isArray(data64)){if(data64.kind === undefined){const err101 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/target",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/target/required",keyword:"required",params:{missingProperty: "kind"},message:"must have required property '"+"kind"+"'"};if(vErrors === null){vErrors = [err101];}else {vErrors.push(err101);}errors++;}for(const key12 in data64){if(!((((key12 === "kind") || (key12 === "ref")) || (key12 === "app")) || (key12 === "selector"))){const err102 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/target",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/target/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key12},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err102];}else {vErrors.push(err102);}errors++;}}if(data64.kind !== undefined){let data65 = data64.kind;if(typeof data65 !== "string"){const err103 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/target/kind",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/target/properties/kind/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err103];}else {vErrors.push(err103);}errors++;}if(!((((((data65 === "nav-item") || (data65 === "widget")) || (data65 === "action")) || (data65 === "page")) || (data65 === "element")) || (data65 === "selector"))){const err104 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/target/kind",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/target/properties/kind/enum",keyword:"enum",params:{allowedValues: schema31.properties.walkthrough.properties.tours.items.properties.steps.items.properties.target.properties.kind.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err104];}else {vErrors.push(err104);}errors++;}}if(data64.ref !== undefined){if(typeof data64.ref !== "string"){const err105 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/target/ref",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/target/properties/ref/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err105];}else {vErrors.push(err105);}errors++;}}if(data64.app !== undefined){if(typeof data64.app !== "string"){const err106 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/target/app",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/target/properties/app/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err106];}else {vErrors.push(err106);}errors++;}}if(data64.selector !== undefined){if(typeof data64.selector !== "string"){const err107 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/target/selector",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/target/properties/selector/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err107];}else {vErrors.push(err107);}errors++;}}}else {const err108 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/target",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/target/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err108];}else {vErrors.push(err108);}errors++;}}if(data50.advanceOn !== undefined){let data69 = data50.advanceOn;if(data69 && typeof data69 == "object" && !Array.isArray(data69)){if(data69.type === undefined){const err109 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/required",keyword:"required",params:{missingProperty: "type"},message:"must have required property '"+"type"+"'"};if(vErrors === null){vErrors = [err109];}else {vErrors.push(err109);}errors++;}for(const key13 in data69){if(!(((((((key13 === "type") || (key13 === "route")) || (key13 === "register")) || (key13 === "schema")) || (key13 === "selector")) || (key13 === "ms")) || (key13 === "capture"))){const err110 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key13},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err110];}else {vErrors.push(err110);}errors++;}}if(data69.type !== undefined){let data70 = data69.type;if(typeof data70 !== "string"){const err111 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/type",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err111];}else {vErrors.push(err111);}errors++;}if(!((((((data70 === "manual") || (data70 === "click-target")) || (data70 === "route-match")) || (data70 === "element-appears")) || (data70 === "object-created")) || (data70 === "delay"))){const err112 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/type",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/type/enum",keyword:"enum",params:{allowedValues: schema31.properties.walkthrough.properties.tours.items.properties.steps.items.properties.advanceOn.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err112];}else {vErrors.push(err112);}errors++;}}if(data69.route !== undefined){if(typeof data69.route !== "string"){const err113 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/route",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/route/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err113];}else {vErrors.push(err113);}errors++;}}if(data69.register !== undefined){if(typeof data69.register !== "string"){const err114 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/register",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err114];}else {vErrors.push(err114);}errors++;}}if(data69.schema !== undefined){if(typeof data69.schema !== "string"){const err115 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/schema",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err115];}else {vErrors.push(err115);}errors++;}}if(data69.selector !== undefined){if(typeof data69.selector !== "string"){const err116 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/selector",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/selector/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err116];}else {vErrors.push(err116);}errors++;}}if(data69.ms !== undefined){let data75 = data69.ms;if(!((typeof data75 == "number") && (!(data75 % 1) && !isNaN(data75)))){const err117 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/ms",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/ms/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err117];}else {vErrors.push(err117);}errors++;}if(typeof data75 == "number"){if(data75 < 0 || isNaN(data75)){const err118 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/ms",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/ms/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err118];}else {vErrors.push(err118);}errors++;}}}if(data69.capture !== undefined){let data76 = data69.capture;if(data76 && typeof data76 == "object" && !Array.isArray(data76)){for(const key14 in data76){if(typeof data76[key14] !== "string"){const err119 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/capture/" + key14.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/capture/additionalProperties/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err119];}else {vErrors.push(err119);}errors++;}}}else {const err120 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/capture",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/capture/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err120];}else {vErrors.push(err120);}errors++;}}}else {const err121 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err121];}else {vErrors.push(err121);}errors++;}}}else {const err122 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6,schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err122];}else {vErrors.push(err122);}errors++;}}}else {const err123 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err123];}else {vErrors.push(err123);}errors++;}}}else {const err124 = {instancePath:instancePath+"/walkthrough/tours/" + i5,schemaPath:"#/properties/walkthrough/properties/tours/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err124];}else {vErrors.push(err124);}errors++;}}}else {const err125 = {instancePath:instancePath+"/walkthrough/tours",schemaPath:"#/properties/walkthrough/properties/tours/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err125];}else {vErrors.push(err125);}errors++;}}}else {const err126 = {instancePath:instancePath+"/walkthrough",schemaPath:"#/properties/walkthrough/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err126];}else {vErrors.push(err126);}errors++;}}if(data.support !== undefined){let data78 = data.support;if(data78 && typeof data78 == "object" && !Array.isArray(data78)){for(const key15 in data78){if(!(func1.call(schema31.properties.support.properties, key15))){const err127 = {instancePath:instancePath+"/support",schemaPath:"#/properties/support/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key15},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err127];}else {vErrors.push(err127);}errors++;}}if(data78.enabled !== undefined){if(typeof data78.enabled !== "boolean"){const err128 = {instancePath:instancePath+"/support/enabled",schemaPath:"#/properties/support/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err128];}else {vErrors.push(err128);}errors++;}}if(data78.title !== undefined){if(typeof data78.title !== "string"){const err129 = {instancePath:instancePath+"/support/title",schemaPath:"#/properties/support/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err129];}else {vErrors.push(err129);}errors++;}}if(data78.appName !== undefined){if(typeof data78.appName !== "string"){const err130 = {instancePath:instancePath+"/support/appName",schemaPath:"#/properties/support/properties/appName/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err130];}else {vErrors.push(err130);}errors++;}}if(data78.bodyParagraphs !== undefined){let data82 = data78.bodyParagraphs;if(Array.isArray(data82)){const len7 = data82.length;for(let i7=0; i7<len7; i7++){if(typeof data82[i7] !== "string"){const err131 = {instancePath:instancePath+"/support/bodyParagraphs/" + i7,schemaPath:"#/properties/support/properties/bodyParagraphs/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err131];}else {vErrors.push(err131);}errors++;}}}else {const err132 = {instancePath:instancePath+"/support/bodyParagraphs",schemaPath:"#/properties/support/properties/bodyParagraphs/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err132];}else {vErrors.push(err132);}errors++;}}if(data78.founderName !== undefined){if(typeof data78.founderName !== "string"){const err133 = {instancePath:instancePath+"/support/founderName",schemaPath:"#/properties/support/properties/founderName/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err133];}else {vErrors.push(err133);}errors++;}}if(data78.founderTitle !== undefined){if(typeof data78.founderTitle !== "string"){const err134 = {instancePath:instancePath+"/support/founderTitle",schemaPath:"#/properties/support/properties/founderTitle/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err134];}else {vErrors.push(err134);}errors++;}}if(data78.founderAvatarUrl !== undefined){if(typeof data78.founderAvatarUrl !== "string"){const err135 = {instancePath:instancePath+"/support/founderAvatarUrl",schemaPath:"#/properties/support/properties/founderAvatarUrl/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err135];}else {vErrors.push(err135);}errors++;}}if(data78.founderProfileUrl !== undefined){if(typeof data78.founderProfileUrl !== "string"){const err136 = {instancePath:instancePath+"/support/founderProfileUrl",schemaPath:"#/properties/support/properties/founderProfileUrl/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err136];}else {vErrors.push(err136);}errors++;}}if(data78.buttons !== undefined){let data88 = data78.buttons;if(data88 && typeof data88 == "object" && !Array.isArray(data88)){for(const key16 in data88){if(!((((key16 === "donate") || (key16 === "support")) || (key16 === "feature-request")) || (key16 === "app-store"))){const err137 = {instancePath:instancePath+"/support/buttons",schemaPath:"#/properties/support/properties/buttons/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key16},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err137];}else {vErrors.push(err137);}errors++;}}if(data88.donate !== undefined){let data89 = data88.donate;if(data89 && typeof data89 == "object" && !Array.isArray(data89)){for(const key17 in data89){if(!(((((key17 === "enabled") || (key17 === "label")) || (key17 === "url")) || (key17 === "variant")) || (key17 === "icon"))){const err138 = {instancePath:instancePath+"/support/buttons/donate",schemaPath:"#/$defs/supportButton/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key17},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err138];}else {vErrors.push(err138);}errors++;}}if(data89.enabled !== undefined){if(typeof data89.enabled !== "boolean"){const err139 = {instancePath:instancePath+"/support/buttons/donate/enabled",schemaPath:"#/$defs/supportButton/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err139];}else {vErrors.push(err139);}errors++;}}if(data89.label !== undefined){if(typeof data89.label !== "string"){const err140 = {instancePath:instancePath+"/support/buttons/donate/label",schemaPath:"#/$defs/supportButton/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err140];}else {vErrors.push(err140);}errors++;}}if(data89.url !== undefined){if(typeof data89.url !== "string"){const err141 = {instancePath:instancePath+"/support/buttons/donate/url",schemaPath:"#/$defs/supportButton/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err141];}else {vErrors.push(err141);}errors++;}}if(data89.variant !== undefined){let data93 = data89.variant;if(typeof data93 !== "string"){const err142 = {instancePath:instancePath+"/support/buttons/donate/variant",schemaPath:"#/$defs/supportButton/properties/variant/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err142];}else {vErrors.push(err142);}errors++;}if(!((((((data93 === "primary") || (data93 === "secondary")) || (data93 === "tertiary")) || (data93 === "error")) || (data93 === "warning")) || (data93 === "success"))){const err143 = {instancePath:instancePath+"/support/buttons/donate/variant",schemaPath:"#/$defs/supportButton/properties/variant/enum",keyword:"enum",params:{allowedValues: schema32.properties.variant.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err143];}else {vErrors.push(err143);}errors++;}}if(data89.icon !== undefined){if(typeof data89.icon !== "string"){const err144 = {instancePath:instancePath+"/support/buttons/donate/icon",schemaPath:"#/$defs/supportButton/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err144];}else {vErrors.push(err144);}errors++;}}}else {const err145 = {instancePath:instancePath+"/support/buttons/donate",schemaPath:"#/$defs/supportButton/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err145];}else {vErrors.push(err145);}errors++;}}if(data88.support !== undefined){let data95 = data88.support;if(data95 && typeof data95 == "object" && !Array.isArray(data95)){for(const key18 in data95){if(!(((((key18 === "enabled") || (key18 === "label")) || (key18 === "url")) || (key18 === "variant")) || (key18 === "icon"))){const err146 = {instancePath:instancePath+"/support/buttons/support",schemaPath:"#/$defs/supportButton/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key18},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err146];}else {vErrors.push(err146);}errors++;}}if(data95.enabled !== undefined){if(typeof data95.enabled !== "boolean"){const err147 = {instancePath:instancePath+"/support/buttons/support/enabled",schemaPath:"#/$defs/supportButton/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err147];}else {vErrors.push(err147);}errors++;}}if(data95.label !== undefined){if(typeof data95.label !== "string"){const err148 = {instancePath:instancePath+"/support/buttons/support/label",schemaPath:"#/$defs/supportButton/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err148];}else {vErrors.push(err148);}errors++;}}if(data95.url !== undefined){if(typeof data95.url !== "string"){const err149 = {instancePath:instancePath+"/support/buttons/support/url",schemaPath:"#/$defs/supportButton/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err149];}else {vErrors.push(err149);}errors++;}}if(data95.variant !== undefined){let data99 = data95.variant;if(typeof data99 !== "string"){const err150 = {instancePath:instancePath+"/support/buttons/support/variant",schemaPath:"#/$defs/supportButton/properties/variant/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err150];}else {vErrors.push(err150);}errors++;}if(!((((((data99 === "primary") || (data99 === "secondary")) || (data99 === "tertiary")) || (data99 === "error")) || (data99 === "warning")) || (data99 === "success"))){const err151 = {instancePath:instancePath+"/support/buttons/support/variant",schemaPath:"#/$defs/supportButton/properties/variant/enum",keyword:"enum",params:{allowedValues: schema32.properties.variant.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err151];}else {vErrors.push(err151);}errors++;}}if(data95.icon !== undefined){if(typeof data95.icon !== "string"){const err152 = {instancePath:instancePath+"/support/buttons/support/icon",schemaPath:"#/$defs/supportButton/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err152];}else {vErrors.push(err152);}errors++;}}}else {const err153 = {instancePath:instancePath+"/support/buttons/support",schemaPath:"#/$defs/supportButton/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err153];}else {vErrors.push(err153);}errors++;}}if(data88["feature-request"] !== undefined){let data101 = data88["feature-request"];if(data101 && typeof data101 == "object" && !Array.isArray(data101)){for(const key19 in data101){if(!(((((key19 === "enabled") || (key19 === "label")) || (key19 === "url")) || (key19 === "variant")) || (key19 === "icon"))){const err154 = {instancePath:instancePath+"/support/buttons/feature-request",schemaPath:"#/$defs/supportButton/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key19},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err154];}else {vErrors.push(err154);}errors++;}}if(data101.enabled !== undefined){if(typeof data101.enabled !== "boolean"){const err155 = {instancePath:instancePath+"/support/buttons/feature-request/enabled",schemaPath:"#/$defs/supportButton/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err155];}else {vErrors.push(err155);}errors++;}}if(data101.label !== undefined){if(typeof data101.label !== "string"){const err156 = {instancePath:instancePath+"/support/buttons/feature-request/label",schemaPath:"#/$defs/supportButton/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err156];}else {vErrors.push(err156);}errors++;}}if(data101.url !== undefined){if(typeof data101.url !== "string"){const err157 = {instancePath:instancePath+"/support/buttons/feature-request/url",schemaPath:"#/$defs/supportButton/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err157];}else {vErrors.push(err157);}errors++;}}if(data101.variant !== undefined){let data105 = data101.variant;if(typeof data105 !== "string"){const err158 = {instancePath:instancePath+"/support/buttons/feature-request/variant",schemaPath:"#/$defs/supportButton/properties/variant/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err158];}else {vErrors.push(err158);}errors++;}if(!((((((data105 === "primary") || (data105 === "secondary")) || (data105 === "tertiary")) || (data105 === "error")) || (data105 === "warning")) || (data105 === "success"))){const err159 = {instancePath:instancePath+"/support/buttons/feature-request/variant",schemaPath:"#/$defs/supportButton/properties/variant/enum",keyword:"enum",params:{allowedValues: schema32.properties.variant.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err159];}else {vErrors.push(err159);}errors++;}}if(data101.icon !== undefined){if(typeof data101.icon !== "string"){const err160 = {instancePath:instancePath+"/support/buttons/feature-request/icon",schemaPath:"#/$defs/supportButton/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err160];}else {vErrors.push(err160);}errors++;}}}else {const err161 = {instancePath:instancePath+"/support/buttons/feature-request",schemaPath:"#/$defs/supportButton/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err161];}else {vErrors.push(err161);}errors++;}}if(data88["app-store"] !== undefined){let data107 = data88["app-store"];if(data107 && typeof data107 == "object" && !Array.isArray(data107)){for(const key20 in data107){if(!(((((key20 === "enabled") || (key20 === "label")) || (key20 === "url")) || (key20 === "variant")) || (key20 === "icon"))){const err162 = {instancePath:instancePath+"/support/buttons/app-store",schemaPath:"#/$defs/supportButton/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key20},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err162];}else {vErrors.push(err162);}errors++;}}if(data107.enabled !== undefined){if(typeof data107.enabled !== "boolean"){const err163 = {instancePath:instancePath+"/support/buttons/app-store/enabled",schemaPath:"#/$defs/supportButton/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err163];}else {vErrors.push(err163);}errors++;}}if(data107.label !== undefined){if(typeof data107.label !== "string"){const err164 = {instancePath:instancePath+"/support/buttons/app-store/label",schemaPath:"#/$defs/supportButton/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err164];}else {vErrors.push(err164);}errors++;}}if(data107.url !== undefined){if(typeof data107.url !== "string"){const err165 = {instancePath:instancePath+"/support/buttons/app-store/url",schemaPath:"#/$defs/supportButton/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err165];}else {vErrors.push(err165);}errors++;}}if(data107.variant !== undefined){let data111 = data107.variant;if(typeof data111 !== "string"){const err166 = {instancePath:instancePath+"/support/buttons/app-store/variant",schemaPath:"#/$defs/supportButton/properties/variant/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err166];}else {vErrors.push(err166);}errors++;}if(!((((((data111 === "primary") || (data111 === "secondary")) || (data111 === "tertiary")) || (data111 === "error")) || (data111 === "warning")) || (data111 === "success"))){const err167 = {instancePath:instancePath+"/support/buttons/app-store/variant",schemaPath:"#/$defs/supportButton/properties/variant/enum",keyword:"enum",params:{allowedValues: schema32.properties.variant.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err167];}else {vErrors.push(err167);}errors++;}}if(data107.icon !== undefined){if(typeof data107.icon !== "string"){const err168 = {instancePath:instancePath+"/support/buttons/app-store/icon",schemaPath:"#/$defs/supportButton/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err168];}else {vErrors.push(err168);}errors++;}}}else {const err169 = {instancePath:instancePath+"/support/buttons/app-store",schemaPath:"#/$defs/supportButton/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err169];}else {vErrors.push(err169);}errors++;}}}else {const err170 = {instancePath:instancePath+"/support/buttons",schemaPath:"#/properties/support/properties/buttons/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err170];}else {vErrors.push(err170);}errors++;}}}else {const err171 = {instancePath:instancePath+"/support",schemaPath:"#/properties/support/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err171];}else {vErrors.push(err171);}errors++;}}if(data.personalisation !== undefined){let data113 = data.personalisation;if(data113 && typeof data113 == "object" && !Array.isArray(data113)){if(data113.enabled === undefined){data113.enabled = true;}if(data113.dateDisplay === undefined){data113.dateDisplay = "absolute";}if(data113.rememberLastView === undefined){data113.rememberLastView = false;}for(const key21 in data113){if(!((((((key21 === "enabled") || (key21 === "disabledReason")) || (key21 === "landingPage")) || (key21 === "dateDisplay")) || (key21 === "rememberLastView")) || (key21 === "pinnedMenu"))){const err172 = {instancePath:instancePath+"/personalisation",schemaPath:"#/$defs/personalisation/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key21},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err172];}else {vErrors.push(err172);}errors++;}}if(typeof data113.enabled !== "boolean"){const err173 = {instancePath:instancePath+"/personalisation/enabled",schemaPath:"#/$defs/personalisation/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err173];}else {vErrors.push(err173);}errors++;}if(data113.disabledReason !== undefined){if(typeof data113.disabledReason !== "string"){const err174 = {instancePath:instancePath+"/personalisation/disabledReason",schemaPath:"#/$defs/personalisation/properties/disabledReason/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err174];}else {vErrors.push(err174);}errors++;}}if(data113.landingPage !== undefined){if(typeof data113.landingPage !== "string"){const err175 = {instancePath:instancePath+"/personalisation/landingPage",schemaPath:"#/$defs/personalisation/properties/landingPage/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err175];}else {vErrors.push(err175);}errors++;}}let data117 = data113.dateDisplay;if(typeof data117 !== "string"){const err176 = {instancePath:instancePath+"/personalisation/dateDisplay",schemaPath:"#/$defs/personalisation/properties/dateDisplay/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err176];}else {vErrors.push(err176);}errors++;}if(!((data117 === "absolute") || (data117 === "relative"))){const err177 = {instancePath:instancePath+"/personalisation/dateDisplay",schemaPath:"#/$defs/personalisation/properties/dateDisplay/enum",keyword:"enum",params:{allowedValues: schema36.properties.dateDisplay.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err177];}else {vErrors.push(err177);}errors++;}if(typeof data113.rememberLastView !== "boolean"){const err178 = {instancePath:instancePath+"/personalisation/rememberLastView",schemaPath:"#/$defs/personalisation/properties/rememberLastView/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err178];}else {vErrors.push(err178);}errors++;}if(data113.pinnedMenu !== undefined){let data119 = data113.pinnedMenu;if(Array.isArray(data119)){const len8 = data119.length;for(let i8=0; i8<len8; i8++){if(typeof data119[i8] !== "string"){const err179 = {instancePath:instancePath+"/personalisation/pinnedMenu/" + i8,schemaPath:"#/$defs/personalisation/properties/pinnedMenu/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err179];}else {vErrors.push(err179);}errors++;}}}else {const err180 = {instancePath:instancePath+"/personalisation/pinnedMenu",schemaPath:"#/$defs/personalisation/properties/pinnedMenu/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err180];}else {vErrors.push(err180);}errors++;}}}else {const err181 = {instancePath:instancePath+"/personalisation",schemaPath:"#/$defs/personalisation/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err181];}else {vErrors.push(err181);}errors++;}}if(data.nav !== undefined){let data121 = data.nav;if(data121 && typeof data121 == "object" && !Array.isArray(data121)){if(data121.includePersonalSettings === undefined){data121.includePersonalSettings = true;}for(const key22 in data121){if(!(((((key22 === "includePersonalSettings") || (key22 === "settingsLabel")) || (key22 === "primaryAction")) || (key22 === "featureRequestRepo")) || (key22 === "forge"))){const err182 = {instancePath:instancePath+"/nav",schemaPath:"#/properties/nav/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key22},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err182];}else {vErrors.push(err182);}errors++;}}if(typeof data121.includePersonalSettings !== "boolean"){const err183 = {instancePath:instancePath+"/nav/includePersonalSettings",schemaPath:"#/properties/nav/properties/includePersonalSettings/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err183];}else {vErrors.push(err183);}errors++;}if(data121.settingsLabel !== undefined){if(typeof data121.settingsLabel !== "string"){const err184 = {instancePath:instancePath+"/nav/settingsLabel",schemaPath:"#/properties/nav/properties/settingsLabel/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err184];}else {vErrors.push(err184);}errors++;}}if(data121.primaryAction !== undefined){let data124 = data121.primaryAction;if(data124 && typeof data124 == "object" && !Array.isArray(data124)){if(data124.label === undefined){const err185 = {instancePath:instancePath+"/nav/primaryAction",schemaPath:"#/$defs/primaryAction/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err185];}else {vErrors.push(err185);}errors++;}for(const key23 in data124){if(!((((((key23 === "id") || (key23 === "label")) || (key23 === "icon")) || (key23 === "route")) || (key23 === "href")) || (key23 === "payload"))){const err186 = {instancePath:instancePath+"/nav/primaryAction",schemaPath:"#/$defs/primaryAction/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key23},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err186];}else {vErrors.push(err186);}errors++;}}if(data124.id !== undefined){if(typeof data124.id !== "string"){const err187 = {instancePath:instancePath+"/nav/primaryAction/id",schemaPath:"#/$defs/primaryAction/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err187];}else {vErrors.push(err187);}errors++;}}if(data124.label !== undefined){if(typeof data124.label !== "string"){const err188 = {instancePath:instancePath+"/nav/primaryAction/label",schemaPath:"#/$defs/primaryAction/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err188];}else {vErrors.push(err188);}errors++;}}if(data124.icon !== undefined){if(typeof data124.icon !== "string"){const err189 = {instancePath:instancePath+"/nav/primaryAction/icon",schemaPath:"#/$defs/primaryAction/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err189];}else {vErrors.push(err189);}errors++;}}if(data124.route !== undefined){if(typeof data124.route !== "string"){const err190 = {instancePath:instancePath+"/nav/primaryAction/route",schemaPath:"#/$defs/primaryAction/properties/route/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err190];}else {vErrors.push(err190);}errors++;}}if(data124.href !== undefined){if(typeof data124.href !== "string"){const err191 = {instancePath:instancePath+"/nav/primaryAction/href",schemaPath:"#/$defs/primaryAction/properties/href/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err191];}else {vErrors.push(err191);}errors++;}}}else {const err192 = {instancePath:instancePath+"/nav/primaryAction",schemaPath:"#/$defs/primaryAction/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err192];}else {vErrors.push(err192);}errors++;}}if(data121.featureRequestRepo !== undefined){if(typeof data121.featureRequestRepo !== "string"){const err193 = {instancePath:instancePath+"/nav/featureRequestRepo",schemaPath:"#/properties/nav/properties/featureRequestRepo/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err193];}else {vErrors.push(err193);}errors++;}}if(data121.forge !== undefined){let data131 = data121.forge;if(data131 && typeof data131 == "object" && !Array.isArray(data131)){if(data131.type === undefined){data131.type = "github";}for(const key24 in data131){if(!((key24 === "type") || (key24 === "baseUrl"))){const err194 = {instancePath:instancePath+"/nav/forge",schemaPath:"#/properties/nav/properties/forge/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key24},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err194];}else {vErrors.push(err194);}errors++;}}let data132 = data131.type;if(typeof data132 !== "string"){const err195 = {instancePath:instancePath+"/nav/forge/type",schemaPath:"#/properties/nav/properties/forge/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err195];}else {vErrors.push(err195);}errors++;}if(!((((data132 === "codeberg") || (data132 === "forgejo")) || (data132 === "gitea")) || (data132 === "github"))){const err196 = {instancePath:instancePath+"/nav/forge/type",schemaPath:"#/properties/nav/properties/forge/properties/type/enum",keyword:"enum",params:{allowedValues: schema31.properties.nav.properties.forge.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err196];}else {vErrors.push(err196);}errors++;}if(data131.baseUrl !== undefined){if(typeof data131.baseUrl !== "string"){const err197 = {instancePath:instancePath+"/nav/forge/baseUrl",schemaPath:"#/properties/nav/properties/forge/properties/baseUrl/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err197];}else {vErrors.push(err197);}errors++;}}}else {const err198 = {instancePath:instancePath+"/nav/forge",schemaPath:"#/properties/nav/properties/forge/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err198];}else {vErrors.push(err198);}errors++;}}}else {const err199 = {instancePath:instancePath+"/nav",schemaPath:"#/properties/nav/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err199];}else {vErrors.push(err199);}errors++;}}if(data.runtime !== undefined){let data134 = data.runtime;if(data134 && typeof data134 == "object" && !Array.isArray(data134)){if(data134.user !== undefined){let data135 = data134.user;if(data135 && typeof data135 == "object" && !Array.isArray(data135));else {const err200 = {instancePath:instancePath+"/runtime/user",schemaPath:"#/properties/runtime/properties/user/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err200];}else {vErrors.push(err200);}errors++;}}if(data134.theme !== undefined){let data136 = data134.theme;if(data136 && typeof data136 == "object" && !Array.isArray(data136)){if(data136.source === undefined){const err201 = {instancePath:instancePath+"/runtime/theme",schemaPath:"#/$defs/runtimeTheme/required",keyword:"required",params:{missingProperty: "source"},message:"must have required property '"+"source"+"'"};if(vErrors === null){vErrors = [err201];}else {vErrors.push(err201);}errors++;}if(data136.tokenSet === undefined){const err202 = {instancePath:instancePath+"/runtime/theme",schemaPath:"#/$defs/runtimeTheme/required",keyword:"required",params:{missingProperty: "tokenSet"},message:"must have required property '"+"tokenSet"+"'"};if(vErrors === null){vErrors = [err202];}else {vErrors.push(err202);}errors++;}for(const key25 in data136){if(!((((key25 === "source") || (key25 === "tokenSet")) || (key25 === "tokenSetName")) || (key25 === "preview"))){const err203 = {instancePath:instancePath+"/runtime/theme",schemaPath:"#/$defs/runtimeTheme/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key25},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err203];}else {vErrors.push(err203);}errors++;}}if(data136.source !== undefined){let data137 = data136.source;if(typeof data137 !== "string"){const err204 = {instancePath:instancePath+"/runtime/theme/source",schemaPath:"#/$defs/runtimeTheme/properties/source/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err204];}else {vErrors.push(err204);}errors++;}if(!(data137 === "nldesign")){const err205 = {instancePath:instancePath+"/runtime/theme/source",schemaPath:"#/$defs/runtimeTheme/properties/source/enum",keyword:"enum",params:{allowedValues: schema38.properties.source.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err205];}else {vErrors.push(err205);}errors++;}}if(data136.tokenSet !== undefined){let data138 = data136.tokenSet;if(typeof data138 === "string"){if(!pattern5.test(data138)){const err206 = {instancePath:instancePath+"/runtime/theme/tokenSet",schemaPath:"#/$defs/runtimeTheme/properties/tokenSet/pattern",keyword:"pattern",params:{pattern: "^[a-z0-9]+(?:-[a-z0-9]+)*$"},message:"must match pattern \""+"^[a-z0-9]+(?:-[a-z0-9]+)*$"+"\""};if(vErrors === null){vErrors = [err206];}else {vErrors.push(err206);}errors++;}}else {const err207 = {instancePath:instancePath+"/runtime/theme/tokenSet",schemaPath:"#/$defs/runtimeTheme/properties/tokenSet/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err207];}else {vErrors.push(err207);}errors++;}}if(data136.tokenSetName !== undefined){if(typeof data136.tokenSetName !== "string"){const err208 = {instancePath:instancePath+"/runtime/theme/tokenSetName",schemaPath:"#/$defs/runtimeTheme/properties/tokenSetName/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err208];}else {vErrors.push(err208);}errors++;}}if(data136.preview !== undefined){let data140 = data136.preview;if(data140 && typeof data140 == "object" && !Array.isArray(data140)){for(const key26 in data140){if(!((key26 === "primaryColor") || (key26 === "backgroundColor"))){const err209 = {instancePath:instancePath+"/runtime/theme/preview",schemaPath:"#/$defs/runtimeTheme/properties/preview/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key26},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err209];}else {vErrors.push(err209);}errors++;}}if(data140.primaryColor !== undefined){if(typeof data140.primaryColor !== "string"){const err210 = {instancePath:instancePath+"/runtime/theme/preview/primaryColor",schemaPath:"#/$defs/runtimeTheme/properties/preview/properties/primaryColor/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err210];}else {vErrors.push(err210);}errors++;}}if(data140.backgroundColor !== undefined){if(typeof data140.backgroundColor !== "string"){const err211 = {instancePath:instancePath+"/runtime/theme/preview/backgroundColor",schemaPath:"#/$defs/runtimeTheme/properties/preview/properties/backgroundColor/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err211];}else {vErrors.push(err211);}errors++;}}}else {const err212 = {instancePath:instancePath+"/runtime/theme/preview",schemaPath:"#/$defs/runtimeTheme/properties/preview/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err212];}else {vErrors.push(err212);}errors++;}}}else {const err213 = {instancePath:instancePath+"/runtime/theme",schemaPath:"#/$defs/runtimeTheme/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err213];}else {vErrors.push(err213);}errors++;}}}else {const err214 = {instancePath:instancePath+"/runtime",schemaPath:"#/properties/runtime/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err214];}else {vErrors.push(err214);}errors++;}}if(data.menu !== undefined){let data143 = data.menu;if(Array.isArray(data143)){const len9 = data143.length;for(let i9=0; i9<len9; i9++){if(!(validate21(data143[i9], {instancePath:instancePath+"/menu/" + i9,parentData:data143,parentDataProperty:i9,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate21.errors : vErrors.concat(validate21.errors);errors = vErrors.length;}}}else {const err215 = {instancePath:instancePath+"/menu",schemaPath:"#/properties/menu/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err215];}else {vErrors.push(err215);}errors++;}}if(data.pages !== undefined){let data145 = data.pages;if(Array.isArray(data145)){const len10 = data145.length;for(let i10=0; i10<len10; i10++){if(!(validate25(data145[i10], {instancePath:instancePath+"/pages/" + i10,parentData:data145,parentDataProperty:i10,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate25.errors : vErrors.concat(validate25.errors);errors = vErrors.length;}}}else {const err216 = {instancePath:instancePath+"/pages",schemaPath:"#/properties/pages/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err216];}else {vErrors.push(err216);}errors++;}}if(data.adminSettings !== undefined){let data147 = data.adminSettings;if(Array.isArray(data147)){const len11 = data147.length;for(let i11=0; i11<len11; i11++){let data148 = data147[i11];const _errs350 = errors;let valid65 = false;let passing1 = null;const _errs351 = errors;if(data148 && typeof data148 == "object" && !Array.isArray(data148)){if(data148.type === undefined){const err217 = {instancePath:instancePath+"/adminSettings/" + i11,schemaPath:"#/$defs/adminSettingsEntry/oneOf/0/required",keyword:"required",params:{missingProperty: "type"},message:"must have required property '"+"type"+"'"};if(vErrors === null){vErrors = [err217];}else {vErrors.push(err217);}errors++;}}var _valid3 = _errs351 === errors;if(_valid3){valid65 = true;passing1 = 0;}const _errs352 = errors;if(data148 && typeof data148 == "object" && !Array.isArray(data148)){if(data148.component === undefined){const err218 = {instancePath:instancePath+"/adminSettings/" + i11,schemaPath:"#/$defs/adminSettingsEntry/oneOf/1/required",keyword:"required",params:{missingProperty: "component"},message:"must have required property '"+"component"+"'"};if(vErrors === null){vErrors = [err218];}else {vErrors.push(err218);}errors++;}}var _valid3 = _errs352 === errors;if(_valid3 && valid65){valid65 = false;passing1 = [passing1, 1];}else {if(_valid3){valid65 = true;passing1 = 1;}}if(!valid65){const err219 = {instancePath:instancePath+"/adminSettings/" + i11,schemaPath:"#/$defs/adminSettingsEntry/oneOf",keyword:"oneOf",params:{passingSchemas: passing1},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err219];}else {vErrors.push(err219);}errors++;}else {errors = _errs350;if(vErrors !== null){if(_errs350){vErrors.length = _errs350;}else {vErrors = null;}}}if(data148 && typeof data148 == "object" && !Array.isArray(data148)){if(data148.id === undefined){const err220 = {instancePath:instancePath+"/adminSettings/" + i11,schemaPath:"#/$defs/adminSettingsEntry/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err220];}else {vErrors.push(err220);}errors++;}if(data148.label === undefined){const err221 = {instancePath:instancePath+"/adminSettings/" + i11,schemaPath:"#/$defs/adminSettingsEntry/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err221];}else {vErrors.push(err221);}errors++;}for(const key27 in data148){if(!(((((((key27 === "id") || (key27 === "label")) || (key27 === "type")) || (key27 === "component")) || (key27 === "order")) || (key27 === "permission")) || (key27 === "props"))){const err222 = {instancePath:instancePath+"/adminSettings/" + i11,schemaPath:"#/$defs/adminSettingsEntry/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key27},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err222];}else {vErrors.push(err222);}errors++;}}if(data148.id !== undefined){if(typeof data148.id !== "string"){const err223 = {instancePath:instancePath+"/adminSettings/" + i11+"/id",schemaPath:"#/$defs/adminSettingsEntry/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err223];}else {vErrors.push(err223);}errors++;}}if(data148.label !== undefined){if(typeof data148.label !== "string"){const err224 = {instancePath:instancePath+"/adminSettings/" + i11+"/label",schemaPath:"#/$defs/adminSettingsEntry/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err224];}else {vErrors.push(err224);}errors++;}}if(data148.type !== undefined){let data151 = data148.type;if(typeof data151 !== "string"){const err225 = {instancePath:instancePath+"/adminSettings/" + i11+"/type",schemaPath:"#/$defs/adminSettingsEntry/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err225];}else {vErrors.push(err225);}errors++;}if(!(data151 === "organisation-credentials")){const err226 = {instancePath:instancePath+"/adminSettings/" + i11+"/type",schemaPath:"#/$defs/adminSettingsEntry/properties/type/enum",keyword:"enum",params:{allowedValues: schema81.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err226];}else {vErrors.push(err226);}errors++;}}if(data148.component !== undefined){if(typeof data148.component !== "string"){const err227 = {instancePath:instancePath+"/adminSettings/" + i11+"/component",schemaPath:"#/$defs/adminSettingsEntry/properties/component/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err227];}else {vErrors.push(err227);}errors++;}}if(data148.order !== undefined){let data153 = data148.order;if(!((typeof data153 == "number") && (!(data153 % 1) && !isNaN(data153)))){const err228 = {instancePath:instancePath+"/adminSettings/" + i11+"/order",schemaPath:"#/$defs/adminSettingsEntry/properties/order/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err228];}else {vErrors.push(err228);}errors++;}}if(data148.permission !== undefined){if(typeof data148.permission !== "string"){const err229 = {instancePath:instancePath+"/adminSettings/" + i11+"/permission",schemaPath:"#/$defs/adminSettingsEntry/properties/permission/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err229];}else {vErrors.push(err229);}errors++;}}if(data148.props !== undefined){let data155 = data148.props;if(data155 && typeof data155 == "object" && !Array.isArray(data155));else {const err230 = {instancePath:instancePath+"/adminSettings/" + i11+"/props",schemaPath:"#/$defs/adminSettingsEntry/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err230];}else {vErrors.push(err230);}errors++;}}}else {const err231 = {instancePath:instancePath+"/adminSettings/" + i11,schemaPath:"#/$defs/adminSettingsEntry/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err231];}else {vErrors.push(err231);}errors++;}}}else {const err232 = {instancePath:instancePath+"/adminSettings",schemaPath:"#/properties/adminSettings/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err232];}else {vErrors.push(err232);}errors++;}}if(data.credentials !== undefined){let data156 = data.credentials;if(Array.isArray(data156)){const len12 = data156.length;for(let i12=0; i12<len12; i12++){let data157 = data156[i12];if(data157 && typeof data157 == "object" && !Array.isArray(data157)){if(data157.provider === undefined){const err233 = {instancePath:instancePath+"/credentials/" + i12,schemaPath:"#/properties/credentials/items/required",keyword:"required",params:{missingProperty: "provider"},message:"must have required property '"+"provider"+"'"};if(vErrors === null){vErrors = [err233];}else {vErrors.push(err233);}errors++;}for(const key28 in data157){if(!(((key28 === "provider") || (key28 === "reason")) || (key28 === "scopes"))){const err234 = {instancePath:instancePath+"/credentials/" + i12,schemaPath:"#/properties/credentials/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key28},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err234];}else {vErrors.push(err234);}errors++;}}if(data157.provider !== undefined){if(typeof data157.provider !== "string"){const err235 = {instancePath:instancePath+"/credentials/" + i12+"/provider",schemaPath:"#/properties/credentials/items/properties/provider/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err235];}else {vErrors.push(err235);}errors++;}}if(data157.reason !== undefined){if(typeof data157.reason !== "string"){const err236 = {instancePath:instancePath+"/credentials/" + i12+"/reason",schemaPath:"#/properties/credentials/items/properties/reason/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err236];}else {vErrors.push(err236);}errors++;}}if(data157.scopes !== undefined){let data160 = data157.scopes;if(Array.isArray(data160)){const len13 = data160.length;for(let i13=0; i13<len13; i13++){if(typeof data160[i13] !== "string"){const err237 = {instancePath:instancePath+"/credentials/" + i12+"/scopes/" + i13,schemaPath:"#/properties/credentials/items/properties/scopes/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err237];}else {vErrors.push(err237);}errors++;}}}else {const err238 = {instancePath:instancePath+"/credentials/" + i12+"/scopes",schemaPath:"#/properties/credentials/items/properties/scopes/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err238];}else {vErrors.push(err238);}errors++;}}}else {const err239 = {instancePath:instancePath+"/credentials/" + i12,schemaPath:"#/properties/credentials/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err239];}else {vErrors.push(err239);}errors++;}}}else {const err240 = {instancePath:instancePath+"/credentials",schemaPath:"#/properties/credentials/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err240];}else {vErrors.push(err240);}errors++;}}if(data.schedules !== undefined){let data162 = data.schedules;if(Array.isArray(data162)){const len14 = data162.length;for(let i14=0; i14<len14; i14++){let data163 = data162[i14];const _errs386 = errors;let valid74 = false;let passing2 = null;const _errs387 = errors;const _errs388 = errors;const _errs389 = errors;if(data163 && typeof data163 == "object" && !Array.isArray(data163)){if((data163.cron === undefined) && ("cron")){const err241 = {};if(vErrors === null){vErrors = [err241];}else {vErrors.push(err241);}errors++;}}var valid75 = _errs389 === errors;if(valid75){const err242 = {instancePath:instancePath+"/schedules/" + i14,schemaPath:"#/properties/schedules/items/oneOf/0/not",keyword:"not",params:{},message:"must NOT be valid"};if(vErrors === null){vErrors = [err242];}else {vErrors.push(err242);}errors++;}else {errors = _errs388;if(vErrors !== null){if(_errs388){vErrors.length = _errs388;}else {vErrors = null;}}}if(data163 && typeof data163 == "object" && !Array.isArray(data163)){if(data163.interval === undefined){const err243 = {instancePath:instancePath+"/schedules/" + i14,schemaPath:"#/properties/schedules/items/oneOf/0/required",keyword:"required",params:{missingProperty: "interval"},message:"must have required property '"+"interval"+"'"};if(vErrors === null){vErrors = [err243];}else {vErrors.push(err243);}errors++;}}var _valid4 = _errs387 === errors;if(_valid4){valid74 = true;passing2 = 0;}const _errs390 = errors;const _errs391 = errors;const _errs392 = errors;if(data163 && typeof data163 == "object" && !Array.isArray(data163)){if((data163.interval === undefined) && ("interval")){const err244 = {};if(vErrors === null){vErrors = [err244];}else {vErrors.push(err244);}errors++;}}var valid76 = _errs392 === errors;if(valid76){const err245 = {instancePath:instancePath+"/schedules/" + i14,schemaPath:"#/properties/schedules/items/oneOf/1/not",keyword:"not",params:{},message:"must NOT be valid"};if(vErrors === null){vErrors = [err245];}else {vErrors.push(err245);}errors++;}else {errors = _errs391;if(vErrors !== null){if(_errs391){vErrors.length = _errs391;}else {vErrors = null;}}}if(data163 && typeof data163 == "object" && !Array.isArray(data163)){if(data163.cron === undefined){const err246 = {instancePath:instancePath+"/schedules/" + i14,schemaPath:"#/properties/schedules/items/oneOf/1/required",keyword:"required",params:{missingProperty: "cron"},message:"must have required property '"+"cron"+"'"};if(vErrors === null){vErrors = [err246];}else {vErrors.push(err246);}errors++;}}var _valid4 = _errs390 === errors;if(_valid4 && valid74){valid74 = false;passing2 = [passing2, 1];}else {if(_valid4){valid74 = true;passing2 = 1;}}if(!valid74){const err247 = {instancePath:instancePath+"/schedules/" + i14,schemaPath:"#/properties/schedules/items/oneOf",keyword:"oneOf",params:{passingSchemas: passing2},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err247];}else {vErrors.push(err247);}errors++;}else {errors = _errs386;if(vErrors !== null){if(_errs386){vErrors.length = _errs386;}else {vErrors = null;}}}if(data163 && typeof data163 == "object" && !Array.isArray(data163)){if(data163.id === undefined){const err248 = {instancePath:instancePath+"/schedules/" + i14,schemaPath:"#/properties/schedules/items/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err248];}else {vErrors.push(err248);}errors++;}if(data163.action === undefined){const err249 = {instancePath:instancePath+"/schedules/" + i14,schemaPath:"#/properties/schedules/items/required",keyword:"required",params:{missingProperty: "action"},message:"must have required property '"+"action"+"'"};if(vErrors === null){vErrors = [err249];}else {vErrors.push(err249);}errors++;}for(const key29 in data163){if(!((((((key29 === "id") || (key29 === "interval")) || (key29 === "cron")) || (key29 === "action")) || (key29 === "arguments")) || (key29 === "enabled"))){const err250 = {instancePath:instancePath+"/schedules/" + i14,schemaPath:"#/properties/schedules/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key29},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err250];}else {vErrors.push(err250);}errors++;}}if(data163.id !== undefined){if(typeof data163.id !== "string"){const err251 = {instancePath:instancePath+"/schedules/" + i14+"/id",schemaPath:"#/properties/schedules/items/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err251];}else {vErrors.push(err251);}errors++;}}if(data163.interval !== undefined){let data165 = data163.interval;if(!((typeof data165 == "number") && (!(data165 % 1) && !isNaN(data165)))){const err252 = {instancePath:instancePath+"/schedules/" + i14+"/interval",schemaPath:"#/properties/schedules/items/properties/interval/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err252];}else {vErrors.push(err252);}errors++;}if(typeof data165 == "number"){if(data165 < 1 || isNaN(data165)){const err253 = {instancePath:instancePath+"/schedules/" + i14+"/interval",schemaPath:"#/properties/schedules/items/properties/interval/minimum",keyword:"minimum",params:{comparison: ">=", limit: 1},message:"must be >= 1"};if(vErrors === null){vErrors = [err253];}else {vErrors.push(err253);}errors++;}}}if(data163.cron !== undefined){if(typeof data163.cron !== "string"){const err254 = {instancePath:instancePath+"/schedules/" + i14+"/cron",schemaPath:"#/properties/schedules/items/properties/cron/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err254];}else {vErrors.push(err254);}errors++;}}if(data163.action !== undefined){let data167 = data163.action;if(typeof data167 === "string"){if(!pattern27.test(data167)){const err255 = {instancePath:instancePath+"/schedules/" + i14+"/action",schemaPath:"#/properties/schedules/items/properties/action/pattern",keyword:"pattern",params:{pattern: "^[a-z0-9]+:[a-z0-9-]+$"},message:"must match pattern \""+"^[a-z0-9]+:[a-z0-9-]+$"+"\""};if(vErrors === null){vErrors = [err255];}else {vErrors.push(err255);}errors++;}}else {const err256 = {instancePath:instancePath+"/schedules/" + i14+"/action",schemaPath:"#/properties/schedules/items/properties/action/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err256];}else {vErrors.push(err256);}errors++;}}if(data163.arguments !== undefined){let data168 = data163.arguments;if(data168 && typeof data168 == "object" && !Array.isArray(data168));else {const err257 = {instancePath:instancePath+"/schedules/" + i14+"/arguments",schemaPath:"#/properties/schedules/items/properties/arguments/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err257];}else {vErrors.push(err257);}errors++;}}if(data163.enabled !== undefined){if(typeof data163.enabled !== "boolean"){const err258 = {instancePath:instancePath+"/schedules/" + i14+"/enabled",schemaPath:"#/properties/schedules/items/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err258];}else {vErrors.push(err258);}errors++;}}}else {const err259 = {instancePath:instancePath+"/schedules/" + i14,schemaPath:"#/properties/schedules/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err259];}else {vErrors.push(err259);}errors++;}}}else {const err260 = {instancePath:instancePath+"/schedules",schemaPath:"#/properties/schedules/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err260];}else {vErrors.push(err260);}errors++;}}if(data.observability !== undefined){let data170 = data.observability;if(data170 && typeof data170 == "object" && !Array.isArray(data170)){for(const key30 in data170){if(!(((key30 === "_note") || (key30 === "health")) || (key30 === "metrics"))){const err261 = {instancePath:instancePath+"/observability",schemaPath:"#/$defs/observability/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key30},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err261];}else {vErrors.push(err261);}errors++;}}if(data170._note !== undefined){if(typeof data170._note !== "string"){const err262 = {instancePath:instancePath+"/observability/_note",schemaPath:"#/$defs/observability/properties/_note/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err262];}else {vErrors.push(err262);}errors++;}}if(data170.health !== undefined){let data172 = data170.health;if(data172 && typeof data172 == "object" && !Array.isArray(data172)){if(data172.statusCodePolicy === undefined){data172.statusCodePolicy = "adr006";}if(data172.cors === undefined){data172.cors = false;}for(const key31 in data172){if(!(((key31 === "statusCodePolicy") || (key31 === "checks")) || (key31 === "cors"))){const err263 = {instancePath:instancePath+"/observability/health",schemaPath:"#/$defs/observability/properties/health/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key31},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err263];}else {vErrors.push(err263);}errors++;}}let data173 = data172.statusCodePolicy;if(typeof data173 !== "string"){const err264 = {instancePath:instancePath+"/observability/health/statusCodePolicy",schemaPath:"#/$defs/observability/properties/health/properties/statusCodePolicy/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err264];}else {vErrors.push(err264);}errors++;}if(!((data173 === "adr006") || (data173 === "always200"))){const err265 = {instancePath:instancePath+"/observability/health/statusCodePolicy",schemaPath:"#/$defs/observability/properties/health/properties/statusCodePolicy/enum",keyword:"enum",params:{allowedValues: schema82.properties.health.properties.statusCodePolicy.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err265];}else {vErrors.push(err265);}errors++;}if(data172.checks !== undefined){let data174 = data172.checks;if(Array.isArray(data174)){const len15 = data174.length;for(let i15=0; i15<len15; i15++){let data175 = data174[i15];if(data175 && typeof data175 == "object" && !Array.isArray(data175)){if(data175.severity === undefined){data175.severity = "critical";}if(data175.id === undefined){const err266 = {instancePath:instancePath+"/observability/health/checks/" + i15,schemaPath:"#/$defs/observability/properties/health/properties/checks/items/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err266];}else {vErrors.push(err266);}errors++;}if(data175.type === undefined){const err267 = {instancePath:instancePath+"/observability/health/checks/" + i15,schemaPath:"#/$defs/observability/properties/health/properties/checks/items/required",keyword:"required",params:{missingProperty: "type"},message:"must have required property '"+"type"+"'"};if(vErrors === null){vErrors = [err267];}else {vErrors.push(err267);}errors++;}for(const key32 in data175){if(!(((((key32 === "id") || (key32 === "type")) || (key32 === "severity")) || (key32 === "app")) || (key32 === "key"))){const err268 = {instancePath:instancePath+"/observability/health/checks/" + i15,schemaPath:"#/$defs/observability/properties/health/properties/checks/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key32},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err268];}else {vErrors.push(err268);}errors++;}}if(data175.id !== undefined){if(typeof data175.id !== "string"){const err269 = {instancePath:instancePath+"/observability/health/checks/" + i15+"/id",schemaPath:"#/$defs/observability/properties/health/properties/checks/items/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err269];}else {vErrors.push(err269);}errors++;}}if(data175.type !== undefined){let data177 = data175.type;if(typeof data177 !== "string"){const err270 = {instancePath:instancePath+"/observability/health/checks/" + i15+"/type",schemaPath:"#/$defs/observability/properties/health/properties/checks/items/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err270];}else {vErrors.push(err270);}errors++;}if(!(((((data177 === "database") || (data177 === "filesystem")) || (data177 === "appEnabled")) || (data177 === "appConfig")) || (data177 === "orAvailable"))){const err271 = {instancePath:instancePath+"/observability/health/checks/" + i15+"/type",schemaPath:"#/$defs/observability/properties/health/properties/checks/items/properties/type/enum",keyword:"enum",params:{allowedValues: schema82.properties.health.properties.checks.items.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err271];}else {vErrors.push(err271);}errors++;}}let data178 = data175.severity;if(typeof data178 !== "string"){const err272 = {instancePath:instancePath+"/observability/health/checks/" + i15+"/severity",schemaPath:"#/$defs/observability/properties/health/properties/checks/items/properties/severity/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err272];}else {vErrors.push(err272);}errors++;}if(!((data178 === "critical") || (data178 === "degraded"))){const err273 = {instancePath:instancePath+"/observability/health/checks/" + i15+"/severity",schemaPath:"#/$defs/observability/properties/health/properties/checks/items/properties/severity/enum",keyword:"enum",params:{allowedValues: schema82.properties.health.properties.checks.items.properties.severity.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err273];}else {vErrors.push(err273);}errors++;}if(data175.app !== undefined){if(typeof data175.app !== "string"){const err274 = {instancePath:instancePath+"/observability/health/checks/" + i15+"/app",schemaPath:"#/$defs/observability/properties/health/properties/checks/items/properties/app/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err274];}else {vErrors.push(err274);}errors++;}}if(data175.key !== undefined){if(typeof data175.key !== "string"){const err275 = {instancePath:instancePath+"/observability/health/checks/" + i15+"/key",schemaPath:"#/$defs/observability/properties/health/properties/checks/items/properties/key/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err275];}else {vErrors.push(err275);}errors++;}}}else {const err276 = {instancePath:instancePath+"/observability/health/checks/" + i15,schemaPath:"#/$defs/observability/properties/health/properties/checks/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err276];}else {vErrors.push(err276);}errors++;}}}else {const err277 = {instancePath:instancePath+"/observability/health/checks",schemaPath:"#/$defs/observability/properties/health/properties/checks/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err277];}else {vErrors.push(err277);}errors++;}}if(typeof data172.cors !== "boolean"){const err278 = {instancePath:instancePath+"/observability/health/cors",schemaPath:"#/$defs/observability/properties/health/properties/cors/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err278];}else {vErrors.push(err278);}errors++;}}else {const err279 = {instancePath:instancePath+"/observability/health",schemaPath:"#/$defs/observability/properties/health/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err279];}else {vErrors.push(err279);}errors++;}}if(data170.metrics !== undefined){let data182 = data170.metrics;if(Array.isArray(data182)){const len16 = data182.length;for(let i16=0; i16<len16; i16++){let data183 = data182[i16];if(data183 && typeof data183 == "object" && !Array.isArray(data183)){if(data183.name === undefined){const err280 = {instancePath:instancePath+"/observability/metrics/" + i16,schemaPath:"#/$defs/observability/properties/metrics/items/required",keyword:"required",params:{missingProperty: "name"},message:"must have required property '"+"name"+"'"};if(vErrors === null){vErrors = [err280];}else {vErrors.push(err280);}errors++;}if(data183.type === undefined){const err281 = {instancePath:instancePath+"/observability/metrics/" + i16,schemaPath:"#/$defs/observability/properties/metrics/items/required",keyword:"required",params:{missingProperty: "type"},message:"must have required property '"+"type"+"'"};if(vErrors === null){vErrors = [err281];}else {vErrors.push(err281);}errors++;}if(data183.source === undefined){const err282 = {instancePath:instancePath+"/observability/metrics/" + i16,schemaPath:"#/$defs/observability/properties/metrics/items/required",keyword:"required",params:{missingProperty: "source"},message:"must have required property '"+"source"+"'"};if(vErrors === null){vErrors = [err282];}else {vErrors.push(err282);}errors++;}for(const key33 in data183){if(!(((((key33 === "name") || (key33 === "type")) || (key33 === "help")) || (key33 === "cacheTtl")) || (key33 === "source"))){const err283 = {instancePath:instancePath+"/observability/metrics/" + i16,schemaPath:"#/$defs/observability/properties/metrics/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key33},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err283];}else {vErrors.push(err283);}errors++;}}if(data183.name !== undefined){if(typeof data183.name !== "string"){const err284 = {instancePath:instancePath+"/observability/metrics/" + i16+"/name",schemaPath:"#/$defs/observability/properties/metrics/items/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err284];}else {vErrors.push(err284);}errors++;}}if(data183.type !== undefined){let data185 = data183.type;if(typeof data185 !== "string"){const err285 = {instancePath:instancePath+"/observability/metrics/" + i16+"/type",schemaPath:"#/$defs/observability/properties/metrics/items/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err285];}else {vErrors.push(err285);}errors++;}if(!((data185 === "gauge") || (data185 === "counter"))){const err286 = {instancePath:instancePath+"/observability/metrics/" + i16+"/type",schemaPath:"#/$defs/observability/properties/metrics/items/properties/type/enum",keyword:"enum",params:{allowedValues: schema82.properties.metrics.items.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err286];}else {vErrors.push(err286);}errors++;}}if(data183.help !== undefined){if(typeof data183.help !== "string"){const err287 = {instancePath:instancePath+"/observability/metrics/" + i16+"/help",schemaPath:"#/$defs/observability/properties/metrics/items/properties/help/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err287];}else {vErrors.push(err287);}errors++;}}if(data183.cacheTtl !== undefined){let data187 = data183.cacheTtl;if(!((typeof data187 == "number") && (!(data187 % 1) && !isNaN(data187)))){const err288 = {instancePath:instancePath+"/observability/metrics/" + i16+"/cacheTtl",schemaPath:"#/$defs/observability/properties/metrics/items/properties/cacheTtl/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err288];}else {vErrors.push(err288);}errors++;}if(typeof data187 == "number"){if(data187 < 0 || isNaN(data187)){const err289 = {instancePath:instancePath+"/observability/metrics/" + i16+"/cacheTtl",schemaPath:"#/$defs/observability/properties/metrics/items/properties/cacheTtl/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err289];}else {vErrors.push(err289);}errors++;}}}if(data183.source !== undefined){let data188 = data183.source;if(data188 && typeof data188 == "object" && !Array.isArray(data188)){if(data188.kind === undefined){const err290 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/required",keyword:"required",params:{missingProperty: "kind"},message:"must have required property '"+"kind"+"'"};if(vErrors === null){vErrors = [err290];}else {vErrors.push(err290);}errors++;}for(const key34 in data188){if(!(func1.call(schema82.properties.metrics.items.properties.source.properties, key34))){const err291 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key34},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err291];}else {vErrors.push(err291);}errors++;}}if(data188.kind !== undefined){let data189 = data188.kind;if(typeof data189 !== "string"){const err292 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/kind",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/kind/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err292];}else {vErrors.push(err292);}errors++;}if(!(((((data189 === "tableCount") || (data189 === "objectCount")) || (data189 === "objectSum")) || (data189 === "appConfig")) || (data189 === "provider"))){const err293 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/kind",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/kind/enum",keyword:"enum",params:{allowedValues: schema82.properties.metrics.items.properties.source.properties.kind.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err293];}else {vErrors.push(err293);}errors++;}}if(data188.table !== undefined){if(typeof data188.table !== "string"){const err294 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/table",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/table/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err294];}else {vErrors.push(err294);}errors++;}}if(data188.register !== undefined){if(typeof data188.register !== "string"){const err295 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/register",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err295];}else {vErrors.push(err295);}errors++;}}if(data188.schema !== undefined){if(typeof data188.schema !== "string"){const err296 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/schema",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err296];}else {vErrors.push(err296);}errors++;}}if(data188.field !== undefined){if(typeof data188.field !== "string"){const err297 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/field",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/field/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err297];}else {vErrors.push(err297);}errors++;}}if(data188.groupBy !== undefined){let data194 = data188.groupBy;if(Array.isArray(data194)){const len17 = data194.length;for(let i17=0; i17<len17; i17++){if(typeof data194[i17] !== "string"){const err298 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/groupBy/" + i17,schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/groupBy/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err298];}else {vErrors.push(err298);}errors++;}}}else {const err299 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/groupBy",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/groupBy/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err299];}else {vErrors.push(err299);}errors++;}}if(data188.labelMap !== undefined){let data196 = data188.labelMap;if(data196 && typeof data196 == "object" && !Array.isArray(data196)){for(const key35 in data196){if(typeof data196[key35] !== "string"){const err300 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/labelMap/" + key35.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/labelMap/additionalProperties/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err300];}else {vErrors.push(err300);}errors++;}}}else {const err301 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/labelMap",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/labelMap/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err301];}else {vErrors.push(err301);}errors++;}}if(data188.labelDefaults !== undefined){let data198 = data188.labelDefaults;if(data198 && typeof data198 == "object" && !Array.isArray(data198)){for(const key36 in data198){let data199 = data198[key36];if(((typeof data199 !== "string") && (!(typeof data199 == "number"))) && (typeof data199 !== "boolean")){const err302 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/labelDefaults/" + key36.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/labelDefaults/additionalProperties/type",keyword:"type",params:{type: schema82.properties.metrics.items.properties.source.properties.labelDefaults.additionalProperties.type},message:"must be string,number,boolean"};if(vErrors === null){vErrors = [err302];}else {vErrors.push(err302);}errors++;}}}else {const err303 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/labelDefaults",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/labelDefaults/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err303];}else {vErrors.push(err303);}errors++;}}if(data188.filter !== undefined){let data200 = data188.filter;if(data200 && typeof data200 == "object" && !Array.isArray(data200));else {const err304 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/filter",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/filter/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err304];}else {vErrors.push(err304);}errors++;}}if(data188.key !== undefined){if(typeof data188.key !== "string"){const err305 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/key",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/key/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err305];}else {vErrors.push(err305);}errors++;}}if(data188.id !== undefined){if(typeof data188.id !== "string"){const err306 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/id",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err306];}else {vErrors.push(err306);}errors++;}}}else {const err307 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err307];}else {vErrors.push(err307);}errors++;}}}else {const err308 = {instancePath:instancePath+"/observability/metrics/" + i16,schemaPath:"#/$defs/observability/properties/metrics/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err308];}else {vErrors.push(err308);}errors++;}}}else {const err309 = {instancePath:instancePath+"/observability/metrics",schemaPath:"#/$defs/observability/properties/metrics/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err309];}else {vErrors.push(err309);}errors++;}}}else {const err310 = {instancePath:instancePath+"/observability",schemaPath:"#/$defs/observability/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err310];}else {vErrors.push(err310);}errors++;}}if(data.store !== undefined){let data203 = data.store;const _errs484 = errors;let valid92 = false;const _errs485 = errors;if(data203 && typeof data203 == "object" && !Array.isArray(data203)){if(data203.schema === undefined){const err311 = {instancePath:instancePath+"/store",schemaPath:"#/properties/store/anyOf/0/required",keyword:"required",params:{missingProperty: "schema"},message:"must have required property '"+"schema"+"'"};if(vErrors === null){vErrors = [err311];}else {vErrors.push(err311);}errors++;}}var _valid5 = _errs485 === errors;valid92 = valid92 || _valid5;const _errs486 = errors;if(data203 && typeof data203 == "object" && !Array.isArray(data203)){if(data203.types === undefined){const err312 = {instancePath:instancePath+"/store",schemaPath:"#/properties/store/anyOf/1/required",keyword:"required",params:{missingProperty: "types"},message:"must have required property '"+"types"+"'"};if(vErrors === null){vErrors = [err312];}else {vErrors.push(err312);}errors++;}}var _valid5 = _errs486 === errors;valid92 = valid92 || _valid5;if(!valid92){const err313 = {instancePath:instancePath+"/store",schemaPath:"#/properties/store/anyOf",keyword:"anyOf",params:{},message:"must match a schema in anyOf"};if(vErrors === null){vErrors = [err313];}else {vErrors.push(err313);}errors++;}else {errors = _errs484;if(vErrors !== null){if(_errs484){vErrors.length = _errs484;}else {vErrors = null;}}}if(data203 && typeof data203 == "object" && !Array.isArray(data203)){for(const key37 in data203){if(!(func1.call(schema31.properties.store.properties, key37))){const err314 = {instancePath:instancePath+"/store",schemaPath:"#/properties/store/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key37},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err314];}else {vErrors.push(err314);}errors++;}}if(data203.schema !== undefined){if(typeof data203.schema !== "string"){const err315 = {instancePath:instancePath+"/store/schema",schemaPath:"#/properties/store/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err315];}else {vErrors.push(err315);}errors++;}}if(data203.register !== undefined){if(typeof data203.register !== "string"){const err316 = {instancePath:instancePath+"/store/register",schemaPath:"#/properties/store/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err316];}else {vErrors.push(err316);}errors++;}}if(data203.localRegister !== undefined){if(typeof data203.localRegister !== "string"){const err317 = {instancePath:instancePath+"/store/localRegister",schemaPath:"#/properties/store/properties/localRegister/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err317];}else {vErrors.push(err317);}errors++;}}if(data203.installable !== undefined){let data207 = data203.installable;if(Array.isArray(data207)){const len18 = data207.length;for(let i18=0; i18<len18; i18++){if(typeof data207[i18] !== "string"){const err318 = {instancePath:instancePath+"/store/installable/" + i18,schemaPath:"#/properties/store/properties/installable/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err318];}else {vErrors.push(err318);}errors++;}}}else {const err319 = {instancePath:instancePath+"/store/installable",schemaPath:"#/properties/store/properties/installable/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err319];}else {vErrors.push(err319);}errors++;}}if(data203.kinds !== undefined){let data209 = data203.kinds;if(Array.isArray(data209)){const len19 = data209.length;for(let i19=0; i19<len19; i19++){if(typeof data209[i19] !== "string"){const err320 = {instancePath:instancePath+"/store/kinds/" + i19,schemaPath:"#/properties/store/properties/kinds/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err320];}else {vErrors.push(err320);}errors++;}}}else {const err321 = {instancePath:instancePath+"/store/kinds",schemaPath:"#/properties/store/properties/kinds/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err321];}else {vErrors.push(err321);}errors++;}}if(data203.types !== undefined){let data211 = data203.types;if(Array.isArray(data211)){const len20 = data211.length;for(let i20=0; i20<len20; i20++){if(typeof data211[i20] !== "string"){const err322 = {instancePath:instancePath+"/store/types/" + i20,schemaPath:"#/properties/store/properties/types/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err322];}else {vErrors.push(err322);}errors++;}}}else {const err323 = {instancePath:instancePath+"/store/types",schemaPath:"#/properties/store/properties/types/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err323];}else {vErrors.push(err323);}errors++;}}if(data203.cardFields !== undefined){let data213 = data203.cardFields;if(data213 && typeof data213 == "object" && !Array.isArray(data213)){for(const key38 in data213){if(typeof data213[key38] !== "string"){const err324 = {instancePath:instancePath+"/store/cardFields/" + key38.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/properties/store/properties/cardFields/additionalProperties/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err324];}else {vErrors.push(err324);}errors++;}}}else {const err325 = {instancePath:instancePath+"/store/cardFields",schemaPath:"#/properties/store/properties/cardFields/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err325];}else {vErrors.push(err325);}errors++;}}if(data203.builtIn !== undefined){let data215 = data203.builtIn;if(Array.isArray(data215)){const len21 = data215.length;for(let i21=0; i21<len21; i21++){let data216 = data215[i21];if(data216 && typeof data216 == "object" && !Array.isArray(data216)){if(data216.slug === undefined){const err326 = {instancePath:instancePath+"/store/builtIn/" + i21,schemaPath:"#/properties/store/properties/builtIn/items/required",keyword:"required",params:{missingProperty: "slug"},message:"must have required property '"+"slug"+"'"};if(vErrors === null){vErrors = [err326];}else {vErrors.push(err326);}errors++;}if(data216.title === undefined){const err327 = {instancePath:instancePath+"/store/builtIn/" + i21,schemaPath:"#/properties/store/properties/builtIn/items/required",keyword:"required",params:{missingProperty: "title"},message:"must have required property '"+"title"+"'"};if(vErrors === null){vErrors = [err327];}else {vErrors.push(err327);}errors++;}for(const key39 in data216){if(!((((key39 === "slug") || (key39 === "title")) || (key39 === "description")) || (key39 === "kind"))){const err328 = {instancePath:instancePath+"/store/builtIn/" + i21,schemaPath:"#/properties/store/properties/builtIn/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key39},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err328];}else {vErrors.push(err328);}errors++;}}if(data216.slug !== undefined){if(typeof data216.slug !== "string"){const err329 = {instancePath:instancePath+"/store/builtIn/" + i21+"/slug",schemaPath:"#/properties/store/properties/builtIn/items/properties/slug/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err329];}else {vErrors.push(err329);}errors++;}}if(data216.title !== undefined){if(typeof data216.title !== "string"){const err330 = {instancePath:instancePath+"/store/builtIn/" + i21+"/title",schemaPath:"#/properties/store/properties/builtIn/items/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err330];}else {vErrors.push(err330);}errors++;}}if(data216.description !== undefined){if(typeof data216.description !== "string"){const err331 = {instancePath:instancePath+"/store/builtIn/" + i21+"/description",schemaPath:"#/properties/store/properties/builtIn/items/properties/description/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err331];}else {vErrors.push(err331);}errors++;}}if(data216.kind !== undefined){if(typeof data216.kind !== "string"){const err332 = {instancePath:instancePath+"/store/builtIn/" + i21+"/kind",schemaPath:"#/properties/store/properties/builtIn/items/properties/kind/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err332];}else {vErrors.push(err332);}errors++;}}}else {const err333 = {instancePath:instancePath+"/store/builtIn/" + i21,schemaPath:"#/properties/store/properties/builtIn/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err333];}else {vErrors.push(err333);}errors++;}}}else {const err334 = {instancePath:instancePath+"/store/builtIn",schemaPath:"#/properties/store/properties/builtIn/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err334];}else {vErrors.push(err334);}errors++;}}if(data203._note !== undefined){if(typeof data203._note !== "string"){const err335 = {instancePath:instancePath+"/store/_note",schemaPath:"#/properties/store/properties/_note/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err335];}else {vErrors.push(err335);}errors++;}}}else {const err336 = {instancePath:instancePath+"/store",schemaPath:"#/properties/store/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err336];}else {vErrors.push(err336);}errors++;}}if(data.deepLinks !== undefined){let data222 = data.deepLinks;if(Array.isArray(data222)){const len22 = data222.length;for(let i22=0; i22<len22; i22++){let data223 = data222[i22];if(data223 && typeof data223 == "object" && !Array.isArray(data223)){if(data223.registerSlug === undefined){const err337 = {instancePath:instancePath+"/deepLinks/" + i22,schemaPath:"#/$defs/deepLink/required",keyword:"required",params:{missingProperty: "registerSlug"},message:"must have required property '"+"registerSlug"+"'"};if(vErrors === null){vErrors = [err337];}else {vErrors.push(err337);}errors++;}if(data223.schemaSlug === undefined){const err338 = {instancePath:instancePath+"/deepLinks/" + i22,schemaPath:"#/$defs/deepLink/required",keyword:"required",params:{missingProperty: "schemaSlug"},message:"must have required property '"+"schemaSlug"+"'"};if(vErrors === null){vErrors = [err338];}else {vErrors.push(err338);}errors++;}if(data223.urlTemplate === undefined){const err339 = {instancePath:instancePath+"/deepLinks/" + i22,schemaPath:"#/$defs/deepLink/required",keyword:"required",params:{missingProperty: "urlTemplate"},message:"must have required property '"+"urlTemplate"+"'"};if(vErrors === null){vErrors = [err339];}else {vErrors.push(err339);}errors++;}if(data223.registerSlug !== undefined){if(typeof data223.registerSlug !== "string"){const err340 = {instancePath:instancePath+"/deepLinks/" + i22+"/registerSlug",schemaPath:"#/$defs/deepLink/properties/registerSlug/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err340];}else {vErrors.push(err340);}errors++;}}if(data223.schemaSlug !== undefined){if(typeof data223.schemaSlug !== "string"){const err341 = {instancePath:instancePath+"/deepLinks/" + i22+"/schemaSlug",schemaPath:"#/$defs/deepLink/properties/schemaSlug/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err341];}else {vErrors.push(err341);}errors++;}}if(data223.urlTemplate !== undefined){if(typeof data223.urlTemplate !== "string"){const err342 = {instancePath:instancePath+"/deepLinks/" + i22+"/urlTemplate",schemaPath:"#/$defs/deepLink/properties/urlTemplate/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err342];}else {vErrors.push(err342);}errors++;}}if(data223.displayName !== undefined){if(typeof data223.displayName !== "string"){const err343 = {instancePath:instancePath+"/deepLinks/" + i22+"/displayName",schemaPath:"#/$defs/deepLink/properties/displayName/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err343];}else {vErrors.push(err343);}errors++;}}}else {const err344 = {instancePath:instancePath+"/deepLinks/" + i22,schemaPath:"#/$defs/deepLink/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err344];}else {vErrors.push(err344);}errors++;}}}else {const err345 = {instancePath:instancePath+"/deepLinks",schemaPath:"#/properties/deepLinks/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err345];}else {vErrors.push(err345);}errors++;}}if(data.pageTemplates !== undefined){let data228 = data.pageTemplates;if(Array.isArray(data228)){const len23 = data228.length;for(let i23=0; i23<len23; i23++){let data229 = data228[i23];if(data229 && typeof data229 == "object" && !Array.isArray(data229)){if(data229.id === undefined){const err346 = {instancePath:instancePath+"/pageTemplates/" + i23,schemaPath:"#/$defs/pageTemplate/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err346];}else {vErrors.push(err346);}errors++;}if(data229.page === undefined){const err347 = {instancePath:instancePath+"/pageTemplates/" + i23,schemaPath:"#/$defs/pageTemplate/required",keyword:"required",params:{missingProperty: "page"},message:"must have required property '"+"page"+"'"};if(vErrors === null){vErrors = [err347];}else {vErrors.push(err347);}errors++;}for(const key40 in data229){if(!((((key40 === "id") || (key40 === "_note")) || (key40 === "params")) || (key40 === "page"))){const err348 = {instancePath:instancePath+"/pageTemplates/" + i23,schemaPath:"#/$defs/pageTemplate/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key40},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err348];}else {vErrors.push(err348);}errors++;}}if(data229.id !== undefined){if(typeof data229.id !== "string"){const err349 = {instancePath:instancePath+"/pageTemplates/" + i23+"/id",schemaPath:"#/$defs/pageTemplate/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err349];}else {vErrors.push(err349);}errors++;}}if(data229._note !== undefined){if(typeof data229._note !== "string"){const err350 = {instancePath:instancePath+"/pageTemplates/" + i23+"/_note",schemaPath:"#/$defs/pageTemplate/properties/_note/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err350];}else {vErrors.push(err350);}errors++;}}if(data229.params !== undefined){let data232 = data229.params;if(Array.isArray(data232)){const len24 = data232.length;for(let i24=0; i24<len24; i24++){let data233 = data232[i24];if(data233 && typeof data233 == "object" && !Array.isArray(data233)){if(data233.required === undefined){data233.required = false;}if(data233.name === undefined){const err351 = {instancePath:instancePath+"/pageTemplates/" + i23+"/params/" + i24,schemaPath:"#/$defs/pageTemplate/properties/params/items/required",keyword:"required",params:{missingProperty: "name"},message:"must have required property '"+"name"+"'"};if(vErrors === null){vErrors = [err351];}else {vErrors.push(err351);}errors++;}for(const key41 in data233){if(!(((key41 === "name") || (key41 === "required")) || (key41 === "description"))){const err352 = {instancePath:instancePath+"/pageTemplates/" + i23+"/params/" + i24,schemaPath:"#/$defs/pageTemplate/properties/params/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key41},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err352];}else {vErrors.push(err352);}errors++;}}if(data233.name !== undefined){if(typeof data233.name !== "string"){const err353 = {instancePath:instancePath+"/pageTemplates/" + i23+"/params/" + i24+"/name",schemaPath:"#/$defs/pageTemplate/properties/params/items/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err353];}else {vErrors.push(err353);}errors++;}}if(typeof data233.required !== "boolean"){const err354 = {instancePath:instancePath+"/pageTemplates/" + i23+"/params/" + i24+"/required",schemaPath:"#/$defs/pageTemplate/properties/params/items/properties/required/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err354];}else {vErrors.push(err354);}errors++;}if(data233.description !== undefined){if(typeof data233.description !== "string"){const err355 = {instancePath:instancePath+"/pageTemplates/" + i23+"/params/" + i24+"/description",schemaPath:"#/$defs/pageTemplate/properties/params/items/properties/description/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err355];}else {vErrors.push(err355);}errors++;}}}else {const err356 = {instancePath:instancePath+"/pageTemplates/" + i23+"/params/" + i24,schemaPath:"#/$defs/pageTemplate/properties/params/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err356];}else {vErrors.push(err356);}errors++;}}}else {const err357 = {instancePath:instancePath+"/pageTemplates/" + i23+"/params",schemaPath:"#/$defs/pageTemplate/properties/params/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err357];}else {vErrors.push(err357);}errors++;}}if(data229.page !== undefined){let data237 = data229.page;if(!(data237 && typeof data237 == "object" && !Array.isArray(data237))){const err358 = {instancePath:instancePath+"/pageTemplates/" + i23+"/page",schemaPath:"#/$defs/pageTemplate/properties/page/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err358];}else {vErrors.push(err358);}errors++;}}}else {const err359 = {instancePath:instancePath+"/pageTemplates/" + i23,schemaPath:"#/$defs/pageTemplate/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err359];}else {vErrors.push(err359);}errors++;}}}else {const err360 = {instancePath:instancePath+"/pageTemplates",schemaPath:"#/properties/pageTemplates/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err360];}else {vErrors.push(err360);}errors++;}}if(data.pageInstances !== undefined){let data238 = data.pageInstances;if(Array.isArray(data238)){const len25 = data238.length;for(let i25=0; i25<len25; i25++){let data239 = data238[i25];if(data239 && typeof data239 == "object" && !Array.isArray(data239)){if(data239.templateRef === undefined){const err361 = {instancePath:instancePath+"/pageInstances/" + i25,schemaPath:"#/$defs/pageInstance/required",keyword:"required",params:{missingProperty: "templateRef"},message:"must have required property '"+"templateRef"+"'"};if(vErrors === null){vErrors = [err361];}else {vErrors.push(err361);}errors++;}for(const key42 in data239){if(!((((((key42 === "templateRef") || (key42 === "register")) || (key42 === "schema")) || (key42 === "label")) || (key42 === "params")) || (key42 === "override"))){const err362 = {instancePath:instancePath+"/pageInstances/" + i25,schemaPath:"#/$defs/pageInstance/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key42},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err362];}else {vErrors.push(err362);}errors++;}}if(data239.templateRef !== undefined){if(typeof data239.templateRef !== "string"){const err363 = {instancePath:instancePath+"/pageInstances/" + i25+"/templateRef",schemaPath:"#/$defs/pageInstance/properties/templateRef/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err363];}else {vErrors.push(err363);}errors++;}}if(data239.register !== undefined){if(typeof data239.register !== "string"){const err364 = {instancePath:instancePath+"/pageInstances/" + i25+"/register",schemaPath:"#/$defs/pageInstance/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err364];}else {vErrors.push(err364);}errors++;}}if(data239.schema !== undefined){if(typeof data239.schema !== "string"){const err365 = {instancePath:instancePath+"/pageInstances/" + i25+"/schema",schemaPath:"#/$defs/pageInstance/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err365];}else {vErrors.push(err365);}errors++;}}if(data239.label !== undefined){if(typeof data239.label !== "string"){const err366 = {instancePath:instancePath+"/pageInstances/" + i25+"/label",schemaPath:"#/$defs/pageInstance/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err366];}else {vErrors.push(err366);}errors++;}}if(data239.params !== undefined){let data244 = data239.params;if(data244 && typeof data244 == "object" && !Array.isArray(data244));else {const err367 = {instancePath:instancePath+"/pageInstances/" + i25+"/params",schemaPath:"#/$defs/pageInstance/properties/params/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err367];}else {vErrors.push(err367);}errors++;}}if(data239.override !== undefined){let data245 = data239.override;if(data245 && typeof data245 == "object" && !Array.isArray(data245));else {const err368 = {instancePath:instancePath+"/pageInstances/" + i25+"/override",schemaPath:"#/$defs/pageInstance/properties/override/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err368];}else {vErrors.push(err368);}errors++;}}}else {const err369 = {instancePath:instancePath+"/pageInstances/" + i25,schemaPath:"#/$defs/pageInstance/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err369];}else {vErrors.push(err369);}errors++;}}}else {const err370 = {instancePath:instancePath+"/pageInstances",schemaPath:"#/properties/pageInstances/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err370];}else {vErrors.push(err370);}errors++;}}if(data.sets !== undefined){let data246 = data.sets;if(data246 && typeof data246 == "object" && !Array.isArray(data246));else {const err371 = {instancePath:instancePath+"/sets",schemaPath:"#/properties/sets/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err371];}else {vErrors.push(err371);}errors++;}}if(data.mcp !== undefined){let data247 = data.mcp;if(data247 && typeof data247 == "object" && !Array.isArray(data247)){if(data247.expose === undefined){data247.expose = false;}for(const key43 in data247){if(!(((key43 === "expose") || (key43 === "pageTools")) || (key43 === "agentHints"))){const err372 = {instancePath:instancePath+"/mcp",schemaPath:"#/properties/mcp/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key43},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err372];}else {vErrors.push(err372);}errors++;}}if(typeof data247.expose !== "boolean"){const err373 = {instancePath:instancePath+"/mcp/expose",schemaPath:"#/properties/mcp/properties/expose/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err373];}else {vErrors.push(err373);}errors++;}if(data247.pageTools !== undefined){let data249 = data247.pageTools;if(data249 && typeof data249 == "object" && !Array.isArray(data249)){for(const key44 in data249){let data250 = data249[key44];if(Array.isArray(data250)){const len26 = data250.length;for(let i26=0; i26<len26; i26++){let data251 = data250[i26];if(typeof data251 === "string"){if(!pattern28.test(data251)){const err374 = {instancePath:instancePath+"/mcp/pageTools/" + key44.replace(/~/g, "~0").replace(/\//g, "~1")+"/" + i26,schemaPath:"#/properties/mcp/properties/pageTools/additionalProperties/items/pattern",keyword:"pattern",params:{pattern: "^[a-z0-9_-]+\\.[a-zA-Z0-9_-]+\\.(search|get|create|update|delete)$"},message:"must match pattern \""+"^[a-z0-9_-]+\\.[a-zA-Z0-9_-]+\\.(search|get|create|update|delete)$"+"\""};if(vErrors === null){vErrors = [err374];}else {vErrors.push(err374);}errors++;}}else {const err375 = {instancePath:instancePath+"/mcp/pageTools/" + key44.replace(/~/g, "~0").replace(/\//g, "~1")+"/" + i26,schemaPath:"#/properties/mcp/properties/pageTools/additionalProperties/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err375];}else {vErrors.push(err375);}errors++;}}}else {const err376 = {instancePath:instancePath+"/mcp/pageTools/" + key44.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/properties/mcp/properties/pageTools/additionalProperties/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err376];}else {vErrors.push(err376);}errors++;}}}else {const err377 = {instancePath:instancePath+"/mcp/pageTools",schemaPath:"#/properties/mcp/properties/pageTools/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err377];}else {vErrors.push(err377);}errors++;}}if(data247.agentHints !== undefined){let data252 = data247.agentHints;if(data252 && typeof data252 == "object" && !Array.isArray(data252)){if(data252.summary !== undefined){if(typeof data252.summary !== "string"){const err378 = {instancePath:instancePath+"/mcp/agentHints/summary",schemaPath:"#/properties/mcp/properties/agentHints/properties/summary/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err378];}else {vErrors.push(err378);}errors++;}}if(data252.defaultTools !== undefined){let data254 = data252.defaultTools;if(Array.isArray(data254)){const len27 = data254.length;for(let i27=0; i27<len27; i27++){if(typeof data254[i27] !== "string"){const err379 = {instancePath:instancePath+"/mcp/agentHints/defaultTools/" + i27,schemaPath:"#/properties/mcp/properties/agentHints/properties/defaultTools/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err379];}else {vErrors.push(err379);}errors++;}}}else {const err380 = {instancePath:instancePath+"/mcp/agentHints/defaultTools",schemaPath:"#/properties/mcp/properties/agentHints/properties/defaultTools/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err380];}else {vErrors.push(err380);}errors++;}}if(data252.keywords !== undefined){let data256 = data252.keywords;if(Array.isArray(data256)){const len28 = data256.length;for(let i28=0; i28<len28; i28++){if(typeof data256[i28] !== "string"){const err381 = {instancePath:instancePath+"/mcp/agentHints/keywords/" + i28,schemaPath:"#/properties/mcp/properties/agentHints/properties/keywords/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err381];}else {vErrors.push(err381);}errors++;}}}else {const err382 = {instancePath:instancePath+"/mcp/agentHints/keywords",schemaPath:"#/properties/mcp/properties/agentHints/properties/keywords/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err382];}else {vErrors.push(err382);}errors++;}}}else {const err383 = {instancePath:instancePath+"/mcp/agentHints",schemaPath:"#/properties/mcp/properties/agentHints/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err383];}else {vErrors.push(err383);}errors++;}}}else {const err384 = {instancePath:instancePath+"/mcp",schemaPath:"#/properties/mcp/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err384];}else {vErrors.push(err384);}errors++;}}}else {const err385 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err385];}else {vErrors.push(err385);}errors++;}validate20.errors = vErrors;return errors === 0;}validate20.evaluated = {"props":true,"dynamicProps":false,"dynamicItems":false};
|
|
9
|
+
};})();const pattern4 = new RegExp("^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$", "u");const pattern5 = new RegExp("^[a-z0-9]+(?:-[a-z0-9]+)*$", "u");const pattern27 = new RegExp("^[a-z0-9]+:[a-z0-9-]+$", "u");const pattern28 = new RegExp("^[a-z0-9_-]+\\.[a-zA-Z0-9_-]+\\.(search|get|create|update|delete)$", "u");const schema39 = {"type":"object","required":["id","label"],"additionalProperties":false,"description":"A top-level navigation entry. May contain one level of nested children.","properties":{"id":{"type":"string","description":"Unique identifier for this menu entry. Sentinels (@resolve:*) are NOT allowed — this is a router invariant."},"label":{"type":"string","description":"i18n translation key resolved by the consuming app's t() function at render time."},"icon":{"type":"string","description":"CSS class for the icon (e.g. 'icon-checkmark') or MDI component name."},"route":{"type":"string","description":"Vue-router route name (matches a pages[].id) that this entry navigates to. Sentinels (@resolve:*) are NOT allowed — this is a router invariant."},"query":{"type":"object","additionalProperties":{"type":["string","number","boolean"]},"description":"Optional vue-router query parameters merged into the target route link (e.g. a filter like { caseType: '<uuid>' }). Deep-links a nav entry to a pre-filtered index page."},"order":{"type":"integer","description":"Display order in the menu. Items without an order render last."},"permission":{"type":"string","description":"Permission string the user must hold for this entry to render."},"section":{"type":"string","enum":["main","footer","settings","integrations"],"default":"main","description":"Where the entry renders inside CnAppNav. 'main' (default) places it in the top list. 'footer' pins the entry to the bottom as a flat item above the settings foldout. 'settings' places it inside the NcAppNavigationSettings gear-icon foldout. 'integrations' renders the entry NOT in the navigation at all but in the Integrations section at the bottom of the per-user settings modal — the destination for links that leave this app for another (ADR-110). An 'integrations' entry MUST be clickable (href); a group with children is meaningless there."},"type":{"type":"string","enum":["item","caption"],"default":"item","description":"Render kind. 'item' (default) renders a clickable NcAppNavigationItem. 'caption' renders an NcAppNavigationCaption section divider — only label, id, order, and section are honoured."},"count":{"oneOf":[{"type":"integer","minimum":0},{"type":"string","enum":["auto"]}],"description":"Counter badge in the entry's #counter slot. Positive integer renders as-is; 'auto' resolves from cnMenuCounts (populated by CnAppRoot from useObjectStore totals) for the entry's resolved index-type page (register + schema)."},"pinned":{"type":"boolean","default":false,"description":"Forwarded to NcAppNavigationItem's pinned prop. NC bottom-pins pinned items inside the parent list region."},"open":{"type":"boolean","default":false,"description":"Initial expansion state for a parent entry with children. When true and children[] is non-empty, the parent renders with :open=\"true\" so children are visible on mount."},"href":{"type":"string","description":"External URL. When set, the entry opens the URL in a new tab instead of dispatching a vue-router navigation."},"action":{"type":"string","enum":["user-settings","admin-settings","replay-walkthrough"],"description":"Built-in action to invoke when the entry is clicked. Closed enum. 'admin-settings' opens the app-level admin-settings dialog (distinct from the per-user settings dialog). 'replay-walkthrough' re-runs the product walkthrough (ADR-043), optionally for a specific tourId."},"tourId":{"type":"string","description":"Tour id for the 'replay-walkthrough' action (ADR-043); replays that tour from its first step. Omit to replay the default tour."},"visibleIf":{"$ref":"#/$defs/visibleIfCondition","description":"Optional display condition evaluated at render time."},"dynamicSource":{"$ref":"#/$defs/dynamicSource","description":"Optional dynamic source for populating nested menu items from a data endpoint. Carry-forward from v1.3.0."},"children":{"type":"array","items":{"$ref":"#/$defs/menuItemLeaf"},"description":"Nested entries. Only one level of nesting is supported."}}};const schema41 = {"type":"object","description":"Dynamic source configuration for populating menu items from a backend endpoint. Carry-forward from v1.3.0 — identical shape to v1.","additionalProperties":true,"properties":{"url":{"type":"string","description":"URL to fetch menu items from."},"method":{"type":"string","enum":["GET","POST"],"default":"GET","description":"HTTP method for the fetch."},"labelField":{"type":"string","description":"Property name in the response items to use as the menu entry label."},"idField":{"type":"string","description":"Property name in the response items to use as the menu entry id."},"routeField":{"type":"string","description":"Property name in the response items to use as the menu entry route."}}};const func6 = ucs2length.default;const schema42 = {"type":"object","required":["id","label"],"additionalProperties":false,"description":"A nested menu entry. Has no further children.","properties":{"id":{"type":"string"},"label":{"type":"string"},"icon":{"type":"string"},"route":{"type":"string"},"query":{"type":"object","additionalProperties":{"type":["string","number","boolean"]},"description":"Optional vue-router query parameters merged into the target route link (e.g. a filter like { caseType: '<uuid>' }). Deep-links a nav entry to a pre-filtered index page."},"order":{"type":"integer"},"permission":{"type":"string"},"section":{"type":"string","enum":["main","footer","settings","integrations"],"default":"main"},"type":{"type":"string","enum":["item","caption"],"default":"item"},"count":{"oneOf":[{"type":"integer","minimum":0},{"type":"string","enum":["auto"]}]},"pinned":{"type":"boolean","default":false},"href":{"type":"string"},"action":{"type":"string","enum":["user-settings","admin-settings","replay-walkthrough"]},"tourId":{"type":"string","description":"Tour id for the 'replay-walkthrough' action (ADR-043)."},"visibleIf":{"$ref":"#/$defs/visibleIfCondition"}}};function validate22(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate22.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}if(data && typeof data == "object" && !Array.isArray(data)){if(data.section === undefined){data.section = "main";}if(data.type === undefined){data.type = "item";}if(data.pinned === undefined){data.pinned = false;}if(data.id === undefined){const err0 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}if(data.label === undefined){const err1 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}for(const key0 in data){if(!(func1.call(schema42.properties, key0))){const err2 = {instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}}if(data.id !== undefined){if(typeof data.id !== "string"){const err3 = {instancePath:instancePath+"/id",schemaPath:"#/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}}if(data.label !== undefined){if(typeof data.label !== "string"){const err4 = {instancePath:instancePath+"/label",schemaPath:"#/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}}if(data.icon !== undefined){if(typeof data.icon !== "string"){const err5 = {instancePath:instancePath+"/icon",schemaPath:"#/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}if(data.route !== undefined){if(typeof data.route !== "string"){const err6 = {instancePath:instancePath+"/route",schemaPath:"#/properties/route/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}}if(data.query !== undefined){let data4 = data.query;if(data4 && typeof data4 == "object" && !Array.isArray(data4)){for(const key1 in data4){let data5 = data4[key1];if(((typeof data5 !== "string") && (!(typeof data5 == "number"))) && (typeof data5 !== "boolean")){const err7 = {instancePath:instancePath+"/query/" + key1.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/properties/query/additionalProperties/type",keyword:"type",params:{type: schema42.properties.query.additionalProperties.type},message:"must be string,number,boolean"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}}}else {const err8 = {instancePath:instancePath+"/query",schemaPath:"#/properties/query/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}}if(data.order !== undefined){let data6 = data.order;if(!((typeof data6 == "number") && (!(data6 % 1) && !isNaN(data6)))){const err9 = {instancePath:instancePath+"/order",schemaPath:"#/properties/order/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}}if(data.permission !== undefined){if(typeof data.permission !== "string"){const err10 = {instancePath:instancePath+"/permission",schemaPath:"#/properties/permission/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}}let data8 = data.section;if(typeof data8 !== "string"){const err11 = {instancePath:instancePath+"/section",schemaPath:"#/properties/section/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}if(!((((data8 === "main") || (data8 === "footer")) || (data8 === "settings")) || (data8 === "integrations"))){const err12 = {instancePath:instancePath+"/section",schemaPath:"#/properties/section/enum",keyword:"enum",params:{allowedValues: schema42.properties.section.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}let data9 = data.type;if(typeof data9 !== "string"){const err13 = {instancePath:instancePath+"/type",schemaPath:"#/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}if(!((data9 === "item") || (data9 === "caption"))){const err14 = {instancePath:instancePath+"/type",schemaPath:"#/properties/type/enum",keyword:"enum",params:{allowedValues: schema42.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}if(data.count !== undefined){let data10 = data.count;const _errs24 = errors;let valid2 = false;let passing0 = null;const _errs25 = errors;if(!((typeof data10 == "number") && (!(data10 % 1) && !isNaN(data10)))){const err15 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/0/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}if(typeof data10 == "number"){if(data10 < 0 || isNaN(data10)){const err16 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/0/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err16];}else {vErrors.push(err16);}errors++;}}var _valid0 = _errs25 === errors;if(_valid0){valid2 = true;passing0 = 0;}const _errs27 = errors;if(typeof data10 !== "string"){const err17 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/1/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err17];}else {vErrors.push(err17);}errors++;}if(!(data10 === "auto")){const err18 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/1/enum",keyword:"enum",params:{allowedValues: schema42.properties.count.oneOf[1].enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err18];}else {vErrors.push(err18);}errors++;}var _valid0 = _errs27 === errors;if(_valid0 && valid2){valid2 = false;passing0 = [passing0, 1];}else {if(_valid0){valid2 = true;passing0 = 1;}}if(!valid2){const err19 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf",keyword:"oneOf",params:{passingSchemas: passing0},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err19];}else {vErrors.push(err19);}errors++;}else {errors = _errs24;if(vErrors !== null){if(_errs24){vErrors.length = _errs24;}else {vErrors = null;}}}}if(typeof data.pinned !== "boolean"){const err20 = {instancePath:instancePath+"/pinned",schemaPath:"#/properties/pinned/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err20];}else {vErrors.push(err20);}errors++;}if(data.href !== undefined){if(typeof data.href !== "string"){const err21 = {instancePath:instancePath+"/href",schemaPath:"#/properties/href/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err21];}else {vErrors.push(err21);}errors++;}}if(data.action !== undefined){let data13 = data.action;if(typeof data13 !== "string"){const err22 = {instancePath:instancePath+"/action",schemaPath:"#/properties/action/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err22];}else {vErrors.push(err22);}errors++;}if(!(((data13 === "user-settings") || (data13 === "admin-settings")) || (data13 === "replay-walkthrough"))){const err23 = {instancePath:instancePath+"/action",schemaPath:"#/properties/action/enum",keyword:"enum",params:{allowedValues: schema42.properties.action.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err23];}else {vErrors.push(err23);}errors++;}}if(data.tourId !== undefined){if(typeof data.tourId !== "string"){const err24 = {instancePath:instancePath+"/tourId",schemaPath:"#/properties/tourId/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err24];}else {vErrors.push(err24);}errors++;}}if(data.visibleIf !== undefined){let data15 = data.visibleIf;if(data15 && typeof data15 == "object" && !Array.isArray(data15)){if(data15.appInstalled !== undefined){let data16 = data15.appInstalled;if(typeof data16 === "string"){if(func6(data16) < 1){const err25 = {instancePath:instancePath+"/visibleIf/appInstalled",schemaPath:"#/$defs/visibleIfCondition/properties/appInstalled/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err25];}else {vErrors.push(err25);}errors++;}}else {const err26 = {instancePath:instancePath+"/visibleIf/appInstalled",schemaPath:"#/$defs/visibleIfCondition/properties/appInstalled/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err26];}else {vErrors.push(err26);}errors++;}}}else {const err27 = {instancePath:instancePath+"/visibleIf",schemaPath:"#/$defs/visibleIfCondition/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err27];}else {vErrors.push(err27);}errors++;}}}else {const err28 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err28];}else {vErrors.push(err28);}errors++;}validate22.errors = vErrors;return errors === 0;}validate22.evaluated = {"props":true,"dynamicProps":false,"dynamicItems":false};function validate21(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate21.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}if(data && typeof data == "object" && !Array.isArray(data)){if(data.section === undefined){data.section = "main";}if(data.type === undefined){data.type = "item";}if(data.pinned === undefined){data.pinned = false;}if(data.open === undefined){data.open = false;}if(data.id === undefined){const err0 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}if(data.label === undefined){const err1 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}for(const key0 in data){if(!(func1.call(schema39.properties, key0))){const err2 = {instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}}if(data.id !== undefined){if(typeof data.id !== "string"){const err3 = {instancePath:instancePath+"/id",schemaPath:"#/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}}if(data.label !== undefined){if(typeof data.label !== "string"){const err4 = {instancePath:instancePath+"/label",schemaPath:"#/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}}if(data.icon !== undefined){if(typeof data.icon !== "string"){const err5 = {instancePath:instancePath+"/icon",schemaPath:"#/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}if(data.route !== undefined){if(typeof data.route !== "string"){const err6 = {instancePath:instancePath+"/route",schemaPath:"#/properties/route/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}}if(data.query !== undefined){let data4 = data.query;if(data4 && typeof data4 == "object" && !Array.isArray(data4)){for(const key1 in data4){let data5 = data4[key1];if(((typeof data5 !== "string") && (!(typeof data5 == "number"))) && (typeof data5 !== "boolean")){const err7 = {instancePath:instancePath+"/query/" + key1.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/properties/query/additionalProperties/type",keyword:"type",params:{type: schema39.properties.query.additionalProperties.type},message:"must be string,number,boolean"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}}}else {const err8 = {instancePath:instancePath+"/query",schemaPath:"#/properties/query/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}}if(data.order !== undefined){let data6 = data.order;if(!((typeof data6 == "number") && (!(data6 % 1) && !isNaN(data6)))){const err9 = {instancePath:instancePath+"/order",schemaPath:"#/properties/order/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}}if(data.permission !== undefined){if(typeof data.permission !== "string"){const err10 = {instancePath:instancePath+"/permission",schemaPath:"#/properties/permission/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}}let data8 = data.section;if(typeof data8 !== "string"){const err11 = {instancePath:instancePath+"/section",schemaPath:"#/properties/section/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}if(!((((data8 === "main") || (data8 === "footer")) || (data8 === "settings")) || (data8 === "integrations"))){const err12 = {instancePath:instancePath+"/section",schemaPath:"#/properties/section/enum",keyword:"enum",params:{allowedValues: schema39.properties.section.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}let data9 = data.type;if(typeof data9 !== "string"){const err13 = {instancePath:instancePath+"/type",schemaPath:"#/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}if(!((data9 === "item") || (data9 === "caption"))){const err14 = {instancePath:instancePath+"/type",schemaPath:"#/properties/type/enum",keyword:"enum",params:{allowedValues: schema39.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}if(data.count !== undefined){let data10 = data.count;const _errs24 = errors;let valid2 = false;let passing0 = null;const _errs25 = errors;if(!((typeof data10 == "number") && (!(data10 % 1) && !isNaN(data10)))){const err15 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/0/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}if(typeof data10 == "number"){if(data10 < 0 || isNaN(data10)){const err16 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/0/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err16];}else {vErrors.push(err16);}errors++;}}var _valid0 = _errs25 === errors;if(_valid0){valid2 = true;passing0 = 0;}const _errs27 = errors;if(typeof data10 !== "string"){const err17 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/1/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err17];}else {vErrors.push(err17);}errors++;}if(!(data10 === "auto")){const err18 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/1/enum",keyword:"enum",params:{allowedValues: schema39.properties.count.oneOf[1].enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err18];}else {vErrors.push(err18);}errors++;}var _valid0 = _errs27 === errors;if(_valid0 && valid2){valid2 = false;passing0 = [passing0, 1];}else {if(_valid0){valid2 = true;passing0 = 1;}}if(!valid2){const err19 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf",keyword:"oneOf",params:{passingSchemas: passing0},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err19];}else {vErrors.push(err19);}errors++;}else {errors = _errs24;if(vErrors !== null){if(_errs24){vErrors.length = _errs24;}else {vErrors = null;}}}}if(typeof data.pinned !== "boolean"){const err20 = {instancePath:instancePath+"/pinned",schemaPath:"#/properties/pinned/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err20];}else {vErrors.push(err20);}errors++;}if(typeof data.open !== "boolean"){const err21 = {instancePath:instancePath+"/open",schemaPath:"#/properties/open/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err21];}else {vErrors.push(err21);}errors++;}if(data.href !== undefined){if(typeof data.href !== "string"){const err22 = {instancePath:instancePath+"/href",schemaPath:"#/properties/href/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err22];}else {vErrors.push(err22);}errors++;}}if(data.action !== undefined){let data14 = data.action;if(typeof data14 !== "string"){const err23 = {instancePath:instancePath+"/action",schemaPath:"#/properties/action/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err23];}else {vErrors.push(err23);}errors++;}if(!(((data14 === "user-settings") || (data14 === "admin-settings")) || (data14 === "replay-walkthrough"))){const err24 = {instancePath:instancePath+"/action",schemaPath:"#/properties/action/enum",keyword:"enum",params:{allowedValues: schema39.properties.action.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err24];}else {vErrors.push(err24);}errors++;}}if(data.tourId !== undefined){if(typeof data.tourId !== "string"){const err25 = {instancePath:instancePath+"/tourId",schemaPath:"#/properties/tourId/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err25];}else {vErrors.push(err25);}errors++;}}if(data.visibleIf !== undefined){let data16 = data.visibleIf;if(data16 && typeof data16 == "object" && !Array.isArray(data16)){if(data16.appInstalled !== undefined){let data17 = data16.appInstalled;if(typeof data17 === "string"){if(func6(data17) < 1){const err26 = {instancePath:instancePath+"/visibleIf/appInstalled",schemaPath:"#/$defs/visibleIfCondition/properties/appInstalled/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err26];}else {vErrors.push(err26);}errors++;}}else {const err27 = {instancePath:instancePath+"/visibleIf/appInstalled",schemaPath:"#/$defs/visibleIfCondition/properties/appInstalled/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err27];}else {vErrors.push(err27);}errors++;}}}else {const err28 = {instancePath:instancePath+"/visibleIf",schemaPath:"#/$defs/visibleIfCondition/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err28];}else {vErrors.push(err28);}errors++;}}if(data.dynamicSource !== undefined){let data18 = data.dynamicSource;if(data18 && typeof data18 == "object" && !Array.isArray(data18)){if(data18.method === undefined){data18.method = "GET";}if(data18.url !== undefined){if(typeof data18.url !== "string"){const err29 = {instancePath:instancePath+"/dynamicSource/url",schemaPath:"#/$defs/dynamicSource/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err29];}else {vErrors.push(err29);}errors++;}}let data20 = data18.method;if(typeof data20 !== "string"){const err30 = {instancePath:instancePath+"/dynamicSource/method",schemaPath:"#/$defs/dynamicSource/properties/method/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err30];}else {vErrors.push(err30);}errors++;}if(!((data20 === "GET") || (data20 === "POST"))){const err31 = {instancePath:instancePath+"/dynamicSource/method",schemaPath:"#/$defs/dynamicSource/properties/method/enum",keyword:"enum",params:{allowedValues: schema41.properties.method.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err31];}else {vErrors.push(err31);}errors++;}if(data18.labelField !== undefined){if(typeof data18.labelField !== "string"){const err32 = {instancePath:instancePath+"/dynamicSource/labelField",schemaPath:"#/$defs/dynamicSource/properties/labelField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err32];}else {vErrors.push(err32);}errors++;}}if(data18.idField !== undefined){if(typeof data18.idField !== "string"){const err33 = {instancePath:instancePath+"/dynamicSource/idField",schemaPath:"#/$defs/dynamicSource/properties/idField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err33];}else {vErrors.push(err33);}errors++;}}if(data18.routeField !== undefined){if(typeof data18.routeField !== "string"){const err34 = {instancePath:instancePath+"/dynamicSource/routeField",schemaPath:"#/$defs/dynamicSource/properties/routeField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err34];}else {vErrors.push(err34);}errors++;}}}else {const err35 = {instancePath:instancePath+"/dynamicSource",schemaPath:"#/$defs/dynamicSource/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err35];}else {vErrors.push(err35);}errors++;}}if(data.children !== undefined){let data24 = data.children;if(Array.isArray(data24)){const len0 = data24.length;for(let i0=0; i0<len0; i0++){if(!(validate22(data24[i0], {instancePath:instancePath+"/children/" + i0,parentData:data24,parentDataProperty:i0,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate22.errors : vErrors.concat(validate22.errors);errors = vErrors.length;}}}else {const err36 = {instancePath:instancePath+"/children",schemaPath:"#/properties/children/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err36];}else {vErrors.push(err36);}errors++;}}}else {const err37 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err37];}else {vErrors.push(err37);}errors++;}validate21.errors = vErrors;return errors === 0;}validate21.evaluated = {"props":true,"dynamicProps":false,"dynamicItems":false};const schema44 = {"type":"object","required":["id","route","type","title"],"additionalProperties":false,"description":"A v2 page definition. CnPageRenderer dispatches by type and matches by $route.name === page.id. All page types support a uniform widgets[] array for declarative slot placement. Sentinels (@resolve:*) are NOT allowed in id, route, component, headerComponent, actionsComponent, or slots.* — those are router and registry invariants.","properties":{"requiresApp":{"description":"Soft dependency gating this WHOLE page. When the named Nextcloud app is not installed, the page renders the missing-dependency screen instead of its body. This is for the DEEP LINK: an entry gated by visibleIf.appInstalled is already hidden from the menu, so the remaining ways in are a bookmark, a shared URL, a redirect or an e2e spec, and those otherwise land on an empty page where 'not installed' looks the same as 'no data'. Gate a single WIDGET with visibleIf.appInstalled instead: a detail page may carry many widgets where only one needs the app, and that widget should hide while the page renders normally.","oneOf":[{"type":"string","minLength":1},{"type":"object","required":["id"],"additionalProperties":false,"properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1,"description":"Human-readable app name shown on the screen; defaults to the id."}}}]},"id":{"type":"string","description":"Vue-router route name. MUST be unique across pages[]. Sentinels (@resolve:*) are NOT allowed."},"route":{"type":"string","description":"Path pattern (e.g. '/decisions', '/decisions/:id'). Sentinels (@resolve:*) are NOT allowed."},"type":{"type":"string","enum":["index","detail","dashboard","logs","settings","chat","files","form","map","roadmap","reports","store","search","wiki","flow","flows","flow-detail","custom"],"description":"Page type. Closed enum of 17 supported types. 'flow' opens ONE flow in the editor; the flow LIST is an ordinary 'index' with config.entitySource='flows'. 'flows' and 'flow-detail' are DEPRECATED aliases kept for migration — 'flows' predates named index sources and 'flow-detail' is the old name for 'flow'. 'roadmap' mounts CnFeaturesAndRoadmapPage (features + GitHub-issue-backed roadmap). 'search' mounts CnSearchPage (cross-schema query + facet sidebar + results list; consumers wire the actual search via @search). 'wiki' mounts CnWikiPage (manifest-declared markdown article + optional sidebar tree; MUST declare config.register + config.schema). 'flow' and the deprecated 'flow-detail' both mount CnFlowEditorPage (the shared node/edge canvas) and take config.app to scope to the owning app. A flow lives in OpenRegister's native flow store rather than a register/schema pair, so a single flow cannot be a 'detail' page — but the LIST is a plain 'index' once a named entitySource supplies it, which is why 'flows' is deprecated (ADR-110 Decision 4). 'custom' requires a _note field explaining why a standard type was not feasible."},"title":{"type":"string","description":"i18n translation key for the page title."},"permission":{"type":"string","description":"Optional permission identifier required to access this page."},"component":{"type":"string","description":"For type='custom': name resolved against the app-provided customComponents registry. Sentinels (@resolve:*) are NOT allowed."},"headerComponent":{"type":"string","description":"Optional registry name for a component injected into the page's #header slot. Sentinels (@resolve:*) are NOT allowed."},"actionsComponent":{"type":"string","description":"Optional registry name for a component injected into the page's #actions slot. Sentinels (@resolve:*) are NOT allowed."},"sidebarComponent":{"type":"string","minLength":1,"description":"Optional registry name for a component mounted as the default sidebar content for this page."},"slots":{"type":"object","description":"Generic slot-override map. Each key is a slot name; each value is a registry component name. Sentinels (@resolve:*) are NOT allowed in values.","additionalProperties":{"type":"string"}},"primaryAction":{"$ref":"#/$defs/primaryAction","description":"Active-page-scoped primary action rendered as an NcAppNavigationNew button above the menu list when the current route resolves to this page. Page-scoped declarations win over nav.primaryAction. Also the target of the detail page's skip link: a keyboard user tabs in, follows the link and lands on this action."},"splitView":{"$ref":"#/$defs/splitView","description":"Index pages only. Opens a row beside the list rather than instead of it, at the sibling route <route>/split/:id that buildManifestRoutes() emits. Refused on any other page type."},"board":{"$ref":"#/$defs/boardView","description":"Index pages only. The board view's configuration, handed to CnIndexPage as the `board` prop. The segment appears only when `viewModes` also lists `board`. Refused on any other page type."},"dateAxis":{"$ref":"#/$defs/dateAxisView","description":"Index pages only. The date-axis view's configuration, handed to CnIndexPage as the `dateAxis` prop. The segment appears only when `viewModes` also lists `dateAxis`. Refused on any other page type."},"savedViewTree":{"$ref":"#/$defs/savedViewTree","description":"Index pages only. Renders this page's saved views as a tree with labels, and declares the views that ship with the app. Refused on any other page type: a page with no saved-view dropdown has nothing to put in a tree."},"manualOrder":{"type":"boolean","default":false,"description":"Index pages only. Lets a person drag the rows into an order of their own, held per user and per list in their Nextcloud preferences and never written onto the records. Refused on any other page type."},"tabInAddress":{"type":"boolean","default":false,"description":"Detail pages only. Puts the active tab in the address as ?_tab=<id> so a link points at a tab of a record rather than at the record. The underscore prefix keeps it out of resolveQueryFilters(), which reads every other query key as a filter. Refused on any other page type."},"referencePreview":{"type":"boolean","default":false,"description":"Lets a reference on this page show a summary of the record it points at, on focus and on hover, without leaving the page. Rendered by CnReferencePreview."},"widgets":{"type":"array","items":{"$ref":"#/$defs/widgetEntry"},"description":"Uniform widget placement array. Available on ALL page types in v2 (not just dashboard). Each entry specifies a widget key, slot, and grid coordinates. The cross-field constraint gridX + gridWidth <= 12 is enforced by validateManifestV2() post-schema check. Single-widget dashboards: a type:'dashboard' page with exactly one body widget covering the full 12×12 grid whose widgetKey resolves to a custom (non-library-built-in) registry component is REJECTED — see ADR-036 Decision 1 (single-widget dashboard anti-pattern). Use type:'custom' with component:'<widgetKey>' or split into N>1 widgets instead. Library built-in widget keys are exempt from the rule; the exempt set is LIBRARY_WIDGET_KEYS in src/utils/libraryWidgetKeys.js, which is held to set equality against the BUILT_IN_WIDGETS registry and the dashboard widget catalog by tests/utils/libraryWidgetKeys.spec.js. It is not restated here, because an out-of-date second copy of that list is the defect this replaced. Enforced by validateManifestV2() post-schema check."},"actions":{"type":"array","items":{"$ref":"#/$defs/action"},"description":"Typed page-level actions with a discriminator. Each action has a type field (handler | open-modal | open-page | navigate) that defaults to 'handler' when omitted."},"config":{"type":"object","description":"Type-specific configuration. Shape varies by page type — see v1 schema for per-type config shapes (index, detail, dashboard, logs, settings, chat, files, form, map, custom). Config values under pages[].config may use the closed sentinel vocabulary (see $defs/sentinelTokenAny) — an out-of-vocabulary @-token FAILS validation via the sentinelGuardedValue allOf guard. Carry-forward from v1: register, schema, columns, actions, sidebar, sidebarProps, fields, sections, tabs, content, layout, widgets (dashboard only), cardComponent, columnGroups, etc.","additionalProperties":true,"allOf":[{"$ref":"#/$defs/sentinelGuardedValue"}],"properties":{"entitySource":{"type":"string","enum":["flows","tasks"],"description":"Name a registered NON-OBJECT entity collection for a type='index' page, instead of register+schema. Deliberately NOT called `source`: that key is already taken on page config and is polymorphic (a URL string in some manifests, an object with `params` in others), so reusing it would give one key two meanings and break six deployed shillinq pages. A flow definition is deliberately not an OpenRegister object, so an index had nothing to bind to and such lists became bespoke type='custom' pages. With a source the index loads the list itself. Takes precedence over register/schema; non-empty `objects` still wins over both. Registered sources live in src/composables/indexSources.js. `tasks` lists the viewer's task inbox from OpenRegister's flow-tasks read (cn-tasks-entity-source)."},"app":{"type":"string","description":"Scopes a named `entitySource` to one app (e.g. entitySource='flows' with app='dossiq' lists that app's flows)."},"register":{"type":"string","description":"OpenRegister register slug."},"schema":{"type":"string","description":"OpenRegister schema slug."},"contentField":{"type":"string","description":"type='wiki': property on the article object holding the markdown body. Defaults to 'body'. Maps to CnWikiPage `contentField` prop."},"titleField":{"type":"string","description":"type='wiki': property on the article object holding the page title. Defaults to 'title'. Maps to CnWikiPage `titleField` prop."},"idParam":{"type":"string","description":"type='wiki': $route.params key holding the article id. Defaults to 'id'. Maps to CnWikiPage `idParam` prop."},"treeField":{"type":"string","description":"type='wiki': property on each sidebar tree node holding its child array. Defaults to 'children'. Maps to CnWikiPage `treeField` prop."},"sidebarTitleField":{"type":"string","description":"type='wiki': property on each sidebar tree node holding its label. Defaults to `titleField`. Maps to CnWikiPage `sidebarTitleField` prop."},"sidebarRegister":{"type":"string","description":"type='wiki': register slug for the sidebar tree. Defaults to `register`. Maps to CnWikiPage `sidebarRegister` prop."},"sidebarSchema":{"type":"string","description":"type='wiki': schema slug providing the sidebar tree. When set AND `tree` is non-empty the sidebar renders. Maps to CnWikiPage `sidebarSchema` prop."},"emptyText":{"type":"string","description":"type='wiki': empty-state heading shown when the article is null. Maps to CnWikiPage `emptyText` prop."},"emptyDescription":{"type":"string","description":"type='wiki': empty-state description shown when the article is null. Maps to CnWikiPage `emptyDescription` prop."},"emptyBodyText":{"type":"string","description":"type='wiki': empty-body heading shown when the article has no content. Maps to CnWikiPage `emptyBodyText` prop."},"emptyBodyDescription":{"type":"string","description":"type='wiki': empty-body description shown when the article has no content. Maps to CnWikiPage `emptyBodyDescription` prop."},"cardComponent":{"type":"string","description":"Registry name for a custom card component on index pages. Carry-forward from v1.3.0."},"sidebar":{"description":"Sidebar configuration. For index: object with enabled, show, columnGroups[], facets, etc. For detail: boolean or object with show, enabled, register, schema, tabs[]. Carry-forward from v1.3.0.","oneOf":[{"type":"boolean"},{"type":"object","additionalProperties":true,"properties":{"show":{"type":"boolean","description":"Whether to show the sidebar on this page."},"enabled":{"type":"boolean","description":"Whether the sidebar is enabled."},"columnGroups":{"type":"array","description":"Index sidebar column-visibility groups. Carry-forward from v1.3.0.","items":{"type":"object","additionalProperties":true}}}}]},"tabs":{"type":"array","description":"Settings tabs (for type='settings'). Carry-forward from v1.3.0.","items":{"type":"object","additionalProperties":true}},"sidebarTabs":{"type":"array","description":"Sidebar tabs declaration for type='detail' pages. Each entry is the human-authored source of truth for one tab — `id` + `label` (required), optional `icon`, `order`, `component`. Widgets bound to a tab carry `tabGroup: \"<tab-id>\"` on `slot:\"sidebar\"` entries; cross-reference is validated. The CLI manifest-migrate transform lifts `config.sidebarTabs[].widgets[]` into top-level `widgets[]` with `slot:\"sidebar\"` + `tabGroup`; tab entries declaring only a `component` are carried forward as residual sidebarTabs[]. See src/cli/transforms/liftSidebarTabWidgets.js.","items":{"type":"object","additionalProperties":true,"required":["id","label"],"properties":{"id":{"type":"string","minLength":1,"description":"Unique tab identifier within the page. Referenced from widgets[].tabGroup."},"label":{"type":"string","minLength":1,"description":"i18n key (or literal) for the tab label."},"icon":{"type":"string","description":"Optional icon name (CSS class or MDI identifier) shown next to the label."},"order":{"type":"number","description":"Optional sort key for tab ordering; lower values render first."},"component":{"type":"string","description":"Optional registry name for a full-tab custom component. When set, the tab renders that component directly instead of the per-tab widgets[] grouping. Resolved against the customComponents registry."},"_note":{"type":"string","description":"Optional human note (e.g. lib-gap reason for an undecomposable tab)."}}}},"sections":{"type":"array","description":"Settings sections (for type='settings'). Carry-forward from v1.3.0.","items":{"type":"object","additionalProperties":true}},"fields":{"type":"array","description":"Form fields (for type='form'). Carry-forward from v1.3.0. manifest-form-logic adds two OPTIONAL typed properties — `visibleWhen` (reuses `$defs/visibleWhen`; LOCAL mode resolves `field` as a dot-path into the live form data) and `validation` (`$defs/fieldValidation`) — while every other carry-forward field shape (`key`, `label`, `type`, `enum`, `widget`, `help`, etc.) stays untyped via `additionalProperties: true` on the item.","items":{"type":"object","additionalProperties":true,"properties":{"visibleWhen":{"$ref":"#/$defs/visibleWhen","description":"manifest-form-logic: optional conditional-visibility predicate. LOCAL mode (neither `endpoint` nor `source`) resolves `field` as a dot-path into the live form data — the first dot-segment MUST match a declared `config.fields[].key` (validateManifestV2 post-schema check). `endpoint` / `source` modes keep their existing fail-safe, evaluated-once-at-mount semantics."},"validation":{"$ref":"#/$defs/fieldValidation","description":"manifest-form-logic: optional per-field validation rules, enforced client-side by CnFormPage before dispatch. See `$defs/fieldValidation` for the per-type semantics table."}}}},"steps":{"type":"array","minItems":1,"description":"manifest-form-logic: for type='form' pages, ordered multi-step wizard groups. Each entry is `{ id, title, description?, fields[] }` where `fields[]` is an ordered array of KEY REFERENCES into `config.fields[].key` — steps do not embed field objects (config.fields[] stays the single source of truth). Absent `steps` = single-step form, byte-for-byte the pre-change rendering. When present, validateManifestV2() post-schema requires: step ids unique within the page, every fields[] entry references a declared field key, and every declared field key appears in EXACTLY ONE step (complete partition — an unassigned field would silently never render; a doubly-assigned field would double-render).","items":{"type":"object","required":["id","title","fields"],"additionalProperties":false,"description":"One wizard step. `fields[]` order is the rendering order for that step's fields.","properties":{"id":{"type":"string","minLength":1,"description":"Unique step identifier within the page's `steps[]` array."},"title":{"type":"string","minLength":1,"description":"i18n key (or literal) for the step's title, shown in the step indicator."},"description":{"type":"string","description":"Optional i18n key (or literal) for a short step description/subtitle."},"fields":{"type":"array","minItems":1,"items":{"type":"string","minLength":1},"description":"Ordered field KEYS (referencing `config.fields[].key`) rendered on this step."}}}},"fieldWidgets":{"type":"array","description":"Declarative widget-component slots for type='form' / type='detail' pages. Each entry mounts a lib `Cn*` SFC inline (e.g. CnMarkdownEditor as a markdown field, CnSchemaSelect as a relation picker). Distinct from top-level pages[].widgets[] which uses widgetKey + grid coordinates against the host customComponents registry. Carries serialisable props only. See $defs/fieldWidget and ConductionNL/nextcloud-vue#314.","items":{"$ref":"#/$defs/fieldWidget"}},"columns":{"type":"array","description":"Table columns (for type='index' and type='logs'). Items may be strings (legacy shorthand) or column objects ({ key, label, sortable?, width?, formatter?, formatterOptions?, widget?, widgetProps?, format?, aggregate? }). `formatter` resolves against cnFormatters (built-ins incl. currency / conditionalPhrase — configured via `formatterOptions`); `widget` resolves against cnCellWidgets (built-ins incl. badge / fkResolve / link).","items":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]}},"folderSidebar":{"type":"object","additionalProperties":true,"description":"type='index': the opt-in folder navigation pane (CnFolderSidebar) rendered left of the list. Selecting a folder filters the list by `filterField` (or `field`); \"All\" clears it. Only the per-scope list-layout keys are typed here; the pane's own keys (source, register, schema, idField, nameField, folders, allLabel, title, allowCreate, ...) stay free-form. Maps to CnIndexPage `folderSidebar`.","properties":{"folders":{"type":"array","description":"Explicit folder list for source:'custom', and the place a folder declares its own list layout. Every other folder key stays free-form.","items":{"$ref":"#/$defs/folderSidebarScope"}}}},"layout":{"type":"array","description":"Dashboard layout entries (for type='dashboard', legacy). Carry-forward from v1.","items":{"type":"object","additionalProperties":true}},"content":{"type":"array","description":"Declarative content items for dashboard (widget-ref items). Carry-forward from v1.","items":{"type":"object","additionalProperties":true}},"widgets":{"type":"array","description":"Legacy dashboard widgets array in config (for type='dashboard'). In v2, prefer top-level pages[].widgets[] with the uniform widgetEntry shape. This legacy config.widgets key remains for back-compat.","items":{"type":"object","additionalProperties":true}},"headerActions":{"type":"array","description":"Page-level header actions rendered inside CnActionsBar's overflow dropdown (between the built-in Refresh action and the `#action-items` slot). On a `type:'detail'` page the same entries render in the header's Actions menu, above the Request-a-feature / Report-a-bug / Documentation trio. Same shape as the row-level `actions[]` ($ref action), but handlers receive NO row context — they are page-level. Reserved ids (`refresh`, `import`, `export`, `copy`, `delete`) are dropped at render time to avoid shadowing built-ins. See manifest-icons-and-page-actions for the dispatch semantics.","items":{"$ref":"#/$defs/action"}},"bulkActions":{"type":"array","description":"Bulk actions rendered in the contextual selection strip that appears while rows are selected. Same shape as the row-level `actions[]` ($ref action), but the handler receives the SELECTION rather than a row: `{ actionId, selectedIds, count }`. For `type: \"open-modal\"` the selection is merged into the modal's props as `selectedIds` and `count`, so a manifest-declared modal component can act on the selection without the page hand-writing anything. Reserved ids (`copy`, `delete`) are dropped at render time: the strip already ships both as built-ins. Before this existed the strip had only a `#selection-actions` slot, which only a hand-written host component could fill — so a page declared in a manifest could carry row actions and header actions but never a bulk one.","items":{"$ref":"#/$defs/action"}},"actions":{"type":"array","items":{"type":"object","required":["label"],"additionalProperties":true,"properties":{"label":{"type":"string","minLength":1}}},"description":"Declarative actions on a page. Governed ONLY by \"an object carrying a non-empty label\", deliberately: this key is polymorphic by page type (index rows dispatch $defs/action; detail pages also carry type='lifecycle-transition' entries), so one closed grammar here would reject working manifests. A label is what every dialect needs — CnRowActions renders an entry from its label and icon, so an entry without one became a full-height, clickable, EMPTY row in the overflow menu. Two shapes hit this, both meaning \"show the built-in\": a bare string (\"edit\") and a key-only object ({\"key\": \"edit\"}). Built-ins are enabled with config.actionToggles / the show*Action keys, never by naming them here."},"rowIndicators":{"type":"array","description":"type='index': state indicators the page declares for its rows. Each entry names a `field` (a dotted path on the row), a condition (`equals`, `in`, or plain truthiness when neither is given), an `icon` (a CnIcon name) and a `text` (the text alternative, required). An entry without `text` does not render, because an icon with no text is colour and shape alone. The page declares which indicators exist; a record cannot add one the page has not declared. Maps to CnIndexPage `rowIndicators`.","items":{"$ref":"#/$defs/rowIndicator"}},"rowIndicatorCap":{"type":"integer","minimum":0,"default":3,"description":"type='index': how many declared indicators render on the row itself before the rest move into the row menu. Maps to CnIndexPage `rowIndicatorCap`."},"quickEditFields":{"type":"array","items":{"type":"string","minLength":1},"description":"type='index': the fields a quick edit asks for, opened from a row without leaving the list. The page names them; a record cannot open a form on a field the page did not name. A field this caller may not write (see `writableField`) renders read-only rather than missing. Maps to CnIndexPage `quickEditFields`."},"writableField":{"type":"string","default":"@self.writableFields","description":"type='index': the dotted path where a record lists the fields this caller may write. A row carrying nothing there leaves every field the quick edit named editable; an empty list is a refusal and locks them all. Maps to CnIndexPage `writableField`."},"viewTabs":{"type":"array","items":{"type":"string","minLength":1},"description":"type='index': saved view ids this page renders as tabs instead of as entries in the views control. A view appears in one place or the other, never both. An id naming a view that no longer exists produces no tab, rather than a tab that opens nothing. Maps to CnIndexPage `viewTabs`."},"priorityField":{"type":"string","description":"type='index': the field carrying a record's DERIVED priority. The list reads the value and sorts on it; it never computes one. A record with no priority, or one outside `priorityLevels`, sorts after every ranked record in BOTH directions and stays in the list. Maps to CnIndexPage `priorityField`."},"priorityLevels":{"type":"array","items":{"type":"string","minLength":1},"description":"type='index': the priority values in rank order, lowest first (e.g. ['low', 'medium', 'high']). Needed because a priority does not sort alphabetically into the order a person means. Maps to CnIndexPage `priorityLevels`."},"listShortcuts":{"type":"boolean","default":false,"description":"type='index': offer the list's keyboard shortcuts. Every shortcut is also listed in the command palette and on the help key, from one catalogue, because a shortcut nobody can find does not count. Maps to CnIndexPage `listShortcuts`."},"rowActionField":{"type":"string","description":"type='index': the dotted path on each row where the server lists the actions this caller may run on that record (default '@self.actions'). A row's menu is then the intersection of what `config.actions` declares and what the server allows: an action the server allows but the page does not declare stays out, and an action the page declares but the server refuses stays out with its reason kept. A row carrying nothing at this path leaves the declaration standing. Maps to CnIndexPage `rowActionField`."},"editOpensDetail":{"type":"boolean","description":"type='index': send the Edit row action to the record's detail page instead of opening the edit modal. OPT-IN — CnPageRenderer used to set this wherever a type='detail' page or config.rowRoute existed, and it no longer does: @edit-open is bound to the same navigation as a row click, so a routed Edit just repeats the row click (the split pane, or the detail page) and the form is no longer reachable from the list. Declare true per page when the modal cannot express the record. Maps to CnIndexPage `editOpensDetail`."},"showEditAction":{"type":"boolean","description":"type='detail': show the header Edit button that opens the record's schema form. Set automatically by CnPageRenderer for every schema-bound detail page; declare false to make a detail page read-only. Maps to CnDetailPage `showEditAction`."},"formSize":{"type":"string","enum":["small","normal","large"],"default":"normal","description":"NcDialog size for the page's built-in Add/Edit form dialog (type='index' and type='detail'). A manifest `open-form` header action has always been able to ask for `large`; the built-in dialog could not, so the same app could have a roomy create form on one surface and a cramped one on another. Maps to CnIndexPage / CnDetailPage `formSize`."},"formColumns":{"type":"integer","enum":[1,2],"default":1,"description":"How many columns the page's built-in Add/Edit form flows its fields into. Pair 2 with formSize 'large', or the two columns are merely two narrow ones. CnFormDialog collapses back to one column below 700px, and a textarea or JSON editor spans both columns regardless. Maps to CnIndexPage / CnDetailPage `formColumns`."},"excludeFields":{"type":"array","items":{"type":"string"},"description":"Property names kept OUT of the page's built-in Add/Edit form dialog. Maps to CnIndexPage / CnDetailPage `excludeFields`."},"includeFields":{"type":"array","items":{"type":"string"},"description":"Property names the page's built-in Add/Edit form dialog shows, in this order — a whitelist, so anything absent is hidden regardless of excludeFields. Maps to CnIndexPage / CnDetailPage `includeFields`."},"fieldOverrides":{"type":"object","additionalProperties":true,"description":"Per-field overrides merged over the schema-derived field descriptors in the page's built-in Add/Edit form dialog (e.g. `{ \"description\": { \"widget\": \"textarea\" } }`). Which widget a field renders as belongs to the surface, not to the schema. Maps to CnIndexPage / CnDetailPage `fieldOverrides`."},"createDefaults":{"type":"object","additionalProperties":true,"description":"type='index': seed values for the page's built-in create dialog, never applied on edit. Resolves `@me`/`@now`/`@today` at any depth; `@object.*`/`@workspace.*`/`@config.*` need a context the page does not carry and pass through unchanged. Maps to CnIndexPage `createDefaults`."},"createSuccessRoute":{"oneOf":[{"type":"string"},{"type":"object","properties":{"name":{"type":"string"},"paramField":{"type":"string"},"objectParam":{"type":"string"}},"required":["name"],"additionalProperties":false}],"description":"type='index': route opened after a successful create from the page's built-in Add dialog; the created object's id is merged into the params. Maps to CnIndexPage `createSuccessRoute`."},"createSuccessMessage":{"type":"string","description":"type='index': toast shown after a successful create from the page's built-in Add dialog. Maps to CnIndexPage `createSuccessMessage`."},"savedViewsScope":{"type":"string","description":"type='index': which pages share this page's saved views. By default a view is shared by every page over the same register and schema and by no other, because a view is filters over one schema's fields. Set this to share views across pages over different sources, or to keep two pages over one source apart. Written into the saved view's `query.scope`; views saved before scoping stay visible everywhere. Maps to CnIndexPage `savedViewsScope`."},"splitCloseButton":{"type":"boolean","default":true,"description":"type='index': whether the split pane draws its own close link. Set false when a `#split-pane` slot draws one from the slot's `close`. Maps to CnIndexPage `splitCloseButton`."},"splitCloseLabel":{"type":"string","description":"type='index': accessible name and tooltip for the split pane's close button. Defaults to \"Close\". Maps to CnIndexPage `splitCloseLabel`."},"mapConfig":{"type":"object","additionalProperties":true,"description":"type='index': how rows are plotted when the Map view mode is available. Non-empty (and not excluded by an explicit viewModes) adds a Map segment to the view toggle. Maps to CnIndexPage `mapConfig`.","properties":{"latField":{"type":"string","description":"Object (or `@self`) property path holding the marker's latitude. Dotted paths are supported, e.g. `@self.geo.lat`."},"lngField":{"type":"string","description":"Object (or `@self`) property path holding the marker's longitude."},"geoField":{"type":"string","description":"Alternative single property holding a GeoJSON Point geometry (`{ type: 'Point', coordinates: [lng, lat] }`). Takes precedence over latField/lngField when present and resolvable."},"popupField":{"type":"string","description":"Object property rendered in the marker popup."},"center":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2,"description":"Fallback centre `[lat, lng]` when the filtered set has no plottable rows."},"clustering":{"type":"boolean","default":true,"description":"Whether coincident markers are grouped into a cluster that spiderfies on click. ON by default here — the opposite of CnMapWidget's own default — because an index map plots whatever the filter returns, and several rows at one address is the normal case: unclustered they land on identical pixels, the topmost takes every click and the rest are unreachable with nothing on screen saying they exist. Non-point geometry skips the cluster group, so areas are unaffected. Set false for the old behaviour."}}},"quickFilterMaxVisible":{"type":"integer","minimum":0,"default":0,"description":"type='index', chips mode: how many quickFilters render as pills before the rest move behind one more chip — a `⋯` pill that opens a panel of the hidden lenses, and that wears the label and the active fill of whichever one is on. 0 (the default) renders every lens, which wraps the actions bar onto a second line once a page declares more than a handful. The visible set is the FIRST n entries of quickFilters, so reorder that array to change which lenses stay out. Maps to CnIndexPage `quickFilterMaxVisible`."},"actionToggles":{"type":"object","description":"Built-in action toggles for type='index' pages. Each key is sugar for the matching CnIndexPage prop — manifest authors can hide built-in mass actions / row actions / the Add button without writing a wrapper. Mirrors the CnIndexPage prop names. Explicit config.<key> wins over config.actionToggles.<key> (matches the readOnly precedence rule). Distinct from config.actions[] which is the typed row-actions array.","additionalProperties":true,"properties":{"showAdd":{"type":"boolean","description":"Whether to show the Add button in the actions bar. Maps to CnIndexPage `showAdd`."},"showFormDialog":{"type":"boolean","description":"Whether the built-in create / edit form dialog is enabled. Maps to CnIndexPage `showFormDialog`."},"showEditAction":{"type":"boolean","description":"Whether to add an Edit action to row actions. Maps to CnIndexPage `showEditAction`."},"showCopyAction":{"type":"boolean","description":"Whether to add a Copy action to row actions. Maps to CnIndexPage `showCopyAction`."},"showDeleteAction":{"type":"boolean","description":"Whether to add a Delete action to row actions. Maps to CnIndexPage `showDeleteAction`."},"showMassImport":{"type":"boolean","description":"Whether to show the built-in mass Import action. Maps to CnIndexPage `showMassImport`."},"showMassExport":{"type":"boolean","description":"Whether to show the built-in mass Export action. Maps to CnIndexPage `showMassExport`."},"showMassCopy":{"type":"boolean","description":"Whether to show the built-in mass Copy button. Maps to CnIndexPage `showMassCopy`."},"showMassDelete":{"type":"boolean","description":"Whether to show the built-in mass Delete button. Maps to CnIndexPage `showMassDelete`."},"showViewToggle":{"type":"boolean","description":"Whether to show the table/cards view-mode toggle. Maps to CnIndexPage `showViewToggle`."},"selectable":{"type":"boolean","description":"Whether rows are selectable (driving the mass-action surface). Maps to CnIndexPage `selectable`."}}},"mode":{"type":"string","enum":["edit","create","public"],"description":"Authoring / access mode. type='form': 'edit' loads from `data`, 'create' starts blank, 'public' shows the public-form success banner and skips auth-state requirements. type='detail': 'public' marks the route as unauthenticated (token-scoped reader pages — pair with a route-param token via the @route.<param> sentinel). Maps to CnFormPage / CnDetailPage `mode` prop."},"subscribe":{"type":"boolean","default":true,"description":"Collaborative-editing default for type='detail'. When true (the default) CnDetailPage calls `objectStore.subscribe(objectType, objectId)` on mount via `useObjectSubscription` and unsubscribes on unmount. Set to false for read-only or archive views. Mirrors the `subscribe` Boolean prop on CnDetailPage / CnObjectSidebar. See the `collaborative-editing-defaults` capability."},"lock":{"type":"boolean","default":true,"description":"Collaborative-editing default for type='detail'. When true (the default) the page wires `useObjectLock` so the locked-by-other banner renders when a remote lock is active. Explicit lock acquire/release on the edit toggle is the v2 follow-up; at v1 this flag controls whether read-side `lockState` is wired. Mirrors the `lock` Boolean prop on CnDetailPage / CnObjectSidebar."}}},"sidebar":{"type":"object","description":"Per-page top-level sidebar visibility gate. Sibling of config, applies to every page type. show: boolean gates CnPageRenderer's #sidebar slot.","additionalProperties":true,"properties":{"show":{"type":"boolean","description":"Whether the host App's #sidebar slot renders for this page. Defaults to true."}}},"_note":{"type":"string","description":"Human-readable note. REQUIRED when type is 'custom' — must document why a standard page type was not feasible."}},"allOf":[{"description":"splitView, manualOrder, savedViewTree, board and dateAxis are index-page mechanics. splitView emits a second route beside an index route and mounts the detail pane inside CnIndexPage; manualOrder holds a per-user row order for a list. Declared on a detail, dashboard or custom page they would validate and then do nothing, which is the failure this branch refuses out loud (case-page-and-list-as-a-place).","if":{"not":{"properties":{"type":{"const":"index"}},"required":["type"]}},"then":{"not":{"anyOf":[{"required":["splitView"]},{"required":["manualOrder"]},{"required":["savedViewTree"]},{"required":["board"]},{"required":["dateAxis"]}]}}},{"description":"tabInAddress puts the active tab of a record in the address. Only a detail page has a record and a tab strip, so the key is refused elsewhere rather than validating into a no-op (case-page-and-list-as-a-place).","if":{"not":{"properties":{"type":{"const":"detail"}},"required":["type"]}},"then":{"not":{"required":["tabInAddress"]}}},{"description":"type='wiki' (CnWikiPage) renders one manifest-declared markdown article. It MUST declare both config.register and config.schema as non-empty strings so the manifest stays the source of truth for which OpenRegister register/schema the article body is read from (manifest-wiki-page-type).","if":{"properties":{"type":{"const":"wiki"}},"required":["type"]},"then":{"properties":{"config":{"type":"object","required":["register","schema"],"properties":{"register":{"type":"string","minLength":1},"schema":{"type":"string","minLength":1}}}},"required":["config"]}},{"description":"type='custom' requires _note documenting why decomposition into a standard page type was not feasible. Relaxed by ConductionNL/nextcloud-vue#315: when `component` matches the lib `Cn[A-Z]\\w+` pattern, the component name already documents the choice and _note is optional. When `component` is absent or non-Cn (host-app SFC), _note remains required.","if":{"properties":{"type":{"const":"custom"}},"required":["type"]},"then":{"if":{"properties":{"component":{"type":"string","pattern":"^Cn[A-Z]\\w+$"}},"required":["component"]},"then":{"description":"Lib-SFC custom page: component is self-documenting, _note is optional."},"else":{"description":"Host-app SFC custom page (or no component): _note is required to document why a standard page type was not feasible.","required":["_note"]}}}]};const schema49 = {"type":"object","additionalProperties":false,"description":"Saved views render as a tree rather than a flat list, carry labels, and may ship with the app. Two hundred personal views in one dropdown is the problem this solves. Index pages only, and only meaningful alongside allowSavedViews: without the dropdown there is no view to put in a tree. Absent, the page renders the flat dropdown it renders today. The view entity itself, its parent, its labels and its slug are OpenRegister's (saved-search-views); this key declares how this page presents them.","properties":{"enabled":{"type":"boolean","default":false,"description":"Whether this page renders its saved views as a tree. False reads as a page that considered it and declined, and renders exactly as a page that never named the key."},"maxDepth":{"type":"integer","minimum":1,"maximum":5,"default":3,"description":"How deep a parent chain may go. A bound rather than a taste: inheritance resolves by walking the chain, so an unbounded depth turns one render into an unbounded walk, and a person who can nest for ever will. Past the bound a save is refused naming the view, which is louder than a tree nobody can read."},"templates":{"type":"array","description":"What a new view may start from. A template presets the columns, the sort and the export field set, and the person may change each. Declare none and Save current view means what it has always meant: the list as it stands.","items":{"type":"object","additionalProperties":false,"required":["slug","name"],"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"name":{"type":"string"},"columns":{"type":"array","items":{"type":"string"}},"defaultSort":{"type":"string"},"exportFields":{"type":"array","items":{"type":"string"}}}}},"landingView":{"type":"object","additionalProperties":false,"description":"Which view a role opens this page on, as { role: slug }. A personal choice always wins and Reset returns here, so this is where somebody starts rather than where they are kept. A role's landing view changing mid-session applies on the next arrival: moving a reader's list out from under them is worse than a stale default.","patternProperties":{"^[A-Za-z0-9_.-]+$":{"type":"string"}}},"columnsPerRole":{"type":"object","additionalProperties":false,"description":"Which columns a role sees, as { role: [column] }. NARROWS index-columns-per-scope rather than replacing it: a role naming a column the scope does not offer gets nothing extra, because a per-role list that could add one would be a second, quieter way to put a field on screen the scope deliberately left off.","patternProperties":{"^[A-Za-z0-9_.-]+$":{"type":"array","items":{"type":"string"}}}},"groupBy":{"type":"string","description":"A field the list groups on, with a count per group. The counts are of the rows the list HOLDS, so on a paged list they are of the page and the surface says so; a second fetch per group is the cost this grouping exists to avoid."},"seeded":{"type":"array","description":"Views that ship with the app. They render as their own group above the user's own, and a user may copy one but not delete it: a view the product promises is not a view one person can remove from everybody's install.","items":{"type":"object","additionalProperties":false,"required":["slug","name"],"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$","description":"The stable name a dashboard widget, an export action or an API caller cites this view by. Lowercase and dash only, because it appears in an address and in a manifest somebody else writes. Required: a seeded view with no slug is a view nothing can call, which is most of the reason to seed it."},"name":{"type":"string","description":"What the view is called in the control. Translatable."},"label":{"type":"string","description":"One label this view carries, for the label filter. A view may carry none and stays reachable when no label filter is active."},"parent":{"type":"string","description":"The slug of the view this one hangs under. Omitted, it sits at the root of the seeded group."},"actions":{"type":"array","description":"The action ids this view offers, so a triage view offers three and not thirty. INTERSECTED with what the reader may run and never added to: a view declaring an action the reader has no right to does not grant it. Declare none and the view offers the page's actions, as today.","items":{"type":"string"},"uniqueItems":true},"inherits":{"type":"array","description":"Which parts this view takes from its parent. Each part resolves independently, so a child may narrow the criteria and keep the parent's columns. Declared on a view with no parent it is a contradiction and the validator refuses it: there is nothing to inherit from.","items":{"type":"string","enum":["criteria","columns","sorting","defaultSort","exportFields"]},"uniqueItems":true}},"allOf":[{"description":"inherits without a parent is a declaration that reads as configured and resolves to nothing. Refused here rather than silently ignored at render, which is the shape this whole change exists to stop.","if":{"required":["inherits"]},"then":{"required":["parent"]}}]}}}};const pattern6 = new RegExp("^Cn[A-Z]\\w+$", "u");const pattern7 = new RegExp("^[a-z0-9][a-z0-9-]*$", "u");const pattern8 = new RegExp("^[A-Za-z0-9_.-]+$", "u");const pattern25 = new RegExp("^[a-z][a-zA-Z0-9_-]*$", "u");const schema50 = {"type":"object","required":["widgetKey","slot","gridX","gridY","gridWidth","gridHeight"],"additionalProperties":false,"description":"A uniform widget placement entry used on every page type in v2. Replaces the v1 widgetDef + layoutItem pair with a single shape. Its props/dataSource/filter string leaves are guarded against the closed sentinel vocabulary via the sentinelGuardedValue allOf. The cross-field constraint gridX + gridWidth <= 12 CANNOT be expressed in JSON Schema (arithmetic over sibling fields) — it is documented here and enforced at runtime by validateManifestV2() as a post-schema check. Failure message: \"Widget '{widgetKey}' in slot '{slot}': gridX ({gridX}) + gridWidth ({gridWidth}) exceeds 12\".","properties":{"roles":{"type":"array","items":{"type":"string","minLength":1},"description":"Group ids that may see this widget. A DECLARATION THE HOST APP ENFORCES, not something this library evaluates: the check belongs on the read, where the figures are, because a widget hidden in the browser still had its data in the page payload (ADR-004). Pair it with `visibleWhen` pointing at an endpoint of the app's own, which IS evaluated here and collapses the cell when the fetch or the shape fails, so the declaration and the layout cannot disagree. Omitting it means every reader of the page sees the widget. Added because the key was expressible in the legacy `config.widgets[]` array, whose items are open, and refused here, so the same declaration validated on one page and was rejected on another.","examples":[["controllers","beheerders","admin"]]},"visibleWhen":{"$ref":"#/$defs/visibleWhen","description":"Render this widget only while the predicate holds. The same shape every other surface takes it in. It was already honoured at runtime for widgets (CnDashboardPage reads `def.visibleWhen`) and could not be declared in this shape, so a widget in the uniform entry had no way to express a visibility condition at all while one in the legacy array did."},"requiredApp":{"type":"string","minLength":1,"description":"Nextcloud app id this widget leans on — its data lives in that app's register, or its component comes from that app's integration leaf. When the app is absent the widget renders its normal chrome and a set-up state and issues NO request. Declared rather than inferred from content.register, because a register slug is not always the app id and a widget can depend on an app without querying it."},"id":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","description":"Optional stable, kebab-case identity for this widget entry. Used as the merge key under the `delta` merge mode (mergeManifestDelta keys widgets[] by id) so a stored delta can patch a single widget without resending the array. Omitting it keeps the entry valid; a delta simply cannot target it by key. Must be unique within a page's widgets[]."},"widgetKey":{"type":"string","description":"Registry key identifying the widget component. Resolved against the customComponents map passed to CnAppRoot at boot."},"slot":{"$ref":"#/$defs/slotValue","description":"Placement slot. Valid values: body, sidebar, header-actions, footer, modal (literals) or tab:<id> / section:<id> (pattern). Per-slot grid constraints are enforced via allOf/if-then below."},"gridX":{"type":"integer","minimum":0,"description":"0-based column start position. gridX + gridWidth MUST be <= 12 (enforced by post-schema check, not JSON Schema)."},"gridY":{"type":"integer","minimum":0,"description":"0-based row start position. For header-actions slot, MUST be 0 (enforced by allOf/if-then)."},"gridWidth":{"type":"integer","minimum":1,"maximum":24,"description":"Column span. For the default 12-column slots, 1-12. A page MAY widen a slot via config.slotColumns (up to the schema cap of 24); the real per-slot bound gridX + gridWidth <= resolvedColumns is enforced by the post-schema check, not JSON Schema. For sidebar slot, MUST be exactly 1 (enforced by allOf/if-then)."},"gridHeight":{"type":"integer","minimum":1,"description":"Row span (>= 1)."},"sizeToContent":{"type":["boolean","integer"],"minimum":1,"description":"Opt-in: hand this placement's height to whatever it renders, so a widget that decides AT RUNTIME it has nothing to show costs no row. `true` sizes purely to content; an integer is a row minimum. It makes gridHeight advisory for this widget — right for anything whose height is whatever it turned out to be (a banner whose condition is false, a list that came back empty), wrong for anything with a deliberate size. Maps to CnDashboardGrid's per-item `sizeToContent`."},"props":{"type":"object","description":"Optional widget-specific props passed at render time. Shape is widget-specific; not constrained here.","additionalProperties":true},"tabGroup":{"type":"string","description":"Optional: groups this widget into a named tab within the slot. Only meaningful for tab:* and section:* slots."},"dataSource":{"$ref":"#/$defs/dataSource","description":"Optional declarative data binding. Carry-forward from v1 widgetDef.dataSource — same shape."},"dateChip":{"type":"boolean","default":false,"description":"Opt-in (custom widgets only): when true AND the page's `dateRange.enabled` is true, the shared date-range chip renders in this widget's title bar (chart widgets with a `dataSource.bucket` get it automatically). Carry-forward from v1 layoutItem.dateChip — same semantics."},"_note":{"type":"string","description":"Human-readable note. Optional on most widgets. REQUIRED when the containing page has type 'custom' — in that case this field must document why a standard page type was not feasible."},"ncDashboard":{"type":"object","additionalProperties":false,"description":"Opt-in: also publish this placement as a widget on the native Nextcloud dashboard, alongside the app's own pages. An object rather than a boolean because a Nextcloud panel is a single narrow column with its own title, icon and link, none of which the grid placement carries. Presence of this key REQUIRES an `id` on the same entry (enforced in allOf below), and that id MUST be unique across the WHOLE manifest, not merely within its own page's widgets[] — Nextcloud's widget namespace is per app, so two pages both declaring id 'recent' derive one shared panel. Manifest-wide uniqueness is beyond JSON Schema; validateManifestV2 enforces it post-schema. Omitting the key leaves the widget visible only inside the app.","properties":{"title":{"type":"string","description":"Panel title on the Nextcloud dashboard. Falls back to the widget's own title when omitted."},"icon":{"type":"string","description":"MDI icon name (PascalCase), e.g. ViewDashboardOutline."},"order":{"type":"integer","description":"Initial ordering hint, passed through as IWidget::getOrder(). It decides where the panel first appears; once a user rearranges their own dashboard their arrangement wins, so this is a hint and never a guarantee."},"link":{"type":"string","pattern":"^(?![a-zA-Z][a-zA-Z0-9+.-]*:)(?!//)\\S+$","description":"In-app route the panel header links to, so a reader can open the page where the widget's full context lives. Written the way `pages[].route` is, e.g. '/reporting' — the host resolves it against its own app root with generateUrl() and never renders it bare. A scheme ('https:', and 'javascript:' above all) and a protocol-relative '//host' are both refused: the panel is rendered by Nextcloud's dashboard, outside this app's own pages, so a manifest is not a place to hand it an offsite destination."}}}},"allOf":[{"$ref":"#/$defs/sentinelGuardedValue"},{"description":"ncDashboard requires a stable id. The host derives a permanent Nextcloud widget id from `id`, and Nextcloud stores each user's chosen widgets by that id in its own namespace, which no migration of this app can reach. A widget identified by array position would move onto a different widget whenever the array is reordered, silently changing what a user sees. `id`'s own pattern already refuses an empty string, so requiring the key is the whole of the rule expressible here; the manifest-wide uniqueness half lives in validateManifestV2.","if":{"required":["ncDashboard"]},"then":{"required":["id"]}},{"description":"sidebar slot: gridWidth MUST equal 1. The sidebar is a fixed-width panel; widgets always span the full width.","if":{"properties":{"slot":{"const":"sidebar"}},"required":["slot"]},"then":{"properties":{"gridWidth":{"const":1}}}},{"description":"header-actions slot: gridY MUST equal 0. All header action widgets live in a single row.","if":{"properties":{"slot":{"const":"header-actions"}},"required":["slot"]},"then":{"properties":{"gridY":{"const":0}}}},{"description":"object-table built-in widget: when props declares a `source` it must match the declarative self-fetch shape, an `endpointSource` (Wave 2) must match the shared endpoint binding (exactly one of source | endpointSource — post-schema check), and `actions` must be typed manifest actions (incl. type:'object-op'). Other props stay free-form (pass-through to CnDataTable).","if":{"properties":{"widgetKey":{"const":"object-table"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"source":{"$ref":"#/$defs/objectTableSource"},"endpointSource":{"$ref":"#/$defs/endpointSource","description":"Wave 2 (#91): endpoint-bound rows — the payload at responsePath must be an array; columns / formatters / rowRoute / actions apply unchanged on top. Exactly one of source | endpointSource (post-schema check)."},"actions":{"type":"array","items":{"$ref":"#/$defs/action"},"description":"Declarative row/widget actions rendered by CnWidgetObjectTable. object-op patch/delete render per row; object-op create renders as a widget-scoped footer affordance."},"rowClass":{"type":"array","description":"#91: declarative per-row CSS class rules compiled into CnDataTable's rowClass function. Each rule { when: { field, op?, value }, class } adds `class` to a row when the shared visibleWhen predicate holds against that row (field = dot-path into the row, op = eq|neq|gt|gte|lt|lte default eq, value = literal). Rules evaluate in order and every matching class is space-joined — so overdue / at-risk rows can be highlighted from the manifest. A host-supplied rowClass FUNCTION (runtime-only) still passes straight through.","items":{"type":"object","additionalProperties":false,"required":["when","class"],"properties":{"when":{"type":"object","additionalProperties":false,"required":["field","value"],"description":"The predicate evaluated against the row (shared visibleWhen grammar, LOCAL form).","properties":{"field":{"type":"string","description":"Dot-path into the row."},"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte"],"default":"eq","description":"Comparison operator (default eq)."},"value":{"description":"Literal right-hand side of the comparison."}}},"class":{"type":"string","description":"CSS class added to the row when `when` holds."}}}}}}}}},{"description":"nav-card-grid built-in widget (ADR-044 §4 cards-collapse): props.entries is REQUIRED and each entry must match the navCardEntry shape. Unlike stats-block's optional entries[], nav-card-grid has no dataSource alternative — it renders arbitrary navigation links, not fetched data.","if":{"properties":{"widgetKey":{"const":"nav-card-grid"}},"required":["widgetKey"]},"then":{"required":["props"],"properties":{"props":{"type":"object","required":["entries"],"properties":{"entries":{"type":"array","items":{"$ref":"#/$defs/navCardEntry"},"description":"One card per array entry, rendered by CnNavCardGrid."}}}}}},{"description":"stats-block built-in widget: when props declares `entries[]` each entry must match the statsBlockEntry shape. The exactly-one-of dataSource | props.entries constraint is a cross-field rule enforced by validateManifestV2() as a post-schema check (clear error message), not by JSON Schema.","if":{"properties":{"widgetKey":{"const":"stats-block"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"entries":{"type":"array","items":{"$ref":"#/$defs/statsBlockEntry"},"description":"Multi-entry KPI sources — each entry renders one CnStatsBlock within the widget card. Mutually exclusive with a single dataSource."}}}}}},{"description":"banner built-in widget (CnBannerWidget, Wave 1): a declarative notice banner. props { variant, text, visibleWhen?, route? } — visibleWhen is a simple {endpoint|source, field?, op?, value} predicate evaluated at mount (fail-safe: hidden on fetch failure).","if":{"properties":{"widgetKey":{"const":"banner"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"variant":{"type":"string","enum":["info","warning","error","success"],"description":"Banner severity variant (NcNoteCard type). Default info."},"text":{"type":"string","description":"Pre-translated banner text (required for the banner to render)."},"visibleWhen":{"type":"object","additionalProperties":false,"description":"Optional visibility condition: exactly one of `endpoint` (same-origin JSON URL) or `source` (OpenRegister object query). `field` is a dot-path into the response (source: into the first result; omit or use '@total' for the collection total). Fail-safe: the banner stays hidden until the predicate evaluates true.","properties":{"endpoint":{"type":"string","description":"Same-origin URL returning JSON."},"source":{"type":"object","additionalProperties":false,"required":["register","schema"],"description":"OpenRegister object query; `filter` supports the shared @-token grammar.","properties":{"register":{"type":"string"},"schema":{"type":"string"},"filter":{"type":"object","additionalProperties":true}}},"field":{"type":"string","description":"Dot-path into the response ('@total' or omitted = collection total for a source)."},"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte"],"default":"eq","description":"Comparison operator."},"value":{"description":"Literal right-hand side of the comparison."}}},"route":{"description":"Optional click-through: a vue-router route NAME (string) or a full location object. Makes the banner text an accessible button.","oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]}}}}}},{"description":"audit-trail built-in widget (CnAuditTrailWidget, Wave 1): the object change-log card. All props are optional — register/schema/objectId normally arrive via the detail-page object-context merge; explicit props win.","if":{"properties":{"widgetKey":{"const":"audit-trail"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"register":{"type":"string","description":"OpenRegister register slug/id (context merge fallback when omitted)."},"schema":{"type":"string","description":"OpenRegister schema slug (context merge fallback when omitted)."},"objectId":{"type":"string","description":"The audited object's id (context merge fallback when omitted)."},"title":{"type":"string","description":"Optional card title override."},"maxDisplay":{"type":"integer","minimum":1,"description":"Maximum audit rows to render (default 5)."}}}}}},{"description":"chart widget display passthrough (Wave 1): additive presentation keys forwarded verbatim to CnChartWidget by CnDashboardPage's dispatcher and the v2 grid. Other chart props stay free-form.","if":{"properties":{"widgetKey":{"const":"chart"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"horizontal":{"type":"boolean","description":"Render type:'bar' charts horizontally (row bars)."},"legendPosition":{"type":"string","enum":["top","bottom","left","right"],"description":"Legend placement override (empty/omitted keeps the automatic placement)."},"valueAxisBaseline":{"type":"string","enum":["auto","zero","fit"],"description":"Value-axis baseline: 'auto' (the default — zero for bar/area, a bounded window for line/scatter), 'zero' (force a zero baseline), or 'fit' (let ApexCharts frame the data range, for a series living far from zero such as an SLA hovering 95–99%)."},"valueFormat":{"description":"Named value formatter applied to the value axis + tooltip: 'currency' | 'currency-compact' | 'percent', or the object form { name, currency?, decimals? }.","oneOf":[{"type":"string","enum":["currency","currency-compact","percent"]},{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","enum":["currency","currency-compact","percent"]},"currency":{"type":"string","description":"ISO-4217 code (EUR default; invalid codes fall back to EUR)."},"decimals":{"type":"integer","minimum":0,"description":"Fraction digits override."}}}]},"colorMap":{"type":"object","additionalProperties":{"type":"string"},"description":"Per-category colour map ({ categoryLabel: cssColor }) for pie/donut/radialBar slices and (distributed) bar categories."},"emptyLabel":{"type":"string","description":"Empty-state message rendered instead of the chart when the resolved series contain no data points."},"endpointSource":{"$ref":"#/$defs/chartEndpointSource","description":"Wave 2 (#91): endpoint-bound series/labels — the shared endpoint transport plus the labelsPath / series[] {name, path} response mapping. Exactly one of dataSource | endpointSource (post-schema check)."}}}}}},{"description":"header / text / divider on the v2 grid (Wave 1): the dashboard catalog's content-only presentation widgets reused as built-ins. Each takes a single `props.content` object with the same shape as its dashboard `content` blob.","if":{"properties":{"widgetKey":{"enum":["header","text","divider"]}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"content":{"type":"object","additionalProperties":true,"description":"The widget's content blob — header: { title, subtitle, backgroundImageUrl, overlayMode, height, cta, … }; text: { text, contentMode, fontSize, … }; divider: { style, lineColor, headingText, … }."}}}}}},{"description":"stat / delta catalog widgets on the v2 grid (Wave 2, #91): the KPI tiles take a `props.content` blob (same shape as their dashboard `content`). The endpoint-binding keys are typed here; the rest of the blob stays free-form (label, icon, format, source, …). Exactly one of content.source | content.endpointSource — a cross-field rule enforced by validateManifestV2() as a post-schema check (stats-block precedent), which also covers the legacy pages[].config.widgets[] placement.","if":{"properties":{"widgetKey":{"enum":["stat","delta"]}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"content":{"type":"object","additionalProperties":true,"properties":{"endpointSource":{"$ref":"#/$defs/endpointSource","description":"Wave 2 (#91): endpoint-bound KPI value(s) — exactly one of source | endpointSource (post-schema check)."},"valueField":{"type":"string","description":"Dot-path into the endpoint payload for the displayed (current) value. Omitted = the payload itself."},"previousField":{"type":"string","description":"Dot-path into the endpoint payload for the previous-period value — renders the trend sublabel (arrow + percent-vs-previous; the pipelinq previousPeriod contract)."},"deltaField":{"type":"string","description":"Dot-path into the endpoint payload for a SERVER-computed delta percent — wins over the client-side previousField computation."},"goodDirection":{"type":"string","enum":["up","down"],"default":"up","description":"Which trend direction tints green ('up' default; 'down' for cost-like KPIs). The delta widget's source.goodDirection still wins for the OpenRegister form."},"variantWhen":{"type":"array","description":"First-match threshold styling rules for the stat tile — the matched rule's variant re-tints the value + icon circle, and its optional icon overrides content.icon.","items":{"type":"object","required":["op","value","variant"],"additionalProperties":false,"properties":{"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte"],"description":"Comparison operator against the resolved display value (numeric when both sides coerce; eq/neq fall back to string equality)."},"value":{"description":"Literal right-hand side of the comparison."},"variant":{"type":"string","enum":["default","primary","success","warning","error"],"description":"Colour variant applied on match ('default' keeps the configured colours). The component also accepts 'danger' as an alias of 'error' for doriath-migrated content."},"icon":{"type":"string","description":"Optional MDI icon name overriding content.icon while this rule matches."}}}},"clickRoute":{"description":"Whole-tile click-through: a vue-router route NAME (string) or full location object. Alias of content.route (route wins when both are set).","oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]}}}}}}}},{"description":"workspace-filter catalog widget (#91 Wave 3): a choice list whose selection writes into the page workspace context so sibling widgets refetch. The endpoint/OR-source binding keys of `props.content` are typed here; the rest stays free-form.","if":{"properties":{"widgetKey":{"const":"workspace-filter"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"content":{"type":"object","additionalProperties":true,"properties":{"writes":{"type":"string","description":"The workspace context key the selection writes (`@workspace.<key>` or a bare `<key>`). Sibling widgets whose declarative source interpolates `@workspace.<key>` refetch on change."},"style":{"type":"string","enum":["radio","select"],"default":"radio","description":"Choice style: 'radio' (default) list or 'select' dropdown."},"allLabel":{"type":"string","description":"Optional leading 'All' option — writes the empty string so an optional sibling token (`@workspace.<key>?`) drops (unfiltered set)."},"showCounts":{"type":"boolean","default":true,"description":"Render per-option counts."},"options":{"type":"array","description":"Static options — each { value, label, count? } (or { id, name } / bare strings, normalised).","items":{"type":["object","string","number"]}},"source":{"type":"object","additionalProperties":true,"description":"OpenRegister /grouped facet source { register, schema, groupBy, filter? } — each distinct value becomes an option with its object count.","properties":{"register":{"type":"string"},"schema":{"type":"string"},"groupBy":{"type":"string"},"filter":{"type":"object","additionalProperties":true}}},"endpointSource":{"$ref":"#/$defs/endpointSource","description":"App endpoint returning an array of { value, label, count? } options at responsePath."}}}}}}}},{"description":"kb-search catalog widget (#91 Wave 3): summary-driven knowledge-base search through a PLUGGABLE PROVIDER. The provider seam keys of `props.content` are typed here; the rest stays free-form.","if":{"properties":{"widgetKey":{"const":"kb-search"}},"required":["widgetKey"]},"then":{"properties":{"props":{"type":"object","properties":{"content":{"type":"object","additionalProperties":true,"properties":{"provider":{"type":"string","description":"Provider registry key (default 'default' — the built-in endpoint search). An app registers bespoke providers (the xwiki proxy) on CnAppRoot's kbSearchProviders; the xwiki client stays app-side."},"space":{"type":"string","description":"Provider-specific KB space filter (passed to provider.search)."},"tags":{"description":"Provider-specific tag filter — a single tag or an array.","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"endpoint":{"type":"string","description":"The default provider's search endpoint (OpenRegister xWiki leaf by default)."},"queryParam":{"type":"string","description":"The default provider's query parameter name (default 'q')."},"bindTo":{"type":"string","description":"Workspace context key to auto-search on (default 'activeSummary')."},"minChars":{"type":"integer","minimum":0,"description":"Minimum characters before a search fires (default 3)."},"limit":{"type":"integer","minimum":1,"description":"Result cap passed to the provider (default 8)."},"externalOpen":{"type":"boolean","description":"Whether result links open in a new tab (defaults to the provider's own externalOpen flag)."},"unavailableFallback":{"type":"string","description":"Text shown when the provider rejects / is unavailable (replaces the default 'Knowledge base unavailable')."}}}}}}}}]};const schema62 = {"type":"object","required":["register","schema"],"additionalProperties":false,"description":"Declarative self-fetch source for the object-table built-in widget (CnWidgetObjectTable). The widget resolves `filter` @-tokens (@me, @today, @today±Nd, @workspace.*, ?-optional suffix) with the shared resolveFilterTokens grammar just before fetching, and drives CnDataTable's existing self-fetch. `register` MAY carry an `@resolve:` sentinel — the widget passes it through unexpanded (resolution is the host loader's responsibility). Externally supplied `rows` always win over `source`.","properties":{"register":{"type":"string","description":"OpenRegister register slug (or an `@resolve:<key>` sentinel, passed through unexpanded by the widget)."},"schema":{"type":"string","description":"OpenRegister schema slug."},"filter":{"type":"object","additionalProperties":true,"description":"Filter map (`{ field: value | value[] | { op: value | value[] } }`). Values may use the shared @-token grammar: `@me` (current user via @nextcloud/auth), `@now`, `@today`, relative-date arithmetic `@today±Nd` at day granularity (e.g. `@today-30d`, `@today+7d`), `@monthStart`/`@quarterStart`/`@yearStart`, `@objectId`/`@object.<field>` (detail context), `@workspace.<key>`/`@config.<key>` with a trailing `?` for optional clauses that drop when unresolved. IN-lists: an ARRAY value (directly, or via `{ in: [...] }`) matches any of its entries — tokens resolve item-by-item and the widget serializes the list as repeated `field[]` params (the shape OpenRegister parses)."},"order":{"type":"object","additionalProperties":{"type":"string","enum":["asc","desc"]},"description":"Fetch ordering: field name to direction map (e.g. { \"dueDate\": \"asc\" })."},"limit":{"type":"integer","minimum":0,"description":"Row cap. 0 (or omitted) shows all fetched rows; a positive value caps the rendered rows and enables the View-all footer when more rows exist."},"extend":{"type":"array","items":{"type":"string"},"description":"OpenRegister `_extend[]` values forwarded on the fetch (e.g. [\"calculations\"]) so read-time virtual/derived fields are hydrated and available as columns. Each entry is passed through verbatim."}}};const schema63 = {"type":"object","required":["url"],"additionalProperties":false,"description":"Wave 2 (#91): ONE coherent endpoint data binding shared by the stat / delta / object-table widgets (the chart uses the extended $defs/chartEndpointSource). Reads an arbitrary app REST endpoint through the library's useEndpointSource engine: params pass the SAME @-token grammar widget filters use (@me, @today±Nd, @monthStart, @workspace.<key>/@config.<key> with a trailing `?` for optional values that drop when unresolved — a REQUIRED token that stays unresolved blocks the fetch), requests dedupe + short-TTL cache per (method, url, resolved params), and the widget refetches on cn:page:refresh / a matching cn:widget:refresh. Exactly ONE of the widget's OpenRegister source | endpointSource may be configured — a cross-field rule enforced by validateManifestV2() as a post-schema check (clear error message), matching the stats-block precedent.","properties":{"url":{"type":"string","description":"Endpoint URL — app-relative (routed through generateUrl, e.g. '/apps/pipelinq/api/analytics/overview') or absolute (http/https, left untouched). May interpolate @page.<key> / @workspace.<key> / @config.<key> / @objectId / @object.<field> tokens inline; unresolved URL tokens collapse to an empty string."},"method":{"type":"string","enum":["GET","POST"],"default":"GET","description":"HTTP method. GET (default) sends the resolved params as query parameters; POST sends them as the JSON body."},"params":{"type":"object","additionalProperties":true,"description":"Request parameters. Values pass the shared filter-token grammar (resolveFilterTokens): @me, @now, @today, @today±Nd, @monthStart/@quarterStart/@yearStart, @objectId/@object.<field> (detail context), @workspace.<key>/@config.<key> with a trailing `?` for optional values (dropped when unresolved; e.g. `{ \"period\": \"@workspace.datePreset?\" }` rides the dashboard date-range pills). A required token that stays unresolved blocks the fetch until the page context provides it."},"responsePath":{"type":"string","description":"Dot-path pluck of the response payload (e.g. 'summary', 'data.series'). Omitted = the whole response body."}}};const schema69 = {"type":"object","required":["register","schema"],"additionalProperties":false,"description":"One KPI entry inside a multi-entry stats-block widget (CnStatsBlockWidget `entries[]`). Carries the same source contract as a type:'stat' widget: register + schema + metric + token-resolved filter (@today / @me / @workspace.* and ?-optional clauses), plus per-entry presentation (title, variant, countLabel), an optional route deep link, and hideWhenZero.","properties":{"title":{"type":"string","description":"KPI title rendered by the inner CnStatsBlock."},"register":{"type":"string","description":"OpenRegister register slug for this entry's count."},"schema":{"type":"string","description":"OpenRegister schema slug for this entry's count."},"metric":{"type":"string","description":"Aggregation metric for the REST /value aggregation (default 'count')."},"field":{"type":"string","description":"Field the metric aggregates over (metric-dependent; unused for count)."},"filter":{"type":"object","additionalProperties":true,"description":"Filter map with the shared @-token grammar (@today / @me / @workspace.<key>, trailing `?` for optional clauses)."},"route":{"type":"object","additionalProperties":true,"description":"Optional vue-router location for the KPI's deep link (renders the entry clickable)."},"variant":{"type":"string","enum":["default","primary","success","warning","error"],"description":"Color variant forwarded to the inner CnStatsBlock."},"countLabel":{"type":"string","description":"Label displayed next to the count."},"iconClass":{"type":"string","description":"Optional Nextcloud core icon class (icon-link, icon-mail, …) for the entry."},"hideWhenZero":{"type":"boolean","default":false,"description":"When true, the entry is omitted from the card when its resolved count is 0."}}};const schema70 = {"type":"object","required":["url"],"additionalProperties":false,"description":"The chart widget's endpoint binding: the $defs/endpointSource transport plus the labels/series response mapping. The mapping keys live INSIDE this block (not as sibling props) because the chart's flat `series` / `labels` props already carry the static data. When the plucked payload is an ARRAY of points (e.g. pipelinq /api/analytics/trends → responsePath 'series'), labelsPath / series[].path are PER-ITEM field paths (labelsPath 'date', series [{ name: 'Leads', path: 'value' }]); when it is an OBJECT they point at parallel arrays. Pie-family charts flatten the FIRST mapped series into the flat value array ApexCharts expects. Exactly ONE of dataSource | endpointSource per chart widget (post-schema check).","properties":{"url":{"type":"string","description":"Endpoint URL — app-relative (generateUrl) or absolute. Same token interpolation as $defs/endpointSource."},"method":{"type":"string","enum":["GET","POST"],"default":"GET","description":"HTTP method. GET (default) sends params as query parameters; POST as the JSON body."},"params":{"type":"object","additionalProperties":true,"description":"Request parameters — the shared filter-token grammar (see $defs/endpointSource.params). Params re-resolve and the chart refetches when the dashboard date range changes (the page publishes dateFrom / dateTo / datePreset into the workspace context)."},"responsePath":{"type":"string","description":"Dot-path pluck of the response payload. Omitted = the whole response body."},"labelsPath":{"type":"string","description":"Labels/categories mapping: a per-item field path for an ARRAY payload ('date'), or the path of a parallel label array for an OBJECT payload ('labels')."},"series":{"type":"array","description":"Series mapping — one entry per rendered series.","items":{"type":"object","required":["path"],"additionalProperties":false,"properties":{"name":{"type":"string","description":"Series display name (legend / tooltip). Defaults to the path."},"path":{"type":"string","description":"Value mapping: a per-item field path for an ARRAY payload ('value'), or the path of a parallel number array for an OBJECT payload ('totals')."}}}}}};const schema73 = {"description":"Valid slot value. Either a literal slot name (body, sidebar, header-actions, footer, modal) or a tab:<id> / section:<id> pattern string.","oneOf":[{"type":"string","enum":["body","sidebar","header-actions","footer","modal"],"description":"Literal slot name."},{"type":"string","pattern":"^(tab|section):.+","description":"Named tab or section slot. Format: tab:<id> or section:<id> where <id> is at least one character."}]};const schema74 = {"type":"object","description":"Declarative data binding for widgets. Forms: (a) shorthand {register, schema, filter?, aggregate: 'count'} — the lib builds a count query and resolves to {count}. (b) raw {graphql: {query, variables?, selectors}} — the lib issues the query and runs selectors. (c) #91 Wave 3 chart aggregation — `aggregate` as an OBJECT {groupBy, metric?: count|sum, sumField?, topN?, otherBucket?, labelResolve?} grouped over the schema's objects via OpenRegister's /grouped facet (client-side collection fallback), plus an optional sibling `drilldown` {route, filterParam}. Carry-forward from v1.3.0 widgetDef.dataSource.","additionalProperties":true,"properties":{"register":{"type":"string","description":"Shorthand: register slug."},"schema":{"type":"string","description":"Shorthand: schema slug."},"filter":{"type":"object","description":"Shorthand: filter map inlined into the generated query.","additionalProperties":true},"aggregate":{"description":"Shorthand aggregation. The STRING 'count' builds a GraphQL count query resolving to {count}. The OBJECT form (#91 Wave 3) is a chart-only categorical group-by served by OpenRegister's /grouped facet.","oneOf":[{"type":"string","enum":["count"]},{"type":"object","required":["groupBy"],"additionalProperties":false,"description":"#91 Wave 3 chart aggregation: group the schema's objects by `groupBy`, count (default) or sum `sumField`, keep the `topN` largest (sorted desc) and optionally fold the remainder into a translated 'Other' slice, resolving reference keys to labels/colours via `labelResolve`.","properties":{"groupBy":{"type":"string","description":"The categorical field grouped on."},"metric":{"type":"string","enum":["count","sum"],"default":"count","description":"count (default) | sum. sum requires sumField."},"sumField":{"type":"string","description":"Numeric field summed when metric is 'sum' (required for sum)."},"topN":{"type":"integer","minimum":1,"description":"Keep the N largest groups (sorted by value desc)."},"otherBucket":{"type":"boolean","description":"Fold the post-topN remainder into a single translated 'Other' slice (sum of the rest). The Other bucket never drilldown-navigates."},"labelResolve":{"type":"object","required":["schema"],"additionalProperties":false,"description":"Resolve reference (uuid) group keys to the referenced objects' display labels (and optional per-category colours) through the shared object store — the fkResolve pattern.","properties":{"register":{"type":"string","description":"Register the reference points into (defaults to the dataSource register)."},"schema":{"type":"string","description":"Schema slug the reference points into."},"labelField":{"type":"string","description":"Property used as the display label (default 'name')."},"colorField":{"type":"string","description":"Optional property read as a per-category CSS colour (feeds the chart's colorMap path)."}}}}}]},"drilldown":{"type":"object","required":["route","filterParam"],"additionalProperties":false,"description":"#91 Wave 3 (chart only): a segment/bar click navigates to `route` with the clicked category's RAW key in the query ({ [filterParam]: rawKey }). A `/`-prefixed route is a path, otherwise a route name. Works with the OBJECT `aggregate` and the legacy `groupBy` forms; the folded 'Other' bucket never navigates.","properties":{"route":{"type":"string","description":"Destination route name, or a path when it starts with '/'."},"filterParam":{"type":"string","description":"Query-param name the clicked category's raw key is written to."}}},"graphql":{"type":"object","description":"Raw GraphQL form.","additionalProperties":false,"required":["query","selectors"],"properties":{"query":{"type":"string","description":"GraphQL query document."},"variables":{"type":"object","description":"Variables map passed alongside query.","additionalProperties":true},"selectors":{"type":"object","description":"Map of result-prop name to dot-path selector.","additionalProperties":{"type":"string"}}}}}};const pattern13 = new RegExp("^@", "u");const pattern14 = new RegExp("^@(?:me|now|today|monthStart|quarterStart|yearStart)$|^@today[+-][0-9]+d$", "u");const pattern15 = new RegExp("^@resolve:[a-z][a-z0-9_-]*$|^@config\\.[A-Za-z][A-Za-z0-9_.]*\\??$", "u");const pattern16 = new RegExp("^@objectId$|^@object\\.[A-Za-z][A-Za-z0-9_]*$", "u");const pattern17 = new RegExp("^@workspace\\.[A-Za-z][A-Za-z0-9_]*\\??$", "u");const pattern18 = new RegExp("^@route\\.[A-Za-z][A-Za-z0-9_-]*$", "u");const pattern19 = new RegExp("^@self\\.[A-Za-z][A-Za-z0-9_]*$|^@ref:[A-Za-z][A-Za-z0-9_./-]*$|^@aggregate:.+$", "u");const pattern20 = new RegExp("^@total$", "u");const pattern21 = new RegExp("^@currentFiscalYear$|^@page\\.[A-Za-z][A-Za-z0-9_]*$|^@runtime(?:\\.[A-Za-z][A-Za-z0-9_]*)?$", "u");function validate29(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate29.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}const _errs1 = errors;let valid0 = false;const _errs2 = errors;if(typeof data === "string"){if(!pattern14.test(data)){const err0 = {instancePath,schemaPath:"#/$defs/sentinelFilterToken/pattern",keyword:"pattern",params:{pattern: "^@(?:me|now|today|monthStart|quarterStart|yearStart)$|^@today[+-][0-9]+d$"},message:"must match pattern \""+"^@(?:me|now|today|monthStart|quarterStart|yearStart)$|^@today[+-][0-9]+d$"+"\""};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}}else {const err1 = {instancePath,schemaPath:"#/$defs/sentinelFilterToken/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}var _valid0 = _errs2 === errors;valid0 = valid0 || _valid0;const _errs5 = errors;if(typeof data === "string"){if(!pattern15.test(data)){const err2 = {instancePath,schemaPath:"#/$defs/sentinelConfigToken/pattern",keyword:"pattern",params:{pattern: "^@resolve:[a-z][a-z0-9_-]*$|^@config\\.[A-Za-z][A-Za-z0-9_.]*\\??$"},message:"must match pattern \""+"^@resolve:[a-z][a-z0-9_-]*$|^@config\\.[A-Za-z][A-Za-z0-9_.]*\\??$"+"\""};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}}else {const err3 = {instancePath,schemaPath:"#/$defs/sentinelConfigToken/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}var _valid0 = _errs5 === errors;valid0 = valid0 || _valid0;const _errs8 = errors;if(typeof data === "string"){if(!pattern16.test(data)){const err4 = {instancePath,schemaPath:"#/$defs/sentinelObjectToken/pattern",keyword:"pattern",params:{pattern: "^@objectId$|^@object\\.[A-Za-z][A-Za-z0-9_]*$"},message:"must match pattern \""+"^@objectId$|^@object\\.[A-Za-z][A-Za-z0-9_]*$"+"\""};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}}else {const err5 = {instancePath,schemaPath:"#/$defs/sentinelObjectToken/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}var _valid0 = _errs8 === errors;valid0 = valid0 || _valid0;const _errs11 = errors;if(typeof data === "string"){if(!pattern17.test(data)){const err6 = {instancePath,schemaPath:"#/$defs/sentinelWorkspaceToken/pattern",keyword:"pattern",params:{pattern: "^@workspace\\.[A-Za-z][A-Za-z0-9_]*\\??$"},message:"must match pattern \""+"^@workspace\\.[A-Za-z][A-Za-z0-9_]*\\??$"+"\""};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}}else {const err7 = {instancePath,schemaPath:"#/$defs/sentinelWorkspaceToken/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}var _valid0 = _errs11 === errors;valid0 = valid0 || _valid0;const _errs14 = errors;if(typeof data === "string"){if(!pattern18.test(data)){const err8 = {instancePath,schemaPath:"#/$defs/sentinelRouteToken/pattern",keyword:"pattern",params:{pattern: "^@route\\.[A-Za-z][A-Za-z0-9_-]*$"},message:"must match pattern \""+"^@route\\.[A-Za-z][A-Za-z0-9_-]*$"+"\""};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}}else {const err9 = {instancePath,schemaPath:"#/$defs/sentinelRouteToken/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}var _valid0 = _errs14 === errors;valid0 = valid0 || _valid0;const _errs17 = errors;if(typeof data === "string"){if(!pattern19.test(data)){const err10 = {instancePath,schemaPath:"#/$defs/sentinelDeclarativeToken/pattern",keyword:"pattern",params:{pattern: "^@self\\.[A-Za-z][A-Za-z0-9_]*$|^@ref:[A-Za-z][A-Za-z0-9_./-]*$|^@aggregate:.+$"},message:"must match pattern \""+"^@self\\.[A-Za-z][A-Za-z0-9_]*$|^@ref:[A-Za-z][A-Za-z0-9_./-]*$|^@aggregate:.+$"+"\""};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}}else {const err11 = {instancePath,schemaPath:"#/$defs/sentinelDeclarativeToken/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}var _valid0 = _errs17 === errors;valid0 = valid0 || _valid0;const _errs20 = errors;if(typeof data === "string"){if(!pattern20.test(data)){const err12 = {instancePath,schemaPath:"#/$defs/sentinelVisibleWhenToken/pattern",keyword:"pattern",params:{pattern: "^@total$"},message:"must match pattern \""+"^@total$"+"\""};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}}else {const err13 = {instancePath,schemaPath:"#/$defs/sentinelVisibleWhenToken/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}var _valid0 = _errs20 === errors;valid0 = valid0 || _valid0;const _errs23 = errors;if(typeof data === "string"){if(!pattern21.test(data)){const err14 = {instancePath,schemaPath:"#/$defs/sentinelDeprecatedToken/pattern",keyword:"pattern",params:{pattern: "^@currentFiscalYear$|^@page\\.[A-Za-z][A-Za-z0-9_]*$|^@runtime(?:\\.[A-Za-z][A-Za-z0-9_]*)?$"},message:"must match pattern \""+"^@currentFiscalYear$|^@page\\.[A-Za-z][A-Za-z0-9_]*$|^@runtime(?:\\.[A-Za-z][A-Za-z0-9_]*)?$"+"\""};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}}else {const err15 = {instancePath,schemaPath:"#/$defs/sentinelDeprecatedToken/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}var _valid0 = _errs23 === errors;valid0 = valid0 || _valid0;if(!valid0){const err16 = {instancePath,schemaPath:"#/anyOf",keyword:"anyOf",params:{},message:"must match a schema in anyOf"};if(vErrors === null){vErrors = [err16];}else {vErrors.push(err16);}errors++;}else {errors = _errs1;if(vErrors !== null){if(_errs1){vErrors.length = _errs1;}else {vErrors = null;}}}validate29.errors = vErrors;return errors === 0;}validate29.evaluated = {"dynamicProps":false,"dynamicItems":false};function validate28(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate28.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}const _errs1 = errors;let valid0 = false;const _errs2 = errors;const _errs3 = errors;const _errs4 = errors;if(typeof data === "string"){if(!pattern13.test(data)){const err0 = {};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}}var valid1 = _errs4 === errors;if(valid1){const err1 = {instancePath,schemaPath:"#/anyOf/0/not",keyword:"not",params:{},message:"must NOT be valid"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}else {errors = _errs3;if(vErrors !== null){if(_errs3){vErrors.length = _errs3;}else {vErrors = null;}}}var _valid0 = _errs2 === errors;valid0 = valid0 || _valid0;const _errs5 = errors;if(!(validate29(data, {instancePath,parentData,parentDataProperty,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate29.errors : vErrors.concat(validate29.errors);errors = vErrors.length;}var _valid0 = _errs5 === errors;valid0 = valid0 || _valid0;if(!valid0){const err2 = {instancePath,schemaPath:"#/anyOf",keyword:"anyOf",params:{},message:"must match a schema in anyOf"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}else {errors = _errs1;if(vErrors !== null){if(_errs1){vErrors.length = _errs1;}else {vErrors = null;}}}validate28.errors = vErrors;return errors === 0;}validate28.evaluated = {"dynamicProps":false,"dynamicItems":false};const wrapper0 = {validate: validate27};function validate27(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate27.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}const _errs1 = errors;let valid0 = true;const _errs2 = errors;if(typeof data !== "string"){const err0 = {};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}var _valid0 = _errs2 === errors;errors = _errs1;if(vErrors !== null){if(_errs1){vErrors.length = _errs1;}else {vErrors = null;}}let ifClause0;if(_valid0){const _errs4 = errors;if(!(validate28(data, {instancePath,parentData,parentDataProperty,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate28.errors : vErrors.concat(validate28.errors);errors = vErrors.length;}var _valid0 = _errs4 === errors;valid0 = _valid0;ifClause0 = "then";}else {const _errs5 = errors;const _errs6 = errors;let valid1 = true;const _errs7 = errors;if(!(Array.isArray(data))){const err1 = {};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}var _valid1 = _errs7 === errors;errors = _errs6;if(vErrors !== null){if(_errs6){vErrors.length = _errs6;}else {vErrors = null;}}let ifClause1;if(_valid1){const _errs9 = errors;if(Array.isArray(data)){const len0 = data.length;for(let i0=0; i0<len0; i0++){if(!(wrapper0.validate(data[i0], {instancePath:instancePath+"/" + i0,parentData:data,parentDataProperty:i0,rootData,dynamicAnchors}))){vErrors = vErrors === null ? wrapper0.validate.errors : vErrors.concat(wrapper0.validate.errors);errors = vErrors.length;}}}var _valid1 = _errs9 === errors;valid1 = _valid1;if(valid1){var items1 = true;}ifClause1 = "then";}else {const _errs11 = errors;const _errs12 = errors;let valid4 = true;const _errs13 = errors;if(!(data && typeof data == "object" && !Array.isArray(data))){const err2 = {};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}var _valid2 = _errs13 === errors;errors = _errs12;if(vErrors !== null){if(_errs12){vErrors.length = _errs12;}else {vErrors = null;}}if(_valid2){const _errs15 = errors;if(data && typeof data == "object" && !Array.isArray(data)){for(const key0 in data){if(!(wrapper0.validate(data[key0], {instancePath:instancePath+"/" + key0.replace(/~/g, "~0").replace(/\//g, "~1"),parentData:data,parentDataProperty:key0,rootData,dynamicAnchors}))){vErrors = vErrors === null ? wrapper0.validate.errors : vErrors.concat(wrapper0.validate.errors);errors = vErrors.length;}}}var _valid2 = _errs15 === errors;valid4 = _valid2;if(valid4){var props2 = true;}}if(!valid4){const err3 = {instancePath,schemaPath:"#/else/else/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}var _valid1 = _errs11 === errors;valid1 = _valid1;ifClause1 = "else";}if(!valid1){const err4 = {instancePath,schemaPath:"#/else/if",keyword:"if",params:{failingKeyword: ifClause1},message:"must match \""+ifClause1+"\" schema"};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}var _valid0 = _errs5 === errors;valid0 = _valid0;ifClause0 = "else";}if(!valid0){const err5 = {instancePath,schemaPath:"#/if",keyword:"if",params:{failingKeyword: ifClause0},message:"must match \""+ifClause0+"\" schema"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}validate27.errors = vErrors;evaluated0.props = props2;evaluated0.items = items1;return errors === 0;}validate27.evaluated = {"dynamicProps":true,"dynamicItems":true};const schema64 = {"type":"object","required":["id","label"],"additionalProperties":false,"description":"A typed page action with a discriminator field. The type field determines behaviour: handler (registry function), open-modal (modal by id), open-page (named route), navigate (URL), object-op (declarative OpenRegister mutation via useObjectStore), export (opens the shared CnMassExportDialog export launcher), open-form (schema-driven create dialog — CnActionButtons), refresh (bumps the cn:page:refresh signal), api-call (POST/PUT an app endpoint + toast + refresh — CnActionButtons/dispatchAction), agent (run a governed hermiq agent), run-node (invoke one OpenRegister flow node against the page object, config collected via a dialog sourced from the node's own declared form — CnActionButtons/dispatchAction, or-flow-run-node; distinct from the UNRELATED setup-wizard step type of a similar name, 'run-action'), toggle (two-way state button — CnActionButtons only, NOT dispatchable). When type is omitted, it defaults to 'handler' (back-compatibility with v1.3.0 action declarations). The Ajv instance is compiled with useDefaults: true so the default is applied during validation.","properties":{"id":{"type":"string","description":"Unique action identifier within the page's actions array."},"label":{"type":"string","description":"i18n key resolved by the consuming app's t() function at render time."},"type":{"type":"string","enum":["handler","open-modal","open-page","navigate","object-op","export","open-form","refresh","api-call","agent","run-node","toggle"],"default":"handler","description":"Action behaviour discriminator. Defaults to 'handler' when omitted (back-compat with v1.3.0). handler: calls a registry function; open-modal: opens a modal by target id; open-page: navigates to a named route; navigate: navigates to a URL; object-op: dispatches a declarative mutation (patch | delete | create) of an OpenRegister object via the shared object store; export: opens the shared CnMassExportDialog export launcher configured via entities[]/formats[] — the confirm payload ({format, entity?}) routes to the action's `handler` in the manifest actions map (the app's export service does the download). open-form (#91 Wave 3): CnActionButtons opens a schema-driven create dialog (CnAdvancedFormDialog) for the action's register/schema, saves + toasts + refreshes + optionally navigates to onSuccessRoute. refresh (#91 Wave 3): bumps the page-level cn:page:refresh event-bus signal so every endpoint-bound widget refetches. api-call (#91 Wave 3): POST/PUT the token-interpolated url with payload/params (JSON body, payload resolves @-tokens recursively at any depth) + success/error toast + auto page-refresh (unless refresh:false); confirm gating is surface-consumed intent (object-op precedent); download:true requests a binary blob and triggers a browser file download instead (auto-refresh defaults to OFF in that mode). agent (hermiq#41): run a governed hermiq agent against the page object — POSTs { register, schema, objectId, resultField?, skill?, prompt? } to /apps/hermiq/api/agents/{agent}/run-on-object (object-RBAC-scoped; dispatches the governed AgentRunRequestedEvent). register/schema/objectId default to the page's @register/@schema/@objectId object context. A first-class companion to api-call (which remains the fallback for a bespoke body); hermiq is NOT hard-required — an app-level 404 surfaces a graceful 'agent runtime unavailable' toast. toggle (#91 Wave 3): a stateful two-way state button rendered by CnActionButtons (GET stateSource on mount, optimistic write on click) — NOT dispatchable through dispatchAction. object-op declares mutation INTENT only — authority is enforced server-side by OpenRegister RBAC (ADR-022/ADR-023); authorization-shaped fields have no client-side effect and are not accepted here."},"op":{"type":"string","enum":["patch","delete","create"],"description":"object-op only: the mutation verb. patch merges `values` into the row's object (row-scoped); delete removes the row's object (row-scoped, ALWAYS confirm-gated); create adds a new object built from `values` against the widget's source register/schema (widget-scoped footer/header affordance). Required when type is 'object-op'."},"values":{"type":"object","additionalProperties":true,"description":"object-op only: the verb's payload. For patch: the partial object merged over the row's object. For create: the new object's properties. Omitted for delete."},"confirm":{"type":"boolean","default":false,"description":"Confirm-gating (object-op + #91 Wave 3 api-call / open-form + agent): when true, the action presents a CnConfirmDialog before running (the dispatcher / CnActionButtons runs AFTER confirmation). object-op delete ALWAYS confirms regardless of this flag."},"target":{"type":"string","description":"Destination for open-modal (modal id), open-page (route name), or navigate (URL). Ignored for handler type."},"props":{"type":"object","description":"Additional props forwarded to the handler or modal.","additionalProperties":true},"createOverride":{"type":"string","description":"Registry handler name that owns the persist for an `open-form` action, replacing the default objectStore.saveObject. Resolved exactly as CnIndexPage resolves its own `createOverride` prop (a kind:'create-override' entry's `.handler`, a function-valued registry entry, or a function in the legacy customComponents map). Needed when the schema requires a field the create form cannot supply on its own — a server-minted foreign key, say — where a straight save would 400."},"includeFields":{"type":"array","items":{"type":"string"},"description":"open-form: the only fields the create dialog asks for. One schema often backs two surfaces, a detail page that edits all of it and a header button that collects what someone filing a new one types, and this is how the button says which it is. Omit for the whole schema."},"excludeFields":{"type":"array","items":{"type":"string"},"description":"open-form: fields the create dialog leaves out. Use it to drop a handful; use includeFields when it is easier to name what stays."},"fieldOverrides":{"type":"object","additionalProperties":true,"description":"open-form: per-field overrides passed to fieldsFromSchema, keyed by field. Recognised keys include label, order, hidden, readOnly and widget."},"advanced":{"type":"boolean","default":false,"description":"open-form: open the properties-and-JSON table (CnAdvancedFormDialog) instead of the plain form. The plain form is the default because a header button is aimed at someone filing a record, not at inspecting its schema."},"formTitle":{"type":"string","description":"open-form: overrides the create dialog's heading. Defaults to 'Create {schema title}'."},"size":{"type":"string","enum":["small","normal","large","full"],"default":"normal","description":"open-form: how wide the create dialog is, passed straight to NcDialog. Widen a form that asks enough questions to need scrolling; pair it with columns: 2."},"columns":{"type":"integer","enum":[1,2],"default":1,"description":"open-form: how many columns the fields flow into. 2 pairs them up, which halves the scrolling on a longer form. Textareas and JSON editors still span the full width, and the layout collapses to one column below 700px. Widen the dialog with size: 'large' as well, or two columns are merely two narrow ones."},"handler":{"type":"string","description":"Registry key for type: 'handler'. Resolved across both registries passed to CnAppRoot: a v2 `registry` entry of `kind: 'handler'` exposing the function as `.handler` (or `.fn`), a directly function-valued registry entry, or a function-valued entry in the deprecated `customComponents` map. The same resolution serves actions[], bulkActions[] and headerActions[]. Also the built-in dispatch verb when paired with `route` (handler: 'navigate' → $router.push to `route`)."},"route":{"type":"string","description":"Destination route name for handler: 'navigate'. The dispatcher (manifestActionDispatch) calls $router.push({ name: route, params }). For row-level actions params include { id: row[rowKey] } automatically — do NOT restate it as params: { id: \"{id}\" }, though that placeholder does resolve (see `params`). Page-level header actions navigate without row context (e.g. a 'New X' action to a detail route)."},"icon":{"type":"string","description":"Optional icon for the action, rendered by CnActionsBar. Either an MDI icon name (e.g. 'TextBoxOutline') or a CSS icon class (e.g. 'icon-file')."},"entities":{"type":"array","description":"export only: selectable entity types offered by the export launcher (e.g. Leads / Requests). Optional — when absent the dialog shows only the format picker. Each entry needs an id + pre-translated label.","items":{"type":"object","additionalProperties":false,"required":["id","label"],"properties":{"id":{"type":"string","description":"Entity id handed to the confirm handler."},"label":{"type":"string","description":"Pre-translated display label."}}}},"formats":{"type":"array","description":"export only: the offered export formats — bare ids ('excel', 'csv', 'json' — lifted to {id, label} with an upper-cased label) or full {id, label} entries. Optional — the dialog's built-in Excel/CSV defaults apply when absent.","items":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":false,"required":["id","label"],"properties":{"id":{"type":"string","description":"Format id handed to the confirm handler."},"label":{"type":"string","description":"Pre-translated display label."}}}]}},"description":{"type":"string","description":"export only: pre-translated description shown above the export launcher's pickers."},"url":{"type":"string","description":"api-call / toggle only: the app endpoint (POST/PUT). App-relative (routed through generateUrl) or absolute (http/https). May interpolate @objectId / @object.<field> / @workspace.<key> / @config.<key> tokens inline, as well as the literal {objectId} brace placeholder (unresolved tokens collapse to empty)."},"method":{"type":"string","enum":["POST","PUT"],"description":"api-call: HTTP method (default POST). toggle writeUrl: default PUT."},"payload":{"type":"object","additionalProperties":true,"description":"api-call only: the JSON request body — PREFERRED over `params`, and used instead of it when both are set. Values run the SAME token grammar as `params` (@me, @now, @today±Nd, @monthStart/@quarterStart/@yearStart, @objectId, @object.<field>, @workspace.<key>/@config.<key> with a trailing `?` marking a value OPTIONAL — dropped when unresolved) but resolve RECURSIVELY at ANY nesting depth, including arrays of objects — e.g. a Filinq document-generation body: { \"dataRefs\": [{ \"register\": \"crm\", \"schema\": \"lead\", \"id\": \"@objectId\" }] }. A required (non-`?`) token left unresolved anywhere in the tree BLOCKS the call (error toast) instead of sending the literal token string to the server."},"params":{"type":"object","additionalProperties":true,"description":"Two distinct uses depending on the action's dispatch. (1) api-call / toggle: the JSON request body (legacy — prefer `payload` for anything with nested objects/arrays; ignored when `payload` is set). Values run the shared filter-token grammar ONE level deep (@me, @today±Nd, @workspace.<key>/@config.<key> with a trailing `?` for optional values dropped when unresolved; a required unresolved token skips the call). (2) handler: 'navigate' (index-page row actions, manifestActionDispatch): vue-router params merged OVER the default { id: row[rowKey] }. OMIT it for the ordinary 'open this row's detail page' action — the row id is already injected. String values run the `{field}` ROW-token grammar (NOT the @-token grammar): \"{id}\" resolves to row.id with its type preserved, \"run-{id}\" interpolates as text, and a brace-less \"new\" stays literal (that is what makes a 'New X' action navigate with { id: 'new' }). A token naming a field the row does not carry is dropped with a console.warn — so `id` falls back to the row id — instead of being pushed as a literal %7Bid%7D path segment."},"download":{"type":"boolean","default":false,"description":"api-call only: request the response as a binary blob (axios responseType 'blob') and trigger a browser file download instead of a JSON toast+refresh cycle. The filename is taken from the response's Content-Disposition header, else the token-resolved `filename`, else 'download.pdf'. The success toast still shows; unlike a normal api-call the page does NOT auto-refresh afterwards unless `refresh: true` is explicitly set."},"filename":{"type":"string","description":"api-call `download: true` only: fallback filename used when the response carries no Content-Disposition header (falls back further to 'download.pdf'). Interpolates the same token grammar as `url` (@objectId, @object.<field>, @workspace.<key>, @config.<key>, {objectId})."},"successMessage":{"type":"string","description":"api-call / open-form / agent / run-node / toggle: pre-translated success toast text (a library default applies when absent; agent default 'Run queued')."},"errorMessage":{"type":"string","description":"api-call / agent / run-node / toggle: pre-translated error toast text (falls back to the server's error/message, then a library default; an agent 404 with no structured body toasts 'agent runtime unavailable' instead)."},"refresh":{"type":"boolean","default":true,"description":"api-call / agent / run-node / toggle: bump the page-level cn:page:refresh signal after a successful call (default true; set false to skip). EXCEPTION: for an api-call with download:true the default flips to false — a file download normally shouldn't also force-refetch every widget — set refresh:true explicitly to opt back in."},"flowId":{"type":"string","description":"run-node only (REQUIRED): the published flow's uuid whose node this action invokes. A node's config and eligibility are properties of the flow it lives in (RN-3, OpenRegister's or-flow-run-node), so the manifest names which flow's instance to call rather than a bare node type — two flows could each carry the same node TYPE wired differently."},"nodeId":{"type":"string","description":"run-node only (REQUIRED): the id of the node, within flowId's published graph, to invoke directly. POSTed to /api/flows/{flowId}/nodes/{nodeId}/run — refused (404) unless that node type has opted in to direct invocation (IFlowDirectlyInvokable)."},"subject":{"type":"string","description":"run-node only: the subject object the node acts on and is authorized against (OpenRegister object-RBAC — the caller needs update permission on it; the flow's own flow.run right is deliberately NOT what gates this). Typically @objectId; may interpolate the shared @-token grammar. An unresolved required token BLOCKS the call, matching agent's objectId."},"agent":{"type":"string","description":"agent only (REQUIRED): the hermiq agent uuid to run against the page object. POSTed to /apps/hermiq/api/agents/{agent}/run-on-object (hermiq#41) — object-RBAC-scoped, dispatches the governed AgentRunRequestedEvent. May interpolate the shared @-token grammar (@objectId, @object.<field>, @workspace.<key>, @config.<key>)."},"skill":{"type":"string","description":"agent only: optional skill id folded into the governed run (interpolates the same @-token grammar as `agent`)."},"prompt":{"type":"string","description":"agent only: optional prompt handed to the governed run. Interpolates the shared @-token grammar inline (@objectId, @object.<field>, @workspace.<key>, @config.<key>) so it can be grounded on the page object — e.g. 'Summarise @object.title'."},"resultField":{"type":"string","description":"agent only: the object field the agent's result is written back to (falls back to hermiq's default result field when absent)."},"objectId":{"type":"string","description":"agent only: the target object id. Defaults to the page object context's @objectId; an unresolved required @objectId BLOCKS the call (fail-closed) rather than sending a literal token. May be an explicit id or an @-token string."},"register":{"type":"string","description":"open-form / agent / run-node: OpenRegister register slug. open-form: the create dialog's schema register. agent / run-node: the register the subject object belongs to — falls back to the page object context's @register."},"schema":{"type":"string","description":"open-form / agent / run-node: OpenRegister schema slug. open-form: the create dialog fetches this schema and saves the new object against it. agent / run-node: the schema the subject object belongs to — falls back to the page object context's @schema."},"onSuccessRoute":{"description":"open-form only: optional post-save navigation target (#91). A bare route NAME (string) navigates with the saved object's id merged into the route params under `id` (harmless when the route has no `:id` segment — backward compatible). The object form { name, paramField?, objectParam? } names the id param (`paramField`, default `id`) and, when `objectParam` is set, also passes the whole saved object under that param key (for a props:true detail route to render without a refetch). The id is read from saved.id, then saved.uuid, then saved['@self'].id.","oneOf":[{"type":"string"},{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","description":"The vue-router route NAME pushed after a successful save."},"paramField":{"type":"string","default":"id","description":"Route param name populated from the saved object's id (default `id`)."},"objectParam":{"type":"string","description":"When set, the whole saved object is passed under this route param (props:true detail routes render without a refetch)."}}}]},"labelOn":{"type":"string","description":"toggle only: button label rendered while the state is ON (true). Falls back to `label`."},"labelOff":{"type":"string","description":"toggle only: button label rendered while the state is OFF (false). Falls back to `label`."},"stateSource":{"$ref":"#/$defs/endpointSource","description":"toggle only: the endpoint the initial state is read from on mount (the shared endpointSource shape — url + token-resolved params + responsePath). The `field` dot-path picks the boolean off the payload."},"writeUrl":{"type":"string","description":"toggle only: the endpoint the flipped state is written to on click (interpolates the same tokens as `url`)."},"field":{"type":"string","description":"toggle only: the state field — read off the stateSource payload on mount AND sent (as the flipped boolean) in the write body under this key."},"variant":{"type":"string","description":"CnActionButtons button variant (e.g. 'primary', 'secondary', 'error'). 'error' also styles the confirm dialog as destructive. A 'primary' action is never collapsed into CnActionButtons' overflow menu and consumes none of its `inline` slots: NcActions paints all of its inline actions with one shared variant, so a lone primary among them is not expressible."},"children":{"type":"array","description":"Sub-actions, rendered by CnActionButtons as this action's OWN chevron dropdown beside its button — deliberately not folded into the page's single overflow menu, because NcActions cannot nest and a list that grows per record (app versions, say) would swamp it. Children take the same shape as any action, `visibleWhen` included, and an action carrying them consumes none of the `inline` slots. The parent itself still renders its own button beside the chevron (`type` defaults to 'handler' when omitted), so a parent meant only to group its children needs a `handler` that does something meaningful — an untyped, handler-less parent renders a button that dispatches to nothing.","items":{"$ref":"#/$defs/action"}},"childrenLabel":{"type":"string","description":"i18n key naming the `children` dropdown. Falls back to the parent action's own label, so the chevron is never announced unlabelled."},"visibleWhen":{"$ref":"#/$defs/visibleWhen","description":"#91 Wave 3: an optional predicate gating whether the action renders — the shared banner shape ({ endpoint | source | field, op, value }). The `field`-only LOCAL form evaluates against the page object context (a detail action shown only in the right lifecycle state); endpoint / source forms fetch. Fail-safe: a broken predicate hides the action."}},"allOf":[{"description":"object-op actions MUST declare their mutation verb via `op`.","if":{"properties":{"type":{"const":"object-op"}},"required":["type"]},"then":{"required":["op"]}},{"description":"api-call actions MUST declare their endpoint via `url`.","if":{"properties":{"type":{"const":"api-call"}},"required":["type"]},"then":{"required":["url"]}},{"description":"open-form actions MUST declare the create schema via `schema`.","if":{"properties":{"type":{"const":"open-form"}},"required":["type"]},"then":{"required":["schema"]}},{"description":"agent actions MUST declare the target agent uuid via `agent`.","if":{"properties":{"type":{"const":"agent"}},"required":["type"]},"then":{"required":["agent"]}},{"description":"toggle actions MUST declare their write endpoint via `writeUrl`.","if":{"properties":{"type":{"const":"toggle"}},"required":["type"]},"then":{"required":["writeUrl"]}},{"description":"run-node actions MUST declare which flow and which node within it (RN-3, or-flow-run-node) — a node's config and eligibility are properties of the flow it lives in, so neither can be inferred.","if":{"properties":{"type":{"const":"run-node"}},"required":["type"]},"then":{"required":["flowId","nodeId"]}}]};const wrapper2 = {validate: validate33};const schema66 = {"type":"object","additionalProperties":false,"description":"#91 Wave 3: the shared visibility predicate (the Wave-1 banner shape). THREE modes: `endpoint` (GET a JSON endpoint, `field` dot-paths into the body), `source` (an OpenRegister { register, schema, filter? } query — `field` into the first result, or omit / use @total for the collection total), or LOCAL (neither endpoint nor source — `field` dot-paths into the caller's object context, e.g. a detail-page record). `op` defaults to eq. Evaluation is FAIL-SAFE (any error → hidden).","properties":{"appInstalled":{"type":"string","minLength":1,"description":"Nextcloud app id that must be installed and enabled for the guarded element to show. A PRECONDITION rather than a fourth mode: it is checked before anything else, and on its own it is the whole condition. Combined with endpoint/source/field it gates that mode too, so both must hold. It exists because the menu's `visibleIf` already spoke this word and `visibleWhen` did not, so the same manifest vocabulary meant two different things in two places. Use it on an action that writes into a sibling app, so an install without that app shows no button rather than a form that saves nowhere."},"endpoint":{"type":"string","description":"A same-origin URL returning JSON; `field` is a dot-path into the body."},"source":{"type":"object","additionalProperties":true,"description":"An OpenRegister object query { register, schema, filter? } (filter supports the shared @-token grammar). `field` dot-paths into the first result; omit it (or use @total) to compare the collection total.","properties":{"register":{"type":"string"},"schema":{"type":"string"},"filter":{"type":"object","additionalProperties":true}}},"field":{"type":"string","description":"Dot-path to the compared value — into the endpoint body, the source's first result, or (LOCAL mode) the caller's object context."},"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte","empty","notEmpty"],"default":"eq","description":"Comparison operator (default eq). eq/neq compare loosely-normalised primitives; ordering operators coerce both sides to Number. `empty` / `notEmpty` take no `value` and treat undefined, null, '' and an empty array alike — the one question eq cannot ask, because an unset field arrives in a shape that depends on the store and String(null) is the word 'null' rather than blank."},"value":{"description":"The right-hand side of the comparison, resolved through the shared @-token grammar so `@me` names the signed-in reader rather than a literal only the server knows. Omitted for `empty` / `notEmpty`."},"all":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/visibleWhen"},"description":"Every listed condition must hold. Use it where a gate is more than one fact — a Claim button that is both 'not closed' and 'nobody holds it'. Each entry is a full visibleWhen and may compose again."},"any":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/visibleWhen"},"description":"At least one listed condition must hold. Ignored when `all` is also present."}}};const wrapper3 = {validate: validate34};function validate34(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate34.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}if(data && typeof data == "object" && !Array.isArray(data)){if(data.op === undefined){data.op = "eq";}for(const key0 in data){if(!((((((((key0 === "appInstalled") || (key0 === "endpoint")) || (key0 === "source")) || (key0 === "field")) || (key0 === "op")) || (key0 === "value")) || (key0 === "all")) || (key0 === "any"))){const err0 = {instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}}if(data.appInstalled !== undefined){let data0 = data.appInstalled;if(typeof data0 === "string"){if(func6(data0) < 1){const err1 = {instancePath:instancePath+"/appInstalled",schemaPath:"#/properties/appInstalled/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}}else {const err2 = {instancePath:instancePath+"/appInstalled",schemaPath:"#/properties/appInstalled/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}}if(data.endpoint !== undefined){if(typeof data.endpoint !== "string"){const err3 = {instancePath:instancePath+"/endpoint",schemaPath:"#/properties/endpoint/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}}if(data.source !== undefined){let data2 = data.source;if(data2 && typeof data2 == "object" && !Array.isArray(data2)){if(data2.register !== undefined){if(typeof data2.register !== "string"){const err4 = {instancePath:instancePath+"/source/register",schemaPath:"#/properties/source/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}}if(data2.schema !== undefined){if(typeof data2.schema !== "string"){const err5 = {instancePath:instancePath+"/source/schema",schemaPath:"#/properties/source/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}if(data2.filter !== undefined){let data5 = data2.filter;if(data5 && typeof data5 == "object" && !Array.isArray(data5));else {const err6 = {instancePath:instancePath+"/source/filter",schemaPath:"#/properties/source/properties/filter/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}}}else {const err7 = {instancePath:instancePath+"/source",schemaPath:"#/properties/source/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}}if(data.field !== undefined){if(typeof data.field !== "string"){const err8 = {instancePath:instancePath+"/field",schemaPath:"#/properties/field/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}}let data7 = data.op;if(typeof data7 !== "string"){const err9 = {instancePath:instancePath+"/op",schemaPath:"#/properties/op/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}if(!((((((((data7 === "eq") || (data7 === "neq")) || (data7 === "gt")) || (data7 === "gte")) || (data7 === "lt")) || (data7 === "lte")) || (data7 === "empty")) || (data7 === "notEmpty"))){const err10 = {instancePath:instancePath+"/op",schemaPath:"#/properties/op/enum",keyword:"enum",params:{allowedValues: schema66.properties.op.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}if(data.all !== undefined){let data8 = data.all;if(Array.isArray(data8)){if(data8.length < 1){const err11 = {instancePath:instancePath+"/all",schemaPath:"#/properties/all/minItems",keyword:"minItems",params:{limit: 1},message:"must NOT have fewer than 1 items"};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}const len0 = data8.length;for(let i0=0; i0<len0; i0++){if(!(wrapper3.validate(data8[i0], {instancePath:instancePath+"/all/" + i0,parentData:data8,parentDataProperty:i0,rootData,dynamicAnchors}))){vErrors = vErrors === null ? wrapper3.validate.errors : vErrors.concat(wrapper3.validate.errors);errors = vErrors.length;}}}else {const err12 = {instancePath:instancePath+"/all",schemaPath:"#/properties/all/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}}if(data.any !== undefined){let data10 = data.any;if(Array.isArray(data10)){if(data10.length < 1){const err13 = {instancePath:instancePath+"/any",schemaPath:"#/properties/any/minItems",keyword:"minItems",params:{limit: 1},message:"must NOT have fewer than 1 items"};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}const len1 = data10.length;for(let i1=0; i1<len1; i1++){if(!(wrapper3.validate(data10[i1], {instancePath:instancePath+"/any/" + i1,parentData:data10,parentDataProperty:i1,rootData,dynamicAnchors}))){vErrors = vErrors === null ? wrapper3.validate.errors : vErrors.concat(wrapper3.validate.errors);errors = vErrors.length;}}}else {const err14 = {instancePath:instancePath+"/any",schemaPath:"#/properties/any/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}}}else {const err15 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}validate34.errors = vErrors;return errors === 0;}validate34.evaluated = {"props":true,"dynamicProps":false,"dynamicItems":false};function validate33(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate33.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}const _errs2 = errors;let valid1 = true;const _errs3 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err0 = {};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}else {if(data.type !== undefined){if("object-op" !== data.type){const err1 = {};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}}}}var _valid0 = _errs3 === errors;errors = _errs2;if(vErrors !== null){if(_errs2){vErrors.length = _errs2;}else {vErrors = null;}}if(_valid0){const _errs5 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.op === undefined){const err2 = {instancePath,schemaPath:"#/allOf/0/then/required",keyword:"required",params:{missingProperty: "op"},message:"must have required property '"+"op"+"'"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}}var _valid0 = _errs5 === errors;valid1 = _valid0;}if(!valid1){const err3 = {instancePath,schemaPath:"#/allOf/0/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}const _errs7 = errors;let valid3 = true;const _errs8 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err4 = {};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}else {if(data.type !== undefined){if("api-call" !== data.type){const err5 = {};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}}}var _valid1 = _errs8 === errors;errors = _errs7;if(vErrors !== null){if(_errs7){vErrors.length = _errs7;}else {vErrors = null;}}if(_valid1){const _errs10 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.url === undefined){const err6 = {instancePath,schemaPath:"#/allOf/1/then/required",keyword:"required",params:{missingProperty: "url"},message:"must have required property '"+"url"+"'"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}}var _valid1 = _errs10 === errors;valid3 = _valid1;}if(!valid3){const err7 = {instancePath,schemaPath:"#/allOf/1/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}const _errs12 = errors;let valid5 = true;const _errs13 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err8 = {};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}else {if(data.type !== undefined){if("open-form" !== data.type){const err9 = {};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}}}}var _valid2 = _errs13 === errors;errors = _errs12;if(vErrors !== null){if(_errs12){vErrors.length = _errs12;}else {vErrors = null;}}if(_valid2){const _errs15 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.schema === undefined){const err10 = {instancePath,schemaPath:"#/allOf/2/then/required",keyword:"required",params:{missingProperty: "schema"},message:"must have required property '"+"schema"+"'"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}}var _valid2 = _errs15 === errors;valid5 = _valid2;}if(!valid5){const err11 = {instancePath,schemaPath:"#/allOf/2/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}const _errs17 = errors;let valid7 = true;const _errs18 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err12 = {};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}else {if(data.type !== undefined){if("agent" !== data.type){const err13 = {};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}}}}var _valid3 = _errs18 === errors;errors = _errs17;if(vErrors !== null){if(_errs17){vErrors.length = _errs17;}else {vErrors = null;}}if(_valid3){const _errs20 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.agent === undefined){const err14 = {instancePath,schemaPath:"#/allOf/3/then/required",keyword:"required",params:{missingProperty: "agent"},message:"must have required property '"+"agent"+"'"};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}}var _valid3 = _errs20 === errors;valid7 = _valid3;}if(!valid7){const err15 = {instancePath,schemaPath:"#/allOf/3/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}const _errs22 = errors;let valid9 = true;const _errs23 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err16 = {};if(vErrors === null){vErrors = [err16];}else {vErrors.push(err16);}errors++;}else {if(data.type !== undefined){if("toggle" !== data.type){const err17 = {};if(vErrors === null){vErrors = [err17];}else {vErrors.push(err17);}errors++;}}}}var _valid4 = _errs23 === errors;errors = _errs22;if(vErrors !== null){if(_errs22){vErrors.length = _errs22;}else {vErrors = null;}}if(_valid4){const _errs25 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.writeUrl === undefined){const err18 = {instancePath,schemaPath:"#/allOf/4/then/required",keyword:"required",params:{missingProperty: "writeUrl"},message:"must have required property '"+"writeUrl"+"'"};if(vErrors === null){vErrors = [err18];}else {vErrors.push(err18);}errors++;}}var _valid4 = _errs25 === errors;valid9 = _valid4;}if(!valid9){const err19 = {instancePath,schemaPath:"#/allOf/4/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err19];}else {vErrors.push(err19);}errors++;}const _errs27 = errors;let valid11 = true;const _errs28 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err20 = {};if(vErrors === null){vErrors = [err20];}else {vErrors.push(err20);}errors++;}else {if(data.type !== undefined){if("run-node" !== data.type){const err21 = {};if(vErrors === null){vErrors = [err21];}else {vErrors.push(err21);}errors++;}}}}var _valid5 = _errs28 === errors;errors = _errs27;if(vErrors !== null){if(_errs27){vErrors.length = _errs27;}else {vErrors = null;}}if(_valid5){const _errs30 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.flowId === undefined){const err22 = {instancePath,schemaPath:"#/allOf/5/then/required",keyword:"required",params:{missingProperty: "flowId"},message:"must have required property '"+"flowId"+"'"};if(vErrors === null){vErrors = [err22];}else {vErrors.push(err22);}errors++;}if(data.nodeId === undefined){const err23 = {instancePath,schemaPath:"#/allOf/5/then/required",keyword:"required",params:{missingProperty: "nodeId"},message:"must have required property '"+"nodeId"+"'"};if(vErrors === null){vErrors = [err23];}else {vErrors.push(err23);}errors++;}}var _valid5 = _errs30 === errors;valid11 = _valid5;}if(!valid11){const err24 = {instancePath,schemaPath:"#/allOf/5/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err24];}else {vErrors.push(err24);}errors++;}if(data && typeof data == "object" && !Array.isArray(data)){if(data.type === undefined){data.type = "handler";}if(data.confirm === undefined){data.confirm = false;}if(data.advanced === undefined){data.advanced = false;}if(data.size === undefined){data.size = "normal";}if(data.columns === undefined){data.columns = 1;}if(data.download === undefined){data.download = false;}if(data.refresh === undefined){data.refresh = true;}if(data.id === undefined){const err25 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err25];}else {vErrors.push(err25);}errors++;}if(data.label === undefined){const err26 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err26];}else {vErrors.push(err26);}errors++;}for(const key0 in data){if(!(func1.call(schema64.properties, key0))){const err27 = {instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err27];}else {vErrors.push(err27);}errors++;}}if(data.id !== undefined){if(typeof data.id !== "string"){const err28 = {instancePath:instancePath+"/id",schemaPath:"#/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err28];}else {vErrors.push(err28);}errors++;}}if(data.label !== undefined){if(typeof data.label !== "string"){const err29 = {instancePath:instancePath+"/label",schemaPath:"#/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err29];}else {vErrors.push(err29);}errors++;}}let data8 = data.type;if(typeof data8 !== "string"){const err30 = {instancePath:instancePath+"/type",schemaPath:"#/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err30];}else {vErrors.push(err30);}errors++;}if(!((((((((((((data8 === "handler") || (data8 === "open-modal")) || (data8 === "open-page")) || (data8 === "navigate")) || (data8 === "object-op")) || (data8 === "export")) || (data8 === "open-form")) || (data8 === "refresh")) || (data8 === "api-call")) || (data8 === "agent")) || (data8 === "run-node")) || (data8 === "toggle"))){const err31 = {instancePath:instancePath+"/type",schemaPath:"#/properties/type/enum",keyword:"enum",params:{allowedValues: schema64.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err31];}else {vErrors.push(err31);}errors++;}if(data.op !== undefined){let data9 = data.op;if(typeof data9 !== "string"){const err32 = {instancePath:instancePath+"/op",schemaPath:"#/properties/op/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err32];}else {vErrors.push(err32);}errors++;}if(!(((data9 === "patch") || (data9 === "delete")) || (data9 === "create"))){const err33 = {instancePath:instancePath+"/op",schemaPath:"#/properties/op/enum",keyword:"enum",params:{allowedValues: schema64.properties.op.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err33];}else {vErrors.push(err33);}errors++;}}if(data.values !== undefined){let data10 = data.values;if(data10 && typeof data10 == "object" && !Array.isArray(data10));else {const err34 = {instancePath:instancePath+"/values",schemaPath:"#/properties/values/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err34];}else {vErrors.push(err34);}errors++;}}if(typeof data.confirm !== "boolean"){const err35 = {instancePath:instancePath+"/confirm",schemaPath:"#/properties/confirm/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err35];}else {vErrors.push(err35);}errors++;}if(data.target !== undefined){if(typeof data.target !== "string"){const err36 = {instancePath:instancePath+"/target",schemaPath:"#/properties/target/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err36];}else {vErrors.push(err36);}errors++;}}if(data.props !== undefined){let data13 = data.props;if(data13 && typeof data13 == "object" && !Array.isArray(data13));else {const err37 = {instancePath:instancePath+"/props",schemaPath:"#/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err37];}else {vErrors.push(err37);}errors++;}}if(data.createOverride !== undefined){if(typeof data.createOverride !== "string"){const err38 = {instancePath:instancePath+"/createOverride",schemaPath:"#/properties/createOverride/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err38];}else {vErrors.push(err38);}errors++;}}if(data.includeFields !== undefined){let data15 = data.includeFields;if(Array.isArray(data15)){const len0 = data15.length;for(let i0=0; i0<len0; i0++){if(typeof data15[i0] !== "string"){const err39 = {instancePath:instancePath+"/includeFields/" + i0,schemaPath:"#/properties/includeFields/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err39];}else {vErrors.push(err39);}errors++;}}}else {const err40 = {instancePath:instancePath+"/includeFields",schemaPath:"#/properties/includeFields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err40];}else {vErrors.push(err40);}errors++;}}if(data.excludeFields !== undefined){let data17 = data.excludeFields;if(Array.isArray(data17)){const len1 = data17.length;for(let i1=0; i1<len1; i1++){if(typeof data17[i1] !== "string"){const err41 = {instancePath:instancePath+"/excludeFields/" + i1,schemaPath:"#/properties/excludeFields/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err41];}else {vErrors.push(err41);}errors++;}}}else {const err42 = {instancePath:instancePath+"/excludeFields",schemaPath:"#/properties/excludeFields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err42];}else {vErrors.push(err42);}errors++;}}if(data.fieldOverrides !== undefined){let data19 = data.fieldOverrides;if(data19 && typeof data19 == "object" && !Array.isArray(data19));else {const err43 = {instancePath:instancePath+"/fieldOverrides",schemaPath:"#/properties/fieldOverrides/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err43];}else {vErrors.push(err43);}errors++;}}if(typeof data.advanced !== "boolean"){const err44 = {instancePath:instancePath+"/advanced",schemaPath:"#/properties/advanced/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err44];}else {vErrors.push(err44);}errors++;}if(data.formTitle !== undefined){if(typeof data.formTitle !== "string"){const err45 = {instancePath:instancePath+"/formTitle",schemaPath:"#/properties/formTitle/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err45];}else {vErrors.push(err45);}errors++;}}let data22 = data.size;if(typeof data22 !== "string"){const err46 = {instancePath:instancePath+"/size",schemaPath:"#/properties/size/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err46];}else {vErrors.push(err46);}errors++;}if(!((((data22 === "small") || (data22 === "normal")) || (data22 === "large")) || (data22 === "full"))){const err47 = {instancePath:instancePath+"/size",schemaPath:"#/properties/size/enum",keyword:"enum",params:{allowedValues: schema64.properties.size.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err47];}else {vErrors.push(err47);}errors++;}let data23 = data.columns;if(!((typeof data23 == "number") && (!(data23 % 1) && !isNaN(data23)))){const err48 = {instancePath:instancePath+"/columns",schemaPath:"#/properties/columns/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err48];}else {vErrors.push(err48);}errors++;}if(!((data23 === 1) || (data23 === 2))){const err49 = {instancePath:instancePath+"/columns",schemaPath:"#/properties/columns/enum",keyword:"enum",params:{allowedValues: schema64.properties.columns.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err49];}else {vErrors.push(err49);}errors++;}if(data.handler !== undefined){if(typeof data.handler !== "string"){const err50 = {instancePath:instancePath+"/handler",schemaPath:"#/properties/handler/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err50];}else {vErrors.push(err50);}errors++;}}if(data.route !== undefined){if(typeof data.route !== "string"){const err51 = {instancePath:instancePath+"/route",schemaPath:"#/properties/route/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err51];}else {vErrors.push(err51);}errors++;}}if(data.icon !== undefined){if(typeof data.icon !== "string"){const err52 = {instancePath:instancePath+"/icon",schemaPath:"#/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err52];}else {vErrors.push(err52);}errors++;}}if(data.entities !== undefined){let data27 = data.entities;if(Array.isArray(data27)){const len2 = data27.length;for(let i2=0; i2<len2; i2++){let data28 = data27[i2];if(data28 && typeof data28 == "object" && !Array.isArray(data28)){if(data28.id === undefined){const err53 = {instancePath:instancePath+"/entities/" + i2,schemaPath:"#/properties/entities/items/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err53];}else {vErrors.push(err53);}errors++;}if(data28.label === undefined){const err54 = {instancePath:instancePath+"/entities/" + i2,schemaPath:"#/properties/entities/items/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err54];}else {vErrors.push(err54);}errors++;}for(const key1 in data28){if(!((key1 === "id") || (key1 === "label"))){const err55 = {instancePath:instancePath+"/entities/" + i2,schemaPath:"#/properties/entities/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key1},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err55];}else {vErrors.push(err55);}errors++;}}if(data28.id !== undefined){if(typeof data28.id !== "string"){const err56 = {instancePath:instancePath+"/entities/" + i2+"/id",schemaPath:"#/properties/entities/items/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err56];}else {vErrors.push(err56);}errors++;}}if(data28.label !== undefined){if(typeof data28.label !== "string"){const err57 = {instancePath:instancePath+"/entities/" + i2+"/label",schemaPath:"#/properties/entities/items/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err57];}else {vErrors.push(err57);}errors++;}}}else {const err58 = {instancePath:instancePath+"/entities/" + i2,schemaPath:"#/properties/entities/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err58];}else {vErrors.push(err58);}errors++;}}}else {const err59 = {instancePath:instancePath+"/entities",schemaPath:"#/properties/entities/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err59];}else {vErrors.push(err59);}errors++;}}if(data.formats !== undefined){let data31 = data.formats;if(Array.isArray(data31)){const len3 = data31.length;for(let i3=0; i3<len3; i3++){let data32 = data31[i3];const _errs89 = errors;let valid23 = false;let passing0 = null;const _errs90 = errors;if(typeof data32 !== "string"){const err60 = {instancePath:instancePath+"/formats/" + i3,schemaPath:"#/properties/formats/items/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err60];}else {vErrors.push(err60);}errors++;}var _valid6 = _errs90 === errors;if(_valid6){valid23 = true;passing0 = 0;}const _errs92 = errors;if(data32 && typeof data32 == "object" && !Array.isArray(data32)){if(data32.id === undefined){const err61 = {instancePath:instancePath+"/formats/" + i3,schemaPath:"#/properties/formats/items/oneOf/1/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err61];}else {vErrors.push(err61);}errors++;}if(data32.label === undefined){const err62 = {instancePath:instancePath+"/formats/" + i3,schemaPath:"#/properties/formats/items/oneOf/1/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err62];}else {vErrors.push(err62);}errors++;}for(const key2 in data32){if(!((key2 === "id") || (key2 === "label"))){const err63 = {instancePath:instancePath+"/formats/" + i3,schemaPath:"#/properties/formats/items/oneOf/1/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key2},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err63];}else {vErrors.push(err63);}errors++;}}if(data32.id !== undefined){if(typeof data32.id !== "string"){const err64 = {instancePath:instancePath+"/formats/" + i3+"/id",schemaPath:"#/properties/formats/items/oneOf/1/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err64];}else {vErrors.push(err64);}errors++;}}if(data32.label !== undefined){if(typeof data32.label !== "string"){const err65 = {instancePath:instancePath+"/formats/" + i3+"/label",schemaPath:"#/properties/formats/items/oneOf/1/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err65];}else {vErrors.push(err65);}errors++;}}}else {const err66 = {instancePath:instancePath+"/formats/" + i3,schemaPath:"#/properties/formats/items/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err66];}else {vErrors.push(err66);}errors++;}var _valid6 = _errs92 === errors;if(_valid6 && valid23){valid23 = false;passing0 = [passing0, 1];}else {if(_valid6){valid23 = true;passing0 = 1;}}if(!valid23){const err67 = {instancePath:instancePath+"/formats/" + i3,schemaPath:"#/properties/formats/items/oneOf",keyword:"oneOf",params:{passingSchemas: passing0},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err67];}else {vErrors.push(err67);}errors++;}else {errors = _errs89;if(vErrors !== null){if(_errs89){vErrors.length = _errs89;}else {vErrors = null;}}}}}else {const err68 = {instancePath:instancePath+"/formats",schemaPath:"#/properties/formats/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err68];}else {vErrors.push(err68);}errors++;}}if(data.description !== undefined){if(typeof data.description !== "string"){const err69 = {instancePath:instancePath+"/description",schemaPath:"#/properties/description/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err69];}else {vErrors.push(err69);}errors++;}}if(data.url !== undefined){if(typeof data.url !== "string"){const err70 = {instancePath:instancePath+"/url",schemaPath:"#/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err70];}else {vErrors.push(err70);}errors++;}}if(data.method !== undefined){let data37 = data.method;if(typeof data37 !== "string"){const err71 = {instancePath:instancePath+"/method",schemaPath:"#/properties/method/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err71];}else {vErrors.push(err71);}errors++;}if(!((data37 === "POST") || (data37 === "PUT"))){const err72 = {instancePath:instancePath+"/method",schemaPath:"#/properties/method/enum",keyword:"enum",params:{allowedValues: schema64.properties.method.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err72];}else {vErrors.push(err72);}errors++;}}if(data.payload !== undefined){let data38 = data.payload;if(data38 && typeof data38 == "object" && !Array.isArray(data38));else {const err73 = {instancePath:instancePath+"/payload",schemaPath:"#/properties/payload/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err73];}else {vErrors.push(err73);}errors++;}}if(data.params !== undefined){let data39 = data.params;if(data39 && typeof data39 == "object" && !Array.isArray(data39));else {const err74 = {instancePath:instancePath+"/params",schemaPath:"#/properties/params/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err74];}else {vErrors.push(err74);}errors++;}}if(typeof data.download !== "boolean"){const err75 = {instancePath:instancePath+"/download",schemaPath:"#/properties/download/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err75];}else {vErrors.push(err75);}errors++;}if(data.filename !== undefined){if(typeof data.filename !== "string"){const err76 = {instancePath:instancePath+"/filename",schemaPath:"#/properties/filename/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err76];}else {vErrors.push(err76);}errors++;}}if(data.successMessage !== undefined){if(typeof data.successMessage !== "string"){const err77 = {instancePath:instancePath+"/successMessage",schemaPath:"#/properties/successMessage/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err77];}else {vErrors.push(err77);}errors++;}}if(data.errorMessage !== undefined){if(typeof data.errorMessage !== "string"){const err78 = {instancePath:instancePath+"/errorMessage",schemaPath:"#/properties/errorMessage/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err78];}else {vErrors.push(err78);}errors++;}}if(typeof data.refresh !== "boolean"){const err79 = {instancePath:instancePath+"/refresh",schemaPath:"#/properties/refresh/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err79];}else {vErrors.push(err79);}errors++;}if(data.flowId !== undefined){if(typeof data.flowId !== "string"){const err80 = {instancePath:instancePath+"/flowId",schemaPath:"#/properties/flowId/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err80];}else {vErrors.push(err80);}errors++;}}if(data.nodeId !== undefined){if(typeof data.nodeId !== "string"){const err81 = {instancePath:instancePath+"/nodeId",schemaPath:"#/properties/nodeId/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err81];}else {vErrors.push(err81);}errors++;}}if(data.subject !== undefined){if(typeof data.subject !== "string"){const err82 = {instancePath:instancePath+"/subject",schemaPath:"#/properties/subject/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err82];}else {vErrors.push(err82);}errors++;}}if(data.agent !== undefined){if(typeof data.agent !== "string"){const err83 = {instancePath:instancePath+"/agent",schemaPath:"#/properties/agent/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err83];}else {vErrors.push(err83);}errors++;}}if(data.skill !== undefined){if(typeof data.skill !== "string"){const err84 = {instancePath:instancePath+"/skill",schemaPath:"#/properties/skill/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err84];}else {vErrors.push(err84);}errors++;}}if(data.prompt !== undefined){if(typeof data.prompt !== "string"){const err85 = {instancePath:instancePath+"/prompt",schemaPath:"#/properties/prompt/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err85];}else {vErrors.push(err85);}errors++;}}if(data.resultField !== undefined){if(typeof data.resultField !== "string"){const err86 = {instancePath:instancePath+"/resultField",schemaPath:"#/properties/resultField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err86];}else {vErrors.push(err86);}errors++;}}if(data.objectId !== undefined){if(typeof data.objectId !== "string"){const err87 = {instancePath:instancePath+"/objectId",schemaPath:"#/properties/objectId/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err87];}else {vErrors.push(err87);}errors++;}}if(data.register !== undefined){if(typeof data.register !== "string"){const err88 = {instancePath:instancePath+"/register",schemaPath:"#/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err88];}else {vErrors.push(err88);}errors++;}}if(data.schema !== undefined){if(typeof data.schema !== "string"){const err89 = {instancePath:instancePath+"/schema",schemaPath:"#/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err89];}else {vErrors.push(err89);}errors++;}}if(data.onSuccessRoute !== undefined){let data55 = data.onSuccessRoute;const _errs142 = errors;let valid25 = false;let passing1 = null;const _errs143 = errors;if(typeof data55 !== "string"){const err90 = {instancePath:instancePath+"/onSuccessRoute",schemaPath:"#/properties/onSuccessRoute/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err90];}else {vErrors.push(err90);}errors++;}var _valid7 = _errs143 === errors;if(_valid7){valid25 = true;passing1 = 0;}const _errs145 = errors;if(data55 && typeof data55 == "object" && !Array.isArray(data55)){if(data55.name === undefined){const err91 = {instancePath:instancePath+"/onSuccessRoute",schemaPath:"#/properties/onSuccessRoute/oneOf/1/required",keyword:"required",params:{missingProperty: "name"},message:"must have required property '"+"name"+"'"};if(vErrors === null){vErrors = [err91];}else {vErrors.push(err91);}errors++;}for(const key3 in data55){if(!(((key3 === "name") || (key3 === "paramField")) || (key3 === "objectParam"))){const err92 = {instancePath:instancePath+"/onSuccessRoute",schemaPath:"#/properties/onSuccessRoute/oneOf/1/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key3},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err92];}else {vErrors.push(err92);}errors++;}}if(data55.name !== undefined){if(typeof data55.name !== "string"){const err93 = {instancePath:instancePath+"/onSuccessRoute/name",schemaPath:"#/properties/onSuccessRoute/oneOf/1/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err93];}else {vErrors.push(err93);}errors++;}}if(data55.paramField !== undefined){if(typeof data55.paramField !== "string"){const err94 = {instancePath:instancePath+"/onSuccessRoute/paramField",schemaPath:"#/properties/onSuccessRoute/oneOf/1/properties/paramField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err94];}else {vErrors.push(err94);}errors++;}}if(data55.objectParam !== undefined){if(typeof data55.objectParam !== "string"){const err95 = {instancePath:instancePath+"/onSuccessRoute/objectParam",schemaPath:"#/properties/onSuccessRoute/oneOf/1/properties/objectParam/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err95];}else {vErrors.push(err95);}errors++;}}}else {const err96 = {instancePath:instancePath+"/onSuccessRoute",schemaPath:"#/properties/onSuccessRoute/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err96];}else {vErrors.push(err96);}errors++;}var _valid7 = _errs145 === errors;if(_valid7 && valid25){valid25 = false;passing1 = [passing1, 1];}else {if(_valid7){valid25 = true;passing1 = 1;}}if(!valid25){const err97 = {instancePath:instancePath+"/onSuccessRoute",schemaPath:"#/properties/onSuccessRoute/oneOf",keyword:"oneOf",params:{passingSchemas: passing1},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err97];}else {vErrors.push(err97);}errors++;}else {errors = _errs142;if(vErrors !== null){if(_errs142){vErrors.length = _errs142;}else {vErrors = null;}}}}if(data.labelOn !== undefined){if(typeof data.labelOn !== "string"){const err98 = {instancePath:instancePath+"/labelOn",schemaPath:"#/properties/labelOn/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err98];}else {vErrors.push(err98);}errors++;}}if(data.labelOff !== undefined){if(typeof data.labelOff !== "string"){const err99 = {instancePath:instancePath+"/labelOff",schemaPath:"#/properties/labelOff/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err99];}else {vErrors.push(err99);}errors++;}}if(data.stateSource !== undefined){let data61 = data.stateSource;if(data61 && typeof data61 == "object" && !Array.isArray(data61)){if(data61.method === undefined){data61.method = "GET";}if(data61.url === undefined){const err100 = {instancePath:instancePath+"/stateSource",schemaPath:"#/$defs/endpointSource/required",keyword:"required",params:{missingProperty: "url"},message:"must have required property '"+"url"+"'"};if(vErrors === null){vErrors = [err100];}else {vErrors.push(err100);}errors++;}for(const key4 in data61){if(!((((key4 === "url") || (key4 === "method")) || (key4 === "params")) || (key4 === "responsePath"))){const err101 = {instancePath:instancePath+"/stateSource",schemaPath:"#/$defs/endpointSource/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key4},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err101];}else {vErrors.push(err101);}errors++;}}if(data61.url !== undefined){if(typeof data61.url !== "string"){const err102 = {instancePath:instancePath+"/stateSource/url",schemaPath:"#/$defs/endpointSource/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err102];}else {vErrors.push(err102);}errors++;}}let data63 = data61.method;if(typeof data63 !== "string"){const err103 = {instancePath:instancePath+"/stateSource/method",schemaPath:"#/$defs/endpointSource/properties/method/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err103];}else {vErrors.push(err103);}errors++;}if(!((data63 === "GET") || (data63 === "POST"))){const err104 = {instancePath:instancePath+"/stateSource/method",schemaPath:"#/$defs/endpointSource/properties/method/enum",keyword:"enum",params:{allowedValues: schema63.properties.method.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err104];}else {vErrors.push(err104);}errors++;}if(data61.params !== undefined){let data64 = data61.params;if(data64 && typeof data64 == "object" && !Array.isArray(data64));else {const err105 = {instancePath:instancePath+"/stateSource/params",schemaPath:"#/$defs/endpointSource/properties/params/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err105];}else {vErrors.push(err105);}errors++;}}if(data61.responsePath !== undefined){if(typeof data61.responsePath !== "string"){const err106 = {instancePath:instancePath+"/stateSource/responsePath",schemaPath:"#/$defs/endpointSource/properties/responsePath/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err106];}else {vErrors.push(err106);}errors++;}}}else {const err107 = {instancePath:instancePath+"/stateSource",schemaPath:"#/$defs/endpointSource/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err107];}else {vErrors.push(err107);}errors++;}}if(data.writeUrl !== undefined){if(typeof data.writeUrl !== "string"){const err108 = {instancePath:instancePath+"/writeUrl",schemaPath:"#/properties/writeUrl/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err108];}else {vErrors.push(err108);}errors++;}}if(data.field !== undefined){if(typeof data.field !== "string"){const err109 = {instancePath:instancePath+"/field",schemaPath:"#/properties/field/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err109];}else {vErrors.push(err109);}errors++;}}if(data.variant !== undefined){if(typeof data.variant !== "string"){const err110 = {instancePath:instancePath+"/variant",schemaPath:"#/properties/variant/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err110];}else {vErrors.push(err110);}errors++;}}if(data.children !== undefined){let data69 = data.children;if(Array.isArray(data69)){const len4 = data69.length;for(let i4=0; i4<len4; i4++){if(!(wrapper2.validate(data69[i4], {instancePath:instancePath+"/children/" + i4,parentData:data69,parentDataProperty:i4,rootData,dynamicAnchors}))){vErrors = vErrors === null ? wrapper2.validate.errors : vErrors.concat(wrapper2.validate.errors);errors = vErrors.length;}}}else {const err111 = {instancePath:instancePath+"/children",schemaPath:"#/properties/children/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err111];}else {vErrors.push(err111);}errors++;}}if(data.childrenLabel !== undefined){if(typeof data.childrenLabel !== "string"){const err112 = {instancePath:instancePath+"/childrenLabel",schemaPath:"#/properties/childrenLabel/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err112];}else {vErrors.push(err112);}errors++;}}if(data.visibleWhen !== undefined){if(!(validate34(data.visibleWhen, {instancePath:instancePath+"/visibleWhen",parentData:data,parentDataProperty:"visibleWhen",rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate34.errors : vErrors.concat(validate34.errors);errors = vErrors.length;}}}else {const err113 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err113];}else {vErrors.push(err113);}errors++;}validate33.errors = vErrors;return errors === 0;}validate33.evaluated = {"props":true,"dynamicProps":false,"dynamicItems":false};const schema67 = {"type":"object","required":["id","label"],"additionalProperties":false,"description":"One card in a nav-card-grid built-in widget (ADR-044 §4 cards-collapse) — an arbitrary navigation link, not an OpenRegister object. Mirrors the menuItem/primaryAction vocabulary: id + label required, route/href are alternative navigation targets and mutually exclusive, count supports the same integer-or-\"auto\" shape as menuItem.count.","properties":{"id":{"type":"string","description":"Unique identifier for this card within its widget's entries[] array."},"label":{"type":"string","description":"i18n translation key / text rendered as the card's title."},"description":{"type":"string","description":"Optional explanatory text rendered below the label, associated to the card via aria-describedby (never aria-label)."},"icon":{"type":"string","description":"MDI icon name (e.g. 'ChartLine'), resolved the same way as menuItem.icon."},"route":{"type":"string","description":"Vue-router route name (matches a pages[].id) this card navigates to. Mutually exclusive with href."},"href":{"type":"string","description":"External URL opened per the rendering component's target handling. Mutually exclusive with route."},"count":{"oneOf":[{"type":"integer","minimum":0},{"type":"string","enum":["auto"]}],"description":"Count badge on the card. Positive integer renders as-is; 'auto' resolves from cnMenuCounts (populated by CnAppRoot) for the card's resolved route page (register + schema), the same mechanism menuItem.count:\"auto\" uses."},"order":{"type":"integer","description":"Display order among sibling cards. Cards without an order render last."},"permission":{"type":"string","description":"Permission string the user must hold for this card to render."},"visibleIf":{"$ref":"#/$defs/visibleIfCondition","description":"Optional display condition evaluated at render time."}},"allOf":[{"description":"route and href are mutually exclusive navigation targets — a card links either in-app or externally, never both.","not":{"required":["route","href"]}}]};function validate37(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate37.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}const _errs2 = errors;const _errs3 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(((data.route === undefined) && ("route")) || ((data.href === undefined) && ("href"))){const err0 = {};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}}var valid1 = _errs3 === errors;if(valid1){const err1 = {instancePath,schemaPath:"#/allOf/0/not",keyword:"not",params:{},message:"must NOT be valid"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}else {errors = _errs2;if(vErrors !== null){if(_errs2){vErrors.length = _errs2;}else {vErrors = null;}}}if(data && typeof data == "object" && !Array.isArray(data)){if(data.id === undefined){const err2 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}if(data.label === undefined){const err3 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}for(const key0 in data){if(!(func1.call(schema67.properties, key0))){const err4 = {instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}}if(data.id !== undefined){if(typeof data.id !== "string"){const err5 = {instancePath:instancePath+"/id",schemaPath:"#/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}if(data.label !== undefined){if(typeof data.label !== "string"){const err6 = {instancePath:instancePath+"/label",schemaPath:"#/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}}if(data.description !== undefined){if(typeof data.description !== "string"){const err7 = {instancePath:instancePath+"/description",schemaPath:"#/properties/description/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}}if(data.icon !== undefined){if(typeof data.icon !== "string"){const err8 = {instancePath:instancePath+"/icon",schemaPath:"#/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}}if(data.route !== undefined){if(typeof data.route !== "string"){const err9 = {instancePath:instancePath+"/route",schemaPath:"#/properties/route/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}}if(data.href !== undefined){if(typeof data.href !== "string"){const err10 = {instancePath:instancePath+"/href",schemaPath:"#/properties/href/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}}if(data.count !== undefined){let data6 = data.count;const _errs18 = errors;let valid3 = false;let passing0 = null;const _errs19 = errors;if(!((typeof data6 == "number") && (!(data6 % 1) && !isNaN(data6)))){const err11 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/0/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}if(typeof data6 == "number"){if(data6 < 0 || isNaN(data6)){const err12 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/0/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}}var _valid0 = _errs19 === errors;if(_valid0){valid3 = true;passing0 = 0;}const _errs21 = errors;if(typeof data6 !== "string"){const err13 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/1/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}if(!(data6 === "auto")){const err14 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf/1/enum",keyword:"enum",params:{allowedValues: schema67.properties.count.oneOf[1].enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}var _valid0 = _errs21 === errors;if(_valid0 && valid3){valid3 = false;passing0 = [passing0, 1];}else {if(_valid0){valid3 = true;passing0 = 1;}}if(!valid3){const err15 = {instancePath:instancePath+"/count",schemaPath:"#/properties/count/oneOf",keyword:"oneOf",params:{passingSchemas: passing0},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}else {errors = _errs18;if(vErrors !== null){if(_errs18){vErrors.length = _errs18;}else {vErrors = null;}}}}if(data.order !== undefined){let data7 = data.order;if(!((typeof data7 == "number") && (!(data7 % 1) && !isNaN(data7)))){const err16 = {instancePath:instancePath+"/order",schemaPath:"#/properties/order/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err16];}else {vErrors.push(err16);}errors++;}}if(data.permission !== undefined){if(typeof data.permission !== "string"){const err17 = {instancePath:instancePath+"/permission",schemaPath:"#/properties/permission/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err17];}else {vErrors.push(err17);}errors++;}}if(data.visibleIf !== undefined){let data9 = data.visibleIf;if(data9 && typeof data9 == "object" && !Array.isArray(data9)){if(data9.appInstalled !== undefined){let data10 = data9.appInstalled;if(typeof data10 === "string"){if(func6(data10) < 1){const err18 = {instancePath:instancePath+"/visibleIf/appInstalled",schemaPath:"#/$defs/visibleIfCondition/properties/appInstalled/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err18];}else {vErrors.push(err18);}errors++;}}else {const err19 = {instancePath:instancePath+"/visibleIf/appInstalled",schemaPath:"#/$defs/visibleIfCondition/properties/appInstalled/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err19];}else {vErrors.push(err19);}errors++;}}}else {const err20 = {instancePath:instancePath+"/visibleIf",schemaPath:"#/$defs/visibleIfCondition/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err20];}else {vErrors.push(err20);}errors++;}}}else {const err21 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err21];}else {vErrors.push(err21);}errors++;}validate37.errors = vErrors;return errors === 0;}validate37.evaluated = {"props":true,"dynamicProps":false,"dynamicItems":false};const pattern23 = new RegExp("^(tab|section):.+", "u");const pattern24 = new RegExp("^(?![a-zA-Z][a-zA-Z0-9+.-]*:)(?!//)\\S+$", "u");function validate26(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate26.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}if(!(validate27(data, {instancePath,parentData,parentDataProperty,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate27.errors : vErrors.concat(validate27.errors);errors = vErrors.length;}else {var props0 = validate27.evaluated.props;var items0 = validate27.evaluated.items;}const _errs3 = errors;let valid1 = true;const _errs4 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.ncDashboard === undefined) && ("ncDashboard")){const err0 = {};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}}var _valid0 = _errs4 === errors;errors = _errs3;if(vErrors !== null){if(_errs3){vErrors.length = _errs3;}else {vErrors = null;}}if(_valid0){const _errs5 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.id === undefined){const err1 = {instancePath,schemaPath:"#/allOf/1/then/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}}var _valid0 = _errs5 === errors;valid1 = _valid0;}if(!valid1){const err2 = {instancePath,schemaPath:"#/allOf/1/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}const _errs7 = errors;let valid2 = true;const _errs8 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.slot === undefined) && ("slot")){const err3 = {};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}else {if(data.slot !== undefined){if("sidebar" !== data.slot){const err4 = {};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}}}}var _valid1 = _errs8 === errors;errors = _errs7;if(vErrors !== null){if(_errs7){vErrors.length = _errs7;}else {vErrors = null;}}if(_valid1){const _errs10 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.gridWidth !== undefined){if(1 !== data.gridWidth){const err5 = {instancePath:instancePath+"/gridWidth",schemaPath:"#/allOf/2/then/properties/gridWidth/const",keyword:"const",params:{allowedValue: 1},message:"must be equal to constant"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}}var _valid1 = _errs10 === errors;valid2 = _valid1;if(valid2){var props1 = {};props1.gridWidth = true;props1.slot = true;}}if(!valid2){const err6 = {instancePath,schemaPath:"#/allOf/2/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}if(props0 !== true && props1 !== undefined){if(props1 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props1);}}const _errs13 = errors;let valid5 = true;const _errs14 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.slot === undefined) && ("slot")){const err7 = {};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}else {if(data.slot !== undefined){if("header-actions" !== data.slot){const err8 = {};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}}}}var _valid2 = _errs14 === errors;errors = _errs13;if(vErrors !== null){if(_errs13){vErrors.length = _errs13;}else {vErrors = null;}}if(_valid2){const _errs16 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.gridY !== undefined){if(0 !== data.gridY){const err9 = {instancePath:instancePath+"/gridY",schemaPath:"#/allOf/3/then/properties/gridY/const",keyword:"const",params:{allowedValue: 0},message:"must be equal to constant"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}}}var _valid2 = _errs16 === errors;valid5 = _valid2;if(valid5){var props2 = {};props2.gridY = true;props2.slot = true;}}if(!valid5){const err10 = {instancePath,schemaPath:"#/allOf/3/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}if(props0 !== true && props2 !== undefined){if(props2 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props2);}}const _errs19 = errors;let valid8 = true;const _errs20 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err11 = {};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}else {if(data.widgetKey !== undefined){if("object-table" !== data.widgetKey){const err12 = {};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}}}}var _valid3 = _errs20 === errors;errors = _errs19;if(vErrors !== null){if(_errs19){vErrors.length = _errs19;}else {vErrors = null;}}if(_valid3){const _errs22 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props !== undefined){let data5 = data.props;if(data5 && typeof data5 == "object" && !Array.isArray(data5)){if(data5.source !== undefined){let data6 = data5.source;if(data6 && typeof data6 == "object" && !Array.isArray(data6)){if(data6.register === undefined){const err13 = {instancePath:instancePath+"/props/source",schemaPath:"#/$defs/objectTableSource/required",keyword:"required",params:{missingProperty: "register"},message:"must have required property '"+"register"+"'"};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}if(data6.schema === undefined){const err14 = {instancePath:instancePath+"/props/source",schemaPath:"#/$defs/objectTableSource/required",keyword:"required",params:{missingProperty: "schema"},message:"must have required property '"+"schema"+"'"};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}for(const key0 in data6){if(!((((((key0 === "register") || (key0 === "schema")) || (key0 === "filter")) || (key0 === "order")) || (key0 === "limit")) || (key0 === "extend"))){const err15 = {instancePath:instancePath+"/props/source",schemaPath:"#/$defs/objectTableSource/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}}if(data6.register !== undefined){if(typeof data6.register !== "string"){const err16 = {instancePath:instancePath+"/props/source/register",schemaPath:"#/$defs/objectTableSource/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err16];}else {vErrors.push(err16);}errors++;}}if(data6.schema !== undefined){if(typeof data6.schema !== "string"){const err17 = {instancePath:instancePath+"/props/source/schema",schemaPath:"#/$defs/objectTableSource/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err17];}else {vErrors.push(err17);}errors++;}}if(data6.filter !== undefined){let data9 = data6.filter;if(data9 && typeof data9 == "object" && !Array.isArray(data9));else {const err18 = {instancePath:instancePath+"/props/source/filter",schemaPath:"#/$defs/objectTableSource/properties/filter/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err18];}else {vErrors.push(err18);}errors++;}}if(data6.order !== undefined){let data10 = data6.order;if(data10 && typeof data10 == "object" && !Array.isArray(data10)){for(const key1 in data10){let data11 = data10[key1];if(typeof data11 !== "string"){const err19 = {instancePath:instancePath+"/props/source/order/" + key1.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/$defs/objectTableSource/properties/order/additionalProperties/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err19];}else {vErrors.push(err19);}errors++;}if(!((data11 === "asc") || (data11 === "desc"))){const err20 = {instancePath:instancePath+"/props/source/order/" + key1.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/$defs/objectTableSource/properties/order/additionalProperties/enum",keyword:"enum",params:{allowedValues: schema62.properties.order.additionalProperties.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err20];}else {vErrors.push(err20);}errors++;}}}else {const err21 = {instancePath:instancePath+"/props/source/order",schemaPath:"#/$defs/objectTableSource/properties/order/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err21];}else {vErrors.push(err21);}errors++;}}if(data6.limit !== undefined){let data12 = data6.limit;if(!((typeof data12 == "number") && (!(data12 % 1) && !isNaN(data12)))){const err22 = {instancePath:instancePath+"/props/source/limit",schemaPath:"#/$defs/objectTableSource/properties/limit/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err22];}else {vErrors.push(err22);}errors++;}if(typeof data12 == "number"){if(data12 < 0 || isNaN(data12)){const err23 = {instancePath:instancePath+"/props/source/limit",schemaPath:"#/$defs/objectTableSource/properties/limit/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err23];}else {vErrors.push(err23);}errors++;}}}if(data6.extend !== undefined){let data13 = data6.extend;if(Array.isArray(data13)){const len0 = data13.length;for(let i0=0; i0<len0; i0++){if(typeof data13[i0] !== "string"){const err24 = {instancePath:instancePath+"/props/source/extend/" + i0,schemaPath:"#/$defs/objectTableSource/properties/extend/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err24];}else {vErrors.push(err24);}errors++;}}}else {const err25 = {instancePath:instancePath+"/props/source/extend",schemaPath:"#/$defs/objectTableSource/properties/extend/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err25];}else {vErrors.push(err25);}errors++;}}}else {const err26 = {instancePath:instancePath+"/props/source",schemaPath:"#/$defs/objectTableSource/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err26];}else {vErrors.push(err26);}errors++;}}if(data5.endpointSource !== undefined){let data15 = data5.endpointSource;if(data15 && typeof data15 == "object" && !Array.isArray(data15)){if(data15.method === undefined){data15.method = "GET";}if(data15.url === undefined){const err27 = {instancePath:instancePath+"/props/endpointSource",schemaPath:"#/$defs/endpointSource/required",keyword:"required",params:{missingProperty: "url"},message:"must have required property '"+"url"+"'"};if(vErrors === null){vErrors = [err27];}else {vErrors.push(err27);}errors++;}for(const key2 in data15){if(!((((key2 === "url") || (key2 === "method")) || (key2 === "params")) || (key2 === "responsePath"))){const err28 = {instancePath:instancePath+"/props/endpointSource",schemaPath:"#/$defs/endpointSource/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key2},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err28];}else {vErrors.push(err28);}errors++;}}if(data15.url !== undefined){if(typeof data15.url !== "string"){const err29 = {instancePath:instancePath+"/props/endpointSource/url",schemaPath:"#/$defs/endpointSource/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err29];}else {vErrors.push(err29);}errors++;}}let data17 = data15.method;if(typeof data17 !== "string"){const err30 = {instancePath:instancePath+"/props/endpointSource/method",schemaPath:"#/$defs/endpointSource/properties/method/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err30];}else {vErrors.push(err30);}errors++;}if(!((data17 === "GET") || (data17 === "POST"))){const err31 = {instancePath:instancePath+"/props/endpointSource/method",schemaPath:"#/$defs/endpointSource/properties/method/enum",keyword:"enum",params:{allowedValues: schema63.properties.method.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err31];}else {vErrors.push(err31);}errors++;}if(data15.params !== undefined){let data18 = data15.params;if(data18 && typeof data18 == "object" && !Array.isArray(data18));else {const err32 = {instancePath:instancePath+"/props/endpointSource/params",schemaPath:"#/$defs/endpointSource/properties/params/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err32];}else {vErrors.push(err32);}errors++;}}if(data15.responsePath !== undefined){if(typeof data15.responsePath !== "string"){const err33 = {instancePath:instancePath+"/props/endpointSource/responsePath",schemaPath:"#/$defs/endpointSource/properties/responsePath/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err33];}else {vErrors.push(err33);}errors++;}}}else {const err34 = {instancePath:instancePath+"/props/endpointSource",schemaPath:"#/$defs/endpointSource/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err34];}else {vErrors.push(err34);}errors++;}}if(data5.actions !== undefined){let data20 = data5.actions;if(Array.isArray(data20)){const len1 = data20.length;for(let i1=0; i1<len1; i1++){if(!(validate33(data20[i1], {instancePath:instancePath+"/props/actions/" + i1,parentData:data20,parentDataProperty:i1,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate33.errors : vErrors.concat(validate33.errors);errors = vErrors.length;}}}else {const err35 = {instancePath:instancePath+"/props/actions",schemaPath:"#/allOf/4/then/properties/props/properties/actions/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err35];}else {vErrors.push(err35);}errors++;}}if(data5.rowClass !== undefined){let data22 = data5.rowClass;if(Array.isArray(data22)){const len2 = data22.length;for(let i2=0; i2<len2; i2++){let data23 = data22[i2];if(data23 && typeof data23 == "object" && !Array.isArray(data23)){if(data23.when === undefined){const err36 = {instancePath:instancePath+"/props/rowClass/" + i2,schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/required",keyword:"required",params:{missingProperty: "when"},message:"must have required property '"+"when"+"'"};if(vErrors === null){vErrors = [err36];}else {vErrors.push(err36);}errors++;}if(data23.class === undefined){const err37 = {instancePath:instancePath+"/props/rowClass/" + i2,schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/required",keyword:"required",params:{missingProperty: "class"},message:"must have required property '"+"class"+"'"};if(vErrors === null){vErrors = [err37];}else {vErrors.push(err37);}errors++;}for(const key3 in data23){if(!((key3 === "when") || (key3 === "class"))){const err38 = {instancePath:instancePath+"/props/rowClass/" + i2,schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key3},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err38];}else {vErrors.push(err38);}errors++;}}if(data23.when !== undefined){let data24 = data23.when;if(data24 && typeof data24 == "object" && !Array.isArray(data24)){if(data24.op === undefined){data24.op = "eq";}if(data24.field === undefined){const err39 = {instancePath:instancePath+"/props/rowClass/" + i2+"/when",schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/properties/when/required",keyword:"required",params:{missingProperty: "field"},message:"must have required property '"+"field"+"'"};if(vErrors === null){vErrors = [err39];}else {vErrors.push(err39);}errors++;}if(data24.value === undefined){const err40 = {instancePath:instancePath+"/props/rowClass/" + i2+"/when",schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/properties/when/required",keyword:"required",params:{missingProperty: "value"},message:"must have required property '"+"value"+"'"};if(vErrors === null){vErrors = [err40];}else {vErrors.push(err40);}errors++;}for(const key4 in data24){if(!(((key4 === "field") || (key4 === "op")) || (key4 === "value"))){const err41 = {instancePath:instancePath+"/props/rowClass/" + i2+"/when",schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/properties/when/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key4},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err41];}else {vErrors.push(err41);}errors++;}}if(data24.field !== undefined){if(typeof data24.field !== "string"){const err42 = {instancePath:instancePath+"/props/rowClass/" + i2+"/when/field",schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/properties/when/properties/field/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err42];}else {vErrors.push(err42);}errors++;}}let data26 = data24.op;if(typeof data26 !== "string"){const err43 = {instancePath:instancePath+"/props/rowClass/" + i2+"/when/op",schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/properties/when/properties/op/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err43];}else {vErrors.push(err43);}errors++;}if(!((((((data26 === "eq") || (data26 === "neq")) || (data26 === "gt")) || (data26 === "gte")) || (data26 === "lt")) || (data26 === "lte"))){const err44 = {instancePath:instancePath+"/props/rowClass/" + i2+"/when/op",schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/properties/when/properties/op/enum",keyword:"enum",params:{allowedValues: schema50.allOf[4].then.properties.props.properties.rowClass.items.properties.when.properties.op.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err44];}else {vErrors.push(err44);}errors++;}}else {const err45 = {instancePath:instancePath+"/props/rowClass/" + i2+"/when",schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/properties/when/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err45];}else {vErrors.push(err45);}errors++;}}if(data23.class !== undefined){if(typeof data23.class !== "string"){const err46 = {instancePath:instancePath+"/props/rowClass/" + i2+"/class",schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/properties/class/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err46];}else {vErrors.push(err46);}errors++;}}}else {const err47 = {instancePath:instancePath+"/props/rowClass/" + i2,schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err47];}else {vErrors.push(err47);}errors++;}}}else {const err48 = {instancePath:instancePath+"/props/rowClass",schemaPath:"#/allOf/4/then/properties/props/properties/rowClass/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err48];}else {vErrors.push(err48);}errors++;}}}else {const err49 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/4/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err49];}else {vErrors.push(err49);}errors++;}}}var _valid3 = _errs22 === errors;valid8 = _valid3;if(valid8){var props3 = {};props3.props = true;props3.widgetKey = true;}}if(!valid8){const err50 = {instancePath,schemaPath:"#/allOf/4/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err50];}else {vErrors.push(err50);}errors++;}if(props0 !== true && props3 !== undefined){if(props3 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props3);}}const _errs78 = errors;let valid25 = true;const _errs79 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err51 = {};if(vErrors === null){vErrors = [err51];}else {vErrors.push(err51);}errors++;}else {if(data.widgetKey !== undefined){if("nav-card-grid" !== data.widgetKey){const err52 = {};if(vErrors === null){vErrors = [err52];}else {vErrors.push(err52);}errors++;}}}}var _valid4 = _errs79 === errors;errors = _errs78;if(vErrors !== null){if(_errs78){vErrors.length = _errs78;}else {vErrors = null;}}if(_valid4){const _errs81 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props === undefined){const err53 = {instancePath,schemaPath:"#/allOf/5/then/required",keyword:"required",params:{missingProperty: "props"},message:"must have required property '"+"props"+"'"};if(vErrors === null){vErrors = [err53];}else {vErrors.push(err53);}errors++;}if(data.props !== undefined){let data29 = data.props;if(data29 && typeof data29 == "object" && !Array.isArray(data29)){if(data29.entries === undefined){const err54 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/5/then/properties/props/required",keyword:"required",params:{missingProperty: "entries"},message:"must have required property '"+"entries"+"'"};if(vErrors === null){vErrors = [err54];}else {vErrors.push(err54);}errors++;}if(data29.entries !== undefined){let data30 = data29.entries;if(Array.isArray(data30)){const len3 = data30.length;for(let i3=0; i3<len3; i3++){if(!(validate37(data30[i3], {instancePath:instancePath+"/props/entries/" + i3,parentData:data30,parentDataProperty:i3,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate37.errors : vErrors.concat(validate37.errors);errors = vErrors.length;}}}else {const err55 = {instancePath:instancePath+"/props/entries",schemaPath:"#/allOf/5/then/properties/props/properties/entries/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err55];}else {vErrors.push(err55);}errors++;}}}else {const err56 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/5/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err56];}else {vErrors.push(err56);}errors++;}}}var _valid4 = _errs81 === errors;valid25 = _valid4;if(valid25){var props4 = {};props4.props = true;props4.widgetKey = true;}}if(!valid25){const err57 = {instancePath,schemaPath:"#/allOf/5/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err57];}else {vErrors.push(err57);}errors++;}if(props0 !== true && props4 !== undefined){if(props4 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props4);}}const _errs88 = errors;let valid31 = true;const _errs89 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err58 = {};if(vErrors === null){vErrors = [err58];}else {vErrors.push(err58);}errors++;}else {if(data.widgetKey !== undefined){if("stats-block" !== data.widgetKey){const err59 = {};if(vErrors === null){vErrors = [err59];}else {vErrors.push(err59);}errors++;}}}}var _valid5 = _errs89 === errors;errors = _errs88;if(vErrors !== null){if(_errs88){vErrors.length = _errs88;}else {vErrors = null;}}if(_valid5){const _errs91 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props !== undefined){let data33 = data.props;if(data33 && typeof data33 == "object" && !Array.isArray(data33)){if(data33.entries !== undefined){let data34 = data33.entries;if(Array.isArray(data34)){const len4 = data34.length;for(let i4=0; i4<len4; i4++){let data35 = data34[i4];if(data35 && typeof data35 == "object" && !Array.isArray(data35)){if(data35.hideWhenZero === undefined){data35.hideWhenZero = false;}if(data35.register === undefined){const err60 = {instancePath:instancePath+"/props/entries/" + i4,schemaPath:"#/$defs/statsBlockEntry/required",keyword:"required",params:{missingProperty: "register"},message:"must have required property '"+"register"+"'"};if(vErrors === null){vErrors = [err60];}else {vErrors.push(err60);}errors++;}if(data35.schema === undefined){const err61 = {instancePath:instancePath+"/props/entries/" + i4,schemaPath:"#/$defs/statsBlockEntry/required",keyword:"required",params:{missingProperty: "schema"},message:"must have required property '"+"schema"+"'"};if(vErrors === null){vErrors = [err61];}else {vErrors.push(err61);}errors++;}for(const key5 in data35){if(!(func1.call(schema69.properties, key5))){const err62 = {instancePath:instancePath+"/props/entries/" + i4,schemaPath:"#/$defs/statsBlockEntry/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key5},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err62];}else {vErrors.push(err62);}errors++;}}if(data35.title !== undefined){if(typeof data35.title !== "string"){const err63 = {instancePath:instancePath+"/props/entries/" + i4+"/title",schemaPath:"#/$defs/statsBlockEntry/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err63];}else {vErrors.push(err63);}errors++;}}if(data35.register !== undefined){if(typeof data35.register !== "string"){const err64 = {instancePath:instancePath+"/props/entries/" + i4+"/register",schemaPath:"#/$defs/statsBlockEntry/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err64];}else {vErrors.push(err64);}errors++;}}if(data35.schema !== undefined){if(typeof data35.schema !== "string"){const err65 = {instancePath:instancePath+"/props/entries/" + i4+"/schema",schemaPath:"#/$defs/statsBlockEntry/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err65];}else {vErrors.push(err65);}errors++;}}if(data35.metric !== undefined){if(typeof data35.metric !== "string"){const err66 = {instancePath:instancePath+"/props/entries/" + i4+"/metric",schemaPath:"#/$defs/statsBlockEntry/properties/metric/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err66];}else {vErrors.push(err66);}errors++;}}if(data35.field !== undefined){if(typeof data35.field !== "string"){const err67 = {instancePath:instancePath+"/props/entries/" + i4+"/field",schemaPath:"#/$defs/statsBlockEntry/properties/field/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err67];}else {vErrors.push(err67);}errors++;}}if(data35.filter !== undefined){let data41 = data35.filter;if(data41 && typeof data41 == "object" && !Array.isArray(data41));else {const err68 = {instancePath:instancePath+"/props/entries/" + i4+"/filter",schemaPath:"#/$defs/statsBlockEntry/properties/filter/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err68];}else {vErrors.push(err68);}errors++;}}if(data35.route !== undefined){let data42 = data35.route;if(data42 && typeof data42 == "object" && !Array.isArray(data42));else {const err69 = {instancePath:instancePath+"/props/entries/" + i4+"/route",schemaPath:"#/$defs/statsBlockEntry/properties/route/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err69];}else {vErrors.push(err69);}errors++;}}if(data35.variant !== undefined){let data43 = data35.variant;if(typeof data43 !== "string"){const err70 = {instancePath:instancePath+"/props/entries/" + i4+"/variant",schemaPath:"#/$defs/statsBlockEntry/properties/variant/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err70];}else {vErrors.push(err70);}errors++;}if(!(((((data43 === "default") || (data43 === "primary")) || (data43 === "success")) || (data43 === "warning")) || (data43 === "error"))){const err71 = {instancePath:instancePath+"/props/entries/" + i4+"/variant",schemaPath:"#/$defs/statsBlockEntry/properties/variant/enum",keyword:"enum",params:{allowedValues: schema69.properties.variant.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err71];}else {vErrors.push(err71);}errors++;}}if(data35.countLabel !== undefined){if(typeof data35.countLabel !== "string"){const err72 = {instancePath:instancePath+"/props/entries/" + i4+"/countLabel",schemaPath:"#/$defs/statsBlockEntry/properties/countLabel/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err72];}else {vErrors.push(err72);}errors++;}}if(data35.iconClass !== undefined){if(typeof data35.iconClass !== "string"){const err73 = {instancePath:instancePath+"/props/entries/" + i4+"/iconClass",schemaPath:"#/$defs/statsBlockEntry/properties/iconClass/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err73];}else {vErrors.push(err73);}errors++;}}if(typeof data35.hideWhenZero !== "boolean"){const err74 = {instancePath:instancePath+"/props/entries/" + i4+"/hideWhenZero",schemaPath:"#/$defs/statsBlockEntry/properties/hideWhenZero/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err74];}else {vErrors.push(err74);}errors++;}}else {const err75 = {instancePath:instancePath+"/props/entries/" + i4,schemaPath:"#/$defs/statsBlockEntry/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err75];}else {vErrors.push(err75);}errors++;}}}else {const err76 = {instancePath:instancePath+"/props/entries",schemaPath:"#/allOf/6/then/properties/props/properties/entries/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err76];}else {vErrors.push(err76);}errors++;}}}else {const err77 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/6/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err77];}else {vErrors.push(err77);}errors++;}}}var _valid5 = _errs91 === errors;valid31 = _valid5;if(valid31){var props5 = {};props5.props = true;props5.widgetKey = true;}}if(!valid31){const err78 = {instancePath,schemaPath:"#/allOf/6/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err78];}else {vErrors.push(err78);}errors++;}if(props0 !== true && props5 !== undefined){if(props5 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props5);}}const _errs125 = errors;let valid39 = true;const _errs126 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err79 = {};if(vErrors === null){vErrors = [err79];}else {vErrors.push(err79);}errors++;}else {if(data.widgetKey !== undefined){if("banner" !== data.widgetKey){const err80 = {};if(vErrors === null){vErrors = [err80];}else {vErrors.push(err80);}errors++;}}}}var _valid6 = _errs126 === errors;errors = _errs125;if(vErrors !== null){if(_errs125){vErrors.length = _errs125;}else {vErrors = null;}}if(_valid6){const _errs128 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props !== undefined){let data48 = data.props;if(data48 && typeof data48 == "object" && !Array.isArray(data48)){if(data48.variant !== undefined){let data49 = data48.variant;if(typeof data49 !== "string"){const err81 = {instancePath:instancePath+"/props/variant",schemaPath:"#/allOf/7/then/properties/props/properties/variant/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err81];}else {vErrors.push(err81);}errors++;}if(!((((data49 === "info") || (data49 === "warning")) || (data49 === "error")) || (data49 === "success"))){const err82 = {instancePath:instancePath+"/props/variant",schemaPath:"#/allOf/7/then/properties/props/properties/variant/enum",keyword:"enum",params:{allowedValues: schema50.allOf[7].then.properties.props.properties.variant.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err82];}else {vErrors.push(err82);}errors++;}}if(data48.text !== undefined){if(typeof data48.text !== "string"){const err83 = {instancePath:instancePath+"/props/text",schemaPath:"#/allOf/7/then/properties/props/properties/text/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err83];}else {vErrors.push(err83);}errors++;}}if(data48.visibleWhen !== undefined){let data51 = data48.visibleWhen;if(data51 && typeof data51 == "object" && !Array.isArray(data51)){if(data51.op === undefined){data51.op = "eq";}for(const key6 in data51){if(!(((((key6 === "endpoint") || (key6 === "source")) || (key6 === "field")) || (key6 === "op")) || (key6 === "value"))){const err84 = {instancePath:instancePath+"/props/visibleWhen",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key6},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err84];}else {vErrors.push(err84);}errors++;}}if(data51.endpoint !== undefined){if(typeof data51.endpoint !== "string"){const err85 = {instancePath:instancePath+"/props/visibleWhen/endpoint",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/endpoint/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err85];}else {vErrors.push(err85);}errors++;}}if(data51.source !== undefined){let data53 = data51.source;if(data53 && typeof data53 == "object" && !Array.isArray(data53)){if(data53.register === undefined){const err86 = {instancePath:instancePath+"/props/visibleWhen/source",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/source/required",keyword:"required",params:{missingProperty: "register"},message:"must have required property '"+"register"+"'"};if(vErrors === null){vErrors = [err86];}else {vErrors.push(err86);}errors++;}if(data53.schema === undefined){const err87 = {instancePath:instancePath+"/props/visibleWhen/source",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/source/required",keyword:"required",params:{missingProperty: "schema"},message:"must have required property '"+"schema"+"'"};if(vErrors === null){vErrors = [err87];}else {vErrors.push(err87);}errors++;}for(const key7 in data53){if(!(((key7 === "register") || (key7 === "schema")) || (key7 === "filter"))){const err88 = {instancePath:instancePath+"/props/visibleWhen/source",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/source/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key7},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err88];}else {vErrors.push(err88);}errors++;}}if(data53.register !== undefined){if(typeof data53.register !== "string"){const err89 = {instancePath:instancePath+"/props/visibleWhen/source/register",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/source/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err89];}else {vErrors.push(err89);}errors++;}}if(data53.schema !== undefined){if(typeof data53.schema !== "string"){const err90 = {instancePath:instancePath+"/props/visibleWhen/source/schema",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/source/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err90];}else {vErrors.push(err90);}errors++;}}if(data53.filter !== undefined){let data56 = data53.filter;if(data56 && typeof data56 == "object" && !Array.isArray(data56));else {const err91 = {instancePath:instancePath+"/props/visibleWhen/source/filter",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/source/properties/filter/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err91];}else {vErrors.push(err91);}errors++;}}}else {const err92 = {instancePath:instancePath+"/props/visibleWhen/source",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/source/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err92];}else {vErrors.push(err92);}errors++;}}if(data51.field !== undefined){if(typeof data51.field !== "string"){const err93 = {instancePath:instancePath+"/props/visibleWhen/field",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/field/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err93];}else {vErrors.push(err93);}errors++;}}let data58 = data51.op;if(typeof data58 !== "string"){const err94 = {instancePath:instancePath+"/props/visibleWhen/op",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/op/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err94];}else {vErrors.push(err94);}errors++;}if(!((((((data58 === "eq") || (data58 === "neq")) || (data58 === "gt")) || (data58 === "gte")) || (data58 === "lt")) || (data58 === "lte"))){const err95 = {instancePath:instancePath+"/props/visibleWhen/op",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/properties/op/enum",keyword:"enum",params:{allowedValues: schema50.allOf[7].then.properties.props.properties.visibleWhen.properties.op.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err95];}else {vErrors.push(err95);}errors++;}}else {const err96 = {instancePath:instancePath+"/props/visibleWhen",schemaPath:"#/allOf/7/then/properties/props/properties/visibleWhen/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err96];}else {vErrors.push(err96);}errors++;}}if(data48.route !== undefined){let data59 = data48.route;const _errs155 = errors;let valid45 = false;let passing0 = null;const _errs156 = errors;if(typeof data59 !== "string"){const err97 = {instancePath:instancePath+"/props/route",schemaPath:"#/allOf/7/then/properties/props/properties/route/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err97];}else {vErrors.push(err97);}errors++;}var _valid7 = _errs156 === errors;if(_valid7){valid45 = true;passing0 = 0;}const _errs158 = errors;if(data59 && typeof data59 == "object" && !Array.isArray(data59));else {const err98 = {instancePath:instancePath+"/props/route",schemaPath:"#/allOf/7/then/properties/props/properties/route/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err98];}else {vErrors.push(err98);}errors++;}var _valid7 = _errs158 === errors;if(_valid7 && valid45){valid45 = false;passing0 = [passing0, 1];}else {if(_valid7){valid45 = true;passing0 = 1;}}if(!valid45){const err99 = {instancePath:instancePath+"/props/route",schemaPath:"#/allOf/7/then/properties/props/properties/route/oneOf",keyword:"oneOf",params:{passingSchemas: passing0},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err99];}else {vErrors.push(err99);}errors++;}else {errors = _errs155;if(vErrors !== null){if(_errs155){vErrors.length = _errs155;}else {vErrors = null;}}}}}else {const err100 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/7/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err100];}else {vErrors.push(err100);}errors++;}}}var _valid6 = _errs128 === errors;valid39 = _valid6;if(valid39){var props7 = {};props7.props = true;props7.widgetKey = true;}}if(!valid39){const err101 = {instancePath,schemaPath:"#/allOf/7/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err101];}else {vErrors.push(err101);}errors++;}if(props0 !== true && props7 !== undefined){if(props7 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props7);}}const _errs162 = errors;let valid46 = true;const _errs163 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err102 = {};if(vErrors === null){vErrors = [err102];}else {vErrors.push(err102);}errors++;}else {if(data.widgetKey !== undefined){if("audit-trail" !== data.widgetKey){const err103 = {};if(vErrors === null){vErrors = [err103];}else {vErrors.push(err103);}errors++;}}}}var _valid8 = _errs163 === errors;errors = _errs162;if(vErrors !== null){if(_errs162){vErrors.length = _errs162;}else {vErrors = null;}}if(_valid8){const _errs165 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props !== undefined){let data61 = data.props;if(data61 && typeof data61 == "object" && !Array.isArray(data61)){if(data61.register !== undefined){if(typeof data61.register !== "string"){const err104 = {instancePath:instancePath+"/props/register",schemaPath:"#/allOf/8/then/properties/props/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err104];}else {vErrors.push(err104);}errors++;}}if(data61.schema !== undefined){if(typeof data61.schema !== "string"){const err105 = {instancePath:instancePath+"/props/schema",schemaPath:"#/allOf/8/then/properties/props/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err105];}else {vErrors.push(err105);}errors++;}}if(data61.objectId !== undefined){if(typeof data61.objectId !== "string"){const err106 = {instancePath:instancePath+"/props/objectId",schemaPath:"#/allOf/8/then/properties/props/properties/objectId/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err106];}else {vErrors.push(err106);}errors++;}}if(data61.title !== undefined){if(typeof data61.title !== "string"){const err107 = {instancePath:instancePath+"/props/title",schemaPath:"#/allOf/8/then/properties/props/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err107];}else {vErrors.push(err107);}errors++;}}if(data61.maxDisplay !== undefined){let data66 = data61.maxDisplay;if(!((typeof data66 == "number") && (!(data66 % 1) && !isNaN(data66)))){const err108 = {instancePath:instancePath+"/props/maxDisplay",schemaPath:"#/allOf/8/then/properties/props/properties/maxDisplay/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err108];}else {vErrors.push(err108);}errors++;}if(typeof data66 == "number"){if(data66 < 1 || isNaN(data66)){const err109 = {instancePath:instancePath+"/props/maxDisplay",schemaPath:"#/allOf/8/then/properties/props/properties/maxDisplay/minimum",keyword:"minimum",params:{comparison: ">=", limit: 1},message:"must be >= 1"};if(vErrors === null){vErrors = [err109];}else {vErrors.push(err109);}errors++;}}}}else {const err110 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/8/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err110];}else {vErrors.push(err110);}errors++;}}}var _valid8 = _errs165 === errors;valid46 = _valid8;if(valid46){var props8 = {};props8.props = true;props8.widgetKey = true;}}if(!valid46){const err111 = {instancePath,schemaPath:"#/allOf/8/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err111];}else {vErrors.push(err111);}errors++;}if(props0 !== true && props8 !== undefined){if(props8 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props8);}}const _errs179 = errors;let valid50 = true;const _errs180 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err112 = {};if(vErrors === null){vErrors = [err112];}else {vErrors.push(err112);}errors++;}else {if(data.widgetKey !== undefined){if("chart" !== data.widgetKey){const err113 = {};if(vErrors === null){vErrors = [err113];}else {vErrors.push(err113);}errors++;}}}}var _valid9 = _errs180 === errors;errors = _errs179;if(vErrors !== null){if(_errs179){vErrors.length = _errs179;}else {vErrors = null;}}if(_valid9){const _errs182 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props !== undefined){let data68 = data.props;if(data68 && typeof data68 == "object" && !Array.isArray(data68)){if(data68.horizontal !== undefined){if(typeof data68.horizontal !== "boolean"){const err114 = {instancePath:instancePath+"/props/horizontal",schemaPath:"#/allOf/9/then/properties/props/properties/horizontal/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err114];}else {vErrors.push(err114);}errors++;}}if(data68.legendPosition !== undefined){let data70 = data68.legendPosition;if(typeof data70 !== "string"){const err115 = {instancePath:instancePath+"/props/legendPosition",schemaPath:"#/allOf/9/then/properties/props/properties/legendPosition/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err115];}else {vErrors.push(err115);}errors++;}if(!((((data70 === "top") || (data70 === "bottom")) || (data70 === "left")) || (data70 === "right"))){const err116 = {instancePath:instancePath+"/props/legendPosition",schemaPath:"#/allOf/9/then/properties/props/properties/legendPosition/enum",keyword:"enum",params:{allowedValues: schema50.allOf[9].then.properties.props.properties.legendPosition.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err116];}else {vErrors.push(err116);}errors++;}}if(data68.valueAxisBaseline !== undefined){let data71 = data68.valueAxisBaseline;if(typeof data71 !== "string"){const err117 = {instancePath:instancePath+"/props/valueAxisBaseline",schemaPath:"#/allOf/9/then/properties/props/properties/valueAxisBaseline/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err117];}else {vErrors.push(err117);}errors++;}if(!(((data71 === "auto") || (data71 === "zero")) || (data71 === "fit"))){const err118 = {instancePath:instancePath+"/props/valueAxisBaseline",schemaPath:"#/allOf/9/then/properties/props/properties/valueAxisBaseline/enum",keyword:"enum",params:{allowedValues: schema50.allOf[9].then.properties.props.properties.valueAxisBaseline.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err118];}else {vErrors.push(err118);}errors++;}}if(data68.valueFormat !== undefined){let data72 = data68.valueFormat;const _errs192 = errors;let valid54 = false;let passing1 = null;const _errs193 = errors;if(typeof data72 !== "string"){const err119 = {instancePath:instancePath+"/props/valueFormat",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err119];}else {vErrors.push(err119);}errors++;}if(!(((data72 === "currency") || (data72 === "currency-compact")) || (data72 === "percent"))){const err120 = {instancePath:instancePath+"/props/valueFormat",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/0/enum",keyword:"enum",params:{allowedValues: schema50.allOf[9].then.properties.props.properties.valueFormat.oneOf[0].enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err120];}else {vErrors.push(err120);}errors++;}var _valid10 = _errs193 === errors;if(_valid10){valid54 = true;passing1 = 0;}const _errs195 = errors;if(data72 && typeof data72 == "object" && !Array.isArray(data72)){if(data72.name === undefined){const err121 = {instancePath:instancePath+"/props/valueFormat",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/1/required",keyword:"required",params:{missingProperty: "name"},message:"must have required property '"+"name"+"'"};if(vErrors === null){vErrors = [err121];}else {vErrors.push(err121);}errors++;}for(const key8 in data72){if(!(((key8 === "name") || (key8 === "currency")) || (key8 === "decimals"))){const err122 = {instancePath:instancePath+"/props/valueFormat",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/1/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key8},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err122];}else {vErrors.push(err122);}errors++;}}if(data72.name !== undefined){let data73 = data72.name;if(typeof data73 !== "string"){const err123 = {instancePath:instancePath+"/props/valueFormat/name",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/1/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err123];}else {vErrors.push(err123);}errors++;}if(!(((data73 === "currency") || (data73 === "currency-compact")) || (data73 === "percent"))){const err124 = {instancePath:instancePath+"/props/valueFormat/name",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/1/properties/name/enum",keyword:"enum",params:{allowedValues: schema50.allOf[9].then.properties.props.properties.valueFormat.oneOf[1].properties.name.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err124];}else {vErrors.push(err124);}errors++;}}if(data72.currency !== undefined){if(typeof data72.currency !== "string"){const err125 = {instancePath:instancePath+"/props/valueFormat/currency",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/1/properties/currency/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err125];}else {vErrors.push(err125);}errors++;}}if(data72.decimals !== undefined){let data75 = data72.decimals;if(!((typeof data75 == "number") && (!(data75 % 1) && !isNaN(data75)))){const err126 = {instancePath:instancePath+"/props/valueFormat/decimals",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/1/properties/decimals/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err126];}else {vErrors.push(err126);}errors++;}if(typeof data75 == "number"){if(data75 < 0 || isNaN(data75)){const err127 = {instancePath:instancePath+"/props/valueFormat/decimals",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/1/properties/decimals/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err127];}else {vErrors.push(err127);}errors++;}}}}else {const err128 = {instancePath:instancePath+"/props/valueFormat",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err128];}else {vErrors.push(err128);}errors++;}var _valid10 = _errs195 === errors;if(_valid10 && valid54){valid54 = false;passing1 = [passing1, 1];}else {if(_valid10){valid54 = true;passing1 = 1;}}if(!valid54){const err129 = {instancePath:instancePath+"/props/valueFormat",schemaPath:"#/allOf/9/then/properties/props/properties/valueFormat/oneOf",keyword:"oneOf",params:{passingSchemas: passing1},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err129];}else {vErrors.push(err129);}errors++;}else {errors = _errs192;if(vErrors !== null){if(_errs192){vErrors.length = _errs192;}else {vErrors = null;}}}}if(data68.colorMap !== undefined){let data76 = data68.colorMap;if(data76 && typeof data76 == "object" && !Array.isArray(data76)){for(const key9 in data76){if(typeof data76[key9] !== "string"){const err130 = {instancePath:instancePath+"/props/colorMap/" + key9.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/allOf/9/then/properties/props/properties/colorMap/additionalProperties/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err130];}else {vErrors.push(err130);}errors++;}}}else {const err131 = {instancePath:instancePath+"/props/colorMap",schemaPath:"#/allOf/9/then/properties/props/properties/colorMap/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err131];}else {vErrors.push(err131);}errors++;}}if(data68.emptyLabel !== undefined){if(typeof data68.emptyLabel !== "string"){const err132 = {instancePath:instancePath+"/props/emptyLabel",schemaPath:"#/allOf/9/then/properties/props/properties/emptyLabel/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err132];}else {vErrors.push(err132);}errors++;}}if(data68.endpointSource !== undefined){let data79 = data68.endpointSource;if(data79 && typeof data79 == "object" && !Array.isArray(data79)){if(data79.method === undefined){data79.method = "GET";}if(data79.url === undefined){const err133 = {instancePath:instancePath+"/props/endpointSource",schemaPath:"#/$defs/chartEndpointSource/required",keyword:"required",params:{missingProperty: "url"},message:"must have required property '"+"url"+"'"};if(vErrors === null){vErrors = [err133];}else {vErrors.push(err133);}errors++;}for(const key10 in data79){if(!((((((key10 === "url") || (key10 === "method")) || (key10 === "params")) || (key10 === "responsePath")) || (key10 === "labelsPath")) || (key10 === "series"))){const err134 = {instancePath:instancePath+"/props/endpointSource",schemaPath:"#/$defs/chartEndpointSource/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key10},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err134];}else {vErrors.push(err134);}errors++;}}if(data79.url !== undefined){if(typeof data79.url !== "string"){const err135 = {instancePath:instancePath+"/props/endpointSource/url",schemaPath:"#/$defs/chartEndpointSource/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err135];}else {vErrors.push(err135);}errors++;}}let data81 = data79.method;if(typeof data81 !== "string"){const err136 = {instancePath:instancePath+"/props/endpointSource/method",schemaPath:"#/$defs/chartEndpointSource/properties/method/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err136];}else {vErrors.push(err136);}errors++;}if(!((data81 === "GET") || (data81 === "POST"))){const err137 = {instancePath:instancePath+"/props/endpointSource/method",schemaPath:"#/$defs/chartEndpointSource/properties/method/enum",keyword:"enum",params:{allowedValues: schema70.properties.method.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err137];}else {vErrors.push(err137);}errors++;}if(data79.params !== undefined){let data82 = data79.params;if(data82 && typeof data82 == "object" && !Array.isArray(data82));else {const err138 = {instancePath:instancePath+"/props/endpointSource/params",schemaPath:"#/$defs/chartEndpointSource/properties/params/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err138];}else {vErrors.push(err138);}errors++;}}if(data79.responsePath !== undefined){if(typeof data79.responsePath !== "string"){const err139 = {instancePath:instancePath+"/props/endpointSource/responsePath",schemaPath:"#/$defs/chartEndpointSource/properties/responsePath/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err139];}else {vErrors.push(err139);}errors++;}}if(data79.labelsPath !== undefined){if(typeof data79.labelsPath !== "string"){const err140 = {instancePath:instancePath+"/props/endpointSource/labelsPath",schemaPath:"#/$defs/chartEndpointSource/properties/labelsPath/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err140];}else {vErrors.push(err140);}errors++;}}if(data79.series !== undefined){let data85 = data79.series;if(Array.isArray(data85)){const len5 = data85.length;for(let i5=0; i5<len5; i5++){let data86 = data85[i5];if(data86 && typeof data86 == "object" && !Array.isArray(data86)){if(data86.path === undefined){const err141 = {instancePath:instancePath+"/props/endpointSource/series/" + i5,schemaPath:"#/$defs/chartEndpointSource/properties/series/items/required",keyword:"required",params:{missingProperty: "path"},message:"must have required property '"+"path"+"'"};if(vErrors === null){vErrors = [err141];}else {vErrors.push(err141);}errors++;}for(const key11 in data86){if(!((key11 === "name") || (key11 === "path"))){const err142 = {instancePath:instancePath+"/props/endpointSource/series/" + i5,schemaPath:"#/$defs/chartEndpointSource/properties/series/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key11},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err142];}else {vErrors.push(err142);}errors++;}}if(data86.name !== undefined){if(typeof data86.name !== "string"){const err143 = {instancePath:instancePath+"/props/endpointSource/series/" + i5+"/name",schemaPath:"#/$defs/chartEndpointSource/properties/series/items/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err143];}else {vErrors.push(err143);}errors++;}}if(data86.path !== undefined){if(typeof data86.path !== "string"){const err144 = {instancePath:instancePath+"/props/endpointSource/series/" + i5+"/path",schemaPath:"#/$defs/chartEndpointSource/properties/series/items/properties/path/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err144];}else {vErrors.push(err144);}errors++;}}}else {const err145 = {instancePath:instancePath+"/props/endpointSource/series/" + i5,schemaPath:"#/$defs/chartEndpointSource/properties/series/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err145];}else {vErrors.push(err145);}errors++;}}}else {const err146 = {instancePath:instancePath+"/props/endpointSource/series",schemaPath:"#/$defs/chartEndpointSource/properties/series/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err146];}else {vErrors.push(err146);}errors++;}}}else {const err147 = {instancePath:instancePath+"/props/endpointSource",schemaPath:"#/$defs/chartEndpointSource/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err147];}else {vErrors.push(err147);}errors++;}}}else {const err148 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/9/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err148];}else {vErrors.push(err148);}errors++;}}}var _valid9 = _errs182 === errors;valid50 = _valid9;if(valid50){var props10 = {};props10.props = true;props10.widgetKey = true;}}if(!valid50){const err149 = {instancePath,schemaPath:"#/allOf/9/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err149];}else {vErrors.push(err149);}errors++;}if(props0 !== true && props10 !== undefined){if(props10 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props10);}}const _errs236 = errors;let valid62 = true;const _errs237 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err150 = {};if(vErrors === null){vErrors = [err150];}else {vErrors.push(err150);}errors++;}else {if(data.widgetKey !== undefined){let data89 = data.widgetKey;if(!(((data89 === "header") || (data89 === "text")) || (data89 === "divider"))){const err151 = {};if(vErrors === null){vErrors = [err151];}else {vErrors.push(err151);}errors++;}}}}var _valid11 = _errs237 === errors;errors = _errs236;if(vErrors !== null){if(_errs236){vErrors.length = _errs236;}else {vErrors = null;}}if(_valid11){const _errs239 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props !== undefined){let data90 = data.props;if(data90 && typeof data90 == "object" && !Array.isArray(data90)){if(data90.content !== undefined){let data91 = data90.content;if(data91 && typeof data91 == "object" && !Array.isArray(data91));else {const err152 = {instancePath:instancePath+"/props/content",schemaPath:"#/allOf/10/then/properties/props/properties/content/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err152];}else {vErrors.push(err152);}errors++;}}}else {const err153 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/10/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err153];}else {vErrors.push(err153);}errors++;}}}var _valid11 = _errs239 === errors;valid62 = _valid11;if(valid62){var props11 = {};props11.props = true;props11.widgetKey = true;}}if(!valid62){const err154 = {instancePath,schemaPath:"#/allOf/10/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err154];}else {vErrors.push(err154);}errors++;}if(props0 !== true && props11 !== undefined){if(props11 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props11);}}const _errs246 = errors;let valid66 = true;const _errs247 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err155 = {};if(vErrors === null){vErrors = [err155];}else {vErrors.push(err155);}errors++;}else {if(data.widgetKey !== undefined){let data92 = data.widgetKey;if(!((data92 === "stat") || (data92 === "delta"))){const err156 = {};if(vErrors === null){vErrors = [err156];}else {vErrors.push(err156);}errors++;}}}}var _valid12 = _errs247 === errors;errors = _errs246;if(vErrors !== null){if(_errs246){vErrors.length = _errs246;}else {vErrors = null;}}if(_valid12){const _errs249 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props !== undefined){let data93 = data.props;if(data93 && typeof data93 == "object" && !Array.isArray(data93)){if(data93.content !== undefined){let data94 = data93.content;if(data94 && typeof data94 == "object" && !Array.isArray(data94)){if(data94.goodDirection === undefined){data94.goodDirection = "up";}if(data94.endpointSource !== undefined){let data95 = data94.endpointSource;if(data95 && typeof data95 == "object" && !Array.isArray(data95)){if(data95.method === undefined){data95.method = "GET";}if(data95.url === undefined){const err157 = {instancePath:instancePath+"/props/content/endpointSource",schemaPath:"#/$defs/endpointSource/required",keyword:"required",params:{missingProperty: "url"},message:"must have required property '"+"url"+"'"};if(vErrors === null){vErrors = [err157];}else {vErrors.push(err157);}errors++;}for(const key12 in data95){if(!((((key12 === "url") || (key12 === "method")) || (key12 === "params")) || (key12 === "responsePath"))){const err158 = {instancePath:instancePath+"/props/content/endpointSource",schemaPath:"#/$defs/endpointSource/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key12},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err158];}else {vErrors.push(err158);}errors++;}}if(data95.url !== undefined){if(typeof data95.url !== "string"){const err159 = {instancePath:instancePath+"/props/content/endpointSource/url",schemaPath:"#/$defs/endpointSource/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err159];}else {vErrors.push(err159);}errors++;}}let data97 = data95.method;if(typeof data97 !== "string"){const err160 = {instancePath:instancePath+"/props/content/endpointSource/method",schemaPath:"#/$defs/endpointSource/properties/method/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err160];}else {vErrors.push(err160);}errors++;}if(!((data97 === "GET") || (data97 === "POST"))){const err161 = {instancePath:instancePath+"/props/content/endpointSource/method",schemaPath:"#/$defs/endpointSource/properties/method/enum",keyword:"enum",params:{allowedValues: schema63.properties.method.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err161];}else {vErrors.push(err161);}errors++;}if(data95.params !== undefined){let data98 = data95.params;if(data98 && typeof data98 == "object" && !Array.isArray(data98));else {const err162 = {instancePath:instancePath+"/props/content/endpointSource/params",schemaPath:"#/$defs/endpointSource/properties/params/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err162];}else {vErrors.push(err162);}errors++;}}if(data95.responsePath !== undefined){if(typeof data95.responsePath !== "string"){const err163 = {instancePath:instancePath+"/props/content/endpointSource/responsePath",schemaPath:"#/$defs/endpointSource/properties/responsePath/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err163];}else {vErrors.push(err163);}errors++;}}}else {const err164 = {instancePath:instancePath+"/props/content/endpointSource",schemaPath:"#/$defs/endpointSource/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err164];}else {vErrors.push(err164);}errors++;}}if(data94.valueField !== undefined){if(typeof data94.valueField !== "string"){const err165 = {instancePath:instancePath+"/props/content/valueField",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/valueField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err165];}else {vErrors.push(err165);}errors++;}}if(data94.previousField !== undefined){if(typeof data94.previousField !== "string"){const err166 = {instancePath:instancePath+"/props/content/previousField",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/previousField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err166];}else {vErrors.push(err166);}errors++;}}if(data94.deltaField !== undefined){if(typeof data94.deltaField !== "string"){const err167 = {instancePath:instancePath+"/props/content/deltaField",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/deltaField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err167];}else {vErrors.push(err167);}errors++;}}let data103 = data94.goodDirection;if(typeof data103 !== "string"){const err168 = {instancePath:instancePath+"/props/content/goodDirection",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/goodDirection/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err168];}else {vErrors.push(err168);}errors++;}if(!((data103 === "up") || (data103 === "down"))){const err169 = {instancePath:instancePath+"/props/content/goodDirection",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/goodDirection/enum",keyword:"enum",params:{allowedValues: schema50.allOf[11].then.properties.props.properties.content.properties.goodDirection.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err169];}else {vErrors.push(err169);}errors++;}if(data94.variantWhen !== undefined){let data104 = data94.variantWhen;if(Array.isArray(data104)){const len6 = data104.length;for(let i6=0; i6<len6; i6++){let data105 = data104[i6];if(data105 && typeof data105 == "object" && !Array.isArray(data105)){if(data105.op === undefined){const err170 = {instancePath:instancePath+"/props/content/variantWhen/" + i6,schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/required",keyword:"required",params:{missingProperty: "op"},message:"must have required property '"+"op"+"'"};if(vErrors === null){vErrors = [err170];}else {vErrors.push(err170);}errors++;}if(data105.value === undefined){const err171 = {instancePath:instancePath+"/props/content/variantWhen/" + i6,schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/required",keyword:"required",params:{missingProperty: "value"},message:"must have required property '"+"value"+"'"};if(vErrors === null){vErrors = [err171];}else {vErrors.push(err171);}errors++;}if(data105.variant === undefined){const err172 = {instancePath:instancePath+"/props/content/variantWhen/" + i6,schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/required",keyword:"required",params:{missingProperty: "variant"},message:"must have required property '"+"variant"+"'"};if(vErrors === null){vErrors = [err172];}else {vErrors.push(err172);}errors++;}for(const key13 in data105){if(!((((key13 === "op") || (key13 === "value")) || (key13 === "variant")) || (key13 === "icon"))){const err173 = {instancePath:instancePath+"/props/content/variantWhen/" + i6,schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key13},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err173];}else {vErrors.push(err173);}errors++;}}if(data105.op !== undefined){let data106 = data105.op;if(typeof data106 !== "string"){const err174 = {instancePath:instancePath+"/props/content/variantWhen/" + i6+"/op",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/properties/op/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err174];}else {vErrors.push(err174);}errors++;}if(!((((((data106 === "eq") || (data106 === "neq")) || (data106 === "gt")) || (data106 === "gte")) || (data106 === "lt")) || (data106 === "lte"))){const err175 = {instancePath:instancePath+"/props/content/variantWhen/" + i6+"/op",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/properties/op/enum",keyword:"enum",params:{allowedValues: schema50.allOf[11].then.properties.props.properties.content.properties.variantWhen.items.properties.op.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err175];}else {vErrors.push(err175);}errors++;}}if(data105.variant !== undefined){let data107 = data105.variant;if(typeof data107 !== "string"){const err176 = {instancePath:instancePath+"/props/content/variantWhen/" + i6+"/variant",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/properties/variant/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err176];}else {vErrors.push(err176);}errors++;}if(!(((((data107 === "default") || (data107 === "primary")) || (data107 === "success")) || (data107 === "warning")) || (data107 === "error"))){const err177 = {instancePath:instancePath+"/props/content/variantWhen/" + i6+"/variant",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/properties/variant/enum",keyword:"enum",params:{allowedValues: schema50.allOf[11].then.properties.props.properties.content.properties.variantWhen.items.properties.variant.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err177];}else {vErrors.push(err177);}errors++;}}if(data105.icon !== undefined){if(typeof data105.icon !== "string"){const err178 = {instancePath:instancePath+"/props/content/variantWhen/" + i6+"/icon",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err178];}else {vErrors.push(err178);}errors++;}}}else {const err179 = {instancePath:instancePath+"/props/content/variantWhen/" + i6,schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err179];}else {vErrors.push(err179);}errors++;}}}else {const err180 = {instancePath:instancePath+"/props/content/variantWhen",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/variantWhen/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err180];}else {vErrors.push(err180);}errors++;}}if(data94.clickRoute !== undefined){let data109 = data94.clickRoute;const _errs288 = errors;let valid76 = false;let passing2 = null;const _errs289 = errors;if(typeof data109 !== "string"){const err181 = {instancePath:instancePath+"/props/content/clickRoute",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/clickRoute/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err181];}else {vErrors.push(err181);}errors++;}var _valid13 = _errs289 === errors;if(_valid13){valid76 = true;passing2 = 0;}const _errs291 = errors;if(data109 && typeof data109 == "object" && !Array.isArray(data109));else {const err182 = {instancePath:instancePath+"/props/content/clickRoute",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/clickRoute/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err182];}else {vErrors.push(err182);}errors++;}var _valid13 = _errs291 === errors;if(_valid13 && valid76){valid76 = false;passing2 = [passing2, 1];}else {if(_valid13){valid76 = true;passing2 = 1;}}if(!valid76){const err183 = {instancePath:instancePath+"/props/content/clickRoute",schemaPath:"#/allOf/11/then/properties/props/properties/content/properties/clickRoute/oneOf",keyword:"oneOf",params:{passingSchemas: passing2},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err183];}else {vErrors.push(err183);}errors++;}else {errors = _errs288;if(vErrors !== null){if(_errs288){vErrors.length = _errs288;}else {vErrors = null;}}}}}else {const err184 = {instancePath:instancePath+"/props/content",schemaPath:"#/allOf/11/then/properties/props/properties/content/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err184];}else {vErrors.push(err184);}errors++;}}}else {const err185 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/11/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err185];}else {vErrors.push(err185);}errors++;}}}var _valid12 = _errs249 === errors;valid66 = _valid12;if(valid66){var props13 = {};props13.props = true;props13.widgetKey = true;}}if(!valid66){const err186 = {instancePath,schemaPath:"#/allOf/11/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err186];}else {vErrors.push(err186);}errors++;}if(props0 !== true && props13 !== undefined){if(props13 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props13);}}const _errs295 = errors;let valid77 = true;const _errs296 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err187 = {};if(vErrors === null){vErrors = [err187];}else {vErrors.push(err187);}errors++;}else {if(data.widgetKey !== undefined){if("workspace-filter" !== data.widgetKey){const err188 = {};if(vErrors === null){vErrors = [err188];}else {vErrors.push(err188);}errors++;}}}}var _valid14 = _errs296 === errors;errors = _errs295;if(vErrors !== null){if(_errs295){vErrors.length = _errs295;}else {vErrors = null;}}if(_valid14){const _errs298 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props !== undefined){let data111 = data.props;if(data111 && typeof data111 == "object" && !Array.isArray(data111)){if(data111.content !== undefined){let data112 = data111.content;if(data112 && typeof data112 == "object" && !Array.isArray(data112)){if(data112.style === undefined){data112.style = "radio";}if(data112.showCounts === undefined){data112.showCounts = true;}if(data112.writes !== undefined){if(typeof data112.writes !== "string"){const err189 = {instancePath:instancePath+"/props/content/writes",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/writes/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err189];}else {vErrors.push(err189);}errors++;}}let data114 = data112.style;if(typeof data114 !== "string"){const err190 = {instancePath:instancePath+"/props/content/style",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/style/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err190];}else {vErrors.push(err190);}errors++;}if(!((data114 === "radio") || (data114 === "select"))){const err191 = {instancePath:instancePath+"/props/content/style",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/style/enum",keyword:"enum",params:{allowedValues: schema50.allOf[12].then.properties.props.properties.content.properties.style.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err191];}else {vErrors.push(err191);}errors++;}if(data112.allLabel !== undefined){if(typeof data112.allLabel !== "string"){const err192 = {instancePath:instancePath+"/props/content/allLabel",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/allLabel/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err192];}else {vErrors.push(err192);}errors++;}}if(typeof data112.showCounts !== "boolean"){const err193 = {instancePath:instancePath+"/props/content/showCounts",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/showCounts/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err193];}else {vErrors.push(err193);}errors++;}if(data112.options !== undefined){let data117 = data112.options;if(Array.isArray(data117)){const len7 = data117.length;for(let i7=0; i7<len7; i7++){let data118 = data117[i7];if(((!(data118 && typeof data118 == "object" && !Array.isArray(data118))) && (typeof data118 !== "string")) && (!(typeof data118 == "number"))){const err194 = {instancePath:instancePath+"/props/content/options/" + i7,schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/options/items/type",keyword:"type",params:{type: schema50.allOf[12].then.properties.props.properties.content.properties.options.items.type},message:"must be object,string,number"};if(vErrors === null){vErrors = [err194];}else {vErrors.push(err194);}errors++;}}}else {const err195 = {instancePath:instancePath+"/props/content/options",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/options/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err195];}else {vErrors.push(err195);}errors++;}}if(data112.source !== undefined){let data119 = data112.source;if(data119 && typeof data119 == "object" && !Array.isArray(data119)){if(data119.register !== undefined){if(typeof data119.register !== "string"){const err196 = {instancePath:instancePath+"/props/content/source/register",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/source/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err196];}else {vErrors.push(err196);}errors++;}}if(data119.schema !== undefined){if(typeof data119.schema !== "string"){const err197 = {instancePath:instancePath+"/props/content/source/schema",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/source/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err197];}else {vErrors.push(err197);}errors++;}}if(data119.groupBy !== undefined){if(typeof data119.groupBy !== "string"){const err198 = {instancePath:instancePath+"/props/content/source/groupBy",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/source/properties/groupBy/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err198];}else {vErrors.push(err198);}errors++;}}if(data119.filter !== undefined){let data123 = data119.filter;if(data123 && typeof data123 == "object" && !Array.isArray(data123));else {const err199 = {instancePath:instancePath+"/props/content/source/filter",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/source/properties/filter/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err199];}else {vErrors.push(err199);}errors++;}}}else {const err200 = {instancePath:instancePath+"/props/content/source",schemaPath:"#/allOf/12/then/properties/props/properties/content/properties/source/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err200];}else {vErrors.push(err200);}errors++;}}if(data112.endpointSource !== undefined){let data124 = data112.endpointSource;if(data124 && typeof data124 == "object" && !Array.isArray(data124)){if(data124.method === undefined){data124.method = "GET";}if(data124.url === undefined){const err201 = {instancePath:instancePath+"/props/content/endpointSource",schemaPath:"#/$defs/endpointSource/required",keyword:"required",params:{missingProperty: "url"},message:"must have required property '"+"url"+"'"};if(vErrors === null){vErrors = [err201];}else {vErrors.push(err201);}errors++;}for(const key14 in data124){if(!((((key14 === "url") || (key14 === "method")) || (key14 === "params")) || (key14 === "responsePath"))){const err202 = {instancePath:instancePath+"/props/content/endpointSource",schemaPath:"#/$defs/endpointSource/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key14},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err202];}else {vErrors.push(err202);}errors++;}}if(data124.url !== undefined){if(typeof data124.url !== "string"){const err203 = {instancePath:instancePath+"/props/content/endpointSource/url",schemaPath:"#/$defs/endpointSource/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err203];}else {vErrors.push(err203);}errors++;}}let data126 = data124.method;if(typeof data126 !== "string"){const err204 = {instancePath:instancePath+"/props/content/endpointSource/method",schemaPath:"#/$defs/endpointSource/properties/method/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err204];}else {vErrors.push(err204);}errors++;}if(!((data126 === "GET") || (data126 === "POST"))){const err205 = {instancePath:instancePath+"/props/content/endpointSource/method",schemaPath:"#/$defs/endpointSource/properties/method/enum",keyword:"enum",params:{allowedValues: schema63.properties.method.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err205];}else {vErrors.push(err205);}errors++;}if(data124.params !== undefined){let data127 = data124.params;if(data127 && typeof data127 == "object" && !Array.isArray(data127));else {const err206 = {instancePath:instancePath+"/props/content/endpointSource/params",schemaPath:"#/$defs/endpointSource/properties/params/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err206];}else {vErrors.push(err206);}errors++;}}if(data124.responsePath !== undefined){if(typeof data124.responsePath !== "string"){const err207 = {instancePath:instancePath+"/props/content/endpointSource/responsePath",schemaPath:"#/$defs/endpointSource/properties/responsePath/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err207];}else {vErrors.push(err207);}errors++;}}}else {const err208 = {instancePath:instancePath+"/props/content/endpointSource",schemaPath:"#/$defs/endpointSource/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err208];}else {vErrors.push(err208);}errors++;}}}else {const err209 = {instancePath:instancePath+"/props/content",schemaPath:"#/allOf/12/then/properties/props/properties/content/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err209];}else {vErrors.push(err209);}errors++;}}}else {const err210 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/12/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err210];}else {vErrors.push(err210);}errors++;}}}var _valid14 = _errs298 === errors;valid77 = _valid14;if(valid77){var props14 = {};props14.props = true;props14.widgetKey = true;}}if(!valid77){const err211 = {instancePath,schemaPath:"#/allOf/12/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err211];}else {vErrors.push(err211);}errors++;}if(props0 !== true && props14 !== undefined){if(props14 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props14);}}const _errs342 = errors;let valid87 = true;const _errs343 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.widgetKey === undefined) && ("widgetKey")){const err212 = {};if(vErrors === null){vErrors = [err212];}else {vErrors.push(err212);}errors++;}else {if(data.widgetKey !== undefined){if("kb-search" !== data.widgetKey){const err213 = {};if(vErrors === null){vErrors = [err213];}else {vErrors.push(err213);}errors++;}}}}var _valid15 = _errs343 === errors;errors = _errs342;if(vErrors !== null){if(_errs342){vErrors.length = _errs342;}else {vErrors = null;}}if(_valid15){const _errs345 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.props !== undefined){let data130 = data.props;if(data130 && typeof data130 == "object" && !Array.isArray(data130)){if(data130.content !== undefined){let data131 = data130.content;if(data131 && typeof data131 == "object" && !Array.isArray(data131)){if(data131.provider !== undefined){if(typeof data131.provider !== "string"){const err214 = {instancePath:instancePath+"/props/content/provider",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/provider/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err214];}else {vErrors.push(err214);}errors++;}}if(data131.space !== undefined){if(typeof data131.space !== "string"){const err215 = {instancePath:instancePath+"/props/content/space",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/space/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err215];}else {vErrors.push(err215);}errors++;}}if(data131.tags !== undefined){let data134 = data131.tags;const _errs356 = errors;let valid92 = false;let passing3 = null;const _errs357 = errors;if(typeof data134 !== "string"){const err216 = {instancePath:instancePath+"/props/content/tags",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/tags/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err216];}else {vErrors.push(err216);}errors++;}var _valid16 = _errs357 === errors;if(_valid16){valid92 = true;passing3 = 0;}const _errs359 = errors;if(Array.isArray(data134)){const len8 = data134.length;for(let i8=0; i8<len8; i8++){if(typeof data134[i8] !== "string"){const err217 = {instancePath:instancePath+"/props/content/tags/" + i8,schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/tags/oneOf/1/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err217];}else {vErrors.push(err217);}errors++;}}}else {const err218 = {instancePath:instancePath+"/props/content/tags",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/tags/oneOf/1/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err218];}else {vErrors.push(err218);}errors++;}var _valid16 = _errs359 === errors;if(_valid16 && valid92){valid92 = false;passing3 = [passing3, 1];}else {if(_valid16){valid92 = true;passing3 = 1;}}if(!valid92){const err219 = {instancePath:instancePath+"/props/content/tags",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/tags/oneOf",keyword:"oneOf",params:{passingSchemas: passing3},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err219];}else {vErrors.push(err219);}errors++;}else {errors = _errs356;if(vErrors !== null){if(_errs356){vErrors.length = _errs356;}else {vErrors = null;}}}}if(data131.endpoint !== undefined){if(typeof data131.endpoint !== "string"){const err220 = {instancePath:instancePath+"/props/content/endpoint",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/endpoint/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err220];}else {vErrors.push(err220);}errors++;}}if(data131.queryParam !== undefined){if(typeof data131.queryParam !== "string"){const err221 = {instancePath:instancePath+"/props/content/queryParam",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/queryParam/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err221];}else {vErrors.push(err221);}errors++;}}if(data131.bindTo !== undefined){if(typeof data131.bindTo !== "string"){const err222 = {instancePath:instancePath+"/props/content/bindTo",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/bindTo/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err222];}else {vErrors.push(err222);}errors++;}}if(data131.minChars !== undefined){let data139 = data131.minChars;if(!((typeof data139 == "number") && (!(data139 % 1) && !isNaN(data139)))){const err223 = {instancePath:instancePath+"/props/content/minChars",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/minChars/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err223];}else {vErrors.push(err223);}errors++;}if(typeof data139 == "number"){if(data139 < 0 || isNaN(data139)){const err224 = {instancePath:instancePath+"/props/content/minChars",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/minChars/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err224];}else {vErrors.push(err224);}errors++;}}}if(data131.limit !== undefined){let data140 = data131.limit;if(!((typeof data140 == "number") && (!(data140 % 1) && !isNaN(data140)))){const err225 = {instancePath:instancePath+"/props/content/limit",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/limit/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err225];}else {vErrors.push(err225);}errors++;}if(typeof data140 == "number"){if(data140 < 1 || isNaN(data140)){const err226 = {instancePath:instancePath+"/props/content/limit",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/limit/minimum",keyword:"minimum",params:{comparison: ">=", limit: 1},message:"must be >= 1"};if(vErrors === null){vErrors = [err226];}else {vErrors.push(err226);}errors++;}}}if(data131.externalOpen !== undefined){if(typeof data131.externalOpen !== "boolean"){const err227 = {instancePath:instancePath+"/props/content/externalOpen",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/externalOpen/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err227];}else {vErrors.push(err227);}errors++;}}if(data131.unavailableFallback !== undefined){if(typeof data131.unavailableFallback !== "string"){const err228 = {instancePath:instancePath+"/props/content/unavailableFallback",schemaPath:"#/allOf/13/then/properties/props/properties/content/properties/unavailableFallback/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err228];}else {vErrors.push(err228);}errors++;}}}else {const err229 = {instancePath:instancePath+"/props/content",schemaPath:"#/allOf/13/then/properties/props/properties/content/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err229];}else {vErrors.push(err229);}errors++;}}}else {const err230 = {instancePath:instancePath+"/props",schemaPath:"#/allOf/13/then/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err230];}else {vErrors.push(err230);}errors++;}}}var _valid15 = _errs345 === errors;valid87 = _valid15;if(valid87){var props15 = {};props15.props = true;props15.widgetKey = true;}}if(!valid87){const err231 = {instancePath,schemaPath:"#/allOf/13/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err231];}else {vErrors.push(err231);}errors++;}if(props0 !== true && props15 !== undefined){if(props15 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props15);}}if(data && typeof data == "object" && !Array.isArray(data)){if(data.dateChip === undefined){data.dateChip = false;}if(data.widgetKey === undefined){const err232 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "widgetKey"},message:"must have required property '"+"widgetKey"+"'"};if(vErrors === null){vErrors = [err232];}else {vErrors.push(err232);}errors++;}if(data.slot === undefined){const err233 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "slot"},message:"must have required property '"+"slot"+"'"};if(vErrors === null){vErrors = [err233];}else {vErrors.push(err233);}errors++;}if(data.gridX === undefined){const err234 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "gridX"},message:"must have required property '"+"gridX"+"'"};if(vErrors === null){vErrors = [err234];}else {vErrors.push(err234);}errors++;}if(data.gridY === undefined){const err235 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "gridY"},message:"must have required property '"+"gridY"+"'"};if(vErrors === null){vErrors = [err235];}else {vErrors.push(err235);}errors++;}if(data.gridWidth === undefined){const err236 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "gridWidth"},message:"must have required property '"+"gridWidth"+"'"};if(vErrors === null){vErrors = [err236];}else {vErrors.push(err236);}errors++;}if(data.gridHeight === undefined){const err237 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "gridHeight"},message:"must have required property '"+"gridHeight"+"'"};if(vErrors === null){vErrors = [err237];}else {vErrors.push(err237);}errors++;}for(const key15 in data){if(!(func1.call(schema50.properties, key15))){const err238 = {instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key15},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err238];}else {vErrors.push(err238);}errors++;}}if(data.roles !== undefined){let data143 = data.roles;if(Array.isArray(data143)){const len9 = data143.length;for(let i9=0; i9<len9; i9++){let data144 = data143[i9];if(typeof data144 === "string"){if(func6(data144) < 1){const err239 = {instancePath:instancePath+"/roles/" + i9,schemaPath:"#/properties/roles/items/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err239];}else {vErrors.push(err239);}errors++;}}else {const err240 = {instancePath:instancePath+"/roles/" + i9,schemaPath:"#/properties/roles/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err240];}else {vErrors.push(err240);}errors++;}}}else {const err241 = {instancePath:instancePath+"/roles",schemaPath:"#/properties/roles/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err241];}else {vErrors.push(err241);}errors++;}}if(data.visibleWhen !== undefined){if(!(validate34(data.visibleWhen, {instancePath:instancePath+"/visibleWhen",parentData:data,parentDataProperty:"visibleWhen",rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate34.errors : vErrors.concat(validate34.errors);errors = vErrors.length;}}if(data.requiredApp !== undefined){let data146 = data.requiredApp;if(typeof data146 === "string"){if(func6(data146) < 1){const err242 = {instancePath:instancePath+"/requiredApp",schemaPath:"#/properties/requiredApp/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err242];}else {vErrors.push(err242);}errors++;}}else {const err243 = {instancePath:instancePath+"/requiredApp",schemaPath:"#/properties/requiredApp/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err243];}else {vErrors.push(err243);}errors++;}}if(data.id !== undefined){let data147 = data.id;if(typeof data147 === "string"){if(!pattern5.test(data147)){const err244 = {instancePath:instancePath+"/id",schemaPath:"#/properties/id/pattern",keyword:"pattern",params:{pattern: "^[a-z0-9]+(?:-[a-z0-9]+)*$"},message:"must match pattern \""+"^[a-z0-9]+(?:-[a-z0-9]+)*$"+"\""};if(vErrors === null){vErrors = [err244];}else {vErrors.push(err244);}errors++;}}else {const err245 = {instancePath:instancePath+"/id",schemaPath:"#/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err245];}else {vErrors.push(err245);}errors++;}}if(data.widgetKey !== undefined){if(typeof data.widgetKey !== "string"){const err246 = {instancePath:instancePath+"/widgetKey",schemaPath:"#/properties/widgetKey/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err246];}else {vErrors.push(err246);}errors++;}}if(data.slot !== undefined){let data149 = data.slot;const _errs391 = errors;let valid99 = false;let passing4 = null;const _errs392 = errors;if(typeof data149 !== "string"){const err247 = {instancePath:instancePath+"/slot",schemaPath:"#/$defs/slotValue/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err247];}else {vErrors.push(err247);}errors++;}if(!(((((data149 === "body") || (data149 === "sidebar")) || (data149 === "header-actions")) || (data149 === "footer")) || (data149 === "modal"))){const err248 = {instancePath:instancePath+"/slot",schemaPath:"#/$defs/slotValue/oneOf/0/enum",keyword:"enum",params:{allowedValues: schema73.oneOf[0].enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err248];}else {vErrors.push(err248);}errors++;}var _valid17 = _errs392 === errors;if(_valid17){valid99 = true;passing4 = 0;}const _errs394 = errors;if(typeof data149 === "string"){if(!pattern23.test(data149)){const err249 = {instancePath:instancePath+"/slot",schemaPath:"#/$defs/slotValue/oneOf/1/pattern",keyword:"pattern",params:{pattern: "^(tab|section):.+"},message:"must match pattern \""+"^(tab|section):.+"+"\""};if(vErrors === null){vErrors = [err249];}else {vErrors.push(err249);}errors++;}}else {const err250 = {instancePath:instancePath+"/slot",schemaPath:"#/$defs/slotValue/oneOf/1/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err250];}else {vErrors.push(err250);}errors++;}var _valid17 = _errs394 === errors;if(_valid17 && valid99){valid99 = false;passing4 = [passing4, 1];}else {if(_valid17){valid99 = true;passing4 = 1;}}if(!valid99){const err251 = {instancePath:instancePath+"/slot",schemaPath:"#/$defs/slotValue/oneOf",keyword:"oneOf",params:{passingSchemas: passing4},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err251];}else {vErrors.push(err251);}errors++;}else {errors = _errs391;if(vErrors !== null){if(_errs391){vErrors.length = _errs391;}else {vErrors = null;}}}}if(data.gridX !== undefined){let data150 = data.gridX;if(!((typeof data150 == "number") && (!(data150 % 1) && !isNaN(data150)))){const err252 = {instancePath:instancePath+"/gridX",schemaPath:"#/properties/gridX/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err252];}else {vErrors.push(err252);}errors++;}if(typeof data150 == "number"){if(data150 < 0 || isNaN(data150)){const err253 = {instancePath:instancePath+"/gridX",schemaPath:"#/properties/gridX/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err253];}else {vErrors.push(err253);}errors++;}}}if(data.gridY !== undefined){let data151 = data.gridY;if(!((typeof data151 == "number") && (!(data151 % 1) && !isNaN(data151)))){const err254 = {instancePath:instancePath+"/gridY",schemaPath:"#/properties/gridY/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err254];}else {vErrors.push(err254);}errors++;}if(typeof data151 == "number"){if(data151 < 0 || isNaN(data151)){const err255 = {instancePath:instancePath+"/gridY",schemaPath:"#/properties/gridY/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err255];}else {vErrors.push(err255);}errors++;}}}if(data.gridWidth !== undefined){let data152 = data.gridWidth;if(!((typeof data152 == "number") && (!(data152 % 1) && !isNaN(data152)))){const err256 = {instancePath:instancePath+"/gridWidth",schemaPath:"#/properties/gridWidth/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err256];}else {vErrors.push(err256);}errors++;}if(typeof data152 == "number"){if(data152 > 24 || isNaN(data152)){const err257 = {instancePath:instancePath+"/gridWidth",schemaPath:"#/properties/gridWidth/maximum",keyword:"maximum",params:{comparison: "<=", limit: 24},message:"must be <= 24"};if(vErrors === null){vErrors = [err257];}else {vErrors.push(err257);}errors++;}if(data152 < 1 || isNaN(data152)){const err258 = {instancePath:instancePath+"/gridWidth",schemaPath:"#/properties/gridWidth/minimum",keyword:"minimum",params:{comparison: ">=", limit: 1},message:"must be >= 1"};if(vErrors === null){vErrors = [err258];}else {vErrors.push(err258);}errors++;}}}if(data.gridHeight !== undefined){let data153 = data.gridHeight;if(!((typeof data153 == "number") && (!(data153 % 1) && !isNaN(data153)))){const err259 = {instancePath:instancePath+"/gridHeight",schemaPath:"#/properties/gridHeight/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err259];}else {vErrors.push(err259);}errors++;}if(typeof data153 == "number"){if(data153 < 1 || isNaN(data153)){const err260 = {instancePath:instancePath+"/gridHeight",schemaPath:"#/properties/gridHeight/minimum",keyword:"minimum",params:{comparison: ">=", limit: 1},message:"must be >= 1"};if(vErrors === null){vErrors = [err260];}else {vErrors.push(err260);}errors++;}}}if(data.sizeToContent !== undefined){let data154 = data.sizeToContent;if((typeof data154 !== "boolean") && (!((typeof data154 == "number") && (!(data154 % 1) && !isNaN(data154))))){const err261 = {instancePath:instancePath+"/sizeToContent",schemaPath:"#/properties/sizeToContent/type",keyword:"type",params:{type: schema50.properties.sizeToContent.type},message:"must be boolean,integer"};if(vErrors === null){vErrors = [err261];}else {vErrors.push(err261);}errors++;}if(typeof data154 == "number"){if(data154 < 1 || isNaN(data154)){const err262 = {instancePath:instancePath+"/sizeToContent",schemaPath:"#/properties/sizeToContent/minimum",keyword:"minimum",params:{comparison: ">=", limit: 1},message:"must be >= 1"};if(vErrors === null){vErrors = [err262];}else {vErrors.push(err262);}errors++;}}}if(data.props !== undefined){let data155 = data.props;if(data155 && typeof data155 == "object" && !Array.isArray(data155));else {const err263 = {instancePath:instancePath+"/props",schemaPath:"#/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err263];}else {vErrors.push(err263);}errors++;}}if(data.tabGroup !== undefined){if(typeof data.tabGroup !== "string"){const err264 = {instancePath:instancePath+"/tabGroup",schemaPath:"#/properties/tabGroup/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err264];}else {vErrors.push(err264);}errors++;}}if(data.dataSource !== undefined){let data157 = data.dataSource;if(data157 && typeof data157 == "object" && !Array.isArray(data157)){if(data157.register !== undefined){if(typeof data157.register !== "string"){const err265 = {instancePath:instancePath+"/dataSource/register",schemaPath:"#/$defs/dataSource/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err265];}else {vErrors.push(err265);}errors++;}}if(data157.schema !== undefined){if(typeof data157.schema !== "string"){const err266 = {instancePath:instancePath+"/dataSource/schema",schemaPath:"#/$defs/dataSource/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err266];}else {vErrors.push(err266);}errors++;}}if(data157.filter !== undefined){let data160 = data157.filter;if(data160 && typeof data160 == "object" && !Array.isArray(data160));else {const err267 = {instancePath:instancePath+"/dataSource/filter",schemaPath:"#/$defs/dataSource/properties/filter/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err267];}else {vErrors.push(err267);}errors++;}}if(data157.aggregate !== undefined){let data161 = data157.aggregate;const _errs423 = errors;let valid102 = false;let passing5 = null;const _errs424 = errors;if(typeof data161 !== "string"){const err268 = {instancePath:instancePath+"/dataSource/aggregate",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err268];}else {vErrors.push(err268);}errors++;}if(!(data161 === "count")){const err269 = {instancePath:instancePath+"/dataSource/aggregate",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/0/enum",keyword:"enum",params:{allowedValues: schema74.properties.aggregate.oneOf[0].enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err269];}else {vErrors.push(err269);}errors++;}var _valid18 = _errs424 === errors;if(_valid18){valid102 = true;passing5 = 0;}const _errs426 = errors;if(data161 && typeof data161 == "object" && !Array.isArray(data161)){if(data161.groupBy === undefined){const err270 = {instancePath:instancePath+"/dataSource/aggregate",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/required",keyword:"required",params:{missingProperty: "groupBy"},message:"must have required property '"+"groupBy"+"'"};if(vErrors === null){vErrors = [err270];}else {vErrors.push(err270);}errors++;}for(const key16 in data161){if(!((((((key16 === "groupBy") || (key16 === "metric")) || (key16 === "sumField")) || (key16 === "topN")) || (key16 === "otherBucket")) || (key16 === "labelResolve"))){const err271 = {instancePath:instancePath+"/dataSource/aggregate",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key16},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err271];}else {vErrors.push(err271);}errors++;}}if(data161.groupBy !== undefined){if(typeof data161.groupBy !== "string"){const err272 = {instancePath:instancePath+"/dataSource/aggregate/groupBy",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/groupBy/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err272];}else {vErrors.push(err272);}errors++;}}if(data161.metric !== undefined){let data163 = data161.metric;if(typeof data163 !== "string"){const err273 = {instancePath:instancePath+"/dataSource/aggregate/metric",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/metric/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err273];}else {vErrors.push(err273);}errors++;}if(!((data163 === "count") || (data163 === "sum"))){const err274 = {instancePath:instancePath+"/dataSource/aggregate/metric",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/metric/enum",keyword:"enum",params:{allowedValues: schema74.properties.aggregate.oneOf[1].properties.metric.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err274];}else {vErrors.push(err274);}errors++;}}if(data161.sumField !== undefined){if(typeof data161.sumField !== "string"){const err275 = {instancePath:instancePath+"/dataSource/aggregate/sumField",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/sumField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err275];}else {vErrors.push(err275);}errors++;}}if(data161.topN !== undefined){let data165 = data161.topN;if(!((typeof data165 == "number") && (!(data165 % 1) && !isNaN(data165)))){const err276 = {instancePath:instancePath+"/dataSource/aggregate/topN",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/topN/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err276];}else {vErrors.push(err276);}errors++;}if(typeof data165 == "number"){if(data165 < 1 || isNaN(data165)){const err277 = {instancePath:instancePath+"/dataSource/aggregate/topN",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/topN/minimum",keyword:"minimum",params:{comparison: ">=", limit: 1},message:"must be >= 1"};if(vErrors === null){vErrors = [err277];}else {vErrors.push(err277);}errors++;}}}if(data161.otherBucket !== undefined){if(typeof data161.otherBucket !== "boolean"){const err278 = {instancePath:instancePath+"/dataSource/aggregate/otherBucket",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/otherBucket/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err278];}else {vErrors.push(err278);}errors++;}}if(data161.labelResolve !== undefined){let data167 = data161.labelResolve;if(data167 && typeof data167 == "object" && !Array.isArray(data167)){if(data167.schema === undefined){const err279 = {instancePath:instancePath+"/dataSource/aggregate/labelResolve",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/labelResolve/required",keyword:"required",params:{missingProperty: "schema"},message:"must have required property '"+"schema"+"'"};if(vErrors === null){vErrors = [err279];}else {vErrors.push(err279);}errors++;}for(const key17 in data167){if(!((((key17 === "register") || (key17 === "schema")) || (key17 === "labelField")) || (key17 === "colorField"))){const err280 = {instancePath:instancePath+"/dataSource/aggregate/labelResolve",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/labelResolve/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key17},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err280];}else {vErrors.push(err280);}errors++;}}if(data167.register !== undefined){if(typeof data167.register !== "string"){const err281 = {instancePath:instancePath+"/dataSource/aggregate/labelResolve/register",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/labelResolve/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err281];}else {vErrors.push(err281);}errors++;}}if(data167.schema !== undefined){if(typeof data167.schema !== "string"){const err282 = {instancePath:instancePath+"/dataSource/aggregate/labelResolve/schema",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/labelResolve/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err282];}else {vErrors.push(err282);}errors++;}}if(data167.labelField !== undefined){if(typeof data167.labelField !== "string"){const err283 = {instancePath:instancePath+"/dataSource/aggregate/labelResolve/labelField",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/labelResolve/properties/labelField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err283];}else {vErrors.push(err283);}errors++;}}if(data167.colorField !== undefined){if(typeof data167.colorField !== "string"){const err284 = {instancePath:instancePath+"/dataSource/aggregate/labelResolve/colorField",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/labelResolve/properties/colorField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err284];}else {vErrors.push(err284);}errors++;}}}else {const err285 = {instancePath:instancePath+"/dataSource/aggregate/labelResolve",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/properties/labelResolve/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err285];}else {vErrors.push(err285);}errors++;}}}else {const err286 = {instancePath:instancePath+"/dataSource/aggregate",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err286];}else {vErrors.push(err286);}errors++;}var _valid18 = _errs426 === errors;if(_valid18 && valid102){valid102 = false;passing5 = [passing5, 1];}else {if(_valid18){valid102 = true;passing5 = 1;}}if(!valid102){const err287 = {instancePath:instancePath+"/dataSource/aggregate",schemaPath:"#/$defs/dataSource/properties/aggregate/oneOf",keyword:"oneOf",params:{passingSchemas: passing5},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err287];}else {vErrors.push(err287);}errors++;}else {errors = _errs423;if(vErrors !== null){if(_errs423){vErrors.length = _errs423;}else {vErrors = null;}}}}if(data157.drilldown !== undefined){let data172 = data157.drilldown;if(data172 && typeof data172 == "object" && !Array.isArray(data172)){if(data172.route === undefined){const err288 = {instancePath:instancePath+"/dataSource/drilldown",schemaPath:"#/$defs/dataSource/properties/drilldown/required",keyword:"required",params:{missingProperty: "route"},message:"must have required property '"+"route"+"'"};if(vErrors === null){vErrors = [err288];}else {vErrors.push(err288);}errors++;}if(data172.filterParam === undefined){const err289 = {instancePath:instancePath+"/dataSource/drilldown",schemaPath:"#/$defs/dataSource/properties/drilldown/required",keyword:"required",params:{missingProperty: "filterParam"},message:"must have required property '"+"filterParam"+"'"};if(vErrors === null){vErrors = [err289];}else {vErrors.push(err289);}errors++;}for(const key18 in data172){if(!((key18 === "route") || (key18 === "filterParam"))){const err290 = {instancePath:instancePath+"/dataSource/drilldown",schemaPath:"#/$defs/dataSource/properties/drilldown/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key18},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err290];}else {vErrors.push(err290);}errors++;}}if(data172.route !== undefined){if(typeof data172.route !== "string"){const err291 = {instancePath:instancePath+"/dataSource/drilldown/route",schemaPath:"#/$defs/dataSource/properties/drilldown/properties/route/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err291];}else {vErrors.push(err291);}errors++;}}if(data172.filterParam !== undefined){if(typeof data172.filterParam !== "string"){const err292 = {instancePath:instancePath+"/dataSource/drilldown/filterParam",schemaPath:"#/$defs/dataSource/properties/drilldown/properties/filterParam/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err292];}else {vErrors.push(err292);}errors++;}}}else {const err293 = {instancePath:instancePath+"/dataSource/drilldown",schemaPath:"#/$defs/dataSource/properties/drilldown/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err293];}else {vErrors.push(err293);}errors++;}}if(data157.graphql !== undefined){let data175 = data157.graphql;if(data175 && typeof data175 == "object" && !Array.isArray(data175)){if(data175.query === undefined){const err294 = {instancePath:instancePath+"/dataSource/graphql",schemaPath:"#/$defs/dataSource/properties/graphql/required",keyword:"required",params:{missingProperty: "query"},message:"must have required property '"+"query"+"'"};if(vErrors === null){vErrors = [err294];}else {vErrors.push(err294);}errors++;}if(data175.selectors === undefined){const err295 = {instancePath:instancePath+"/dataSource/graphql",schemaPath:"#/$defs/dataSource/properties/graphql/required",keyword:"required",params:{missingProperty: "selectors"},message:"must have required property '"+"selectors"+"'"};if(vErrors === null){vErrors = [err295];}else {vErrors.push(err295);}errors++;}for(const key19 in data175){if(!(((key19 === "query") || (key19 === "variables")) || (key19 === "selectors"))){const err296 = {instancePath:instancePath+"/dataSource/graphql",schemaPath:"#/$defs/dataSource/properties/graphql/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key19},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err296];}else {vErrors.push(err296);}errors++;}}if(data175.query !== undefined){if(typeof data175.query !== "string"){const err297 = {instancePath:instancePath+"/dataSource/graphql/query",schemaPath:"#/$defs/dataSource/properties/graphql/properties/query/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err297];}else {vErrors.push(err297);}errors++;}}if(data175.variables !== undefined){let data177 = data175.variables;if(data177 && typeof data177 == "object" && !Array.isArray(data177));else {const err298 = {instancePath:instancePath+"/dataSource/graphql/variables",schemaPath:"#/$defs/dataSource/properties/graphql/properties/variables/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err298];}else {vErrors.push(err298);}errors++;}}if(data175.selectors !== undefined){let data178 = data175.selectors;if(data178 && typeof data178 == "object" && !Array.isArray(data178)){for(const key20 in data178){if(typeof data178[key20] !== "string"){const err299 = {instancePath:instancePath+"/dataSource/graphql/selectors/" + key20.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/$defs/dataSource/properties/graphql/properties/selectors/additionalProperties/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err299];}else {vErrors.push(err299);}errors++;}}}else {const err300 = {instancePath:instancePath+"/dataSource/graphql/selectors",schemaPath:"#/$defs/dataSource/properties/graphql/properties/selectors/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err300];}else {vErrors.push(err300);}errors++;}}}else {const err301 = {instancePath:instancePath+"/dataSource/graphql",schemaPath:"#/$defs/dataSource/properties/graphql/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err301];}else {vErrors.push(err301);}errors++;}}}else {const err302 = {instancePath:instancePath+"/dataSource",schemaPath:"#/$defs/dataSource/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err302];}else {vErrors.push(err302);}errors++;}}if(typeof data.dateChip !== "boolean"){const err303 = {instancePath:instancePath+"/dateChip",schemaPath:"#/properties/dateChip/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err303];}else {vErrors.push(err303);}errors++;}if(data._note !== undefined){if(typeof data._note !== "string"){const err304 = {instancePath:instancePath+"/_note",schemaPath:"#/properties/_note/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err304];}else {vErrors.push(err304);}errors++;}}if(data.ncDashboard !== undefined){let data182 = data.ncDashboard;if(data182 && typeof data182 == "object" && !Array.isArray(data182)){for(const key21 in data182){if(!((((key21 === "title") || (key21 === "icon")) || (key21 === "order")) || (key21 === "link"))){const err305 = {instancePath:instancePath+"/ncDashboard",schemaPath:"#/properties/ncDashboard/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key21},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err305];}else {vErrors.push(err305);}errors++;}}if(data182.title !== undefined){if(typeof data182.title !== "string"){const err306 = {instancePath:instancePath+"/ncDashboard/title",schemaPath:"#/properties/ncDashboard/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err306];}else {vErrors.push(err306);}errors++;}}if(data182.icon !== undefined){if(typeof data182.icon !== "string"){const err307 = {instancePath:instancePath+"/ncDashboard/icon",schemaPath:"#/properties/ncDashboard/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err307];}else {vErrors.push(err307);}errors++;}}if(data182.order !== undefined){let data185 = data182.order;if(!((typeof data185 == "number") && (!(data185 % 1) && !isNaN(data185)))){const err308 = {instancePath:instancePath+"/ncDashboard/order",schemaPath:"#/properties/ncDashboard/properties/order/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err308];}else {vErrors.push(err308);}errors++;}}if(data182.link !== undefined){let data186 = data182.link;if(typeof data186 === "string"){if(!pattern24.test(data186)){const err309 = {instancePath:instancePath+"/ncDashboard/link",schemaPath:"#/properties/ncDashboard/properties/link/pattern",keyword:"pattern",params:{pattern: "^(?![a-zA-Z][a-zA-Z0-9+.-]*:)(?!//)\\S+$"},message:"must match pattern \""+"^(?![a-zA-Z][a-zA-Z0-9+.-]*:)(?!//)\\S+$"+"\""};if(vErrors === null){vErrors = [err309];}else {vErrors.push(err309);}errors++;}}else {const err310 = {instancePath:instancePath+"/ncDashboard/link",schemaPath:"#/properties/ncDashboard/properties/link/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err310];}else {vErrors.push(err310);}errors++;}}}else {const err311 = {instancePath:instancePath+"/ncDashboard",schemaPath:"#/properties/ncDashboard/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err311];}else {vErrors.push(err311);}errors++;}}}else {const err312 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err312];}else {vErrors.push(err312);}errors++;}validate26.errors = vErrors;evaluated0.items = items0;return errors === 0;}validate26.evaluated = {"props":true,"dynamicProps":false,"dynamicItems":true};const schema78 = {"type":"object","additionalProperties":false,"description":"One sort entry for a `folderSidebar` scope. Name the column with `key` (manifest spelling) or `field` (the CnIndexPage prop spelling); an entry carrying neither is dropped rather than sent as an empty sort key.","properties":{"key":{"type":"string","minLength":1},"field":{"type":"string","minLength":1},"order":{"type":"string","enum":["asc","desc"],"default":"asc"}}};function validate44(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate44.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}if(data && typeof data == "object" && !Array.isArray(data)){if(data.columns !== undefined){let data0 = data.columns;if(Array.isArray(data0)){const len0 = data0.length;for(let i0=0; i0<len0; i0++){let data1 = data0[i0];const _errs5 = errors;let valid3 = false;let passing0 = null;const _errs6 = errors;if(typeof data1 !== "string"){const err0 = {instancePath:instancePath+"/columns/" + i0,schemaPath:"#/properties/columns/items/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}var _valid0 = _errs6 === errors;if(_valid0){valid3 = true;passing0 = 0;}const _errs8 = errors;if(data1 && typeof data1 == "object" && !Array.isArray(data1));else {const err1 = {instancePath:instancePath+"/columns/" + i0,schemaPath:"#/properties/columns/items/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}var _valid0 = _errs8 === errors;if(_valid0 && valid3){valid3 = false;passing0 = [passing0, 1];}else {if(_valid0){valid3 = true;passing0 = 1;}}if(!valid3){const err2 = {instancePath:instancePath+"/columns/" + i0,schemaPath:"#/properties/columns/items/oneOf",keyword:"oneOf",params:{passingSchemas: passing0},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}else {errors = _errs5;if(vErrors !== null){if(_errs5){vErrors.length = _errs5;}else {vErrors = null;}}}}}else {const err3 = {instancePath:instancePath+"/columns",schemaPath:"#/properties/columns/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}}if(data.defaultSort !== undefined){let data2 = data.defaultSort;const _errs12 = errors;let valid4 = false;let passing1 = null;const _errs13 = errors;if(data2 && typeof data2 == "object" && !Array.isArray(data2)){for(const key0 in data2){if(!(((key0 === "key") || (key0 === "field")) || (key0 === "order"))){const err4 = {instancePath:instancePath+"/defaultSort",schemaPath:"#/$defs/folderSidebarScopeSort/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}}if(data2.key !== undefined){let data3 = data2.key;if(typeof data3 === "string"){if(func6(data3) < 1){const err5 = {instancePath:instancePath+"/defaultSort/key",schemaPath:"#/$defs/folderSidebarScopeSort/properties/key/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}else {const err6 = {instancePath:instancePath+"/defaultSort/key",schemaPath:"#/$defs/folderSidebarScopeSort/properties/key/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}}if(data2.field !== undefined){let data4 = data2.field;if(typeof data4 === "string"){if(func6(data4) < 1){const err7 = {instancePath:instancePath+"/defaultSort/field",schemaPath:"#/$defs/folderSidebarScopeSort/properties/field/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}}else {const err8 = {instancePath:instancePath+"/defaultSort/field",schemaPath:"#/$defs/folderSidebarScopeSort/properties/field/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}}if(data2.order !== undefined){let data5 = data2.order;if(typeof data5 !== "string"){const err9 = {instancePath:instancePath+"/defaultSort/order",schemaPath:"#/$defs/folderSidebarScopeSort/properties/order/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}if(!((data5 === "asc") || (data5 === "desc"))){const err10 = {instancePath:instancePath+"/defaultSort/order",schemaPath:"#/$defs/folderSidebarScopeSort/properties/order/enum",keyword:"enum",params:{allowedValues: schema78.properties.order.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}}}else {const err11 = {instancePath:instancePath+"/defaultSort",schemaPath:"#/$defs/folderSidebarScopeSort/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}var _valid1 = _errs13 === errors;if(_valid1){valid4 = true;passing1 = 0;}const _errs23 = errors;if(Array.isArray(data2)){const len1 = data2.length;for(let i1=0; i1<len1; i1++){let data6 = data2[i1];if(data6 && typeof data6 == "object" && !Array.isArray(data6)){for(const key1 in data6){if(!(((key1 === "key") || (key1 === "field")) || (key1 === "order"))){const err12 = {instancePath:instancePath+"/defaultSort/" + i1,schemaPath:"#/$defs/folderSidebarScopeSort/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key1},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}}if(data6.key !== undefined){let data7 = data6.key;if(typeof data7 === "string"){if(func6(data7) < 1){const err13 = {instancePath:instancePath+"/defaultSort/" + i1+"/key",schemaPath:"#/$defs/folderSidebarScopeSort/properties/key/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}}else {const err14 = {instancePath:instancePath+"/defaultSort/" + i1+"/key",schemaPath:"#/$defs/folderSidebarScopeSort/properties/key/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}}if(data6.field !== undefined){let data8 = data6.field;if(typeof data8 === "string"){if(func6(data8) < 1){const err15 = {instancePath:instancePath+"/defaultSort/" + i1+"/field",schemaPath:"#/$defs/folderSidebarScopeSort/properties/field/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}}else {const err16 = {instancePath:instancePath+"/defaultSort/" + i1+"/field",schemaPath:"#/$defs/folderSidebarScopeSort/properties/field/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err16];}else {vErrors.push(err16);}errors++;}}if(data6.order !== undefined){let data9 = data6.order;if(typeof data9 !== "string"){const err17 = {instancePath:instancePath+"/defaultSort/" + i1+"/order",schemaPath:"#/$defs/folderSidebarScopeSort/properties/order/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err17];}else {vErrors.push(err17);}errors++;}if(!((data9 === "asc") || (data9 === "desc"))){const err18 = {instancePath:instancePath+"/defaultSort/" + i1+"/order",schemaPath:"#/$defs/folderSidebarScopeSort/properties/order/enum",keyword:"enum",params:{allowedValues: schema78.properties.order.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err18];}else {vErrors.push(err18);}errors++;}}}else {const err19 = {instancePath:instancePath+"/defaultSort/" + i1,schemaPath:"#/$defs/folderSidebarScopeSort/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err19];}else {vErrors.push(err19);}errors++;}}}else {const err20 = {instancePath:instancePath+"/defaultSort",schemaPath:"#/properties/defaultSort/oneOf/1/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err20];}else {vErrors.push(err20);}errors++;}var _valid1 = _errs23 === errors;if(_valid1 && valid4){valid4 = false;passing1 = [passing1, 1];}else {if(_valid1){valid4 = true;passing1 = 1;}}if(!valid4){const err21 = {instancePath:instancePath+"/defaultSort",schemaPath:"#/properties/defaultSort/oneOf",keyword:"oneOf",params:{passingSchemas: passing1},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err21];}else {vErrors.push(err21);}errors++;}else {errors = _errs12;if(vErrors !== null){if(_errs12){vErrors.length = _errs12;}else {vErrors = null;}}}}if(data.searchFields !== undefined){let data10 = data.searchFields;if(Array.isArray(data10)){const len2 = data10.length;for(let i2=0; i2<len2; i2++){let data11 = data10[i2];if(typeof data11 === "string"){if(func6(data11) < 1){const err22 = {instancePath:instancePath+"/searchFields/" + i2,schemaPath:"#/properties/searchFields/items/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err22];}else {vErrors.push(err22);}errors++;}}else {const err23 = {instancePath:instancePath+"/searchFields/" + i2,schemaPath:"#/properties/searchFields/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err23];}else {vErrors.push(err23);}errors++;}}}else {const err24 = {instancePath:instancePath+"/searchFields",schemaPath:"#/properties/searchFields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err24];}else {vErrors.push(err24);}errors++;}}}else {const err25 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err25];}else {vErrors.push(err25);}errors++;}validate44.errors = vErrors;return errors === 0;}validate44.evaluated = {"props":true,"dynamicProps":false,"dynamicItems":false};function validate25(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate25.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}const _errs2 = errors;let valid1 = true;const _errs3 = errors;const _errs4 = errors;const _errs5 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err0 = {};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}else {if(data.type !== undefined){if("index" !== data.type){const err1 = {};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}}}}var valid2 = _errs5 === errors;if(valid2){const err2 = {};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}else {errors = _errs4;if(vErrors !== null){if(_errs4){vErrors.length = _errs4;}else {vErrors = null;}}}var _valid0 = _errs3 === errors;errors = _errs2;if(vErrors !== null){if(_errs2){vErrors.length = _errs2;}else {vErrors = null;}}if(_valid0){const _errs7 = errors;const _errs8 = errors;const _errs9 = errors;const _errs10 = errors;let valid5 = false;const _errs11 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.splitView === undefined) && ("splitView")){const err3 = {};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}}var _valid1 = _errs11 === errors;valid5 = valid5 || _valid1;const _errs12 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.manualOrder === undefined) && ("manualOrder")){const err4 = {};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}}var _valid1 = _errs12 === errors;valid5 = valid5 || _valid1;const _errs13 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.savedViewTree === undefined) && ("savedViewTree")){const err5 = {};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}var _valid1 = _errs13 === errors;valid5 = valid5 || _valid1;const _errs14 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.board === undefined) && ("board")){const err6 = {};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}}var _valid1 = _errs14 === errors;valid5 = valid5 || _valid1;const _errs15 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.dateAxis === undefined) && ("dateAxis")){const err7 = {};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}}var _valid1 = _errs15 === errors;valid5 = valid5 || _valid1;if(!valid5){const err8 = {};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}else {errors = _errs10;if(vErrors !== null){if(_errs10){vErrors.length = _errs10;}else {vErrors = null;}}}var valid4 = _errs9 === errors;if(valid4){const err9 = {instancePath,schemaPath:"#/allOf/0/then/not",keyword:"not",params:{},message:"must NOT be valid"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}else {errors = _errs8;if(vErrors !== null){if(_errs8){vErrors.length = _errs8;}else {vErrors = null;}}}var _valid0 = _errs7 === errors;valid1 = _valid0;}if(!valid1){const err10 = {instancePath,schemaPath:"#/allOf/0/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}const _errs17 = errors;let valid6 = true;const _errs18 = errors;const _errs19 = errors;const _errs20 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err11 = {};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}else {if(data.type !== undefined){if("detail" !== data.type){const err12 = {};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}}}}var valid7 = _errs20 === errors;if(valid7){const err13 = {};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}else {errors = _errs19;if(vErrors !== null){if(_errs19){vErrors.length = _errs19;}else {vErrors = null;}}}var _valid2 = _errs18 === errors;errors = _errs17;if(vErrors !== null){if(_errs17){vErrors.length = _errs17;}else {vErrors = null;}}if(_valid2){const _errs22 = errors;const _errs23 = errors;const _errs24 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.tabInAddress === undefined) && ("tabInAddress")){const err14 = {};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}}var valid9 = _errs24 === errors;if(valid9){const err15 = {instancePath,schemaPath:"#/allOf/1/then/not",keyword:"not",params:{},message:"must NOT be valid"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}else {errors = _errs23;if(vErrors !== null){if(_errs23){vErrors.length = _errs23;}else {vErrors = null;}}}var _valid2 = _errs22 === errors;valid6 = _valid2;}if(!valid6){const err16 = {instancePath,schemaPath:"#/allOf/1/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err16];}else {vErrors.push(err16);}errors++;}const _errs26 = errors;let valid10 = true;const _errs27 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err17 = {};if(vErrors === null){vErrors = [err17];}else {vErrors.push(err17);}errors++;}else {if(data.type !== undefined){if("wiki" !== data.type){const err18 = {};if(vErrors === null){vErrors = [err18];}else {vErrors.push(err18);}errors++;}}}}var _valid3 = _errs27 === errors;errors = _errs26;if(vErrors !== null){if(_errs26){vErrors.length = _errs26;}else {vErrors = null;}}if(_valid3){const _errs29 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.config === undefined){const err19 = {instancePath,schemaPath:"#/allOf/2/then/required",keyword:"required",params:{missingProperty: "config"},message:"must have required property '"+"config"+"'"};if(vErrors === null){vErrors = [err19];}else {vErrors.push(err19);}errors++;}if(data.config !== undefined){let data3 = data.config;if(data3 && typeof data3 == "object" && !Array.isArray(data3)){if(data3.register === undefined){const err20 = {instancePath:instancePath+"/config",schemaPath:"#/allOf/2/then/properties/config/required",keyword:"required",params:{missingProperty: "register"},message:"must have required property '"+"register"+"'"};if(vErrors === null){vErrors = [err20];}else {vErrors.push(err20);}errors++;}if(data3.schema === undefined){const err21 = {instancePath:instancePath+"/config",schemaPath:"#/allOf/2/then/properties/config/required",keyword:"required",params:{missingProperty: "schema"},message:"must have required property '"+"schema"+"'"};if(vErrors === null){vErrors = [err21];}else {vErrors.push(err21);}errors++;}if(data3.register !== undefined){let data4 = data3.register;if(typeof data4 === "string"){if(func6(data4) < 1){const err22 = {instancePath:instancePath+"/config/register",schemaPath:"#/allOf/2/then/properties/config/properties/register/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err22];}else {vErrors.push(err22);}errors++;}}else {const err23 = {instancePath:instancePath+"/config/register",schemaPath:"#/allOf/2/then/properties/config/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err23];}else {vErrors.push(err23);}errors++;}}if(data3.schema !== undefined){let data5 = data3.schema;if(typeof data5 === "string"){if(func6(data5) < 1){const err24 = {instancePath:instancePath+"/config/schema",schemaPath:"#/allOf/2/then/properties/config/properties/schema/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err24];}else {vErrors.push(err24);}errors++;}}else {const err25 = {instancePath:instancePath+"/config/schema",schemaPath:"#/allOf/2/then/properties/config/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err25];}else {vErrors.push(err25);}errors++;}}}else {const err26 = {instancePath:instancePath+"/config",schemaPath:"#/allOf/2/then/properties/config/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err26];}else {vErrors.push(err26);}errors++;}}}var _valid3 = _errs29 === errors;valid10 = _valid3;if(valid10){var props0 = {};props0.config = true;props0.type = true;}}if(!valid10){const err27 = {instancePath,schemaPath:"#/allOf/2/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err27];}else {vErrors.push(err27);}errors++;}const _errs37 = errors;let valid14 = true;const _errs38 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.type === undefined) && ("type")){const err28 = {};if(vErrors === null){vErrors = [err28];}else {vErrors.push(err28);}errors++;}else {if(data.type !== undefined){if("custom" !== data.type){const err29 = {};if(vErrors === null){vErrors = [err29];}else {vErrors.push(err29);}errors++;}}}}var _valid4 = _errs38 === errors;errors = _errs37;if(vErrors !== null){if(_errs37){vErrors.length = _errs37;}else {vErrors = null;}}if(_valid4){const _errs40 = errors;const _errs41 = errors;let valid16 = true;const _errs42 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.component === undefined) && ("component")){const err30 = {};if(vErrors === null){vErrors = [err30];}else {vErrors.push(err30);}errors++;}else {if(data.component !== undefined){let data7 = data.component;const _errs43 = errors;if(errors === _errs43){if(typeof data7 === "string"){if(!pattern6.test(data7)){const err31 = {};if(vErrors === null){vErrors = [err31];}else {vErrors.push(err31);}errors++;}}else {const err32 = {};if(vErrors === null){vErrors = [err32];}else {vErrors.push(err32);}errors++;}}}}}var _valid5 = _errs42 === errors;errors = _errs41;if(vErrors !== null){if(_errs41){vErrors.length = _errs41;}else {vErrors = null;}}if(!_valid5){const _errs45 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data._note === undefined){const err33 = {instancePath,schemaPath:"#/allOf/3/then/else/required",keyword:"required",params:{missingProperty: "_note"},message:"must have required property '"+"_note"+"'"};if(vErrors === null){vErrors = [err33];}else {vErrors.push(err33);}errors++;}}var _valid5 = _errs45 === errors;valid16 = _valid5;}if(!valid16){const err34 = {instancePath,schemaPath:"#/allOf/3/then/if",keyword:"if",params:{failingKeyword: "else"},message:"must match \"else\" schema"};if(vErrors === null){vErrors = [err34];}else {vErrors.push(err34);}errors++;}var _valid4 = _errs40 === errors;valid14 = _valid4;if(valid14){var props1 = {};props1.component = true;props1.type = true;}}if(!valid14){const err35 = {instancePath,schemaPath:"#/allOf/3/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err35];}else {vErrors.push(err35);}errors++;}if(props0 !== true && props1 !== undefined){if(props1 === true){props0 = true;}else {props0 = props0 || {};Object.assign(props0, props1);}}if(data && typeof data == "object" && !Array.isArray(data)){if(data.manualOrder === undefined){data.manualOrder = false;}if(data.tabInAddress === undefined){data.tabInAddress = false;}if(data.referencePreview === undefined){data.referencePreview = false;}if(data.id === undefined){const err36 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err36];}else {vErrors.push(err36);}errors++;}if(data.route === undefined){const err37 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "route"},message:"must have required property '"+"route"+"'"};if(vErrors === null){vErrors = [err37];}else {vErrors.push(err37);}errors++;}if(data.type === undefined){const err38 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "type"},message:"must have required property '"+"type"+"'"};if(vErrors === null){vErrors = [err38];}else {vErrors.push(err38);}errors++;}if(data.title === undefined){const err39 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "title"},message:"must have required property '"+"title"+"'"};if(vErrors === null){vErrors = [err39];}else {vErrors.push(err39);}errors++;}for(const key0 in data){if(!(func1.call(schema44.properties, key0))){const err40 = {instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err40];}else {vErrors.push(err40);}errors++;}}if(data.requiresApp !== undefined){let data8 = data.requiresApp;const _errs48 = errors;let valid19 = false;let passing0 = null;const _errs49 = errors;if(typeof data8 === "string"){if(func6(data8) < 1){const err41 = {instancePath:instancePath+"/requiresApp",schemaPath:"#/properties/requiresApp/oneOf/0/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err41];}else {vErrors.push(err41);}errors++;}}else {const err42 = {instancePath:instancePath+"/requiresApp",schemaPath:"#/properties/requiresApp/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err42];}else {vErrors.push(err42);}errors++;}var _valid6 = _errs49 === errors;if(_valid6){valid19 = true;passing0 = 0;}const _errs51 = errors;if(data8 && typeof data8 == "object" && !Array.isArray(data8)){if(data8.id === undefined){const err43 = {instancePath:instancePath+"/requiresApp",schemaPath:"#/properties/requiresApp/oneOf/1/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err43];}else {vErrors.push(err43);}errors++;}for(const key1 in data8){if(!((key1 === "id") || (key1 === "name"))){const err44 = {instancePath:instancePath+"/requiresApp",schemaPath:"#/properties/requiresApp/oneOf/1/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key1},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err44];}else {vErrors.push(err44);}errors++;}}if(data8.id !== undefined){let data9 = data8.id;if(typeof data9 === "string"){if(func6(data9) < 1){const err45 = {instancePath:instancePath+"/requiresApp/id",schemaPath:"#/properties/requiresApp/oneOf/1/properties/id/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err45];}else {vErrors.push(err45);}errors++;}}else {const err46 = {instancePath:instancePath+"/requiresApp/id",schemaPath:"#/properties/requiresApp/oneOf/1/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err46];}else {vErrors.push(err46);}errors++;}}if(data8.name !== undefined){let data10 = data8.name;if(typeof data10 === "string"){if(func6(data10) < 1){const err47 = {instancePath:instancePath+"/requiresApp/name",schemaPath:"#/properties/requiresApp/oneOf/1/properties/name/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err47];}else {vErrors.push(err47);}errors++;}}else {const err48 = {instancePath:instancePath+"/requiresApp/name",schemaPath:"#/properties/requiresApp/oneOf/1/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err48];}else {vErrors.push(err48);}errors++;}}}else {const err49 = {instancePath:instancePath+"/requiresApp",schemaPath:"#/properties/requiresApp/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err49];}else {vErrors.push(err49);}errors++;}var _valid6 = _errs51 === errors;if(_valid6 && valid19){valid19 = false;passing0 = [passing0, 1];}else {if(_valid6){valid19 = true;passing0 = 1;}}if(!valid19){const err50 = {instancePath:instancePath+"/requiresApp",schemaPath:"#/properties/requiresApp/oneOf",keyword:"oneOf",params:{passingSchemas: passing0},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err50];}else {vErrors.push(err50);}errors++;}else {errors = _errs48;if(vErrors !== null){if(_errs48){vErrors.length = _errs48;}else {vErrors = null;}}}}if(data.id !== undefined){if(typeof data.id !== "string"){const err51 = {instancePath:instancePath+"/id",schemaPath:"#/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err51];}else {vErrors.push(err51);}errors++;}}if(data.route !== undefined){if(typeof data.route !== "string"){const err52 = {instancePath:instancePath+"/route",schemaPath:"#/properties/route/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err52];}else {vErrors.push(err52);}errors++;}}if(data.type !== undefined){let data13 = data.type;if(typeof data13 !== "string"){const err53 = {instancePath:instancePath+"/type",schemaPath:"#/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err53];}else {vErrors.push(err53);}errors++;}if(!((((((((((((((((((data13 === "index") || (data13 === "detail")) || (data13 === "dashboard")) || (data13 === "logs")) || (data13 === "settings")) || (data13 === "chat")) || (data13 === "files")) || (data13 === "form")) || (data13 === "map")) || (data13 === "roadmap")) || (data13 === "reports")) || (data13 === "store")) || (data13 === "search")) || (data13 === "wiki")) || (data13 === "flow")) || (data13 === "flows")) || (data13 === "flow-detail")) || (data13 === "custom"))){const err54 = {instancePath:instancePath+"/type",schemaPath:"#/properties/type/enum",keyword:"enum",params:{allowedValues: schema44.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err54];}else {vErrors.push(err54);}errors++;}}if(data.title !== undefined){if(typeof data.title !== "string"){const err55 = {instancePath:instancePath+"/title",schemaPath:"#/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err55];}else {vErrors.push(err55);}errors++;}}if(data.permission !== undefined){if(typeof data.permission !== "string"){const err56 = {instancePath:instancePath+"/permission",schemaPath:"#/properties/permission/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err56];}else {vErrors.push(err56);}errors++;}}if(data.component !== undefined){if(typeof data.component !== "string"){const err57 = {instancePath:instancePath+"/component",schemaPath:"#/properties/component/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err57];}else {vErrors.push(err57);}errors++;}}if(data.headerComponent !== undefined){if(typeof data.headerComponent !== "string"){const err58 = {instancePath:instancePath+"/headerComponent",schemaPath:"#/properties/headerComponent/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err58];}else {vErrors.push(err58);}errors++;}}if(data.actionsComponent !== undefined){if(typeof data.actionsComponent !== "string"){const err59 = {instancePath:instancePath+"/actionsComponent",schemaPath:"#/properties/actionsComponent/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err59];}else {vErrors.push(err59);}errors++;}}if(data.sidebarComponent !== undefined){let data19 = data.sidebarComponent;if(typeof data19 === "string"){if(func6(data19) < 1){const err60 = {instancePath:instancePath+"/sidebarComponent",schemaPath:"#/properties/sidebarComponent/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err60];}else {vErrors.push(err60);}errors++;}}else {const err61 = {instancePath:instancePath+"/sidebarComponent",schemaPath:"#/properties/sidebarComponent/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err61];}else {vErrors.push(err61);}errors++;}}if(data.slots !== undefined){let data20 = data.slots;if(data20 && typeof data20 == "object" && !Array.isArray(data20)){for(const key2 in data20){if(typeof data20[key2] !== "string"){const err62 = {instancePath:instancePath+"/slots/" + key2.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/properties/slots/additionalProperties/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err62];}else {vErrors.push(err62);}errors++;}}}else {const err63 = {instancePath:instancePath+"/slots",schemaPath:"#/properties/slots/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err63];}else {vErrors.push(err63);}errors++;}}if(data.primaryAction !== undefined){let data22 = data.primaryAction;if(data22 && typeof data22 == "object" && !Array.isArray(data22)){if(data22.label === undefined){const err64 = {instancePath:instancePath+"/primaryAction",schemaPath:"#/$defs/primaryAction/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err64];}else {vErrors.push(err64);}errors++;}for(const key3 in data22){if(!((((((key3 === "id") || (key3 === "label")) || (key3 === "icon")) || (key3 === "route")) || (key3 === "href")) || (key3 === "payload"))){const err65 = {instancePath:instancePath+"/primaryAction",schemaPath:"#/$defs/primaryAction/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key3},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err65];}else {vErrors.push(err65);}errors++;}}if(data22.id !== undefined){if(typeof data22.id !== "string"){const err66 = {instancePath:instancePath+"/primaryAction/id",schemaPath:"#/$defs/primaryAction/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err66];}else {vErrors.push(err66);}errors++;}}if(data22.label !== undefined){if(typeof data22.label !== "string"){const err67 = {instancePath:instancePath+"/primaryAction/label",schemaPath:"#/$defs/primaryAction/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err67];}else {vErrors.push(err67);}errors++;}}if(data22.icon !== undefined){if(typeof data22.icon !== "string"){const err68 = {instancePath:instancePath+"/primaryAction/icon",schemaPath:"#/$defs/primaryAction/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err68];}else {vErrors.push(err68);}errors++;}}if(data22.route !== undefined){if(typeof data22.route !== "string"){const err69 = {instancePath:instancePath+"/primaryAction/route",schemaPath:"#/$defs/primaryAction/properties/route/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err69];}else {vErrors.push(err69);}errors++;}}if(data22.href !== undefined){if(typeof data22.href !== "string"){const err70 = {instancePath:instancePath+"/primaryAction/href",schemaPath:"#/$defs/primaryAction/properties/href/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err70];}else {vErrors.push(err70);}errors++;}}}else {const err71 = {instancePath:instancePath+"/primaryAction",schemaPath:"#/$defs/primaryAction/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err71];}else {vErrors.push(err71);}errors++;}}if(data.splitView !== undefined){let data28 = data.splitView;if(data28 && typeof data28 == "object" && !Array.isArray(data28)){if(data28.enabled === undefined){data28.enabled = false;}if(data28.breakpoint === undefined){data28.breakpoint = 1024;}for(const key4 in data28){if(!(((key4 === "enabled") || (key4 === "breakpoint")) || (key4 === "paneWidth"))){const err72 = {instancePath:instancePath+"/splitView",schemaPath:"#/$defs/splitView/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key4},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err72];}else {vErrors.push(err72);}errors++;}}if(typeof data28.enabled !== "boolean"){const err73 = {instancePath:instancePath+"/splitView/enabled",schemaPath:"#/$defs/splitView/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err73];}else {vErrors.push(err73);}errors++;}let data30 = data28.breakpoint;if(!((typeof data30 == "number") && (!(data30 % 1) && !isNaN(data30)))){const err74 = {instancePath:instancePath+"/splitView/breakpoint",schemaPath:"#/$defs/splitView/properties/breakpoint/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err74];}else {vErrors.push(err74);}errors++;}if(typeof data30 == "number"){if(data30 > 2560 || isNaN(data30)){const err75 = {instancePath:instancePath+"/splitView/breakpoint",schemaPath:"#/$defs/splitView/properties/breakpoint/maximum",keyword:"maximum",params:{comparison: "<=", limit: 2560},message:"must be <= 2560"};if(vErrors === null){vErrors = [err75];}else {vErrors.push(err75);}errors++;}if(data30 < 320 || isNaN(data30)){const err76 = {instancePath:instancePath+"/splitView/breakpoint",schemaPath:"#/$defs/splitView/properties/breakpoint/minimum",keyword:"minimum",params:{comparison: ">=", limit: 320},message:"must be >= 320"};if(vErrors === null){vErrors = [err76];}else {vErrors.push(err76);}errors++;}}if(data28.paneWidth !== undefined){if(typeof data28.paneWidth !== "string"){const err77 = {instancePath:instancePath+"/splitView/paneWidth",schemaPath:"#/$defs/splitView/properties/paneWidth/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err77];}else {vErrors.push(err77);}errors++;}}}else {const err78 = {instancePath:instancePath+"/splitView",schemaPath:"#/$defs/splitView/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err78];}else {vErrors.push(err78);}errors++;}}if(data.board !== undefined){let data32 = data.board;if(data32 && typeof data32 == "object" && !Array.isArray(data32)){if(data32.statusField === undefined){const err79 = {instancePath:instancePath+"/board",schemaPath:"#/$defs/boardView/required",keyword:"required",params:{missingProperty: "statusField"},message:"must have required property '"+"statusField"+"'"};if(vErrors === null){vErrors = [err79];}else {vErrors.push(err79);}errors++;}for(const key5 in data32){if(!(((key5 === "statusField") || (key5 === "cardFields")) || (key5 === "swimlaneField"))){const err80 = {instancePath:instancePath+"/board",schemaPath:"#/$defs/boardView/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key5},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err80];}else {vErrors.push(err80);}errors++;}}if(data32.statusField !== undefined){if(typeof data32.statusField !== "string"){const err81 = {instancePath:instancePath+"/board/statusField",schemaPath:"#/$defs/boardView/properties/statusField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err81];}else {vErrors.push(err81);}errors++;}}if(data32.cardFields !== undefined){let data34 = data32.cardFields;if(Array.isArray(data34)){const len0 = data34.length;for(let i0=0; i0<len0; i0++){if(typeof data34[i0] !== "string"){const err82 = {instancePath:instancePath+"/board/cardFields/" + i0,schemaPath:"#/$defs/boardView/properties/cardFields/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err82];}else {vErrors.push(err82);}errors++;}}}else {const err83 = {instancePath:instancePath+"/board/cardFields",schemaPath:"#/$defs/boardView/properties/cardFields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err83];}else {vErrors.push(err83);}errors++;}}if(data32.swimlaneField !== undefined){if(typeof data32.swimlaneField !== "string"){const err84 = {instancePath:instancePath+"/board/swimlaneField",schemaPath:"#/$defs/boardView/properties/swimlaneField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err84];}else {vErrors.push(err84);}errors++;}}}else {const err85 = {instancePath:instancePath+"/board",schemaPath:"#/$defs/boardView/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err85];}else {vErrors.push(err85);}errors++;}}if(data.dateAxis !== undefined){let data37 = data.dateAxis;if(data37 && typeof data37 == "object" && !Array.isArray(data37)){if(data37.startField === undefined){const err86 = {instancePath:instancePath+"/dateAxis",schemaPath:"#/$defs/dateAxisView/required",keyword:"required",params:{missingProperty: "startField"},message:"must have required property '"+"startField"+"'"};if(vErrors === null){vErrors = [err86];}else {vErrors.push(err86);}errors++;}if(data37.endField === undefined){const err87 = {instancePath:instancePath+"/dateAxis",schemaPath:"#/$defs/dateAxisView/required",keyword:"required",params:{missingProperty: "endField"},message:"must have required property '"+"endField"+"'"};if(vErrors === null){vErrors = [err87];}else {vErrors.push(err87);}errors++;}for(const key6 in data37){if(!((((key6 === "startField") || (key6 === "endField")) || (key6 === "laneField")) || (key6 === "labelField"))){const err88 = {instancePath:instancePath+"/dateAxis",schemaPath:"#/$defs/dateAxisView/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key6},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err88];}else {vErrors.push(err88);}errors++;}}if(data37.startField !== undefined){if(typeof data37.startField !== "string"){const err89 = {instancePath:instancePath+"/dateAxis/startField",schemaPath:"#/$defs/dateAxisView/properties/startField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err89];}else {vErrors.push(err89);}errors++;}}if(data37.endField !== undefined){if(typeof data37.endField !== "string"){const err90 = {instancePath:instancePath+"/dateAxis/endField",schemaPath:"#/$defs/dateAxisView/properties/endField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err90];}else {vErrors.push(err90);}errors++;}}if(data37.laneField !== undefined){if(typeof data37.laneField !== "string"){const err91 = {instancePath:instancePath+"/dateAxis/laneField",schemaPath:"#/$defs/dateAxisView/properties/laneField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err91];}else {vErrors.push(err91);}errors++;}}if(data37.labelField !== undefined){if(typeof data37.labelField !== "string"){const err92 = {instancePath:instancePath+"/dateAxis/labelField",schemaPath:"#/$defs/dateAxisView/properties/labelField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err92];}else {vErrors.push(err92);}errors++;}}}else {const err93 = {instancePath:instancePath+"/dateAxis",schemaPath:"#/$defs/dateAxisView/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err93];}else {vErrors.push(err93);}errors++;}}if(data.savedViewTree !== undefined){let data42 = data.savedViewTree;if(data42 && typeof data42 == "object" && !Array.isArray(data42)){if(data42.enabled === undefined){data42.enabled = false;}if(data42.maxDepth === undefined){data42.maxDepth = 3;}for(const key7 in data42){if(!(((((((key7 === "enabled") || (key7 === "maxDepth")) || (key7 === "templates")) || (key7 === "landingView")) || (key7 === "columnsPerRole")) || (key7 === "groupBy")) || (key7 === "seeded"))){const err94 = {instancePath:instancePath+"/savedViewTree",schemaPath:"#/$defs/savedViewTree/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key7},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err94];}else {vErrors.push(err94);}errors++;}}if(typeof data42.enabled !== "boolean"){const err95 = {instancePath:instancePath+"/savedViewTree/enabled",schemaPath:"#/$defs/savedViewTree/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err95];}else {vErrors.push(err95);}errors++;}let data44 = data42.maxDepth;if(!((typeof data44 == "number") && (!(data44 % 1) && !isNaN(data44)))){const err96 = {instancePath:instancePath+"/savedViewTree/maxDepth",schemaPath:"#/$defs/savedViewTree/properties/maxDepth/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err96];}else {vErrors.push(err96);}errors++;}if(typeof data44 == "number"){if(data44 > 5 || isNaN(data44)){const err97 = {instancePath:instancePath+"/savedViewTree/maxDepth",schemaPath:"#/$defs/savedViewTree/properties/maxDepth/maximum",keyword:"maximum",params:{comparison: "<=", limit: 5},message:"must be <= 5"};if(vErrors === null){vErrors = [err97];}else {vErrors.push(err97);}errors++;}if(data44 < 1 || isNaN(data44)){const err98 = {instancePath:instancePath+"/savedViewTree/maxDepth",schemaPath:"#/$defs/savedViewTree/properties/maxDepth/minimum",keyword:"minimum",params:{comparison: ">=", limit: 1},message:"must be >= 1"};if(vErrors === null){vErrors = [err98];}else {vErrors.push(err98);}errors++;}}if(data42.templates !== undefined){let data45 = data42.templates;if(Array.isArray(data45)){const len1 = data45.length;for(let i1=0; i1<len1; i1++){let data46 = data45[i1];if(data46 && typeof data46 == "object" && !Array.isArray(data46)){if(data46.slug === undefined){const err99 = {instancePath:instancePath+"/savedViewTree/templates/" + i1,schemaPath:"#/$defs/savedViewTree/properties/templates/items/required",keyword:"required",params:{missingProperty: "slug"},message:"must have required property '"+"slug"+"'"};if(vErrors === null){vErrors = [err99];}else {vErrors.push(err99);}errors++;}if(data46.name === undefined){const err100 = {instancePath:instancePath+"/savedViewTree/templates/" + i1,schemaPath:"#/$defs/savedViewTree/properties/templates/items/required",keyword:"required",params:{missingProperty: "name"},message:"must have required property '"+"name"+"'"};if(vErrors === null){vErrors = [err100];}else {vErrors.push(err100);}errors++;}for(const key8 in data46){if(!(((((key8 === "slug") || (key8 === "name")) || (key8 === "columns")) || (key8 === "defaultSort")) || (key8 === "exportFields"))){const err101 = {instancePath:instancePath+"/savedViewTree/templates/" + i1,schemaPath:"#/$defs/savedViewTree/properties/templates/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key8},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err101];}else {vErrors.push(err101);}errors++;}}if(data46.slug !== undefined){let data47 = data46.slug;if(typeof data47 === "string"){if(!pattern7.test(data47)){const err102 = {instancePath:instancePath+"/savedViewTree/templates/" + i1+"/slug",schemaPath:"#/$defs/savedViewTree/properties/templates/items/properties/slug/pattern",keyword:"pattern",params:{pattern: "^[a-z0-9][a-z0-9-]*$"},message:"must match pattern \""+"^[a-z0-9][a-z0-9-]*$"+"\""};if(vErrors === null){vErrors = [err102];}else {vErrors.push(err102);}errors++;}}else {const err103 = {instancePath:instancePath+"/savedViewTree/templates/" + i1+"/slug",schemaPath:"#/$defs/savedViewTree/properties/templates/items/properties/slug/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err103];}else {vErrors.push(err103);}errors++;}}if(data46.name !== undefined){if(typeof data46.name !== "string"){const err104 = {instancePath:instancePath+"/savedViewTree/templates/" + i1+"/name",schemaPath:"#/$defs/savedViewTree/properties/templates/items/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err104];}else {vErrors.push(err104);}errors++;}}if(data46.columns !== undefined){let data49 = data46.columns;if(Array.isArray(data49)){const len2 = data49.length;for(let i2=0; i2<len2; i2++){if(typeof data49[i2] !== "string"){const err105 = {instancePath:instancePath+"/savedViewTree/templates/" + i1+"/columns/" + i2,schemaPath:"#/$defs/savedViewTree/properties/templates/items/properties/columns/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err105];}else {vErrors.push(err105);}errors++;}}}else {const err106 = {instancePath:instancePath+"/savedViewTree/templates/" + i1+"/columns",schemaPath:"#/$defs/savedViewTree/properties/templates/items/properties/columns/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err106];}else {vErrors.push(err106);}errors++;}}if(data46.defaultSort !== undefined){if(typeof data46.defaultSort !== "string"){const err107 = {instancePath:instancePath+"/savedViewTree/templates/" + i1+"/defaultSort",schemaPath:"#/$defs/savedViewTree/properties/templates/items/properties/defaultSort/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err107];}else {vErrors.push(err107);}errors++;}}if(data46.exportFields !== undefined){let data52 = data46.exportFields;if(Array.isArray(data52)){const len3 = data52.length;for(let i3=0; i3<len3; i3++){if(typeof data52[i3] !== "string"){const err108 = {instancePath:instancePath+"/savedViewTree/templates/" + i1+"/exportFields/" + i3,schemaPath:"#/$defs/savedViewTree/properties/templates/items/properties/exportFields/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err108];}else {vErrors.push(err108);}errors++;}}}else {const err109 = {instancePath:instancePath+"/savedViewTree/templates/" + i1+"/exportFields",schemaPath:"#/$defs/savedViewTree/properties/templates/items/properties/exportFields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err109];}else {vErrors.push(err109);}errors++;}}}else {const err110 = {instancePath:instancePath+"/savedViewTree/templates/" + i1,schemaPath:"#/$defs/savedViewTree/properties/templates/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err110];}else {vErrors.push(err110);}errors++;}}}else {const err111 = {instancePath:instancePath+"/savedViewTree/templates",schemaPath:"#/$defs/savedViewTree/properties/templates/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err111];}else {vErrors.push(err111);}errors++;}}if(data42.landingView !== undefined){let data54 = data42.landingView;if(data54 && typeof data54 == "object" && !Array.isArray(data54)){for(const key9 in data54){if(!(pattern8.test(key9))){const err112 = {instancePath:instancePath+"/savedViewTree/landingView",schemaPath:"#/$defs/savedViewTree/properties/landingView/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key9},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err112];}else {vErrors.push(err112);}errors++;}}for(const key10 in data54){if(pattern8.test(key10)){if(typeof data54[key10] !== "string"){const err113 = {instancePath:instancePath+"/savedViewTree/landingView/" + key10.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/$defs/savedViewTree/properties/landingView/patternProperties/%5E%5BA-Za-z0-9_.-%5D%2B%24/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err113];}else {vErrors.push(err113);}errors++;}}}}else {const err114 = {instancePath:instancePath+"/savedViewTree/landingView",schemaPath:"#/$defs/savedViewTree/properties/landingView/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err114];}else {vErrors.push(err114);}errors++;}}if(data42.columnsPerRole !== undefined){let data56 = data42.columnsPerRole;if(data56 && typeof data56 == "object" && !Array.isArray(data56)){for(const key11 in data56){if(!(pattern8.test(key11))){const err115 = {instancePath:instancePath+"/savedViewTree/columnsPerRole",schemaPath:"#/$defs/savedViewTree/properties/columnsPerRole/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key11},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err115];}else {vErrors.push(err115);}errors++;}}for(const key12 in data56){if(pattern8.test(key12)){let data57 = data56[key12];if(Array.isArray(data57)){const len4 = data57.length;for(let i4=0; i4<len4; i4++){if(typeof data57[i4] !== "string"){const err116 = {instancePath:instancePath+"/savedViewTree/columnsPerRole/" + key12.replace(/~/g, "~0").replace(/\//g, "~1")+"/" + i4,schemaPath:"#/$defs/savedViewTree/properties/columnsPerRole/patternProperties/%5E%5BA-Za-z0-9_.-%5D%2B%24/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err116];}else {vErrors.push(err116);}errors++;}}}else {const err117 = {instancePath:instancePath+"/savedViewTree/columnsPerRole/" + key12.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/$defs/savedViewTree/properties/columnsPerRole/patternProperties/%5E%5BA-Za-z0-9_.-%5D%2B%24/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err117];}else {vErrors.push(err117);}errors++;}}}}else {const err118 = {instancePath:instancePath+"/savedViewTree/columnsPerRole",schemaPath:"#/$defs/savedViewTree/properties/columnsPerRole/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err118];}else {vErrors.push(err118);}errors++;}}if(data42.groupBy !== undefined){if(typeof data42.groupBy !== "string"){const err119 = {instancePath:instancePath+"/savedViewTree/groupBy",schemaPath:"#/$defs/savedViewTree/properties/groupBy/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err119];}else {vErrors.push(err119);}errors++;}}if(data42.seeded !== undefined){let data60 = data42.seeded;if(Array.isArray(data60)){const len5 = data60.length;for(let i5=0; i5<len5; i5++){let data61 = data60[i5];const _errs175 = errors;let valid48 = true;const _errs176 = errors;if(data61 && typeof data61 == "object" && !Array.isArray(data61)){if((data61.inherits === undefined) && ("inherits")){const err120 = {};if(vErrors === null){vErrors = [err120];}else {vErrors.push(err120);}errors++;}}var _valid7 = _errs176 === errors;errors = _errs175;if(vErrors !== null){if(_errs175){vErrors.length = _errs175;}else {vErrors = null;}}if(_valid7){const _errs177 = errors;if(data61 && typeof data61 == "object" && !Array.isArray(data61)){if(data61.parent === undefined){const err121 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5,schemaPath:"#/$defs/savedViewTree/properties/seeded/items/allOf/0/then/required",keyword:"required",params:{missingProperty: "parent"},message:"must have required property '"+"parent"+"'"};if(vErrors === null){vErrors = [err121];}else {vErrors.push(err121);}errors++;}}var _valid7 = _errs177 === errors;valid48 = _valid7;}if(!valid48){const err122 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5,schemaPath:"#/$defs/savedViewTree/properties/seeded/items/allOf/0/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err122];}else {vErrors.push(err122);}errors++;}if(data61 && typeof data61 == "object" && !Array.isArray(data61)){if(data61.slug === undefined){const err123 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5,schemaPath:"#/$defs/savedViewTree/properties/seeded/items/required",keyword:"required",params:{missingProperty: "slug"},message:"must have required property '"+"slug"+"'"};if(vErrors === null){vErrors = [err123];}else {vErrors.push(err123);}errors++;}if(data61.name === undefined){const err124 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5,schemaPath:"#/$defs/savedViewTree/properties/seeded/items/required",keyword:"required",params:{missingProperty: "name"},message:"must have required property '"+"name"+"'"};if(vErrors === null){vErrors = [err124];}else {vErrors.push(err124);}errors++;}for(const key13 in data61){if(!((((((key13 === "slug") || (key13 === "name")) || (key13 === "label")) || (key13 === "parent")) || (key13 === "actions")) || (key13 === "inherits"))){const err125 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5,schemaPath:"#/$defs/savedViewTree/properties/seeded/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key13},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err125];}else {vErrors.push(err125);}errors++;}}if(data61.slug !== undefined){let data62 = data61.slug;if(typeof data62 === "string"){if(!pattern7.test(data62)){const err126 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/slug",schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/slug/pattern",keyword:"pattern",params:{pattern: "^[a-z0-9][a-z0-9-]*$"},message:"must match pattern \""+"^[a-z0-9][a-z0-9-]*$"+"\""};if(vErrors === null){vErrors = [err126];}else {vErrors.push(err126);}errors++;}}else {const err127 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/slug",schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/slug/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err127];}else {vErrors.push(err127);}errors++;}}if(data61.name !== undefined){if(typeof data61.name !== "string"){const err128 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/name",schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err128];}else {vErrors.push(err128);}errors++;}}if(data61.label !== undefined){if(typeof data61.label !== "string"){const err129 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/label",schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err129];}else {vErrors.push(err129);}errors++;}}if(data61.parent !== undefined){if(typeof data61.parent !== "string"){const err130 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/parent",schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/parent/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err130];}else {vErrors.push(err130);}errors++;}}if(data61.actions !== undefined){let data66 = data61.actions;if(Array.isArray(data66)){const len6 = data66.length;for(let i6=0; i6<len6; i6++){if(typeof data66[i6] !== "string"){const err131 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/actions/" + i6,schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/actions/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err131];}else {vErrors.push(err131);}errors++;}}let i7 = data66.length;let j0;if(i7 > 1){const indices0 = {};for(;i7--;){let item0 = data66[i7];if(typeof item0 !== "string"){continue;}if(typeof indices0[item0] == "number"){j0 = indices0[item0];const err132 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/actions",schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/actions/uniqueItems",keyword:"uniqueItems",params:{i: i7, j: j0},message:"must NOT have duplicate items (items ## "+j0+" and "+i7+" are identical)"};if(vErrors === null){vErrors = [err132];}else {vErrors.push(err132);}errors++;break;}indices0[item0] = i7;}}}else {const err133 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/actions",schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/actions/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err133];}else {vErrors.push(err133);}errors++;}}if(data61.inherits !== undefined){let data68 = data61.inherits;if(Array.isArray(data68)){const len7 = data68.length;for(let i8=0; i8<len7; i8++){let data69 = data68[i8];if(typeof data69 !== "string"){const err134 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/inherits/" + i8,schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/inherits/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err134];}else {vErrors.push(err134);}errors++;}if(!(((((data69 === "criteria") || (data69 === "columns")) || (data69 === "sorting")) || (data69 === "defaultSort")) || (data69 === "exportFields"))){const err135 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/inherits/" + i8,schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/inherits/items/enum",keyword:"enum",params:{allowedValues: schema49.properties.seeded.items.properties.inherits.items.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err135];}else {vErrors.push(err135);}errors++;}}let i9 = data68.length;let j1;if(i9 > 1){const indices1 = {};for(;i9--;){let item1 = data68[i9];if(typeof item1 !== "string"){continue;}if(typeof indices1[item1] == "number"){j1 = indices1[item1];const err136 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/inherits",schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/inherits/uniqueItems",keyword:"uniqueItems",params:{i: i9, j: j1},message:"must NOT have duplicate items (items ## "+j1+" and "+i9+" are identical)"};if(vErrors === null){vErrors = [err136];}else {vErrors.push(err136);}errors++;break;}indices1[item1] = i9;}}}else {const err137 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5+"/inherits",schemaPath:"#/$defs/savedViewTree/properties/seeded/items/properties/inherits/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err137];}else {vErrors.push(err137);}errors++;}}}else {const err138 = {instancePath:instancePath+"/savedViewTree/seeded/" + i5,schemaPath:"#/$defs/savedViewTree/properties/seeded/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err138];}else {vErrors.push(err138);}errors++;}}}else {const err139 = {instancePath:instancePath+"/savedViewTree/seeded",schemaPath:"#/$defs/savedViewTree/properties/seeded/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err139];}else {vErrors.push(err139);}errors++;}}}else {const err140 = {instancePath:instancePath+"/savedViewTree",schemaPath:"#/$defs/savedViewTree/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err140];}else {vErrors.push(err140);}errors++;}}if(typeof data.manualOrder !== "boolean"){const err141 = {instancePath:instancePath+"/manualOrder",schemaPath:"#/properties/manualOrder/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err141];}else {vErrors.push(err141);}errors++;}if(typeof data.tabInAddress !== "boolean"){const err142 = {instancePath:instancePath+"/tabInAddress",schemaPath:"#/properties/tabInAddress/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err142];}else {vErrors.push(err142);}errors++;}if(typeof data.referencePreview !== "boolean"){const err143 = {instancePath:instancePath+"/referencePreview",schemaPath:"#/properties/referencePreview/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err143];}else {vErrors.push(err143);}errors++;}if(data.widgets !== undefined){let data73 = data.widgets;if(Array.isArray(data73)){const len8 = data73.length;for(let i10=0; i10<len8; i10++){if(!(validate26(data73[i10], {instancePath:instancePath+"/widgets/" + i10,parentData:data73,parentDataProperty:i10,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate26.errors : vErrors.concat(validate26.errors);errors = vErrors.length;}}}else {const err144 = {instancePath:instancePath+"/widgets",schemaPath:"#/properties/widgets/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err144];}else {vErrors.push(err144);}errors++;}}if(data.actions !== undefined){let data75 = data.actions;if(Array.isArray(data75)){const len9 = data75.length;for(let i11=0; i11<len9; i11++){if(!(validate33(data75[i11], {instancePath:instancePath+"/actions/" + i11,parentData:data75,parentDataProperty:i11,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate33.errors : vErrors.concat(validate33.errors);errors = vErrors.length;}}}else {const err145 = {instancePath:instancePath+"/actions",schemaPath:"#/properties/actions/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err145];}else {vErrors.push(err145);}errors++;}}if(data.config !== undefined){let data77 = data.config;if(!(validate27(data77, {instancePath:instancePath+"/config",parentData:data,parentDataProperty:"config",rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate27.errors : vErrors.concat(validate27.errors);errors = vErrors.length;}if(data77 && typeof data77 == "object" && !Array.isArray(data77)){if(data77.rowIndicatorCap === undefined){data77.rowIndicatorCap = 3;}if(data77.writableField === undefined){data77.writableField = "@self.writableFields";}if(data77.listShortcuts === undefined){data77.listShortcuts = false;}if(data77.formSize === undefined){data77.formSize = "normal";}if(data77.formColumns === undefined){data77.formColumns = 1;}if(data77.splitCloseButton === undefined){data77.splitCloseButton = true;}if(data77.quickFilterMaxVisible === undefined){data77.quickFilterMaxVisible = 0;}if(data77.subscribe === undefined){data77.subscribe = true;}if(data77.lock === undefined){data77.lock = true;}if(data77.entitySource !== undefined){let data78 = data77.entitySource;if(typeof data78 !== "string"){const err146 = {instancePath:instancePath+"/config/entitySource",schemaPath:"#/properties/config/properties/entitySource/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err146];}else {vErrors.push(err146);}errors++;}if(!((data78 === "flows") || (data78 === "tasks"))){const err147 = {instancePath:instancePath+"/config/entitySource",schemaPath:"#/properties/config/properties/entitySource/enum",keyword:"enum",params:{allowedValues: schema44.properties.config.properties.entitySource.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err147];}else {vErrors.push(err147);}errors++;}}if(data77.app !== undefined){if(typeof data77.app !== "string"){const err148 = {instancePath:instancePath+"/config/app",schemaPath:"#/properties/config/properties/app/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err148];}else {vErrors.push(err148);}errors++;}}if(data77.register !== undefined){if(typeof data77.register !== "string"){const err149 = {instancePath:instancePath+"/config/register",schemaPath:"#/properties/config/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err149];}else {vErrors.push(err149);}errors++;}}if(data77.schema !== undefined){if(typeof data77.schema !== "string"){const err150 = {instancePath:instancePath+"/config/schema",schemaPath:"#/properties/config/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err150];}else {vErrors.push(err150);}errors++;}}if(data77.contentField !== undefined){if(typeof data77.contentField !== "string"){const err151 = {instancePath:instancePath+"/config/contentField",schemaPath:"#/properties/config/properties/contentField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err151];}else {vErrors.push(err151);}errors++;}}if(data77.titleField !== undefined){if(typeof data77.titleField !== "string"){const err152 = {instancePath:instancePath+"/config/titleField",schemaPath:"#/properties/config/properties/titleField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err152];}else {vErrors.push(err152);}errors++;}}if(data77.idParam !== undefined){if(typeof data77.idParam !== "string"){const err153 = {instancePath:instancePath+"/config/idParam",schemaPath:"#/properties/config/properties/idParam/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err153];}else {vErrors.push(err153);}errors++;}}if(data77.treeField !== undefined){if(typeof data77.treeField !== "string"){const err154 = {instancePath:instancePath+"/config/treeField",schemaPath:"#/properties/config/properties/treeField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err154];}else {vErrors.push(err154);}errors++;}}if(data77.sidebarTitleField !== undefined){if(typeof data77.sidebarTitleField !== "string"){const err155 = {instancePath:instancePath+"/config/sidebarTitleField",schemaPath:"#/properties/config/properties/sidebarTitleField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err155];}else {vErrors.push(err155);}errors++;}}if(data77.sidebarRegister !== undefined){if(typeof data77.sidebarRegister !== "string"){const err156 = {instancePath:instancePath+"/config/sidebarRegister",schemaPath:"#/properties/config/properties/sidebarRegister/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err156];}else {vErrors.push(err156);}errors++;}}if(data77.sidebarSchema !== undefined){if(typeof data77.sidebarSchema !== "string"){const err157 = {instancePath:instancePath+"/config/sidebarSchema",schemaPath:"#/properties/config/properties/sidebarSchema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err157];}else {vErrors.push(err157);}errors++;}}if(data77.emptyText !== undefined){if(typeof data77.emptyText !== "string"){const err158 = {instancePath:instancePath+"/config/emptyText",schemaPath:"#/properties/config/properties/emptyText/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err158];}else {vErrors.push(err158);}errors++;}}if(data77.emptyDescription !== undefined){if(typeof data77.emptyDescription !== "string"){const err159 = {instancePath:instancePath+"/config/emptyDescription",schemaPath:"#/properties/config/properties/emptyDescription/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err159];}else {vErrors.push(err159);}errors++;}}if(data77.emptyBodyText !== undefined){if(typeof data77.emptyBodyText !== "string"){const err160 = {instancePath:instancePath+"/config/emptyBodyText",schemaPath:"#/properties/config/properties/emptyBodyText/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err160];}else {vErrors.push(err160);}errors++;}}if(data77.emptyBodyDescription !== undefined){if(typeof data77.emptyBodyDescription !== "string"){const err161 = {instancePath:instancePath+"/config/emptyBodyDescription",schemaPath:"#/properties/config/properties/emptyBodyDescription/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err161];}else {vErrors.push(err161);}errors++;}}if(data77.cardComponent !== undefined){if(typeof data77.cardComponent !== "string"){const err162 = {instancePath:instancePath+"/config/cardComponent",schemaPath:"#/properties/config/properties/cardComponent/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err162];}else {vErrors.push(err162);}errors++;}}if(data77.sidebar !== undefined){let data94 = data77.sidebar;const _errs244 = errors;let valid62 = false;let passing1 = null;const _errs245 = errors;if(typeof data94 !== "boolean"){const err163 = {instancePath:instancePath+"/config/sidebar",schemaPath:"#/properties/config/properties/sidebar/oneOf/0/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err163];}else {vErrors.push(err163);}errors++;}var _valid8 = _errs245 === errors;if(_valid8){valid62 = true;passing1 = 0;}const _errs247 = errors;if(data94 && typeof data94 == "object" && !Array.isArray(data94)){if(data94.show !== undefined){if(typeof data94.show !== "boolean"){const err164 = {instancePath:instancePath+"/config/sidebar/show",schemaPath:"#/properties/config/properties/sidebar/oneOf/1/properties/show/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err164];}else {vErrors.push(err164);}errors++;}}if(data94.enabled !== undefined){if(typeof data94.enabled !== "boolean"){const err165 = {instancePath:instancePath+"/config/sidebar/enabled",schemaPath:"#/properties/config/properties/sidebar/oneOf/1/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err165];}else {vErrors.push(err165);}errors++;}}if(data94.columnGroups !== undefined){let data97 = data94.columnGroups;if(Array.isArray(data97)){const len10 = data97.length;for(let i12=0; i12<len10; i12++){let data98 = data97[i12];if(data98 && typeof data98 == "object" && !Array.isArray(data98));else {const err166 = {instancePath:instancePath+"/config/sidebar/columnGroups/" + i12,schemaPath:"#/properties/config/properties/sidebar/oneOf/1/properties/columnGroups/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err166];}else {vErrors.push(err166);}errors++;}}}else {const err167 = {instancePath:instancePath+"/config/sidebar/columnGroups",schemaPath:"#/properties/config/properties/sidebar/oneOf/1/properties/columnGroups/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err167];}else {vErrors.push(err167);}errors++;}}}else {const err168 = {instancePath:instancePath+"/config/sidebar",schemaPath:"#/properties/config/properties/sidebar/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err168];}else {vErrors.push(err168);}errors++;}var _valid8 = _errs247 === errors;if(_valid8 && valid62){valid62 = false;passing1 = [passing1, 1];}else {if(_valid8){valid62 = true;passing1 = 1;}}if(!valid62){const err169 = {instancePath:instancePath+"/config/sidebar",schemaPath:"#/properties/config/properties/sidebar/oneOf",keyword:"oneOf",params:{passingSchemas: passing1},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err169];}else {vErrors.push(err169);}errors++;}else {errors = _errs244;if(vErrors !== null){if(_errs244){vErrors.length = _errs244;}else {vErrors = null;}}}}if(data77.tabs !== undefined){let data99 = data77.tabs;if(Array.isArray(data99)){const len11 = data99.length;for(let i13=0; i13<len11; i13++){let data100 = data99[i13];if(data100 && typeof data100 == "object" && !Array.isArray(data100));else {const err170 = {instancePath:instancePath+"/config/tabs/" + i13,schemaPath:"#/properties/config/properties/tabs/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err170];}else {vErrors.push(err170);}errors++;}}}else {const err171 = {instancePath:instancePath+"/config/tabs",schemaPath:"#/properties/config/properties/tabs/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err171];}else {vErrors.push(err171);}errors++;}}if(data77.sidebarTabs !== undefined){let data101 = data77.sidebarTabs;if(Array.isArray(data101)){const len12 = data101.length;for(let i14=0; i14<len12; i14++){let data102 = data101[i14];if(data102 && typeof data102 == "object" && !Array.isArray(data102)){if(data102.id === undefined){const err172 = {instancePath:instancePath+"/config/sidebarTabs/" + i14,schemaPath:"#/properties/config/properties/sidebarTabs/items/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err172];}else {vErrors.push(err172);}errors++;}if(data102.label === undefined){const err173 = {instancePath:instancePath+"/config/sidebarTabs/" + i14,schemaPath:"#/properties/config/properties/sidebarTabs/items/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err173];}else {vErrors.push(err173);}errors++;}if(data102.id !== undefined){let data103 = data102.id;if(typeof data103 === "string"){if(func6(data103) < 1){const err174 = {instancePath:instancePath+"/config/sidebarTabs/" + i14+"/id",schemaPath:"#/properties/config/properties/sidebarTabs/items/properties/id/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err174];}else {vErrors.push(err174);}errors++;}}else {const err175 = {instancePath:instancePath+"/config/sidebarTabs/" + i14+"/id",schemaPath:"#/properties/config/properties/sidebarTabs/items/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err175];}else {vErrors.push(err175);}errors++;}}if(data102.label !== undefined){let data104 = data102.label;if(typeof data104 === "string"){if(func6(data104) < 1){const err176 = {instancePath:instancePath+"/config/sidebarTabs/" + i14+"/label",schemaPath:"#/properties/config/properties/sidebarTabs/items/properties/label/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err176];}else {vErrors.push(err176);}errors++;}}else {const err177 = {instancePath:instancePath+"/config/sidebarTabs/" + i14+"/label",schemaPath:"#/properties/config/properties/sidebarTabs/items/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err177];}else {vErrors.push(err177);}errors++;}}if(data102.icon !== undefined){if(typeof data102.icon !== "string"){const err178 = {instancePath:instancePath+"/config/sidebarTabs/" + i14+"/icon",schemaPath:"#/properties/config/properties/sidebarTabs/items/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err178];}else {vErrors.push(err178);}errors++;}}if(data102.order !== undefined){if(!(typeof data102.order == "number")){const err179 = {instancePath:instancePath+"/config/sidebarTabs/" + i14+"/order",schemaPath:"#/properties/config/properties/sidebarTabs/items/properties/order/type",keyword:"type",params:{type: "number"},message:"must be number"};if(vErrors === null){vErrors = [err179];}else {vErrors.push(err179);}errors++;}}if(data102.component !== undefined){if(typeof data102.component !== "string"){const err180 = {instancePath:instancePath+"/config/sidebarTabs/" + i14+"/component",schemaPath:"#/properties/config/properties/sidebarTabs/items/properties/component/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err180];}else {vErrors.push(err180);}errors++;}}if(data102._note !== undefined){if(typeof data102._note !== "string"){const err181 = {instancePath:instancePath+"/config/sidebarTabs/" + i14+"/_note",schemaPath:"#/properties/config/properties/sidebarTabs/items/properties/_note/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err181];}else {vErrors.push(err181);}errors++;}}}else {const err182 = {instancePath:instancePath+"/config/sidebarTabs/" + i14,schemaPath:"#/properties/config/properties/sidebarTabs/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err182];}else {vErrors.push(err182);}errors++;}}}else {const err183 = {instancePath:instancePath+"/config/sidebarTabs",schemaPath:"#/properties/config/properties/sidebarTabs/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err183];}else {vErrors.push(err183);}errors++;}}if(data77.sections !== undefined){let data109 = data77.sections;if(Array.isArray(data109)){const len13 = data109.length;for(let i15=0; i15<len13; i15++){let data110 = data109[i15];if(data110 && typeof data110 == "object" && !Array.isArray(data110));else {const err184 = {instancePath:instancePath+"/config/sections/" + i15,schemaPath:"#/properties/config/properties/sections/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err184];}else {vErrors.push(err184);}errors++;}}}else {const err185 = {instancePath:instancePath+"/config/sections",schemaPath:"#/properties/config/properties/sections/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err185];}else {vErrors.push(err185);}errors++;}}if(data77.fields !== undefined){let data111 = data77.fields;if(Array.isArray(data111)){const len14 = data111.length;for(let i16=0; i16<len14; i16++){let data112 = data111[i16];if(data112 && typeof data112 == "object" && !Array.isArray(data112)){if(data112.visibleWhen !== undefined){if(!(validate34(data112.visibleWhen, {instancePath:instancePath+"/config/fields/" + i16+"/visibleWhen",parentData:data112,parentDataProperty:"visibleWhen",rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate34.errors : vErrors.concat(validate34.errors);errors = vErrors.length;}}if(data112.validation !== undefined){let data114 = data112.validation;if(data114 && typeof data114 == "object" && !Array.isArray(data114)){for(const key14 in data114){if(!(((((key14 === "required") || (key14 === "min")) || (key14 === "max")) || (key14 === "pattern")) || (key14 === "message"))){const err186 = {instancePath:instancePath+"/config/fields/" + i16+"/validation",schemaPath:"#/$defs/fieldValidation/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key14},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err186];}else {vErrors.push(err186);}errors++;}}if(data114.required !== undefined){if(typeof data114.required !== "boolean"){const err187 = {instancePath:instancePath+"/config/fields/" + i16+"/validation/required",schemaPath:"#/$defs/fieldValidation/properties/required/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err187];}else {vErrors.push(err187);}errors++;}}if(data114.min !== undefined){if(!(typeof data114.min == "number")){const err188 = {instancePath:instancePath+"/config/fields/" + i16+"/validation/min",schemaPath:"#/$defs/fieldValidation/properties/min/type",keyword:"type",params:{type: "number"},message:"must be number"};if(vErrors === null){vErrors = [err188];}else {vErrors.push(err188);}errors++;}}if(data114.max !== undefined){if(!(typeof data114.max == "number")){const err189 = {instancePath:instancePath+"/config/fields/" + i16+"/validation/max",schemaPath:"#/$defs/fieldValidation/properties/max/type",keyword:"type",params:{type: "number"},message:"must be number"};if(vErrors === null){vErrors = [err189];}else {vErrors.push(err189);}errors++;}}if(data114.pattern !== undefined){if(typeof data114.pattern !== "string"){const err190 = {instancePath:instancePath+"/config/fields/" + i16+"/validation/pattern",schemaPath:"#/$defs/fieldValidation/properties/pattern/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err190];}else {vErrors.push(err190);}errors++;}}if(data114.message !== undefined){if(typeof data114.message !== "string"){const err191 = {instancePath:instancePath+"/config/fields/" + i16+"/validation/message",schemaPath:"#/$defs/fieldValidation/properties/message/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err191];}else {vErrors.push(err191);}errors++;}}}else {const err192 = {instancePath:instancePath+"/config/fields/" + i16+"/validation",schemaPath:"#/$defs/fieldValidation/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err192];}else {vErrors.push(err192);}errors++;}}}else {const err193 = {instancePath:instancePath+"/config/fields/" + i16,schemaPath:"#/properties/config/properties/fields/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err193];}else {vErrors.push(err193);}errors++;}}}else {const err194 = {instancePath:instancePath+"/config/fields",schemaPath:"#/properties/config/properties/fields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err194];}else {vErrors.push(err194);}errors++;}}if(data77.steps !== undefined){let data120 = data77.steps;if(Array.isArray(data120)){if(data120.length < 1){const err195 = {instancePath:instancePath+"/config/steps",schemaPath:"#/properties/config/properties/steps/minItems",keyword:"minItems",params:{limit: 1},message:"must NOT have fewer than 1 items"};if(vErrors === null){vErrors = [err195];}else {vErrors.push(err195);}errors++;}const len15 = data120.length;for(let i17=0; i17<len15; i17++){let data121 = data120[i17];if(data121 && typeof data121 == "object" && !Array.isArray(data121)){if(data121.id === undefined){const err196 = {instancePath:instancePath+"/config/steps/" + i17,schemaPath:"#/properties/config/properties/steps/items/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err196];}else {vErrors.push(err196);}errors++;}if(data121.title === undefined){const err197 = {instancePath:instancePath+"/config/steps/" + i17,schemaPath:"#/properties/config/properties/steps/items/required",keyword:"required",params:{missingProperty: "title"},message:"must have required property '"+"title"+"'"};if(vErrors === null){vErrors = [err197];}else {vErrors.push(err197);}errors++;}if(data121.fields === undefined){const err198 = {instancePath:instancePath+"/config/steps/" + i17,schemaPath:"#/properties/config/properties/steps/items/required",keyword:"required",params:{missingProperty: "fields"},message:"must have required property '"+"fields"+"'"};if(vErrors === null){vErrors = [err198];}else {vErrors.push(err198);}errors++;}for(const key15 in data121){if(!((((key15 === "id") || (key15 === "title")) || (key15 === "description")) || (key15 === "fields"))){const err199 = {instancePath:instancePath+"/config/steps/" + i17,schemaPath:"#/properties/config/properties/steps/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key15},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err199];}else {vErrors.push(err199);}errors++;}}if(data121.id !== undefined){let data122 = data121.id;if(typeof data122 === "string"){if(func6(data122) < 1){const err200 = {instancePath:instancePath+"/config/steps/" + i17+"/id",schemaPath:"#/properties/config/properties/steps/items/properties/id/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err200];}else {vErrors.push(err200);}errors++;}}else {const err201 = {instancePath:instancePath+"/config/steps/" + i17+"/id",schemaPath:"#/properties/config/properties/steps/items/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err201];}else {vErrors.push(err201);}errors++;}}if(data121.title !== undefined){let data123 = data121.title;if(typeof data123 === "string"){if(func6(data123) < 1){const err202 = {instancePath:instancePath+"/config/steps/" + i17+"/title",schemaPath:"#/properties/config/properties/steps/items/properties/title/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err202];}else {vErrors.push(err202);}errors++;}}else {const err203 = {instancePath:instancePath+"/config/steps/" + i17+"/title",schemaPath:"#/properties/config/properties/steps/items/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err203];}else {vErrors.push(err203);}errors++;}}if(data121.description !== undefined){if(typeof data121.description !== "string"){const err204 = {instancePath:instancePath+"/config/steps/" + i17+"/description",schemaPath:"#/properties/config/properties/steps/items/properties/description/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err204];}else {vErrors.push(err204);}errors++;}}if(data121.fields !== undefined){let data125 = data121.fields;if(Array.isArray(data125)){if(data125.length < 1){const err205 = {instancePath:instancePath+"/config/steps/" + i17+"/fields",schemaPath:"#/properties/config/properties/steps/items/properties/fields/minItems",keyword:"minItems",params:{limit: 1},message:"must NOT have fewer than 1 items"};if(vErrors === null){vErrors = [err205];}else {vErrors.push(err205);}errors++;}const len16 = data125.length;for(let i18=0; i18<len16; i18++){let data126 = data125[i18];if(typeof data126 === "string"){if(func6(data126) < 1){const err206 = {instancePath:instancePath+"/config/steps/" + i17+"/fields/" + i18,schemaPath:"#/properties/config/properties/steps/items/properties/fields/items/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err206];}else {vErrors.push(err206);}errors++;}}else {const err207 = {instancePath:instancePath+"/config/steps/" + i17+"/fields/" + i18,schemaPath:"#/properties/config/properties/steps/items/properties/fields/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err207];}else {vErrors.push(err207);}errors++;}}}else {const err208 = {instancePath:instancePath+"/config/steps/" + i17+"/fields",schemaPath:"#/properties/config/properties/steps/items/properties/fields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err208];}else {vErrors.push(err208);}errors++;}}}else {const err209 = {instancePath:instancePath+"/config/steps/" + i17,schemaPath:"#/properties/config/properties/steps/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err209];}else {vErrors.push(err209);}errors++;}}}else {const err210 = {instancePath:instancePath+"/config/steps",schemaPath:"#/properties/config/properties/steps/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err210];}else {vErrors.push(err210);}errors++;}}if(data77.fieldWidgets !== undefined){let data127 = data77.fieldWidgets;if(Array.isArray(data127)){const len17 = data127.length;for(let i19=0; i19<len17; i19++){let data128 = data127[i19];if(data128 && typeof data128 == "object" && !Array.isArray(data128)){if(data128.id === undefined){const err211 = {instancePath:instancePath+"/config/fieldWidgets/" + i19,schemaPath:"#/$defs/fieldWidget/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err211];}else {vErrors.push(err211);}errors++;}if(data128.component === undefined){const err212 = {instancePath:instancePath+"/config/fieldWidgets/" + i19,schemaPath:"#/$defs/fieldWidget/required",keyword:"required",params:{missingProperty: "component"},message:"must have required property '"+"component"+"'"};if(vErrors === null){vErrors = [err212];}else {vErrors.push(err212);}errors++;}for(const key16 in data128){if(!((((key16 === "id") || (key16 === "component")) || (key16 === "props")) || (key16 === "_note"))){const err213 = {instancePath:instancePath+"/config/fieldWidgets/" + i19,schemaPath:"#/$defs/fieldWidget/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key16},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err213];}else {vErrors.push(err213);}errors++;}}if(data128.id !== undefined){let data129 = data128.id;if(typeof data129 === "string"){if(!pattern25.test(data129)){const err214 = {instancePath:instancePath+"/config/fieldWidgets/" + i19+"/id",schemaPath:"#/$defs/fieldWidget/properties/id/pattern",keyword:"pattern",params:{pattern: "^[a-z][a-zA-Z0-9_-]*$"},message:"must match pattern \""+"^[a-z][a-zA-Z0-9_-]*$"+"\""};if(vErrors === null){vErrors = [err214];}else {vErrors.push(err214);}errors++;}}else {const err215 = {instancePath:instancePath+"/config/fieldWidgets/" + i19+"/id",schemaPath:"#/$defs/fieldWidget/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err215];}else {vErrors.push(err215);}errors++;}}if(data128.component !== undefined){let data130 = data128.component;if(typeof data130 === "string"){if(!pattern6.test(data130)){const err216 = {instancePath:instancePath+"/config/fieldWidgets/" + i19+"/component",schemaPath:"#/$defs/fieldWidget/properties/component/pattern",keyword:"pattern",params:{pattern: "^Cn[A-Z]\\w+$"},message:"must match pattern \""+"^Cn[A-Z]\\w+$"+"\""};if(vErrors === null){vErrors = [err216];}else {vErrors.push(err216);}errors++;}}else {const err217 = {instancePath:instancePath+"/config/fieldWidgets/" + i19+"/component",schemaPath:"#/$defs/fieldWidget/properties/component/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err217];}else {vErrors.push(err217);}errors++;}}if(data128.props !== undefined){let data131 = data128.props;if(data131 && typeof data131 == "object" && !Array.isArray(data131));else {const err218 = {instancePath:instancePath+"/config/fieldWidgets/" + i19+"/props",schemaPath:"#/$defs/fieldWidget/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err218];}else {vErrors.push(err218);}errors++;}}if(data128._note !== undefined){if(typeof data128._note !== "string"){const err219 = {instancePath:instancePath+"/config/fieldWidgets/" + i19+"/_note",schemaPath:"#/$defs/fieldWidget/properties/_note/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err219];}else {vErrors.push(err219);}errors++;}}}else {const err220 = {instancePath:instancePath+"/config/fieldWidgets/" + i19,schemaPath:"#/$defs/fieldWidget/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err220];}else {vErrors.push(err220);}errors++;}}}else {const err221 = {instancePath:instancePath+"/config/fieldWidgets",schemaPath:"#/properties/config/properties/fieldWidgets/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err221];}else {vErrors.push(err221);}errors++;}}if(data77.columns !== undefined){let data133 = data77.columns;if(Array.isArray(data133)){const len18 = data133.length;for(let i20=0; i20<len18; i20++){let data134 = data133[i20];const _errs339 = errors;let valid89 = false;let passing2 = null;const _errs340 = errors;if(typeof data134 !== "string"){const err222 = {instancePath:instancePath+"/config/columns/" + i20,schemaPath:"#/properties/config/properties/columns/items/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err222];}else {vErrors.push(err222);}errors++;}var _valid9 = _errs340 === errors;if(_valid9){valid89 = true;passing2 = 0;}const _errs342 = errors;if(data134 && typeof data134 == "object" && !Array.isArray(data134));else {const err223 = {instancePath:instancePath+"/config/columns/" + i20,schemaPath:"#/properties/config/properties/columns/items/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err223];}else {vErrors.push(err223);}errors++;}var _valid9 = _errs342 === errors;if(_valid9 && valid89){valid89 = false;passing2 = [passing2, 1];}else {if(_valid9){valid89 = true;passing2 = 1;}}if(!valid89){const err224 = {instancePath:instancePath+"/config/columns/" + i20,schemaPath:"#/properties/config/properties/columns/items/oneOf",keyword:"oneOf",params:{passingSchemas: passing2},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err224];}else {vErrors.push(err224);}errors++;}else {errors = _errs339;if(vErrors !== null){if(_errs339){vErrors.length = _errs339;}else {vErrors = null;}}}}}else {const err225 = {instancePath:instancePath+"/config/columns",schemaPath:"#/properties/config/properties/columns/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err225];}else {vErrors.push(err225);}errors++;}}if(data77.folderSidebar !== undefined){let data135 = data77.folderSidebar;if(data135 && typeof data135 == "object" && !Array.isArray(data135)){if(data135.folders !== undefined){let data136 = data135.folders;if(Array.isArray(data136)){const len19 = data136.length;for(let i21=0; i21<len19; i21++){if(!(validate44(data136[i21], {instancePath:instancePath+"/config/folderSidebar/folders/" + i21,parentData:data136,parentDataProperty:i21,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate44.errors : vErrors.concat(validate44.errors);errors = vErrors.length;}}}else {const err226 = {instancePath:instancePath+"/config/folderSidebar/folders",schemaPath:"#/properties/config/properties/folderSidebar/properties/folders/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err226];}else {vErrors.push(err226);}errors++;}}}else {const err227 = {instancePath:instancePath+"/config/folderSidebar",schemaPath:"#/properties/config/properties/folderSidebar/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err227];}else {vErrors.push(err227);}errors++;}}if(data77.layout !== undefined){let data138 = data77.layout;if(Array.isArray(data138)){const len20 = data138.length;for(let i22=0; i22<len20; i22++){let data139 = data138[i22];if(data139 && typeof data139 == "object" && !Array.isArray(data139));else {const err228 = {instancePath:instancePath+"/config/layout/" + i22,schemaPath:"#/properties/config/properties/layout/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err228];}else {vErrors.push(err228);}errors++;}}}else {const err229 = {instancePath:instancePath+"/config/layout",schemaPath:"#/properties/config/properties/layout/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err229];}else {vErrors.push(err229);}errors++;}}if(data77.content !== undefined){let data140 = data77.content;if(Array.isArray(data140)){const len21 = data140.length;for(let i23=0; i23<len21; i23++){let data141 = data140[i23];if(data141 && typeof data141 == "object" && !Array.isArray(data141));else {const err230 = {instancePath:instancePath+"/config/content/" + i23,schemaPath:"#/properties/config/properties/content/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err230];}else {vErrors.push(err230);}errors++;}}}else {const err231 = {instancePath:instancePath+"/config/content",schemaPath:"#/properties/config/properties/content/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err231];}else {vErrors.push(err231);}errors++;}}if(data77.widgets !== undefined){let data142 = data77.widgets;if(Array.isArray(data142)){const len22 = data142.length;for(let i24=0; i24<len22; i24++){let data143 = data142[i24];if(data143 && typeof data143 == "object" && !Array.isArray(data143));else {const err232 = {instancePath:instancePath+"/config/widgets/" + i24,schemaPath:"#/properties/config/properties/widgets/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err232];}else {vErrors.push(err232);}errors++;}}}else {const err233 = {instancePath:instancePath+"/config/widgets",schemaPath:"#/properties/config/properties/widgets/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err233];}else {vErrors.push(err233);}errors++;}}if(data77.headerActions !== undefined){let data144 = data77.headerActions;if(Array.isArray(data144)){const len23 = data144.length;for(let i25=0; i25<len23; i25++){if(!(validate33(data144[i25], {instancePath:instancePath+"/config/headerActions/" + i25,parentData:data144,parentDataProperty:i25,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate33.errors : vErrors.concat(validate33.errors);errors = vErrors.length;}}}else {const err234 = {instancePath:instancePath+"/config/headerActions",schemaPath:"#/properties/config/properties/headerActions/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err234];}else {vErrors.push(err234);}errors++;}}if(data77.bulkActions !== undefined){let data146 = data77.bulkActions;if(Array.isArray(data146)){const len24 = data146.length;for(let i26=0; i26<len24; i26++){if(!(validate33(data146[i26], {instancePath:instancePath+"/config/bulkActions/" + i26,parentData:data146,parentDataProperty:i26,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate33.errors : vErrors.concat(validate33.errors);errors = vErrors.length;}}}else {const err235 = {instancePath:instancePath+"/config/bulkActions",schemaPath:"#/properties/config/properties/bulkActions/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err235];}else {vErrors.push(err235);}errors++;}}if(data77.actions !== undefined){let data148 = data77.actions;if(Array.isArray(data148)){const len25 = data148.length;for(let i27=0; i27<len25; i27++){let data149 = data148[i27];if(data149 && typeof data149 == "object" && !Array.isArray(data149)){if(data149.label === undefined){const err236 = {instancePath:instancePath+"/config/actions/" + i27,schemaPath:"#/properties/config/properties/actions/items/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err236];}else {vErrors.push(err236);}errors++;}if(data149.label !== undefined){let data150 = data149.label;if(typeof data150 === "string"){if(func6(data150) < 1){const err237 = {instancePath:instancePath+"/config/actions/" + i27+"/label",schemaPath:"#/properties/config/properties/actions/items/properties/label/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err237];}else {vErrors.push(err237);}errors++;}}else {const err238 = {instancePath:instancePath+"/config/actions/" + i27+"/label",schemaPath:"#/properties/config/properties/actions/items/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err238];}else {vErrors.push(err238);}errors++;}}}else {const err239 = {instancePath:instancePath+"/config/actions/" + i27,schemaPath:"#/properties/config/properties/actions/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err239];}else {vErrors.push(err239);}errors++;}}}else {const err240 = {instancePath:instancePath+"/config/actions",schemaPath:"#/properties/config/properties/actions/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err240];}else {vErrors.push(err240);}errors++;}}if(data77.rowIndicators !== undefined){let data151 = data77.rowIndicators;if(Array.isArray(data151)){const len26 = data151.length;for(let i28=0; i28<len26; i28++){let data152 = data151[i28];if(data152 && typeof data152 == "object" && !Array.isArray(data152)){if(data152.field === undefined){const err241 = {instancePath:instancePath+"/config/rowIndicators/" + i28,schemaPath:"#/$defs/rowIndicator/required",keyword:"required",params:{missingProperty: "field"},message:"must have required property '"+"field"+"'"};if(vErrors === null){vErrors = [err241];}else {vErrors.push(err241);}errors++;}if(data152.text === undefined){const err242 = {instancePath:instancePath+"/config/rowIndicators/" + i28,schemaPath:"#/$defs/rowIndicator/required",keyword:"required",params:{missingProperty: "text"},message:"must have required property '"+"text"+"'"};if(vErrors === null){vErrors = [err242];}else {vErrors.push(err242);}errors++;}for(const key17 in data152){if(!(((((((key17 === "id") || (key17 === "field")) || (key17 === "equals")) || (key17 === "in")) || (key17 === "icon")) || (key17 === "text")) || (key17 === "tooltip"))){const err243 = {instancePath:instancePath+"/config/rowIndicators/" + i28,schemaPath:"#/$defs/rowIndicator/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key17},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err243];}else {vErrors.push(err243);}errors++;}}if(data152.id !== undefined){let data153 = data152.id;if(typeof data153 === "string"){if(func6(data153) < 1){const err244 = {instancePath:instancePath+"/config/rowIndicators/" + i28+"/id",schemaPath:"#/$defs/rowIndicator/properties/id/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err244];}else {vErrors.push(err244);}errors++;}}else {const err245 = {instancePath:instancePath+"/config/rowIndicators/" + i28+"/id",schemaPath:"#/$defs/rowIndicator/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err245];}else {vErrors.push(err245);}errors++;}}if(data152.field !== undefined){let data154 = data152.field;if(typeof data154 === "string"){if(func6(data154) < 1){const err246 = {instancePath:instancePath+"/config/rowIndicators/" + i28+"/field",schemaPath:"#/$defs/rowIndicator/properties/field/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err246];}else {vErrors.push(err246);}errors++;}}else {const err247 = {instancePath:instancePath+"/config/rowIndicators/" + i28+"/field",schemaPath:"#/$defs/rowIndicator/properties/field/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err247];}else {vErrors.push(err247);}errors++;}}if(data152.in !== undefined){if(!(Array.isArray(data152.in))){const err248 = {instancePath:instancePath+"/config/rowIndicators/" + i28+"/in",schemaPath:"#/$defs/rowIndicator/properties/in/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err248];}else {vErrors.push(err248);}errors++;}}if(data152.icon !== undefined){if(typeof data152.icon !== "string"){const err249 = {instancePath:instancePath+"/config/rowIndicators/" + i28+"/icon",schemaPath:"#/$defs/rowIndicator/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err249];}else {vErrors.push(err249);}errors++;}}if(data152.text !== undefined){let data157 = data152.text;if(typeof data157 === "string"){if(func6(data157) < 1){const err250 = {instancePath:instancePath+"/config/rowIndicators/" + i28+"/text",schemaPath:"#/$defs/rowIndicator/properties/text/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err250];}else {vErrors.push(err250);}errors++;}}else {const err251 = {instancePath:instancePath+"/config/rowIndicators/" + i28+"/text",schemaPath:"#/$defs/rowIndicator/properties/text/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err251];}else {vErrors.push(err251);}errors++;}}if(data152.tooltip !== undefined){if(typeof data152.tooltip !== "string"){const err252 = {instancePath:instancePath+"/config/rowIndicators/" + i28+"/tooltip",schemaPath:"#/$defs/rowIndicator/properties/tooltip/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err252];}else {vErrors.push(err252);}errors++;}}}else {const err253 = {instancePath:instancePath+"/config/rowIndicators/" + i28,schemaPath:"#/$defs/rowIndicator/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err253];}else {vErrors.push(err253);}errors++;}}}else {const err254 = {instancePath:instancePath+"/config/rowIndicators",schemaPath:"#/properties/config/properties/rowIndicators/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err254];}else {vErrors.push(err254);}errors++;}}let data159 = data77.rowIndicatorCap;if(!((typeof data159 == "number") && (!(data159 % 1) && !isNaN(data159)))){const err255 = {instancePath:instancePath+"/config/rowIndicatorCap",schemaPath:"#/properties/config/properties/rowIndicatorCap/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err255];}else {vErrors.push(err255);}errors++;}if(typeof data159 == "number"){if(data159 < 0 || isNaN(data159)){const err256 = {instancePath:instancePath+"/config/rowIndicatorCap",schemaPath:"#/properties/config/properties/rowIndicatorCap/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err256];}else {vErrors.push(err256);}errors++;}}if(data77.quickEditFields !== undefined){let data160 = data77.quickEditFields;if(Array.isArray(data160)){const len27 = data160.length;for(let i29=0; i29<len27; i29++){let data161 = data160[i29];if(typeof data161 === "string"){if(func6(data161) < 1){const err257 = {instancePath:instancePath+"/config/quickEditFields/" + i29,schemaPath:"#/properties/config/properties/quickEditFields/items/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err257];}else {vErrors.push(err257);}errors++;}}else {const err258 = {instancePath:instancePath+"/config/quickEditFields/" + i29,schemaPath:"#/properties/config/properties/quickEditFields/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err258];}else {vErrors.push(err258);}errors++;}}}else {const err259 = {instancePath:instancePath+"/config/quickEditFields",schemaPath:"#/properties/config/properties/quickEditFields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err259];}else {vErrors.push(err259);}errors++;}}if(typeof data77.writableField !== "string"){const err260 = {instancePath:instancePath+"/config/writableField",schemaPath:"#/properties/config/properties/writableField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err260];}else {vErrors.push(err260);}errors++;}if(data77.viewTabs !== undefined){let data163 = data77.viewTabs;if(Array.isArray(data163)){const len28 = data163.length;for(let i30=0; i30<len28; i30++){let data164 = data163[i30];if(typeof data164 === "string"){if(func6(data164) < 1){const err261 = {instancePath:instancePath+"/config/viewTabs/" + i30,schemaPath:"#/properties/config/properties/viewTabs/items/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err261];}else {vErrors.push(err261);}errors++;}}else {const err262 = {instancePath:instancePath+"/config/viewTabs/" + i30,schemaPath:"#/properties/config/properties/viewTabs/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err262];}else {vErrors.push(err262);}errors++;}}}else {const err263 = {instancePath:instancePath+"/config/viewTabs",schemaPath:"#/properties/config/properties/viewTabs/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err263];}else {vErrors.push(err263);}errors++;}}if(data77.priorityField !== undefined){if(typeof data77.priorityField !== "string"){const err264 = {instancePath:instancePath+"/config/priorityField",schemaPath:"#/properties/config/properties/priorityField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err264];}else {vErrors.push(err264);}errors++;}}if(data77.priorityLevels !== undefined){let data166 = data77.priorityLevels;if(Array.isArray(data166)){const len29 = data166.length;for(let i31=0; i31<len29; i31++){let data167 = data166[i31];if(typeof data167 === "string"){if(func6(data167) < 1){const err265 = {instancePath:instancePath+"/config/priorityLevels/" + i31,schemaPath:"#/properties/config/properties/priorityLevels/items/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err265];}else {vErrors.push(err265);}errors++;}}else {const err266 = {instancePath:instancePath+"/config/priorityLevels/" + i31,schemaPath:"#/properties/config/properties/priorityLevels/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err266];}else {vErrors.push(err266);}errors++;}}}else {const err267 = {instancePath:instancePath+"/config/priorityLevels",schemaPath:"#/properties/config/properties/priorityLevels/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err267];}else {vErrors.push(err267);}errors++;}}if(typeof data77.listShortcuts !== "boolean"){const err268 = {instancePath:instancePath+"/config/listShortcuts",schemaPath:"#/properties/config/properties/listShortcuts/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err268];}else {vErrors.push(err268);}errors++;}if(data77.rowActionField !== undefined){if(typeof data77.rowActionField !== "string"){const err269 = {instancePath:instancePath+"/config/rowActionField",schemaPath:"#/properties/config/properties/rowActionField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err269];}else {vErrors.push(err269);}errors++;}}if(data77.editOpensDetail !== undefined){if(typeof data77.editOpensDetail !== "boolean"){const err270 = {instancePath:instancePath+"/config/editOpensDetail",schemaPath:"#/properties/config/properties/editOpensDetail/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err270];}else {vErrors.push(err270);}errors++;}}if(data77.showEditAction !== undefined){if(typeof data77.showEditAction !== "boolean"){const err271 = {instancePath:instancePath+"/config/showEditAction",schemaPath:"#/properties/config/properties/showEditAction/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err271];}else {vErrors.push(err271);}errors++;}}let data172 = data77.formSize;if(typeof data172 !== "string"){const err272 = {instancePath:instancePath+"/config/formSize",schemaPath:"#/properties/config/properties/formSize/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err272];}else {vErrors.push(err272);}errors++;}if(!(((data172 === "small") || (data172 === "normal")) || (data172 === "large"))){const err273 = {instancePath:instancePath+"/config/formSize",schemaPath:"#/properties/config/properties/formSize/enum",keyword:"enum",params:{allowedValues: schema44.properties.config.properties.formSize.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err273];}else {vErrors.push(err273);}errors++;}let data173 = data77.formColumns;if(!((typeof data173 == "number") && (!(data173 % 1) && !isNaN(data173)))){const err274 = {instancePath:instancePath+"/config/formColumns",schemaPath:"#/properties/config/properties/formColumns/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err274];}else {vErrors.push(err274);}errors++;}if(!((data173 === 1) || (data173 === 2))){const err275 = {instancePath:instancePath+"/config/formColumns",schemaPath:"#/properties/config/properties/formColumns/enum",keyword:"enum",params:{allowedValues: schema44.properties.config.properties.formColumns.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err275];}else {vErrors.push(err275);}errors++;}if(data77.excludeFields !== undefined){let data174 = data77.excludeFields;if(Array.isArray(data174)){const len30 = data174.length;for(let i32=0; i32<len30; i32++){if(typeof data174[i32] !== "string"){const err276 = {instancePath:instancePath+"/config/excludeFields/" + i32,schemaPath:"#/properties/config/properties/excludeFields/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err276];}else {vErrors.push(err276);}errors++;}}}else {const err277 = {instancePath:instancePath+"/config/excludeFields",schemaPath:"#/properties/config/properties/excludeFields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err277];}else {vErrors.push(err277);}errors++;}}if(data77.includeFields !== undefined){let data176 = data77.includeFields;if(Array.isArray(data176)){const len31 = data176.length;for(let i33=0; i33<len31; i33++){if(typeof data176[i33] !== "string"){const err278 = {instancePath:instancePath+"/config/includeFields/" + i33,schemaPath:"#/properties/config/properties/includeFields/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err278];}else {vErrors.push(err278);}errors++;}}}else {const err279 = {instancePath:instancePath+"/config/includeFields",schemaPath:"#/properties/config/properties/includeFields/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err279];}else {vErrors.push(err279);}errors++;}}if(data77.fieldOverrides !== undefined){let data178 = data77.fieldOverrides;if(data178 && typeof data178 == "object" && !Array.isArray(data178));else {const err280 = {instancePath:instancePath+"/config/fieldOverrides",schemaPath:"#/properties/config/properties/fieldOverrides/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err280];}else {vErrors.push(err280);}errors++;}}if(data77.createDefaults !== undefined){let data179 = data77.createDefaults;if(data179 && typeof data179 == "object" && !Array.isArray(data179));else {const err281 = {instancePath:instancePath+"/config/createDefaults",schemaPath:"#/properties/config/properties/createDefaults/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err281];}else {vErrors.push(err281);}errors++;}}if(data77.createSuccessRoute !== undefined){let data180 = data77.createSuccessRoute;const _errs442 = errors;let valid120 = false;let passing3 = null;const _errs443 = errors;if(typeof data180 !== "string"){const err282 = {instancePath:instancePath+"/config/createSuccessRoute",schemaPath:"#/properties/config/properties/createSuccessRoute/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err282];}else {vErrors.push(err282);}errors++;}var _valid10 = _errs443 === errors;if(_valid10){valid120 = true;passing3 = 0;}const _errs445 = errors;if(data180 && typeof data180 == "object" && !Array.isArray(data180)){if(data180.name === undefined){const err283 = {instancePath:instancePath+"/config/createSuccessRoute",schemaPath:"#/properties/config/properties/createSuccessRoute/oneOf/1/required",keyword:"required",params:{missingProperty: "name"},message:"must have required property '"+"name"+"'"};if(vErrors === null){vErrors = [err283];}else {vErrors.push(err283);}errors++;}for(const key18 in data180){if(!(((key18 === "name") || (key18 === "paramField")) || (key18 === "objectParam"))){const err284 = {instancePath:instancePath+"/config/createSuccessRoute",schemaPath:"#/properties/config/properties/createSuccessRoute/oneOf/1/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key18},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err284];}else {vErrors.push(err284);}errors++;}}if(data180.name !== undefined){if(typeof data180.name !== "string"){const err285 = {instancePath:instancePath+"/config/createSuccessRoute/name",schemaPath:"#/properties/config/properties/createSuccessRoute/oneOf/1/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err285];}else {vErrors.push(err285);}errors++;}}if(data180.paramField !== undefined){if(typeof data180.paramField !== "string"){const err286 = {instancePath:instancePath+"/config/createSuccessRoute/paramField",schemaPath:"#/properties/config/properties/createSuccessRoute/oneOf/1/properties/paramField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err286];}else {vErrors.push(err286);}errors++;}}if(data180.objectParam !== undefined){if(typeof data180.objectParam !== "string"){const err287 = {instancePath:instancePath+"/config/createSuccessRoute/objectParam",schemaPath:"#/properties/config/properties/createSuccessRoute/oneOf/1/properties/objectParam/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err287];}else {vErrors.push(err287);}errors++;}}}else {const err288 = {instancePath:instancePath+"/config/createSuccessRoute",schemaPath:"#/properties/config/properties/createSuccessRoute/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err288];}else {vErrors.push(err288);}errors++;}var _valid10 = _errs445 === errors;if(_valid10 && valid120){valid120 = false;passing3 = [passing3, 1];}else {if(_valid10){valid120 = true;passing3 = 1;}}if(!valid120){const err289 = {instancePath:instancePath+"/config/createSuccessRoute",schemaPath:"#/properties/config/properties/createSuccessRoute/oneOf",keyword:"oneOf",params:{passingSchemas: passing3},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err289];}else {vErrors.push(err289);}errors++;}else {errors = _errs442;if(vErrors !== null){if(_errs442){vErrors.length = _errs442;}else {vErrors = null;}}}}if(data77.createSuccessMessage !== undefined){if(typeof data77.createSuccessMessage !== "string"){const err290 = {instancePath:instancePath+"/config/createSuccessMessage",schemaPath:"#/properties/config/properties/createSuccessMessage/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err290];}else {vErrors.push(err290);}errors++;}}if(data77.savedViewsScope !== undefined){if(typeof data77.savedViewsScope !== "string"){const err291 = {instancePath:instancePath+"/config/savedViewsScope",schemaPath:"#/properties/config/properties/savedViewsScope/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err291];}else {vErrors.push(err291);}errors++;}}if(typeof data77.splitCloseButton !== "boolean"){const err292 = {instancePath:instancePath+"/config/splitCloseButton",schemaPath:"#/properties/config/properties/splitCloseButton/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err292];}else {vErrors.push(err292);}errors++;}if(data77.splitCloseLabel !== undefined){if(typeof data77.splitCloseLabel !== "string"){const err293 = {instancePath:instancePath+"/config/splitCloseLabel",schemaPath:"#/properties/config/properties/splitCloseLabel/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err293];}else {vErrors.push(err293);}errors++;}}if(data77.mapConfig !== undefined){let data188 = data77.mapConfig;if(data188 && typeof data188 == "object" && !Array.isArray(data188)){if(data188.clustering === undefined){data188.clustering = true;}if(data188.latField !== undefined){if(typeof data188.latField !== "string"){const err294 = {instancePath:instancePath+"/config/mapConfig/latField",schemaPath:"#/properties/config/properties/mapConfig/properties/latField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err294];}else {vErrors.push(err294);}errors++;}}if(data188.lngField !== undefined){if(typeof data188.lngField !== "string"){const err295 = {instancePath:instancePath+"/config/mapConfig/lngField",schemaPath:"#/properties/config/properties/mapConfig/properties/lngField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err295];}else {vErrors.push(err295);}errors++;}}if(data188.geoField !== undefined){if(typeof data188.geoField !== "string"){const err296 = {instancePath:instancePath+"/config/mapConfig/geoField",schemaPath:"#/properties/config/properties/mapConfig/properties/geoField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err296];}else {vErrors.push(err296);}errors++;}}if(data188.popupField !== undefined){if(typeof data188.popupField !== "string"){const err297 = {instancePath:instancePath+"/config/mapConfig/popupField",schemaPath:"#/properties/config/properties/mapConfig/properties/popupField/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err297];}else {vErrors.push(err297);}errors++;}}if(data188.center !== undefined){let data193 = data188.center;if(Array.isArray(data193)){if(data193.length > 2){const err298 = {instancePath:instancePath+"/config/mapConfig/center",schemaPath:"#/properties/config/properties/mapConfig/properties/center/maxItems",keyword:"maxItems",params:{limit: 2},message:"must NOT have more than 2 items"};if(vErrors === null){vErrors = [err298];}else {vErrors.push(err298);}errors++;}if(data193.length < 2){const err299 = {instancePath:instancePath+"/config/mapConfig/center",schemaPath:"#/properties/config/properties/mapConfig/properties/center/minItems",keyword:"minItems",params:{limit: 2},message:"must NOT have fewer than 2 items"};if(vErrors === null){vErrors = [err299];}else {vErrors.push(err299);}errors++;}const len32 = data193.length;for(let i34=0; i34<len32; i34++){if(!(typeof data193[i34] == "number")){const err300 = {instancePath:instancePath+"/config/mapConfig/center/" + i34,schemaPath:"#/properties/config/properties/mapConfig/properties/center/items/type",keyword:"type",params:{type: "number"},message:"must be number"};if(vErrors === null){vErrors = [err300];}else {vErrors.push(err300);}errors++;}}}else {const err301 = {instancePath:instancePath+"/config/mapConfig/center",schemaPath:"#/properties/config/properties/mapConfig/properties/center/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err301];}else {vErrors.push(err301);}errors++;}}if(typeof data188.clustering !== "boolean"){const err302 = {instancePath:instancePath+"/config/mapConfig/clustering",schemaPath:"#/properties/config/properties/mapConfig/properties/clustering/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err302];}else {vErrors.push(err302);}errors++;}}else {const err303 = {instancePath:instancePath+"/config/mapConfig",schemaPath:"#/properties/config/properties/mapConfig/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err303];}else {vErrors.push(err303);}errors++;}}let data196 = data77.quickFilterMaxVisible;if(!((typeof data196 == "number") && (!(data196 % 1) && !isNaN(data196)))){const err304 = {instancePath:instancePath+"/config/quickFilterMaxVisible",schemaPath:"#/properties/config/properties/quickFilterMaxVisible/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err304];}else {vErrors.push(err304);}errors++;}if(typeof data196 == "number"){if(data196 < 0 || isNaN(data196)){const err305 = {instancePath:instancePath+"/config/quickFilterMaxVisible",schemaPath:"#/properties/config/properties/quickFilterMaxVisible/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err305];}else {vErrors.push(err305);}errors++;}}if(data77.actionToggles !== undefined){let data197 = data77.actionToggles;if(data197 && typeof data197 == "object" && !Array.isArray(data197)){if(data197.showAdd !== undefined){if(typeof data197.showAdd !== "boolean"){const err306 = {instancePath:instancePath+"/config/actionToggles/showAdd",schemaPath:"#/properties/config/properties/actionToggles/properties/showAdd/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err306];}else {vErrors.push(err306);}errors++;}}if(data197.showFormDialog !== undefined){if(typeof data197.showFormDialog !== "boolean"){const err307 = {instancePath:instancePath+"/config/actionToggles/showFormDialog",schemaPath:"#/properties/config/properties/actionToggles/properties/showFormDialog/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err307];}else {vErrors.push(err307);}errors++;}}if(data197.showEditAction !== undefined){if(typeof data197.showEditAction !== "boolean"){const err308 = {instancePath:instancePath+"/config/actionToggles/showEditAction",schemaPath:"#/properties/config/properties/actionToggles/properties/showEditAction/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err308];}else {vErrors.push(err308);}errors++;}}if(data197.showCopyAction !== undefined){if(typeof data197.showCopyAction !== "boolean"){const err309 = {instancePath:instancePath+"/config/actionToggles/showCopyAction",schemaPath:"#/properties/config/properties/actionToggles/properties/showCopyAction/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err309];}else {vErrors.push(err309);}errors++;}}if(data197.showDeleteAction !== undefined){if(typeof data197.showDeleteAction !== "boolean"){const err310 = {instancePath:instancePath+"/config/actionToggles/showDeleteAction",schemaPath:"#/properties/config/properties/actionToggles/properties/showDeleteAction/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err310];}else {vErrors.push(err310);}errors++;}}if(data197.showMassImport !== undefined){if(typeof data197.showMassImport !== "boolean"){const err311 = {instancePath:instancePath+"/config/actionToggles/showMassImport",schemaPath:"#/properties/config/properties/actionToggles/properties/showMassImport/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err311];}else {vErrors.push(err311);}errors++;}}if(data197.showMassExport !== undefined){if(typeof data197.showMassExport !== "boolean"){const err312 = {instancePath:instancePath+"/config/actionToggles/showMassExport",schemaPath:"#/properties/config/properties/actionToggles/properties/showMassExport/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err312];}else {vErrors.push(err312);}errors++;}}if(data197.showMassCopy !== undefined){if(typeof data197.showMassCopy !== "boolean"){const err313 = {instancePath:instancePath+"/config/actionToggles/showMassCopy",schemaPath:"#/properties/config/properties/actionToggles/properties/showMassCopy/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err313];}else {vErrors.push(err313);}errors++;}}if(data197.showMassDelete !== undefined){if(typeof data197.showMassDelete !== "boolean"){const err314 = {instancePath:instancePath+"/config/actionToggles/showMassDelete",schemaPath:"#/properties/config/properties/actionToggles/properties/showMassDelete/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err314];}else {vErrors.push(err314);}errors++;}}if(data197.showViewToggle !== undefined){if(typeof data197.showViewToggle !== "boolean"){const err315 = {instancePath:instancePath+"/config/actionToggles/showViewToggle",schemaPath:"#/properties/config/properties/actionToggles/properties/showViewToggle/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err315];}else {vErrors.push(err315);}errors++;}}if(data197.selectable !== undefined){if(typeof data197.selectable !== "boolean"){const err316 = {instancePath:instancePath+"/config/actionToggles/selectable",schemaPath:"#/properties/config/properties/actionToggles/properties/selectable/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err316];}else {vErrors.push(err316);}errors++;}}}else {const err317 = {instancePath:instancePath+"/config/actionToggles",schemaPath:"#/properties/config/properties/actionToggles/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err317];}else {vErrors.push(err317);}errors++;}}if(data77.mode !== undefined){let data209 = data77.mode;if(typeof data209 !== "string"){const err318 = {instancePath:instancePath+"/config/mode",schemaPath:"#/properties/config/properties/mode/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err318];}else {vErrors.push(err318);}errors++;}if(!(((data209 === "edit") || (data209 === "create")) || (data209 === "public"))){const err319 = {instancePath:instancePath+"/config/mode",schemaPath:"#/properties/config/properties/mode/enum",keyword:"enum",params:{allowedValues: schema44.properties.config.properties.mode.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err319];}else {vErrors.push(err319);}errors++;}}if(typeof data77.subscribe !== "boolean"){const err320 = {instancePath:instancePath+"/config/subscribe",schemaPath:"#/properties/config/properties/subscribe/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err320];}else {vErrors.push(err320);}errors++;}if(typeof data77.lock !== "boolean"){const err321 = {instancePath:instancePath+"/config/lock",schemaPath:"#/properties/config/properties/lock/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err321];}else {vErrors.push(err321);}errors++;}}else {const err322 = {instancePath:instancePath+"/config",schemaPath:"#/properties/config/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err322];}else {vErrors.push(err322);}errors++;}}if(data.sidebar !== undefined){let data212 = data.sidebar;if(data212 && typeof data212 == "object" && !Array.isArray(data212)){if(data212.show !== undefined){if(typeof data212.show !== "boolean"){const err323 = {instancePath:instancePath+"/sidebar/show",schemaPath:"#/properties/sidebar/properties/show/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err323];}else {vErrors.push(err323);}errors++;}}}else {const err324 = {instancePath:instancePath+"/sidebar",schemaPath:"#/properties/sidebar/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err324];}else {vErrors.push(err324);}errors++;}}if(data._note !== undefined){if(typeof data._note !== "string"){const err325 = {instancePath:instancePath+"/_note",schemaPath:"#/properties/_note/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err325];}else {vErrors.push(err325);}errors++;}}}else {const err326 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err326];}else {vErrors.push(err326);}errors++;}validate25.errors = vErrors;return errors === 0;}validate25.evaluated = {"props":true,"dynamicProps":false,"dynamicItems":false};function validate20(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){let vErrors = null;let errors = 0;const evaluated0 = validate20.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}const _errs3 = errors;let valid1 = true;const _errs4 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.pages === undefined) && ("pages")){const err0 = {};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}}var _valid0 = _errs4 === errors;errors = _errs3;if(vErrors !== null){if(_errs3){vErrors.length = _errs3;}else {vErrors = null;}}if(_valid0){const _errs5 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.menu === undefined){const err1 = {instancePath,schemaPath:"#/allOf/0/then/required",keyword:"required",params:{missingProperty: "menu"},message:"must have required property '"+"menu"+"'"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}}var _valid0 = _errs5 === errors;valid1 = _valid0;}if(!valid1){const err2 = {instancePath,schemaPath:"#/allOf/0/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}const _errs8 = errors;let valid2 = true;const _errs9 = errors;const _errs10 = errors;const _errs11 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if((data.pages === undefined) && ("pages")){const err3 = {};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}}var valid3 = _errs11 === errors;if(valid3){const err4 = {};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}else {errors = _errs10;if(vErrors !== null){if(_errs10){vErrors.length = _errs10;}else {vErrors = null;}}}var _valid1 = _errs9 === errors;errors = _errs8;if(vErrors !== null){if(_errs8){vErrors.length = _errs8;}else {vErrors = null;}}if(_valid1){const _errs12 = errors;if(data && typeof data == "object" && !Array.isArray(data)){if(data.observability === undefined){const err5 = {instancePath,schemaPath:"#/allOf/1/then/required",keyword:"required",params:{missingProperty: "observability"},message:"must have required property '"+"observability"+"'"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}var _valid1 = _errs12 === errors;valid2 = _valid1;}if(!valid2){const err6 = {instancePath,schemaPath:"#/allOf/1/if",keyword:"if",params:{failingKeyword: "then"},message:"must match \"then\" schema"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}if(data && typeof data == "object" && !Array.isArray(data)){if(data.openbuildEditable === undefined){data.openbuildEditable = true;}if(data.dependencies === undefined){data.dependencies = [];}if(data.$schema === undefined){const err7 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "$schema"},message:"must have required property '"+"$schema"+"'"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}if(data.version === undefined){const err8 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "version"},message:"must have required property '"+"version"+"'"};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}for(const key0 in data){if(!(func1.call(schema31.properties, key0))){const err9 = {instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}}if(data.$schema !== undefined){let data0 = data.$schema;if(typeof data0 === "string"){if(!(formats0(data0))){const err10 = {instancePath:instancePath+"/$schema",schemaPath:"#/properties/%24schema/format",keyword:"format",params:{format: "uri"},message:"must match format \""+"uri"+"\""};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}}else {const err11 = {instancePath:instancePath+"/$schema",schemaPath:"#/properties/%24schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;}}if(data.version !== undefined){let data1 = data.version;if(typeof data1 === "string"){if(!pattern4.test(data1)){const err12 = {instancePath:instancePath+"/version",schemaPath:"#/properties/version/pattern",keyword:"pattern",params:{pattern: "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$"},message:"must match pattern \""+"^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$"+"\""};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}}else {const err13 = {instancePath:instancePath+"/version",schemaPath:"#/properties/version/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}}if(typeof data.openbuildEditable !== "boolean"){const err14 = {instancePath:instancePath+"/openbuildEditable",schemaPath:"#/properties/openbuildEditable/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;}let data3 = data.dependencies;if(Array.isArray(data3)){const len0 = data3.length;for(let i0=0; i0<len0; i0++){let data4 = data3[i0];const _errs23 = errors;let valid7 = false;let passing0 = null;const _errs24 = errors;if(typeof data4 !== "string"){const err15 = {instancePath:instancePath+"/dependencies/" + i0,schemaPath:"#/properties/dependencies/items/oneOf/0/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err15];}else {vErrors.push(err15);}errors++;}var _valid2 = _errs24 === errors;if(_valid2){valid7 = true;passing0 = 0;}const _errs26 = errors;if(data4 && typeof data4 == "object" && !Array.isArray(data4)){if(data4.id === undefined){const err16 = {instancePath:instancePath+"/dependencies/" + i0,schemaPath:"#/properties/dependencies/items/oneOf/1/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err16];}else {vErrors.push(err16);}errors++;}for(const key1 in data4){if(!(((key1 === "id") || (key1 === "required")) || (key1 === "name"))){const err17 = {instancePath:instancePath+"/dependencies/" + i0,schemaPath:"#/properties/dependencies/items/oneOf/1/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key1},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err17];}else {vErrors.push(err17);}errors++;}}if(data4.id !== undefined){if(typeof data4.id !== "string"){const err18 = {instancePath:instancePath+"/dependencies/" + i0+"/id",schemaPath:"#/properties/dependencies/items/oneOf/1/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err18];}else {vErrors.push(err18);}errors++;}}if(data4.required !== undefined){if(typeof data4.required !== "boolean"){const err19 = {instancePath:instancePath+"/dependencies/" + i0+"/required",schemaPath:"#/properties/dependencies/items/oneOf/1/properties/required/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err19];}else {vErrors.push(err19);}errors++;}}if(data4.name !== undefined){if(typeof data4.name !== "string"){const err20 = {instancePath:instancePath+"/dependencies/" + i0+"/name",schemaPath:"#/properties/dependencies/items/oneOf/1/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err20];}else {vErrors.push(err20);}errors++;}}}else {const err21 = {instancePath:instancePath+"/dependencies/" + i0,schemaPath:"#/properties/dependencies/items/oneOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err21];}else {vErrors.push(err21);}errors++;}var _valid2 = _errs26 === errors;if(_valid2 && valid7){valid7 = false;passing0 = [passing0, 1];}else {if(_valid2){valid7 = true;passing0 = 1;}}if(!valid7){const err22 = {instancePath:instancePath+"/dependencies/" + i0,schemaPath:"#/properties/dependencies/items/oneOf",keyword:"oneOf",params:{passingSchemas: passing0},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err22];}else {vErrors.push(err22);}errors++;}else {errors = _errs23;if(vErrors !== null){if(_errs23){vErrors.length = _errs23;}else {vErrors = null;}}}}}else {const err23 = {instancePath:instancePath+"/dependencies",schemaPath:"#/properties/dependencies/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err23];}else {vErrors.push(err23);}errors++;}if(data.setup !== undefined){let data8 = data.setup;if(data8 && typeof data8 == "object" && !Array.isArray(data8)){if(data8.enabled === undefined){data8.enabled = true;}if(data8.version === undefined){data8.version = 1;}if(data8.steps === undefined){const err24 = {instancePath:instancePath+"/setup",schemaPath:"#/properties/setup/required",keyword:"required",params:{missingProperty: "steps"},message:"must have required property '"+"steps"+"'"};if(vErrors === null){vErrors = [err24];}else {vErrors.push(err24);}errors++;}for(const key2 in data8){if(!((((key2 === "enabled") || (key2 === "version")) || (key2 === "completionConfigKey")) || (key2 === "steps"))){const err25 = {instancePath:instancePath+"/setup",schemaPath:"#/properties/setup/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key2},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err25];}else {vErrors.push(err25);}errors++;}}if(typeof data8.enabled !== "boolean"){const err26 = {instancePath:instancePath+"/setup/enabled",schemaPath:"#/properties/setup/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err26];}else {vErrors.push(err26);}errors++;}let data10 = data8.version;if(!((typeof data10 == "number") && (!(data10 % 1) && !isNaN(data10)))){const err27 = {instancePath:instancePath+"/setup/version",schemaPath:"#/properties/setup/properties/version/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err27];}else {vErrors.push(err27);}errors++;}if(data8.completionConfigKey !== undefined){if(typeof data8.completionConfigKey !== "string"){const err28 = {instancePath:instancePath+"/setup/completionConfigKey",schemaPath:"#/properties/setup/properties/completionConfigKey/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err28];}else {vErrors.push(err28);}errors++;}}if(data8.steps !== undefined){let data12 = data8.steps;if(Array.isArray(data12)){const len1 = data12.length;for(let i1=0; i1<len1; i1++){let data13 = data12[i1];if(data13 && typeof data13 == "object" && !Array.isArray(data13)){if(data13.required === undefined){data13.required = false;}if(data13.display === undefined){data13.display = "select";}if(data13.multiple === undefined){data13.multiple = false;}if(data13.onDemand === undefined){data13.onDemand = false;}if(data13.healthCheck === undefined){data13.healthCheck = false;}if(data13.id === undefined){const err29 = {instancePath:instancePath+"/setup/steps/" + i1,schemaPath:"#/properties/setup/properties/steps/items/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err29];}else {vErrors.push(err29);}errors++;}if(data13.type === undefined){const err30 = {instancePath:instancePath+"/setup/steps/" + i1,schemaPath:"#/properties/setup/properties/steps/items/required",keyword:"required",params:{missingProperty: "type"},message:"must have required property '"+"type"+"'"};if(vErrors === null){vErrors = [err30];}else {vErrors.push(err30);}errors++;}for(const key3 in data13){if(!(func1.call(schema31.properties.setup.properties.steps.items.properties, key3))){const err31 = {instancePath:instancePath+"/setup/steps/" + i1,schemaPath:"#/properties/setup/properties/steps/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key3},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err31];}else {vErrors.push(err31);}errors++;}}if(data13.id !== undefined){if(typeof data13.id !== "string"){const err32 = {instancePath:instancePath+"/setup/steps/" + i1+"/id",schemaPath:"#/properties/setup/properties/steps/items/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err32];}else {vErrors.push(err32);}errors++;}}if(data13.type !== undefined){let data15 = data13.type;if(typeof data15 !== "string"){const err33 = {instancePath:instancePath+"/setup/steps/" + i1+"/type",schemaPath:"#/properties/setup/properties/steps/items/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err33];}else {vErrors.push(err33);}errors++;}if(!((((((data15 === "info") || (data15 === "config-fields")) || (data15 === "choice")) || (data15 === "run-action")) || (data15 === "summary")) || (data15 === "component"))){const err34 = {instancePath:instancePath+"/setup/steps/" + i1+"/type",schemaPath:"#/properties/setup/properties/steps/items/properties/type/enum",keyword:"enum",params:{allowedValues: schema31.properties.setup.properties.steps.items.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err34];}else {vErrors.push(err34);}errors++;}}if(data13.title !== undefined){if(typeof data13.title !== "string"){const err35 = {instancePath:instancePath+"/setup/steps/" + i1+"/title",schemaPath:"#/properties/setup/properties/steps/items/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err35];}else {vErrors.push(err35);}errors++;}}if(data13.body !== undefined){if(typeof data13.body !== "string"){const err36 = {instancePath:instancePath+"/setup/steps/" + i1+"/body",schemaPath:"#/properties/setup/properties/steps/items/properties/body/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err36];}else {vErrors.push(err36);}errors++;}}if(typeof data13.required !== "boolean"){const err37 = {instancePath:instancePath+"/setup/steps/" + i1+"/required",schemaPath:"#/properties/setup/properties/steps/items/properties/required/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err37];}else {vErrors.push(err37);}errors++;}if(data13.configKey !== undefined){if(typeof data13.configKey !== "string"){const err38 = {instancePath:instancePath+"/setup/steps/" + i1+"/configKey",schemaPath:"#/properties/setup/properties/steps/items/properties/configKey/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err38];}else {vErrors.push(err38);}errors++;}}if(data13.configKeys !== undefined){let data20 = data13.configKeys;if(Array.isArray(data20)){const len2 = data20.length;for(let i2=0; i2<len2; i2++){if(typeof data20[i2] !== "string"){const err39 = {instancePath:instancePath+"/setup/steps/" + i1+"/configKeys/" + i2,schemaPath:"#/properties/setup/properties/steps/items/properties/configKeys/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err39];}else {vErrors.push(err39);}errors++;}}}else {const err40 = {instancePath:instancePath+"/setup/steps/" + i1+"/configKeys",schemaPath:"#/properties/setup/properties/steps/items/properties/configKeys/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err40];}else {vErrors.push(err40);}errors++;}}if(data13.options !== undefined){let data22 = data13.options;if(Array.isArray(data22)){const len3 = data22.length;for(let i3=0; i3<len3; i3++){let data23 = data22[i3];if(data23 && typeof data23 == "object" && !Array.isArray(data23)){if(data23.value === undefined){const err41 = {instancePath:instancePath+"/setup/steps/" + i1+"/options/" + i3,schemaPath:"#/properties/setup/properties/steps/items/properties/options/items/required",keyword:"required",params:{missingProperty: "value"},message:"must have required property '"+"value"+"'"};if(vErrors === null){vErrors = [err41];}else {vErrors.push(err41);}errors++;}if(data23.label === undefined){const err42 = {instancePath:instancePath+"/setup/steps/" + i1+"/options/" + i3,schemaPath:"#/properties/setup/properties/steps/items/properties/options/items/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err42];}else {vErrors.push(err42);}errors++;}for(const key4 in data23){if(!((key4 === "value") || (key4 === "label"))){const err43 = {instancePath:instancePath+"/setup/steps/" + i1+"/options/" + i3,schemaPath:"#/properties/setup/properties/steps/items/properties/options/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key4},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err43];}else {vErrors.push(err43);}errors++;}}if(data23.label !== undefined){if(typeof data23.label !== "string"){const err44 = {instancePath:instancePath+"/setup/steps/" + i1+"/options/" + i3+"/label",schemaPath:"#/properties/setup/properties/steps/items/properties/options/items/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err44];}else {vErrors.push(err44);}errors++;}}}else {const err45 = {instancePath:instancePath+"/setup/steps/" + i1+"/options/" + i3,schemaPath:"#/properties/setup/properties/steps/items/properties/options/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err45];}else {vErrors.push(err45);}errors++;}}}else {const err46 = {instancePath:instancePath+"/setup/steps/" + i1+"/options",schemaPath:"#/properties/setup/properties/steps/items/properties/options/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err46];}else {vErrors.push(err46);}errors++;}}if(data13.optionsSource !== undefined){if(typeof data13.optionsSource !== "string"){const err47 = {instancePath:instancePath+"/setup/steps/" + i1+"/optionsSource",schemaPath:"#/properties/setup/properties/steps/items/properties/optionsSource/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err47];}else {vErrors.push(err47);}errors++;}}let data26 = data13.display;if(typeof data26 !== "string"){const err48 = {instancePath:instancePath+"/setup/steps/" + i1+"/display",schemaPath:"#/properties/setup/properties/steps/items/properties/display/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err48];}else {vErrors.push(err48);}errors++;}if(!((data26 === "select") || (data26 === "cards"))){const err49 = {instancePath:instancePath+"/setup/steps/" + i1+"/display",schemaPath:"#/properties/setup/properties/steps/items/properties/display/enum",keyword:"enum",params:{allowedValues: schema31.properties.setup.properties.steps.items.properties.display.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err49];}else {vErrors.push(err49);}errors++;}if(data13.dependsOn !== undefined){if(typeof data13.dependsOn !== "string"){const err50 = {instancePath:instancePath+"/setup/steps/" + i1+"/dependsOn",schemaPath:"#/properties/setup/properties/steps/items/properties/dependsOn/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err50];}else {vErrors.push(err50);}errors++;}}if(data13.optionsByParent !== undefined){let data28 = data13.optionsByParent;if(data28 && typeof data28 == "object" && !Array.isArray(data28)){for(const key5 in data28){let data29 = data28[key5];if(Array.isArray(data29)){const len4 = data29.length;for(let i4=0; i4<len4; i4++){let data30 = data29[i4];if(data30 && typeof data30 == "object" && !Array.isArray(data30)){if(data30.value === undefined){const err51 = {instancePath:instancePath+"/setup/steps/" + i1+"/optionsByParent/" + key5.replace(/~/g, "~0").replace(/\//g, "~1")+"/" + i4,schemaPath:"#/properties/setup/properties/steps/items/properties/optionsByParent/additionalProperties/items/required",keyword:"required",params:{missingProperty: "value"},message:"must have required property '"+"value"+"'"};if(vErrors === null){vErrors = [err51];}else {vErrors.push(err51);}errors++;}if(data30.label === undefined){const err52 = {instancePath:instancePath+"/setup/steps/" + i1+"/optionsByParent/" + key5.replace(/~/g, "~0").replace(/\//g, "~1")+"/" + i4,schemaPath:"#/properties/setup/properties/steps/items/properties/optionsByParent/additionalProperties/items/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err52];}else {vErrors.push(err52);}errors++;}for(const key6 in data30){if(!((key6 === "value") || (key6 === "label"))){const err53 = {instancePath:instancePath+"/setup/steps/" + i1+"/optionsByParent/" + key5.replace(/~/g, "~0").replace(/\//g, "~1")+"/" + i4,schemaPath:"#/properties/setup/properties/steps/items/properties/optionsByParent/additionalProperties/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key6},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err53];}else {vErrors.push(err53);}errors++;}}if(data30.label !== undefined){if(typeof data30.label !== "string"){const err54 = {instancePath:instancePath+"/setup/steps/" + i1+"/optionsByParent/" + key5.replace(/~/g, "~0").replace(/\//g, "~1")+"/" + i4+"/label",schemaPath:"#/properties/setup/properties/steps/items/properties/optionsByParent/additionalProperties/items/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err54];}else {vErrors.push(err54);}errors++;}}}else {const err55 = {instancePath:instancePath+"/setup/steps/" + i1+"/optionsByParent/" + key5.replace(/~/g, "~0").replace(/\//g, "~1")+"/" + i4,schemaPath:"#/properties/setup/properties/steps/items/properties/optionsByParent/additionalProperties/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err55];}else {vErrors.push(err55);}errors++;}}}else {const err56 = {instancePath:instancePath+"/setup/steps/" + i1+"/optionsByParent/" + key5.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/properties/setup/properties/steps/items/properties/optionsByParent/additionalProperties/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err56];}else {vErrors.push(err56);}errors++;}}}else {const err57 = {instancePath:instancePath+"/setup/steps/" + i1+"/optionsByParent",schemaPath:"#/properties/setup/properties/steps/items/properties/optionsByParent/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err57];}else {vErrors.push(err57);}errors++;}}if(data13.suggestFrom !== undefined){if(typeof data13.suggestFrom !== "string"){const err58 = {instancePath:instancePath+"/setup/steps/" + i1+"/suggestFrom",schemaPath:"#/properties/setup/properties/steps/items/properties/suggestFrom/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err58];}else {vErrors.push(err58);}errors++;}}if(data13.suggestMap !== undefined){let data33 = data13.suggestMap;if(data33 && typeof data33 == "object" && !Array.isArray(data33)){for(const key7 in data33){if(typeof data33[key7] !== "string"){const err59 = {instancePath:instancePath+"/setup/steps/" + i1+"/suggestMap/" + key7.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/properties/setup/properties/steps/items/properties/suggestMap/additionalProperties/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err59];}else {vErrors.push(err59);}errors++;}}}else {const err60 = {instancePath:instancePath+"/setup/steps/" + i1+"/suggestMap",schemaPath:"#/properties/setup/properties/steps/items/properties/suggestMap/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err60];}else {vErrors.push(err60);}errors++;}}if(typeof data13.multiple !== "boolean"){const err61 = {instancePath:instancePath+"/setup/steps/" + i1+"/multiple",schemaPath:"#/properties/setup/properties/steps/items/properties/multiple/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err61];}else {vErrors.push(err61);}errors++;}if(data13.action !== undefined){if(typeof data13.action !== "string"){const err62 = {instancePath:instancePath+"/setup/steps/" + i1+"/action",schemaPath:"#/properties/setup/properties/steps/items/properties/action/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err62];}else {vErrors.push(err62);}errors++;}}if(typeof data13.onDemand !== "boolean"){const err63 = {instancePath:instancePath+"/setup/steps/" + i1+"/onDemand",schemaPath:"#/properties/setup/properties/steps/items/properties/onDemand/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err63];}else {vErrors.push(err63);}errors++;}if(typeof data13.healthCheck !== "boolean"){const err64 = {instancePath:instancePath+"/setup/steps/" + i1+"/healthCheck",schemaPath:"#/properties/setup/properties/steps/items/properties/healthCheck/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err64];}else {vErrors.push(err64);}errors++;}if(data13.component !== undefined){if(typeof data13.component !== "string"){const err65 = {instancePath:instancePath+"/setup/steps/" + i1+"/component",schemaPath:"#/properties/setup/properties/steps/items/properties/component/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err65];}else {vErrors.push(err65);}errors++;}}}else {const err66 = {instancePath:instancePath+"/setup/steps/" + i1,schemaPath:"#/properties/setup/properties/steps/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err66];}else {vErrors.push(err66);}errors++;}}}else {const err67 = {instancePath:instancePath+"/setup/steps",schemaPath:"#/properties/setup/properties/steps/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err67];}else {vErrors.push(err67);}errors++;}}}else {const err68 = {instancePath:instancePath+"/setup",schemaPath:"#/properties/setup/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err68];}else {vErrors.push(err68);}errors++;}}if(data.walkthrough !== undefined){let data40 = data.walkthrough;if(data40 && typeof data40 == "object" && !Array.isArray(data40)){if(data40.enabled === undefined){data40.enabled = true;}if(data40.tours === undefined){const err69 = {instancePath:instancePath+"/walkthrough",schemaPath:"#/properties/walkthrough/required",keyword:"required",params:{missingProperty: "tours"},message:"must have required property '"+"tours"+"'"};if(vErrors === null){vErrors = [err69];}else {vErrors.push(err69);}errors++;}for(const key8 in data40){if(!((((key8 === "enabled") || (key8 === "version")) || (key8 === "completionConfigKey")) || (key8 === "tours"))){const err70 = {instancePath:instancePath+"/walkthrough",schemaPath:"#/properties/walkthrough/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key8},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err70];}else {vErrors.push(err70);}errors++;}}if(typeof data40.enabled !== "boolean"){const err71 = {instancePath:instancePath+"/walkthrough/enabled",schemaPath:"#/properties/walkthrough/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err71];}else {vErrors.push(err71);}errors++;}if(data40.version !== undefined){let data42 = data40.version;if(!((typeof data42 == "number") && (!(data42 % 1) && !isNaN(data42)))){const err72 = {instancePath:instancePath+"/walkthrough/version",schemaPath:"#/properties/walkthrough/properties/version/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err72];}else {vErrors.push(err72);}errors++;}}if(data40.completionConfigKey !== undefined){if(typeof data40.completionConfigKey !== "string"){const err73 = {instancePath:instancePath+"/walkthrough/completionConfigKey",schemaPath:"#/properties/walkthrough/properties/completionConfigKey/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err73];}else {vErrors.push(err73);}errors++;}}if(data40.tours !== undefined){let data44 = data40.tours;if(Array.isArray(data44)){const len5 = data44.length;for(let i5=0; i5<len5; i5++){let data45 = data44[i5];if(data45 && typeof data45 == "object" && !Array.isArray(data45)){if(data45.trigger === undefined){data45.trigger = "manual";}if(data45.id === undefined){const err74 = {instancePath:instancePath+"/walkthrough/tours/" + i5,schemaPath:"#/properties/walkthrough/properties/tours/items/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err74];}else {vErrors.push(err74);}errors++;}if(data45.steps === undefined){const err75 = {instancePath:instancePath+"/walkthrough/tours/" + i5,schemaPath:"#/properties/walkthrough/properties/tours/items/required",keyword:"required",params:{missingProperty: "steps"},message:"must have required property '"+"steps"+"'"};if(vErrors === null){vErrors = [err75];}else {vErrors.push(err75);}errors++;}for(const key9 in data45){if(!(((((key9 === "id") || (key9 === "title")) || (key9 === "trigger")) || (key9 === "minAppVersion")) || (key9 === "steps"))){const err76 = {instancePath:instancePath+"/walkthrough/tours/" + i5,schemaPath:"#/properties/walkthrough/properties/tours/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key9},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err76];}else {vErrors.push(err76);}errors++;}}if(data45.id !== undefined){if(typeof data45.id !== "string"){const err77 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/id",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err77];}else {vErrors.push(err77);}errors++;}}if(data45.title !== undefined){if(typeof data45.title !== "string"){const err78 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/title",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err78];}else {vErrors.push(err78);}errors++;}}let data48 = data45.trigger;if(typeof data48 !== "string"){const err79 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/trigger",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/trigger/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err79];}else {vErrors.push(err79);}errors++;}if(!((((data48 === "first-visit") || (data48 === "version-bump")) || (data48 === "empty-index")) || (data48 === "manual"))){const err80 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/trigger",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/trigger/enum",keyword:"enum",params:{allowedValues: schema31.properties.walkthrough.properties.tours.items.properties.trigger.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err80];}else {vErrors.push(err80);}errors++;}if(data45.minAppVersion !== undefined){if(typeof data45.minAppVersion !== "string"){const err81 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/minAppVersion",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/minAppVersion/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err81];}else {vErrors.push(err81);}errors++;}}if(data45.steps !== undefined){let data50 = data45.steps;if(Array.isArray(data50)){const len6 = data50.length;for(let i6=0; i6<len6; i6++){let data51 = data50[i6];if(data51 && typeof data51 == "object" && !Array.isArray(data51)){if(data51.placement === undefined){data51.placement = "auto";}if(data51.optional === undefined){data51.optional = false;}if(data51.allowManualNext === undefined){data51.allowManualNext = false;}if(data51.id === undefined){const err82 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6,schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err82];}else {vErrors.push(err82);}errors++;}if(data51.target === undefined){const err83 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6,schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/required",keyword:"required",params:{missingProperty: "target"},message:"must have required property '"+"target"+"'"};if(vErrors === null){vErrors = [err83];}else {vErrors.push(err83);}errors++;}if(data51.advanceOn === undefined){const err84 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6,schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/required",keyword:"required",params:{missingProperty: "advanceOn"},message:"must have required property '"+"advanceOn"+"'"};if(vErrors === null){vErrors = [err84];}else {vErrors.push(err84);}errors++;}for(const key10 in data51){if(!(func1.call(schema31.properties.walkthrough.properties.tours.items.properties.steps.items.properties, key10))){const err85 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6,schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key10},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err85];}else {vErrors.push(err85);}errors++;}}if(data51.id !== undefined){if(typeof data51.id !== "string"){const err86 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/id",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err86];}else {vErrors.push(err86);}errors++;}}if(data51.title !== undefined){if(typeof data51.title !== "string"){const err87 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/title",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err87];}else {vErrors.push(err87);}errors++;}}if(data51.body !== undefined){if(typeof data51.body !== "string"){const err88 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/body",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/body/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err88];}else {vErrors.push(err88);}errors++;}}if(data51.task !== undefined){if(typeof data51.task !== "string"){const err89 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/task",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/task/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err89];}else {vErrors.push(err89);}errors++;}}if(data51.sinceVersion !== undefined){if(typeof data51.sinceVersion !== "string"){const err90 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/sinceVersion",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/sinceVersion/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err90];}else {vErrors.push(err90);}errors++;}}let data57 = data51.placement;if(typeof data57 !== "string"){const err91 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/placement",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/placement/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err91];}else {vErrors.push(err91);}errors++;}if(!((((((data57 === "auto") || (data57 === "top")) || (data57 === "bottom")) || (data57 === "left")) || (data57 === "right")) || (data57 === "center"))){const err92 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/placement",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/placement/enum",keyword:"enum",params:{allowedValues: schema31.properties.walkthrough.properties.tours.items.properties.steps.items.properties.placement.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err92];}else {vErrors.push(err92);}errors++;}if(typeof data51.optional !== "boolean"){const err93 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/optional",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/optional/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err93];}else {vErrors.push(err93);}errors++;}if(typeof data51.allowManualNext !== "boolean"){const err94 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/allowManualNext",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/allowManualNext/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err94];}else {vErrors.push(err94);}errors++;}if(data51.handoff !== undefined){let data60 = data51.handoff;if(data60 && typeof data60 == "object" && !Array.isArray(data60)){if(data60.url === undefined){const err95 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/handoff",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/handoff/required",keyword:"required",params:{missingProperty: "url"},message:"must have required property '"+"url"+"'"};if(vErrors === null){vErrors = [err95];}else {vErrors.push(err95);}errors++;}for(const key11 in data60){if(!((((key11 === "app") || (key11 === "url")) || (key11 === "tour")) || (key11 === "step"))){const err96 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/handoff",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/handoff/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key11},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err96];}else {vErrors.push(err96);}errors++;}}if(data60.app !== undefined){if(typeof data60.app !== "string"){const err97 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/handoff/app",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/handoff/properties/app/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err97];}else {vErrors.push(err97);}errors++;}}if(data60.url !== undefined){if(typeof data60.url !== "string"){const err98 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/handoff/url",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/handoff/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err98];}else {vErrors.push(err98);}errors++;}}if(data60.tour !== undefined){if(typeof data60.tour !== "string"){const err99 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/handoff/tour",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/handoff/properties/tour/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err99];}else {vErrors.push(err99);}errors++;}}if(data60.step !== undefined){if(typeof data60.step !== "string"){const err100 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/handoff/step",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/handoff/properties/step/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err100];}else {vErrors.push(err100);}errors++;}}}else {const err101 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/handoff",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/handoff/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err101];}else {vErrors.push(err101);}errors++;}}if(data51.target !== undefined){let data65 = data51.target;if(data65 && typeof data65 == "object" && !Array.isArray(data65)){if(data65.kind === undefined){const err102 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/target",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/target/required",keyword:"required",params:{missingProperty: "kind"},message:"must have required property '"+"kind"+"'"};if(vErrors === null){vErrors = [err102];}else {vErrors.push(err102);}errors++;}for(const key12 in data65){if(!((((key12 === "kind") || (key12 === "ref")) || (key12 === "app")) || (key12 === "selector"))){const err103 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/target",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/target/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key12},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err103];}else {vErrors.push(err103);}errors++;}}if(data65.kind !== undefined){let data66 = data65.kind;if(typeof data66 !== "string"){const err104 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/target/kind",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/target/properties/kind/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err104];}else {vErrors.push(err104);}errors++;}if(!((((((data66 === "nav-item") || (data66 === "widget")) || (data66 === "action")) || (data66 === "page")) || (data66 === "element")) || (data66 === "selector"))){const err105 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/target/kind",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/target/properties/kind/enum",keyword:"enum",params:{allowedValues: schema31.properties.walkthrough.properties.tours.items.properties.steps.items.properties.target.properties.kind.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err105];}else {vErrors.push(err105);}errors++;}}if(data65.ref !== undefined){if(typeof data65.ref !== "string"){const err106 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/target/ref",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/target/properties/ref/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err106];}else {vErrors.push(err106);}errors++;}}if(data65.app !== undefined){if(typeof data65.app !== "string"){const err107 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/target/app",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/target/properties/app/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err107];}else {vErrors.push(err107);}errors++;}}if(data65.selector !== undefined){if(typeof data65.selector !== "string"){const err108 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/target/selector",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/target/properties/selector/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err108];}else {vErrors.push(err108);}errors++;}}}else {const err109 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/target",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/target/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err109];}else {vErrors.push(err109);}errors++;}}if(data51.advanceOn !== undefined){let data70 = data51.advanceOn;if(data70 && typeof data70 == "object" && !Array.isArray(data70)){if(data70.type === undefined){const err110 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/required",keyword:"required",params:{missingProperty: "type"},message:"must have required property '"+"type"+"'"};if(vErrors === null){vErrors = [err110];}else {vErrors.push(err110);}errors++;}for(const key13 in data70){if(!(((((((key13 === "type") || (key13 === "route")) || (key13 === "register")) || (key13 === "schema")) || (key13 === "selector")) || (key13 === "ms")) || (key13 === "capture"))){const err111 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key13},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err111];}else {vErrors.push(err111);}errors++;}}if(data70.type !== undefined){let data71 = data70.type;if(typeof data71 !== "string"){const err112 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/type",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err112];}else {vErrors.push(err112);}errors++;}if(!((((((data71 === "manual") || (data71 === "click-target")) || (data71 === "route-match")) || (data71 === "element-appears")) || (data71 === "object-created")) || (data71 === "delay"))){const err113 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/type",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/type/enum",keyword:"enum",params:{allowedValues: schema31.properties.walkthrough.properties.tours.items.properties.steps.items.properties.advanceOn.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err113];}else {vErrors.push(err113);}errors++;}}if(data70.route !== undefined){if(typeof data70.route !== "string"){const err114 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/route",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/route/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err114];}else {vErrors.push(err114);}errors++;}}if(data70.register !== undefined){if(typeof data70.register !== "string"){const err115 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/register",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err115];}else {vErrors.push(err115);}errors++;}}if(data70.schema !== undefined){if(typeof data70.schema !== "string"){const err116 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/schema",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err116];}else {vErrors.push(err116);}errors++;}}if(data70.selector !== undefined){if(typeof data70.selector !== "string"){const err117 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/selector",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/selector/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err117];}else {vErrors.push(err117);}errors++;}}if(data70.ms !== undefined){let data76 = data70.ms;if(!((typeof data76 == "number") && (!(data76 % 1) && !isNaN(data76)))){const err118 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/ms",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/ms/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err118];}else {vErrors.push(err118);}errors++;}if(typeof data76 == "number"){if(data76 < 0 || isNaN(data76)){const err119 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/ms",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/ms/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err119];}else {vErrors.push(err119);}errors++;}}}if(data70.capture !== undefined){let data77 = data70.capture;if(data77 && typeof data77 == "object" && !Array.isArray(data77)){for(const key14 in data77){if(typeof data77[key14] !== "string"){const err120 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/capture/" + key14.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/capture/additionalProperties/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err120];}else {vErrors.push(err120);}errors++;}}}else {const err121 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn/capture",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/properties/capture/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err121];}else {vErrors.push(err121);}errors++;}}}else {const err122 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6+"/advanceOn",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/properties/advanceOn/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err122];}else {vErrors.push(err122);}errors++;}}}else {const err123 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps/" + i6,schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err123];}else {vErrors.push(err123);}errors++;}}}else {const err124 = {instancePath:instancePath+"/walkthrough/tours/" + i5+"/steps",schemaPath:"#/properties/walkthrough/properties/tours/items/properties/steps/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err124];}else {vErrors.push(err124);}errors++;}}}else {const err125 = {instancePath:instancePath+"/walkthrough/tours/" + i5,schemaPath:"#/properties/walkthrough/properties/tours/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err125];}else {vErrors.push(err125);}errors++;}}}else {const err126 = {instancePath:instancePath+"/walkthrough/tours",schemaPath:"#/properties/walkthrough/properties/tours/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err126];}else {vErrors.push(err126);}errors++;}}}else {const err127 = {instancePath:instancePath+"/walkthrough",schemaPath:"#/properties/walkthrough/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err127];}else {vErrors.push(err127);}errors++;}}if(data.support !== undefined){let data79 = data.support;if(data79 && typeof data79 == "object" && !Array.isArray(data79)){for(const key15 in data79){if(!(func1.call(schema31.properties.support.properties, key15))){const err128 = {instancePath:instancePath+"/support",schemaPath:"#/properties/support/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key15},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err128];}else {vErrors.push(err128);}errors++;}}if(data79.enabled !== undefined){if(typeof data79.enabled !== "boolean"){const err129 = {instancePath:instancePath+"/support/enabled",schemaPath:"#/properties/support/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err129];}else {vErrors.push(err129);}errors++;}}if(data79.title !== undefined){if(typeof data79.title !== "string"){const err130 = {instancePath:instancePath+"/support/title",schemaPath:"#/properties/support/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err130];}else {vErrors.push(err130);}errors++;}}if(data79.appName !== undefined){if(typeof data79.appName !== "string"){const err131 = {instancePath:instancePath+"/support/appName",schemaPath:"#/properties/support/properties/appName/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err131];}else {vErrors.push(err131);}errors++;}}if(data79.bodyParagraphs !== undefined){let data83 = data79.bodyParagraphs;if(Array.isArray(data83)){const len7 = data83.length;for(let i7=0; i7<len7; i7++){if(typeof data83[i7] !== "string"){const err132 = {instancePath:instancePath+"/support/bodyParagraphs/" + i7,schemaPath:"#/properties/support/properties/bodyParagraphs/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err132];}else {vErrors.push(err132);}errors++;}}}else {const err133 = {instancePath:instancePath+"/support/bodyParagraphs",schemaPath:"#/properties/support/properties/bodyParagraphs/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err133];}else {vErrors.push(err133);}errors++;}}if(data79.founderName !== undefined){if(typeof data79.founderName !== "string"){const err134 = {instancePath:instancePath+"/support/founderName",schemaPath:"#/properties/support/properties/founderName/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err134];}else {vErrors.push(err134);}errors++;}}if(data79.founderTitle !== undefined){if(typeof data79.founderTitle !== "string"){const err135 = {instancePath:instancePath+"/support/founderTitle",schemaPath:"#/properties/support/properties/founderTitle/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err135];}else {vErrors.push(err135);}errors++;}}if(data79.founderAvatarUrl !== undefined){if(typeof data79.founderAvatarUrl !== "string"){const err136 = {instancePath:instancePath+"/support/founderAvatarUrl",schemaPath:"#/properties/support/properties/founderAvatarUrl/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err136];}else {vErrors.push(err136);}errors++;}}if(data79.founderProfileUrl !== undefined){if(typeof data79.founderProfileUrl !== "string"){const err137 = {instancePath:instancePath+"/support/founderProfileUrl",schemaPath:"#/properties/support/properties/founderProfileUrl/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err137];}else {vErrors.push(err137);}errors++;}}if(data79.buttons !== undefined){let data89 = data79.buttons;if(data89 && typeof data89 == "object" && !Array.isArray(data89)){for(const key16 in data89){if(!((((key16 === "donate") || (key16 === "support")) || (key16 === "feature-request")) || (key16 === "app-store"))){const err138 = {instancePath:instancePath+"/support/buttons",schemaPath:"#/properties/support/properties/buttons/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key16},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err138];}else {vErrors.push(err138);}errors++;}}if(data89.donate !== undefined){let data90 = data89.donate;if(data90 && typeof data90 == "object" && !Array.isArray(data90)){for(const key17 in data90){if(!(((((key17 === "enabled") || (key17 === "label")) || (key17 === "url")) || (key17 === "variant")) || (key17 === "icon"))){const err139 = {instancePath:instancePath+"/support/buttons/donate",schemaPath:"#/$defs/supportButton/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key17},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err139];}else {vErrors.push(err139);}errors++;}}if(data90.enabled !== undefined){if(typeof data90.enabled !== "boolean"){const err140 = {instancePath:instancePath+"/support/buttons/donate/enabled",schemaPath:"#/$defs/supportButton/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err140];}else {vErrors.push(err140);}errors++;}}if(data90.label !== undefined){if(typeof data90.label !== "string"){const err141 = {instancePath:instancePath+"/support/buttons/donate/label",schemaPath:"#/$defs/supportButton/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err141];}else {vErrors.push(err141);}errors++;}}if(data90.url !== undefined){if(typeof data90.url !== "string"){const err142 = {instancePath:instancePath+"/support/buttons/donate/url",schemaPath:"#/$defs/supportButton/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err142];}else {vErrors.push(err142);}errors++;}}if(data90.variant !== undefined){let data94 = data90.variant;if(typeof data94 !== "string"){const err143 = {instancePath:instancePath+"/support/buttons/donate/variant",schemaPath:"#/$defs/supportButton/properties/variant/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err143];}else {vErrors.push(err143);}errors++;}if(!((((((data94 === "primary") || (data94 === "secondary")) || (data94 === "tertiary")) || (data94 === "error")) || (data94 === "warning")) || (data94 === "success"))){const err144 = {instancePath:instancePath+"/support/buttons/donate/variant",schemaPath:"#/$defs/supportButton/properties/variant/enum",keyword:"enum",params:{allowedValues: schema32.properties.variant.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err144];}else {vErrors.push(err144);}errors++;}}if(data90.icon !== undefined){if(typeof data90.icon !== "string"){const err145 = {instancePath:instancePath+"/support/buttons/donate/icon",schemaPath:"#/$defs/supportButton/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err145];}else {vErrors.push(err145);}errors++;}}}else {const err146 = {instancePath:instancePath+"/support/buttons/donate",schemaPath:"#/$defs/supportButton/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err146];}else {vErrors.push(err146);}errors++;}}if(data89.support !== undefined){let data96 = data89.support;if(data96 && typeof data96 == "object" && !Array.isArray(data96)){for(const key18 in data96){if(!(((((key18 === "enabled") || (key18 === "label")) || (key18 === "url")) || (key18 === "variant")) || (key18 === "icon"))){const err147 = {instancePath:instancePath+"/support/buttons/support",schemaPath:"#/$defs/supportButton/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key18},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err147];}else {vErrors.push(err147);}errors++;}}if(data96.enabled !== undefined){if(typeof data96.enabled !== "boolean"){const err148 = {instancePath:instancePath+"/support/buttons/support/enabled",schemaPath:"#/$defs/supportButton/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err148];}else {vErrors.push(err148);}errors++;}}if(data96.label !== undefined){if(typeof data96.label !== "string"){const err149 = {instancePath:instancePath+"/support/buttons/support/label",schemaPath:"#/$defs/supportButton/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err149];}else {vErrors.push(err149);}errors++;}}if(data96.url !== undefined){if(typeof data96.url !== "string"){const err150 = {instancePath:instancePath+"/support/buttons/support/url",schemaPath:"#/$defs/supportButton/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err150];}else {vErrors.push(err150);}errors++;}}if(data96.variant !== undefined){let data100 = data96.variant;if(typeof data100 !== "string"){const err151 = {instancePath:instancePath+"/support/buttons/support/variant",schemaPath:"#/$defs/supportButton/properties/variant/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err151];}else {vErrors.push(err151);}errors++;}if(!((((((data100 === "primary") || (data100 === "secondary")) || (data100 === "tertiary")) || (data100 === "error")) || (data100 === "warning")) || (data100 === "success"))){const err152 = {instancePath:instancePath+"/support/buttons/support/variant",schemaPath:"#/$defs/supportButton/properties/variant/enum",keyword:"enum",params:{allowedValues: schema32.properties.variant.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err152];}else {vErrors.push(err152);}errors++;}}if(data96.icon !== undefined){if(typeof data96.icon !== "string"){const err153 = {instancePath:instancePath+"/support/buttons/support/icon",schemaPath:"#/$defs/supportButton/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err153];}else {vErrors.push(err153);}errors++;}}}else {const err154 = {instancePath:instancePath+"/support/buttons/support",schemaPath:"#/$defs/supportButton/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err154];}else {vErrors.push(err154);}errors++;}}if(data89["feature-request"] !== undefined){let data102 = data89["feature-request"];if(data102 && typeof data102 == "object" && !Array.isArray(data102)){for(const key19 in data102){if(!(((((key19 === "enabled") || (key19 === "label")) || (key19 === "url")) || (key19 === "variant")) || (key19 === "icon"))){const err155 = {instancePath:instancePath+"/support/buttons/feature-request",schemaPath:"#/$defs/supportButton/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key19},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err155];}else {vErrors.push(err155);}errors++;}}if(data102.enabled !== undefined){if(typeof data102.enabled !== "boolean"){const err156 = {instancePath:instancePath+"/support/buttons/feature-request/enabled",schemaPath:"#/$defs/supportButton/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err156];}else {vErrors.push(err156);}errors++;}}if(data102.label !== undefined){if(typeof data102.label !== "string"){const err157 = {instancePath:instancePath+"/support/buttons/feature-request/label",schemaPath:"#/$defs/supportButton/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err157];}else {vErrors.push(err157);}errors++;}}if(data102.url !== undefined){if(typeof data102.url !== "string"){const err158 = {instancePath:instancePath+"/support/buttons/feature-request/url",schemaPath:"#/$defs/supportButton/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err158];}else {vErrors.push(err158);}errors++;}}if(data102.variant !== undefined){let data106 = data102.variant;if(typeof data106 !== "string"){const err159 = {instancePath:instancePath+"/support/buttons/feature-request/variant",schemaPath:"#/$defs/supportButton/properties/variant/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err159];}else {vErrors.push(err159);}errors++;}if(!((((((data106 === "primary") || (data106 === "secondary")) || (data106 === "tertiary")) || (data106 === "error")) || (data106 === "warning")) || (data106 === "success"))){const err160 = {instancePath:instancePath+"/support/buttons/feature-request/variant",schemaPath:"#/$defs/supportButton/properties/variant/enum",keyword:"enum",params:{allowedValues: schema32.properties.variant.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err160];}else {vErrors.push(err160);}errors++;}}if(data102.icon !== undefined){if(typeof data102.icon !== "string"){const err161 = {instancePath:instancePath+"/support/buttons/feature-request/icon",schemaPath:"#/$defs/supportButton/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err161];}else {vErrors.push(err161);}errors++;}}}else {const err162 = {instancePath:instancePath+"/support/buttons/feature-request",schemaPath:"#/$defs/supportButton/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err162];}else {vErrors.push(err162);}errors++;}}if(data89["app-store"] !== undefined){let data108 = data89["app-store"];if(data108 && typeof data108 == "object" && !Array.isArray(data108)){for(const key20 in data108){if(!(((((key20 === "enabled") || (key20 === "label")) || (key20 === "url")) || (key20 === "variant")) || (key20 === "icon"))){const err163 = {instancePath:instancePath+"/support/buttons/app-store",schemaPath:"#/$defs/supportButton/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key20},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err163];}else {vErrors.push(err163);}errors++;}}if(data108.enabled !== undefined){if(typeof data108.enabled !== "boolean"){const err164 = {instancePath:instancePath+"/support/buttons/app-store/enabled",schemaPath:"#/$defs/supportButton/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err164];}else {vErrors.push(err164);}errors++;}}if(data108.label !== undefined){if(typeof data108.label !== "string"){const err165 = {instancePath:instancePath+"/support/buttons/app-store/label",schemaPath:"#/$defs/supportButton/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err165];}else {vErrors.push(err165);}errors++;}}if(data108.url !== undefined){if(typeof data108.url !== "string"){const err166 = {instancePath:instancePath+"/support/buttons/app-store/url",schemaPath:"#/$defs/supportButton/properties/url/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err166];}else {vErrors.push(err166);}errors++;}}if(data108.variant !== undefined){let data112 = data108.variant;if(typeof data112 !== "string"){const err167 = {instancePath:instancePath+"/support/buttons/app-store/variant",schemaPath:"#/$defs/supportButton/properties/variant/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err167];}else {vErrors.push(err167);}errors++;}if(!((((((data112 === "primary") || (data112 === "secondary")) || (data112 === "tertiary")) || (data112 === "error")) || (data112 === "warning")) || (data112 === "success"))){const err168 = {instancePath:instancePath+"/support/buttons/app-store/variant",schemaPath:"#/$defs/supportButton/properties/variant/enum",keyword:"enum",params:{allowedValues: schema32.properties.variant.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err168];}else {vErrors.push(err168);}errors++;}}if(data108.icon !== undefined){if(typeof data108.icon !== "string"){const err169 = {instancePath:instancePath+"/support/buttons/app-store/icon",schemaPath:"#/$defs/supportButton/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err169];}else {vErrors.push(err169);}errors++;}}}else {const err170 = {instancePath:instancePath+"/support/buttons/app-store",schemaPath:"#/$defs/supportButton/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err170];}else {vErrors.push(err170);}errors++;}}}else {const err171 = {instancePath:instancePath+"/support/buttons",schemaPath:"#/properties/support/properties/buttons/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err171];}else {vErrors.push(err171);}errors++;}}}else {const err172 = {instancePath:instancePath+"/support",schemaPath:"#/properties/support/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err172];}else {vErrors.push(err172);}errors++;}}if(data.personalisation !== undefined){let data114 = data.personalisation;if(data114 && typeof data114 == "object" && !Array.isArray(data114)){if(data114.enabled === undefined){data114.enabled = true;}if(data114.dateDisplay === undefined){data114.dateDisplay = "absolute";}if(data114.rememberLastView === undefined){data114.rememberLastView = false;}for(const key21 in data114){if(!((((((key21 === "enabled") || (key21 === "disabledReason")) || (key21 === "landingPage")) || (key21 === "dateDisplay")) || (key21 === "rememberLastView")) || (key21 === "pinnedMenu"))){const err173 = {instancePath:instancePath+"/personalisation",schemaPath:"#/$defs/personalisation/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key21},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err173];}else {vErrors.push(err173);}errors++;}}if(typeof data114.enabled !== "boolean"){const err174 = {instancePath:instancePath+"/personalisation/enabled",schemaPath:"#/$defs/personalisation/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err174];}else {vErrors.push(err174);}errors++;}if(data114.disabledReason !== undefined){if(typeof data114.disabledReason !== "string"){const err175 = {instancePath:instancePath+"/personalisation/disabledReason",schemaPath:"#/$defs/personalisation/properties/disabledReason/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err175];}else {vErrors.push(err175);}errors++;}}if(data114.landingPage !== undefined){if(typeof data114.landingPage !== "string"){const err176 = {instancePath:instancePath+"/personalisation/landingPage",schemaPath:"#/$defs/personalisation/properties/landingPage/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err176];}else {vErrors.push(err176);}errors++;}}let data118 = data114.dateDisplay;if(typeof data118 !== "string"){const err177 = {instancePath:instancePath+"/personalisation/dateDisplay",schemaPath:"#/$defs/personalisation/properties/dateDisplay/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err177];}else {vErrors.push(err177);}errors++;}if(!((data118 === "absolute") || (data118 === "relative"))){const err178 = {instancePath:instancePath+"/personalisation/dateDisplay",schemaPath:"#/$defs/personalisation/properties/dateDisplay/enum",keyword:"enum",params:{allowedValues: schema36.properties.dateDisplay.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err178];}else {vErrors.push(err178);}errors++;}if(typeof data114.rememberLastView !== "boolean"){const err179 = {instancePath:instancePath+"/personalisation/rememberLastView",schemaPath:"#/$defs/personalisation/properties/rememberLastView/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err179];}else {vErrors.push(err179);}errors++;}if(data114.pinnedMenu !== undefined){let data120 = data114.pinnedMenu;if(Array.isArray(data120)){const len8 = data120.length;for(let i8=0; i8<len8; i8++){if(typeof data120[i8] !== "string"){const err180 = {instancePath:instancePath+"/personalisation/pinnedMenu/" + i8,schemaPath:"#/$defs/personalisation/properties/pinnedMenu/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err180];}else {vErrors.push(err180);}errors++;}}}else {const err181 = {instancePath:instancePath+"/personalisation/pinnedMenu",schemaPath:"#/$defs/personalisation/properties/pinnedMenu/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err181];}else {vErrors.push(err181);}errors++;}}}else {const err182 = {instancePath:instancePath+"/personalisation",schemaPath:"#/$defs/personalisation/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err182];}else {vErrors.push(err182);}errors++;}}if(data.nav !== undefined){let data122 = data.nav;if(data122 && typeof data122 == "object" && !Array.isArray(data122)){if(data122.includePersonalSettings === undefined){data122.includePersonalSettings = true;}for(const key22 in data122){if(!(((((key22 === "includePersonalSettings") || (key22 === "settingsLabel")) || (key22 === "primaryAction")) || (key22 === "featureRequestRepo")) || (key22 === "forge"))){const err183 = {instancePath:instancePath+"/nav",schemaPath:"#/properties/nav/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key22},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err183];}else {vErrors.push(err183);}errors++;}}if(typeof data122.includePersonalSettings !== "boolean"){const err184 = {instancePath:instancePath+"/nav/includePersonalSettings",schemaPath:"#/properties/nav/properties/includePersonalSettings/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err184];}else {vErrors.push(err184);}errors++;}if(data122.settingsLabel !== undefined){if(typeof data122.settingsLabel !== "string"){const err185 = {instancePath:instancePath+"/nav/settingsLabel",schemaPath:"#/properties/nav/properties/settingsLabel/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err185];}else {vErrors.push(err185);}errors++;}}if(data122.primaryAction !== undefined){let data125 = data122.primaryAction;if(data125 && typeof data125 == "object" && !Array.isArray(data125)){if(data125.label === undefined){const err186 = {instancePath:instancePath+"/nav/primaryAction",schemaPath:"#/$defs/primaryAction/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err186];}else {vErrors.push(err186);}errors++;}for(const key23 in data125){if(!((((((key23 === "id") || (key23 === "label")) || (key23 === "icon")) || (key23 === "route")) || (key23 === "href")) || (key23 === "payload"))){const err187 = {instancePath:instancePath+"/nav/primaryAction",schemaPath:"#/$defs/primaryAction/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key23},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err187];}else {vErrors.push(err187);}errors++;}}if(data125.id !== undefined){if(typeof data125.id !== "string"){const err188 = {instancePath:instancePath+"/nav/primaryAction/id",schemaPath:"#/$defs/primaryAction/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err188];}else {vErrors.push(err188);}errors++;}}if(data125.label !== undefined){if(typeof data125.label !== "string"){const err189 = {instancePath:instancePath+"/nav/primaryAction/label",schemaPath:"#/$defs/primaryAction/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err189];}else {vErrors.push(err189);}errors++;}}if(data125.icon !== undefined){if(typeof data125.icon !== "string"){const err190 = {instancePath:instancePath+"/nav/primaryAction/icon",schemaPath:"#/$defs/primaryAction/properties/icon/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err190];}else {vErrors.push(err190);}errors++;}}if(data125.route !== undefined){if(typeof data125.route !== "string"){const err191 = {instancePath:instancePath+"/nav/primaryAction/route",schemaPath:"#/$defs/primaryAction/properties/route/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err191];}else {vErrors.push(err191);}errors++;}}if(data125.href !== undefined){if(typeof data125.href !== "string"){const err192 = {instancePath:instancePath+"/nav/primaryAction/href",schemaPath:"#/$defs/primaryAction/properties/href/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err192];}else {vErrors.push(err192);}errors++;}}}else {const err193 = {instancePath:instancePath+"/nav/primaryAction",schemaPath:"#/$defs/primaryAction/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err193];}else {vErrors.push(err193);}errors++;}}if(data122.featureRequestRepo !== undefined){if(typeof data122.featureRequestRepo !== "string"){const err194 = {instancePath:instancePath+"/nav/featureRequestRepo",schemaPath:"#/properties/nav/properties/featureRequestRepo/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err194];}else {vErrors.push(err194);}errors++;}}if(data122.forge !== undefined){let data132 = data122.forge;if(data132 && typeof data132 == "object" && !Array.isArray(data132)){if(data132.type === undefined){data132.type = "github";}for(const key24 in data132){if(!((key24 === "type") || (key24 === "baseUrl"))){const err195 = {instancePath:instancePath+"/nav/forge",schemaPath:"#/properties/nav/properties/forge/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key24},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err195];}else {vErrors.push(err195);}errors++;}}let data133 = data132.type;if(typeof data133 !== "string"){const err196 = {instancePath:instancePath+"/nav/forge/type",schemaPath:"#/properties/nav/properties/forge/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err196];}else {vErrors.push(err196);}errors++;}if(!((((data133 === "codeberg") || (data133 === "forgejo")) || (data133 === "gitea")) || (data133 === "github"))){const err197 = {instancePath:instancePath+"/nav/forge/type",schemaPath:"#/properties/nav/properties/forge/properties/type/enum",keyword:"enum",params:{allowedValues: schema31.properties.nav.properties.forge.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err197];}else {vErrors.push(err197);}errors++;}if(data132.baseUrl !== undefined){if(typeof data132.baseUrl !== "string"){const err198 = {instancePath:instancePath+"/nav/forge/baseUrl",schemaPath:"#/properties/nav/properties/forge/properties/baseUrl/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err198];}else {vErrors.push(err198);}errors++;}}}else {const err199 = {instancePath:instancePath+"/nav/forge",schemaPath:"#/properties/nav/properties/forge/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err199];}else {vErrors.push(err199);}errors++;}}}else {const err200 = {instancePath:instancePath+"/nav",schemaPath:"#/properties/nav/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err200];}else {vErrors.push(err200);}errors++;}}if(data.runtime !== undefined){let data135 = data.runtime;if(data135 && typeof data135 == "object" && !Array.isArray(data135)){if(data135.user !== undefined){let data136 = data135.user;if(data136 && typeof data136 == "object" && !Array.isArray(data136));else {const err201 = {instancePath:instancePath+"/runtime/user",schemaPath:"#/properties/runtime/properties/user/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err201];}else {vErrors.push(err201);}errors++;}}if(data135.theme !== undefined){let data137 = data135.theme;if(data137 && typeof data137 == "object" && !Array.isArray(data137)){if(data137.source === undefined){const err202 = {instancePath:instancePath+"/runtime/theme",schemaPath:"#/$defs/runtimeTheme/required",keyword:"required",params:{missingProperty: "source"},message:"must have required property '"+"source"+"'"};if(vErrors === null){vErrors = [err202];}else {vErrors.push(err202);}errors++;}if(data137.tokenSet === undefined){const err203 = {instancePath:instancePath+"/runtime/theme",schemaPath:"#/$defs/runtimeTheme/required",keyword:"required",params:{missingProperty: "tokenSet"},message:"must have required property '"+"tokenSet"+"'"};if(vErrors === null){vErrors = [err203];}else {vErrors.push(err203);}errors++;}for(const key25 in data137){if(!((((key25 === "source") || (key25 === "tokenSet")) || (key25 === "tokenSetName")) || (key25 === "preview"))){const err204 = {instancePath:instancePath+"/runtime/theme",schemaPath:"#/$defs/runtimeTheme/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key25},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err204];}else {vErrors.push(err204);}errors++;}}if(data137.source !== undefined){let data138 = data137.source;if(typeof data138 !== "string"){const err205 = {instancePath:instancePath+"/runtime/theme/source",schemaPath:"#/$defs/runtimeTheme/properties/source/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err205];}else {vErrors.push(err205);}errors++;}if(!(data138 === "nldesign")){const err206 = {instancePath:instancePath+"/runtime/theme/source",schemaPath:"#/$defs/runtimeTheme/properties/source/enum",keyword:"enum",params:{allowedValues: schema38.properties.source.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err206];}else {vErrors.push(err206);}errors++;}}if(data137.tokenSet !== undefined){let data139 = data137.tokenSet;if(typeof data139 === "string"){if(!pattern5.test(data139)){const err207 = {instancePath:instancePath+"/runtime/theme/tokenSet",schemaPath:"#/$defs/runtimeTheme/properties/tokenSet/pattern",keyword:"pattern",params:{pattern: "^[a-z0-9]+(?:-[a-z0-9]+)*$"},message:"must match pattern \""+"^[a-z0-9]+(?:-[a-z0-9]+)*$"+"\""};if(vErrors === null){vErrors = [err207];}else {vErrors.push(err207);}errors++;}}else {const err208 = {instancePath:instancePath+"/runtime/theme/tokenSet",schemaPath:"#/$defs/runtimeTheme/properties/tokenSet/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err208];}else {vErrors.push(err208);}errors++;}}if(data137.tokenSetName !== undefined){if(typeof data137.tokenSetName !== "string"){const err209 = {instancePath:instancePath+"/runtime/theme/tokenSetName",schemaPath:"#/$defs/runtimeTheme/properties/tokenSetName/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err209];}else {vErrors.push(err209);}errors++;}}if(data137.preview !== undefined){let data141 = data137.preview;if(data141 && typeof data141 == "object" && !Array.isArray(data141)){for(const key26 in data141){if(!((key26 === "primaryColor") || (key26 === "backgroundColor"))){const err210 = {instancePath:instancePath+"/runtime/theme/preview",schemaPath:"#/$defs/runtimeTheme/properties/preview/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key26},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err210];}else {vErrors.push(err210);}errors++;}}if(data141.primaryColor !== undefined){if(typeof data141.primaryColor !== "string"){const err211 = {instancePath:instancePath+"/runtime/theme/preview/primaryColor",schemaPath:"#/$defs/runtimeTheme/properties/preview/properties/primaryColor/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err211];}else {vErrors.push(err211);}errors++;}}if(data141.backgroundColor !== undefined){if(typeof data141.backgroundColor !== "string"){const err212 = {instancePath:instancePath+"/runtime/theme/preview/backgroundColor",schemaPath:"#/$defs/runtimeTheme/properties/preview/properties/backgroundColor/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err212];}else {vErrors.push(err212);}errors++;}}}else {const err213 = {instancePath:instancePath+"/runtime/theme/preview",schemaPath:"#/$defs/runtimeTheme/properties/preview/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err213];}else {vErrors.push(err213);}errors++;}}}else {const err214 = {instancePath:instancePath+"/runtime/theme",schemaPath:"#/$defs/runtimeTheme/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err214];}else {vErrors.push(err214);}errors++;}}}else {const err215 = {instancePath:instancePath+"/runtime",schemaPath:"#/properties/runtime/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err215];}else {vErrors.push(err215);}errors++;}}if(data.menu !== undefined){let data144 = data.menu;if(Array.isArray(data144)){const len9 = data144.length;for(let i9=0; i9<len9; i9++){if(!(validate21(data144[i9], {instancePath:instancePath+"/menu/" + i9,parentData:data144,parentDataProperty:i9,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate21.errors : vErrors.concat(validate21.errors);errors = vErrors.length;}}}else {const err216 = {instancePath:instancePath+"/menu",schemaPath:"#/properties/menu/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err216];}else {vErrors.push(err216);}errors++;}}if(data.pages !== undefined){let data146 = data.pages;if(Array.isArray(data146)){const len10 = data146.length;for(let i10=0; i10<len10; i10++){if(!(validate25(data146[i10], {instancePath:instancePath+"/pages/" + i10,parentData:data146,parentDataProperty:i10,rootData,dynamicAnchors}))){vErrors = vErrors === null ? validate25.errors : vErrors.concat(validate25.errors);errors = vErrors.length;}}}else {const err217 = {instancePath:instancePath+"/pages",schemaPath:"#/properties/pages/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err217];}else {vErrors.push(err217);}errors++;}}if(data.adminSettings !== undefined){let data148 = data.adminSettings;if(Array.isArray(data148)){const len11 = data148.length;for(let i11=0; i11<len11; i11++){let data149 = data148[i11];const _errs352 = errors;let valid65 = false;let passing1 = null;const _errs353 = errors;if(data149 && typeof data149 == "object" && !Array.isArray(data149)){if(data149.type === undefined){const err218 = {instancePath:instancePath+"/adminSettings/" + i11,schemaPath:"#/$defs/adminSettingsEntry/oneOf/0/required",keyword:"required",params:{missingProperty: "type"},message:"must have required property '"+"type"+"'"};if(vErrors === null){vErrors = [err218];}else {vErrors.push(err218);}errors++;}}var _valid3 = _errs353 === errors;if(_valid3){valid65 = true;passing1 = 0;}const _errs354 = errors;if(data149 && typeof data149 == "object" && !Array.isArray(data149)){if(data149.component === undefined){const err219 = {instancePath:instancePath+"/adminSettings/" + i11,schemaPath:"#/$defs/adminSettingsEntry/oneOf/1/required",keyword:"required",params:{missingProperty: "component"},message:"must have required property '"+"component"+"'"};if(vErrors === null){vErrors = [err219];}else {vErrors.push(err219);}errors++;}}var _valid3 = _errs354 === errors;if(_valid3 && valid65){valid65 = false;passing1 = [passing1, 1];}else {if(_valid3){valid65 = true;passing1 = 1;}}if(!valid65){const err220 = {instancePath:instancePath+"/adminSettings/" + i11,schemaPath:"#/$defs/adminSettingsEntry/oneOf",keyword:"oneOf",params:{passingSchemas: passing1},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err220];}else {vErrors.push(err220);}errors++;}else {errors = _errs352;if(vErrors !== null){if(_errs352){vErrors.length = _errs352;}else {vErrors = null;}}}if(data149 && typeof data149 == "object" && !Array.isArray(data149)){if(data149.id === undefined){const err221 = {instancePath:instancePath+"/adminSettings/" + i11,schemaPath:"#/$defs/adminSettingsEntry/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err221];}else {vErrors.push(err221);}errors++;}if(data149.label === undefined){const err222 = {instancePath:instancePath+"/adminSettings/" + i11,schemaPath:"#/$defs/adminSettingsEntry/required",keyword:"required",params:{missingProperty: "label"},message:"must have required property '"+"label"+"'"};if(vErrors === null){vErrors = [err222];}else {vErrors.push(err222);}errors++;}for(const key27 in data149){if(!(((((((key27 === "id") || (key27 === "label")) || (key27 === "type")) || (key27 === "component")) || (key27 === "order")) || (key27 === "permission")) || (key27 === "props"))){const err223 = {instancePath:instancePath+"/adminSettings/" + i11,schemaPath:"#/$defs/adminSettingsEntry/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key27},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err223];}else {vErrors.push(err223);}errors++;}}if(data149.id !== undefined){if(typeof data149.id !== "string"){const err224 = {instancePath:instancePath+"/adminSettings/" + i11+"/id",schemaPath:"#/$defs/adminSettingsEntry/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err224];}else {vErrors.push(err224);}errors++;}}if(data149.label !== undefined){if(typeof data149.label !== "string"){const err225 = {instancePath:instancePath+"/adminSettings/" + i11+"/label",schemaPath:"#/$defs/adminSettingsEntry/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err225];}else {vErrors.push(err225);}errors++;}}if(data149.type !== undefined){let data152 = data149.type;if(typeof data152 !== "string"){const err226 = {instancePath:instancePath+"/adminSettings/" + i11+"/type",schemaPath:"#/$defs/adminSettingsEntry/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err226];}else {vErrors.push(err226);}errors++;}if(!(data152 === "organisation-credentials")){const err227 = {instancePath:instancePath+"/adminSettings/" + i11+"/type",schemaPath:"#/$defs/adminSettingsEntry/properties/type/enum",keyword:"enum",params:{allowedValues: schema81.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err227];}else {vErrors.push(err227);}errors++;}}if(data149.component !== undefined){if(typeof data149.component !== "string"){const err228 = {instancePath:instancePath+"/adminSettings/" + i11+"/component",schemaPath:"#/$defs/adminSettingsEntry/properties/component/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err228];}else {vErrors.push(err228);}errors++;}}if(data149.order !== undefined){let data154 = data149.order;if(!((typeof data154 == "number") && (!(data154 % 1) && !isNaN(data154)))){const err229 = {instancePath:instancePath+"/adminSettings/" + i11+"/order",schemaPath:"#/$defs/adminSettingsEntry/properties/order/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err229];}else {vErrors.push(err229);}errors++;}}if(data149.permission !== undefined){if(typeof data149.permission !== "string"){const err230 = {instancePath:instancePath+"/adminSettings/" + i11+"/permission",schemaPath:"#/$defs/adminSettingsEntry/properties/permission/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err230];}else {vErrors.push(err230);}errors++;}}if(data149.props !== undefined){let data156 = data149.props;if(data156 && typeof data156 == "object" && !Array.isArray(data156));else {const err231 = {instancePath:instancePath+"/adminSettings/" + i11+"/props",schemaPath:"#/$defs/adminSettingsEntry/properties/props/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err231];}else {vErrors.push(err231);}errors++;}}}else {const err232 = {instancePath:instancePath+"/adminSettings/" + i11,schemaPath:"#/$defs/adminSettingsEntry/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err232];}else {vErrors.push(err232);}errors++;}}}else {const err233 = {instancePath:instancePath+"/adminSettings",schemaPath:"#/properties/adminSettings/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err233];}else {vErrors.push(err233);}errors++;}}if(data.credentials !== undefined){let data157 = data.credentials;if(Array.isArray(data157)){const len12 = data157.length;for(let i12=0; i12<len12; i12++){let data158 = data157[i12];if(data158 && typeof data158 == "object" && !Array.isArray(data158)){if(data158.provider === undefined){const err234 = {instancePath:instancePath+"/credentials/" + i12,schemaPath:"#/properties/credentials/items/required",keyword:"required",params:{missingProperty: "provider"},message:"must have required property '"+"provider"+"'"};if(vErrors === null){vErrors = [err234];}else {vErrors.push(err234);}errors++;}for(const key28 in data158){if(!(((key28 === "provider") || (key28 === "reason")) || (key28 === "scopes"))){const err235 = {instancePath:instancePath+"/credentials/" + i12,schemaPath:"#/properties/credentials/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key28},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err235];}else {vErrors.push(err235);}errors++;}}if(data158.provider !== undefined){if(typeof data158.provider !== "string"){const err236 = {instancePath:instancePath+"/credentials/" + i12+"/provider",schemaPath:"#/properties/credentials/items/properties/provider/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err236];}else {vErrors.push(err236);}errors++;}}if(data158.reason !== undefined){if(typeof data158.reason !== "string"){const err237 = {instancePath:instancePath+"/credentials/" + i12+"/reason",schemaPath:"#/properties/credentials/items/properties/reason/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err237];}else {vErrors.push(err237);}errors++;}}if(data158.scopes !== undefined){let data161 = data158.scopes;if(Array.isArray(data161)){const len13 = data161.length;for(let i13=0; i13<len13; i13++){if(typeof data161[i13] !== "string"){const err238 = {instancePath:instancePath+"/credentials/" + i12+"/scopes/" + i13,schemaPath:"#/properties/credentials/items/properties/scopes/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err238];}else {vErrors.push(err238);}errors++;}}}else {const err239 = {instancePath:instancePath+"/credentials/" + i12+"/scopes",schemaPath:"#/properties/credentials/items/properties/scopes/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err239];}else {vErrors.push(err239);}errors++;}}}else {const err240 = {instancePath:instancePath+"/credentials/" + i12,schemaPath:"#/properties/credentials/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err240];}else {vErrors.push(err240);}errors++;}}}else {const err241 = {instancePath:instancePath+"/credentials",schemaPath:"#/properties/credentials/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err241];}else {vErrors.push(err241);}errors++;}}if(data.schedules !== undefined){let data163 = data.schedules;if(Array.isArray(data163)){const len14 = data163.length;for(let i14=0; i14<len14; i14++){let data164 = data163[i14];const _errs388 = errors;let valid74 = false;let passing2 = null;const _errs389 = errors;const _errs390 = errors;const _errs391 = errors;if(data164 && typeof data164 == "object" && !Array.isArray(data164)){if((data164.cron === undefined) && ("cron")){const err242 = {};if(vErrors === null){vErrors = [err242];}else {vErrors.push(err242);}errors++;}}var valid75 = _errs391 === errors;if(valid75){const err243 = {instancePath:instancePath+"/schedules/" + i14,schemaPath:"#/properties/schedules/items/oneOf/0/not",keyword:"not",params:{},message:"must NOT be valid"};if(vErrors === null){vErrors = [err243];}else {vErrors.push(err243);}errors++;}else {errors = _errs390;if(vErrors !== null){if(_errs390){vErrors.length = _errs390;}else {vErrors = null;}}}if(data164 && typeof data164 == "object" && !Array.isArray(data164)){if(data164.interval === undefined){const err244 = {instancePath:instancePath+"/schedules/" + i14,schemaPath:"#/properties/schedules/items/oneOf/0/required",keyword:"required",params:{missingProperty: "interval"},message:"must have required property '"+"interval"+"'"};if(vErrors === null){vErrors = [err244];}else {vErrors.push(err244);}errors++;}}var _valid4 = _errs389 === errors;if(_valid4){valid74 = true;passing2 = 0;}const _errs392 = errors;const _errs393 = errors;const _errs394 = errors;if(data164 && typeof data164 == "object" && !Array.isArray(data164)){if((data164.interval === undefined) && ("interval")){const err245 = {};if(vErrors === null){vErrors = [err245];}else {vErrors.push(err245);}errors++;}}var valid76 = _errs394 === errors;if(valid76){const err246 = {instancePath:instancePath+"/schedules/" + i14,schemaPath:"#/properties/schedules/items/oneOf/1/not",keyword:"not",params:{},message:"must NOT be valid"};if(vErrors === null){vErrors = [err246];}else {vErrors.push(err246);}errors++;}else {errors = _errs393;if(vErrors !== null){if(_errs393){vErrors.length = _errs393;}else {vErrors = null;}}}if(data164 && typeof data164 == "object" && !Array.isArray(data164)){if(data164.cron === undefined){const err247 = {instancePath:instancePath+"/schedules/" + i14,schemaPath:"#/properties/schedules/items/oneOf/1/required",keyword:"required",params:{missingProperty: "cron"},message:"must have required property '"+"cron"+"'"};if(vErrors === null){vErrors = [err247];}else {vErrors.push(err247);}errors++;}}var _valid4 = _errs392 === errors;if(_valid4 && valid74){valid74 = false;passing2 = [passing2, 1];}else {if(_valid4){valid74 = true;passing2 = 1;}}if(!valid74){const err248 = {instancePath:instancePath+"/schedules/" + i14,schemaPath:"#/properties/schedules/items/oneOf",keyword:"oneOf",params:{passingSchemas: passing2},message:"must match exactly one schema in oneOf"};if(vErrors === null){vErrors = [err248];}else {vErrors.push(err248);}errors++;}else {errors = _errs388;if(vErrors !== null){if(_errs388){vErrors.length = _errs388;}else {vErrors = null;}}}if(data164 && typeof data164 == "object" && !Array.isArray(data164)){if(data164.id === undefined){const err249 = {instancePath:instancePath+"/schedules/" + i14,schemaPath:"#/properties/schedules/items/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err249];}else {vErrors.push(err249);}errors++;}if(data164.action === undefined){const err250 = {instancePath:instancePath+"/schedules/" + i14,schemaPath:"#/properties/schedules/items/required",keyword:"required",params:{missingProperty: "action"},message:"must have required property '"+"action"+"'"};if(vErrors === null){vErrors = [err250];}else {vErrors.push(err250);}errors++;}for(const key29 in data164){if(!((((((key29 === "id") || (key29 === "interval")) || (key29 === "cron")) || (key29 === "action")) || (key29 === "arguments")) || (key29 === "enabled"))){const err251 = {instancePath:instancePath+"/schedules/" + i14,schemaPath:"#/properties/schedules/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key29},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err251];}else {vErrors.push(err251);}errors++;}}if(data164.id !== undefined){if(typeof data164.id !== "string"){const err252 = {instancePath:instancePath+"/schedules/" + i14+"/id",schemaPath:"#/properties/schedules/items/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err252];}else {vErrors.push(err252);}errors++;}}if(data164.interval !== undefined){let data166 = data164.interval;if(!((typeof data166 == "number") && (!(data166 % 1) && !isNaN(data166)))){const err253 = {instancePath:instancePath+"/schedules/" + i14+"/interval",schemaPath:"#/properties/schedules/items/properties/interval/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err253];}else {vErrors.push(err253);}errors++;}if(typeof data166 == "number"){if(data166 < 1 || isNaN(data166)){const err254 = {instancePath:instancePath+"/schedules/" + i14+"/interval",schemaPath:"#/properties/schedules/items/properties/interval/minimum",keyword:"minimum",params:{comparison: ">=", limit: 1},message:"must be >= 1"};if(vErrors === null){vErrors = [err254];}else {vErrors.push(err254);}errors++;}}}if(data164.cron !== undefined){if(typeof data164.cron !== "string"){const err255 = {instancePath:instancePath+"/schedules/" + i14+"/cron",schemaPath:"#/properties/schedules/items/properties/cron/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err255];}else {vErrors.push(err255);}errors++;}}if(data164.action !== undefined){let data168 = data164.action;if(typeof data168 === "string"){if(!pattern27.test(data168)){const err256 = {instancePath:instancePath+"/schedules/" + i14+"/action",schemaPath:"#/properties/schedules/items/properties/action/pattern",keyword:"pattern",params:{pattern: "^[a-z0-9]+:[a-z0-9-]+$"},message:"must match pattern \""+"^[a-z0-9]+:[a-z0-9-]+$"+"\""};if(vErrors === null){vErrors = [err256];}else {vErrors.push(err256);}errors++;}}else {const err257 = {instancePath:instancePath+"/schedules/" + i14+"/action",schemaPath:"#/properties/schedules/items/properties/action/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err257];}else {vErrors.push(err257);}errors++;}}if(data164.arguments !== undefined){let data169 = data164.arguments;if(data169 && typeof data169 == "object" && !Array.isArray(data169));else {const err258 = {instancePath:instancePath+"/schedules/" + i14+"/arguments",schemaPath:"#/properties/schedules/items/properties/arguments/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err258];}else {vErrors.push(err258);}errors++;}}if(data164.enabled !== undefined){if(typeof data164.enabled !== "boolean"){const err259 = {instancePath:instancePath+"/schedules/" + i14+"/enabled",schemaPath:"#/properties/schedules/items/properties/enabled/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err259];}else {vErrors.push(err259);}errors++;}}}else {const err260 = {instancePath:instancePath+"/schedules/" + i14,schemaPath:"#/properties/schedules/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err260];}else {vErrors.push(err260);}errors++;}}}else {const err261 = {instancePath:instancePath+"/schedules",schemaPath:"#/properties/schedules/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err261];}else {vErrors.push(err261);}errors++;}}if(data.observability !== undefined){let data171 = data.observability;if(data171 && typeof data171 == "object" && !Array.isArray(data171)){for(const key30 in data171){if(!(((key30 === "_note") || (key30 === "health")) || (key30 === "metrics"))){const err262 = {instancePath:instancePath+"/observability",schemaPath:"#/$defs/observability/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key30},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err262];}else {vErrors.push(err262);}errors++;}}if(data171._note !== undefined){if(typeof data171._note !== "string"){const err263 = {instancePath:instancePath+"/observability/_note",schemaPath:"#/$defs/observability/properties/_note/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err263];}else {vErrors.push(err263);}errors++;}}if(data171.health !== undefined){let data173 = data171.health;if(data173 && typeof data173 == "object" && !Array.isArray(data173)){if(data173.statusCodePolicy === undefined){data173.statusCodePolicy = "adr006";}if(data173.cors === undefined){data173.cors = false;}for(const key31 in data173){if(!(((key31 === "statusCodePolicy") || (key31 === "checks")) || (key31 === "cors"))){const err264 = {instancePath:instancePath+"/observability/health",schemaPath:"#/$defs/observability/properties/health/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key31},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err264];}else {vErrors.push(err264);}errors++;}}let data174 = data173.statusCodePolicy;if(typeof data174 !== "string"){const err265 = {instancePath:instancePath+"/observability/health/statusCodePolicy",schemaPath:"#/$defs/observability/properties/health/properties/statusCodePolicy/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err265];}else {vErrors.push(err265);}errors++;}if(!((data174 === "adr006") || (data174 === "always200"))){const err266 = {instancePath:instancePath+"/observability/health/statusCodePolicy",schemaPath:"#/$defs/observability/properties/health/properties/statusCodePolicy/enum",keyword:"enum",params:{allowedValues: schema82.properties.health.properties.statusCodePolicy.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err266];}else {vErrors.push(err266);}errors++;}if(data173.checks !== undefined){let data175 = data173.checks;if(Array.isArray(data175)){const len15 = data175.length;for(let i15=0; i15<len15; i15++){let data176 = data175[i15];if(data176 && typeof data176 == "object" && !Array.isArray(data176)){if(data176.severity === undefined){data176.severity = "critical";}if(data176.id === undefined){const err267 = {instancePath:instancePath+"/observability/health/checks/" + i15,schemaPath:"#/$defs/observability/properties/health/properties/checks/items/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err267];}else {vErrors.push(err267);}errors++;}if(data176.type === undefined){const err268 = {instancePath:instancePath+"/observability/health/checks/" + i15,schemaPath:"#/$defs/observability/properties/health/properties/checks/items/required",keyword:"required",params:{missingProperty: "type"},message:"must have required property '"+"type"+"'"};if(vErrors === null){vErrors = [err268];}else {vErrors.push(err268);}errors++;}for(const key32 in data176){if(!(((((key32 === "id") || (key32 === "type")) || (key32 === "severity")) || (key32 === "app")) || (key32 === "key"))){const err269 = {instancePath:instancePath+"/observability/health/checks/" + i15,schemaPath:"#/$defs/observability/properties/health/properties/checks/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key32},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err269];}else {vErrors.push(err269);}errors++;}}if(data176.id !== undefined){if(typeof data176.id !== "string"){const err270 = {instancePath:instancePath+"/observability/health/checks/" + i15+"/id",schemaPath:"#/$defs/observability/properties/health/properties/checks/items/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err270];}else {vErrors.push(err270);}errors++;}}if(data176.type !== undefined){let data178 = data176.type;if(typeof data178 !== "string"){const err271 = {instancePath:instancePath+"/observability/health/checks/" + i15+"/type",schemaPath:"#/$defs/observability/properties/health/properties/checks/items/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err271];}else {vErrors.push(err271);}errors++;}if(!(((((data178 === "database") || (data178 === "filesystem")) || (data178 === "appEnabled")) || (data178 === "appConfig")) || (data178 === "orAvailable"))){const err272 = {instancePath:instancePath+"/observability/health/checks/" + i15+"/type",schemaPath:"#/$defs/observability/properties/health/properties/checks/items/properties/type/enum",keyword:"enum",params:{allowedValues: schema82.properties.health.properties.checks.items.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err272];}else {vErrors.push(err272);}errors++;}}let data179 = data176.severity;if(typeof data179 !== "string"){const err273 = {instancePath:instancePath+"/observability/health/checks/" + i15+"/severity",schemaPath:"#/$defs/observability/properties/health/properties/checks/items/properties/severity/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err273];}else {vErrors.push(err273);}errors++;}if(!((data179 === "critical") || (data179 === "degraded"))){const err274 = {instancePath:instancePath+"/observability/health/checks/" + i15+"/severity",schemaPath:"#/$defs/observability/properties/health/properties/checks/items/properties/severity/enum",keyword:"enum",params:{allowedValues: schema82.properties.health.properties.checks.items.properties.severity.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err274];}else {vErrors.push(err274);}errors++;}if(data176.app !== undefined){if(typeof data176.app !== "string"){const err275 = {instancePath:instancePath+"/observability/health/checks/" + i15+"/app",schemaPath:"#/$defs/observability/properties/health/properties/checks/items/properties/app/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err275];}else {vErrors.push(err275);}errors++;}}if(data176.key !== undefined){if(typeof data176.key !== "string"){const err276 = {instancePath:instancePath+"/observability/health/checks/" + i15+"/key",schemaPath:"#/$defs/observability/properties/health/properties/checks/items/properties/key/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err276];}else {vErrors.push(err276);}errors++;}}}else {const err277 = {instancePath:instancePath+"/observability/health/checks/" + i15,schemaPath:"#/$defs/observability/properties/health/properties/checks/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err277];}else {vErrors.push(err277);}errors++;}}}else {const err278 = {instancePath:instancePath+"/observability/health/checks",schemaPath:"#/$defs/observability/properties/health/properties/checks/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err278];}else {vErrors.push(err278);}errors++;}}if(typeof data173.cors !== "boolean"){const err279 = {instancePath:instancePath+"/observability/health/cors",schemaPath:"#/$defs/observability/properties/health/properties/cors/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err279];}else {vErrors.push(err279);}errors++;}}else {const err280 = {instancePath:instancePath+"/observability/health",schemaPath:"#/$defs/observability/properties/health/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err280];}else {vErrors.push(err280);}errors++;}}if(data171.metrics !== undefined){let data183 = data171.metrics;if(Array.isArray(data183)){const len16 = data183.length;for(let i16=0; i16<len16; i16++){let data184 = data183[i16];if(data184 && typeof data184 == "object" && !Array.isArray(data184)){if(data184.name === undefined){const err281 = {instancePath:instancePath+"/observability/metrics/" + i16,schemaPath:"#/$defs/observability/properties/metrics/items/required",keyword:"required",params:{missingProperty: "name"},message:"must have required property '"+"name"+"'"};if(vErrors === null){vErrors = [err281];}else {vErrors.push(err281);}errors++;}if(data184.type === undefined){const err282 = {instancePath:instancePath+"/observability/metrics/" + i16,schemaPath:"#/$defs/observability/properties/metrics/items/required",keyword:"required",params:{missingProperty: "type"},message:"must have required property '"+"type"+"'"};if(vErrors === null){vErrors = [err282];}else {vErrors.push(err282);}errors++;}if(data184.source === undefined){const err283 = {instancePath:instancePath+"/observability/metrics/" + i16,schemaPath:"#/$defs/observability/properties/metrics/items/required",keyword:"required",params:{missingProperty: "source"},message:"must have required property '"+"source"+"'"};if(vErrors === null){vErrors = [err283];}else {vErrors.push(err283);}errors++;}for(const key33 in data184){if(!(((((key33 === "name") || (key33 === "type")) || (key33 === "help")) || (key33 === "cacheTtl")) || (key33 === "source"))){const err284 = {instancePath:instancePath+"/observability/metrics/" + i16,schemaPath:"#/$defs/observability/properties/metrics/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key33},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err284];}else {vErrors.push(err284);}errors++;}}if(data184.name !== undefined){if(typeof data184.name !== "string"){const err285 = {instancePath:instancePath+"/observability/metrics/" + i16+"/name",schemaPath:"#/$defs/observability/properties/metrics/items/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err285];}else {vErrors.push(err285);}errors++;}}if(data184.type !== undefined){let data186 = data184.type;if(typeof data186 !== "string"){const err286 = {instancePath:instancePath+"/observability/metrics/" + i16+"/type",schemaPath:"#/$defs/observability/properties/metrics/items/properties/type/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err286];}else {vErrors.push(err286);}errors++;}if(!((data186 === "gauge") || (data186 === "counter"))){const err287 = {instancePath:instancePath+"/observability/metrics/" + i16+"/type",schemaPath:"#/$defs/observability/properties/metrics/items/properties/type/enum",keyword:"enum",params:{allowedValues: schema82.properties.metrics.items.properties.type.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err287];}else {vErrors.push(err287);}errors++;}}if(data184.help !== undefined){if(typeof data184.help !== "string"){const err288 = {instancePath:instancePath+"/observability/metrics/" + i16+"/help",schemaPath:"#/$defs/observability/properties/metrics/items/properties/help/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err288];}else {vErrors.push(err288);}errors++;}}if(data184.cacheTtl !== undefined){let data188 = data184.cacheTtl;if(!((typeof data188 == "number") && (!(data188 % 1) && !isNaN(data188)))){const err289 = {instancePath:instancePath+"/observability/metrics/" + i16+"/cacheTtl",schemaPath:"#/$defs/observability/properties/metrics/items/properties/cacheTtl/type",keyword:"type",params:{type: "integer"},message:"must be integer"};if(vErrors === null){vErrors = [err289];}else {vErrors.push(err289);}errors++;}if(typeof data188 == "number"){if(data188 < 0 || isNaN(data188)){const err290 = {instancePath:instancePath+"/observability/metrics/" + i16+"/cacheTtl",schemaPath:"#/$defs/observability/properties/metrics/items/properties/cacheTtl/minimum",keyword:"minimum",params:{comparison: ">=", limit: 0},message:"must be >= 0"};if(vErrors === null){vErrors = [err290];}else {vErrors.push(err290);}errors++;}}}if(data184.source !== undefined){let data189 = data184.source;if(data189 && typeof data189 == "object" && !Array.isArray(data189)){if(data189.kind === undefined){const err291 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/required",keyword:"required",params:{missingProperty: "kind"},message:"must have required property '"+"kind"+"'"};if(vErrors === null){vErrors = [err291];}else {vErrors.push(err291);}errors++;}for(const key34 in data189){if(!(func1.call(schema82.properties.metrics.items.properties.source.properties, key34))){const err292 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key34},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err292];}else {vErrors.push(err292);}errors++;}}if(data189.kind !== undefined){let data190 = data189.kind;if(typeof data190 !== "string"){const err293 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/kind",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/kind/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err293];}else {vErrors.push(err293);}errors++;}if(!(((((data190 === "tableCount") || (data190 === "objectCount")) || (data190 === "objectSum")) || (data190 === "appConfig")) || (data190 === "provider"))){const err294 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/kind",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/kind/enum",keyword:"enum",params:{allowedValues: schema82.properties.metrics.items.properties.source.properties.kind.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err294];}else {vErrors.push(err294);}errors++;}}if(data189.table !== undefined){if(typeof data189.table !== "string"){const err295 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/table",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/table/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err295];}else {vErrors.push(err295);}errors++;}}if(data189.register !== undefined){if(typeof data189.register !== "string"){const err296 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/register",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err296];}else {vErrors.push(err296);}errors++;}}if(data189.schema !== undefined){if(typeof data189.schema !== "string"){const err297 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/schema",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err297];}else {vErrors.push(err297);}errors++;}}if(data189.field !== undefined){if(typeof data189.field !== "string"){const err298 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/field",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/field/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err298];}else {vErrors.push(err298);}errors++;}}if(data189.groupBy !== undefined){let data195 = data189.groupBy;if(Array.isArray(data195)){const len17 = data195.length;for(let i17=0; i17<len17; i17++){if(typeof data195[i17] !== "string"){const err299 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/groupBy/" + i17,schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/groupBy/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err299];}else {vErrors.push(err299);}errors++;}}}else {const err300 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/groupBy",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/groupBy/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err300];}else {vErrors.push(err300);}errors++;}}if(data189.labelMap !== undefined){let data197 = data189.labelMap;if(data197 && typeof data197 == "object" && !Array.isArray(data197)){for(const key35 in data197){if(typeof data197[key35] !== "string"){const err301 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/labelMap/" + key35.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/labelMap/additionalProperties/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err301];}else {vErrors.push(err301);}errors++;}}}else {const err302 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/labelMap",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/labelMap/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err302];}else {vErrors.push(err302);}errors++;}}if(data189.labelDefaults !== undefined){let data199 = data189.labelDefaults;if(data199 && typeof data199 == "object" && !Array.isArray(data199)){for(const key36 in data199){let data200 = data199[key36];if(((typeof data200 !== "string") && (!(typeof data200 == "number"))) && (typeof data200 !== "boolean")){const err303 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/labelDefaults/" + key36.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/labelDefaults/additionalProperties/type",keyword:"type",params:{type: schema82.properties.metrics.items.properties.source.properties.labelDefaults.additionalProperties.type},message:"must be string,number,boolean"};if(vErrors === null){vErrors = [err303];}else {vErrors.push(err303);}errors++;}}}else {const err304 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/labelDefaults",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/labelDefaults/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err304];}else {vErrors.push(err304);}errors++;}}if(data189.filter !== undefined){let data201 = data189.filter;if(data201 && typeof data201 == "object" && !Array.isArray(data201));else {const err305 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/filter",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/filter/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err305];}else {vErrors.push(err305);}errors++;}}if(data189.key !== undefined){if(typeof data189.key !== "string"){const err306 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/key",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/key/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err306];}else {vErrors.push(err306);}errors++;}}if(data189.id !== undefined){if(typeof data189.id !== "string"){const err307 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source/id",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err307];}else {vErrors.push(err307);}errors++;}}}else {const err308 = {instancePath:instancePath+"/observability/metrics/" + i16+"/source",schemaPath:"#/$defs/observability/properties/metrics/items/properties/source/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err308];}else {vErrors.push(err308);}errors++;}}}else {const err309 = {instancePath:instancePath+"/observability/metrics/" + i16,schemaPath:"#/$defs/observability/properties/metrics/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err309];}else {vErrors.push(err309);}errors++;}}}else {const err310 = {instancePath:instancePath+"/observability/metrics",schemaPath:"#/$defs/observability/properties/metrics/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err310];}else {vErrors.push(err310);}errors++;}}}else {const err311 = {instancePath:instancePath+"/observability",schemaPath:"#/$defs/observability/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err311];}else {vErrors.push(err311);}errors++;}}if(data.store !== undefined){let data204 = data.store;const _errs486 = errors;let valid92 = false;const _errs487 = errors;if(data204 && typeof data204 == "object" && !Array.isArray(data204)){if(data204.schema === undefined){const err312 = {instancePath:instancePath+"/store",schemaPath:"#/properties/store/anyOf/0/required",keyword:"required",params:{missingProperty: "schema"},message:"must have required property '"+"schema"+"'"};if(vErrors === null){vErrors = [err312];}else {vErrors.push(err312);}errors++;}}var _valid5 = _errs487 === errors;valid92 = valid92 || _valid5;const _errs488 = errors;if(data204 && typeof data204 == "object" && !Array.isArray(data204)){if(data204.types === undefined){const err313 = {instancePath:instancePath+"/store",schemaPath:"#/properties/store/anyOf/1/required",keyword:"required",params:{missingProperty: "types"},message:"must have required property '"+"types"+"'"};if(vErrors === null){vErrors = [err313];}else {vErrors.push(err313);}errors++;}}var _valid5 = _errs488 === errors;valid92 = valid92 || _valid5;if(!valid92){const err314 = {instancePath:instancePath+"/store",schemaPath:"#/properties/store/anyOf",keyword:"anyOf",params:{},message:"must match a schema in anyOf"};if(vErrors === null){vErrors = [err314];}else {vErrors.push(err314);}errors++;}else {errors = _errs486;if(vErrors !== null){if(_errs486){vErrors.length = _errs486;}else {vErrors = null;}}}if(data204 && typeof data204 == "object" && !Array.isArray(data204)){for(const key37 in data204){if(!(func1.call(schema31.properties.store.properties, key37))){const err315 = {instancePath:instancePath+"/store",schemaPath:"#/properties/store/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key37},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err315];}else {vErrors.push(err315);}errors++;}}if(data204.schema !== undefined){if(typeof data204.schema !== "string"){const err316 = {instancePath:instancePath+"/store/schema",schemaPath:"#/properties/store/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err316];}else {vErrors.push(err316);}errors++;}}if(data204.register !== undefined){if(typeof data204.register !== "string"){const err317 = {instancePath:instancePath+"/store/register",schemaPath:"#/properties/store/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err317];}else {vErrors.push(err317);}errors++;}}if(data204.localRegister !== undefined){if(typeof data204.localRegister !== "string"){const err318 = {instancePath:instancePath+"/store/localRegister",schemaPath:"#/properties/store/properties/localRegister/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err318];}else {vErrors.push(err318);}errors++;}}if(data204.installable !== undefined){let data208 = data204.installable;if(Array.isArray(data208)){const len18 = data208.length;for(let i18=0; i18<len18; i18++){if(typeof data208[i18] !== "string"){const err319 = {instancePath:instancePath+"/store/installable/" + i18,schemaPath:"#/properties/store/properties/installable/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err319];}else {vErrors.push(err319);}errors++;}}}else {const err320 = {instancePath:instancePath+"/store/installable",schemaPath:"#/properties/store/properties/installable/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err320];}else {vErrors.push(err320);}errors++;}}if(data204.kinds !== undefined){let data210 = data204.kinds;if(Array.isArray(data210)){const len19 = data210.length;for(let i19=0; i19<len19; i19++){if(typeof data210[i19] !== "string"){const err321 = {instancePath:instancePath+"/store/kinds/" + i19,schemaPath:"#/properties/store/properties/kinds/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err321];}else {vErrors.push(err321);}errors++;}}}else {const err322 = {instancePath:instancePath+"/store/kinds",schemaPath:"#/properties/store/properties/kinds/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err322];}else {vErrors.push(err322);}errors++;}}if(data204.types !== undefined){let data212 = data204.types;if(Array.isArray(data212)){const len20 = data212.length;for(let i20=0; i20<len20; i20++){if(typeof data212[i20] !== "string"){const err323 = {instancePath:instancePath+"/store/types/" + i20,schemaPath:"#/properties/store/properties/types/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err323];}else {vErrors.push(err323);}errors++;}}}else {const err324 = {instancePath:instancePath+"/store/types",schemaPath:"#/properties/store/properties/types/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err324];}else {vErrors.push(err324);}errors++;}}if(data204.cardFields !== undefined){let data214 = data204.cardFields;if(data214 && typeof data214 == "object" && !Array.isArray(data214)){for(const key38 in data214){if(typeof data214[key38] !== "string"){const err325 = {instancePath:instancePath+"/store/cardFields/" + key38.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/properties/store/properties/cardFields/additionalProperties/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err325];}else {vErrors.push(err325);}errors++;}}}else {const err326 = {instancePath:instancePath+"/store/cardFields",schemaPath:"#/properties/store/properties/cardFields/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err326];}else {vErrors.push(err326);}errors++;}}if(data204.builtIn !== undefined){let data216 = data204.builtIn;if(Array.isArray(data216)){const len21 = data216.length;for(let i21=0; i21<len21; i21++){let data217 = data216[i21];if(data217 && typeof data217 == "object" && !Array.isArray(data217)){if(data217.slug === undefined){const err327 = {instancePath:instancePath+"/store/builtIn/" + i21,schemaPath:"#/properties/store/properties/builtIn/items/required",keyword:"required",params:{missingProperty: "slug"},message:"must have required property '"+"slug"+"'"};if(vErrors === null){vErrors = [err327];}else {vErrors.push(err327);}errors++;}if(data217.title === undefined){const err328 = {instancePath:instancePath+"/store/builtIn/" + i21,schemaPath:"#/properties/store/properties/builtIn/items/required",keyword:"required",params:{missingProperty: "title"},message:"must have required property '"+"title"+"'"};if(vErrors === null){vErrors = [err328];}else {vErrors.push(err328);}errors++;}for(const key39 in data217){if(!((((key39 === "slug") || (key39 === "title")) || (key39 === "description")) || (key39 === "kind"))){const err329 = {instancePath:instancePath+"/store/builtIn/" + i21,schemaPath:"#/properties/store/properties/builtIn/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key39},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err329];}else {vErrors.push(err329);}errors++;}}if(data217.slug !== undefined){if(typeof data217.slug !== "string"){const err330 = {instancePath:instancePath+"/store/builtIn/" + i21+"/slug",schemaPath:"#/properties/store/properties/builtIn/items/properties/slug/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err330];}else {vErrors.push(err330);}errors++;}}if(data217.title !== undefined){if(typeof data217.title !== "string"){const err331 = {instancePath:instancePath+"/store/builtIn/" + i21+"/title",schemaPath:"#/properties/store/properties/builtIn/items/properties/title/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err331];}else {vErrors.push(err331);}errors++;}}if(data217.description !== undefined){if(typeof data217.description !== "string"){const err332 = {instancePath:instancePath+"/store/builtIn/" + i21+"/description",schemaPath:"#/properties/store/properties/builtIn/items/properties/description/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err332];}else {vErrors.push(err332);}errors++;}}if(data217.kind !== undefined){if(typeof data217.kind !== "string"){const err333 = {instancePath:instancePath+"/store/builtIn/" + i21+"/kind",schemaPath:"#/properties/store/properties/builtIn/items/properties/kind/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err333];}else {vErrors.push(err333);}errors++;}}}else {const err334 = {instancePath:instancePath+"/store/builtIn/" + i21,schemaPath:"#/properties/store/properties/builtIn/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err334];}else {vErrors.push(err334);}errors++;}}}else {const err335 = {instancePath:instancePath+"/store/builtIn",schemaPath:"#/properties/store/properties/builtIn/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err335];}else {vErrors.push(err335);}errors++;}}if(data204._note !== undefined){if(typeof data204._note !== "string"){const err336 = {instancePath:instancePath+"/store/_note",schemaPath:"#/properties/store/properties/_note/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err336];}else {vErrors.push(err336);}errors++;}}}else {const err337 = {instancePath:instancePath+"/store",schemaPath:"#/properties/store/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err337];}else {vErrors.push(err337);}errors++;}}if(data.deepLinks !== undefined){let data223 = data.deepLinks;if(Array.isArray(data223)){const len22 = data223.length;for(let i22=0; i22<len22; i22++){let data224 = data223[i22];if(data224 && typeof data224 == "object" && !Array.isArray(data224)){if(data224.registerSlug === undefined){const err338 = {instancePath:instancePath+"/deepLinks/" + i22,schemaPath:"#/$defs/deepLink/required",keyword:"required",params:{missingProperty: "registerSlug"},message:"must have required property '"+"registerSlug"+"'"};if(vErrors === null){vErrors = [err338];}else {vErrors.push(err338);}errors++;}if(data224.schemaSlug === undefined){const err339 = {instancePath:instancePath+"/deepLinks/" + i22,schemaPath:"#/$defs/deepLink/required",keyword:"required",params:{missingProperty: "schemaSlug"},message:"must have required property '"+"schemaSlug"+"'"};if(vErrors === null){vErrors = [err339];}else {vErrors.push(err339);}errors++;}if(data224.urlTemplate === undefined){const err340 = {instancePath:instancePath+"/deepLinks/" + i22,schemaPath:"#/$defs/deepLink/required",keyword:"required",params:{missingProperty: "urlTemplate"},message:"must have required property '"+"urlTemplate"+"'"};if(vErrors === null){vErrors = [err340];}else {vErrors.push(err340);}errors++;}if(data224.registerSlug !== undefined){if(typeof data224.registerSlug !== "string"){const err341 = {instancePath:instancePath+"/deepLinks/" + i22+"/registerSlug",schemaPath:"#/$defs/deepLink/properties/registerSlug/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err341];}else {vErrors.push(err341);}errors++;}}if(data224.schemaSlug !== undefined){if(typeof data224.schemaSlug !== "string"){const err342 = {instancePath:instancePath+"/deepLinks/" + i22+"/schemaSlug",schemaPath:"#/$defs/deepLink/properties/schemaSlug/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err342];}else {vErrors.push(err342);}errors++;}}if(data224.urlTemplate !== undefined){if(typeof data224.urlTemplate !== "string"){const err343 = {instancePath:instancePath+"/deepLinks/" + i22+"/urlTemplate",schemaPath:"#/$defs/deepLink/properties/urlTemplate/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err343];}else {vErrors.push(err343);}errors++;}}if(data224.displayName !== undefined){if(typeof data224.displayName !== "string"){const err344 = {instancePath:instancePath+"/deepLinks/" + i22+"/displayName",schemaPath:"#/$defs/deepLink/properties/displayName/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err344];}else {vErrors.push(err344);}errors++;}}}else {const err345 = {instancePath:instancePath+"/deepLinks/" + i22,schemaPath:"#/$defs/deepLink/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err345];}else {vErrors.push(err345);}errors++;}}}else {const err346 = {instancePath:instancePath+"/deepLinks",schemaPath:"#/properties/deepLinks/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err346];}else {vErrors.push(err346);}errors++;}}if(data.pageTemplates !== undefined){let data229 = data.pageTemplates;if(Array.isArray(data229)){const len23 = data229.length;for(let i23=0; i23<len23; i23++){let data230 = data229[i23];if(data230 && typeof data230 == "object" && !Array.isArray(data230)){if(data230.id === undefined){const err347 = {instancePath:instancePath+"/pageTemplates/" + i23,schemaPath:"#/$defs/pageTemplate/required",keyword:"required",params:{missingProperty: "id"},message:"must have required property '"+"id"+"'"};if(vErrors === null){vErrors = [err347];}else {vErrors.push(err347);}errors++;}if(data230.page === undefined){const err348 = {instancePath:instancePath+"/pageTemplates/" + i23,schemaPath:"#/$defs/pageTemplate/required",keyword:"required",params:{missingProperty: "page"},message:"must have required property '"+"page"+"'"};if(vErrors === null){vErrors = [err348];}else {vErrors.push(err348);}errors++;}for(const key40 in data230){if(!((((key40 === "id") || (key40 === "_note")) || (key40 === "params")) || (key40 === "page"))){const err349 = {instancePath:instancePath+"/pageTemplates/" + i23,schemaPath:"#/$defs/pageTemplate/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key40},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err349];}else {vErrors.push(err349);}errors++;}}if(data230.id !== undefined){if(typeof data230.id !== "string"){const err350 = {instancePath:instancePath+"/pageTemplates/" + i23+"/id",schemaPath:"#/$defs/pageTemplate/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err350];}else {vErrors.push(err350);}errors++;}}if(data230._note !== undefined){if(typeof data230._note !== "string"){const err351 = {instancePath:instancePath+"/pageTemplates/" + i23+"/_note",schemaPath:"#/$defs/pageTemplate/properties/_note/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err351];}else {vErrors.push(err351);}errors++;}}if(data230.params !== undefined){let data233 = data230.params;if(Array.isArray(data233)){const len24 = data233.length;for(let i24=0; i24<len24; i24++){let data234 = data233[i24];if(data234 && typeof data234 == "object" && !Array.isArray(data234)){if(data234.required === undefined){data234.required = false;}if(data234.name === undefined){const err352 = {instancePath:instancePath+"/pageTemplates/" + i23+"/params/" + i24,schemaPath:"#/$defs/pageTemplate/properties/params/items/required",keyword:"required",params:{missingProperty: "name"},message:"must have required property '"+"name"+"'"};if(vErrors === null){vErrors = [err352];}else {vErrors.push(err352);}errors++;}for(const key41 in data234){if(!(((key41 === "name") || (key41 === "required")) || (key41 === "description"))){const err353 = {instancePath:instancePath+"/pageTemplates/" + i23+"/params/" + i24,schemaPath:"#/$defs/pageTemplate/properties/params/items/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key41},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err353];}else {vErrors.push(err353);}errors++;}}if(data234.name !== undefined){if(typeof data234.name !== "string"){const err354 = {instancePath:instancePath+"/pageTemplates/" + i23+"/params/" + i24+"/name",schemaPath:"#/$defs/pageTemplate/properties/params/items/properties/name/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err354];}else {vErrors.push(err354);}errors++;}}if(typeof data234.required !== "boolean"){const err355 = {instancePath:instancePath+"/pageTemplates/" + i23+"/params/" + i24+"/required",schemaPath:"#/$defs/pageTemplate/properties/params/items/properties/required/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err355];}else {vErrors.push(err355);}errors++;}if(data234.description !== undefined){if(typeof data234.description !== "string"){const err356 = {instancePath:instancePath+"/pageTemplates/" + i23+"/params/" + i24+"/description",schemaPath:"#/$defs/pageTemplate/properties/params/items/properties/description/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err356];}else {vErrors.push(err356);}errors++;}}}else {const err357 = {instancePath:instancePath+"/pageTemplates/" + i23+"/params/" + i24,schemaPath:"#/$defs/pageTemplate/properties/params/items/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err357];}else {vErrors.push(err357);}errors++;}}}else {const err358 = {instancePath:instancePath+"/pageTemplates/" + i23+"/params",schemaPath:"#/$defs/pageTemplate/properties/params/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err358];}else {vErrors.push(err358);}errors++;}}if(data230.page !== undefined){let data238 = data230.page;if(!(data238 && typeof data238 == "object" && !Array.isArray(data238))){const err359 = {instancePath:instancePath+"/pageTemplates/" + i23+"/page",schemaPath:"#/$defs/pageTemplate/properties/page/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err359];}else {vErrors.push(err359);}errors++;}}}else {const err360 = {instancePath:instancePath+"/pageTemplates/" + i23,schemaPath:"#/$defs/pageTemplate/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err360];}else {vErrors.push(err360);}errors++;}}}else {const err361 = {instancePath:instancePath+"/pageTemplates",schemaPath:"#/properties/pageTemplates/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err361];}else {vErrors.push(err361);}errors++;}}if(data.pageInstances !== undefined){let data239 = data.pageInstances;if(Array.isArray(data239)){const len25 = data239.length;for(let i25=0; i25<len25; i25++){let data240 = data239[i25];if(data240 && typeof data240 == "object" && !Array.isArray(data240)){if(data240.templateRef === undefined){const err362 = {instancePath:instancePath+"/pageInstances/" + i25,schemaPath:"#/$defs/pageInstance/required",keyword:"required",params:{missingProperty: "templateRef"},message:"must have required property '"+"templateRef"+"'"};if(vErrors === null){vErrors = [err362];}else {vErrors.push(err362);}errors++;}for(const key42 in data240){if(!((((((key42 === "templateRef") || (key42 === "register")) || (key42 === "schema")) || (key42 === "label")) || (key42 === "params")) || (key42 === "override"))){const err363 = {instancePath:instancePath+"/pageInstances/" + i25,schemaPath:"#/$defs/pageInstance/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key42},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err363];}else {vErrors.push(err363);}errors++;}}if(data240.templateRef !== undefined){if(typeof data240.templateRef !== "string"){const err364 = {instancePath:instancePath+"/pageInstances/" + i25+"/templateRef",schemaPath:"#/$defs/pageInstance/properties/templateRef/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err364];}else {vErrors.push(err364);}errors++;}}if(data240.register !== undefined){if(typeof data240.register !== "string"){const err365 = {instancePath:instancePath+"/pageInstances/" + i25+"/register",schemaPath:"#/$defs/pageInstance/properties/register/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err365];}else {vErrors.push(err365);}errors++;}}if(data240.schema !== undefined){if(typeof data240.schema !== "string"){const err366 = {instancePath:instancePath+"/pageInstances/" + i25+"/schema",schemaPath:"#/$defs/pageInstance/properties/schema/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err366];}else {vErrors.push(err366);}errors++;}}if(data240.label !== undefined){if(typeof data240.label !== "string"){const err367 = {instancePath:instancePath+"/pageInstances/" + i25+"/label",schemaPath:"#/$defs/pageInstance/properties/label/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err367];}else {vErrors.push(err367);}errors++;}}if(data240.params !== undefined){let data245 = data240.params;if(data245 && typeof data245 == "object" && !Array.isArray(data245));else {const err368 = {instancePath:instancePath+"/pageInstances/" + i25+"/params",schemaPath:"#/$defs/pageInstance/properties/params/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err368];}else {vErrors.push(err368);}errors++;}}if(data240.override !== undefined){let data246 = data240.override;if(data246 && typeof data246 == "object" && !Array.isArray(data246));else {const err369 = {instancePath:instancePath+"/pageInstances/" + i25+"/override",schemaPath:"#/$defs/pageInstance/properties/override/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err369];}else {vErrors.push(err369);}errors++;}}}else {const err370 = {instancePath:instancePath+"/pageInstances/" + i25,schemaPath:"#/$defs/pageInstance/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err370];}else {vErrors.push(err370);}errors++;}}}else {const err371 = {instancePath:instancePath+"/pageInstances",schemaPath:"#/properties/pageInstances/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err371];}else {vErrors.push(err371);}errors++;}}if(data.sets !== undefined){let data247 = data.sets;if(data247 && typeof data247 == "object" && !Array.isArray(data247));else {const err372 = {instancePath:instancePath+"/sets",schemaPath:"#/properties/sets/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err372];}else {vErrors.push(err372);}errors++;}}if(data.mcp !== undefined){let data248 = data.mcp;if(data248 && typeof data248 == "object" && !Array.isArray(data248)){if(data248.expose === undefined){data248.expose = false;}for(const key43 in data248){if(!(((key43 === "expose") || (key43 === "pageTools")) || (key43 === "agentHints"))){const err373 = {instancePath:instancePath+"/mcp",schemaPath:"#/properties/mcp/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key43},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err373];}else {vErrors.push(err373);}errors++;}}if(typeof data248.expose !== "boolean"){const err374 = {instancePath:instancePath+"/mcp/expose",schemaPath:"#/properties/mcp/properties/expose/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};if(vErrors === null){vErrors = [err374];}else {vErrors.push(err374);}errors++;}if(data248.pageTools !== undefined){let data250 = data248.pageTools;if(data250 && typeof data250 == "object" && !Array.isArray(data250)){for(const key44 in data250){let data251 = data250[key44];if(Array.isArray(data251)){const len26 = data251.length;for(let i26=0; i26<len26; i26++){let data252 = data251[i26];if(typeof data252 === "string"){if(!pattern28.test(data252)){const err375 = {instancePath:instancePath+"/mcp/pageTools/" + key44.replace(/~/g, "~0").replace(/\//g, "~1")+"/" + i26,schemaPath:"#/properties/mcp/properties/pageTools/additionalProperties/items/pattern",keyword:"pattern",params:{pattern: "^[a-z0-9_-]+\\.[a-zA-Z0-9_-]+\\.(search|get|create|update|delete)$"},message:"must match pattern \""+"^[a-z0-9_-]+\\.[a-zA-Z0-9_-]+\\.(search|get|create|update|delete)$"+"\""};if(vErrors === null){vErrors = [err375];}else {vErrors.push(err375);}errors++;}}else {const err376 = {instancePath:instancePath+"/mcp/pageTools/" + key44.replace(/~/g, "~0").replace(/\//g, "~1")+"/" + i26,schemaPath:"#/properties/mcp/properties/pageTools/additionalProperties/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err376];}else {vErrors.push(err376);}errors++;}}}else {const err377 = {instancePath:instancePath+"/mcp/pageTools/" + key44.replace(/~/g, "~0").replace(/\//g, "~1"),schemaPath:"#/properties/mcp/properties/pageTools/additionalProperties/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err377];}else {vErrors.push(err377);}errors++;}}}else {const err378 = {instancePath:instancePath+"/mcp/pageTools",schemaPath:"#/properties/mcp/properties/pageTools/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err378];}else {vErrors.push(err378);}errors++;}}if(data248.agentHints !== undefined){let data253 = data248.agentHints;if(data253 && typeof data253 == "object" && !Array.isArray(data253)){if(data253.summary !== undefined){if(typeof data253.summary !== "string"){const err379 = {instancePath:instancePath+"/mcp/agentHints/summary",schemaPath:"#/properties/mcp/properties/agentHints/properties/summary/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err379];}else {vErrors.push(err379);}errors++;}}if(data253.defaultTools !== undefined){let data255 = data253.defaultTools;if(Array.isArray(data255)){const len27 = data255.length;for(let i27=0; i27<len27; i27++){if(typeof data255[i27] !== "string"){const err380 = {instancePath:instancePath+"/mcp/agentHints/defaultTools/" + i27,schemaPath:"#/properties/mcp/properties/agentHints/properties/defaultTools/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err380];}else {vErrors.push(err380);}errors++;}}}else {const err381 = {instancePath:instancePath+"/mcp/agentHints/defaultTools",schemaPath:"#/properties/mcp/properties/agentHints/properties/defaultTools/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err381];}else {vErrors.push(err381);}errors++;}}if(data253.keywords !== undefined){let data257 = data253.keywords;if(Array.isArray(data257)){const len28 = data257.length;for(let i28=0; i28<len28; i28++){if(typeof data257[i28] !== "string"){const err382 = {instancePath:instancePath+"/mcp/agentHints/keywords/" + i28,schemaPath:"#/properties/mcp/properties/agentHints/properties/keywords/items/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err382];}else {vErrors.push(err382);}errors++;}}}else {const err383 = {instancePath:instancePath+"/mcp/agentHints/keywords",schemaPath:"#/properties/mcp/properties/agentHints/properties/keywords/type",keyword:"type",params:{type: "array"},message:"must be array"};if(vErrors === null){vErrors = [err383];}else {vErrors.push(err383);}errors++;}}}else {const err384 = {instancePath:instancePath+"/mcp/agentHints",schemaPath:"#/properties/mcp/properties/agentHints/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err384];}else {vErrors.push(err384);}errors++;}}}else {const err385 = {instancePath:instancePath+"/mcp",schemaPath:"#/properties/mcp/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err385];}else {vErrors.push(err385);}errors++;}}}else {const err386 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err386];}else {vErrors.push(err386);}errors++;}validate20.errors = vErrors;return errors === 0;}validate20.evaluated = {"props":true,"dynamicProps":false,"dynamicItems":false};
|
|
10
10
|
|
|
11
11
|
var validateManifestV2_compiledExports = validateManifestV2_compiled.exports;
|
|
12
12
|
var _compiledValidateV2 = /*@__PURE__*/getDefaultExportFromCjs(validateManifestV2_compiledExports);
|