@vincenthanxiaodu/pi-web 1.202608.1
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/LICENSE +21 -0
- package/README.md +185 -0
- package/dist/cli.js +1149 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/apple-touch-icon.png +0 -0
- package/dist/client/assets/CodeViewer-D_Q6ljLV.js +4 -0
- package/dist/client/assets/TerminalPanel-CTGixJIz.js +187 -0
- package/dist/client/assets/index-C2phil_t.js +5637 -0
- package/dist/client/assets/vendor-editor-core-CXO8gGab.js +12 -0
- package/dist/client/assets/vendor-editor-languages-CpW4sJsX.js +46 -0
- package/dist/client/assets/vendor-editor-legacy-CYBnW6ZU.js +1 -0
- package/dist/client/assets/vendor-terminal-BrP-ENHg.css +1 -0
- package/dist/client/assets/vendor-terminal-D8k4UKM2.js +35 -0
- package/dist/client/favicon.svg +11 -0
- package/dist/client/index.html +124 -0
- package/dist/client/manifest.webmanifest +24 -0
- package/dist/client/pwa-icon-192.png +0 -0
- package/dist/client/pwa-icon-512.png +0 -0
- package/dist/config.js +505 -0
- package/dist/config.js.map +1 -0
- package/dist/docker/piWebDockerCommandPlan.js +212 -0
- package/dist/docker/piWebDockerCommandPlan.js.map +1 -0
- package/dist/environment.js +4 -0
- package/dist/environment.js.map +1 -0
- package/dist/nativeServices/installedServiceDefinitions.js +602 -0
- package/dist/nativeServices/installedServiceDefinitions.js.map +1 -0
- package/dist/nativeServices/serviceAction.js +174 -0
- package/dist/nativeServices/serviceAction.js.map +1 -0
- package/dist/nativeServices/serviceDoctor.js +783 -0
- package/dist/nativeServices/serviceDoctor.js.map +1 -0
- package/dist/nativeServices/serviceInstall.js +35 -0
- package/dist/nativeServices/serviceInstall.js.map +1 -0
- package/dist/nativeServices/servicePlan.js +358 -0
- package/dist/nativeServices/servicePlan.js.map +1 -0
- package/dist/nativeServices/serviceProbe.js +447 -0
- package/dist/nativeServices/serviceProbe.js.map +1 -0
- package/dist/nativeServices/serviceRendering.js +132 -0
- package/dist/nativeServices/serviceRendering.js.map +1 -0
- package/dist/pi-web-plugins/git/browser/git-contract.js +108 -0
- package/dist/pi-web-plugins/git/browser/git-panel.js +609 -0
- package/dist/pi-web-plugins/git/browser/gitFileList.js +43 -0
- package/dist/pi-web-plugins/git/browser/gitFileShared.js +16 -0
- package/dist/pi-web-plugins/git/browser/gitFileTree.js +81 -0
- package/dist/pi-web-plugins/git/browser/gitFileViewPreference.js +35 -0
- package/dist/pi-web-plugins/git/browser/gitRoute.js +42 -0
- package/dist/pi-web-plugins/git/browser/pi-web-plugin.js +10 -0
- package/dist/pi-web-plugins/git/browser/unifiedDiff.js +301 -0
- package/dist/pi-web-plugins/git/git-backend.js +439 -0
- package/dist/pi-web-plugins/git/package.json +16 -0
- package/dist/pi-web-plugins/git/server-plugin.js +176 -0
- package/dist/pi-web-plugins/info/infoInternals.js +222 -0
- package/dist/pi-web-plugins/info/package.json +9 -0
- package/dist/pi-web-plugins/info/pi-web-plugin.js +48 -0
- package/dist/pi-web-plugins/relays/markdownDocument.js +81 -0
- package/dist/pi-web-plugins/relays/package.json +9 -0
- package/dist/pi-web-plugins/relays/pi-web-plugin.js +44 -0
- package/dist/pi-web-plugins/relays/relayDiscovery.js +228 -0
- package/dist/pi-web-plugins/relays/relaysPanelElement.js +550 -0
- package/dist/pi-web-plugins/relays/vendor/README.md +24 -0
- package/dist/pi-web-plugins/relays/vendor/marked.esm.js +76 -0
- package/dist/pi-web-plugins/updates/package.json +9 -0
- package/dist/pi-web-plugins/updates/pi-web-plugin.js +185 -0
- package/dist/pi-web-plugins/updates/updatesLogic.js +97 -0
- package/dist/pi-web-plugins/workspace-tasks/config.js +91 -0
- package/dist/pi-web-plugins/workspace-tasks/package.json +9 -0
- package/dist/pi-web-plugins/workspace-tasks/pi-web-plugin.js +48 -0
- package/dist/pi-web-plugins/workspace-tasks/taskRunner.js +12 -0
- package/dist/pi-web-plugins/workspace-tasks/tasksPanelElement.js +288 -0
- package/dist/pi-web-plugins/workspace-tasks/workspaceTasksClient.js +47 -0
- package/dist/piWebVersionReport.js +278 -0
- package/dist/piWebVersionReport.js.map +1 -0
- package/dist/plugin-api.d.ts +222 -0
- package/dist/pluginRecoveryCli.js +172 -0
- package/dist/pluginRecoveryCli.js.map +1 -0
- package/dist/server/activeAgentProfileProvider.js +25 -0
- package/dist/server/activeAgentProfileProvider.js.map +1 -0
- package/dist/server/activity/workspaceActivityService.js +106 -0
- package/dist/server/activity/workspaceActivityService.js.map +1 -0
- package/dist/server/app.js +218 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/browserMessageProjection.js +54 -0
- package/dist/server/browserMessageProjection.js.map +1 -0
- package/dist/server/configRoutes.js +293 -0
- package/dist/server/configRoutes.js.map +1 -0
- package/dist/server/diagnostics/nodePtyNativeModule.js +36 -0
- package/dist/server/diagnostics/nodePtyNativeModule.js.map +1 -0
- package/dist/server/diagnostics/nodePtySpawnHelper.js +135 -0
- package/dist/server/diagnostics/nodePtySpawnHelper.js.map +1 -0
- package/dist/server/git/gitEnv.js +15 -0
- package/dist/server/git/gitEnv.js.map +1 -0
- package/dist/server/goals/goalArchive.js +184 -0
- package/dist/server/goals/goalArchive.js.map +1 -0
- package/dist/server/goals/goalFile.js +200 -0
- package/dist/server/goals/goalFile.js.map +1 -0
- package/dist/server/goals/goalStore.js +65 -0
- package/dist/server/goals/goalStore.js.map +1 -0
- package/dist/server/index.js +7 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/machines/machineClient.js +191 -0
- package/dist/server/machines/machineClient.js.map +1 -0
- package/dist/server/machines/machinePluginProxyRoutes.js +247 -0
- package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -0
- package/dist/server/machines/machineProxyRoutes.js +318 -0
- package/dist/server/machines/machineProxyRoutes.js.map +1 -0
- package/dist/server/machines/machineRoutes.js +56 -0
- package/dist/server/machines/machineRoutes.js.map +1 -0
- package/dist/server/machines/machineService.js +274 -0
- package/dist/server/machines/machineService.js.map +1 -0
- package/dist/server/machines/machineStore.js +143 -0
- package/dist/server/machines/machineStore.js.map +1 -0
- package/dist/server/piPackageRoutes.js +91 -0
- package/dist/server/piPackageRoutes.js.map +1 -0
- package/dist/server/piPackageService.js +101 -0
- package/dist/server/piPackageService.js.map +1 -0
- package/dist/server/piWebPluginCatalog.js +584 -0
- package/dist/server/piWebPluginCatalog.js.map +1 -0
- package/dist/server/piWebPluginLifecycle.js +162 -0
- package/dist/server/piWebPluginLifecycle.js.map +1 -0
- package/dist/server/piWebPluginService.js +224 -0
- package/dist/server/piWebPluginService.js.map +1 -0
- package/dist/server/piWebReleaseLookupCache.js +37 -0
- package/dist/server/piWebReleaseLookupCache.js.map +1 -0
- package/dist/server/piWebStatus.js +624 -0
- package/dist/server/piWebStatus.js.map +1 -0
- package/dist/server/piWebStatusCache.js +45 -0
- package/dist/server/piWebStatusCache.js.map +1 -0
- package/dist/server/plugins/pluginBackendProxyRoutes.js +69 -0
- package/dist/server/plugins/pluginBackendProxyRoutes.js.map +1 -0
- package/dist/server/plugins/serverPluginExec.js +184 -0
- package/dist/server/plugins/serverPluginExec.js.map +1 -0
- package/dist/server/plugins/serverPluginRuntime.js +480 -0
- package/dist/server/plugins/serverPluginRuntime.js.map +1 -0
- package/dist/server/projectTrustRoutes.js +80 -0
- package/dist/server/projectTrustRoutes.js.map +1 -0
- package/dist/server/projects/directorySuggestions.js +207 -0
- package/dist/server/projects/directorySuggestions.js.map +1 -0
- package/dist/server/projects/projectService.js +33 -0
- package/dist/server/projects/projectService.js.map +1 -0
- package/dist/server/realtime/sessionEventHub.js +93 -0
- package/dist/server/realtime/sessionEventHub.js.map +1 -0
- package/dist/server/requestCancellation.js +32 -0
- package/dist/server/requestCancellation.js.map +1 -0
- package/dist/server/sessiond/agentHttpDispatcher.js +108 -0
- package/dist/server/sessiond/agentHttpDispatcher.js.map +1 -0
- package/dist/server/sessiond/agentProcessEnvironment.js +61 -0
- package/dist/server/sessiond/agentProcessEnvironment.js.map +1 -0
- package/dist/server/sessiond/pluginBackendRoutes.js +64 -0
- package/dist/server/sessiond/pluginBackendRoutes.js.map +1 -0
- package/dist/server/sessiond/sessionDaemonShutdown.js +31 -0
- package/dist/server/sessiond/sessionDaemonShutdown.js.map +1 -0
- package/dist/server/sessiond/sessionProxyRoutes.js +61 -0
- package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -0
- package/dist/server/sessiond/sessionServiceDependencies.js +34 -0
- package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -0
- package/dist/server/sessiond/sessiondStateOwnership.js +235 -0
- package/dist/server/sessiond/sessiondStateOwnership.js.map +1 -0
- package/dist/server/sessiond/workspaceCatalogRoutes.js +31 -0
- package/dist/server/sessiond/workspaceCatalogRoutes.js.map +1 -0
- package/dist/server/sessiond/workspaceRemovalRoutes.js +41 -0
- package/dist/server/sessiond/workspaceRemovalRoutes.js.map +1 -0
- package/dist/server/sessiond.js +387 -0
- package/dist/server/sessiond.js.map +1 -0
- package/dist/server/sessions/askUserTool.js +102 -0
- package/dist/server/sessions/askUserTool.js.map +1 -0
- package/dist/server/sessions/attachmentService.js +119 -0
- package/dist/server/sessions/attachmentService.js.map +1 -0
- package/dist/server/sessions/authProviderOptions.js +50 -0
- package/dist/server/sessions/authProviderOptions.js.map +1 -0
- package/dist/server/sessions/authRoutes.js +59 -0
- package/dist/server/sessions/authRoutes.js.map +1 -0
- package/dist/server/sessions/authService.js +122 -0
- package/dist/server/sessions/authService.js.map +1 -0
- package/dist/server/sessions/builtinCommands.js +27 -0
- package/dist/server/sessions/builtinCommands.js.map +1 -0
- package/dist/server/sessions/dockerEnvironmentFacts.js +254 -0
- package/dist/server/sessions/dockerEnvironmentFacts.js.map +1 -0
- package/dist/server/sessions/editPreview.js +196 -0
- package/dist/server/sessions/editPreview.js.map +1 -0
- package/dist/server/sessions/extensionDialogWaiters.js +76 -0
- package/dist/server/sessions/extensionDialogWaiters.js.map +1 -0
- package/dist/server/sessions/globalProviderPolicy.js +167 -0
- package/dist/server/sessions/globalProviderPolicy.js.map +1 -0
- package/dist/server/sessions/interruptedRunStore.js +147 -0
- package/dist/server/sessions/interruptedRunStore.js.map +1 -0
- package/dist/server/sessions/messagePaging.js +43 -0
- package/dist/server/sessions/messagePaging.js.map +1 -0
- package/dist/server/sessions/modelCatalogRefresher.js +193 -0
- package/dist/server/sessions/modelCatalogRefresher.js.map +1 -0
- package/dist/server/sessions/oauthLoginFlowService.js +346 -0
- package/dist/server/sessions/oauthLoginFlowService.js.map +1 -0
- package/dist/server/sessions/pendingAskStore.js +275 -0
- package/dist/server/sessions/pendingAskStore.js.map +1 -0
- package/dist/server/sessions/pendingExtensionDialogStore.js +196 -0
- package/dist/server/sessions/pendingExtensionDialogStore.js.map +1 -0
- package/dist/server/sessions/piSessionManagerGateway.js +246 -0
- package/dist/server/sessions/piSessionManagerGateway.js.map +1 -0
- package/dist/server/sessions/piSessionService.js +4059 -0
- package/dist/server/sessions/piSessionService.js.map +1 -0
- package/dist/server/sessions/plainTextTheme.js +112 -0
- package/dist/server/sessions/plainTextTheme.js.map +1 -0
- package/dist/server/sessions/sessionArchiveStore.js +273 -0
- package/dist/server/sessions/sessionArchiveStore.js.map +1 -0
- package/dist/server/sessions/sessionArchiveTree.js +35 -0
- package/dist/server/sessions/sessionArchiveTree.js.map +1 -0
- package/dist/server/sessions/sessionCleanup.js +157 -0
- package/dist/server/sessions/sessionCleanup.js.map +1 -0
- package/dist/server/sessions/sessionCommandService.js +336 -0
- package/dist/server/sessions/sessionCommandService.js.map +1 -0
- package/dist/server/sessions/sessionEnvironmentFacts.js +48 -0
- package/dist/server/sessions/sessionEnvironmentFacts.js.map +1 -0
- package/dist/server/sessions/sessionFileFormat.js +27 -0
- package/dist/server/sessions/sessionFileFormat.js.map +1 -0
- package/dist/server/sessions/sessionFileHeader.js +104 -0
- package/dist/server/sessions/sessionFileHeader.js.map +1 -0
- package/dist/server/sessions/sessionModelScope.js +141 -0
- package/dist/server/sessions/sessionModelScope.js.map +1 -0
- package/dist/server/sessions/sessionNameGenerator.js +90 -0
- package/dist/server/sessions/sessionNameGenerator.js.map +1 -0
- package/dist/server/sessions/sessionNotificationStore.js +484 -0
- package/dist/server/sessions/sessionNotificationStore.js.map +1 -0
- package/dist/server/sessions/sessionRoutes.js +744 -0
- package/dist/server/sessions/sessionRoutes.js.map +1 -0
- package/dist/server/sessions/sessionRuntimeStore.js +2 -0
- package/dist/server/sessions/sessionRuntimeStore.js.map +1 -0
- package/dist/server/sessions/sessionService.js +2 -0
- package/dist/server/sessions/sessionService.js.map +1 -0
- package/dist/server/sessions/sessionSummaryScanner.js +491 -0
- package/dist/server/sessions/sessionSummaryScanner.js.map +1 -0
- package/dist/server/sessions/sessionTreeProjection.js +250 -0
- package/dist/server/sessions/sessionTreeProjection.js.map +1 -0
- package/dist/server/sessions/sessionUnreadStore.js +520 -0
- package/dist/server/sessions/sessionUnreadStore.js.map +1 -0
- package/dist/server/sessions/shutdownDrain.js +73 -0
- package/dist/server/sessions/shutdownDrain.js.map +1 -0
- package/dist/server/sessions/spawnSessionTool.js +48 -0
- package/dist/server/sessions/spawnSessionTool.js.map +1 -0
- package/dist/server/sessions/spawnSubsessionTool.js +216 -0
- package/dist/server/sessions/spawnSubsessionTool.js.map +1 -0
- package/dist/server/sessions/spawnTargetResolver.js +23 -0
- package/dist/server/sessions/spawnTargetResolver.js.map +1 -0
- package/dist/server/sessions/subsessionTranscript.js +235 -0
- package/dist/server/sessions/subsessionTranscript.js.map +1 -0
- package/dist/server/status/machineStatusRoutes.js +8 -0
- package/dist/server/status/machineStatusRoutes.js.map +1 -0
- package/dist/server/status/machineStatusService.js +181 -0
- package/dist/server/status/machineStatusService.js.map +1 -0
- package/dist/server/status/workspaceAttribution.js +87 -0
- package/dist/server/status/workspaceAttribution.js.map +1 -0
- package/dist/server/storage/projectStore.js +88 -0
- package/dist/server/storage/projectStore.js.map +1 -0
- package/dist/server/terminalProxyRoutes.js +141 -0
- package/dist/server/terminalProxyRoutes.js.map +1 -0
- package/dist/server/terminals/terminalRoutes.js +155 -0
- package/dist/server/terminals/terminalRoutes.js.map +1 -0
- package/dist/server/terminals/terminalService.js +305 -0
- package/dist/server/terminals/terminalService.js.map +1 -0
- package/dist/server/terminals/terminalSize.js +17 -0
- package/dist/server/terminals/terminalSize.js.map +1 -0
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/updates/fleetRoutes.js +111 -0
- package/dist/server/updates/fleetRoutes.js.map +1 -0
- package/dist/server/updates/restartRoutes.js +48 -0
- package/dist/server/updates/restartRoutes.js.map +1 -0
- package/dist/server/updates/selfUpdateRoutes.js +145 -0
- package/dist/server/updates/selfUpdateRoutes.js.map +1 -0
- package/dist/server/webSocketBridge.js +32 -0
- package/dist/server/webSocketBridge.js.map +1 -0
- package/dist/server/workingDirectory.js +44 -0
- package/dist/server/workingDirectory.js.map +1 -0
- package/dist/server/workspaceExplorerRoutes.js +147 -0
- package/dist/server/workspaceExplorerRoutes.js.map +1 -0
- package/dist/server/workspaces/effectivePathAccess.js +8 -0
- package/dist/server/workspaces/effectivePathAccess.js.map +1 -0
- package/dist/server/workspaces/fileContentService.js +190 -0
- package/dist/server/workspaces/fileContentService.js.map +1 -0
- package/dist/server/workspaces/filePreviewResponseHeaders.js +18 -0
- package/dist/server/workspaces/filePreviewResponseHeaders.js.map +1 -0
- package/dist/server/workspaces/filePreviewResponsePolicy.js +55 -0
- package/dist/server/workspaces/filePreviewResponsePolicy.js.map +1 -0
- package/dist/server/workspaces/filePreviewService.js +81 -0
- package/dist/server/workspaces/filePreviewService.js.map +1 -0
- package/dist/server/workspaces/fileSuggestions.js +520 -0
- package/dist/server/workspaces/fileSuggestions.js.map +1 -0
- package/dist/server/workspaces/fileTreeService.js +35 -0
- package/dist/server/workspaces/fileTreeService.js.map +1 -0
- package/dist/server/workspaces/pathAccessPolicy.js +90 -0
- package/dist/server/workspaces/pathAccessPolicy.js.map +1 -0
- package/dist/server/workspaces/pathSafety.js +45 -0
- package/dist/server/workspaces/pathSafety.js.map +1 -0
- package/dist/server/workspaces/projectPiWebConfig.js +61 -0
- package/dist/server/workspaces/projectPiWebConfig.js.map +1 -0
- package/dist/server/workspaces/projectWorkspaceCwds.js +17 -0
- package/dist/server/workspaces/projectWorkspaceCwds.js.map +1 -0
- package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js +402 -0
- package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js.map +1 -0
- package/dist/server/workspaces/workspaceCatalog.js +47 -0
- package/dist/server/workspaces/workspaceCatalog.js.map +1 -0
- package/dist/server/workspaces/workspaceContext.js +6 -0
- package/dist/server/workspaces/workspaceContext.js.map +1 -0
- package/dist/server/workspaces/workspaceDeletionRoutes.js +49 -0
- package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -0
- package/dist/server/workspaces/workspaceProviderRegistry.js +651 -0
- package/dist/server/workspaces/workspaceProviderRegistry.js.map +1 -0
- package/dist/server/workspaces/workspaceRemovalService.js +256 -0
- package/dist/server/workspaces/workspaceRemovalService.js.map +1 -0
- package/dist/server/workspaces/workspaceRouteErrors.js +7 -0
- package/dist/server/workspaces/workspaceRouteErrors.js.map +1 -0
- package/dist/server/workspaces/worktreePreRemoveHook.js +39 -0
- package/dist/server/workspaces/worktreePreRemoveHook.js.map +1 -0
- package/dist/server-plugin-api.d.ts +140 -0
- package/dist/server-plugin-api.js +2 -0
- package/dist/server-plugin-api.js.map +1 -0
- package/dist/serverPluginRecovery.js +138 -0
- package/dist/serverPluginRecovery.js.map +1 -0
- package/dist/sessiond/activeAgentProfile.js +12 -0
- package/dist/sessiond/activeAgentProfile.js.map +1 -0
- package/dist/sessiond/config.js +20 -0
- package/dist/sessiond/config.js.map +1 -0
- package/dist/sessiond/sessionDaemonClient.js +105 -0
- package/dist/sessiond/sessionDaemonClient.js.map +1 -0
- package/dist/shared/activeAgentProfile.js +37 -0
- package/dist/shared/activeAgentProfile.js.map +1 -0
- package/dist/shared/activity.js +16 -0
- package/dist/shared/activity.js.map +1 -0
- package/dist/shared/apiTypes.js +41 -0
- package/dist/shared/apiTypes.js.map +1 -0
- package/dist/shared/capabilities.js +37 -0
- package/dist/shared/capabilities.js.map +1 -0
- package/dist/shared/federatedRoutes.js +127 -0
- package/dist/shared/federatedRoutes.js.map +1 -0
- package/dist/shared/machinePluginIds.js +43 -0
- package/dist/shared/machinePluginIds.js.map +1 -0
- package/dist/shared/machineStatus.js +94 -0
- package/dist/shared/machineStatus.js.map +1 -0
- package/dist/shared/piWebStatusParsing.js +141 -0
- package/dist/shared/piWebStatusParsing.js.map +1 -0
- package/dist/shared/pluginApiTypes.d.ts +150 -0
- package/dist/shared/pluginApiTypes.js +3 -0
- package/dist/shared/pluginApiTypes.js.map +1 -0
- package/dist/shared/pluginBackendProtocol.js +110 -0
- package/dist/shared/pluginBackendProtocol.js.map +1 -0
- package/dist/shared/pluginIds.js +10 -0
- package/dist/shared/pluginIds.js.map +1 -0
- package/dist/shared/pluginRecoveryCommands.js +14 -0
- package/dist/shared/pluginRecoveryCommands.js.map +1 -0
- package/dist/shared/promptAttachments.js +92 -0
- package/dist/shared/promptAttachments.js.map +1 -0
- package/dist/shared/selfUpdate.js +3 -0
- package/dist/shared/selfUpdate.js.map +1 -0
- package/dist/shared/thinkingLevels.js +31 -0
- package/dist/shared/thinkingLevels.js.map +1 -0
- package/dist/shared/workspaceDeletion.js +12 -0
- package/dist/shared/workspaceDeletion.js.map +1 -0
- package/dist/shared/workspaceFiles.js +42 -0
- package/dist/shared/workspaceFiles.js.map +1 -0
- package/dist/shared/workspaceRemovalProtocol.js +24 -0
- package/dist/shared/workspaceRemovalProtocol.js.map +1 -0
- package/docs/assets/favicon.svg +11 -0
- package/docs/assets/pi-web-banner.png +0 -0
- package/docs/assets/pi-web-desktop.png +0 -0
- package/docs/assets/pi-web-mobile.png +0 -0
- package/docs/assets/pi-web-tablet.png +0 -0
- package/docs/config.md +444 -0
- package/docs/plugins.md +1305 -0
- package/examples/workspace-provider-plugin/README.md +52 -0
- package/examples/workspace-provider-plugin/package.json +25 -0
- package/examples/workspace-provider-plugin/src/browser/index.ts +69 -0
- package/examples/workspace-provider-plugin/src/server.ts +64 -0
- package/examples/workspace-provider-plugin/tsconfig.json +21 -0
- package/extensions/README-pi-web-restart-migration.md +45 -0
- package/extensions/pi-web.ts +324 -0
- package/install.sh +5 -0
- package/package.json +173 -0
- package/plugin-api.d.ts +1 -0
- package/server-plugin-api.d.ts +1 -0
|
@@ -0,0 +1,602 @@
|
|
|
1
|
+
import { TextDecoder, TextEncoder } from "node:util";
|
|
2
|
+
import { ownEnvironmentValue } from "../environment.js";
|
|
3
|
+
import { decodeSystemdEscapes, inspectInstalledNativeServiceDefinitionEnvironment, } from "./serviceDoctor.js";
|
|
4
|
+
const systemdInspectionProperties = [
|
|
5
|
+
"LoadState",
|
|
6
|
+
"FragmentPath",
|
|
7
|
+
"DropInPaths",
|
|
8
|
+
"NeedDaemonReload",
|
|
9
|
+
"EnvironmentFiles",
|
|
10
|
+
"Environment",
|
|
11
|
+
];
|
|
12
|
+
const systemdBusDestination = "org.freedesktop.systemd1";
|
|
13
|
+
const systemdUnitObjectPathPrefix = "/org/freedesktop/systemd1/unit/";
|
|
14
|
+
const legacySystemdUnprintableValue = "[unprintable]";
|
|
15
|
+
/**
|
|
16
|
+
* Read installed definitions through a strict UTF-8 boundary, parse the
|
|
17
|
+
* manager-relevant environment, and then bind that byte snapshot to the
|
|
18
|
+
* service manager's effective context. Systemd must report the canonical
|
|
19
|
+
* fragment, no unmodeled environment inputs, and the same effective
|
|
20
|
+
* environment; legacy systemctl output is recovered losslessly from the
|
|
21
|
+
* manager's D-Bus property. A loaded LaunchAgent must report the canonical
|
|
22
|
+
* plist and the same PI_WEB_CONFIG. Launchd restart is the exception: its existing
|
|
23
|
+
* bootout/bootstrap path deliberately replaces loaded state before probing.
|
|
24
|
+
*/
|
|
25
|
+
export function inspectInstalledNativeServiceDefinitions(backend, sources, dependencies, purpose) {
|
|
26
|
+
const definitions = [];
|
|
27
|
+
for (const source of sources) {
|
|
28
|
+
let bytes;
|
|
29
|
+
try {
|
|
30
|
+
bytes = dependencies.readFile(source.path);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
return {
|
|
34
|
+
ok: false,
|
|
35
|
+
message: `Could not read installed ${definitionLabel(backend, source.id)} ${source.path}: ${errorMessage(error)}`,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
let contents;
|
|
39
|
+
try {
|
|
40
|
+
contents = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return {
|
|
44
|
+
ok: false,
|
|
45
|
+
message: `Installed ${definitionLabel(backend, source.id)} ${source.path} is not valid UTF-8.`,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const definition = { id: source.id, contents };
|
|
49
|
+
const environment = inspectInstalledNativeServiceDefinitionEnvironment(backend, definition);
|
|
50
|
+
if (!environment.ok)
|
|
51
|
+
return environment;
|
|
52
|
+
if (backend.kind === "systemd") {
|
|
53
|
+
const managerInspection = inspectEffectiveSystemdDefinition(source, environment.value, dependencies);
|
|
54
|
+
if (!managerInspection.ok)
|
|
55
|
+
return managerInspection;
|
|
56
|
+
}
|
|
57
|
+
else if (purpose !== "restart") {
|
|
58
|
+
const managerInspection = inspectLoadedLaunchdDefinition(source, environment.value, dependencies);
|
|
59
|
+
if (!managerInspection.ok)
|
|
60
|
+
return managerInspection;
|
|
61
|
+
}
|
|
62
|
+
definitions.push(definition);
|
|
63
|
+
}
|
|
64
|
+
return { ok: true, value: definitions };
|
|
65
|
+
}
|
|
66
|
+
function inspectEffectiveSystemdDefinition(source, expectedEnvironment, dependencies) {
|
|
67
|
+
const args = [
|
|
68
|
+
"--user",
|
|
69
|
+
"--no-pager",
|
|
70
|
+
"show",
|
|
71
|
+
source.systemdName,
|
|
72
|
+
"--all",
|
|
73
|
+
...systemdInspectionProperties.map((property) => `--property=${property}`),
|
|
74
|
+
];
|
|
75
|
+
const captured = dependencies.capture("systemctl", args);
|
|
76
|
+
const result = decodeCommandResult(captured);
|
|
77
|
+
if (result === undefined) {
|
|
78
|
+
return {
|
|
79
|
+
ok: false,
|
|
80
|
+
message: `Could not inspect effective systemd unit ${source.systemdName}: systemctl output is not valid UTF-8.`,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
if (result.status !== 0) {
|
|
84
|
+
const detail = firstOutputLine(result.stderr, result.stdout);
|
|
85
|
+
return {
|
|
86
|
+
ok: false,
|
|
87
|
+
message: `Could not inspect effective systemd unit ${source.systemdName}: systemctl exited with status ${String(result.status)}${detail === undefined ? "" : ` (${detail})`}.`,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
const parsed = parseSystemdInspectionProperties(result.stdout);
|
|
91
|
+
if (!parsed.ok) {
|
|
92
|
+
return {
|
|
93
|
+
ok: false,
|
|
94
|
+
message: `Could not inspect effective systemd unit ${source.systemdName}: ${parsed.message}`,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const loadState = singleSystemdProperty(parsed.value.properties, "LoadState");
|
|
98
|
+
const fragmentPath = singleSystemdProperty(parsed.value.properties, "FragmentPath");
|
|
99
|
+
const dropInPaths = singleSystemdProperty(parsed.value.properties, "DropInPaths");
|
|
100
|
+
const needDaemonReload = singleSystemdProperty(parsed.value.properties, "NeedDaemonReload");
|
|
101
|
+
const effectiveEnvironmentValue = singleSystemdProperty(parsed.value.properties, "Environment");
|
|
102
|
+
if (loadState === undefined
|
|
103
|
+
|| fragmentPath === undefined
|
|
104
|
+
|| dropInPaths === undefined
|
|
105
|
+
|| needDaemonReload === undefined
|
|
106
|
+
|| effectiveEnvironmentValue === undefined) {
|
|
107
|
+
return {
|
|
108
|
+
ok: false,
|
|
109
|
+
message: `Could not inspect effective systemd unit ${source.systemdName}: systemctl returned incomplete or duplicate unit metadata.`,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
if (loadState !== "loaded") {
|
|
113
|
+
return {
|
|
114
|
+
ok: false,
|
|
115
|
+
message: `Systemd unit ${source.systemdName} has load state ${JSON.stringify(loadState)} instead of "loaded".`,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
if (needDaemonReload !== "no") {
|
|
119
|
+
return {
|
|
120
|
+
ok: false,
|
|
121
|
+
message: needDaemonReload === "yes"
|
|
122
|
+
? `Systemd unit ${source.systemdName} has changed on disk; run \`systemctl --user daemon-reload\` before probing it.`
|
|
123
|
+
: `Systemd unit ${source.systemdName} reports unrecognized NeedDaemonReload=${JSON.stringify(needDaemonReload)}.`,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
if (dropInPaths !== "") {
|
|
127
|
+
return {
|
|
128
|
+
ok: false,
|
|
129
|
+
message: `Systemd unit ${source.systemdName} uses effective drop-ins (${dropInPaths}); PI WEB cannot safely inspect managed config through systemd drop-ins.`,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
const environmentFiles = parsed.value.properties.get("EnvironmentFiles") ?? [];
|
|
133
|
+
const configuredEnvironmentFiles = environmentFiles.filter((value) => value !== "");
|
|
134
|
+
if (configuredEnvironmentFiles.length > 0) {
|
|
135
|
+
return {
|
|
136
|
+
ok: false,
|
|
137
|
+
message: `Systemd unit ${source.systemdName} uses EnvironmentFile inputs (${configuredEnvironmentFiles.join(", ")}); PI WEB cannot safely inspect their managed config values.`,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
let actualFragmentPath;
|
|
141
|
+
let expectedFragmentPath;
|
|
142
|
+
try {
|
|
143
|
+
actualFragmentPath = dependencies.realpath(fragmentPath);
|
|
144
|
+
expectedFragmentPath = dependencies.realpath(source.path);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
return {
|
|
148
|
+
ok: false,
|
|
149
|
+
message: `Could not compare systemd fragment ${fragmentPath} with installed definition ${source.path}: ${errorMessage(error)}`,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
if (actualFragmentPath !== expectedFragmentPath) {
|
|
153
|
+
return {
|
|
154
|
+
ok: false,
|
|
155
|
+
message: `Systemd loaded ${source.systemdName} from ${fragmentPath} instead of the installed PI WEB definition ${source.path}.`,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
const effectiveEnvironment = inspectEffectiveSystemdEnvironment(source, effectiveEnvironmentValue, parsed.value.propertiesWithAmbiguousTrailingCarriageReturn.has("Environment"), dependencies);
|
|
159
|
+
if (!effectiveEnvironment.ok)
|
|
160
|
+
return effectiveEnvironment;
|
|
161
|
+
if (!recordsEqual(effectiveEnvironment.value, expectedEnvironment)) {
|
|
162
|
+
return {
|
|
163
|
+
ok: false,
|
|
164
|
+
message: `Systemd unit ${source.systemdName} has an effective environment that differs from installed definition ${source.path}; run \`systemctl --user daemon-reload\` or reinstall the managed services before probing it.`,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
return { ok: true, value: null };
|
|
168
|
+
}
|
|
169
|
+
function inspectLoadedLaunchdDefinition(source, expectedEnvironment, dependencies) {
|
|
170
|
+
const captured = dependencies.capture("launchctl", ["print", source.launchdTarget]);
|
|
171
|
+
const result = decodeCommandResult(captured);
|
|
172
|
+
if (result === undefined) {
|
|
173
|
+
return {
|
|
174
|
+
ok: false,
|
|
175
|
+
message: `Could not inspect loaded LaunchAgent ${source.launchdTarget}: launchctl output is not valid UTF-8.`,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
if (result.status !== 0) {
|
|
179
|
+
if (launchdServiceIsMissing(result))
|
|
180
|
+
return { ok: true, value: null };
|
|
181
|
+
const detail = firstOutputLine(result.stderr, result.stdout);
|
|
182
|
+
return {
|
|
183
|
+
ok: false,
|
|
184
|
+
message: `Could not inspect loaded LaunchAgent ${source.launchdTarget}: launchctl exited with status ${String(result.status)}${detail === undefined ? "" : ` (${detail})`}.`,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
const loaded = parseLaunchdPrintDefinition(result.stdout, source.launchdTarget);
|
|
188
|
+
if (loaded === undefined) {
|
|
189
|
+
return {
|
|
190
|
+
ok: false,
|
|
191
|
+
message: `Could not inspect loaded LaunchAgent ${source.launchdTarget}: launchctl returned an unrecognized service definition.`,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
let actualPlistPath;
|
|
195
|
+
let expectedPlistPath;
|
|
196
|
+
try {
|
|
197
|
+
actualPlistPath = dependencies.realpath(loaded.path);
|
|
198
|
+
expectedPlistPath = dependencies.realpath(source.path);
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
return {
|
|
202
|
+
ok: false,
|
|
203
|
+
message: `Could not compare loaded LaunchAgent plist ${loaded.path} with installed definition ${source.path}: ${errorMessage(error)}`,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
if (actualPlistPath !== expectedPlistPath) {
|
|
207
|
+
return {
|
|
208
|
+
ok: false,
|
|
209
|
+
message: `Launchd loaded ${source.launchdTarget} from ${loaded.path} instead of the installed PI WEB definition ${source.path}; run \`pi-web restart\` to reload the managed LaunchAgents.`,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
const expectedConfigPath = ownEnvironmentValue(expectedEnvironment, "PI_WEB_CONFIG");
|
|
213
|
+
const loadedConfigPath = ownEnvironmentValue(loaded.environment, "PI_WEB_CONFIG");
|
|
214
|
+
if (loadedConfigPath !== expectedConfigPath) {
|
|
215
|
+
return {
|
|
216
|
+
ok: false,
|
|
217
|
+
message: `Loaded LaunchAgent ${source.launchdTarget} has PI_WEB_CONFIG ${JSON.stringify(loadedConfigPath)} instead of installed value ${JSON.stringify(expectedConfigPath)}; run \`pi-web restart\` to reload the managed LaunchAgents.`,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
return { ok: true, value: null };
|
|
221
|
+
}
|
|
222
|
+
function parseSystemdInspectionProperties(output) {
|
|
223
|
+
const properties = new Map();
|
|
224
|
+
const propertiesWithAmbiguousTrailingCarriageReturn = new Set();
|
|
225
|
+
for (const property of systemdInspectionProperties)
|
|
226
|
+
properties.set(property, []);
|
|
227
|
+
const records = output.split("\n");
|
|
228
|
+
for (let index = 0; index < records.length; index += 1) {
|
|
229
|
+
const record = records[index] ?? "";
|
|
230
|
+
const hasAmbiguousTrailingCarriageReturn = index < records.length - 1 && record.endsWith("\r");
|
|
231
|
+
const line = hasAmbiguousTrailingCarriageReturn ? record.slice(0, -1) : record;
|
|
232
|
+
if (line === "")
|
|
233
|
+
continue;
|
|
234
|
+
const separator = line.indexOf("=");
|
|
235
|
+
const name = line.slice(0, separator);
|
|
236
|
+
if (separator < 0 || !isSystemdInspectionProperty(name)) {
|
|
237
|
+
return { ok: false, message: "systemctl returned unrecognized unit metadata." };
|
|
238
|
+
}
|
|
239
|
+
properties.get(name)?.push(line.slice(separator + 1));
|
|
240
|
+
if (hasAmbiguousTrailingCarriageReturn)
|
|
241
|
+
propertiesWithAmbiguousTrailingCarriageReturn.add(name);
|
|
242
|
+
}
|
|
243
|
+
// systemctl's EnvironmentFiles formatter emits no line for an empty array,
|
|
244
|
+
// even with --all. The other scalar/array properties must always be present.
|
|
245
|
+
const requiredProperties = systemdInspectionProperties.filter((property) => property !== "EnvironmentFiles");
|
|
246
|
+
if (requiredProperties.some((property) => (properties.get(property)?.length ?? 0) === 0)) {
|
|
247
|
+
return { ok: false, message: "systemctl omitted required unit metadata." };
|
|
248
|
+
}
|
|
249
|
+
return {
|
|
250
|
+
ok: true,
|
|
251
|
+
value: { properties, propertiesWithAmbiguousTrailingCarriageReturn },
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
function singleSystemdProperty(properties, name) {
|
|
255
|
+
const values = properties.get(name);
|
|
256
|
+
return values?.length === 1 ? values[0] : undefined;
|
|
257
|
+
}
|
|
258
|
+
function isSystemdInspectionProperty(value) {
|
|
259
|
+
return systemdInspectionProperties.some((property) => property === value);
|
|
260
|
+
}
|
|
261
|
+
function inspectEffectiveSystemdEnvironment(source, systemctlValue, systemctlValueHasAmbiguousTrailingCarriageReturn, dependencies) {
|
|
262
|
+
const serialized = parseSystemdSerializedWords(systemctlValue);
|
|
263
|
+
const systemctlEnvironment = serialized === undefined
|
|
264
|
+
? undefined
|
|
265
|
+
: environmentFromAssignments(serialized.words);
|
|
266
|
+
if (serialized !== undefined
|
|
267
|
+
&& serialized.demonstrablyLossless
|
|
268
|
+
&& !systemctlValueHasAmbiguousTrailingCarriageReturn
|
|
269
|
+
&& !serialized.words.includes(legacySystemdUnprintableValue)
|
|
270
|
+
&& systemctlEnvironment !== undefined) {
|
|
271
|
+
return { ok: true, value: systemctlEnvironment };
|
|
272
|
+
}
|
|
273
|
+
// systemctl 239-245 redacts entries containing spaces or newlines, but can
|
|
274
|
+
// emit other shell-significant bytes raw. A raw quote can make parsing fail,
|
|
275
|
+
// while a raw backslash or tab can parse as a different set of assignments.
|
|
276
|
+
// A carriage return immediately before the record's line feed is ambiguous
|
|
277
|
+
// with CRLF framing. busctl reads the same manager property in a counted,
|
|
278
|
+
// C-escaped form without any of these ambiguities.
|
|
279
|
+
const captured = dependencies.capture("busctl", [
|
|
280
|
+
"--user",
|
|
281
|
+
"get-property",
|
|
282
|
+
systemdBusDestination,
|
|
283
|
+
systemdUnitObjectPath(source.systemdName),
|
|
284
|
+
`${systemdBusDestination}.Service`,
|
|
285
|
+
"Environment",
|
|
286
|
+
]);
|
|
287
|
+
const result = decodeCommandResult(captured);
|
|
288
|
+
if (result === undefined) {
|
|
289
|
+
return {
|
|
290
|
+
ok: false,
|
|
291
|
+
message: `Could not inspect effective systemd unit ${source.systemdName} losslessly: busctl output is not valid UTF-8.`,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
if (result.status !== 0) {
|
|
295
|
+
const detail = firstOutputLine(result.stderr, result.stdout);
|
|
296
|
+
const systemctlDetail = serialized?.words.includes(legacySystemdUnprintableValue) === true
|
|
297
|
+
? `systemctl returned ${legacySystemdUnprintableValue}`
|
|
298
|
+
: "systemctl returned an Environment value that was not demonstrably lossless";
|
|
299
|
+
return {
|
|
300
|
+
ok: false,
|
|
301
|
+
message: `Could not inspect effective systemd unit ${source.systemdName} losslessly: ${systemctlDetail}, and busctl exited with status ${String(result.status)}${detail === undefined ? "" : ` (${detail})`}.`,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
const assignments = parseBusctlStringArray(result.stdout);
|
|
305
|
+
if (assignments === undefined)
|
|
306
|
+
return unrecognizedSystemdEnvironment(source, "busctl");
|
|
307
|
+
const environment = environmentFromAssignments(assignments);
|
|
308
|
+
return environment === undefined
|
|
309
|
+
? unrecognizedSystemdEnvironment(source, "busctl")
|
|
310
|
+
: { ok: true, value: environment };
|
|
311
|
+
}
|
|
312
|
+
function unrecognizedSystemdEnvironment(source, command) {
|
|
313
|
+
return {
|
|
314
|
+
ok: false,
|
|
315
|
+
message: `Could not inspect effective systemd unit ${source.systemdName}: ${command} returned an unrecognized Environment value.`,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
function environmentFromAssignments(assignments) {
|
|
319
|
+
const environment = new Map();
|
|
320
|
+
for (const assignment of assignments) {
|
|
321
|
+
const separator = assignment.indexOf("=");
|
|
322
|
+
const key = assignment.slice(0, separator);
|
|
323
|
+
if (separator <= 0
|
|
324
|
+
|| !/^[A-Za-z_][A-Za-z0-9_]*$/u.test(key)
|
|
325
|
+
|| environment.has(key))
|
|
326
|
+
return undefined;
|
|
327
|
+
environment.set(key, assignment.slice(separator + 1));
|
|
328
|
+
}
|
|
329
|
+
return Object.fromEntries(environment);
|
|
330
|
+
}
|
|
331
|
+
function parseBusctlStringArray(output) {
|
|
332
|
+
// busctl's terse array format is `as <count> "<C-escaped value>" ...`.
|
|
333
|
+
let line = output;
|
|
334
|
+
if (line.endsWith("\r\n"))
|
|
335
|
+
line = line.slice(0, -2);
|
|
336
|
+
else if (line.endsWith("\n"))
|
|
337
|
+
line = line.slice(0, -1);
|
|
338
|
+
if (line.includes("\r") || line.includes("\n"))
|
|
339
|
+
return undefined;
|
|
340
|
+
const header = /^as (0|[1-9][0-9]*)(.*)$/u.exec(line);
|
|
341
|
+
if (header === null)
|
|
342
|
+
return undefined;
|
|
343
|
+
const count = Number(header[1]);
|
|
344
|
+
if (!Number.isSafeInteger(count))
|
|
345
|
+
return undefined;
|
|
346
|
+
const serializedWords = header[2] ?? "";
|
|
347
|
+
const words = [];
|
|
348
|
+
let offset = 0;
|
|
349
|
+
while (offset < serializedWords.length) {
|
|
350
|
+
if (serializedWords[offset] !== " " || serializedWords[offset + 1] !== "\"")
|
|
351
|
+
return undefined;
|
|
352
|
+
const parsed = systemdQuotedWord(serializedWords, offset + 1, "\"");
|
|
353
|
+
if (parsed === undefined)
|
|
354
|
+
return undefined;
|
|
355
|
+
const decoded = decodeSystemdEscapes(parsed.raw);
|
|
356
|
+
if (decoded === undefined)
|
|
357
|
+
return undefined;
|
|
358
|
+
words.push(decoded);
|
|
359
|
+
offset = parsed.nextOffset;
|
|
360
|
+
}
|
|
361
|
+
return words.length === count ? words : undefined;
|
|
362
|
+
}
|
|
363
|
+
function systemdUnitObjectPath(unitName) {
|
|
364
|
+
// Mirror systemd's stable bus_label_escape() byte encoding for unit objects.
|
|
365
|
+
let label = "";
|
|
366
|
+
let index = 0;
|
|
367
|
+
for (const byte of new TextEncoder().encode(unitName)) {
|
|
368
|
+
const isAsciiLetter = (byte >= 0x41 && byte <= 0x5a) || (byte >= 0x61 && byte <= 0x7a);
|
|
369
|
+
const isNoninitialDigit = index > 0 && byte >= 0x30 && byte <= 0x39;
|
|
370
|
+
label += isAsciiLetter || isNoninitialDigit
|
|
371
|
+
? String.fromCharCode(byte)
|
|
372
|
+
: `_${byte.toString(16).padStart(2, "0")}`;
|
|
373
|
+
index += 1;
|
|
374
|
+
}
|
|
375
|
+
return `${systemdUnitObjectPathPrefix}${label === "" ? "_" : label}`;
|
|
376
|
+
}
|
|
377
|
+
function parseSystemdSerializedWords(value) {
|
|
378
|
+
const words = [];
|
|
379
|
+
let demonstrablyLossless = true;
|
|
380
|
+
let offset = 0;
|
|
381
|
+
while (offset < value.length) {
|
|
382
|
+
while (value[offset] === " " || value[offset] === "\t") {
|
|
383
|
+
if (value[offset] === "\t")
|
|
384
|
+
demonstrablyLossless = false;
|
|
385
|
+
offset += 1;
|
|
386
|
+
}
|
|
387
|
+
if (offset >= value.length)
|
|
388
|
+
break;
|
|
389
|
+
let raw;
|
|
390
|
+
let decodeEscapes = true;
|
|
391
|
+
const first = value[offset];
|
|
392
|
+
if (first === '"' || first === "'") {
|
|
393
|
+
const parsed = systemdQuotedWord(value, offset, first);
|
|
394
|
+
if (parsed === undefined)
|
|
395
|
+
return undefined;
|
|
396
|
+
raw = parsed.raw;
|
|
397
|
+
offset = parsed.nextOffset;
|
|
398
|
+
decodeEscapes = first === '"';
|
|
399
|
+
}
|
|
400
|
+
else if (first === "$" && value[offset + 1] === "'") {
|
|
401
|
+
const parsed = systemdQuotedWord(value, offset + 1, "'");
|
|
402
|
+
if (parsed === undefined)
|
|
403
|
+
return undefined;
|
|
404
|
+
raw = parsed.raw;
|
|
405
|
+
offset = parsed.nextOffset;
|
|
406
|
+
}
|
|
407
|
+
else {
|
|
408
|
+
const start = offset;
|
|
409
|
+
while (offset < value.length && value[offset] !== " " && value[offset] !== "\t")
|
|
410
|
+
offset += 1;
|
|
411
|
+
raw = value.slice(start, offset);
|
|
412
|
+
if (raw.includes('"') || raw.includes("'"))
|
|
413
|
+
return undefined;
|
|
414
|
+
if (raw.includes("\\"))
|
|
415
|
+
demonstrablyLossless = false;
|
|
416
|
+
}
|
|
417
|
+
if (offset < value.length && value[offset] !== " " && value[offset] !== "\t")
|
|
418
|
+
return undefined;
|
|
419
|
+
const decoded = decodeEscapes ? decodeSystemdPrintedEscapes(raw) : raw;
|
|
420
|
+
if (decoded === undefined || decoded.includes("\u0000"))
|
|
421
|
+
return undefined;
|
|
422
|
+
words.push(decoded);
|
|
423
|
+
}
|
|
424
|
+
return { words, demonstrablyLossless };
|
|
425
|
+
}
|
|
426
|
+
function decodeSystemdPrintedEscapes(value) {
|
|
427
|
+
// systemctl serializes string arrays with shell_maybe_quote(), whose
|
|
428
|
+
// double-quoted form additionally escapes shell-significant $ and `.
|
|
429
|
+
return decodeSystemdEscapes(value.replaceAll("\\$", "$").replaceAll("\\`", "`"));
|
|
430
|
+
}
|
|
431
|
+
function systemdQuotedWord(value, quoteOffset, quote) {
|
|
432
|
+
let escaped = false;
|
|
433
|
+
for (let offset = quoteOffset + 1; offset < value.length; offset += 1) {
|
|
434
|
+
const character = value[offset];
|
|
435
|
+
if (quote === '"' || value[quoteOffset - 1] === "$") {
|
|
436
|
+
if (escaped) {
|
|
437
|
+
escaped = false;
|
|
438
|
+
continue;
|
|
439
|
+
}
|
|
440
|
+
if (character === "\\") {
|
|
441
|
+
escaped = true;
|
|
442
|
+
continue;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
if (character === quote) {
|
|
446
|
+
return { raw: value.slice(quoteOffset + 1, offset), nextOffset: offset + 1 };
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
return undefined;
|
|
450
|
+
}
|
|
451
|
+
function parseLaunchdPrintDefinition(output, expectedTarget) {
|
|
452
|
+
const root = parseLaunchdPrintDocument(output, expectedTarget);
|
|
453
|
+
if (root === undefined)
|
|
454
|
+
return undefined;
|
|
455
|
+
const pathPrefix = "path = ";
|
|
456
|
+
const paths = root.records.flatMap((record) => (record.kind === "scalar" && record.value.startsWith(pathPrefix)
|
|
457
|
+
? [record.value.slice(pathPrefix.length)]
|
|
458
|
+
: []));
|
|
459
|
+
const environments = root.records.flatMap((record) => (record.kind === "group" && record.value.name === "environment"
|
|
460
|
+
? [record.value]
|
|
461
|
+
: []));
|
|
462
|
+
if (paths.length !== 1 || paths[0] === "" || environments.length !== 1)
|
|
463
|
+
return undefined;
|
|
464
|
+
const environment = parseLaunchdPrintEnvironment(environments[0]?.records ?? []);
|
|
465
|
+
return environment === undefined
|
|
466
|
+
? undefined
|
|
467
|
+
: { path: paths[0] ?? "", environment };
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Parse launchctl's complete, tab-indented service representation. Its scalar
|
|
471
|
+
* records are LF-framed, so a carriage return is indistinguishable from
|
|
472
|
+
* transport framing when it follows a scalar value; reject any such output
|
|
473
|
+
* rather than silently changing a path or environment value.
|
|
474
|
+
*/
|
|
475
|
+
function parseLaunchdPrintDocument(output, expectedTarget) {
|
|
476
|
+
if (output.includes("\r") || output.includes("\u0000"))
|
|
477
|
+
return undefined;
|
|
478
|
+
const lines = output.split("\n");
|
|
479
|
+
if (lines.at(-1) === "")
|
|
480
|
+
lines.pop();
|
|
481
|
+
if (lines[0] !== `${expectedTarget} = {`)
|
|
482
|
+
return undefined;
|
|
483
|
+
const root = { name: expectedTarget, records: [] };
|
|
484
|
+
const stack = [root];
|
|
485
|
+
for (let index = 1; index < lines.length; index += 1) {
|
|
486
|
+
const line = lines[index] ?? "";
|
|
487
|
+
const depth = stack.length;
|
|
488
|
+
const closingIndent = "\t".repeat(depth - 1);
|
|
489
|
+
if (line === `${closingIndent}}`) {
|
|
490
|
+
stack.pop();
|
|
491
|
+
if (stack.length === 0)
|
|
492
|
+
return index === lines.length - 1 ? root : undefined;
|
|
493
|
+
continue;
|
|
494
|
+
}
|
|
495
|
+
if (line === "")
|
|
496
|
+
continue;
|
|
497
|
+
const recordIndent = "\t".repeat(depth);
|
|
498
|
+
if (!line.startsWith(recordIndent) || line.startsWith(`${recordIndent}\t`))
|
|
499
|
+
return undefined;
|
|
500
|
+
const value = line.slice(recordIndent.length);
|
|
501
|
+
if (value === "")
|
|
502
|
+
return undefined;
|
|
503
|
+
const current = stack.at(-1);
|
|
504
|
+
if (current === undefined)
|
|
505
|
+
return undefined;
|
|
506
|
+
const groupName = launchdPrintGroupName(value);
|
|
507
|
+
if (groupName === undefined || !launchdPrintRecordHasGroupBody(lines, index, depth)) {
|
|
508
|
+
if (value === "}")
|
|
509
|
+
return undefined;
|
|
510
|
+
current.records.push({ kind: "scalar", value });
|
|
511
|
+
continue;
|
|
512
|
+
}
|
|
513
|
+
const group = { name: groupName, records: [] };
|
|
514
|
+
current.records.push({ kind: "group", value: group });
|
|
515
|
+
stack.push(group);
|
|
516
|
+
}
|
|
517
|
+
return undefined;
|
|
518
|
+
}
|
|
519
|
+
function launchdPrintGroupName(value) {
|
|
520
|
+
const suffix = " = {";
|
|
521
|
+
if (!value.endsWith(suffix))
|
|
522
|
+
return undefined;
|
|
523
|
+
const name = value.slice(0, -suffix.length);
|
|
524
|
+
return name === "" || name.includes("\t") ? undefined : name;
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* launchctl does not quote scalar values, so a scalar may itself end in the
|
|
528
|
+
* group-opening marker. A real group is distinguishable by the next nonblank
|
|
529
|
+
* record: it is either a child one indentation level deeper or that group's
|
|
530
|
+
* closing brace. The enclosing group's sibling or closing brace instead makes
|
|
531
|
+
* the marker part of the scalar value.
|
|
532
|
+
*/
|
|
533
|
+
function launchdPrintRecordHasGroupBody(lines, recordIndex, depth) {
|
|
534
|
+
let nextIndex = recordIndex + 1;
|
|
535
|
+
while (lines[nextIndex] === "")
|
|
536
|
+
nextIndex += 1;
|
|
537
|
+
const nextLine = lines[nextIndex];
|
|
538
|
+
if (nextLine === undefined)
|
|
539
|
+
return false;
|
|
540
|
+
const groupIndent = "\t".repeat(depth);
|
|
541
|
+
if (nextLine === `${groupIndent}}`)
|
|
542
|
+
return true;
|
|
543
|
+
const childIndent = `${groupIndent}\t`;
|
|
544
|
+
return nextLine.startsWith(childIndent) && !nextLine.startsWith(`${childIndent}\t`);
|
|
545
|
+
}
|
|
546
|
+
function parseLaunchdPrintEnvironment(records) {
|
|
547
|
+
const environment = new Map();
|
|
548
|
+
const separator = " => ";
|
|
549
|
+
for (const record of records) {
|
|
550
|
+
if (record.kind !== "scalar")
|
|
551
|
+
return undefined;
|
|
552
|
+
const separatorOffset = record.value.indexOf(separator);
|
|
553
|
+
const key = record.value.slice(0, separatorOffset);
|
|
554
|
+
if (separatorOffset <= 0
|
|
555
|
+
|| !/^[A-Za-z_][A-Za-z0-9_]*$/u.test(key)
|
|
556
|
+
|| environment.has(key))
|
|
557
|
+
return undefined;
|
|
558
|
+
environment.set(key, record.value.slice(separatorOffset + separator.length));
|
|
559
|
+
}
|
|
560
|
+
return Object.fromEntries(environment);
|
|
561
|
+
}
|
|
562
|
+
function decodeCommandResult(result) {
|
|
563
|
+
let stdout;
|
|
564
|
+
let stderr;
|
|
565
|
+
try {
|
|
566
|
+
stdout = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(result.stdout);
|
|
567
|
+
stderr = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(result.stderr);
|
|
568
|
+
}
|
|
569
|
+
catch {
|
|
570
|
+
return undefined;
|
|
571
|
+
}
|
|
572
|
+
return {
|
|
573
|
+
status: result.status,
|
|
574
|
+
stdout,
|
|
575
|
+
stderr: stderr === "" ? result.spawnError : stderr,
|
|
576
|
+
};
|
|
577
|
+
}
|
|
578
|
+
function launchdServiceIsMissing(result) {
|
|
579
|
+
const output = `${result.stderr}\n${result.stdout}`;
|
|
580
|
+
return /could not find (?:specified )?service|service (?:was )?not found/iu.test(output);
|
|
581
|
+
}
|
|
582
|
+
function recordsEqual(first, second) {
|
|
583
|
+
const firstEntries = Object.entries(first);
|
|
584
|
+
const secondEntries = Object.entries(second);
|
|
585
|
+
return firstEntries.length === secondEntries.length
|
|
586
|
+
&& firstEntries.every(([key, value]) => Object.hasOwn(second, key) && second[key] === value);
|
|
587
|
+
}
|
|
588
|
+
function definitionLabel(backend, id) {
|
|
589
|
+
return backend.kind === "systemd" ? `${id} systemd unit` : `${id} LaunchAgent`;
|
|
590
|
+
}
|
|
591
|
+
function firstOutputLine(...values) {
|
|
592
|
+
for (const value of values) {
|
|
593
|
+
const line = value.trim().split("\n").find((candidate) => candidate.trim() !== "");
|
|
594
|
+
if (line !== undefined)
|
|
595
|
+
return line.trim();
|
|
596
|
+
}
|
|
597
|
+
return undefined;
|
|
598
|
+
}
|
|
599
|
+
function errorMessage(error) {
|
|
600
|
+
return error instanceof Error ? error.message : String(error);
|
|
601
|
+
}
|
|
602
|
+
//# sourceMappingURL=installedServiceDefinitions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installedServiceDefinitions.js","sourceRoot":"","sources":["../../src/nativeServices/installedServiceDefinitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EACL,oBAAoB,EACpB,kDAAkD,GAGnD,MAAM,oBAAoB,CAAC;AA+B5B,MAAM,2BAA2B,GAAG;IAClC,WAAW;IACX,cAAc;IACd,aAAa;IACb,kBAAkB;IAClB,kBAAkB;IAClB,aAAa;CACL,CAAC;AAEX,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AACzD,MAAM,2BAA2B,GAAG,iCAAiC,CAAC;AACtE,MAAM,6BAA6B,GAAG,eAAe,CAAC;AAItD;;;;;;;;;GASG;AACH,MAAM,UAAU,wCAAwC,CACtD,OAA6B,EAC7B,OAA0D,EAC1D,YAA0D,EAC1D,OAAgD;IAEhD,MAAM,WAAW,GAAuC,EAAE,CAAC;IAC3D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,KAAiB,CAAC;QACtB,IAAI,CAAC;YACH,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,4BAA4B,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,KAAK,CAAC,EAAE;aAClH,CAAC;QACJ,CAAC;QAED,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,aAAa,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,sBAAsB;aAC/F,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAW,CAAC;QACxD,MAAM,WAAW,GAAG,kDAAkD,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC5F,IAAI,CAAC,WAAW,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC;QAExC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,iBAAiB,GAAG,iCAAiC,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YACrG,IAAI,CAAC,iBAAiB,CAAC,EAAE;gBAAE,OAAO,iBAAiB,CAAC;QACtD,CAAC;aAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,iBAAiB,GAAG,8BAA8B,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YAClG,IAAI,CAAC,iBAAiB,CAAC,EAAE;gBAAE,OAAO,iBAAiB,CAAC;QACtD,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,iCAAiC,CACxC,MAA8C,EAC9C,mBAAqD,EACrD,YAA0D;IAE1D,MAAM,IAAI,GAAG;QACX,QAAQ;QACR,YAAY;QACZ,MAAM;QACN,MAAM,CAAC,WAAW;QAClB,OAAO;QACP,GAAG,2BAA2B,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,cAAc,QAAQ,EAAE,CAAC;KAC3E,CAAC;IACF,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,4CAA4C,MAAM,CAAC,WAAW,wCAAwC;SAChH,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7D,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,4CAA4C,MAAM,CAAC,WAAW,kCAAkC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,GAAG;SAC/K,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,gCAAgC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,4CAA4C,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,OAAO,EAAE;SAC7F,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAC9E,MAAM,YAAY,GAAG,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACpF,MAAM,WAAW,GAAG,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAClF,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAC5F,MAAM,yBAAyB,GAAG,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAChG,IACE,SAAS,KAAK,SAAS;WACpB,YAAY,KAAK,SAAS;WAC1B,WAAW,KAAK,SAAS;WACzB,gBAAgB,KAAK,SAAS;WAC9B,yBAAyB,KAAK,SAAS,EAC1C,CAAC;QACD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,4CAA4C,MAAM,CAAC,WAAW,6DAA6D;SACrI,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,gBAAgB,MAAM,CAAC,WAAW,mBAAmB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,uBAAuB;SAC/G,CAAC;IACJ,CAAC;IACD,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;QAC9B,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,gBAAgB,KAAK,KAAK;gBACjC,CAAC,CAAC,gBAAgB,MAAM,CAAC,WAAW,iFAAiF;gBACrH,CAAC,CAAC,gBAAgB,MAAM,CAAC,WAAW,0CAA0C,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG;SACpH,CAAC;IACJ,CAAC;IACD,IAAI,WAAW,KAAK,EAAE,EAAE,CAAC;QACvB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,gBAAgB,MAAM,CAAC,WAAW,6BAA6B,WAAW,0EAA0E;SAC9J,CAAC;IACJ,CAAC;IACD,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;IAC/E,MAAM,0BAA0B,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IACpF,IAAI,0BAA0B,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,gBAAgB,MAAM,CAAC,WAAW,iCAAiC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,8DAA8D;SAChL,CAAC;IACJ,CAAC;IAED,IAAI,kBAA0B,CAAC;IAC/B,IAAI,oBAA4B,CAAC;IACjC,IAAI,CAAC;QACH,kBAAkB,GAAG,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACzD,oBAAoB,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,sCAAsC,YAAY,8BAA8B,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,KAAK,CAAC,EAAE;SAC/H,CAAC;IACJ,CAAC;IACD,IAAI,kBAAkB,KAAK,oBAAoB,EAAE,CAAC;QAChD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,kBAAkB,MAAM,CAAC,WAAW,SAAS,YAAY,+CAA+C,MAAM,CAAC,IAAI,GAAG;SAChI,CAAC;IACJ,CAAC;IAED,MAAM,oBAAoB,GAAG,kCAAkC,CAC7D,MAAM,EACN,yBAAyB,EACzB,MAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,GAAG,CAAC,aAAa,CAAC,EAC7E,YAAY,CACb,CAAC;IACF,IAAI,CAAC,oBAAoB,CAAC,EAAE;QAAE,OAAO,oBAAoB,CAAC;IAC1D,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,CAAC,EAAE,CAAC;QACnE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,gBAAgB,MAAM,CAAC,WAAW,wEAAwE,MAAM,CAAC,IAAI,+FAA+F;SAC9N,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,8BAA8B,CACrC,MAA8C,EAC9C,mBAAqD,EACrD,YAA0D;IAE1D,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,wCAAwC,MAAM,CAAC,aAAa,wCAAwC;SAC9G,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,IAAI,uBAAuB,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACtE,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7D,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,wCAAwC,MAAM,CAAC,aAAa,kCAAkC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,GAAG;SAC7K,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,2BAA2B,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IAChF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,wCAAwC,MAAM,CAAC,aAAa,0DAA0D;SAChI,CAAC;IACJ,CAAC;IAED,IAAI,eAAuB,CAAC;IAC5B,IAAI,iBAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,eAAe,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrD,iBAAiB,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,8CAA8C,MAAM,CAAC,IAAI,8BAA8B,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,KAAK,CAAC,EAAE;SACtI,CAAC;IACJ,CAAC;IACD,IAAI,eAAe,KAAK,iBAAiB,EAAE,CAAC;QAC1C,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,kBAAkB,MAAM,CAAC,aAAa,SAAS,MAAM,CAAC,IAAI,+CAA+C,MAAM,CAAC,IAAI,8DAA8D;SAC5L,CAAC;IACJ,CAAC;IAED,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;IACrF,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,MAAM,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAClF,IAAI,gBAAgB,KAAK,kBAAkB,EAAE,CAAC;QAC5C,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,sBAAsB,MAAM,CAAC,aAAa,sBAAsB,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,8DAA8D;SACzO,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC;AAOD,SAAS,gCAAgC,CACvC,MAAc;IAEd,MAAM,UAAU,GAAG,IAAI,GAAG,EAAuC,CAAC;IAClE,MAAM,6CAA6C,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC3F,KAAK,MAAM,QAAQ,IAAI,2BAA2B;QAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAEjF,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,kCAAkC,GAAG,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/F,MAAM,IAAI,GAAG,kCAAkC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC/E,IAAI,IAAI,KAAK,EAAE;YAAE,SAAS;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACtC,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,gDAAgD,EAAE,CAAC;QAClF,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;QACtD,IAAI,kCAAkC;YAAE,6CAA6C,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClG,CAAC;IACD,2EAA2E;IAC3E,6EAA6E;IAC7E,MAAM,kBAAkB,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,kBAAkB,CAAC,CAAC;IAC7G,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACzF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,2CAA2C,EAAE,CAAC;IAC7E,CAAC;IACD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,EAAE,UAAU,EAAE,6CAA6C,EAAE;KACrE,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,UAAqE,EACrE,IAA4D;IAE5D,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,MAAM,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAa;IAChD,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,kCAAkC,CACzC,MAA8C,EAC9C,cAAsB,EACtB,gDAAyD,EACzD,YAA0D;IAE1D,MAAM,UAAU,GAAG,2BAA2B,CAAC,cAAc,CAAC,CAAC;IAC/D,MAAM,oBAAoB,GAAG,UAAU,KAAK,SAAS;QACnD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,0BAA0B,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACjD,IACE,UAAU,KAAK,SAAS;WACrB,UAAU,CAAC,oBAAoB;WAC/B,CAAC,gDAAgD;WACjD,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,6BAA6B,CAAC;WACzD,oBAAoB,KAAK,SAAS,EACrC,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IACnD,CAAC;IAED,2EAA2E;IAC3E,6EAA6E;IAC7E,4EAA4E;IAC5E,2EAA2E;IAC3E,0EAA0E;IAC1E,mDAAmD;IACnD,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE;QAC9C,QAAQ;QACR,cAAc;QACd,qBAAqB;QACrB,qBAAqB,CAAC,MAAM,CAAC,WAAW,CAAC;QACzC,GAAG,qBAAqB,UAAU;QAClC,aAAa;KACd,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,4CAA4C,MAAM,CAAC,WAAW,gDAAgD;SACxH,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7D,MAAM,eAAe,GAAG,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,6BAA6B,CAAC,KAAK,IAAI;YACxF,CAAC,CAAC,sBAAsB,6BAA6B,EAAE;YACvD,CAAC,CAAC,4EAA4E,CAAC;QACjF,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,4CAA4C,MAAM,CAAC,WAAW,gBAAgB,eAAe,mCAAmC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,GAAG;SAC/M,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,8BAA8B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvF,MAAM,WAAW,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAC;IAC5D,OAAO,WAAW,KAAK,SAAS;QAC9B,CAAC,CAAC,8BAA8B,CAAC,MAAM,EAAE,QAAQ,CAAC;QAClD,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,8BAA8B,CACrC,MAA8C,EAC9C,OAA+B;IAE/B,OAAO;QACL,EAAE,EAAE,KAAK;QACT,OAAO,EAAE,4CAA4C,MAAM,CAAC,WAAW,KAAK,OAAO,8CAA8C;KAClI,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B,CAAC,WAA8B;IAChE,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC3C,IACE,SAAS,IAAI,CAAC;eACX,CAAC,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC;eACtC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAc;IAC5C,uEAAuE;IACvE,IAAI,IAAI,GAAG,MAAM,CAAC;IAClB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SAC/C,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAEjE,MAAM,MAAM,GAAG,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAEnD,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC;QACvC,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI;YAAE,OAAO,SAAS,CAAC;QAC9F,MAAM,MAAM,GAAG,iBAAiB,CAAC,eAAe,EAAE,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACpE,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC3C,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;IAC7B,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAgB;IAC7C,6EAA6E;IAC7E,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,MAAM,aAAa,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC;QACvF,MAAM,iBAAiB,GAAG,KAAK,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC;QACpE,KAAK,IAAI,aAAa,IAAI,iBAAiB;YACzC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC;YAC3B,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAC7C,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IACD,OAAO,GAAG,2BAA2B,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;AACvE,CAAC;AAOD,SAAS,2BAA2B,CAAC,KAAa;IAChD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,oBAAoB,GAAG,IAAI,CAAC;IAChC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;YACvD,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI;gBAAE,oBAAoB,GAAG,KAAK,CAAC;YACzD,MAAM,IAAI,CAAC,CAAC;QACd,CAAC;QACD,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM;YAAE,MAAM;QAElC,IAAI,GAAW,CAAC;QAChB,IAAI,aAAa,GAAG,IAAI,CAAC;QACzB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACvD,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC3C,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;YACjB,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;YAC3B,aAAa,GAAG,KAAK,KAAK,GAAG,CAAC;QAChC,CAAC;aAAM,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACtD,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;YACzD,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC3C,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;YACjB,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,MAAM,CAAC;YACrB,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI;gBAAE,MAAM,IAAI,CAAC,CAAC;YAC7F,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACjC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC7D,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,oBAAoB,GAAG,KAAK,CAAC;QACvD,CAAC;QAED,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI;YAAE,OAAO,SAAS,CAAC;QAC/F,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACvE,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,SAAS,CAAC;QAC1E,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAa;IAChD,qEAAqE;IACrE,qEAAqE;IACrE,OAAO,oBAAoB,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,iBAAiB,CACxB,KAAa,EACb,WAAmB,EACnB,KAAgB;IAEhB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,IAAI,MAAM,GAAG,WAAW,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;QACtE,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACpD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,GAAG,KAAK,CAAC;gBAChB,SAAS;YACX,CAAC;YACD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBACvB,OAAO,GAAG,IAAI,CAAC;gBACf,SAAS;YACX,CAAC;QACH,CAAC;QACD,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YACxB,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/E,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAgBD,SAAS,2BAA2B,CAClC,MAAc,EACd,cAAsB;IAEtB,MAAM,IAAI,GAAG,yBAAyB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC/D,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAEzC,MAAM,UAAU,GAAG,SAAS,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC7C,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC;QAC7D,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC,CAAC,EAAE,CACP,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACpD,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa;QAC5D,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAChB,CAAC,CAAC,EAAE,CACP,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAEzF,MAAM,WAAW,GAAG,4BAA4B,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IACjF,OAAO,WAAW,KAAK,SAAS;QAC9B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC;AAC5C,CAAC;AAED;;;;;GAKG;AACH,SAAS,yBAAyB,CAAC,MAAc,EAAE,cAAsB;IACvE,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IACzE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;QAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IACrC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,cAAc,MAAM;QAAE,OAAO,SAAS,CAAC;IAE3D,MAAM,IAAI,GAAsB,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACtE,MAAM,KAAK,GAAwB,CAAC,IAAI,CAAC,CAAC;IAC1C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7C,IAAI,IAAI,KAAK,GAAG,aAAa,GAAG,EAAE,CAAC;YACjC,KAAK,CAAC,GAAG,EAAE,CAAC;YACZ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7E,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,EAAE;YAAE,SAAS;QAE1B,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,YAAY,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QAC7F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,KAAK,KAAK,EAAE;YAAE,OAAO,SAAS,CAAC;QAEnC,MAAM,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC5C,MAAM,SAAS,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,8BAA8B,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YACpF,IAAI,KAAK,KAAK,GAAG;gBAAE,OAAO,SAAS,CAAC;YACpC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YAChD,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAsB,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAClE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa;IAC1C,MAAM,MAAM,GAAG,MAAM,CAAC;IACtB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED;;;;;;GAMG;AACH,SAAS,8BAA8B,CACrC,KAAwB,EACxB,WAAmB,EACnB,KAAa;IAEb,IAAI,SAAS,GAAG,WAAW,GAAG,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE;QAAE,SAAS,IAAI,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAEzC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,QAAQ,KAAK,GAAG,WAAW,GAAG;QAAE,OAAO,IAAI,CAAC;IAChD,MAAM,WAAW,GAAG,GAAG,WAAW,IAAI,CAAC;IACvC,OAAO,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,WAAW,IAAI,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,4BAA4B,CACnC,OAAsC;IAEtC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,MAAM,SAAS,GAAG,MAAM,CAAC;IACzB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC/C,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;QACnD,IACE,eAAe,IAAI,CAAC;eACjB,CAAC,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC;eACtC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAAqD;IAErD,IAAI,MAAc,CAAC;IACnB,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1F,MAAM,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM;QACN,MAAM,EAAE,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;KACnD,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,MAA4D;IAC3F,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;IACpD,OAAO,oEAAoE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC3F,CAAC;AAED,SAAS,YAAY,CACnB,KAAuC,EACvC,MAAwC;IAExC,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO,YAAY,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM;WAC9C,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC;AACjG,CAAC;AAED,SAAS,eAAe,CAAC,OAA6B,EAAE,EAAmB;IACzE,OAAO,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC;AACjF,CAAC;AAED,SAAS,eAAe,CAAC,GAAG,MAAyB;IACnD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACnF,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IAC7C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
|