@cartanova/qgrid-cli 2.4.8 → 2.4.9
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/README.ko.md +18 -11
- package/README.md +18 -11
- package/bundle/.env +0 -0
- package/bundle/dist/_virtual/{_@oxc-project_runtime@0.122.0/helpers → _@oxc-project_runtime@0.140.0/helpers/esm}/decorate.js +2 -2
- package/bundle/dist/_virtual/{_@oxc-project_runtime@0.122.0/helpers → _@oxc-project_runtime@0.140.0/helpers/esm}/decorateMetadata.js +2 -2
- package/bundle/dist/_virtual/_rolldown/runtime.js +2 -3
- package/bundle/dist/application/monit/log-buffer.js +3 -2
- package/bundle/dist/application/monit/monit.frame.js +5 -6
- package/bundle/dist/application/monit/monit.types.js +1 -2
- package/bundle/dist/application/qgrid/conv-routing.js +1 -2
- package/bundle/dist/application/qgrid/oauth.js +1 -2
- package/bundle/dist/application/qgrid/qgrid-image-generation.js +1 -2
- package/bundle/dist/application/qgrid/qgrid-response-format.js +1 -2
- package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +76 -47
- package/bundle/dist/application/qgrid/qgrid.dispatcher.js +1 -2
- package/bundle/dist/application/qgrid/qgrid.frame.js +73 -97
- package/bundle/dist/application/qgrid/qgrid.types.js +11 -10
- package/bundle/dist/application/qgrid/token-subscriber.js +3 -2
- package/bundle/dist/application/qgrid/token-trigger-setup.js +1 -2
- package/bundle/dist/application/qgrid/tool-emulation.js +1 -2
- package/bundle/dist/application/queries.generated.js +1 -2
- package/bundle/dist/application/request-log/request-log.model.js +116 -47
- package/bundle/dist/application/request-log/request-log.types.js +1 -2
- package/bundle/dist/application/request-log-step/request-log-step.model.js +3 -4
- package/bundle/dist/application/request-log-step/request-log-step.types.js +1 -2
- package/bundle/dist/application/sonamu.generated.js +14 -15
- package/bundle/dist/application/sonamu.generated.sso.js +1 -2
- package/bundle/dist/application/token/token.model.js +3 -4
- package/bundle/dist/application/token/token.types.js +1 -2
- package/bundle/dist/codex-protocol/AbsolutePathBuf.js +0 -1
- package/bundle/dist/codex-protocol/AgentPath.js +0 -1
- package/bundle/dist/codex-protocol/ApplyPatchApprovalParams.js +0 -1
- package/bundle/dist/codex-protocol/ApplyPatchApprovalResponse.js +0 -1
- package/bundle/dist/codex-protocol/AuthMode.js +0 -1
- package/bundle/dist/codex-protocol/ClientInfo.js +0 -1
- package/bundle/dist/codex-protocol/ClientNotification.js +0 -1
- package/bundle/dist/codex-protocol/ClientRequest.js +0 -1
- package/bundle/dist/codex-protocol/CollaborationMode.js +0 -1
- package/bundle/dist/codex-protocol/ContentItem.js +0 -1
- package/bundle/dist/codex-protocol/ConversationGitInfo.js +0 -1
- package/bundle/dist/codex-protocol/ConversationSummary.js +0 -1
- package/bundle/dist/codex-protocol/ExecCommandApprovalParams.js +0 -1
- package/bundle/dist/codex-protocol/ExecCommandApprovalResponse.js +0 -1
- package/bundle/dist/codex-protocol/ExecPolicyAmendment.js +0 -1
- package/bundle/dist/codex-protocol/FileChange.js +0 -1
- package/bundle/dist/codex-protocol/ForcedLoginMethod.js +0 -1
- package/bundle/dist/codex-protocol/FunctionCallOutputBody.js +0 -1
- package/bundle/dist/codex-protocol/FunctionCallOutputContentItem.js +0 -1
- package/bundle/dist/codex-protocol/FuzzyFileSearchMatchType.js +0 -1
- package/bundle/dist/codex-protocol/FuzzyFileSearchParams.js +0 -1
- package/bundle/dist/codex-protocol/FuzzyFileSearchResponse.js +0 -1
- package/bundle/dist/codex-protocol/FuzzyFileSearchResult.js +0 -1
- package/bundle/dist/codex-protocol/FuzzyFileSearchSessionCompletedNotification.js +0 -1
- package/bundle/dist/codex-protocol/FuzzyFileSearchSessionUpdatedNotification.js +0 -1
- package/bundle/dist/codex-protocol/GetAuthStatusParams.js +0 -1
- package/bundle/dist/codex-protocol/GetAuthStatusResponse.js +0 -1
- package/bundle/dist/codex-protocol/GetConversationSummaryParams.js +0 -1
- package/bundle/dist/codex-protocol/GetConversationSummaryResponse.js +0 -1
- package/bundle/dist/codex-protocol/GitDiffToRemoteParams.js +0 -1
- package/bundle/dist/codex-protocol/GitDiffToRemoteResponse.js +0 -1
- package/bundle/dist/codex-protocol/GitSha.js +0 -1
- package/bundle/dist/codex-protocol/ImageDetail.js +0 -1
- package/bundle/dist/codex-protocol/InitializeCapabilities.js +0 -1
- package/bundle/dist/codex-protocol/InitializeParams.js +0 -1
- package/bundle/dist/codex-protocol/InitializeResponse.js +0 -1
- package/bundle/dist/codex-protocol/InputModality.js +0 -1
- package/bundle/dist/codex-protocol/InternalSessionSource.js +0 -1
- package/bundle/dist/codex-protocol/LocalShellAction.js +0 -1
- package/bundle/dist/codex-protocol/LocalShellExecAction.js +0 -1
- package/bundle/dist/codex-protocol/LocalShellStatus.js +0 -1
- package/bundle/dist/codex-protocol/MessagePhase.js +0 -1
- package/bundle/dist/codex-protocol/ModeKind.js +0 -1
- package/bundle/dist/codex-protocol/NetworkPolicyAmendment.js +0 -1
- package/bundle/dist/codex-protocol/NetworkPolicyRuleAction.js +0 -1
- package/bundle/dist/codex-protocol/ParsedCommand.js +0 -1
- package/bundle/dist/codex-protocol/Personality.js +0 -1
- package/bundle/dist/codex-protocol/PlanType.js +0 -1
- package/bundle/dist/codex-protocol/RealtimeConversationVersion.js +0 -1
- package/bundle/dist/codex-protocol/RealtimeOutputModality.js +0 -1
- package/bundle/dist/codex-protocol/RealtimeVoice.js +0 -1
- package/bundle/dist/codex-protocol/RealtimeVoicesList.js +0 -1
- package/bundle/dist/codex-protocol/ReasoningEffort.js +0 -1
- package/bundle/dist/codex-protocol/ReasoningItemContent.js +0 -1
- package/bundle/dist/codex-protocol/ReasoningItemReasoningSummary.js +0 -1
- package/bundle/dist/codex-protocol/ReasoningSummary.js +0 -1
- package/bundle/dist/codex-protocol/RequestId.js +0 -1
- package/bundle/dist/codex-protocol/Resource.js +0 -1
- package/bundle/dist/codex-protocol/ResourceContent.js +0 -1
- package/bundle/dist/codex-protocol/ResourceTemplate.js +0 -1
- package/bundle/dist/codex-protocol/ResponseItem.js +0 -1
- package/bundle/dist/codex-protocol/ReviewDecision.js +0 -1
- package/bundle/dist/codex-protocol/ServerNotification.js +0 -1
- package/bundle/dist/codex-protocol/ServerRequest.js +0 -1
- package/bundle/dist/codex-protocol/SessionSource.js +0 -1
- package/bundle/dist/codex-protocol/Settings.js +0 -1
- package/bundle/dist/codex-protocol/SubAgentSource.js +0 -1
- package/bundle/dist/codex-protocol/ThreadId.js +0 -1
- package/bundle/dist/codex-protocol/ThreadMemoryMode.js +0 -1
- package/bundle/dist/codex-protocol/Tool.js +0 -1
- package/bundle/dist/codex-protocol/Verbosity.js +0 -1
- package/bundle/dist/codex-protocol/WebSearchAction.js +0 -1
- package/bundle/dist/codex-protocol/WebSearchContextSize.js +0 -1
- package/bundle/dist/codex-protocol/WebSearchLocation.js +0 -1
- package/bundle/dist/codex-protocol/WebSearchMode.js +0 -1
- package/bundle/dist/codex-protocol/WebSearchToolConfig.js +0 -1
- package/bundle/dist/codex-protocol/index.js +0 -1
- package/bundle/dist/codex-protocol/serde_json/JsonValue.js +0 -1
- package/bundle/dist/codex-protocol/v2/Account.js +0 -1
- package/bundle/dist/codex-protocol/v2/AccountLoginCompletedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/AccountRateLimitsUpdatedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/AccountUpdatedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ActivePermissionProfile.js +0 -1
- package/bundle/dist/codex-protocol/v2/ActivePermissionProfileModification.js +0 -1
- package/bundle/dist/codex-protocol/v2/AddCreditsNudgeCreditType.js +0 -1
- package/bundle/dist/codex-protocol/v2/AddCreditsNudgeEmailStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/AdditionalFileSystemPermissions.js +0 -1
- package/bundle/dist/codex-protocol/v2/AdditionalNetworkPermissions.js +0 -1
- package/bundle/dist/codex-protocol/v2/AdditionalPermissionProfile.js +0 -1
- package/bundle/dist/codex-protocol/v2/AgentMessageDeltaNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/AnalyticsConfig.js +0 -1
- package/bundle/dist/codex-protocol/v2/AppBranding.js +0 -1
- package/bundle/dist/codex-protocol/v2/AppInfo.js +0 -1
- package/bundle/dist/codex-protocol/v2/AppListUpdatedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/AppMetadata.js +0 -1
- package/bundle/dist/codex-protocol/v2/AppReview.js +0 -1
- package/bundle/dist/codex-protocol/v2/AppScreenshot.js +0 -1
- package/bundle/dist/codex-protocol/v2/AppSummary.js +0 -1
- package/bundle/dist/codex-protocol/v2/AppToolApproval.js +0 -1
- package/bundle/dist/codex-protocol/v2/AppToolsConfig.js +0 -1
- package/bundle/dist/codex-protocol/v2/ApprovalsReviewer.js +0 -1
- package/bundle/dist/codex-protocol/v2/AppsConfig.js +0 -1
- package/bundle/dist/codex-protocol/v2/AppsDefaultConfig.js +0 -1
- package/bundle/dist/codex-protocol/v2/AppsListParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/AppsListResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/AskForApproval.js +0 -1
- package/bundle/dist/codex-protocol/v2/AutoReviewDecisionSource.js +0 -1
- package/bundle/dist/codex-protocol/v2/ByteRange.js +0 -1
- package/bundle/dist/codex-protocol/v2/CancelLoginAccountParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/CancelLoginAccountResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/CancelLoginAccountStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/ChatgptAuthTokensRefreshParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ChatgptAuthTokensRefreshReason.js +0 -1
- package/bundle/dist/codex-protocol/v2/ChatgptAuthTokensRefreshResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/CodexErrorInfo.js +0 -1
- package/bundle/dist/codex-protocol/v2/CollabAgentState.js +0 -1
- package/bundle/dist/codex-protocol/v2/CollabAgentStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/CollabAgentTool.js +0 -1
- package/bundle/dist/codex-protocol/v2/CollabAgentToolCallStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/CollaborationModeMask.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandAction.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandExecOutputDeltaNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandExecOutputStream.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandExecParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandExecResizeParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandExecResizeResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandExecResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandExecTerminalSize.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandExecTerminateParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandExecTerminateResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandExecWriteParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandExecWriteResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandExecutionApprovalDecision.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandExecutionOutputDeltaNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandExecutionRequestApprovalParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandExecutionRequestApprovalResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandExecutionSource.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandExecutionStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/CommandMigration.js +0 -1
- package/bundle/dist/codex-protocol/v2/Config.js +0 -1
- package/bundle/dist/codex-protocol/v2/ConfigBatchWriteParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ConfigEdit.js +0 -1
- package/bundle/dist/codex-protocol/v2/ConfigLayer.js +0 -1
- package/bundle/dist/codex-protocol/v2/ConfigLayerMetadata.js +0 -1
- package/bundle/dist/codex-protocol/v2/ConfigLayerSource.js +0 -1
- package/bundle/dist/codex-protocol/v2/ConfigReadParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ConfigReadResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ConfigRequirements.js +0 -1
- package/bundle/dist/codex-protocol/v2/ConfigRequirementsReadResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ConfigValueWriteParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ConfigWarningNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ConfigWriteResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ConfiguredHookHandler.js +0 -1
- package/bundle/dist/codex-protocol/v2/ConfiguredHookMatcherGroup.js +0 -1
- package/bundle/dist/codex-protocol/v2/ContextCompactedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/CreditsSnapshot.js +0 -1
- package/bundle/dist/codex-protocol/v2/DeprecationNoticeNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/DynamicToolCallOutputContentItem.js +0 -1
- package/bundle/dist/codex-protocol/v2/DynamicToolCallParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/DynamicToolCallResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/DynamicToolCallStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/DynamicToolSpec.js +0 -1
- package/bundle/dist/codex-protocol/v2/ErrorNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ExecPolicyAmendment.js +0 -1
- package/bundle/dist/codex-protocol/v2/ExperimentalFeature.js +0 -1
- package/bundle/dist/codex-protocol/v2/ExperimentalFeatureEnablementSetParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ExperimentalFeatureEnablementSetResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ExperimentalFeatureListParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ExperimentalFeatureListResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ExperimentalFeatureStage.js +0 -1
- package/bundle/dist/codex-protocol/v2/ExternalAgentConfigDetectParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ExternalAgentConfigDetectResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ExternalAgentConfigImportCompletedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ExternalAgentConfigImportParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ExternalAgentConfigImportResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ExternalAgentConfigMigrationItem.js +0 -1
- package/bundle/dist/codex-protocol/v2/ExternalAgentConfigMigrationItemType.js +0 -1
- package/bundle/dist/codex-protocol/v2/FeedbackUploadParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/FeedbackUploadResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/FileChangeApprovalDecision.js +0 -1
- package/bundle/dist/codex-protocol/v2/FileChangeOutputDeltaNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/FileChangePatchUpdatedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/FileChangeRequestApprovalParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/FileChangeRequestApprovalResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/FileSystemAccessMode.js +0 -1
- package/bundle/dist/codex-protocol/v2/FileSystemPath.js +0 -1
- package/bundle/dist/codex-protocol/v2/FileSystemSandboxEntry.js +0 -1
- package/bundle/dist/codex-protocol/v2/FileSystemSpecialPath.js +0 -1
- package/bundle/dist/codex-protocol/v2/FileUpdateChange.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsChangedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsCopyParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsCopyResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsCreateDirectoryParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsCreateDirectoryResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsGetMetadataParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsGetMetadataResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsReadDirectoryEntry.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsReadDirectoryParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsReadDirectoryResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsReadFileParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsReadFileResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsRemoveParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsRemoveResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsUnwatchParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsUnwatchResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsWatchParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsWatchResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsWriteFileParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/FsWriteFileResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/GetAccountParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/GetAccountRateLimitsResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/GetAccountResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/GitInfo.js +0 -1
- package/bundle/dist/codex-protocol/v2/GrantedPermissionProfile.js +0 -1
- package/bundle/dist/codex-protocol/v2/GuardianApprovalReview.js +0 -1
- package/bundle/dist/codex-protocol/v2/GuardianApprovalReviewAction.js +0 -1
- package/bundle/dist/codex-protocol/v2/GuardianApprovalReviewStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/GuardianCommandSource.js +0 -1
- package/bundle/dist/codex-protocol/v2/GuardianRiskLevel.js +0 -1
- package/bundle/dist/codex-protocol/v2/GuardianUserAuthorization.js +0 -1
- package/bundle/dist/codex-protocol/v2/GuardianWarningNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/HookCompletedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/HookErrorInfo.js +0 -1
- package/bundle/dist/codex-protocol/v2/HookEventName.js +0 -1
- package/bundle/dist/codex-protocol/v2/HookExecutionMode.js +0 -1
- package/bundle/dist/codex-protocol/v2/HookHandlerType.js +0 -1
- package/bundle/dist/codex-protocol/v2/HookMetadata.js +0 -1
- package/bundle/dist/codex-protocol/v2/HookMigration.js +0 -1
- package/bundle/dist/codex-protocol/v2/HookOutputEntry.js +0 -1
- package/bundle/dist/codex-protocol/v2/HookOutputEntryKind.js +0 -1
- package/bundle/dist/codex-protocol/v2/HookPromptFragment.js +0 -1
- package/bundle/dist/codex-protocol/v2/HookRunStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/HookRunSummary.js +0 -1
- package/bundle/dist/codex-protocol/v2/HookScope.js +0 -1
- package/bundle/dist/codex-protocol/v2/HookSource.js +0 -1
- package/bundle/dist/codex-protocol/v2/HookStartedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/HookTrustStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/HooksListEntry.js +0 -1
- package/bundle/dist/codex-protocol/v2/HooksListParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/HooksListResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ItemCompletedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ItemGuardianApprovalReviewCompletedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ItemGuardianApprovalReviewStartedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ItemStartedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ListMcpServerStatusParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ListMcpServerStatusResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/LoginAccountParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/LoginAccountResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/LogoutAccountResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ManagedHooksRequirements.js +0 -1
- package/bundle/dist/codex-protocol/v2/MarketplaceAddParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/MarketplaceAddResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/MarketplaceInterface.js +0 -1
- package/bundle/dist/codex-protocol/v2/MarketplaceLoadErrorInfo.js +0 -1
- package/bundle/dist/codex-protocol/v2/MarketplaceRemoveParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/MarketplaceRemoveResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/MarketplaceUpgradeErrorInfo.js +0 -1
- package/bundle/dist/codex-protocol/v2/MarketplaceUpgradeParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/MarketplaceUpgradeResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpAuthStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationArrayType.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationBooleanSchema.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationBooleanType.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationConstOption.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationEnumSchema.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationLegacyTitledEnumSchema.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationMultiSelectEnumSchema.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationNumberSchema.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationNumberType.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationObjectType.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationPrimitiveSchema.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationSchema.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationSingleSelectEnumSchema.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationStringFormat.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationStringSchema.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationStringType.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationTitledEnumItems.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationTitledMultiSelectEnumSchema.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationTitledSingleSelectEnumSchema.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationUntitledEnumItems.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationUntitledMultiSelectEnumSchema.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpElicitationUntitledSingleSelectEnumSchema.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpResourceReadParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpResourceReadResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpServerElicitationAction.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpServerElicitationRequestParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpServerElicitationRequestResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpServerMigration.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpServerOauthLoginCompletedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpServerOauthLoginParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpServerOauthLoginResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpServerRefreshResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpServerStartupState.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpServerStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpServerStatusDetail.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpServerStatusUpdatedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpServerToolCallParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpServerToolCallResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpToolCallError.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpToolCallProgressNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpToolCallResult.js +0 -1
- package/bundle/dist/codex-protocol/v2/McpToolCallStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/MemoryCitation.js +0 -1
- package/bundle/dist/codex-protocol/v2/MemoryCitationEntry.js +0 -1
- package/bundle/dist/codex-protocol/v2/MergeStrategy.js +0 -1
- package/bundle/dist/codex-protocol/v2/MigrationDetails.js +0 -1
- package/bundle/dist/codex-protocol/v2/Model.js +0 -1
- package/bundle/dist/codex-protocol/v2/ModelAvailabilityNux.js +0 -1
- package/bundle/dist/codex-protocol/v2/ModelListParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ModelListResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ModelProviderCapabilitiesReadParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ModelProviderCapabilitiesReadResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ModelRerouteReason.js +0 -1
- package/bundle/dist/codex-protocol/v2/ModelReroutedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ModelServiceTier.js +0 -1
- package/bundle/dist/codex-protocol/v2/ModelUpgradeInfo.js +0 -1
- package/bundle/dist/codex-protocol/v2/ModelVerification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ModelVerificationNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/NetworkAccess.js +0 -1
- package/bundle/dist/codex-protocol/v2/NetworkApprovalContext.js +0 -1
- package/bundle/dist/codex-protocol/v2/NetworkApprovalProtocol.js +0 -1
- package/bundle/dist/codex-protocol/v2/NetworkDomainPermission.js +0 -1
- package/bundle/dist/codex-protocol/v2/NetworkPolicyAmendment.js +0 -1
- package/bundle/dist/codex-protocol/v2/NetworkPolicyRuleAction.js +0 -1
- package/bundle/dist/codex-protocol/v2/NetworkRequirements.js +0 -1
- package/bundle/dist/codex-protocol/v2/NetworkUnixSocketPermission.js +0 -1
- package/bundle/dist/codex-protocol/v2/NonSteerableTurnKind.js +0 -1
- package/bundle/dist/codex-protocol/v2/OverriddenMetadata.js +0 -1
- package/bundle/dist/codex-protocol/v2/PatchApplyStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/PatchChangeKind.js +0 -1
- package/bundle/dist/codex-protocol/v2/PermissionGrantScope.js +0 -1
- package/bundle/dist/codex-protocol/v2/PermissionProfile.js +0 -1
- package/bundle/dist/codex-protocol/v2/PermissionProfileFileSystemPermissions.js +0 -1
- package/bundle/dist/codex-protocol/v2/PermissionProfileModificationParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/PermissionProfileNetworkPermissions.js +0 -1
- package/bundle/dist/codex-protocol/v2/PermissionProfileSelectionParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/PermissionsRequestApprovalParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/PermissionsRequestApprovalResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/PlanDeltaNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginAuthPolicy.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginAvailability.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginDetail.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginHookSummary.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginInstallParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginInstallPolicy.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginInstallResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginInterface.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginListMarketplaceKind.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginListParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginListResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginMarketplaceEntry.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginReadParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginReadResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginShareContext.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginShareDeleteParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginShareDeleteResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginShareDiscoverability.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginShareListItem.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginShareListParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginShareListResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginSharePrincipal.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginSharePrincipalType.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginShareSaveParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginShareSaveResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginShareTarget.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginShareUpdateDiscoverability.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginShareUpdateTargetsParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginShareUpdateTargetsResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginSkillReadParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginSkillReadResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginSource.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginSummary.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginUninstallParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginUninstallResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/PluginsMigration.js +0 -1
- package/bundle/dist/codex-protocol/v2/ProcessExitedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ProcessOutputDeltaNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ProcessOutputStream.js +0 -1
- package/bundle/dist/codex-protocol/v2/ProcessTerminalSize.js +0 -1
- package/bundle/dist/codex-protocol/v2/ProfileV2.js +0 -1
- package/bundle/dist/codex-protocol/v2/RateLimitReachedType.js +0 -1
- package/bundle/dist/codex-protocol/v2/RateLimitSnapshot.js +0 -1
- package/bundle/dist/codex-protocol/v2/RateLimitWindow.js +0 -1
- package/bundle/dist/codex-protocol/v2/RawResponseItemCompletedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ReasoningEffortOption.js +0 -1
- package/bundle/dist/codex-protocol/v2/ReasoningSummaryPartAddedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ReasoningSummaryTextDeltaNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ReasoningTextDeltaNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/RemoteControlConnectionStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/RemoteControlStatusChangedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/RequestPermissionProfile.js +0 -1
- package/bundle/dist/codex-protocol/v2/ResidencyRequirement.js +0 -1
- package/bundle/dist/codex-protocol/v2/ReviewDelivery.js +0 -1
- package/bundle/dist/codex-protocol/v2/ReviewStartParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ReviewStartResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ReviewTarget.js +0 -1
- package/bundle/dist/codex-protocol/v2/SandboxMode.js +0 -1
- package/bundle/dist/codex-protocol/v2/SandboxPolicy.js +0 -1
- package/bundle/dist/codex-protocol/v2/SandboxWorkspaceWrite.js +0 -1
- package/bundle/dist/codex-protocol/v2/SendAddCreditsNudgeEmailParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/SendAddCreditsNudgeEmailResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ServerRequestResolvedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/SessionMigration.js +0 -1
- package/bundle/dist/codex-protocol/v2/SessionSource.js +0 -1
- package/bundle/dist/codex-protocol/v2/SkillDependencies.js +0 -1
- package/bundle/dist/codex-protocol/v2/SkillErrorInfo.js +0 -1
- package/bundle/dist/codex-protocol/v2/SkillInterface.js +0 -1
- package/bundle/dist/codex-protocol/v2/SkillMetadata.js +0 -1
- package/bundle/dist/codex-protocol/v2/SkillScope.js +0 -1
- package/bundle/dist/codex-protocol/v2/SkillSummary.js +0 -1
- package/bundle/dist/codex-protocol/v2/SkillToolDependency.js +0 -1
- package/bundle/dist/codex-protocol/v2/SkillsChangedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/SkillsConfigWriteParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/SkillsConfigWriteResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/SkillsListEntry.js +0 -1
- package/bundle/dist/codex-protocol/v2/SkillsListParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/SkillsListResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/SortDirection.js +0 -1
- package/bundle/dist/codex-protocol/v2/SubagentMigration.js +0 -1
- package/bundle/dist/codex-protocol/v2/TerminalInteractionNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/TextElement.js +0 -1
- package/bundle/dist/codex-protocol/v2/TextPosition.js +0 -1
- package/bundle/dist/codex-protocol/v2/TextRange.js +0 -1
- package/bundle/dist/codex-protocol/v2/Thread.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadActiveFlag.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadApproveGuardianDeniedActionParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadApproveGuardianDeniedActionResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadArchiveParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadArchiveResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadArchivedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadClosedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadCompactStartParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadCompactStartResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadForkParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadForkResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadGoal.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadGoalClearedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadGoalStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadGoalUpdatedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadInjectItemsParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadInjectItemsResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadItem.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadListParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadListResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadLoadedListParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadLoadedListResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadMetadataGitInfoUpdateParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadMetadataUpdateParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadMetadataUpdateResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadNameUpdatedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadReadParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadReadResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadRealtimeAudioChunk.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadRealtimeClosedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadRealtimeErrorNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadRealtimeItemAddedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadRealtimeOutputAudioDeltaNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadRealtimeSdpNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadRealtimeStartTransport.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadRealtimeStartedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadRealtimeTranscriptDeltaNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadRealtimeTranscriptDoneNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadResumeParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadResumeResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadRollbackParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadRollbackResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadSetNameParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadSetNameResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadShellCommandParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadShellCommandResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadSortKey.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadSource.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadSourceKind.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadStartParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadStartResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadStartSource.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadStartedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadStatusChangedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadTokenUsage.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadTokenUsageUpdatedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadUnarchiveParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadUnarchiveResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadUnarchivedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadUnsubscribeParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadUnsubscribeResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ThreadUnsubscribeStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/TokenUsageBreakdown.js +0 -1
- package/bundle/dist/codex-protocol/v2/ToolRequestUserInputAnswer.js +0 -1
- package/bundle/dist/codex-protocol/v2/ToolRequestUserInputOption.js +0 -1
- package/bundle/dist/codex-protocol/v2/ToolRequestUserInputParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/ToolRequestUserInputQuestion.js +0 -1
- package/bundle/dist/codex-protocol/v2/ToolRequestUserInputResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/ToolsV2.js +0 -1
- package/bundle/dist/codex-protocol/v2/Turn.js +0 -1
- package/bundle/dist/codex-protocol/v2/TurnCompletedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/TurnDiffUpdatedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/TurnEnvironmentParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/TurnError.js +0 -1
- package/bundle/dist/codex-protocol/v2/TurnInterruptParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/TurnInterruptResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/TurnItemsView.js +0 -1
- package/bundle/dist/codex-protocol/v2/TurnPlanStep.js +0 -1
- package/bundle/dist/codex-protocol/v2/TurnPlanStepStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/TurnPlanUpdatedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/TurnStartParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/TurnStartResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/TurnStartedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/TurnStatus.js +0 -1
- package/bundle/dist/codex-protocol/v2/TurnSteerParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/TurnSteerResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/UserInput.js +0 -1
- package/bundle/dist/codex-protocol/v2/WarningNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/WebSearchAction.js +0 -1
- package/bundle/dist/codex-protocol/v2/WindowsSandboxReadiness.js +0 -1
- package/bundle/dist/codex-protocol/v2/WindowsSandboxReadinessResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/WindowsSandboxSetupCompletedNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/WindowsSandboxSetupMode.js +0 -1
- package/bundle/dist/codex-protocol/v2/WindowsSandboxSetupStartParams.js +0 -1
- package/bundle/dist/codex-protocol/v2/WindowsSandboxSetupStartResponse.js +0 -1
- package/bundle/dist/codex-protocol/v2/WindowsWorldWritableWarningNotification.js +0 -1
- package/bundle/dist/codex-protocol/v2/WriteStatus.js +0 -1
- package/bundle/dist/i18n/en.js +1 -2
- package/bundle/dist/i18n/ko.js +1 -2
- package/bundle/dist/i18n/sd.generated.js +54 -21
- package/bundle/dist/index.js +1 -2
- package/bundle/dist/migrations/20260410171405_create__request_logs.js +1 -2
- package/bundle/dist/migrations/20260410171406_create__tokens.js +1 -2
- package/bundle/dist/migrations/20260411120624_alter_tokens_alter2.js +1 -2
- package/bundle/dist/migrations/20260415113716_alter_tokens_add_ord.js +1 -2
- package/bundle/dist/migrations/20260415134649_alter_request_logs_alter1.js +1 -2
- package/bundle/dist/migrations/20260421223627_alter_request_logs_add1_alter1.js +1 -2
- package/bundle/dist/migrations/20260423180818_alter_request_logs_add1_alter1.js +1 -2
- package/bundle/dist/migrations/20260423182017_alter_request_logs_add2_drop1_alter1.js +1 -2
- package/bundle/dist/migrations/20260423183613_alter_request_logs_add1_alter1.js +1 -2
- package/bundle/dist/migrations/20260518145411_alter_tokens_add2_drop4_alter1.js +1 -2
- package/bundle/dist/migrations/20260520112853_alter_request_logs_add3_alter1.js +1 -2
- package/bundle/dist/migrations/20260520124755_alter_request_logs_drop1_alter1.js +1 -2
- package/bundle/dist/migrations/20260520130420_create__request_log_steps.js +1 -2
- package/bundle/dist/migrations/20260520134908_alter_request_logs_add2_alter8.js +1 -2
- package/bundle/dist/migrations/20260520134909_alter_request_log_steps_add1_alter3.js +1 -2
- package/bundle/dist/migrations/20260520141449_alter_request_logs_add1_alter1.js +1 -2
- package/bundle/dist/migrations/20260521134025_alter_request_log_steps_alter1.js +1 -2
- package/bundle/dist/migrations/20260521134026_alter_request_log_steps_foreigns.js +1 -2
- package/bundle/dist/migrations/20260522181721_alter_request_log_steps_add2_alter1.js +1 -2
- package/bundle/dist/migrations/20260630223950_alter_tokens_add1_alter1.js +1 -2
- package/bundle/dist/migrations/20260701105327_alter_request_logs_add1_alter1.js +1 -2
- package/bundle/dist/migrations/20260701105328_alter_request_log_steps_add1_alter1.js +1 -2
- package/bundle/dist/migrations/20260705140614_alter_request_logs_add1_alter1.js +1 -2
- package/bundle/dist/migrations/20260706120000_alter_request_logs_add_image_cost.js +1 -2
- package/bundle/dist/migrations/20260710090000_alter_tokens_add_weight.js +1 -2
- package/bundle/dist/migrations/20260718180824_alter_request_logs_add5_alter1.js +1 -2
- package/bundle/dist/migrations/20260718180825_alter_request_log_steps_add7_alter1.js +1 -2
- package/bundle/dist/migrations/20260722174410_alter_request_logs_alter3.js +17 -0
- package/bundle/dist/migrations/20260722174411_alter_request_log_steps_alter3.js +17 -0
- package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +255 -4
- package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +1507 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +887 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +2756 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +8 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +8 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +922 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +386 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +121 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +51 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +1317 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +561 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +40 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +272 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +27 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +77 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +381 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +51 -0
- package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +103 -3
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +1 -1
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +1 -1
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +1 -1
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +1 -1
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +1 -1
- package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +2 -3
- package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +4 -4
- package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +2 -2
- package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +18 -7
- package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +18 -3
- package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.11.2_@emnapi_runtime@1.11.2_@types_node@25.0.7_esbuild@0.27.4_2519c2e8d8013fcbc7b443879bc9da6d/node_modules/vite/dist/node/module-runner.js +1265 -0
- package/bundle/dist/node_modules/.pnpm/{vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c}/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +6 -3
- package/bundle/dist/node_modules/.pnpm/{vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c}/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +8 -8
- package/bundle/dist/node_modules/.pnpm/{vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c}/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +5 -5
- package/bundle/dist/node_modules/.pnpm/{vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c}/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +3 -3
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c/node_modules/vitest/dist/chunks/index.DdgEv5B1.js +46 -0
- package/bundle/dist/node_modules/.pnpm/{vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c}/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +66 -6
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js +3044 -0
- package/bundle/dist/node_modules/.pnpm/{vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c}/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +19 -4
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c/node_modules/vitest/dist/index.js +28 -0
- package/bundle/dist/server-bootstrap.js +1 -2
- package/bundle/dist/sonamu.config.js +11 -27
- package/bundle/dist/startup-migrations.js +1 -2
- package/bundle/dist/testing/fixture.js +1 -2
- package/bundle/dist/testing/global.js +6 -7
- package/bundle/dist/testing/setup-mocks.js +3 -4
- package/bundle/dist/testing/test-database-name.js +5 -8
- package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +8 -8
- package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +1 -2
- package/bundle/dist/utils/providers/anthropic/anthropic-quota.js +1 -2
- package/bundle/dist/utils/providers/anthropic/claude-session.js +5 -7
- package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +1 -2
- package/bundle/dist/utils/providers/common/credentials.js +1 -2
- package/bundle/dist/utils/providers/common/model-cost.js +3 -3
- package/bundle/dist/utils/providers/common/provider-dispatcher.js +0 -1
- package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +1 -2
- package/bundle/dist/utils/providers/common/strictifier.js +2 -2
- package/bundle/dist/utils/providers/common/token-picker.js +1 -2
- package/bundle/dist/utils/providers/common/ttft.js +1 -2
- package/bundle/dist/utils/providers/openai/codex-rpc.js +4 -2
- package/bundle/dist/utils/providers/openai/codex-worker.js +2 -2
- package/bundle/dist/utils/providers/openai/openai-constants.js +1 -2
- package/bundle/dist/utils/providers/openai/openai-dispatcher.js +103 -40
- package/bundle/dist/utils/providers/openai/openai-quota.js +1 -2
- package/bundle/dist/utils/providers/openai/openai-refresh.js +1 -2
- package/bundle/dist/utils/subset-loaders.js +1 -2
- package/bundle/src/application/monit/monit.frame.test.ts +2 -2
- package/bundle/src/application/monit/monit.frame.ts +2 -2
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +242 -8
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +97 -57
- package/bundle/src/application/qgrid/qgrid.frame.test.ts +400 -96
- package/bundle/src/application/qgrid/qgrid.frame.ts +85 -123
- package/bundle/src/application/qgrid/qgrid.types.ts +35 -27
- package/bundle/src/application/request-log/request-log.entity.json +2 -2
- package/bundle/src/application/request-log/request-log.model.test.ts +325 -21
- package/bundle/src/application/request-log/request-log.model.ts +233 -125
- package/bundle/src/application/request-log-step/request-log-step.entity.json +2 -2
- package/bundle/src/application/sonamu.generated.http +2 -2
- package/bundle/src/application/sonamu.generated.ts +13 -13
- package/bundle/src/i18n/sd.generated.ts +83 -14
- package/bundle/src/migrations/20260722174410_alter_request_logs_alter3.ts +19 -0
- package/bundle/src/migrations/20260722174411_alter_request_log_steps_alter3.ts +19 -0
- package/bundle/src/sonamu.config.ts +5 -23
- package/bundle/src/testing/global.ts +5 -5
- package/bundle/src/testing/test-database-name.test.ts +5 -5
- package/bundle/src/testing/test-database-name.ts +9 -8
- package/bundle/src/utils/providers/anthropic/anthropic-constants.test.ts +10 -6
- package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +9 -5
- package/bundle/src/utils/providers/anthropic/claude-session.test.ts +18 -3
- package/bundle/src/utils/providers/anthropic/claude-session.ts +4 -4
- package/bundle/src/utils/providers/common/model-cost.test.ts +1 -0
- package/bundle/src/utils/providers/common/model-cost.ts +1 -0
- package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +440 -0
- package/bundle/src/utils/providers/openai/openai-dispatcher.ts +143 -45
- package/bundle/web-dist/client/assets/{index-CmuPjbCl.js → index-ioEghlNo.js} +3 -3
- package/bundle/web-dist/client/assets/logs-TGA3XE4C.js +1 -0
- package/bundle/web-dist/client/assets/{monit-B5Edhvy-.js → monit-DLynJGca.js} +1 -1
- package/bundle/web-dist/client/assets/{routes-UPWScORY.js → routes-DugjmKS_.js} +1 -1
- package/bundle/web-dist/client/assets/{sd.generated-DYuKzBY6.js → sd.generated-DbBC73_z.js} +1 -1
- package/bundle/web-dist/client/assets/{services.generated-D_SkWOo-.js → services.generated-BWyAypSh.js} +1 -1
- package/bundle/web-dist/client/assets/{show-pRp-eZIK.js → show-DSswR7Cy.js} +2 -2
- package/bundle/web-dist/client/assets/{tokens-DJlttxCM.js → tokens-C5djVO__.js} +1 -1
- package/bundle/web-dist/client/assets/{use-update-token-mutation-CpFGLWUl.js → use-update-token-mutation-DeDBiZiM.js} +1 -1
- package/bundle/web-dist/client/index.html +2 -2
- package/bundle/web-dist/server/assets/{lazyRouteComponent-Cu6IkL8A.js → lazyRouteComponent-BCJr868T.js} +1 -1
- package/bundle/web-dist/server/assets/{logs-Dx2knN2T.js → logs-33YNafdW.js} +32 -11
- package/bundle/web-dist/server/assets/{monit-DU6PLatf.js → monit--9mVsjNU.js} +2 -2
- package/bundle/web-dist/server/assets/{routes-CTco1oJZ.js → routes-BK3Xh1UB.js} +3 -3
- package/bundle/web-dist/server/assets/{sd.generated-qzuRe35X.js → sd.generated-C3gcvRcU.js} +1 -0
- package/bundle/web-dist/server/assets/{services.generated-C8q1M41a.js → services.generated-B2_Auwvk.js} +1 -1
- package/bundle/web-dist/server/assets/{show-B3q8_GDh.js → show-Dxxxe608.js} +15 -9
- package/bundle/web-dist/server/assets/{tokens-Bvjn15h9.js → tokens-BWPVvdfi.js} +3 -3
- package/bundle/web-dist/server/assets/{use-update-token-mutation-BlZo6swF.js → use-update-token-mutation-CNBgTysy.js} +1 -1
- package/bundle/web-dist/server/entry-server.generated.js +23 -23
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +18 -12
- package/package.json +6 -6
- package/skills/qgrid/SKILL.md +4 -0
- package/skills/qgrid/references/ai-sdk-provider-contract.md +28 -2
- package/skills/qgrid/references/anthropic-claude-code-runtime.md +5 -4
- package/skills/qgrid/references/cli-env-and-server-boot.md +20 -8
- package/skills/qgrid/references/decision-rationale.md +4 -0
- package/skills/qgrid/references/docs-workflow.md +10 -0
- package/skills/qgrid/references/openai-codex-runtime.md +11 -3
- package/skills/qgrid/references/provider-runtime-differences.md +3 -3
- package/skills/qgrid/references/request-log-run-lifecycle.md +46 -28
- package/skills/qgrid/references/sonamu-api-web-flow.md +4 -0
- package/skills/qgrid/references/token-auth-quota-lifecycle.md +6 -0
- package/skills/qgrid/references/tool-calling-and-multiturn.md +8 -7
- package/skills/qgrid/references/verification-and-debugging.md +1 -1
- package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.2/node_modules/@vitest/expect/dist/index.js +0 -1484
- package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.2/node_modules/@vitest/pretty-format/dist/index.js +0 -887
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2746
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/index.js +0 -8
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/utils.js +0 -8
- package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.2/node_modules/@vitest/snapshot/dist/index.js +0 -662
- package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.2/node_modules/@vitest/spy/dist/index.js +0 -386
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -82
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/constants.js +0 -48
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/diff.js +0 -1307
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/display.js +0 -558
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/error.js +0 -33
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/helpers.js +0 -226
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/offset.js +0 -27
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/serialize.js +0 -77
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/source-map.js +0 -374
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/timers.js +0 -37
- package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.9.2_@emnapi_runtime@1.9.2_@types_node@25.0.7_esbuild@0.27.4_jiti@2.6.1_sass@1.98.0_tsx@4.21.0/node_modules/vite/dist/node/module-runner.js +0 -426
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496/node_modules/vitest/dist/chunks/index.DOa3dzoN.js +0 -16
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496/node_modules/vitest/dist/chunks/test.p_J6dB8a.js +0 -2910
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496/node_modules/vitest/dist/index.js +0 -28
- package/bundle/web-dist/client/assets/logs-cXOsDli3.js +0 -1
|
@@ -0,0 +1,1265 @@
|
|
|
1
|
+
//#region ../../node_modules/.pnpm/vite@8.0.3_@emnapi+core@1.11.2_@emnapi+runtime@1.11.2_@types+node@25.0.7_esbuild@0.27.4_2519c2e8d8013fcbc7b443879bc9da6d/node_modules/vite/dist/node/module-runner.js
|
|
2
|
+
let SOURCEMAPPING_URL = "sourceMa";
|
|
3
|
+
SOURCEMAPPING_URL += "ppingURL";
|
|
4
|
+
const isWindows = typeof process < "u" && process.platform === "win32";
|
|
5
|
+
/**
|
|
6
|
+
* Undo {@link wrapId}'s `/@id/` and null byte replacements.
|
|
7
|
+
*/
|
|
8
|
+
function unwrapId(id) {
|
|
9
|
+
return id.startsWith("/@id/") ? id.slice(5).replace("__x00__", "\0") : id;
|
|
10
|
+
}
|
|
11
|
+
const windowsSlashRE = /\\/g;
|
|
12
|
+
function slash(p) {
|
|
13
|
+
return p.replace(windowsSlashRE, "/");
|
|
14
|
+
}
|
|
15
|
+
const postfixRE = /[?#].*$/;
|
|
16
|
+
function cleanUrl(url) {
|
|
17
|
+
return url.replace(postfixRE, "");
|
|
18
|
+
}
|
|
19
|
+
function isPrimitive(value) {
|
|
20
|
+
return !value || typeof value != "object" && typeof value != "function";
|
|
21
|
+
}
|
|
22
|
+
const AsyncFunction = async function() {}.constructor;
|
|
23
|
+
let asyncFunctionDeclarationPaddingLineCount;
|
|
24
|
+
function getAsyncFunctionDeclarationPaddingLineCount() {
|
|
25
|
+
if (asyncFunctionDeclarationPaddingLineCount === void 0) {
|
|
26
|
+
let body = "/*code*/", source = new AsyncFunction("a", "b", body).toString();
|
|
27
|
+
asyncFunctionDeclarationPaddingLineCount = source.slice(0, source.indexOf(body)).split("\n").length - 1;
|
|
28
|
+
}
|
|
29
|
+
return asyncFunctionDeclarationPaddingLineCount;
|
|
30
|
+
}
|
|
31
|
+
function promiseWithResolvers() {
|
|
32
|
+
let resolve, reject;
|
|
33
|
+
return {
|
|
34
|
+
promise: new Promise((_resolve, _reject) => {
|
|
35
|
+
resolve = _resolve, reject = _reject;
|
|
36
|
+
}),
|
|
37
|
+
resolve,
|
|
38
|
+
reject
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
|
|
42
|
+
function normalizeWindowsPath(input = "") {
|
|
43
|
+
return input && input.replace(/\\/g, "/").replace(_DRIVE_LETTER_START_RE, (r) => r.toUpperCase());
|
|
44
|
+
}
|
|
45
|
+
const _IS_ABSOLUTE_RE = /^[/\\](?![/\\])|^[/\\]{2}(?!\.)|^[A-Za-z]:[/\\]/;
|
|
46
|
+
const _DRIVE_LETTER_RE = /^[A-Za-z]:$/;
|
|
47
|
+
function cwd() {
|
|
48
|
+
return typeof process < "u" && typeof process.cwd == "function" ? process.cwd().replace(/\\/g, "/") : "/";
|
|
49
|
+
}
|
|
50
|
+
const resolve = function(...arguments_) {
|
|
51
|
+
arguments_ = arguments_.map((argument) => normalizeWindowsPath(argument));
|
|
52
|
+
let resolvedPath = "", resolvedAbsolute = !1;
|
|
53
|
+
for (let index = arguments_.length - 1; index >= -1 && !resolvedAbsolute; index--) {
|
|
54
|
+
let path = index >= 0 ? arguments_[index] : cwd();
|
|
55
|
+
!path || path.length === 0 || (resolvedPath = `${path}/${resolvedPath}`, resolvedAbsolute = isAbsolute(path));
|
|
56
|
+
}
|
|
57
|
+
return resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute), resolvedAbsolute && !isAbsolute(resolvedPath) ? `/${resolvedPath}` : resolvedPath.length > 0 ? resolvedPath : ".";
|
|
58
|
+
};
|
|
59
|
+
function normalizeString(path, allowAboveRoot) {
|
|
60
|
+
let res = "", lastSegmentLength = 0, lastSlash = -1, dots = 0, char = null;
|
|
61
|
+
for (let index = 0; index <= path.length; ++index) {
|
|
62
|
+
if (index < path.length) char = path[index];
|
|
63
|
+
else if (char === "/") break;
|
|
64
|
+
else char = "/";
|
|
65
|
+
if (char === "/") {
|
|
66
|
+
if (!(lastSlash === index - 1 || dots === 1)) if (dots === 2) {
|
|
67
|
+
if (res.length < 2 || lastSegmentLength !== 2 || res[res.length - 1] !== "." || res[res.length - 2] !== ".") {
|
|
68
|
+
if (res.length > 2) {
|
|
69
|
+
let lastSlashIndex = res.lastIndexOf("/");
|
|
70
|
+
lastSlashIndex === -1 ? (res = "", lastSegmentLength = 0) : (res = res.slice(0, lastSlashIndex), lastSegmentLength = res.length - 1 - res.lastIndexOf("/")), lastSlash = index, dots = 0;
|
|
71
|
+
continue;
|
|
72
|
+
} else if (res.length > 0) {
|
|
73
|
+
res = "", lastSegmentLength = 0, lastSlash = index, dots = 0;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
allowAboveRoot && (res += res.length > 0 ? "/.." : "..", lastSegmentLength = 2);
|
|
78
|
+
} else res.length > 0 ? res += `/${path.slice(lastSlash + 1, index)}` : res = path.slice(lastSlash + 1, index), lastSegmentLength = index - lastSlash - 1;
|
|
79
|
+
lastSlash = index, dots = 0;
|
|
80
|
+
} else char === "." && dots !== -1 ? ++dots : dots = -1;
|
|
81
|
+
}
|
|
82
|
+
return res;
|
|
83
|
+
}
|
|
84
|
+
const isAbsolute = function(p) {
|
|
85
|
+
return _IS_ABSOLUTE_RE.test(p);
|
|
86
|
+
};
|
|
87
|
+
const dirname = function(p) {
|
|
88
|
+
let segments = normalizeWindowsPath(p).replace(/\/$/, "").split("/").slice(0, -1);
|
|
89
|
+
return segments.length === 1 && _DRIVE_LETTER_RE.test(segments[0]) && (segments[0] += "/"), segments.join("/") || (isAbsolute(p) ? "/" : ".");
|
|
90
|
+
};
|
|
91
|
+
const textDecoder = new TextDecoder();
|
|
92
|
+
const decodeBase64 = typeof Buffer == "function" && typeof Buffer.from == "function" ? (base64) => Buffer.from(base64, "base64").toString("utf-8") : (base64) => textDecoder.decode(Uint8Array.from(atob(base64), (c) => c.charCodeAt(0)));
|
|
93
|
+
const percentRegEx = /%/g;
|
|
94
|
+
const backslashRegEx = /\\/g;
|
|
95
|
+
const newlineRegEx = /\n/g;
|
|
96
|
+
const carriageReturnRegEx = /\r/g;
|
|
97
|
+
const tabRegEx = /\t/g;
|
|
98
|
+
const questionRegex = /\?/g;
|
|
99
|
+
const hashRegex = /#/g;
|
|
100
|
+
function encodePathChars(filepath) {
|
|
101
|
+
return filepath.indexOf("%") !== -1 && (filepath = filepath.replace(percentRegEx, "%25")), !isWindows && filepath.indexOf("\\") !== -1 && (filepath = filepath.replace(backslashRegEx, "%5C")), filepath.indexOf("\n") !== -1 && (filepath = filepath.replace(newlineRegEx, "%0A")), filepath.indexOf("\r") !== -1 && (filepath = filepath.replace(carriageReturnRegEx, "%0D")), filepath.indexOf(" ") !== -1 && (filepath = filepath.replace(tabRegEx, "%09")), filepath;
|
|
102
|
+
}
|
|
103
|
+
const posixDirname = dirname;
|
|
104
|
+
const posixResolve = resolve;
|
|
105
|
+
function posixPathToFileHref(posixPath) {
|
|
106
|
+
let resolved = posixResolve(posixPath), filePathLast = posixPath.charCodeAt(posixPath.length - 1);
|
|
107
|
+
return (filePathLast === 47 || isWindows && filePathLast === 92) && resolved[resolved.length - 1] !== "/" && (resolved += "/"), resolved = encodePathChars(resolved), resolved.indexOf("?") !== -1 && (resolved = resolved.replace(questionRegex, "%3F")), resolved.indexOf("#") !== -1 && (resolved = resolved.replace(hashRegex, "%23")), new URL(`file://${resolved}`).href;
|
|
108
|
+
}
|
|
109
|
+
function toWindowsPath(path) {
|
|
110
|
+
return path.replace(/\//g, "\\");
|
|
111
|
+
}
|
|
112
|
+
var comma = 44;
|
|
113
|
+
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
114
|
+
var intToChar = /* @__PURE__ */ new Uint8Array(64);
|
|
115
|
+
var charToInt = /* @__PURE__ */ new Uint8Array(128);
|
|
116
|
+
for (let i = 0; i < chars.length; i++) {
|
|
117
|
+
let c = chars.charCodeAt(i);
|
|
118
|
+
intToChar[i] = c, charToInt[c] = i;
|
|
119
|
+
}
|
|
120
|
+
function decodeInteger(reader, relative) {
|
|
121
|
+
let value = 0, shift = 0, integer = 0;
|
|
122
|
+
do
|
|
123
|
+
integer = charToInt[reader.next()], value |= (integer & 31) << shift, shift += 5;
|
|
124
|
+
while (integer & 32);
|
|
125
|
+
let shouldNegate = value & 1;
|
|
126
|
+
return value >>>= 1, shouldNegate && (value = -2147483648 | -value), relative + value;
|
|
127
|
+
}
|
|
128
|
+
function hasMoreVlq(reader, max) {
|
|
129
|
+
return reader.pos >= max ? !1 : reader.peek() !== comma;
|
|
130
|
+
}
|
|
131
|
+
var StringReader = class {
|
|
132
|
+
constructor(buffer) {
|
|
133
|
+
this.pos = 0, this.buffer = buffer;
|
|
134
|
+
}
|
|
135
|
+
next() {
|
|
136
|
+
return this.buffer.charCodeAt(this.pos++);
|
|
137
|
+
}
|
|
138
|
+
peek() {
|
|
139
|
+
return this.buffer.charCodeAt(this.pos);
|
|
140
|
+
}
|
|
141
|
+
indexOf(char) {
|
|
142
|
+
let { buffer, pos } = this, idx = buffer.indexOf(char, pos);
|
|
143
|
+
return idx === -1 ? buffer.length : idx;
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
function decode(mappings) {
|
|
147
|
+
let { length } = mappings, reader = new StringReader(mappings), decoded = [], genColumn = 0, sourcesIndex = 0, sourceLine = 0, sourceColumn = 0, namesIndex = 0;
|
|
148
|
+
do {
|
|
149
|
+
let semi = reader.indexOf(";"), line = [], sorted = !0, lastCol = 0;
|
|
150
|
+
for (genColumn = 0; reader.pos < semi;) {
|
|
151
|
+
let seg;
|
|
152
|
+
genColumn = decodeInteger(reader, genColumn), genColumn < lastCol && (sorted = !1), lastCol = genColumn, hasMoreVlq(reader, semi) ? (sourcesIndex = decodeInteger(reader, sourcesIndex), sourceLine = decodeInteger(reader, sourceLine), sourceColumn = decodeInteger(reader, sourceColumn), hasMoreVlq(reader, semi) ? (namesIndex = decodeInteger(reader, namesIndex), seg = [
|
|
153
|
+
genColumn,
|
|
154
|
+
sourcesIndex,
|
|
155
|
+
sourceLine,
|
|
156
|
+
sourceColumn,
|
|
157
|
+
namesIndex
|
|
158
|
+
]) : seg = [
|
|
159
|
+
genColumn,
|
|
160
|
+
sourcesIndex,
|
|
161
|
+
sourceLine,
|
|
162
|
+
sourceColumn
|
|
163
|
+
]) : seg = [genColumn], line.push(seg), reader.pos++;
|
|
164
|
+
}
|
|
165
|
+
sorted || sort(line), decoded.push(line), reader.pos = semi + 1;
|
|
166
|
+
} while (reader.pos <= length);
|
|
167
|
+
return decoded;
|
|
168
|
+
}
|
|
169
|
+
function sort(line) {
|
|
170
|
+
line.sort(sortComparator);
|
|
171
|
+
}
|
|
172
|
+
function sortComparator(a, b) {
|
|
173
|
+
return a[0] - b[0];
|
|
174
|
+
}
|
|
175
|
+
var COLUMN = 0;
|
|
176
|
+
var SOURCES_INDEX = 1;
|
|
177
|
+
var SOURCE_LINE = 2;
|
|
178
|
+
var SOURCE_COLUMN = 3;
|
|
179
|
+
var NAMES_INDEX = 4;
|
|
180
|
+
var found = !1;
|
|
181
|
+
function binarySearch(haystack, needle, low, high) {
|
|
182
|
+
for (; low <= high;) {
|
|
183
|
+
let mid = low + (high - low >> 1), cmp = haystack[mid][COLUMN] - needle;
|
|
184
|
+
if (cmp === 0) return found = !0, mid;
|
|
185
|
+
cmp < 0 ? low = mid + 1 : high = mid - 1;
|
|
186
|
+
}
|
|
187
|
+
return found = !1, low - 1;
|
|
188
|
+
}
|
|
189
|
+
function upperBound(haystack, needle, index) {
|
|
190
|
+
for (let i = index + 1; i < haystack.length && haystack[i][COLUMN] === needle; index = i++);
|
|
191
|
+
return index;
|
|
192
|
+
}
|
|
193
|
+
function lowerBound(haystack, needle, index) {
|
|
194
|
+
for (let i = index - 1; i >= 0 && haystack[i][COLUMN] === needle; index = i--);
|
|
195
|
+
return index;
|
|
196
|
+
}
|
|
197
|
+
function memoizedBinarySearch(haystack, needle, state, key) {
|
|
198
|
+
let { lastKey, lastNeedle, lastIndex } = state, low = 0, high = haystack.length - 1;
|
|
199
|
+
if (key === lastKey) {
|
|
200
|
+
if (needle === lastNeedle) return found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle, lastIndex;
|
|
201
|
+
needle >= lastNeedle ? low = lastIndex === -1 ? 0 : lastIndex : high = lastIndex;
|
|
202
|
+
}
|
|
203
|
+
return state.lastKey = key, state.lastNeedle = needle, state.lastIndex = binarySearch(haystack, needle, low, high);
|
|
204
|
+
}
|
|
205
|
+
var LINE_GTR_ZERO = "`line` must be greater than 0 (lines start at line 1)";
|
|
206
|
+
var COL_GTR_EQ_ZERO = "`column` must be greater than or equal to 0 (columns start at column 0)";
|
|
207
|
+
function cast(map) {
|
|
208
|
+
return map;
|
|
209
|
+
}
|
|
210
|
+
function decodedMappings(map) {
|
|
211
|
+
var _a;
|
|
212
|
+
return (_a = cast(map))._decoded || (_a._decoded = decode(cast(map)._encoded));
|
|
213
|
+
}
|
|
214
|
+
function originalPositionFor(map, needle) {
|
|
215
|
+
let { line, column, bias } = needle;
|
|
216
|
+
if (line--, line < 0) throw Error(LINE_GTR_ZERO);
|
|
217
|
+
if (column < 0) throw Error(COL_GTR_EQ_ZERO);
|
|
218
|
+
let decoded = decodedMappings(map);
|
|
219
|
+
if (line >= decoded.length) return OMapping(null, null, null, null);
|
|
220
|
+
let segments = decoded[line], index = traceSegmentInternal(segments, cast(map)._decodedMemo, line, column, bias || 1);
|
|
221
|
+
if (index === -1) return OMapping(null, null, null, null);
|
|
222
|
+
let segment = segments[index];
|
|
223
|
+
if (segment.length === 1) return OMapping(null, null, null, null);
|
|
224
|
+
let { names, resolvedSources } = map;
|
|
225
|
+
return OMapping(resolvedSources[segment[SOURCES_INDEX]], segment[SOURCE_LINE] + 1, segment[SOURCE_COLUMN], segment.length === 5 ? names[segment[NAMES_INDEX]] : null);
|
|
226
|
+
}
|
|
227
|
+
function OMapping(source, line, column, name) {
|
|
228
|
+
return {
|
|
229
|
+
source,
|
|
230
|
+
line,
|
|
231
|
+
column,
|
|
232
|
+
name
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
function traceSegmentInternal(segments, memo, line, column, bias) {
|
|
236
|
+
let index = memoizedBinarySearch(segments, column, memo, line);
|
|
237
|
+
return found ? index = (bias === -1 ? upperBound : lowerBound)(segments, column, index) : bias === -1 && index++, index === -1 || index === segments.length ? -1 : index;
|
|
238
|
+
}
|
|
239
|
+
var DecodedMap = class {
|
|
240
|
+
_encoded;
|
|
241
|
+
_decoded;
|
|
242
|
+
_decodedMemo;
|
|
243
|
+
url;
|
|
244
|
+
file;
|
|
245
|
+
version;
|
|
246
|
+
names = [];
|
|
247
|
+
resolvedSources;
|
|
248
|
+
constructor(map, from) {
|
|
249
|
+
this.map = map;
|
|
250
|
+
let { mappings, names, sources } = map;
|
|
251
|
+
this.version = map.version, this.names = names || [], this._encoded = mappings || "", this._decodedMemo = memoizedState(), this.url = from, this.file = from;
|
|
252
|
+
let originDir = posixDirname(from);
|
|
253
|
+
this.resolvedSources = (sources || []).map((s) => posixResolve(originDir, s || ""));
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
function memoizedState() {
|
|
257
|
+
return {
|
|
258
|
+
lastKey: -1,
|
|
259
|
+
lastNeedle: -1,
|
|
260
|
+
lastIndex: -1
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
function getOriginalPosition(map, needle) {
|
|
264
|
+
let result = originalPositionFor(map, needle);
|
|
265
|
+
return result.column == null ? null : result;
|
|
266
|
+
}
|
|
267
|
+
const MODULE_RUNNER_SOURCEMAPPING_REGEXP = RegExp(`//# ${SOURCEMAPPING_URL}=data:application/json;base64,(.+)`);
|
|
268
|
+
var EvaluatedModuleNode = class {
|
|
269
|
+
importers = /* @__PURE__ */ new Set();
|
|
270
|
+
imports = /* @__PURE__ */ new Set();
|
|
271
|
+
evaluated = !1;
|
|
272
|
+
meta;
|
|
273
|
+
promise;
|
|
274
|
+
exports;
|
|
275
|
+
file;
|
|
276
|
+
map;
|
|
277
|
+
constructor(id, url) {
|
|
278
|
+
this.id = id, this.url = url, this.file = cleanUrl(id);
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
var EvaluatedModules = class {
|
|
282
|
+
idToModuleMap = /* @__PURE__ */ new Map();
|
|
283
|
+
fileToModulesMap = /* @__PURE__ */ new Map();
|
|
284
|
+
urlToIdModuleMap = /* @__PURE__ */ new Map();
|
|
285
|
+
/**
|
|
286
|
+
* Returns the module node by the resolved module ID. Usually, module ID is
|
|
287
|
+
* the file system path with query and/or hash. It can also be a virtual module.
|
|
288
|
+
*
|
|
289
|
+
* Module runner graph will have 1 to 1 mapping with the server module graph.
|
|
290
|
+
* @param id Resolved module ID
|
|
291
|
+
*/
|
|
292
|
+
getModuleById(id) {
|
|
293
|
+
return this.idToModuleMap.get(id);
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Returns all modules related to the file system path. Different modules
|
|
297
|
+
* might have different query parameters or hash, so it's possible to have
|
|
298
|
+
* multiple modules for the same file.
|
|
299
|
+
* @param file The file system path of the module
|
|
300
|
+
*/
|
|
301
|
+
getModulesByFile(file) {
|
|
302
|
+
return this.fileToModulesMap.get(file);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Returns the module node by the URL that was used in the import statement.
|
|
306
|
+
* Unlike module graph on the server, the URL is not resolved and is used as is.
|
|
307
|
+
* @param url Server URL that was used in the import statement
|
|
308
|
+
*/
|
|
309
|
+
getModuleByUrl(url) {
|
|
310
|
+
return this.urlToIdModuleMap.get(unwrapId(url));
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Ensure that module is in the graph. If the module is already in the graph,
|
|
314
|
+
* it will return the existing module node. Otherwise, it will create a new
|
|
315
|
+
* module node and add it to the graph.
|
|
316
|
+
* @param id Resolved module ID
|
|
317
|
+
* @param url URL that was used in the import statement
|
|
318
|
+
*/
|
|
319
|
+
ensureModule(id, url) {
|
|
320
|
+
if (id = normalizeModuleId(id), this.idToModuleMap.has(id)) {
|
|
321
|
+
let moduleNode = this.idToModuleMap.get(id);
|
|
322
|
+
return this.urlToIdModuleMap.set(url, moduleNode), moduleNode;
|
|
323
|
+
}
|
|
324
|
+
let moduleNode = new EvaluatedModuleNode(id, url);
|
|
325
|
+
this.idToModuleMap.set(id, moduleNode), this.urlToIdModuleMap.set(url, moduleNode);
|
|
326
|
+
let fileModules = this.fileToModulesMap.get(moduleNode.file) || /* @__PURE__ */ new Set();
|
|
327
|
+
return fileModules.add(moduleNode), this.fileToModulesMap.set(moduleNode.file, fileModules), moduleNode;
|
|
328
|
+
}
|
|
329
|
+
invalidateModule(node) {
|
|
330
|
+
node.evaluated = !1, node.meta = void 0, node.map = void 0, node.promise = void 0, node.exports = void 0, node.imports.clear();
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Extracts the inlined source map from the module code and returns the decoded
|
|
334
|
+
* source map. If the source map is not inlined, it will return null.
|
|
335
|
+
* @param id Resolved module ID
|
|
336
|
+
*/
|
|
337
|
+
getModuleSourceMapById(id) {
|
|
338
|
+
let mod = this.getModuleById(id);
|
|
339
|
+
if (!mod) return null;
|
|
340
|
+
if (mod.map) return mod.map;
|
|
341
|
+
if (!mod.meta || !("code" in mod.meta)) return null;
|
|
342
|
+
let pattern = `//# ${SOURCEMAPPING_URL}=data:application/json;base64,`, lastIndex = mod.meta.code.lastIndexOf(pattern);
|
|
343
|
+
if (lastIndex === -1) return null;
|
|
344
|
+
let mapString = MODULE_RUNNER_SOURCEMAPPING_REGEXP.exec(mod.meta.code.slice(lastIndex))?.[1];
|
|
345
|
+
return mapString ? (mod.map = new DecodedMap(JSON.parse(decodeBase64(mapString)), mod.file), mod.map) : null;
|
|
346
|
+
}
|
|
347
|
+
clear() {
|
|
348
|
+
this.idToModuleMap.clear(), this.fileToModulesMap.clear(), this.urlToIdModuleMap.clear();
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
const prefixedBuiltins = /* @__PURE__ */ new Set([
|
|
352
|
+
"node:sea",
|
|
353
|
+
"node:sqlite",
|
|
354
|
+
"node:test",
|
|
355
|
+
"node:test/reporters"
|
|
356
|
+
]);
|
|
357
|
+
function normalizeModuleId(file) {
|
|
358
|
+
return prefixedBuiltins.has(file) ? file : slash(file).replace(/^\/@fs\//, isWindows ? "" : "/").replace(/^node:/, "").replace(/^\/+/, "/").replace(/^file:\/+/, isWindows ? "" : "/");
|
|
359
|
+
}
|
|
360
|
+
var HMRContext = class {
|
|
361
|
+
newListeners;
|
|
362
|
+
constructor(hmrClient, ownerPath) {
|
|
363
|
+
this.hmrClient = hmrClient, this.ownerPath = ownerPath, hmrClient.dataMap.has(ownerPath) || hmrClient.dataMap.set(ownerPath, {});
|
|
364
|
+
let mod = hmrClient.hotModulesMap.get(ownerPath);
|
|
365
|
+
mod && (mod.callbacks = []);
|
|
366
|
+
let staleListeners = hmrClient.ctxToListenersMap.get(ownerPath);
|
|
367
|
+
if (staleListeners) for (let [event, staleFns] of staleListeners) {
|
|
368
|
+
let listeners = hmrClient.customListenersMap.get(event);
|
|
369
|
+
listeners && hmrClient.customListenersMap.set(event, listeners.filter((l) => !staleFns.includes(l)));
|
|
370
|
+
}
|
|
371
|
+
this.newListeners = /* @__PURE__ */ new Map(), hmrClient.ctxToListenersMap.set(ownerPath, this.newListeners);
|
|
372
|
+
}
|
|
373
|
+
get data() {
|
|
374
|
+
return this.hmrClient.dataMap.get(this.ownerPath);
|
|
375
|
+
}
|
|
376
|
+
accept(deps, callback) {
|
|
377
|
+
if (typeof deps == "function" || !deps) this.acceptDeps([this.ownerPath], ([mod]) => deps?.(mod));
|
|
378
|
+
else if (typeof deps == "string") this.acceptDeps([deps], ([mod]) => callback?.(mod));
|
|
379
|
+
else if (Array.isArray(deps)) this.acceptDeps(deps, callback);
|
|
380
|
+
else throw Error("invalid hot.accept() usage.");
|
|
381
|
+
}
|
|
382
|
+
acceptExports(_, callback) {
|
|
383
|
+
this.acceptDeps([this.ownerPath], ([mod]) => callback?.(mod));
|
|
384
|
+
}
|
|
385
|
+
dispose(cb) {
|
|
386
|
+
this.hmrClient.disposeMap.set(this.ownerPath, cb);
|
|
387
|
+
}
|
|
388
|
+
prune(cb) {
|
|
389
|
+
this.hmrClient.pruneMap.set(this.ownerPath, cb);
|
|
390
|
+
}
|
|
391
|
+
decline() {}
|
|
392
|
+
invalidate(message) {
|
|
393
|
+
let firstInvalidatedBy = this.hmrClient.currentFirstInvalidatedBy ?? this.ownerPath;
|
|
394
|
+
this.hmrClient.notifyListeners("vite:invalidate", {
|
|
395
|
+
path: this.ownerPath,
|
|
396
|
+
message,
|
|
397
|
+
firstInvalidatedBy
|
|
398
|
+
}), this.send("vite:invalidate", {
|
|
399
|
+
path: this.ownerPath,
|
|
400
|
+
message,
|
|
401
|
+
firstInvalidatedBy
|
|
402
|
+
}), this.hmrClient.logger.debug(`invalidate ${this.ownerPath}${message ? `: ${message}` : ""}`);
|
|
403
|
+
}
|
|
404
|
+
on(event, cb) {
|
|
405
|
+
let addToMap = (map) => {
|
|
406
|
+
let existing = map.get(event) || [];
|
|
407
|
+
existing.push(cb), map.set(event, existing);
|
|
408
|
+
};
|
|
409
|
+
addToMap(this.hmrClient.customListenersMap), addToMap(this.newListeners);
|
|
410
|
+
}
|
|
411
|
+
off(event, cb) {
|
|
412
|
+
let removeFromMap = (map) => {
|
|
413
|
+
let existing = map.get(event);
|
|
414
|
+
if (existing === void 0) return;
|
|
415
|
+
let pruned = existing.filter((l) => l !== cb);
|
|
416
|
+
if (pruned.length === 0) {
|
|
417
|
+
map.delete(event);
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
map.set(event, pruned);
|
|
421
|
+
};
|
|
422
|
+
removeFromMap(this.hmrClient.customListenersMap), removeFromMap(this.newListeners);
|
|
423
|
+
}
|
|
424
|
+
send(event, data) {
|
|
425
|
+
this.hmrClient.send({
|
|
426
|
+
type: "custom",
|
|
427
|
+
event,
|
|
428
|
+
data
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
acceptDeps(deps, callback = () => {}) {
|
|
432
|
+
let mod = this.hmrClient.hotModulesMap.get(this.ownerPath) || {
|
|
433
|
+
id: this.ownerPath,
|
|
434
|
+
callbacks: []
|
|
435
|
+
};
|
|
436
|
+
mod.callbacks.push({
|
|
437
|
+
deps,
|
|
438
|
+
fn: callback
|
|
439
|
+
}), this.hmrClient.hotModulesMap.set(this.ownerPath, mod);
|
|
440
|
+
}
|
|
441
|
+
};
|
|
442
|
+
var HMRClient = class {
|
|
443
|
+
hotModulesMap = /* @__PURE__ */ new Map();
|
|
444
|
+
disposeMap = /* @__PURE__ */ new Map();
|
|
445
|
+
pruneMap = /* @__PURE__ */ new Map();
|
|
446
|
+
dataMap = /* @__PURE__ */ new Map();
|
|
447
|
+
customListenersMap = /* @__PURE__ */ new Map();
|
|
448
|
+
ctxToListenersMap = /* @__PURE__ */ new Map();
|
|
449
|
+
currentFirstInvalidatedBy;
|
|
450
|
+
constructor(logger, transport, importUpdatedModule) {
|
|
451
|
+
this.logger = logger, this.transport = transport, this.importUpdatedModule = importUpdatedModule;
|
|
452
|
+
}
|
|
453
|
+
async notifyListeners(event, data) {
|
|
454
|
+
let cbs = this.customListenersMap.get(event);
|
|
455
|
+
cbs && await Promise.allSettled(cbs.map((cb) => cb(data)));
|
|
456
|
+
}
|
|
457
|
+
send(payload) {
|
|
458
|
+
this.transport.send(payload).catch((err) => {
|
|
459
|
+
this.logger.error(err);
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
clear() {
|
|
463
|
+
this.hotModulesMap.clear(), this.disposeMap.clear(), this.pruneMap.clear(), this.dataMap.clear(), this.customListenersMap.clear(), this.ctxToListenersMap.clear();
|
|
464
|
+
}
|
|
465
|
+
async prunePaths(paths) {
|
|
466
|
+
await Promise.all(paths.map((path) => {
|
|
467
|
+
let disposer = this.disposeMap.get(path);
|
|
468
|
+
if (disposer) return disposer(this.dataMap.get(path));
|
|
469
|
+
})), await Promise.all(paths.map((path) => {
|
|
470
|
+
let fn = this.pruneMap.get(path);
|
|
471
|
+
if (fn) return fn(this.dataMap.get(path));
|
|
472
|
+
}));
|
|
473
|
+
}
|
|
474
|
+
warnFailedUpdate(err, path) {
|
|
475
|
+
(!(err instanceof Error) || !err.message.includes("fetch")) && this.logger.error(err), this.logger.error(`Failed to reload ${path}. This could be due to syntax errors or importing non-existent modules. (see errors above)`);
|
|
476
|
+
}
|
|
477
|
+
updateQueue = [];
|
|
478
|
+
pendingUpdateQueue = !1;
|
|
479
|
+
/**
|
|
480
|
+
* buffer multiple hot updates triggered by the same src change
|
|
481
|
+
* so that they are invoked in the same order they were sent.
|
|
482
|
+
* (otherwise the order may be inconsistent because of the http request round trip)
|
|
483
|
+
*/
|
|
484
|
+
async queueUpdate(payload) {
|
|
485
|
+
if (this.updateQueue.push(this.fetchUpdate(payload)), !this.pendingUpdateQueue) {
|
|
486
|
+
this.pendingUpdateQueue = !0, await Promise.resolve(), this.pendingUpdateQueue = !1;
|
|
487
|
+
let loading = [...this.updateQueue];
|
|
488
|
+
this.updateQueue = [], (await Promise.all(loading)).forEach((fn) => fn && fn());
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
async fetchUpdate(update) {
|
|
492
|
+
let { path, acceptedPath, firstInvalidatedBy } = update, mod = this.hotModulesMap.get(path);
|
|
493
|
+
if (!mod) return;
|
|
494
|
+
let fetchedModule, isSelfUpdate = path === acceptedPath, qualifiedCallbacks = mod.callbacks.filter(({ deps }) => deps.includes(acceptedPath));
|
|
495
|
+
if (isSelfUpdate || qualifiedCallbacks.length > 0) {
|
|
496
|
+
let disposer = this.disposeMap.get(acceptedPath);
|
|
497
|
+
disposer && await disposer(this.dataMap.get(acceptedPath));
|
|
498
|
+
try {
|
|
499
|
+
fetchedModule = await this.importUpdatedModule(update);
|
|
500
|
+
} catch (e) {
|
|
501
|
+
this.warnFailedUpdate(e, acceptedPath);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
return () => {
|
|
505
|
+
try {
|
|
506
|
+
this.currentFirstInvalidatedBy = firstInvalidatedBy;
|
|
507
|
+
for (let { deps, fn } of qualifiedCallbacks) fn(deps.map((dep) => dep === acceptedPath ? fetchedModule : void 0));
|
|
508
|
+
let loggedPath = isSelfUpdate ? path : `${acceptedPath} via ${path}`;
|
|
509
|
+
this.logger.debug(`hot updated: ${loggedPath}`);
|
|
510
|
+
} finally {
|
|
511
|
+
this.currentFirstInvalidatedBy = void 0;
|
|
512
|
+
}
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
};
|
|
516
|
+
/**
|
|
517
|
+
* Vite converts `import { } from 'foo'` to `const _ = __vite_ssr_import__('foo')`.
|
|
518
|
+
* Top-level imports and dynamic imports work slightly differently in Node.js.
|
|
519
|
+
* This function normalizes the differences so it matches prod behaviour.
|
|
520
|
+
*/
|
|
521
|
+
function analyzeImportedModDifference(mod, rawId, moduleType, metadata) {
|
|
522
|
+
if (!metadata?.isDynamicImport && metadata?.importedNames?.length) {
|
|
523
|
+
let missingBindings = metadata.importedNames.filter((s) => !(s in mod));
|
|
524
|
+
if (missingBindings.length) {
|
|
525
|
+
let lastBinding = missingBindings[missingBindings.length - 1];
|
|
526
|
+
throw SyntaxError(moduleType === "module" ? `[vite] The requested module '${rawId}' does not provide an export named '${lastBinding}'` : `\
|
|
527
|
+
[vite] Named export '${lastBinding}' not found. The requested module '${rawId}' is a CommonJS module, which may not support all module.exports as named exports.
|
|
528
|
+
CommonJS modules can always be imported via the default export, for example using:
|
|
529
|
+
|
|
530
|
+
import pkg from '${rawId}';
|
|
531
|
+
const {${missingBindings.join(", ")}} = pkg;
|
|
532
|
+
`);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
let nanoid = (size = 21) => {
|
|
537
|
+
let id = "", i = size | 0;
|
|
538
|
+
for (; i--;) id += "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"[Math.random() * 64 | 0];
|
|
539
|
+
return id;
|
|
540
|
+
};
|
|
541
|
+
function reviveInvokeError(e) {
|
|
542
|
+
let error = Error(e.message || "Unknown invoke error");
|
|
543
|
+
return Object.assign(error, e, { runnerError: /* @__PURE__ */ Error("RunnerError") }), error;
|
|
544
|
+
}
|
|
545
|
+
const createInvokeableTransport = (transport) => {
|
|
546
|
+
if (transport.invoke) return {
|
|
547
|
+
...transport,
|
|
548
|
+
async invoke(name, data) {
|
|
549
|
+
let result = await transport.invoke({
|
|
550
|
+
type: "custom",
|
|
551
|
+
event: "vite:invoke",
|
|
552
|
+
data: {
|
|
553
|
+
id: "send",
|
|
554
|
+
name,
|
|
555
|
+
data
|
|
556
|
+
}
|
|
557
|
+
});
|
|
558
|
+
if ("error" in result) throw reviveInvokeError(result.error);
|
|
559
|
+
return result.result;
|
|
560
|
+
}
|
|
561
|
+
};
|
|
562
|
+
if (!transport.send || !transport.connect) throw Error("transport must implement send and connect when invoke is not implemented");
|
|
563
|
+
let rpcPromises = /* @__PURE__ */ new Map();
|
|
564
|
+
return {
|
|
565
|
+
...transport,
|
|
566
|
+
connect({ onMessage, onDisconnection }) {
|
|
567
|
+
return transport.connect({
|
|
568
|
+
onMessage(payload) {
|
|
569
|
+
if (payload.type === "custom" && payload.event === "vite:invoke") {
|
|
570
|
+
let data = payload.data;
|
|
571
|
+
if (data.id.startsWith("response:")) {
|
|
572
|
+
let invokeId = data.id.slice(9), promise = rpcPromises.get(invokeId);
|
|
573
|
+
if (!promise) return;
|
|
574
|
+
promise.timeoutId && clearTimeout(promise.timeoutId), rpcPromises.delete(invokeId);
|
|
575
|
+
let { error, result } = data.data;
|
|
576
|
+
error ? promise.reject(error) : promise.resolve(result);
|
|
577
|
+
return;
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
onMessage(payload);
|
|
581
|
+
},
|
|
582
|
+
onDisconnection
|
|
583
|
+
});
|
|
584
|
+
},
|
|
585
|
+
disconnect() {
|
|
586
|
+
return rpcPromises.forEach((promise) => {
|
|
587
|
+
promise.reject(/* @__PURE__ */ Error(`transport was disconnected, cannot call ${JSON.stringify(promise.name)}`));
|
|
588
|
+
}), rpcPromises.clear(), transport.disconnect?.();
|
|
589
|
+
},
|
|
590
|
+
send(data) {
|
|
591
|
+
return transport.send(data);
|
|
592
|
+
},
|
|
593
|
+
async invoke(name, data) {
|
|
594
|
+
let promiseId = nanoid(), wrappedData = {
|
|
595
|
+
type: "custom",
|
|
596
|
+
event: "vite:invoke",
|
|
597
|
+
data: {
|
|
598
|
+
name,
|
|
599
|
+
id: `send:${promiseId}`,
|
|
600
|
+
data
|
|
601
|
+
}
|
|
602
|
+
}, sendPromise = transport.send(wrappedData), { promise, resolve, reject } = promiseWithResolvers(), timeout = transport.timeout ?? 6e4, timeoutId;
|
|
603
|
+
timeout > 0 && (timeoutId = setTimeout(() => {
|
|
604
|
+
rpcPromises.delete(promiseId), reject(/* @__PURE__ */ Error(`transport invoke timed out after ${timeout}ms (data: ${JSON.stringify(wrappedData)})`));
|
|
605
|
+
}, timeout), timeoutId?.unref?.()), rpcPromises.set(promiseId, {
|
|
606
|
+
resolve,
|
|
607
|
+
reject,
|
|
608
|
+
name,
|
|
609
|
+
timeoutId
|
|
610
|
+
}), sendPromise && sendPromise.catch((err) => {
|
|
611
|
+
clearTimeout(timeoutId), rpcPromises.delete(promiseId), reject(err);
|
|
612
|
+
});
|
|
613
|
+
try {
|
|
614
|
+
return await promise;
|
|
615
|
+
} catch (err) {
|
|
616
|
+
throw reviveInvokeError(err);
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
};
|
|
620
|
+
};
|
|
621
|
+
const normalizeModuleRunnerTransport = (transport) => {
|
|
622
|
+
let invokeableTransport = createInvokeableTransport(transport), isConnected = !invokeableTransport.connect, connectingPromise;
|
|
623
|
+
return {
|
|
624
|
+
...transport,
|
|
625
|
+
...invokeableTransport.connect ? { async connect(onMessage) {
|
|
626
|
+
if (isConnected) return;
|
|
627
|
+
if (connectingPromise) {
|
|
628
|
+
await connectingPromise;
|
|
629
|
+
return;
|
|
630
|
+
}
|
|
631
|
+
let maybePromise = invokeableTransport.connect({
|
|
632
|
+
onMessage: onMessage ?? (() => {}),
|
|
633
|
+
onDisconnection() {
|
|
634
|
+
isConnected = !1;
|
|
635
|
+
}
|
|
636
|
+
});
|
|
637
|
+
maybePromise && (connectingPromise = maybePromise, await connectingPromise, connectingPromise = void 0), isConnected = !0;
|
|
638
|
+
} } : {},
|
|
639
|
+
...invokeableTransport.disconnect ? { async disconnect() {
|
|
640
|
+
isConnected && (connectingPromise && await connectingPromise, isConnected = !1, await invokeableTransport.disconnect());
|
|
641
|
+
} } : {},
|
|
642
|
+
async send(data) {
|
|
643
|
+
if (invokeableTransport.send) {
|
|
644
|
+
if (!isConnected) if (connectingPromise) await connectingPromise;
|
|
645
|
+
else throw Error("send was called before connect");
|
|
646
|
+
await invokeableTransport.send(data);
|
|
647
|
+
}
|
|
648
|
+
},
|
|
649
|
+
async invoke(name, data) {
|
|
650
|
+
if (!isConnected) if (connectingPromise) await connectingPromise;
|
|
651
|
+
else throw Error("invoke was called before connect");
|
|
652
|
+
return invokeableTransport.invoke(name, data);
|
|
653
|
+
}
|
|
654
|
+
};
|
|
655
|
+
};
|
|
656
|
+
const createWebSocketModuleRunnerTransport = (options) => {
|
|
657
|
+
let pingInterval = options.pingInterval ?? 3e4, ws, pingIntervalId;
|
|
658
|
+
return {
|
|
659
|
+
async connect({ onMessage, onDisconnection }) {
|
|
660
|
+
let socket = options.createConnection();
|
|
661
|
+
socket.addEventListener("message", async ({ data }) => {
|
|
662
|
+
onMessage(JSON.parse(data));
|
|
663
|
+
});
|
|
664
|
+
let isOpened = socket.readyState === socket.OPEN;
|
|
665
|
+
isOpened || await new Promise((resolve, reject) => {
|
|
666
|
+
socket.addEventListener("open", () => {
|
|
667
|
+
isOpened = !0, resolve();
|
|
668
|
+
}, { once: !0 }), socket.addEventListener("close", async () => {
|
|
669
|
+
if (!isOpened) {
|
|
670
|
+
reject(/* @__PURE__ */ Error("WebSocket closed without opened."));
|
|
671
|
+
return;
|
|
672
|
+
}
|
|
673
|
+
onMessage({
|
|
674
|
+
type: "custom",
|
|
675
|
+
event: "vite:ws:disconnect",
|
|
676
|
+
data: { webSocket: socket }
|
|
677
|
+
}), onDisconnection();
|
|
678
|
+
});
|
|
679
|
+
}), onMessage({
|
|
680
|
+
type: "custom",
|
|
681
|
+
event: "vite:ws:connect",
|
|
682
|
+
data: { webSocket: socket }
|
|
683
|
+
}), ws = socket, pingIntervalId = setInterval(() => {
|
|
684
|
+
socket.readyState === socket.OPEN && socket.send(JSON.stringify({ type: "ping" }));
|
|
685
|
+
}, pingInterval);
|
|
686
|
+
},
|
|
687
|
+
disconnect() {
|
|
688
|
+
clearInterval(pingIntervalId), ws?.close();
|
|
689
|
+
},
|
|
690
|
+
send(data) {
|
|
691
|
+
ws.send(JSON.stringify(data));
|
|
692
|
+
}
|
|
693
|
+
};
|
|
694
|
+
};
|
|
695
|
+
function createIsBuiltin(builtins) {
|
|
696
|
+
let plainBuiltinsSet = new Set(builtins.filter((builtin) => typeof builtin == "string")), regexBuiltins = builtins.filter((builtin) => typeof builtin != "string");
|
|
697
|
+
return (id) => plainBuiltinsSet.has(id) || regexBuiltins.some((regexp) => regexp.test(id));
|
|
698
|
+
}
|
|
699
|
+
const ssrModuleExportsKey = "__vite_ssr_exports__";
|
|
700
|
+
const ssrImportKey = "__vite_ssr_import__";
|
|
701
|
+
const ssrDynamicImportKey = "__vite_ssr_dynamic_import__";
|
|
702
|
+
const ssrExportAllKey = "__vite_ssr_exportAll__";
|
|
703
|
+
const ssrExportNameKey = "__vite_ssr_exportName__";
|
|
704
|
+
const ssrImportMetaKey = "__vite_ssr_import_meta__";
|
|
705
|
+
const noop = () => {};
|
|
706
|
+
const silentConsole = {
|
|
707
|
+
debug: noop,
|
|
708
|
+
error: noop
|
|
709
|
+
};
|
|
710
|
+
const hmrLogger = {
|
|
711
|
+
debug: (...msg) => console.log("[vite]", ...msg),
|
|
712
|
+
error: (error) => console.log("[vite]", error)
|
|
713
|
+
};
|
|
714
|
+
function createHMRHandler(handler) {
|
|
715
|
+
let queue = new Queue();
|
|
716
|
+
return (payload) => queue.enqueue(() => handler(payload));
|
|
717
|
+
}
|
|
718
|
+
var Queue = class {
|
|
719
|
+
queue = [];
|
|
720
|
+
pending = !1;
|
|
721
|
+
enqueue(promise) {
|
|
722
|
+
return new Promise((resolve, reject) => {
|
|
723
|
+
this.queue.push({
|
|
724
|
+
promise,
|
|
725
|
+
resolve,
|
|
726
|
+
reject
|
|
727
|
+
}), this.dequeue();
|
|
728
|
+
});
|
|
729
|
+
}
|
|
730
|
+
dequeue() {
|
|
731
|
+
if (this.pending) return !1;
|
|
732
|
+
let item = this.queue.shift();
|
|
733
|
+
return item ? (this.pending = !0, item.promise().then(item.resolve).catch(item.reject).finally(() => {
|
|
734
|
+
this.pending = !1, this.dequeue();
|
|
735
|
+
}), !0) : !1;
|
|
736
|
+
}
|
|
737
|
+
};
|
|
738
|
+
function createHMRHandlerForRunner(runner) {
|
|
739
|
+
return createHMRHandler(async (payload) => {
|
|
740
|
+
let hmrClient = runner.hmrClient;
|
|
741
|
+
if (!(!hmrClient || runner.isClosed())) switch (payload.type) {
|
|
742
|
+
case "connected":
|
|
743
|
+
hmrClient.logger.debug("connected.");
|
|
744
|
+
break;
|
|
745
|
+
case "update":
|
|
746
|
+
await hmrClient.notifyListeners("vite:beforeUpdate", payload), await Promise.all(payload.updates.map(async (update) => {
|
|
747
|
+
if (update.type === "js-update") return update.acceptedPath = unwrapId(update.acceptedPath), update.path = unwrapId(update.path), hmrClient.queueUpdate(update);
|
|
748
|
+
hmrClient.logger.error("css hmr is not supported in runner mode.");
|
|
749
|
+
})), await hmrClient.notifyListeners("vite:afterUpdate", payload);
|
|
750
|
+
break;
|
|
751
|
+
case "custom":
|
|
752
|
+
await hmrClient.notifyListeners(payload.event, payload.data);
|
|
753
|
+
break;
|
|
754
|
+
case "full-reload": {
|
|
755
|
+
let { triggeredBy } = payload, clearEntrypointUrls = triggeredBy ? getModulesEntrypoints(runner, getModulesByFile(runner, slash(triggeredBy))) : findAllEntrypoints(runner);
|
|
756
|
+
if (!clearEntrypointUrls.size) break;
|
|
757
|
+
hmrClient.logger.debug("program reload"), await hmrClient.notifyListeners("vite:beforeFullReload", payload), runner.evaluatedModules.clear();
|
|
758
|
+
for (let url of clearEntrypointUrls) {
|
|
759
|
+
if (runner.isClosed()) break;
|
|
760
|
+
try {
|
|
761
|
+
await runner.import(url);
|
|
762
|
+
} catch (err) {
|
|
763
|
+
if (runner.isClosed()) break;
|
|
764
|
+
err.code !== "ERR_OUTDATED_OPTIMIZED_DEP" && hmrClient.logger.error(`An error happened during full reload\n${err.message}\n${err.stack}`);
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
break;
|
|
768
|
+
}
|
|
769
|
+
case "prune":
|
|
770
|
+
await hmrClient.notifyListeners("vite:beforePrune", payload), await hmrClient.prunePaths(payload.paths);
|
|
771
|
+
break;
|
|
772
|
+
case "error": {
|
|
773
|
+
await hmrClient.notifyListeners("vite:error", payload);
|
|
774
|
+
let err = payload.err;
|
|
775
|
+
hmrClient.logger.error(`Internal Server Error\n${err.message}\n${err.stack}`);
|
|
776
|
+
break;
|
|
777
|
+
}
|
|
778
|
+
case "ping": break;
|
|
779
|
+
default: return payload;
|
|
780
|
+
}
|
|
781
|
+
});
|
|
782
|
+
}
|
|
783
|
+
function getModulesByFile(runner, file) {
|
|
784
|
+
let nodes = runner.evaluatedModules.getModulesByFile(file);
|
|
785
|
+
return nodes ? [...nodes].map((node) => node.id) : [];
|
|
786
|
+
}
|
|
787
|
+
function getModulesEntrypoints(runner, modules, visited = /* @__PURE__ */ new Set(), entrypoints = /* @__PURE__ */ new Set()) {
|
|
788
|
+
for (let moduleId of modules) {
|
|
789
|
+
if (visited.has(moduleId)) continue;
|
|
790
|
+
visited.add(moduleId);
|
|
791
|
+
let module = runner.evaluatedModules.getModuleById(moduleId);
|
|
792
|
+
if (module) {
|
|
793
|
+
if (!module.importers.size) {
|
|
794
|
+
entrypoints.add(module.url);
|
|
795
|
+
continue;
|
|
796
|
+
}
|
|
797
|
+
for (let importer of module.importers) getModulesEntrypoints(runner, [importer], visited, entrypoints);
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
return entrypoints;
|
|
801
|
+
}
|
|
802
|
+
function findAllEntrypoints(runner, entrypoints = /* @__PURE__ */ new Set()) {
|
|
803
|
+
for (let mod of runner.evaluatedModules.idToModuleMap.values()) mod.importers.size || entrypoints.add(mod.url);
|
|
804
|
+
return entrypoints;
|
|
805
|
+
}
|
|
806
|
+
const sourceMapCache = {};
|
|
807
|
+
const fileContentsCache = {};
|
|
808
|
+
const evaluatedModulesCache = /* @__PURE__ */ new Set();
|
|
809
|
+
const retrieveFileHandlers = /* @__PURE__ */ new Set();
|
|
810
|
+
const retrieveSourceMapHandlers = /* @__PURE__ */ new Set();
|
|
811
|
+
const createExecHandlers = (handlers) => ((...args) => {
|
|
812
|
+
for (let handler of handlers) {
|
|
813
|
+
let result = handler(...args);
|
|
814
|
+
if (result) return result;
|
|
815
|
+
}
|
|
816
|
+
return null;
|
|
817
|
+
});
|
|
818
|
+
const retrieveFileFromHandlers = createExecHandlers(retrieveFileHandlers);
|
|
819
|
+
const retrieveSourceMapFromHandlers = createExecHandlers(retrieveSourceMapHandlers);
|
|
820
|
+
let overridden = !1;
|
|
821
|
+
const originalPrepare = Error.prepareStackTrace;
|
|
822
|
+
function resetInterceptor(runner, options) {
|
|
823
|
+
evaluatedModulesCache.delete(runner.evaluatedModules), options.retrieveFile && retrieveFileHandlers.delete(options.retrieveFile), options.retrieveSourceMap && retrieveSourceMapHandlers.delete(options.retrieveSourceMap), evaluatedModulesCache.size === 0 && (Error.prepareStackTrace = originalPrepare, overridden = !1);
|
|
824
|
+
}
|
|
825
|
+
function interceptStackTrace(runner, options = {}) {
|
|
826
|
+
return overridden ||= (Error.prepareStackTrace = prepareStackTrace, !0), evaluatedModulesCache.add(runner.evaluatedModules), options.retrieveFile && retrieveFileHandlers.add(options.retrieveFile), options.retrieveSourceMap && retrieveSourceMapHandlers.add(options.retrieveSourceMap), () => resetInterceptor(runner, options);
|
|
827
|
+
}
|
|
828
|
+
function supportRelativeURL(file, url) {
|
|
829
|
+
if (!file) return url;
|
|
830
|
+
let dir = posixDirname(slash(file)), match = /^\w+:\/\/[^/]*/.exec(dir), protocol = match ? match[0] : "", startPath = dir.slice(protocol.length);
|
|
831
|
+
return protocol && /^\/\w:/.test(startPath) ? (protocol += "/", protocol + slash(posixResolve(startPath, url))) : protocol + posixResolve(startPath, url);
|
|
832
|
+
}
|
|
833
|
+
function getRunnerSourceMap(position) {
|
|
834
|
+
for (let moduleGraph of evaluatedModulesCache) {
|
|
835
|
+
let sourceMap = moduleGraph.getModuleSourceMapById(position.source);
|
|
836
|
+
if (sourceMap) return {
|
|
837
|
+
url: position.source,
|
|
838
|
+
map: sourceMap,
|
|
839
|
+
vite: !0
|
|
840
|
+
};
|
|
841
|
+
}
|
|
842
|
+
return null;
|
|
843
|
+
}
|
|
844
|
+
function retrieveFile(path) {
|
|
845
|
+
if (path in fileContentsCache) return fileContentsCache[path];
|
|
846
|
+
let content = retrieveFileFromHandlers(path);
|
|
847
|
+
return typeof content == "string" ? (fileContentsCache[path] = content, content) : null;
|
|
848
|
+
}
|
|
849
|
+
function retrieveSourceMapURL(source) {
|
|
850
|
+
let fileData = retrieveFile(source);
|
|
851
|
+
if (!fileData) return null;
|
|
852
|
+
let re = /\/\/[@#]\s*sourceMappingURL=([^\s'"]+)\s*$|\/\*[@#]\s*sourceMappingURL=[^\s*'"]+\s*\*\/\s*$/gm, lastMatch, match;
|
|
853
|
+
for (; match = re.exec(fileData);) lastMatch = match;
|
|
854
|
+
return lastMatch ? lastMatch[1] : null;
|
|
855
|
+
}
|
|
856
|
+
const reSourceMap = /^data:application\/json[^,]+base64,/;
|
|
857
|
+
function retrieveSourceMap(source) {
|
|
858
|
+
let urlAndMap = retrieveSourceMapFromHandlers(source);
|
|
859
|
+
if (urlAndMap) return urlAndMap;
|
|
860
|
+
let sourceMappingURL = retrieveSourceMapURL(source);
|
|
861
|
+
if (!sourceMappingURL) return null;
|
|
862
|
+
let sourceMapData;
|
|
863
|
+
if (reSourceMap.test(sourceMappingURL)) {
|
|
864
|
+
let rawData = sourceMappingURL.slice(sourceMappingURL.indexOf(",") + 1);
|
|
865
|
+
sourceMapData = Buffer.from(rawData, "base64").toString(), sourceMappingURL = source;
|
|
866
|
+
} else sourceMappingURL = supportRelativeURL(source, sourceMappingURL), sourceMapData = retrieveFile(sourceMappingURL);
|
|
867
|
+
return sourceMapData ? {
|
|
868
|
+
url: sourceMappingURL,
|
|
869
|
+
map: sourceMapData
|
|
870
|
+
} : null;
|
|
871
|
+
}
|
|
872
|
+
function mapSourcePosition(position) {
|
|
873
|
+
if (!position.source) return position;
|
|
874
|
+
let sourceMap = getRunnerSourceMap(position);
|
|
875
|
+
if (sourceMap ||= sourceMapCache[position.source], !sourceMap) {
|
|
876
|
+
let urlAndMap = retrieveSourceMap(position.source);
|
|
877
|
+
if (urlAndMap && urlAndMap.map) {
|
|
878
|
+
let url = urlAndMap.url;
|
|
879
|
+
sourceMap = sourceMapCache[position.source] = {
|
|
880
|
+
url,
|
|
881
|
+
map: new DecodedMap(typeof urlAndMap.map == "string" ? JSON.parse(urlAndMap.map) : urlAndMap.map, url)
|
|
882
|
+
};
|
|
883
|
+
let contents = sourceMap.map?.map.sourcesContent;
|
|
884
|
+
sourceMap.map && contents && sourceMap.map.resolvedSources.forEach((source, i) => {
|
|
885
|
+
let content = contents[i];
|
|
886
|
+
if (content && source && url) {
|
|
887
|
+
let contentUrl = supportRelativeURL(url, source);
|
|
888
|
+
fileContentsCache[contentUrl] = content;
|
|
889
|
+
}
|
|
890
|
+
});
|
|
891
|
+
} else sourceMap = sourceMapCache[position.source] = {
|
|
892
|
+
url: null,
|
|
893
|
+
map: null
|
|
894
|
+
};
|
|
895
|
+
}
|
|
896
|
+
if (sourceMap.map && sourceMap.url) {
|
|
897
|
+
let originalPosition = getOriginalPosition(sourceMap.map, position);
|
|
898
|
+
if (originalPosition && originalPosition.source != null) return originalPosition.source = supportRelativeURL(sourceMap.url, originalPosition.source), sourceMap.vite && (originalPosition._vite = !0), originalPosition;
|
|
899
|
+
}
|
|
900
|
+
return position;
|
|
901
|
+
}
|
|
902
|
+
function mapEvalOrigin(origin) {
|
|
903
|
+
let match = /^eval at ([^(]+) \((.+):(\d+):(\d+)\)$/.exec(origin);
|
|
904
|
+
if (match) {
|
|
905
|
+
let position = mapSourcePosition({
|
|
906
|
+
name: null,
|
|
907
|
+
source: match[2],
|
|
908
|
+
line: +match[3],
|
|
909
|
+
column: match[4] - 1
|
|
910
|
+
});
|
|
911
|
+
return `eval at ${match[1]} (${position.source}:${position.line}:${position.column + 1})`;
|
|
912
|
+
}
|
|
913
|
+
return match = /^eval at ([^(]+) \((.+)\)$/.exec(origin), match ? `eval at ${match[1]} (${mapEvalOrigin(match[2])})` : origin;
|
|
914
|
+
}
|
|
915
|
+
function CallSiteToString() {
|
|
916
|
+
let fileName, fileLocation = "";
|
|
917
|
+
if (this.isNative()) fileLocation = "native";
|
|
918
|
+
else {
|
|
919
|
+
fileName = this.getScriptNameOrSourceURL(), !fileName && this.isEval() && (fileLocation = this.getEvalOrigin(), fileLocation += ", "), fileName ? fileLocation += fileName : fileLocation += "<anonymous>";
|
|
920
|
+
let lineNumber = this.getLineNumber();
|
|
921
|
+
if (lineNumber != null) {
|
|
922
|
+
fileLocation += `:${lineNumber}`;
|
|
923
|
+
let columnNumber = this.getColumnNumber();
|
|
924
|
+
columnNumber && (fileLocation += `:${columnNumber}`);
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
let line = "", functionName = this.getFunctionName(), addSuffix = !0, isConstructor = this.isConstructor();
|
|
928
|
+
if (this.isToplevel() || isConstructor) isConstructor ? line += `new ${functionName || "<anonymous>"}` : functionName ? line += functionName : (line += fileLocation, addSuffix = !1);
|
|
929
|
+
else {
|
|
930
|
+
let typeName = this.getTypeName();
|
|
931
|
+
typeName === "[object Object]" && (typeName = "null");
|
|
932
|
+
let methodName = this.getMethodName();
|
|
933
|
+
functionName ? (typeName && functionName.indexOf(typeName) !== 0 && (line += `${typeName}.`), line += functionName, methodName && functionName.indexOf(`.${methodName}`) !== functionName.length - methodName.length - 1 && (line += ` [as ${methodName}]`)) : line += `${typeName}.${methodName || "<anonymous>"}`;
|
|
934
|
+
}
|
|
935
|
+
return addSuffix && (line += ` (${fileLocation})`), line;
|
|
936
|
+
}
|
|
937
|
+
function cloneCallSite(frame) {
|
|
938
|
+
let object = {};
|
|
939
|
+
return Object.getOwnPropertyNames(Object.getPrototypeOf(frame)).forEach((name) => {
|
|
940
|
+
let key = name;
|
|
941
|
+
object[key] = /^(?:is|get)/.test(name) ? function() {
|
|
942
|
+
return frame[key].call(frame);
|
|
943
|
+
} : frame[key];
|
|
944
|
+
}), object.toString = CallSiteToString, object;
|
|
945
|
+
}
|
|
946
|
+
function wrapCallSite(frame, state) {
|
|
947
|
+
if (state === void 0 && (state = {
|
|
948
|
+
nextPosition: null,
|
|
949
|
+
curPosition: null
|
|
950
|
+
}), frame.isNative()) return state.curPosition = null, frame;
|
|
951
|
+
let source = frame.getFileName() || frame.getScriptNameOrSourceURL();
|
|
952
|
+
if (source) {
|
|
953
|
+
let position = mapSourcePosition({
|
|
954
|
+
name: null,
|
|
955
|
+
source,
|
|
956
|
+
line: frame.getLineNumber() ?? 0,
|
|
957
|
+
column: (frame.getColumnNumber() ?? 1) - 1
|
|
958
|
+
});
|
|
959
|
+
state.curPosition = position, frame = cloneCallSite(frame);
|
|
960
|
+
let originalFunctionName = frame.getFunctionName;
|
|
961
|
+
return frame.getFunctionName = function() {
|
|
962
|
+
let name = state.nextPosition == null ? originalFunctionName() : state.nextPosition.name || originalFunctionName();
|
|
963
|
+
return name === "eval" && "_vite" in position ? null : name;
|
|
964
|
+
}, frame.getFileName = function() {
|
|
965
|
+
return position.source ?? null;
|
|
966
|
+
}, frame.getLineNumber = function() {
|
|
967
|
+
return position.line;
|
|
968
|
+
}, frame.getColumnNumber = function() {
|
|
969
|
+
return position.column + 1;
|
|
970
|
+
}, frame.getScriptNameOrSourceURL = function() {
|
|
971
|
+
return position.source;
|
|
972
|
+
}, frame;
|
|
973
|
+
}
|
|
974
|
+
let origin = frame.isEval() && frame.getEvalOrigin();
|
|
975
|
+
return origin ? (origin = mapEvalOrigin(origin), frame = cloneCallSite(frame), frame.getEvalOrigin = function() {
|
|
976
|
+
return origin || void 0;
|
|
977
|
+
}, frame) : frame;
|
|
978
|
+
}
|
|
979
|
+
function prepareStackTrace(error, stack) {
|
|
980
|
+
let errorString = `${error.name || "Error"}: ${error.message || ""}`, state = {
|
|
981
|
+
nextPosition: null,
|
|
982
|
+
curPosition: null
|
|
983
|
+
}, processedStack = [];
|
|
984
|
+
for (let i = stack.length - 1; i >= 0; i--) processedStack.push(`\n at ${wrapCallSite(stack[i], state)}`), state.nextPosition = state.curPosition;
|
|
985
|
+
return state.curPosition = state.nextPosition = null, errorString + processedStack.reverse().join("");
|
|
986
|
+
}
|
|
987
|
+
function enableSourceMapSupport(runner) {
|
|
988
|
+
if (runner.options.sourcemapInterceptor === "node") {
|
|
989
|
+
if (typeof process > "u") throw TypeError("Cannot use \"sourcemapInterceptor: 'node'\" because global \"process\" variable is not available.");
|
|
990
|
+
if (typeof process.setSourceMapsEnabled != "function") throw TypeError("Cannot use \"sourcemapInterceptor: 'node'\" because \"process.setSourceMapsEnabled\" function is not available. Please use Node >= 16.6.0.");
|
|
991
|
+
let isEnabledAlready = process.sourceMapsEnabled ?? !1;
|
|
992
|
+
return process.setSourceMapsEnabled(!0), () => !isEnabledAlready && process.setSourceMapsEnabled(!1);
|
|
993
|
+
}
|
|
994
|
+
return interceptStackTrace(runner, typeof runner.options.sourcemapInterceptor == "object" ? runner.options.sourcemapInterceptor : void 0);
|
|
995
|
+
}
|
|
996
|
+
var ESModulesEvaluator = class {
|
|
997
|
+
startOffset = getAsyncFunctionDeclarationPaddingLineCount();
|
|
998
|
+
async runInlinedModule(context, code) {
|
|
999
|
+
await new AsyncFunction(ssrModuleExportsKey, ssrImportMetaKey, ssrImportKey, ssrDynamicImportKey, ssrExportAllKey, ssrExportNameKey, "\"use strict\";" + code)(context[ssrModuleExportsKey], context[ssrImportMetaKey], context[ssrImportKey], context[ssrDynamicImportKey], context[ssrExportAllKey], context[ssrExportNameKey]), Object.seal(context[ssrModuleExportsKey]);
|
|
1000
|
+
}
|
|
1001
|
+
runExternalModule(filepath) {
|
|
1002
|
+
return import(filepath);
|
|
1003
|
+
}
|
|
1004
|
+
};
|
|
1005
|
+
const customizationHookNamespace = "vite-module-runner:import-meta-resolve/v1/";
|
|
1006
|
+
const customizationHooksModule = `
|
|
1007
|
+
|
|
1008
|
+
export async function resolve(specifier, context, nextResolve) {
|
|
1009
|
+
if (specifier.startsWith(${JSON.stringify(customizationHookNamespace)})) {
|
|
1010
|
+
const data = specifier.slice(${JSON.stringify(customizationHookNamespace)}.length)
|
|
1011
|
+
const [parsedSpecifier, parsedImporter] = JSON.parse(data)
|
|
1012
|
+
specifier = parsedSpecifier
|
|
1013
|
+
context.parentURL = parsedImporter
|
|
1014
|
+
}
|
|
1015
|
+
return nextResolve(specifier, context)
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
`;
|
|
1019
|
+
function customizationHookResolve(specifier, context, nextResolve) {
|
|
1020
|
+
if (specifier.startsWith(customizationHookNamespace)) {
|
|
1021
|
+
let data = specifier.slice(42), [parsedSpecifier, parsedImporter] = JSON.parse(data);
|
|
1022
|
+
specifier = parsedSpecifier, context.parentURL = parsedImporter;
|
|
1023
|
+
}
|
|
1024
|
+
return nextResolve(specifier, context);
|
|
1025
|
+
}
|
|
1026
|
+
let isHookRegistered = !1;
|
|
1027
|
+
function createImportMetaResolver() {
|
|
1028
|
+
if (isHookRegistered) return importMetaResolveWithCustomHook;
|
|
1029
|
+
let module;
|
|
1030
|
+
try {
|
|
1031
|
+
module = typeof process < "u" ? process.getBuiltinModule("node:module").Module : void 0;
|
|
1032
|
+
} catch {
|
|
1033
|
+
return;
|
|
1034
|
+
}
|
|
1035
|
+
if (module) {
|
|
1036
|
+
if (module.registerHooks) return module.registerHooks({ resolve: customizationHookResolve }), isHookRegistered = !0, importMetaResolveWithCustomHook;
|
|
1037
|
+
if (module.register) {
|
|
1038
|
+
try {
|
|
1039
|
+
let hookModuleContent = `data:text/javascript,${encodeURI(customizationHooksModule)}`;
|
|
1040
|
+
module.register(hookModuleContent);
|
|
1041
|
+
} catch (e) {
|
|
1042
|
+
if ("code" in e && e.code === "ERR_NETWORK_IMPORT_DISALLOWED") return;
|
|
1043
|
+
throw e;
|
|
1044
|
+
}
|
|
1045
|
+
return isHookRegistered = !0, importMetaResolveWithCustomHook;
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
}
|
|
1049
|
+
function importMetaResolveWithCustomHook(specifier, importer) {
|
|
1050
|
+
return import.meta.resolve(`${customizationHookNamespace}${JSON.stringify([specifier, importer])}`);
|
|
1051
|
+
}
|
|
1052
|
+
const envProxy = new Proxy({}, { get(_, p) {
|
|
1053
|
+
throw Error(`[module runner] Dynamic access of "import.meta.env" is not supported. Please, use "import.meta.env.${String(p)}" instead.`);
|
|
1054
|
+
} });
|
|
1055
|
+
function createDefaultImportMeta(modulePath) {
|
|
1056
|
+
let href = posixPathToFileHref(modulePath), filename = modulePath, dirname = posixDirname(modulePath);
|
|
1057
|
+
return {
|
|
1058
|
+
filename: isWindows ? toWindowsPath(filename) : filename,
|
|
1059
|
+
dirname: isWindows ? toWindowsPath(dirname) : dirname,
|
|
1060
|
+
url: href,
|
|
1061
|
+
env: envProxy,
|
|
1062
|
+
resolve(_id, _parent) {
|
|
1063
|
+
throw Error("[module runner] \"import.meta.resolve\" is not supported.");
|
|
1064
|
+
},
|
|
1065
|
+
glob() {
|
|
1066
|
+
throw Error("[module runner] \"import.meta.glob\" is statically replaced during file transformation. Make sure to reference it by the full name.");
|
|
1067
|
+
}
|
|
1068
|
+
};
|
|
1069
|
+
}
|
|
1070
|
+
/**
|
|
1071
|
+
* Create import.meta object for Node.js.
|
|
1072
|
+
*/
|
|
1073
|
+
function createNodeImportMeta(modulePath) {
|
|
1074
|
+
let defaultMeta = createDefaultImportMeta(modulePath), href = defaultMeta.url, importMetaResolver = createImportMetaResolver();
|
|
1075
|
+
return {
|
|
1076
|
+
...defaultMeta,
|
|
1077
|
+
main: !1,
|
|
1078
|
+
resolve(id, parent) {
|
|
1079
|
+
return (importMetaResolver ?? defaultMeta.resolve)(id, parent ?? href);
|
|
1080
|
+
}
|
|
1081
|
+
};
|
|
1082
|
+
}
|
|
1083
|
+
var ModuleRunner = class {
|
|
1084
|
+
evaluatedModules;
|
|
1085
|
+
hmrClient;
|
|
1086
|
+
transport;
|
|
1087
|
+
resetSourceMapSupport;
|
|
1088
|
+
concurrentModuleNodePromises = /* @__PURE__ */ new Map();
|
|
1089
|
+
isBuiltin;
|
|
1090
|
+
builtinsPromise;
|
|
1091
|
+
closed = !1;
|
|
1092
|
+
constructor(options, evaluator = new ESModulesEvaluator(), debug) {
|
|
1093
|
+
if (this.options = options, this.evaluator = evaluator, this.debug = debug, this.evaluatedModules = options.evaluatedModules ?? new EvaluatedModules(), this.transport = normalizeModuleRunnerTransport(options.transport), options.hmr !== !1) {
|
|
1094
|
+
let optionsHmr = options.hmr ?? !0;
|
|
1095
|
+
if (this.hmrClient = new HMRClient(optionsHmr === !0 || optionsHmr.logger === void 0 ? hmrLogger : optionsHmr.logger === !1 ? silentConsole : optionsHmr.logger, this.transport, ({ acceptedPath }) => this.import(acceptedPath)), !this.transport.connect) throw Error("HMR is not supported by this runner transport, but `hmr` option was set to true");
|
|
1096
|
+
this.transport.connect(createHMRHandlerForRunner(this));
|
|
1097
|
+
} else this.transport.connect?.();
|
|
1098
|
+
options.sourcemapInterceptor !== !1 && (this.resetSourceMapSupport = enableSourceMapSupport(this));
|
|
1099
|
+
}
|
|
1100
|
+
/**
|
|
1101
|
+
* URL to execute. Accepts file path, server path or id relative to the root.
|
|
1102
|
+
*/
|
|
1103
|
+
async import(url) {
|
|
1104
|
+
let fetchedModule = await this.cachedModule(url);
|
|
1105
|
+
return await this.cachedRequest(url, fetchedModule);
|
|
1106
|
+
}
|
|
1107
|
+
/**
|
|
1108
|
+
* Clear all caches including HMR listeners.
|
|
1109
|
+
*/
|
|
1110
|
+
clearCache() {
|
|
1111
|
+
this.evaluatedModules.clear(), this.hmrClient?.clear();
|
|
1112
|
+
}
|
|
1113
|
+
/**
|
|
1114
|
+
* Clears all caches, removes all HMR listeners, and resets source map support.
|
|
1115
|
+
* This method doesn't stop the HMR connection.
|
|
1116
|
+
*/
|
|
1117
|
+
async close() {
|
|
1118
|
+
this.resetSourceMapSupport?.(), this.clearCache(), this.hmrClient = void 0, this.closed = !0, await this.transport.disconnect?.();
|
|
1119
|
+
}
|
|
1120
|
+
/**
|
|
1121
|
+
* Returns `true` if the runtime has been closed by calling `close()` method.
|
|
1122
|
+
*/
|
|
1123
|
+
isClosed() {
|
|
1124
|
+
return this.closed;
|
|
1125
|
+
}
|
|
1126
|
+
processImport(exports, fetchResult, metadata) {
|
|
1127
|
+
if (!("externalize" in fetchResult)) return exports;
|
|
1128
|
+
let { url, type } = fetchResult;
|
|
1129
|
+
return type !== "module" && type !== "commonjs" || analyzeImportedModDifference(exports, url, type, metadata), exports;
|
|
1130
|
+
}
|
|
1131
|
+
isCircularModule(mod) {
|
|
1132
|
+
for (let importedFile of mod.imports) if (mod.importers.has(importedFile)) return !0;
|
|
1133
|
+
return !1;
|
|
1134
|
+
}
|
|
1135
|
+
isCircularImport(importers, moduleUrl, visited = /* @__PURE__ */ new Set()) {
|
|
1136
|
+
for (let importer of importers) {
|
|
1137
|
+
if (visited.has(importer)) continue;
|
|
1138
|
+
if (visited.add(importer), importer === moduleUrl) return !0;
|
|
1139
|
+
let mod = this.evaluatedModules.getModuleById(importer);
|
|
1140
|
+
if (mod && mod.importers.size && this.isCircularImport(mod.importers, moduleUrl, visited)) return !0;
|
|
1141
|
+
}
|
|
1142
|
+
return !1;
|
|
1143
|
+
}
|
|
1144
|
+
async cachedRequest(url, mod, callstack = [], metadata) {
|
|
1145
|
+
let meta = mod.meta, moduleId = meta.id, { importers } = mod, importee = callstack[callstack.length - 1];
|
|
1146
|
+
if (importee && importers.add(importee), mod.evaluated && mod.promise) return this.processImport(await mod.promise, meta, metadata);
|
|
1147
|
+
if ((callstack.includes(moduleId) || this.isCircularModule(mod) || this.isCircularImport(importers, moduleId)) && mod.exports) return this.processImport(mod.exports, meta, metadata);
|
|
1148
|
+
let debugTimer;
|
|
1149
|
+
this.debug && (debugTimer = setTimeout(() => {
|
|
1150
|
+
this.debug(`[module runner] module ${moduleId} takes over 2s to load.\n${`stack:\n${[...callstack, moduleId].reverse().map((p) => ` - ${p}`).join("\n")}`}`);
|
|
1151
|
+
}, 2e3));
|
|
1152
|
+
try {
|
|
1153
|
+
if (mod.promise) return this.processImport(await mod.promise, meta, metadata);
|
|
1154
|
+
let promise = this.directRequest(url, mod, callstack);
|
|
1155
|
+
return mod.promise = promise, mod.evaluated = !1, this.processImport(await promise, meta, metadata);
|
|
1156
|
+
} finally {
|
|
1157
|
+
mod.evaluated = !0, debugTimer && clearTimeout(debugTimer);
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
async cachedModule(url, importer) {
|
|
1161
|
+
let cached = this.concurrentModuleNodePromises.get(url);
|
|
1162
|
+
if (cached) this.debug?.("[module runner] using cached module info for", url);
|
|
1163
|
+
else {
|
|
1164
|
+
let cachedModule = this.evaluatedModules.getModuleByUrl(url);
|
|
1165
|
+
cached = this.getModuleInformation(url, importer, cachedModule).finally(() => {
|
|
1166
|
+
this.concurrentModuleNodePromises.delete(url);
|
|
1167
|
+
}), this.concurrentModuleNodePromises.set(url, cached);
|
|
1168
|
+
}
|
|
1169
|
+
return cached;
|
|
1170
|
+
}
|
|
1171
|
+
ensureBuiltins() {
|
|
1172
|
+
if (!this.isBuiltin) return this.builtinsPromise ??= (async () => {
|
|
1173
|
+
try {
|
|
1174
|
+
this.debug?.("[module runner] fetching builtins from server");
|
|
1175
|
+
let builtins = (await this.transport.invoke("getBuiltins", [])).map((builtin) => typeof builtin == "object" && builtin && "type" in builtin ? builtin.type === "string" ? builtin.value : new RegExp(builtin.source, builtin.flags) : builtin);
|
|
1176
|
+
this.isBuiltin = createIsBuiltin(builtins), this.debug?.("[module runner] builtins loaded:", builtins);
|
|
1177
|
+
} finally {
|
|
1178
|
+
this.builtinsPromise = void 0;
|
|
1179
|
+
}
|
|
1180
|
+
})(), this.builtinsPromise;
|
|
1181
|
+
}
|
|
1182
|
+
async getModuleInformation(url, importer, cachedModule) {
|
|
1183
|
+
if (this.closed) throw Error("Vite module runner has been closed.");
|
|
1184
|
+
await this.ensureBuiltins(), this.debug?.("[module runner] fetching", url);
|
|
1185
|
+
let isCached = !!(typeof cachedModule == "object" && cachedModule.meta), fetchedModule = url.startsWith("data:") || this.isBuiltin?.(url) ? {
|
|
1186
|
+
externalize: url,
|
|
1187
|
+
type: "builtin"
|
|
1188
|
+
} : await this.transport.invoke("fetchModule", [
|
|
1189
|
+
url,
|
|
1190
|
+
importer,
|
|
1191
|
+
{
|
|
1192
|
+
cached: isCached,
|
|
1193
|
+
startOffset: this.evaluator.startOffset
|
|
1194
|
+
}
|
|
1195
|
+
]);
|
|
1196
|
+
if ("cache" in fetchedModule) {
|
|
1197
|
+
if (!cachedModule || !cachedModule.meta) throw Error(`Module "${url}" was mistakenly invalidated during fetch phase.`);
|
|
1198
|
+
return cachedModule;
|
|
1199
|
+
}
|
|
1200
|
+
let moduleId = "externalize" in fetchedModule ? fetchedModule.externalize : fetchedModule.id, moduleUrl = "url" in fetchedModule ? fetchedModule.url : url, module = this.evaluatedModules.ensureModule(moduleId, moduleUrl);
|
|
1201
|
+
return "invalidate" in fetchedModule && fetchedModule.invalidate && this.evaluatedModules.invalidateModule(module), fetchedModule.url = moduleUrl, fetchedModule.id = moduleId, module.meta = fetchedModule, module;
|
|
1202
|
+
}
|
|
1203
|
+
async directRequest(url, mod, _callstack) {
|
|
1204
|
+
let fetchResult = mod.meta, moduleId = fetchResult.id, callstack = [..._callstack, moduleId], request = async (dep, metadata) => {
|
|
1205
|
+
let importer = "file" in fetchResult && fetchResult.file || moduleId, depMod = await this.cachedModule(dep, importer);
|
|
1206
|
+
return depMod.importers.add(moduleId), mod.imports.add(depMod.id), this.cachedRequest(dep, depMod, callstack, metadata);
|
|
1207
|
+
}, dynamicRequest = async (dep) => (dep = String(dep), dep[0] === "." && (dep = posixResolve(posixDirname(url), dep)), request(dep, { isDynamicImport: !0 }));
|
|
1208
|
+
if ("externalize" in fetchResult) {
|
|
1209
|
+
let { externalize } = fetchResult;
|
|
1210
|
+
this.debug?.("[module runner] externalizing", externalize);
|
|
1211
|
+
let exports = await this.evaluator.runExternalModule(externalize);
|
|
1212
|
+
return mod.exports = exports, exports;
|
|
1213
|
+
}
|
|
1214
|
+
let { code, file } = fetchResult;
|
|
1215
|
+
if (code == null) {
|
|
1216
|
+
let importer = callstack[callstack.length - 2];
|
|
1217
|
+
throw Error(`[module runner] Failed to load "${url}"${importer ? ` imported from ${importer}` : ""}`);
|
|
1218
|
+
}
|
|
1219
|
+
let createImportMeta = this.options.createImportMeta ?? createDefaultImportMeta, modulePath = cleanUrl(file || moduleId), href = posixPathToFileHref(modulePath), meta = await createImportMeta(modulePath), exports = Object.create(null);
|
|
1220
|
+
Object.defineProperty(exports, Symbol.toStringTag, {
|
|
1221
|
+
value: "Module",
|
|
1222
|
+
enumerable: !1,
|
|
1223
|
+
configurable: !1
|
|
1224
|
+
}), mod.exports = exports;
|
|
1225
|
+
let hotContext;
|
|
1226
|
+
this.hmrClient && Object.defineProperty(meta, "hot", {
|
|
1227
|
+
enumerable: !0,
|
|
1228
|
+
get: () => {
|
|
1229
|
+
if (!this.hmrClient) throw Error("[module runner] HMR client was closed.");
|
|
1230
|
+
return this.debug?.("[module runner] creating hmr context for", mod.url), hotContext ||= new HMRContext(this.hmrClient, mod.url), hotContext;
|
|
1231
|
+
},
|
|
1232
|
+
set: (value) => {
|
|
1233
|
+
hotContext = value;
|
|
1234
|
+
}
|
|
1235
|
+
});
|
|
1236
|
+
let context = {
|
|
1237
|
+
[ssrImportKey]: request,
|
|
1238
|
+
[ssrDynamicImportKey]: dynamicRequest,
|
|
1239
|
+
[ssrModuleExportsKey]: exports,
|
|
1240
|
+
[ssrExportAllKey]: (obj) => exportAll(exports, obj),
|
|
1241
|
+
[ssrExportNameKey]: (name, getter) => Object.defineProperty(exports, name, {
|
|
1242
|
+
enumerable: !0,
|
|
1243
|
+
configurable: !0,
|
|
1244
|
+
get: getter
|
|
1245
|
+
}),
|
|
1246
|
+
[ssrImportMetaKey]: meta
|
|
1247
|
+
};
|
|
1248
|
+
return this.debug?.("[module runner] executing", href), await this.evaluator.runInlinedModule(context, code, mod), exports;
|
|
1249
|
+
}
|
|
1250
|
+
};
|
|
1251
|
+
function exportAll(exports, sourceModule) {
|
|
1252
|
+
if (exports !== sourceModule && !(isPrimitive(sourceModule) || Array.isArray(sourceModule) || sourceModule instanceof Promise)) {
|
|
1253
|
+
for (let key in sourceModule) if (key !== "default" && key !== "__esModule" && !(key in exports)) try {
|
|
1254
|
+
Object.defineProperty(exports, key, {
|
|
1255
|
+
enumerable: !0,
|
|
1256
|
+
configurable: !0,
|
|
1257
|
+
get: () => sourceModule[key]
|
|
1258
|
+
});
|
|
1259
|
+
} catch {}
|
|
1260
|
+
}
|
|
1261
|
+
}
|
|
1262
|
+
//#endregion
|
|
1263
|
+
export { ESModulesEvaluator, EvaluatedModules, ModuleRunner, createDefaultImportMeta, createNodeImportMeta, createWebSocketModuleRunnerTransport, normalizeModuleId, ssrDynamicImportKey, ssrExportAllKey, ssrExportNameKey, ssrImportKey, ssrImportMetaKey, ssrModuleExportsKey };
|
|
1264
|
+
|
|
1265
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLXJ1bm5lci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdml0ZUA4LjAuM19AZW1uYXBpK2NvcmVAMS4xMS4yX0BlbW5hcGkrcnVudGltZUAxLjExLjJfQHR5cGVzK25vZGVAMjUuMC43X2VzYnVpbGRAMC4yNy40XzI1MTljMmU4ZDgwMTNmY2JjN2I0NDM4NzliYzlkYTZkL25vZGVfbW9kdWxlcy92aXRlL2Rpc3Qvbm9kZS9tb2R1bGUtcnVubmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImxldCBTT1VSQ0VNQVBQSU5HX1VSTCA9IFwic291cmNlTWFcIjtcblNPVVJDRU1BUFBJTkdfVVJMICs9IFwicHBpbmdVUkxcIjtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9zaGFyZWQvdXRpbHMudHNcbmNvbnN0IGlzV2luZG93cyA9IHR5cGVvZiBwcm9jZXNzIDwgXCJ1XCIgJiYgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiO1xuLyoqXG4qIFVuZG8ge0BsaW5rIHdyYXBJZH0ncyBgL0BpZC9gIGFuZCBudWxsIGJ5dGUgcmVwbGFjZW1lbnRzLlxuKi9cbmZ1bmN0aW9uIHVud3JhcElkKGlkKSB7XG5cdHJldHVybiBpZC5zdGFydHNXaXRoKFwiL0BpZC9cIikgPyBpZC5zbGljZSg1KS5yZXBsYWNlKFwiX194MDBfX1wiLCBcIlxcMFwiKSA6IGlkO1xufVxuY29uc3Qgd2luZG93c1NsYXNoUkUgPSAvXFxcXC9nO1xuZnVuY3Rpb24gc2xhc2gocCkge1xuXHRyZXR1cm4gcC5yZXBsYWNlKHdpbmRvd3NTbGFzaFJFLCBcIi9cIik7XG59XG5jb25zdCBwb3N0Zml4UkUgPSAvWz8jXS4qJC87XG5mdW5jdGlvbiBjbGVhblVybCh1cmwpIHtcblx0cmV0dXJuIHVybC5yZXBsYWNlKHBvc3RmaXhSRSwgXCJcIik7XG59XG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWx1ZSkge1xuXHRyZXR1cm4gIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPSBcImZ1bmN0aW9uXCI7XG59XG5jb25zdCBBc3luY0Z1bmN0aW9uID0gYXN5bmMgZnVuY3Rpb24oKSB7fS5jb25zdHJ1Y3RvcjtcbmxldCBhc3luY0Z1bmN0aW9uRGVjbGFyYXRpb25QYWRkaW5nTGluZUNvdW50O1xuZnVuY3Rpb24gZ2V0QXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uUGFkZGluZ0xpbmVDb3VudCgpIHtcblx0aWYgKGFzeW5jRnVuY3Rpb25EZWNsYXJhdGlvblBhZGRpbmdMaW5lQ291bnQgPT09IHZvaWQgMCkge1xuXHRcdGxldCBib2R5ID0gXCIvKmNvZGUqL1wiLCBzb3VyY2UgPSBuZXcgQXN5bmNGdW5jdGlvbihcImFcIiwgXCJiXCIsIGJvZHkpLnRvU3RyaW5nKCk7XG5cdFx0YXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uUGFkZGluZ0xpbmVDb3VudCA9IHNvdXJjZS5zbGljZSgwLCBzb3VyY2UuaW5kZXhPZihib2R5KSkuc3BsaXQoXCJcXG5cIikubGVuZ3RoIC0gMTtcblx0fVxuXHRyZXR1cm4gYXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uUGFkZGluZ0xpbmVDb3VudDtcbn1cbmZ1bmN0aW9uIHByb21pc2VXaXRoUmVzb2x2ZXJzKCkge1xuXHRsZXQgcmVzb2x2ZSwgcmVqZWN0O1xuXHRyZXR1cm4ge1xuXHRcdHByb21pc2U6IG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xuXHRcdFx0cmVzb2x2ZSA9IF9yZXNvbHZlLCByZWplY3QgPSBfcmVqZWN0O1xuXHRcdH0pLFxuXHRcdHJlc29sdmUsXG5cdFx0cmVqZWN0XG5cdH07XG59XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcGF0aGVAMi4wLjMvbm9kZV9tb2R1bGVzL3BhdGhlL2Rpc3Qvc2hhcmVkL3BhdGhlLk0tZVRodE5aLm1qc1xuY29uc3QgX0RSSVZFX0xFVFRFUl9TVEFSVF9SRSA9IC9eW0EtWmEtel06XFwvLztcbmZ1bmN0aW9uIG5vcm1hbGl6ZVdpbmRvd3NQYXRoKGlucHV0ID0gXCJcIikge1xuXHRyZXR1cm4gaW5wdXQgJiYgaW5wdXQucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikucmVwbGFjZShfRFJJVkVfTEVUVEVSX1NUQVJUX1JFLCAocikgPT4gci50b1VwcGVyQ2FzZSgpKTtcbn1cbmNvbnN0IF9JU19BQlNPTFVURV9SRSA9IC9eWy9cXFxcXSg/IVsvXFxcXF0pfF5bL1xcXFxdezJ9KD8hXFwuKXxeW0EtWmEtel06Wy9cXFxcXS8sIF9EUklWRV9MRVRURVJfUkUgPSAvXltBLVphLXpdOiQvO1xuZnVuY3Rpb24gY3dkKCkge1xuXHRyZXR1cm4gdHlwZW9mIHByb2Nlc3MgPCBcInVcIiAmJiB0eXBlb2YgcHJvY2Vzcy5jd2QgPT0gXCJmdW5jdGlvblwiID8gcHJvY2Vzcy5jd2QoKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKSA6IFwiL1wiO1xufVxuY29uc3QgcmVzb2x2ZSA9IGZ1bmN0aW9uKC4uLmFyZ3VtZW50c18pIHtcblx0YXJndW1lbnRzXyA9IGFyZ3VtZW50c18ubWFwKChhcmd1bWVudCkgPT4gbm9ybWFsaXplV2luZG93c1BhdGgoYXJndW1lbnQpKTtcblx0bGV0IHJlc29sdmVkUGF0aCA9IFwiXCIsIHJlc29sdmVkQWJzb2x1dGUgPSAhMTtcblx0Zm9yIChsZXQgaW5kZXggPSBhcmd1bWVudHNfLmxlbmd0aCAtIDE7IGluZGV4ID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpbmRleC0tKSB7XG5cdFx0bGV0IHBhdGggPSBpbmRleCA+PSAwID8gYXJndW1lbnRzX1tpbmRleF0gOiBjd2QoKTtcblx0XHQhcGF0aCB8fCBwYXRoLmxlbmd0aCA9PT0gMCB8fCAocmVzb2x2ZWRQYXRoID0gYCR7cGF0aH0vJHtyZXNvbHZlZFBhdGh9YCwgcmVzb2x2ZWRBYnNvbHV0ZSA9IGlzQWJzb2x1dGUocGF0aCkpO1xuXHR9XG5cdHJldHVybiByZXNvbHZlZFBhdGggPSBub3JtYWxpemVTdHJpbmcocmVzb2x2ZWRQYXRoLCAhcmVzb2x2ZWRBYnNvbHV0ZSksIHJlc29sdmVkQWJzb2x1dGUgJiYgIWlzQWJzb2x1dGUocmVzb2x2ZWRQYXRoKSA/IGAvJHtyZXNvbHZlZFBhdGh9YCA6IHJlc29sdmVkUGF0aC5sZW5ndGggPiAwID8gcmVzb2x2ZWRQYXRoIDogXCIuXCI7XG59O1xuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nKHBhdGgsIGFsbG93QWJvdmVSb290KSB7XG5cdGxldCByZXMgPSBcIlwiLCBsYXN0U2VnbWVudExlbmd0aCA9IDAsIGxhc3RTbGFzaCA9IC0xLCBkb3RzID0gMCwgY2hhciA9IG51bGw7XG5cdGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPD0gcGF0aC5sZW5ndGg7ICsraW5kZXgpIHtcblx0XHRpZiAoaW5kZXggPCBwYXRoLmxlbmd0aCkgY2hhciA9IHBhdGhbaW5kZXhdO1xuXHRcdGVsc2UgaWYgKGNoYXIgPT09IFwiL1wiKSBicmVhaztcblx0XHRlbHNlIGNoYXIgPSBcIi9cIjtcblx0XHRpZiAoY2hhciA9PT0gXCIvXCIpIHtcblx0XHRcdGlmICghKGxhc3RTbGFzaCA9PT0gaW5kZXggLSAxIHx8IGRvdHMgPT09IDEpKSBpZiAoZG90cyA9PT0gMikge1xuXHRcdFx0XHRpZiAocmVzLmxlbmd0aCA8IDIgfHwgbGFzdFNlZ21lbnRMZW5ndGggIT09IDIgfHwgcmVzW3Jlcy5sZW5ndGggLSAxXSAhPT0gXCIuXCIgfHwgcmVzW3Jlcy5sZW5ndGggLSAyXSAhPT0gXCIuXCIpIHtcblx0XHRcdFx0XHRpZiAocmVzLmxlbmd0aCA+IDIpIHtcblx0XHRcdFx0XHRcdGxldCBsYXN0U2xhc2hJbmRleCA9IHJlcy5sYXN0SW5kZXhPZihcIi9cIik7XG5cdFx0XHRcdFx0XHRsYXN0U2xhc2hJbmRleCA9PT0gLTEgPyAocmVzID0gXCJcIiwgbGFzdFNlZ21lbnRMZW5ndGggPSAwKSA6IChyZXMgPSByZXMuc2xpY2UoMCwgbGFzdFNsYXNoSW5kZXgpLCBsYXN0U2VnbWVudExlbmd0aCA9IHJlcy5sZW5ndGggLSAxIC0gcmVzLmxhc3RJbmRleE9mKFwiL1wiKSksIGxhc3RTbGFzaCA9IGluZGV4LCBkb3RzID0gMDtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAocmVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdHJlcyA9IFwiXCIsIGxhc3RTZWdtZW50TGVuZ3RoID0gMCwgbGFzdFNsYXNoID0gaW5kZXgsIGRvdHMgPSAwO1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGFsbG93QWJvdmVSb290ICYmIChyZXMgKz0gcmVzLmxlbmd0aCA+IDAgPyBcIi8uLlwiIDogXCIuLlwiLCBsYXN0U2VnbWVudExlbmd0aCA9IDIpO1xuXHRcdFx0fSBlbHNlIHJlcy5sZW5ndGggPiAwID8gcmVzICs9IGAvJHtwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGluZGV4KX1gIDogcmVzID0gcGF0aC5zbGljZShsYXN0U2xhc2ggKyAxLCBpbmRleCksIGxhc3RTZWdtZW50TGVuZ3RoID0gaW5kZXggLSBsYXN0U2xhc2ggLSAxO1xuXHRcdFx0bGFzdFNsYXNoID0gaW5kZXgsIGRvdHMgPSAwO1xuXHRcdH0gZWxzZSBjaGFyID09PSBcIi5cIiAmJiBkb3RzICE9PSAtMSA/ICsrZG90cyA6IGRvdHMgPSAtMTtcblx0fVxuXHRyZXR1cm4gcmVzO1xufVxuY29uc3QgaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHApIHtcblx0cmV0dXJuIF9JU19BQlNPTFVURV9SRS50ZXN0KHApO1xufSwgZGlybmFtZSA9IGZ1bmN0aW9uKHApIHtcblx0bGV0IHNlZ21lbnRzID0gbm9ybWFsaXplV2luZG93c1BhdGgocCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSk7XG5cdHJldHVybiBzZWdtZW50cy5sZW5ndGggPT09IDEgJiYgX0RSSVZFX0xFVFRFUl9SRS50ZXN0KHNlZ21lbnRzWzBdKSAmJiAoc2VnbWVudHNbMF0gKz0gXCIvXCIpLCBzZWdtZW50cy5qb2luKFwiL1wiKSB8fCAoaXNBYnNvbHV0ZShwKSA/IFwiL1wiIDogXCIuXCIpO1xufSwgdGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKSwgZGVjb2RlQmFzZTY0ID0gdHlwZW9mIEJ1ZmZlciA9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIEJ1ZmZlci5mcm9tID09IFwiZnVuY3Rpb25cIiA/IChiYXNlNjQpID0+IEJ1ZmZlci5mcm9tKGJhc2U2NCwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJ1dGYtOFwiKSA6IChiYXNlNjQpID0+IHRleHREZWNvZGVyLmRlY29kZShVaW50OEFycmF5LmZyb20oYXRvYihiYXNlNjQpLCAoYykgPT4gYy5jaGFyQ29kZUF0KDApKSksIHBlcmNlbnRSZWdFeCA9IC8lL2csIGJhY2tzbGFzaFJlZ0V4ID0gL1xcXFwvZywgbmV3bGluZVJlZ0V4ID0gL1xcbi9nLCBjYXJyaWFnZVJldHVyblJlZ0V4ID0gL1xcci9nLCB0YWJSZWdFeCA9IC9cXHQvZywgcXVlc3Rpb25SZWdleCA9IC9cXD8vZywgaGFzaFJlZ2V4ID0gLyMvZztcbmZ1bmN0aW9uIGVuY29kZVBhdGhDaGFycyhmaWxlcGF0aCkge1xuXHRyZXR1cm4gZmlsZXBhdGguaW5kZXhPZihcIiVcIikgIT09IC0xICYmIChmaWxlcGF0aCA9IGZpbGVwYXRoLnJlcGxhY2UocGVyY2VudFJlZ0V4LCBcIiUyNVwiKSksICFpc1dpbmRvd3MgJiYgZmlsZXBhdGguaW5kZXhPZihcIlxcXFxcIikgIT09IC0xICYmIChmaWxlcGF0aCA9IGZpbGVwYXRoLnJlcGxhY2UoYmFja3NsYXNoUmVnRXgsIFwiJTVDXCIpKSwgZmlsZXBhdGguaW5kZXhPZihcIlxcblwiKSAhPT0gLTEgJiYgKGZpbGVwYXRoID0gZmlsZXBhdGgucmVwbGFjZShuZXdsaW5lUmVnRXgsIFwiJTBBXCIpKSwgZmlsZXBhdGguaW5kZXhPZihcIlxcclwiKSAhPT0gLTEgJiYgKGZpbGVwYXRoID0gZmlsZXBhdGgucmVwbGFjZShjYXJyaWFnZVJldHVyblJlZ0V4LCBcIiUwRFwiKSksIGZpbGVwYXRoLmluZGV4T2YoXCJcdFwiKSAhPT0gLTEgJiYgKGZpbGVwYXRoID0gZmlsZXBhdGgucmVwbGFjZSh0YWJSZWdFeCwgXCIlMDlcIikpLCBmaWxlcGF0aDtcbn1cbmNvbnN0IHBvc2l4RGlybmFtZSA9IGRpcm5hbWUsIHBvc2l4UmVzb2x2ZSA9IHJlc29sdmU7XG5mdW5jdGlvbiBwb3NpeFBhdGhUb0ZpbGVIcmVmKHBvc2l4UGF0aCkge1xuXHRsZXQgcmVzb2x2ZWQgPSBwb3NpeFJlc29sdmUocG9zaXhQYXRoKSwgZmlsZVBhdGhMYXN0ID0gcG9zaXhQYXRoLmNoYXJDb2RlQXQocG9zaXhQYXRoLmxlbmd0aCAtIDEpO1xuXHRyZXR1cm4gKGZpbGVQYXRoTGFzdCA9PT0gNDcgfHwgaXNXaW5kb3dzICYmIGZpbGVQYXRoTGFzdCA9PT0gOTIpICYmIHJlc29sdmVkW3Jlc29sdmVkLmxlbmd0aCAtIDFdICE9PSBcIi9cIiAmJiAocmVzb2x2ZWQgKz0gXCIvXCIpLCByZXNvbHZlZCA9IGVuY29kZVBhdGhDaGFycyhyZXNvbHZlZCksIHJlc29sdmVkLmluZGV4T2YoXCI/XCIpICE9PSAtMSAmJiAocmVzb2x2ZWQgPSByZXNvbHZlZC5yZXBsYWNlKHF1ZXN0aW9uUmVnZXgsIFwiJTNGXCIpKSwgcmVzb2x2ZWQuaW5kZXhPZihcIiNcIikgIT09IC0xICYmIChyZXNvbHZlZCA9IHJlc29sdmVkLnJlcGxhY2UoaGFzaFJlZ2V4LCBcIiUyM1wiKSksIG5ldyBVUkwoYGZpbGU6Ly8ke3Jlc29sdmVkfWApLmhyZWY7XG59XG5mdW5jdGlvbiB0b1dpbmRvd3NQYXRoKHBhdGgpIHtcblx0cmV0dXJuIHBhdGgucmVwbGFjZSgvXFwvL2csIFwiXFxcXFwiKTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AanJpZGdld2VsbCtzb3VyY2VtYXAtY29kZWNAMS41LjUvbm9kZV9tb2R1bGVzL0BqcmlkZ2V3ZWxsL3NvdXJjZW1hcC1jb2RlYy9kaXN0L3NvdXJjZW1hcC1jb2RlYy5tanNcbnZhciBjb21tYSA9IDQ0LCBjaGFycyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiLCBpbnRUb0NoYXIgPSBuZXcgVWludDhBcnJheSg2NCksIGNoYXJUb0ludCA9IG5ldyBVaW50OEFycmF5KDEyOCk7XG5mb3IgKGxldCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7XG5cdGxldCBjID0gY2hhcnMuY2hhckNvZGVBdChpKTtcblx0aW50VG9DaGFyW2ldID0gYywgY2hhclRvSW50W2NdID0gaTtcbn1cbmZ1bmN0aW9uIGRlY29kZUludGVnZXIocmVhZGVyLCByZWxhdGl2ZSkge1xuXHRsZXQgdmFsdWUgPSAwLCBzaGlmdCA9IDAsIGludGVnZXIgPSAwO1xuXHRkb1xuXHRcdGludGVnZXIgPSBjaGFyVG9JbnRbcmVhZGVyLm5leHQoKV0sIHZhbHVlIHw9IChpbnRlZ2VyICYgMzEpIDw8IHNoaWZ0LCBzaGlmdCArPSA1O1xuXHR3aGlsZSAoaW50ZWdlciAmIDMyKTtcblx0bGV0IHNob3VsZE5lZ2F0ZSA9IHZhbHVlICYgMTtcblx0cmV0dXJuIHZhbHVlID4+Pj0gMSwgc2hvdWxkTmVnYXRlICYmICh2YWx1ZSA9IC0yMTQ3NDgzNjQ4IHwgLXZhbHVlKSwgcmVsYXRpdmUgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGhhc01vcmVWbHEocmVhZGVyLCBtYXgpIHtcblx0cmV0dXJuIHJlYWRlci5wb3MgPj0gbWF4ID8gITEgOiByZWFkZXIucGVlaygpICE9PSBjb21tYTtcbn1cbnZhciBTdHJpbmdSZWFkZXIgPSBjbGFzcyB7XG5cdGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuXHRcdHRoaXMucG9zID0gMCwgdGhpcy5idWZmZXIgPSBidWZmZXI7XG5cdH1cblx0bmV4dCgpIHtcblx0XHRyZXR1cm4gdGhpcy5idWZmZXIuY2hhckNvZGVBdCh0aGlzLnBvcysrKTtcblx0fVxuXHRwZWVrKCkge1xuXHRcdHJldHVybiB0aGlzLmJ1ZmZlci5jaGFyQ29kZUF0KHRoaXMucG9zKTtcblx0fVxuXHRpbmRleE9mKGNoYXIpIHtcblx0XHRsZXQgeyBidWZmZXIsIHBvcyB9ID0gdGhpcywgaWR4ID0gYnVmZmVyLmluZGV4T2YoY2hhciwgcG9zKTtcblx0XHRyZXR1cm4gaWR4ID09PSAtMSA/IGJ1ZmZlci5sZW5ndGggOiBpZHg7XG5cdH1cbn07XG5mdW5jdGlvbiBkZWNvZGUobWFwcGluZ3MpIHtcblx0bGV0IHsgbGVuZ3RoIH0gPSBtYXBwaW5ncywgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihtYXBwaW5ncyksIGRlY29kZWQgPSBbXSwgZ2VuQ29sdW1uID0gMCwgc291cmNlc0luZGV4ID0gMCwgc291cmNlTGluZSA9IDAsIHNvdXJjZUNvbHVtbiA9IDAsIG5hbWVzSW5kZXggPSAwO1xuXHRkbyB7XG5cdFx0bGV0IHNlbWkgPSByZWFkZXIuaW5kZXhPZihcIjtcIiksIGxpbmUgPSBbXSwgc29ydGVkID0gITAsIGxhc3RDb2wgPSAwO1xuXHRcdGZvciAoZ2VuQ29sdW1uID0gMDsgcmVhZGVyLnBvcyA8IHNlbWk7KSB7XG5cdFx0XHRsZXQgc2VnO1xuXHRcdFx0Z2VuQ29sdW1uID0gZGVjb2RlSW50ZWdlcihyZWFkZXIsIGdlbkNvbHVtbiksIGdlbkNvbHVtbiA8IGxhc3RDb2wgJiYgKHNvcnRlZCA9ICExKSwgbGFzdENvbCA9IGdlbkNvbHVtbiwgaGFzTW9yZVZscShyZWFkZXIsIHNlbWkpID8gKHNvdXJjZXNJbmRleCA9IGRlY29kZUludGVnZXIocmVhZGVyLCBzb3VyY2VzSW5kZXgpLCBzb3VyY2VMaW5lID0gZGVjb2RlSW50ZWdlcihyZWFkZXIsIHNvdXJjZUxpbmUpLCBzb3VyY2VDb2x1bW4gPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgc291cmNlQ29sdW1uKSwgaGFzTW9yZVZscShyZWFkZXIsIHNlbWkpID8gKG5hbWVzSW5kZXggPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgbmFtZXNJbmRleCksIHNlZyA9IFtcblx0XHRcdFx0Z2VuQ29sdW1uLFxuXHRcdFx0XHRzb3VyY2VzSW5kZXgsXG5cdFx0XHRcdHNvdXJjZUxpbmUsXG5cdFx0XHRcdHNvdXJjZUNvbHVtbixcblx0XHRcdFx0bmFtZXNJbmRleFxuXHRcdFx0XSkgOiBzZWcgPSBbXG5cdFx0XHRcdGdlbkNvbHVtbixcblx0XHRcdFx0c291cmNlc0luZGV4LFxuXHRcdFx0XHRzb3VyY2VMaW5lLFxuXHRcdFx0XHRzb3VyY2VDb2x1bW5cblx0XHRcdF0pIDogc2VnID0gW2dlbkNvbHVtbl0sIGxpbmUucHVzaChzZWcpLCByZWFkZXIucG9zKys7XG5cdFx0fVxuXHRcdHNvcnRlZCB8fCBzb3J0KGxpbmUpLCBkZWNvZGVkLnB1c2gobGluZSksIHJlYWRlci5wb3MgPSBzZW1pICsgMTtcblx0fSB3aGlsZSAocmVhZGVyLnBvcyA8PSBsZW5ndGgpO1xuXHRyZXR1cm4gZGVjb2RlZDtcbn1cbmZ1bmN0aW9uIHNvcnQobGluZSkge1xuXHRsaW5lLnNvcnQoc29ydENvbXBhcmF0b3IpO1xufVxuZnVuY3Rpb24gc29ydENvbXBhcmF0b3IoYSwgYikge1xuXHRyZXR1cm4gYVswXSAtIGJbMF07XG59XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGpyaWRnZXdlbGwrdHJhY2UtbWFwcGluZ0AwLjMuMzEvbm9kZV9tb2R1bGVzL0BqcmlkZ2V3ZWxsL3RyYWNlLW1hcHBpbmcvZGlzdC90cmFjZS1tYXBwaW5nLm1qc1xudmFyIENPTFVNTiA9IDAsIFNPVVJDRVNfSU5ERVggPSAxLCBTT1VSQ0VfTElORSA9IDIsIFNPVVJDRV9DT0xVTU4gPSAzLCBOQU1FU19JTkRFWCA9IDQsIGZvdW5kID0gITE7XG5mdW5jdGlvbiBiaW5hcnlTZWFyY2goaGF5c3RhY2ssIG5lZWRsZSwgbG93LCBoaWdoKSB7XG5cdGZvciAoOyBsb3cgPD0gaGlnaDspIHtcblx0XHRsZXQgbWlkID0gbG93ICsgKGhpZ2ggLSBsb3cgPj4gMSksIGNtcCA9IGhheXN0YWNrW21pZF1bQ09MVU1OXSAtIG5lZWRsZTtcblx0XHRpZiAoY21wID09PSAwKSByZXR1cm4gZm91bmQgPSAhMCwgbWlkO1xuXHRcdGNtcCA8IDAgPyBsb3cgPSBtaWQgKyAxIDogaGlnaCA9IG1pZCAtIDE7XG5cdH1cblx0cmV0dXJuIGZvdW5kID0gITEsIGxvdyAtIDE7XG59XG5mdW5jdGlvbiB1cHBlckJvdW5kKGhheXN0YWNrLCBuZWVkbGUsIGluZGV4KSB7XG5cdGZvciAobGV0IGkgPSBpbmRleCArIDE7IGkgPCBoYXlzdGFjay5sZW5ndGggJiYgaGF5c3RhY2tbaV1bQ09MVU1OXSA9PT0gbmVlZGxlOyBpbmRleCA9IGkrKyk7XG5cdHJldHVybiBpbmRleDtcbn1cbmZ1bmN0aW9uIGxvd2VyQm91bmQoaGF5c3RhY2ssIG5lZWRsZSwgaW5kZXgpIHtcblx0Zm9yIChsZXQgaSA9IGluZGV4IC0gMTsgaSA+PSAwICYmIGhheXN0YWNrW2ldW0NPTFVNTl0gPT09IG5lZWRsZTsgaW5kZXggPSBpLS0pO1xuXHRyZXR1cm4gaW5kZXg7XG59XG5mdW5jdGlvbiBtZW1vaXplZEJpbmFyeVNlYXJjaChoYXlzdGFjaywgbmVlZGxlLCBzdGF0ZSwga2V5KSB7XG5cdGxldCB7IGxhc3RLZXksIGxhc3ROZWVkbGUsIGxhc3RJbmRleCB9ID0gc3RhdGUsIGxvdyA9IDAsIGhpZ2ggPSBoYXlzdGFjay5sZW5ndGggLSAxO1xuXHRpZiAoa2V5ID09PSBsYXN0S2V5KSB7XG5cdFx0aWYgKG5lZWRsZSA9PT0gbGFzdE5lZWRsZSkgcmV0dXJuIGZvdW5kID0gbGFzdEluZGV4ICE9PSAtMSAmJiBoYXlzdGFja1tsYXN0SW5kZXhdW0NPTFVNTl0gPT09IG5lZWRsZSwgbGFzdEluZGV4O1xuXHRcdG5lZWRsZSA+PSBsYXN0TmVlZGxlID8gbG93ID0gbGFzdEluZGV4ID09PSAtMSA/IDAgOiBsYXN0SW5kZXggOiBoaWdoID0gbGFzdEluZGV4O1xuXHR9XG5cdHJldHVybiBzdGF0ZS5sYXN0S2V5ID0ga2V5LCBzdGF0ZS5sYXN0TmVlZGxlID0gbmVlZGxlLCBzdGF0ZS5sYXN0SW5kZXggPSBiaW5hcnlTZWFyY2goaGF5c3RhY2ssIG5lZWRsZSwgbG93LCBoaWdoKTtcbn1cbnZhciBMSU5FX0dUUl9aRVJPID0gXCJgbGluZWAgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAobGluZXMgc3RhcnQgYXQgbGluZSAxKVwiLCBDT0xfR1RSX0VRX1pFUk8gPSBcImBjb2x1bW5gIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgKGNvbHVtbnMgc3RhcnQgYXQgY29sdW1uIDApXCI7XG5mdW5jdGlvbiBjYXN0KG1hcCkge1xuXHRyZXR1cm4gbWFwO1xufVxuZnVuY3Rpb24gZGVjb2RlZE1hcHBpbmdzKG1hcCkge1xuXHR2YXIgX2E7XG5cdHJldHVybiAoX2EgPSBjYXN0KG1hcCkpLl9kZWNvZGVkIHx8IChfYS5fZGVjb2RlZCA9IGRlY29kZShjYXN0KG1hcCkuX2VuY29kZWQpKTtcbn1cbmZ1bmN0aW9uIG9yaWdpbmFsUG9zaXRpb25Gb3IobWFwLCBuZWVkbGUpIHtcblx0bGV0IHsgbGluZSwgY29sdW1uLCBiaWFzIH0gPSBuZWVkbGU7XG5cdGlmIChsaW5lLS0sIGxpbmUgPCAwKSB0aHJvdyBFcnJvcihMSU5FX0dUUl9aRVJPKTtcblx0aWYgKGNvbHVtbiA8IDApIHRocm93IEVycm9yKENPTF9HVFJfRVFfWkVSTyk7XG5cdGxldCBkZWNvZGVkID0gZGVjb2RlZE1hcHBpbmdzKG1hcCk7XG5cdGlmIChsaW5lID49IGRlY29kZWQubGVuZ3RoKSByZXR1cm4gT01hcHBpbmcobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG5cdGxldCBzZWdtZW50cyA9IGRlY29kZWRbbGluZV0sIGluZGV4ID0gdHJhY2VTZWdtZW50SW50ZXJuYWwoc2VnbWVudHMsIGNhc3QobWFwKS5fZGVjb2RlZE1lbW8sIGxpbmUsIGNvbHVtbiwgYmlhcyB8fCAxKTtcblx0aWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIE9NYXBwaW5nKG51bGwsIG51bGwsIG51bGwsIG51bGwpO1xuXHRsZXQgc2VnbWVudCA9IHNlZ21lbnRzW2luZGV4XTtcblx0aWYgKHNlZ21lbnQubGVuZ3RoID09PSAxKSByZXR1cm4gT01hcHBpbmcobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG5cdGxldCB7IG5hbWVzLCByZXNvbHZlZFNvdXJjZXMgfSA9IG1hcDtcblx0cmV0dXJuIE9NYXBwaW5nKHJlc29sdmVkU291cmNlc1tzZWdtZW50W1NPVVJDRVNfSU5ERVhdXSwgc2VnbWVudFtTT1VSQ0VfTElORV0gKyAxLCBzZWdtZW50W1NPVVJDRV9DT0xVTU5dLCBzZWdtZW50Lmxlbmd0aCA9PT0gNSA/IG5hbWVzW3NlZ21lbnRbTkFNRVNfSU5ERVhdXSA6IG51bGwpO1xufVxuZnVuY3Rpb24gT01hcHBpbmcoc291cmNlLCBsaW5lLCBjb2x1bW4sIG5hbWUpIHtcblx0cmV0dXJuIHtcblx0XHRzb3VyY2UsXG5cdFx0bGluZSxcblx0XHRjb2x1bW4sXG5cdFx0bmFtZVxuXHR9O1xufVxuZnVuY3Rpb24gdHJhY2VTZWdtZW50SW50ZXJuYWwoc2VnbWVudHMsIG1lbW8sIGxpbmUsIGNvbHVtbiwgYmlhcykge1xuXHRsZXQgaW5kZXggPSBtZW1vaXplZEJpbmFyeVNlYXJjaChzZWdtZW50cywgY29sdW1uLCBtZW1vLCBsaW5lKTtcblx0cmV0dXJuIGZvdW5kID8gaW5kZXggPSAoYmlhcyA9PT0gLTEgPyB1cHBlckJvdW5kIDogbG93ZXJCb3VuZCkoc2VnbWVudHMsIGNvbHVtbiwgaW5kZXgpIDogYmlhcyA9PT0gLTEgJiYgaW5kZXgrKywgaW5kZXggPT09IC0xIHx8IGluZGV4ID09PSBzZWdtZW50cy5sZW5ndGggPyAtMSA6IGluZGV4O1xufVxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL21vZHVsZS1ydW5uZXIvc291cmNlbWFwL2RlY29kZXIudHNcbnZhciBEZWNvZGVkTWFwID0gY2xhc3Mge1xuXHRfZW5jb2RlZDtcblx0X2RlY29kZWQ7XG5cdF9kZWNvZGVkTWVtbztcblx0dXJsO1xuXHRmaWxlO1xuXHR2ZXJzaW9uO1xuXHRuYW1lcyA9IFtdO1xuXHRyZXNvbHZlZFNvdXJjZXM7XG5cdGNvbnN0cnVjdG9yKG1hcCwgZnJvbSkge1xuXHRcdHRoaXMubWFwID0gbWFwO1xuXHRcdGxldCB7IG1hcHBpbmdzLCBuYW1lcywgc291cmNlcyB9ID0gbWFwO1xuXHRcdHRoaXMudmVyc2lvbiA9IG1hcC52ZXJzaW9uLCB0aGlzLm5hbWVzID0gbmFtZXMgfHwgW10sIHRoaXMuX2VuY29kZWQgPSBtYXBwaW5ncyB8fCBcIlwiLCB0aGlzLl9kZWNvZGVkTWVtbyA9IG1lbW9pemVkU3RhdGUoKSwgdGhpcy51cmwgPSBmcm9tLCB0aGlzLmZpbGUgPSBmcm9tO1xuXHRcdGxldCBvcmlnaW5EaXIgPSBwb3NpeERpcm5hbWUoZnJvbSk7XG5cdFx0dGhpcy5yZXNvbHZlZFNvdXJjZXMgPSAoc291cmNlcyB8fCBbXSkubWFwKChzKSA9PiBwb3NpeFJlc29sdmUob3JpZ2luRGlyLCBzIHx8IFwiXCIpKTtcblx0fVxufTtcbmZ1bmN0aW9uIG1lbW9pemVkU3RhdGUoKSB7XG5cdHJldHVybiB7XG5cdFx0bGFzdEtleTogLTEsXG5cdFx0bGFzdE5lZWRsZTogLTEsXG5cdFx0bGFzdEluZGV4OiAtMVxuXHR9O1xufVxuZnVuY3Rpb24gZ2V0T3JpZ2luYWxQb3NpdGlvbihtYXAsIG5lZWRsZSkge1xuXHRsZXQgcmVzdWx0ID0gb3JpZ2luYWxQb3NpdGlvbkZvcihtYXAsIG5lZWRsZSk7XG5cdHJldHVybiByZXN1bHQuY29sdW1uID09IG51bGwgPyBudWxsIDogcmVzdWx0O1xufVxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL21vZHVsZS1ydW5uZXIvZXZhbHVhdGVkTW9kdWxlcy50c1xuY29uc3QgTU9EVUxFX1JVTk5FUl9TT1VSQ0VNQVBQSU5HX1JFR0VYUCA9IFJlZ0V4cChgLy8jICR7U09VUkNFTUFQUElOR19VUkx9PWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsKC4rKWApO1xudmFyIEV2YWx1YXRlZE1vZHVsZU5vZGUgPSBjbGFzcyB7XG5cdGltcG9ydGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdGltcG9ydHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRldmFsdWF0ZWQgPSAhMTtcblx0bWV0YTtcblx0cHJvbWlzZTtcblx0ZXhwb3J0cztcblx0ZmlsZTtcblx0bWFwO1xuXHRjb25zdHJ1Y3RvcihpZCwgdXJsKSB7XG5cdFx0dGhpcy5pZCA9IGlkLCB0aGlzLnVybCA9IHVybCwgdGhpcy5maWxlID0gY2xlYW5VcmwoaWQpO1xuXHR9XG59LCBFdmFsdWF0ZWRNb2R1bGVzID0gY2xhc3Mge1xuXHRpZFRvTW9kdWxlTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0ZmlsZVRvTW9kdWxlc01hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdHVybFRvSWRNb2R1bGVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHQvKipcblx0KiBSZXR1cm5zIHRoZSBtb2R1bGUgbm9kZSBieSB0aGUgcmVzb2x2ZWQgbW9kdWxlIElELiBVc3VhbGx5LCBtb2R1bGUgSUQgaXNcblx0KiB0aGUgZmlsZSBzeXN0ZW0gcGF0aCB3aXRoIHF1ZXJ5IGFuZC9vciBoYXNoLiBJdCBjYW4gYWxzbyBiZSBhIHZpcnR1YWwgbW9kdWxlLlxuXHQqXG5cdCogTW9kdWxlIHJ1bm5lciBncmFwaCB3aWxsIGhhdmUgMSB0byAxIG1hcHBpbmcgd2l0aCB0aGUgc2VydmVyIG1vZHVsZSBncmFwaC5cblx0KiBAcGFyYW0gaWQgUmVzb2x2ZWQgbW9kdWxlIElEXG5cdCovXG5cdGdldE1vZHVsZUJ5SWQoaWQpIHtcblx0XHRyZXR1cm4gdGhpcy5pZFRvTW9kdWxlTWFwLmdldChpZCk7XG5cdH1cblx0LyoqXG5cdCogUmV0dXJucyBhbGwgbW9kdWxlcyByZWxhdGVkIHRvIHRoZSBmaWxlIHN5c3RlbSBwYXRoLiBEaWZmZXJlbnQgbW9kdWxlc1xuXHQqIG1pZ2h0IGhhdmUgZGlmZmVyZW50IHF1ZXJ5IHBhcmFtZXRlcnMgb3IgaGFzaCwgc28gaXQncyBwb3NzaWJsZSB0byBoYXZlXG5cdCogbXVsdGlwbGUgbW9kdWxlcyBmb3IgdGhlIHNhbWUgZmlsZS5cblx0KiBAcGFyYW0gZmlsZSBUaGUgZmlsZSBzeXN0ZW0gcGF0aCBvZiB0aGUgbW9kdWxlXG5cdCovXG5cdGdldE1vZHVsZXNCeUZpbGUoZmlsZSkge1xuXHRcdHJldHVybiB0aGlzLmZpbGVUb01vZHVsZXNNYXAuZ2V0KGZpbGUpO1xuXHR9XG5cdC8qKlxuXHQqIFJldHVybnMgdGhlIG1vZHVsZSBub2RlIGJ5IHRoZSBVUkwgdGhhdCB3YXMgdXNlZCBpbiB0aGUgaW1wb3J0IHN0YXRlbWVudC5cblx0KiBVbmxpa2UgbW9kdWxlIGdyYXBoIG9uIHRoZSBzZXJ2ZXIsIHRoZSBVUkwgaXMgbm90IHJlc29sdmVkIGFuZCBpcyB1c2VkIGFzIGlzLlxuXHQqIEBwYXJhbSB1cmwgU2VydmVyIFVSTCB0aGF0IHdhcyB1c2VkIGluIHRoZSBpbXBvcnQgc3RhdGVtZW50XG5cdCovXG5cdGdldE1vZHVsZUJ5VXJsKHVybCkge1xuXHRcdHJldHVybiB0aGlzLnVybFRvSWRNb2R1bGVNYXAuZ2V0KHVud3JhcElkKHVybCkpO1xuXHR9XG5cdC8qKlxuXHQqIEVuc3VyZSB0aGF0IG1vZHVsZSBpcyBpbiB0aGUgZ3JhcGguIElmIHRoZSBtb2R1bGUgaXMgYWxyZWFkeSBpbiB0aGUgZ3JhcGgsXG5cdCogaXQgd2lsbCByZXR1cm4gdGhlIGV4aXN0aW5nIG1vZHVsZSBub2RlLiBPdGhlcndpc2UsIGl0IHdpbGwgY3JlYXRlIGEgbmV3XG5cdCogbW9kdWxlIG5vZGUgYW5kIGFkZCBpdCB0byB0aGUgZ3JhcGguXG5cdCogQHBhcmFtIGlkIFJlc29sdmVkIG1vZHVsZSBJRFxuXHQqIEBwYXJhbSB1cmwgVVJMIHRoYXQgd2FzIHVzZWQgaW4gdGhlIGltcG9ydCBzdGF0ZW1lbnRcblx0Ki9cblx0ZW5zdXJlTW9kdWxlKGlkLCB1cmwpIHtcblx0XHRpZiAoaWQgPSBub3JtYWxpemVNb2R1bGVJZChpZCksIHRoaXMuaWRUb01vZHVsZU1hcC5oYXMoaWQpKSB7XG5cdFx0XHRsZXQgbW9kdWxlTm9kZSA9IHRoaXMuaWRUb01vZHVsZU1hcC5nZXQoaWQpO1xuXHRcdFx0cmV0dXJuIHRoaXMudXJsVG9JZE1vZHVsZU1hcC5zZXQodXJsLCBtb2R1bGVOb2RlKSwgbW9kdWxlTm9kZTtcblx0XHR9XG5cdFx0bGV0IG1vZHVsZU5vZGUgPSBuZXcgRXZhbHVhdGVkTW9kdWxlTm9kZShpZCwgdXJsKTtcblx0XHR0aGlzLmlkVG9Nb2R1bGVNYXAuc2V0KGlkLCBtb2R1bGVOb2RlKSwgdGhpcy51cmxUb0lkTW9kdWxlTWFwLnNldCh1cmwsIG1vZHVsZU5vZGUpO1xuXHRcdGxldCBmaWxlTW9kdWxlcyA9IHRoaXMuZmlsZVRvTW9kdWxlc01hcC5nZXQobW9kdWxlTm9kZS5maWxlKSB8fCAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRcdHJldHVybiBmaWxlTW9kdWxlcy5hZGQobW9kdWxlTm9kZSksIHRoaXMuZmlsZVRvTW9kdWxlc01hcC5zZXQobW9kdWxlTm9kZS5maWxlLCBmaWxlTW9kdWxlcyksIG1vZHVsZU5vZGU7XG5cdH1cblx0aW52YWxpZGF0ZU1vZHVsZShub2RlKSB7XG5cdFx0bm9kZS5ldmFsdWF0ZWQgPSAhMSwgbm9kZS5tZXRhID0gdm9pZCAwLCBub2RlLm1hcCA9IHZvaWQgMCwgbm9kZS5wcm9taXNlID0gdm9pZCAwLCBub2RlLmV4cG9ydHMgPSB2b2lkIDAsIG5vZGUuaW1wb3J0cy5jbGVhcigpO1xuXHR9XG5cdC8qKlxuXHQqIEV4dHJhY3RzIHRoZSBpbmxpbmVkIHNvdXJjZSBtYXAgZnJvbSB0aGUgbW9kdWxlIGNvZGUgYW5kIHJldHVybnMgdGhlIGRlY29kZWRcblx0KiBzb3VyY2UgbWFwLiBJZiB0aGUgc291cmNlIG1hcCBpcyBub3QgaW5saW5lZCwgaXQgd2lsbCByZXR1cm4gbnVsbC5cblx0KiBAcGFyYW0gaWQgUmVzb2x2ZWQgbW9kdWxlIElEXG5cdCovXG5cdGdldE1vZHVsZVNvdXJjZU1hcEJ5SWQoaWQpIHtcblx0XHRsZXQgbW9kID0gdGhpcy5nZXRNb2R1bGVCeUlkKGlkKTtcblx0XHRpZiAoIW1vZCkgcmV0dXJuIG51bGw7XG5cdFx0aWYgKG1vZC5tYXApIHJldHVybiBtb2QubWFwO1xuXHRcdGlmICghbW9kLm1ldGEgfHwgIShcImNvZGVcIiBpbiBtb2QubWV0YSkpIHJldHVybiBudWxsO1xuXHRcdGxldCBwYXR0ZXJuID0gYC8vIyAke1NPVVJDRU1BUFBJTkdfVVJMfT1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGAsIGxhc3RJbmRleCA9IG1vZC5tZXRhLmNvZGUubGFzdEluZGV4T2YocGF0dGVybik7XG5cdFx0aWYgKGxhc3RJbmRleCA9PT0gLTEpIHJldHVybiBudWxsO1xuXHRcdGxldCBtYXBTdHJpbmcgPSBNT0RVTEVfUlVOTkVSX1NPVVJDRU1BUFBJTkdfUkVHRVhQLmV4ZWMobW9kLm1ldGEuY29kZS5zbGljZShsYXN0SW5kZXgpKT8uWzFdO1xuXHRcdHJldHVybiBtYXBTdHJpbmcgPyAobW9kLm1hcCA9IG5ldyBEZWNvZGVkTWFwKEpTT04ucGFyc2UoZGVjb2RlQmFzZTY0KG1hcFN0cmluZykpLCBtb2QuZmlsZSksIG1vZC5tYXApIDogbnVsbDtcblx0fVxuXHRjbGVhcigpIHtcblx0XHR0aGlzLmlkVG9Nb2R1bGVNYXAuY2xlYXIoKSwgdGhpcy5maWxlVG9Nb2R1bGVzTWFwLmNsZWFyKCksIHRoaXMudXJsVG9JZE1vZHVsZU1hcC5jbGVhcigpO1xuXHR9XG59O1xuY29uc3QgcHJlZml4ZWRCdWlsdGlucyA9IG5ldyBTZXQoW1xuXHRcIm5vZGU6c2VhXCIsXG5cdFwibm9kZTpzcWxpdGVcIixcblx0XCJub2RlOnRlc3RcIixcblx0XCJub2RlOnRlc3QvcmVwb3J0ZXJzXCJcbl0pO1xuZnVuY3Rpb24gbm9ybWFsaXplTW9kdWxlSWQoZmlsZSkge1xuXHRyZXR1cm4gcHJlZml4ZWRCdWlsdGlucy5oYXMoZmlsZSkgPyBmaWxlIDogc2xhc2goZmlsZSkucmVwbGFjZSgvXlxcL0Bmc1xcLy8sIGlzV2luZG93cyA/IFwiXCIgOiBcIi9cIikucmVwbGFjZSgvXm5vZGU6LywgXCJcIikucmVwbGFjZSgvXlxcLysvLCBcIi9cIikucmVwbGFjZSgvXmZpbGU6XFwvKy8sIGlzV2luZG93cyA/IFwiXCIgOiBcIi9cIik7XG59XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvc2hhcmVkL2htci50c1xudmFyIEhNUkNvbnRleHQgPSBjbGFzcyB7XG5cdG5ld0xpc3RlbmVycztcblx0Y29uc3RydWN0b3IoaG1yQ2xpZW50LCBvd25lclBhdGgpIHtcblx0XHR0aGlzLmhtckNsaWVudCA9IGhtckNsaWVudCwgdGhpcy5vd25lclBhdGggPSBvd25lclBhdGgsIGhtckNsaWVudC5kYXRhTWFwLmhhcyhvd25lclBhdGgpIHx8IGhtckNsaWVudC5kYXRhTWFwLnNldChvd25lclBhdGgsIHt9KTtcblx0XHRsZXQgbW9kID0gaG1yQ2xpZW50LmhvdE1vZHVsZXNNYXAuZ2V0KG93bmVyUGF0aCk7XG5cdFx0bW9kICYmIChtb2QuY2FsbGJhY2tzID0gW10pO1xuXHRcdGxldCBzdGFsZUxpc3RlbmVycyA9IGhtckNsaWVudC5jdHhUb0xpc3RlbmVyc01hcC5nZXQob3duZXJQYXRoKTtcblx0XHRpZiAoc3RhbGVMaXN0ZW5lcnMpIGZvciAobGV0IFtldmVudCwgc3RhbGVGbnNdIG9mIHN0YWxlTGlzdGVuZXJzKSB7XG5cdFx0XHRsZXQgbGlzdGVuZXJzID0gaG1yQ2xpZW50LmN1c3RvbUxpc3RlbmVyc01hcC5nZXQoZXZlbnQpO1xuXHRcdFx0bGlzdGVuZXJzICYmIGhtckNsaWVudC5jdXN0b21MaXN0ZW5lcnNNYXAuc2V0KGV2ZW50LCBsaXN0ZW5lcnMuZmlsdGVyKChsKSA9PiAhc3RhbGVGbnMuaW5jbHVkZXMobCkpKTtcblx0XHR9XG5cdFx0dGhpcy5uZXdMaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBobXJDbGllbnQuY3R4VG9MaXN0ZW5lcnNNYXAuc2V0KG93bmVyUGF0aCwgdGhpcy5uZXdMaXN0ZW5lcnMpO1xuXHR9XG5cdGdldCBkYXRhKCkge1xuXHRcdHJldHVybiB0aGlzLmhtckNsaWVudC5kYXRhTWFwLmdldCh0aGlzLm93bmVyUGF0aCk7XG5cdH1cblx0YWNjZXB0KGRlcHMsIGNhbGxiYWNrKSB7XG5cdFx0aWYgKHR5cGVvZiBkZXBzID09IFwiZnVuY3Rpb25cIiB8fCAhZGVwcykgdGhpcy5hY2NlcHREZXBzKFt0aGlzLm93bmVyUGF0aF0sIChbbW9kXSkgPT4gZGVwcz8uKG1vZCkpO1xuXHRcdGVsc2UgaWYgKHR5cGVvZiBkZXBzID09IFwic3RyaW5nXCIpIHRoaXMuYWNjZXB0RGVwcyhbZGVwc10sIChbbW9kXSkgPT4gY2FsbGJhY2s/Lihtb2QpKTtcblx0XHRlbHNlIGlmIChBcnJheS5pc0FycmF5KGRlcHMpKSB0aGlzLmFjY2VwdERlcHMoZGVwcywgY2FsbGJhY2spO1xuXHRcdGVsc2UgdGhyb3cgRXJyb3IoXCJpbnZhbGlkIGhvdC5hY2NlcHQoKSB1c2FnZS5cIik7XG5cdH1cblx0YWNjZXB0RXhwb3J0cyhfLCBjYWxsYmFjaykge1xuXHRcdHRoaXMuYWNjZXB0RGVwcyhbdGhpcy5vd25lclBhdGhdLCAoW21vZF0pID0+IGNhbGxiYWNrPy4obW9kKSk7XG5cdH1cblx0ZGlzcG9zZShjYikge1xuXHRcdHRoaXMuaG1yQ2xpZW50LmRpc3Bvc2VNYXAuc2V0KHRoaXMub3duZXJQYXRoLCBjYik7XG5cdH1cblx0cHJ1bmUoY2IpIHtcblx0XHR0aGlzLmhtckNsaWVudC5wcnVuZU1hcC5zZXQodGhpcy5vd25lclBhdGgsIGNiKTtcblx0fVxuXHRkZWNsaW5lKCkge31cblx0aW52YWxpZGF0ZShtZXNzYWdlKSB7XG5cdFx0bGV0IGZpcnN0SW52YWxpZGF0ZWRCeSA9IHRoaXMuaG1yQ2xpZW50LmN1cnJlbnRGaXJzdEludmFsaWRhdGVkQnkgPz8gdGhpcy5vd25lclBhdGg7XG5cdFx0dGhpcy5obXJDbGllbnQubm90aWZ5TGlzdGVuZXJzKFwidml0ZTppbnZhbGlkYXRlXCIsIHtcblx0XHRcdHBhdGg6IHRoaXMub3duZXJQYXRoLFxuXHRcdFx0bWVzc2FnZSxcblx0XHRcdGZpcnN0SW52YWxpZGF0ZWRCeVxuXHRcdH0pLCB0aGlzLnNlbmQoXCJ2aXRlOmludmFsaWRhdGVcIiwge1xuXHRcdFx0cGF0aDogdGhpcy5vd25lclBhdGgsXG5cdFx0XHRtZXNzYWdlLFxuXHRcdFx0Zmlyc3RJbnZhbGlkYXRlZEJ5XG5cdFx0fSksIHRoaXMuaG1yQ2xpZW50LmxvZ2dlci5kZWJ1ZyhgaW52YWxpZGF0ZSAke3RoaXMub3duZXJQYXRofSR7bWVzc2FnZSA/IGA6ICR7bWVzc2FnZX1gIDogXCJcIn1gKTtcblx0fVxuXHRvbihldmVudCwgY2IpIHtcblx0XHRsZXQgYWRkVG9NYXAgPSAobWFwKSA9PiB7XG5cdFx0XHRsZXQgZXhpc3RpbmcgPSBtYXAuZ2V0KGV2ZW50KSB8fCBbXTtcblx0XHRcdGV4aXN0aW5nLnB1c2goY2IpLCBtYXAuc2V0KGV2ZW50LCBleGlzdGluZyk7XG5cdFx0fTtcblx0XHRhZGRUb01hcCh0aGlzLmhtckNsaWVudC5jdXN0b21MaXN0ZW5lcnNNYXApLCBhZGRUb01hcCh0aGlzLm5ld0xpc3RlbmVycyk7XG5cdH1cblx0b2ZmKGV2ZW50LCBjYikge1xuXHRcdGxldCByZW1vdmVGcm9tTWFwID0gKG1hcCkgPT4ge1xuXHRcdFx0bGV0IGV4aXN0aW5nID0gbWFwLmdldChldmVudCk7XG5cdFx0XHRpZiAoZXhpc3RpbmcgPT09IHZvaWQgMCkgcmV0dXJuO1xuXHRcdFx0bGV0IHBydW5lZCA9IGV4aXN0aW5nLmZpbHRlcigobCkgPT4gbCAhPT0gY2IpO1xuXHRcdFx0aWYgKHBydW5lZC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0bWFwLmRlbGV0ZShldmVudCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdG1hcC5zZXQoZXZlbnQsIHBydW5lZCk7XG5cdFx0fTtcblx0XHRyZW1vdmVGcm9tTWFwKHRoaXMuaG1yQ2xpZW50LmN1c3RvbUxpc3RlbmVyc01hcCksIHJlbW92ZUZyb21NYXAodGhpcy5uZXdMaXN0ZW5lcnMpO1xuXHR9XG5cdHNlbmQoZXZlbnQsIGRhdGEpIHtcblx0XHR0aGlzLmhtckNsaWVudC5zZW5kKHtcblx0XHRcdHR5cGU6IFwiY3VzdG9tXCIsXG5cdFx0XHRldmVudCxcblx0XHRcdGRhdGFcblx0XHR9KTtcblx0fVxuXHRhY2NlcHREZXBzKGRlcHMsIGNhbGxiYWNrID0gKCkgPT4ge30pIHtcblx0XHRsZXQgbW9kID0gdGhpcy5obXJDbGllbnQuaG90TW9kdWxlc01hcC5nZXQodGhpcy5vd25lclBhdGgpIHx8IHtcblx0XHRcdGlkOiB0aGlzLm93bmVyUGF0aCxcblx0XHRcdGNhbGxiYWNrczogW11cblx0XHR9O1xuXHRcdG1vZC5jYWxsYmFja3MucHVzaCh7XG5cdFx0XHRkZXBzLFxuXHRcdFx0Zm46IGNhbGxiYWNrXG5cdFx0fSksIHRoaXMuaG1yQ2xpZW50LmhvdE1vZHVsZXNNYXAuc2V0KHRoaXMub3duZXJQYXRoLCBtb2QpO1xuXHR9XG59LCBITVJDbGllbnQgPSBjbGFzcyB7XG5cdGhvdE1vZHVsZXNNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRkaXNwb3NlTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0cHJ1bmVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRkYXRhTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0Y3VzdG9tTGlzdGVuZXJzTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0Y3R4VG9MaXN0ZW5lcnNNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRjdXJyZW50Rmlyc3RJbnZhbGlkYXRlZEJ5O1xuXHRjb25zdHJ1Y3Rvcihsb2dnZXIsIHRyYW5zcG9ydCwgaW1wb3J0VXBkYXRlZE1vZHVsZSkge1xuXHRcdHRoaXMubG9nZ2VyID0gbG9nZ2VyLCB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydCwgdGhpcy5pbXBvcnRVcGRhdGVkTW9kdWxlID0gaW1wb3J0VXBkYXRlZE1vZHVsZTtcblx0fVxuXHRhc3luYyBub3RpZnlMaXN0ZW5lcnMoZXZlbnQsIGRhdGEpIHtcblx0XHRsZXQgY2JzID0gdGhpcy5jdXN0b21MaXN0ZW5lcnNNYXAuZ2V0KGV2ZW50KTtcblx0XHRjYnMgJiYgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGNicy5tYXAoKGNiKSA9PiBjYihkYXRhKSkpO1xuXHR9XG5cdHNlbmQocGF5bG9hZCkge1xuXHRcdHRoaXMudHJhbnNwb3J0LnNlbmQocGF5bG9hZCkuY2F0Y2goKGVycikgPT4ge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoZXJyKTtcblx0XHR9KTtcblx0fVxuXHRjbGVhcigpIHtcblx0XHR0aGlzLmhvdE1vZHVsZXNNYXAuY2xlYXIoKSwgdGhpcy5kaXNwb3NlTWFwLmNsZWFyKCksIHRoaXMucHJ1bmVNYXAuY2xlYXIoKSwgdGhpcy5kYXRhTWFwLmNsZWFyKCksIHRoaXMuY3VzdG9tTGlzdGVuZXJzTWFwLmNsZWFyKCksIHRoaXMuY3R4VG9MaXN0ZW5lcnNNYXAuY2xlYXIoKTtcblx0fVxuXHRhc3luYyBwcnVuZVBhdGhzKHBhdGhzKSB7XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwocGF0aHMubWFwKChwYXRoKSA9PiB7XG5cdFx0XHRsZXQgZGlzcG9zZXIgPSB0aGlzLmRpc3Bvc2VNYXAuZ2V0KHBhdGgpO1xuXHRcdFx0aWYgKGRpc3Bvc2VyKSByZXR1cm4gZGlzcG9zZXIodGhpcy5kYXRhTWFwLmdldChwYXRoKSk7XG5cdFx0fSkpLCBhd2FpdCBQcm9taXNlLmFsbChwYXRocy5tYXAoKHBhdGgpID0+IHtcblx0XHRcdGxldCBmbiA9IHRoaXMucHJ1bmVNYXAuZ2V0KHBhdGgpO1xuXHRcdFx0aWYgKGZuKSByZXR1cm4gZm4odGhpcy5kYXRhTWFwLmdldChwYXRoKSk7XG5cdFx0fSkpO1xuXHR9XG5cdHdhcm5GYWlsZWRVcGRhdGUoZXJyLCBwYXRoKSB7XG5cdFx0KCEoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHx8ICFlcnIubWVzc2FnZS5pbmNsdWRlcyhcImZldGNoXCIpKSAmJiB0aGlzLmxvZ2dlci5lcnJvcihlcnIpLCB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlbG9hZCAke3BhdGh9LiBUaGlzIGNvdWxkIGJlIGR1ZSB0byBzeW50YXggZXJyb3JzIG9yIGltcG9ydGluZyBub24tZXhpc3RlbnQgbW9kdWxlcy4gKHNlZSBlcnJvcnMgYWJvdmUpYCk7XG5cdH1cblx0dXBkYXRlUXVldWUgPSBbXTtcblx0cGVuZGluZ1VwZGF0ZVF1ZXVlID0gITE7XG5cdC8qKlxuXHQqIGJ1ZmZlciBtdWx0aXBsZSBob3QgdXBkYXRlcyB0cmlnZ2VyZWQgYnkgdGhlIHNhbWUgc3JjIGNoYW5nZVxuXHQqIHNvIHRoYXQgdGhleSBhcmUgaW52b2tlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGV5IHdlcmUgc2VudC5cblx0KiAob3RoZXJ3aXNlIHRoZSBvcmRlciBtYXkgYmUgaW5jb25zaXN0ZW50IGJlY2F1c2Ugb2YgdGhlIGh0dHAgcmVxdWVzdCByb3VuZCB0cmlwKVxuXHQqL1xuXHRhc3luYyBxdWV1ZVVwZGF0ZShwYXlsb2FkKSB7XG5cdFx0aWYgKHRoaXMudXBkYXRlUXVldWUucHVzaCh0aGlzLmZldGNoVXBkYXRlKHBheWxvYWQpKSwgIXRoaXMucGVuZGluZ1VwZGF0ZVF1ZXVlKSB7XG5cdFx0XHR0aGlzLnBlbmRpbmdVcGRhdGVRdWV1ZSA9ICEwLCBhd2FpdCBQcm9taXNlLnJlc29sdmUoKSwgdGhpcy5wZW5kaW5nVXBkYXRlUXVldWUgPSAhMTtcblx0XHRcdGxldCBsb2FkaW5nID0gWy4uLnRoaXMudXBkYXRlUXVldWVdO1xuXHRcdFx0dGhpcy51cGRhdGVRdWV1ZSA9IFtdLCAoYXdhaXQgUHJvbWlzZS5hbGwobG9hZGluZykpLmZvckVhY2goKGZuKSA9PiBmbiAmJiBmbigpKTtcblx0XHR9XG5cdH1cblx0YXN5bmMgZmV0Y2hVcGRhdGUodXBkYXRlKSB7XG5cdFx0bGV0IHsgcGF0aCwgYWNjZXB0ZWRQYXRoLCBmaXJzdEludmFsaWRhdGVkQnkgfSA9IHVwZGF0ZSwgbW9kID0gdGhpcy5ob3RNb2R1bGVzTWFwLmdldChwYXRoKTtcblx0XHRpZiAoIW1vZCkgcmV0dXJuO1xuXHRcdGxldCBmZXRjaGVkTW9kdWxlLCBpc1NlbGZVcGRhdGUgPSBwYXRoID09PSBhY2NlcHRlZFBhdGgsIHF1YWxpZmllZENhbGxiYWNrcyA9IG1vZC5jYWxsYmFja3MuZmlsdGVyKCh7IGRlcHMgfSkgPT4gZGVwcy5pbmNsdWRlcyhhY2NlcHRlZFBhdGgpKTtcblx0XHRpZiAoaXNTZWxmVXBkYXRlIHx8IHF1YWxpZmllZENhbGxiYWNrcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRsZXQgZGlzcG9zZXIgPSB0aGlzLmRpc3Bvc2VNYXAuZ2V0KGFjY2VwdGVkUGF0aCk7XG5cdFx0XHRkaXNwb3NlciAmJiBhd2FpdCBkaXNwb3Nlcih0aGlzLmRhdGFNYXAuZ2V0KGFjY2VwdGVkUGF0aCkpO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZmV0Y2hlZE1vZHVsZSA9IGF3YWl0IHRoaXMuaW1wb3J0VXBkYXRlZE1vZHVsZSh1cGRhdGUpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHR0aGlzLndhcm5GYWlsZWRVcGRhdGUoZSwgYWNjZXB0ZWRQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuY3VycmVudEZpcnN0SW52YWxpZGF0ZWRCeSA9IGZpcnN0SW52YWxpZGF0ZWRCeTtcblx0XHRcdFx0Zm9yIChsZXQgeyBkZXBzLCBmbiB9IG9mIHF1YWxpZmllZENhbGxiYWNrcykgZm4oZGVwcy5tYXAoKGRlcCkgPT4gZGVwID09PSBhY2NlcHRlZFBhdGggPyBmZXRjaGVkTW9kdWxlIDogdm9pZCAwKSk7XG5cdFx0XHRcdGxldCBsb2dnZWRQYXRoID0gaXNTZWxmVXBkYXRlID8gcGF0aCA6IGAke2FjY2VwdGVkUGF0aH0gdmlhICR7cGF0aH1gO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5kZWJ1ZyhgaG90IHVwZGF0ZWQ6ICR7bG9nZ2VkUGF0aH1gKTtcblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdHRoaXMuY3VycmVudEZpcnN0SW52YWxpZGF0ZWRCeSA9IHZvaWQgMDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG59O1xuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL3NoYXJlZC9zc3JUcmFuc2Zvcm0udHNcbi8qKlxuKiBWaXRlIGNvbnZlcnRzIGBpbXBvcnQgeyB9IGZyb20gJ2ZvbydgIHRvIGBjb25zdCBfID0gX192aXRlX3Nzcl9pbXBvcnRfXygnZm9vJylgLlxuKiBUb3AtbGV2ZWwgaW1wb3J0cyBhbmQgZHluYW1pYyBpbXBvcnRzIHdvcmsgc2xpZ2h0bHkgZGlmZmVyZW50bHkgaW4gTm9kZS5qcy5cbiogVGhpcyBmdW5jdGlvbiBub3JtYWxpemVzIHRoZSBkaWZmZXJlbmNlcyBzbyBpdCBtYXRjaGVzIHByb2QgYmVoYXZpb3VyLlxuKi9cbmZ1bmN0aW9uIGFuYWx5emVJbXBvcnRlZE1vZERpZmZlcmVuY2UobW9kLCByYXdJZCwgbW9kdWxlVHlwZSwgbWV0YWRhdGEpIHtcblx0aWYgKCFtZXRhZGF0YT8uaXNEeW5hbWljSW1wb3J0ICYmIG1ldGFkYXRhPy5pbXBvcnRlZE5hbWVzPy5sZW5ndGgpIHtcblx0XHRsZXQgbWlzc2luZ0JpbmRpbmdzID0gbWV0YWRhdGEuaW1wb3J0ZWROYW1lcy5maWx0ZXIoKHMpID0+ICEocyBpbiBtb2QpKTtcblx0XHRpZiAobWlzc2luZ0JpbmRpbmdzLmxlbmd0aCkge1xuXHRcdFx0bGV0IGxhc3RCaW5kaW5nID0gbWlzc2luZ0JpbmRpbmdzW21pc3NpbmdCaW5kaW5ncy5sZW5ndGggLSAxXTtcblx0XHRcdHRocm93IFN5bnRheEVycm9yKG1vZHVsZVR5cGUgPT09IFwibW9kdWxlXCIgPyBgW3ZpdGVdIFRoZSByZXF1ZXN0ZWQgbW9kdWxlICcke3Jhd0lkfScgZG9lcyBub3QgcHJvdmlkZSBhbiBleHBvcnQgbmFtZWQgJyR7bGFzdEJpbmRpbmd9J2AgOiBgXFxcblt2aXRlXSBOYW1lZCBleHBvcnQgJyR7bGFzdEJpbmRpbmd9JyBub3QgZm91bmQuIFRoZSByZXF1ZXN0ZWQgbW9kdWxlICcke3Jhd0lkfScgaXMgYSBDb21tb25KUyBtb2R1bGUsIHdoaWNoIG1heSBub3Qgc3VwcG9ydCBhbGwgbW9kdWxlLmV4cG9ydHMgYXMgbmFtZWQgZXhwb3J0cy5cbkNvbW1vbkpTIG1vZHVsZXMgY2FuIGFsd2F5cyBiZSBpbXBvcnRlZCB2aWEgdGhlIGRlZmF1bHQgZXhwb3J0LCBmb3IgZXhhbXBsZSB1c2luZzpcblxuaW1wb3J0IHBrZyBmcm9tICcke3Jhd0lkfSc7XG5jb25zdCB7JHttaXNzaW5nQmluZGluZ3Muam9pbihcIiwgXCIpfX0gPSBwa2c7XG5gKTtcblx0XHR9XG5cdH1cbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9uYW5vaWRANS4xLjcvbm9kZV9tb2R1bGVzL25hbm9pZC9ub24tc2VjdXJlL2luZGV4LmpzXG5sZXQgbmFub2lkID0gKHNpemUgPSAyMSkgPT4ge1xuXHRsZXQgaWQgPSBcIlwiLCBpID0gc2l6ZSB8IDA7XG5cdGZvciAoOyBpLS07KSBpZCArPSBcInVzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3RcIltNYXRoLnJhbmRvbSgpICogNjQgfCAwXTtcblx0cmV0dXJuIGlkO1xufTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9zaGFyZWQvbW9kdWxlUnVubmVyVHJhbnNwb3J0LnRzXG5mdW5jdGlvbiByZXZpdmVJbnZva2VFcnJvcihlKSB7XG5cdGxldCBlcnJvciA9IEVycm9yKGUubWVzc2FnZSB8fCBcIlVua25vd24gaW52b2tlIGVycm9yXCIpO1xuXHRyZXR1cm4gT2JqZWN0LmFzc2lnbihlcnJvciwgZSwgeyBydW5uZXJFcnJvcjogLyogQF9fUFVSRV9fICovIEVycm9yKFwiUnVubmVyRXJyb3JcIikgfSksIGVycm9yO1xufVxuY29uc3QgY3JlYXRlSW52b2tlYWJsZVRyYW5zcG9ydCA9ICh0cmFuc3BvcnQpID0+IHtcblx0aWYgKHRyYW5zcG9ydC5pbnZva2UpIHJldHVybiB7XG5cdFx0Li4udHJhbnNwb3J0LFxuXHRcdGFzeW5jIGludm9rZShuYW1lLCBkYXRhKSB7XG5cdFx0XHRsZXQgcmVzdWx0ID0gYXdhaXQgdHJhbnNwb3J0Lmludm9rZSh7XG5cdFx0XHRcdHR5cGU6IFwiY3VzdG9tXCIsXG5cdFx0XHRcdGV2ZW50OiBcInZpdGU6aW52b2tlXCIsXG5cdFx0XHRcdGRhdGE6IHtcblx0XHRcdFx0XHRpZDogXCJzZW5kXCIsXG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRkYXRhXG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0aWYgKFwiZXJyb3JcIiBpbiByZXN1bHQpIHRocm93IHJldml2ZUludm9rZUVycm9yKHJlc3VsdC5lcnJvcik7XG5cdFx0XHRyZXR1cm4gcmVzdWx0LnJlc3VsdDtcblx0XHR9XG5cdH07XG5cdGlmICghdHJhbnNwb3J0LnNlbmQgfHwgIXRyYW5zcG9ydC5jb25uZWN0KSB0aHJvdyBFcnJvcihcInRyYW5zcG9ydCBtdXN0IGltcGxlbWVudCBzZW5kIGFuZCBjb25uZWN0IHdoZW4gaW52b2tlIGlzIG5vdCBpbXBsZW1lbnRlZFwiKTtcblx0bGV0IHJwY1Byb21pc2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0cmV0dXJuIHtcblx0XHQuLi50cmFuc3BvcnQsXG5cdFx0Y29ubmVjdCh7IG9uTWVzc2FnZSwgb25EaXNjb25uZWN0aW9uIH0pIHtcblx0XHRcdHJldHVybiB0cmFuc3BvcnQuY29ubmVjdCh7XG5cdFx0XHRcdG9uTWVzc2FnZShwYXlsb2FkKSB7XG5cdFx0XHRcdFx0aWYgKHBheWxvYWQudHlwZSA9PT0gXCJjdXN0b21cIiAmJiBwYXlsb2FkLmV2ZW50ID09PSBcInZpdGU6aW52b2tlXCIpIHtcblx0XHRcdFx0XHRcdGxldCBkYXRhID0gcGF5bG9hZC5kYXRhO1xuXHRcdFx0XHRcdFx0aWYgKGRhdGEuaWQuc3RhcnRzV2l0aChcInJlc3BvbnNlOlwiKSkge1xuXHRcdFx0XHRcdFx0XHRsZXQgaW52b2tlSWQgPSBkYXRhLmlkLnNsaWNlKDkpLCBwcm9taXNlID0gcnBjUHJvbWlzZXMuZ2V0KGludm9rZUlkKTtcblx0XHRcdFx0XHRcdFx0aWYgKCFwcm9taXNlKSByZXR1cm47XG5cdFx0XHRcdFx0XHRcdHByb21pc2UudGltZW91dElkICYmIGNsZWFyVGltZW91dChwcm9taXNlLnRpbWVvdXRJZCksIHJwY1Byb21pc2VzLmRlbGV0ZShpbnZva2VJZCk7XG5cdFx0XHRcdFx0XHRcdGxldCB7IGVycm9yLCByZXN1bHQgfSA9IGRhdGEuZGF0YTtcblx0XHRcdFx0XHRcdFx0ZXJyb3IgPyBwcm9taXNlLnJlamVjdChlcnJvcikgOiBwcm9taXNlLnJlc29sdmUocmVzdWx0KTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvbk1lc3NhZ2UocGF5bG9hZCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9uRGlzY29ubmVjdGlvblxuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHRkaXNjb25uZWN0KCkge1xuXHRcdFx0cmV0dXJuIHJwY1Byb21pc2VzLmZvckVhY2goKHByb21pc2UpID0+IHtcblx0XHRcdFx0cHJvbWlzZS5yZWplY3QoLyogQF9fUFVSRV9fICovIEVycm9yKGB0cmFuc3BvcnQgd2FzIGRpc2Nvbm5lY3RlZCwgY2Fubm90IGNhbGwgJHtKU09OLnN0cmluZ2lmeShwcm9taXNlLm5hbWUpfWApKTtcblx0XHRcdH0pLCBycGNQcm9taXNlcy5jbGVhcigpLCB0cmFuc3BvcnQuZGlzY29ubmVjdD8uKCk7XG5cdFx0fSxcblx0XHRzZW5kKGRhdGEpIHtcblx0XHRcdHJldHVybiB0cmFuc3BvcnQuc2VuZChkYXRhKTtcblx0XHR9LFxuXHRcdGFzeW5jIGludm9rZShuYW1lLCBkYXRhKSB7XG5cdFx0XHRsZXQgcHJvbWlzZUlkID0gbmFub2lkKCksIHdyYXBwZWREYXRhID0ge1xuXHRcdFx0XHR0eXBlOiBcImN1c3RvbVwiLFxuXHRcdFx0XHRldmVudDogXCJ2aXRlOmludm9rZVwiLFxuXHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRpZDogYHNlbmQ6JHtwcm9taXNlSWR9YCxcblx0XHRcdFx0XHRkYXRhXG5cdFx0XHRcdH1cblx0XHRcdH0sIHNlbmRQcm9taXNlID0gdHJhbnNwb3J0LnNlbmQod3JhcHBlZERhdGEpLCB7IHByb21pc2UsIHJlc29sdmUsIHJlamVjdCB9ID0gcHJvbWlzZVdpdGhSZXNvbHZlcnMoKSwgdGltZW91dCA9IHRyYW5zcG9ydC50aW1lb3V0ID8/IDZlNCwgdGltZW91dElkO1xuXHRcdFx0dGltZW91dCA+IDAgJiYgKHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRycGNQcm9taXNlcy5kZWxldGUocHJvbWlzZUlkKSwgcmVqZWN0KC8qIEBfX1BVUkVfXyAqLyBFcnJvcihgdHJhbnNwb3J0IGludm9rZSB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zIChkYXRhOiAke0pTT04uc3RyaW5naWZ5KHdyYXBwZWREYXRhKX0pYCkpO1xuXHRcdFx0fSwgdGltZW91dCksIHRpbWVvdXRJZD8udW5yZWY/LigpKSwgcnBjUHJvbWlzZXMuc2V0KHByb21pc2VJZCwge1xuXHRcdFx0XHRyZXNvbHZlLFxuXHRcdFx0XHRyZWplY3QsXG5cdFx0XHRcdG5hbWUsXG5cdFx0XHRcdHRpbWVvdXRJZFxuXHRcdFx0fSksIHNlbmRQcm9taXNlICYmIHNlbmRQcm9taXNlLmNhdGNoKChlcnIpID0+IHtcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVvdXRJZCksIHJwY1Byb21pc2VzLmRlbGV0ZShwcm9taXNlSWQpLCByZWplY3QoZXJyKTtcblx0XHRcdH0pO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmV0dXJuIGF3YWl0IHByb21pc2U7XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0dGhyb3cgcmV2aXZlSW52b2tlRXJyb3IoZXJyKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG59LCBub3JtYWxpemVNb2R1bGVSdW5uZXJUcmFuc3BvcnQgPSAodHJhbnNwb3J0KSA9PiB7XG5cdGxldCBpbnZva2VhYmxlVHJhbnNwb3J0ID0gY3JlYXRlSW52b2tlYWJsZVRyYW5zcG9ydCh0cmFuc3BvcnQpLCBpc0Nvbm5lY3RlZCA9ICFpbnZva2VhYmxlVHJhbnNwb3J0LmNvbm5lY3QsIGNvbm5lY3RpbmdQcm9taXNlO1xuXHRyZXR1cm4ge1xuXHRcdC4uLnRyYW5zcG9ydCxcblx0XHQuLi5pbnZva2VhYmxlVHJhbnNwb3J0LmNvbm5lY3QgPyB7IGFzeW5jIGNvbm5lY3Qob25NZXNzYWdlKSB7XG5cdFx0XHRpZiAoaXNDb25uZWN0ZWQpIHJldHVybjtcblx0XHRcdGlmIChjb25uZWN0aW5nUHJvbWlzZSkge1xuXHRcdFx0XHRhd2FpdCBjb25uZWN0aW5nUHJvbWlzZTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IG1heWJlUHJvbWlzZSA9IGludm9rZWFibGVUcmFuc3BvcnQuY29ubmVjdCh7XG5cdFx0XHRcdG9uTWVzc2FnZTogb25NZXNzYWdlID8/ICgoKSA9PiB7fSksXG5cdFx0XHRcdG9uRGlzY29ubmVjdGlvbigpIHtcblx0XHRcdFx0XHRpc0Nvbm5lY3RlZCA9ICExO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdG1heWJlUHJvbWlzZSAmJiAoY29ubmVjdGluZ1Byb21pc2UgPSBtYXliZVByb21pc2UsIGF3YWl0IGNvbm5lY3RpbmdQcm9taXNlLCBjb25uZWN0aW5nUHJvbWlzZSA9IHZvaWQgMCksIGlzQ29ubmVjdGVkID0gITA7XG5cdFx0fSB9IDoge30sXG5cdFx0Li4uaW52b2tlYWJsZVRyYW5zcG9ydC5kaXNjb25uZWN0ID8geyBhc3luYyBkaXNjb25uZWN0KCkge1xuXHRcdFx0aXNDb25uZWN0ZWQgJiYgKGNvbm5lY3RpbmdQcm9taXNlICYmIGF3YWl0IGNvbm5lY3RpbmdQcm9taXNlLCBpc0Nvbm5lY3RlZCA9ICExLCBhd2FpdCBpbnZva2VhYmxlVHJhbnNwb3J0LmRpc2Nvbm5lY3QoKSk7XG5cdFx0fSB9IDoge30sXG5cdFx0YXN5bmMgc2VuZChkYXRhKSB7XG5cdFx0XHRpZiAoaW52b2tlYWJsZVRyYW5zcG9ydC5zZW5kKSB7XG5cdFx0XHRcdGlmICghaXNDb25uZWN0ZWQpIGlmIChjb25uZWN0aW5nUHJvbWlzZSkgYXdhaXQgY29ubmVjdGluZ1Byb21pc2U7XG5cdFx0XHRcdGVsc2UgdGhyb3cgRXJyb3IoXCJzZW5kIHdhcyBjYWxsZWQgYmVmb3JlIGNvbm5lY3RcIik7XG5cdFx0XHRcdGF3YWl0IGludm9rZWFibGVUcmFuc3BvcnQuc2VuZChkYXRhKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGFzeW5jIGludm9rZShuYW1lLCBkYXRhKSB7XG5cdFx0XHRpZiAoIWlzQ29ubmVjdGVkKSBpZiAoY29ubmVjdGluZ1Byb21pc2UpIGF3YWl0IGNvbm5lY3RpbmdQcm9taXNlO1xuXHRcdFx0ZWxzZSB0aHJvdyBFcnJvcihcImludm9rZSB3YXMgY2FsbGVkIGJlZm9yZSBjb25uZWN0XCIpO1xuXHRcdFx0cmV0dXJuIGludm9rZWFibGVUcmFuc3BvcnQuaW52b2tlKG5hbWUsIGRhdGEpO1xuXHRcdH1cblx0fTtcbn0sIGNyZWF0ZVdlYlNvY2tldE1vZHVsZVJ1bm5lclRyYW5zcG9ydCA9IChvcHRpb25zKSA9PiB7XG5cdGxldCBwaW5nSW50ZXJ2YWwgPSBvcHRpb25zLnBpbmdJbnRlcnZhbCA/PyAzZTQsIHdzLCBwaW5nSW50ZXJ2YWxJZDtcblx0cmV0dXJuIHtcblx0XHRhc3luYyBjb25uZWN0KHsgb25NZXNzYWdlLCBvbkRpc2Nvbm5lY3Rpb24gfSkge1xuXHRcdFx0bGV0IHNvY2tldCA9IG9wdGlvbnMuY3JlYXRlQ29ubmVjdGlvbigpO1xuXHRcdFx0c29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGFzeW5jICh7IGRhdGEgfSkgPT4ge1xuXHRcdFx0XHRvbk1lc3NhZ2UoSlNPTi5wYXJzZShkYXRhKSk7XG5cdFx0XHR9KTtcblx0XHRcdGxldCBpc09wZW5lZCA9IHNvY2tldC5yZWFkeVN0YXRlID09PSBzb2NrZXQuT1BFTjtcblx0XHRcdGlzT3BlbmVkIHx8IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0c29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJvcGVuXCIsICgpID0+IHtcblx0XHRcdFx0XHRpc09wZW5lZCA9ICEwLCByZXNvbHZlKCk7XG5cdFx0XHRcdH0sIHsgb25jZTogITAgfSksIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdGlmICghaXNPcGVuZWQpIHtcblx0XHRcdFx0XHRcdHJlamVjdCgvKiBAX19QVVJFX18gKi8gRXJyb3IoXCJXZWJTb2NrZXQgY2xvc2VkIHdpdGhvdXQgb3BlbmVkLlwiKSk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9uTWVzc2FnZSh7XG5cdFx0XHRcdFx0XHR0eXBlOiBcImN1c3RvbVwiLFxuXHRcdFx0XHRcdFx0ZXZlbnQ6IFwidml0ZTp3czpkaXNjb25uZWN0XCIsXG5cdFx0XHRcdFx0XHRkYXRhOiB7IHdlYlNvY2tldDogc29ja2V0IH1cblx0XHRcdFx0XHR9KSwgb25EaXNjb25uZWN0aW9uKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSksIG9uTWVzc2FnZSh7XG5cdFx0XHRcdHR5cGU6IFwiY3VzdG9tXCIsXG5cdFx0XHRcdGV2ZW50OiBcInZpdGU6d3M6Y29ubmVjdFwiLFxuXHRcdFx0XHRkYXRhOiB7IHdlYlNvY2tldDogc29ja2V0IH1cblx0XHRcdH0pLCB3cyA9IHNvY2tldCwgcGluZ0ludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG5cdFx0XHRcdHNvY2tldC5yZWFkeVN0YXRlID09PSBzb2NrZXQuT1BFTiAmJiBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IHR5cGU6IFwicGluZ1wiIH0pKTtcblx0XHRcdH0sIHBpbmdJbnRlcnZhbCk7XG5cdFx0fSxcblx0XHRkaXNjb25uZWN0KCkge1xuXHRcdFx0Y2xlYXJJbnRlcnZhbChwaW5nSW50ZXJ2YWxJZCksIHdzPy5jbG9zZSgpO1xuXHRcdH0sXG5cdFx0c2VuZChkYXRhKSB7XG5cdFx0XHR3cy5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcblx0XHR9XG5cdH07XG59O1xuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL3NoYXJlZC9idWlsdGluLnRzXG5mdW5jdGlvbiBjcmVhdGVJc0J1aWx0aW4oYnVpbHRpbnMpIHtcblx0bGV0IHBsYWluQnVpbHRpbnNTZXQgPSBuZXcgU2V0KGJ1aWx0aW5zLmZpbHRlcigoYnVpbHRpbikgPT4gdHlwZW9mIGJ1aWx0aW4gPT0gXCJzdHJpbmdcIikpLCByZWdleEJ1aWx0aW5zID0gYnVpbHRpbnMuZmlsdGVyKChidWlsdGluKSA9PiB0eXBlb2YgYnVpbHRpbiAhPSBcInN0cmluZ1wiKTtcblx0cmV0dXJuIChpZCkgPT4gcGxhaW5CdWlsdGluc1NldC5oYXMoaWQpIHx8IHJlZ2V4QnVpbHRpbnMuc29tZSgocmVnZXhwKSA9PiByZWdleHAudGVzdChpZCkpO1xufVxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL21vZHVsZS1ydW5uZXIvY29uc3RhbnRzLnRzXG5jb25zdCBzc3JNb2R1bGVFeHBvcnRzS2V5ID0gXCJfX3ZpdGVfc3NyX2V4cG9ydHNfX1wiLCBzc3JJbXBvcnRLZXkgPSBcIl9fdml0ZV9zc3JfaW1wb3J0X19cIiwgc3NyRHluYW1pY0ltcG9ydEtleSA9IFwiX192aXRlX3Nzcl9keW5hbWljX2ltcG9ydF9fXCIsIHNzckV4cG9ydEFsbEtleSA9IFwiX192aXRlX3Nzcl9leHBvcnRBbGxfX1wiLCBzc3JFeHBvcnROYW1lS2V5ID0gXCJfX3ZpdGVfc3NyX2V4cG9ydE5hbWVfX1wiLCBzc3JJbXBvcnRNZXRhS2V5ID0gXCJfX3ZpdGVfc3NyX2ltcG9ydF9tZXRhX19cIiwgbm9vcCA9ICgpID0+IHt9LCBzaWxlbnRDb25zb2xlID0ge1xuXHRkZWJ1Zzogbm9vcCxcblx0ZXJyb3I6IG5vb3Bcbn0sIGhtckxvZ2dlciA9IHtcblx0ZGVidWc6ICguLi5tc2cpID0+IGNvbnNvbGUubG9nKFwiW3ZpdGVdXCIsIC4uLm1zZyksXG5cdGVycm9yOiAoZXJyb3IpID0+IGNvbnNvbGUubG9nKFwiW3ZpdGVdXCIsIGVycm9yKVxufTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9zaGFyZWQvaG1ySGFuZGxlci50c1xuZnVuY3Rpb24gY3JlYXRlSE1SSGFuZGxlcihoYW5kbGVyKSB7XG5cdGxldCBxdWV1ZSA9IG5ldyBRdWV1ZSgpO1xuXHRyZXR1cm4gKHBheWxvYWQpID0+IHF1ZXVlLmVucXVldWUoKCkgPT4gaGFuZGxlcihwYXlsb2FkKSk7XG59XG52YXIgUXVldWUgPSBjbGFzcyB7XG5cdHF1ZXVlID0gW107XG5cdHBlbmRpbmcgPSAhMTtcblx0ZW5xdWV1ZShwcm9taXNlKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHRoaXMucXVldWUucHVzaCh7XG5cdFx0XHRcdHByb21pc2UsXG5cdFx0XHRcdHJlc29sdmUsXG5cdFx0XHRcdHJlamVjdFxuXHRcdFx0fSksIHRoaXMuZGVxdWV1ZSgpO1xuXHRcdH0pO1xuXHR9XG5cdGRlcXVldWUoKSB7XG5cdFx0aWYgKHRoaXMucGVuZGluZykgcmV0dXJuICExO1xuXHRcdGxldCBpdGVtID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuXHRcdHJldHVybiBpdGVtID8gKHRoaXMucGVuZGluZyA9ICEwLCBpdGVtLnByb21pc2UoKS50aGVuKGl0ZW0ucmVzb2x2ZSkuY2F0Y2goaXRlbS5yZWplY3QpLmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0dGhpcy5wZW5kaW5nID0gITEsIHRoaXMuZGVxdWV1ZSgpO1xuXHRcdH0pLCAhMCkgOiAhMTtcblx0fVxufTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL2htckhhbmRsZXIudHNcbmZ1bmN0aW9uIGNyZWF0ZUhNUkhhbmRsZXJGb3JSdW5uZXIocnVubmVyKSB7XG5cdHJldHVybiBjcmVhdGVITVJIYW5kbGVyKGFzeW5jIChwYXlsb2FkKSA9PiB7XG5cdFx0bGV0IGhtckNsaWVudCA9IHJ1bm5lci5obXJDbGllbnQ7XG5cdFx0aWYgKCEoIWhtckNsaWVudCB8fCBydW5uZXIuaXNDbG9zZWQoKSkpIHN3aXRjaCAocGF5bG9hZC50eXBlKSB7XG5cdFx0XHRjYXNlIFwiY29ubmVjdGVkXCI6XG5cdFx0XHRcdGhtckNsaWVudC5sb2dnZXIuZGVidWcoXCJjb25uZWN0ZWQuXCIpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJ1cGRhdGVcIjpcblx0XHRcdFx0YXdhaXQgaG1yQ2xpZW50Lm5vdGlmeUxpc3RlbmVycyhcInZpdGU6YmVmb3JlVXBkYXRlXCIsIHBheWxvYWQpLCBhd2FpdCBQcm9taXNlLmFsbChwYXlsb2FkLnVwZGF0ZXMubWFwKGFzeW5jICh1cGRhdGUpID0+IHtcblx0XHRcdFx0XHRpZiAodXBkYXRlLnR5cGUgPT09IFwianMtdXBkYXRlXCIpIHJldHVybiB1cGRhdGUuYWNjZXB0ZWRQYXRoID0gdW53cmFwSWQodXBkYXRlLmFjY2VwdGVkUGF0aCksIHVwZGF0ZS5wYXRoID0gdW53cmFwSWQodXBkYXRlLnBhdGgpLCBobXJDbGllbnQucXVldWVVcGRhdGUodXBkYXRlKTtcblx0XHRcdFx0XHRobXJDbGllbnQubG9nZ2VyLmVycm9yKFwiY3NzIGhtciBpcyBub3Qgc3VwcG9ydGVkIGluIHJ1bm5lciBtb2RlLlwiKTtcblx0XHRcdFx0fSkpLCBhd2FpdCBobXJDbGllbnQubm90aWZ5TGlzdGVuZXJzKFwidml0ZTphZnRlclVwZGF0ZVwiLCBwYXlsb2FkKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiY3VzdG9tXCI6XG5cdFx0XHRcdGF3YWl0IGhtckNsaWVudC5ub3RpZnlMaXN0ZW5lcnMocGF5bG9hZC5ldmVudCwgcGF5bG9hZC5kYXRhKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiZnVsbC1yZWxvYWRcIjoge1xuXHRcdFx0XHRsZXQgeyB0cmlnZ2VyZWRCeSB9ID0gcGF5bG9hZCwgY2xlYXJFbnRyeXBvaW50VXJscyA9IHRyaWdnZXJlZEJ5ID8gZ2V0TW9kdWxlc0VudHJ5cG9pbnRzKHJ1bm5lciwgZ2V0TW9kdWxlc0J5RmlsZShydW5uZXIsIHNsYXNoKHRyaWdnZXJlZEJ5KSkpIDogZmluZEFsbEVudHJ5cG9pbnRzKHJ1bm5lcik7XG5cdFx0XHRcdGlmICghY2xlYXJFbnRyeXBvaW50VXJscy5zaXplKSBicmVhaztcblx0XHRcdFx0aG1yQ2xpZW50LmxvZ2dlci5kZWJ1ZyhcInByb2dyYW0gcmVsb2FkXCIpLCBhd2FpdCBobXJDbGllbnQubm90aWZ5TGlzdGVuZXJzKFwidml0ZTpiZWZvcmVGdWxsUmVsb2FkXCIsIHBheWxvYWQpLCBydW5uZXIuZXZhbHVhdGVkTW9kdWxlcy5jbGVhcigpO1xuXHRcdFx0XHRmb3IgKGxldCB1cmwgb2YgY2xlYXJFbnRyeXBvaW50VXJscykge1xuXHRcdFx0XHRcdGlmIChydW5uZXIuaXNDbG9zZWQoKSkgYnJlYWs7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IHJ1bm5lci5pbXBvcnQodXJsKTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0XHRcdGlmIChydW5uZXIuaXNDbG9zZWQoKSkgYnJlYWs7XG5cdFx0XHRcdFx0XHRlcnIuY29kZSAhPT0gXCJFUlJfT1VUREFURURfT1BUSU1JWkVEX0RFUFwiICYmIGhtckNsaWVudC5sb2dnZXIuZXJyb3IoYEFuIGVycm9yIGhhcHBlbmVkIGR1cmluZyBmdWxsIHJlbG9hZFxcbiR7ZXJyLm1lc3NhZ2V9XFxuJHtlcnIuc3RhY2t9YCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSBcInBydW5lXCI6XG5cdFx0XHRcdGF3YWl0IGhtckNsaWVudC5ub3RpZnlMaXN0ZW5lcnMoXCJ2aXRlOmJlZm9yZVBydW5lXCIsIHBheWxvYWQpLCBhd2FpdCBobXJDbGllbnQucHJ1bmVQYXRocyhwYXlsb2FkLnBhdGhzKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiZXJyb3JcIjoge1xuXHRcdFx0XHRhd2FpdCBobXJDbGllbnQubm90aWZ5TGlzdGVuZXJzKFwidml0ZTplcnJvclwiLCBwYXlsb2FkKTtcblx0XHRcdFx0bGV0IGVyciA9IHBheWxvYWQuZXJyO1xuXHRcdFx0XHRobXJDbGllbnQubG9nZ2VyLmVycm9yKGBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JcXG4ke2Vyci5tZXNzYWdlfVxcbiR7ZXJyLnN0YWNrfWApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgXCJwaW5nXCI6IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogcmV0dXJuIHBheWxvYWQ7XG5cdFx0fVxuXHR9KTtcbn1cbmZ1bmN0aW9uIGdldE1vZHVsZXNCeUZpbGUocnVubmVyLCBmaWxlKSB7XG5cdGxldCBub2RlcyA9IHJ1bm5lci5ldmFsdWF0ZWRNb2R1bGVzLmdldE1vZHVsZXNCeUZpbGUoZmlsZSk7XG5cdHJldHVybiBub2RlcyA/IFsuLi5ub2Rlc10ubWFwKChub2RlKSA9PiBub2RlLmlkKSA6IFtdO1xufVxuZnVuY3Rpb24gZ2V0TW9kdWxlc0VudHJ5cG9pbnRzKHJ1bm5lciwgbW9kdWxlcywgdmlzaXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksIGVudHJ5cG9pbnRzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSkge1xuXHRmb3IgKGxldCBtb2R1bGVJZCBvZiBtb2R1bGVzKSB7XG5cdFx0aWYgKHZpc2l0ZWQuaGFzKG1vZHVsZUlkKSkgY29udGludWU7XG5cdFx0dmlzaXRlZC5hZGQobW9kdWxlSWQpO1xuXHRcdGxldCBtb2R1bGUgPSBydW5uZXIuZXZhbHVhdGVkTW9kdWxlcy5nZXRNb2R1bGVCeUlkKG1vZHVsZUlkKTtcblx0XHRpZiAobW9kdWxlKSB7XG5cdFx0XHRpZiAoIW1vZHVsZS5pbXBvcnRlcnMuc2l6ZSkge1xuXHRcdFx0XHRlbnRyeXBvaW50cy5hZGQobW9kdWxlLnVybCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChsZXQgaW1wb3J0ZXIgb2YgbW9kdWxlLmltcG9ydGVycykgZ2V0TW9kdWxlc0VudHJ5cG9pbnRzKHJ1bm5lciwgW2ltcG9ydGVyXSwgdmlzaXRlZCwgZW50cnlwb2ludHMpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZW50cnlwb2ludHM7XG59XG5mdW5jdGlvbiBmaW5kQWxsRW50cnlwb2ludHMocnVubmVyLCBlbnRyeXBvaW50cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpIHtcblx0Zm9yIChsZXQgbW9kIG9mIHJ1bm5lci5ldmFsdWF0ZWRNb2R1bGVzLmlkVG9Nb2R1bGVNYXAudmFsdWVzKCkpIG1vZC5pbXBvcnRlcnMuc2l6ZSB8fCBlbnRyeXBvaW50cy5hZGQobW9kLnVybCk7XG5cdHJldHVybiBlbnRyeXBvaW50cztcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL3NvdXJjZW1hcC9pbnRlcmNlcHRvci50c1xuY29uc3Qgc291cmNlTWFwQ2FjaGUgPSB7fSwgZmlsZUNvbnRlbnRzQ2FjaGUgPSB7fSwgZXZhbHVhdGVkTW9kdWxlc0NhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwgcmV0cmlldmVGaWxlSGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCByZXRyaWV2ZVNvdXJjZU1hcEhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwgY3JlYXRlRXhlY0hhbmRsZXJzID0gKGhhbmRsZXJzKSA9PiAoKC4uLmFyZ3MpID0+IHtcblx0Zm9yIChsZXQgaGFuZGxlciBvZiBoYW5kbGVycykge1xuXHRcdGxldCByZXN1bHQgPSBoYW5kbGVyKC4uLmFyZ3MpO1xuXHRcdGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG5cdH1cblx0cmV0dXJuIG51bGw7XG59KSwgcmV0cmlldmVGaWxlRnJvbUhhbmRsZXJzID0gY3JlYXRlRXhlY0hhbmRsZXJzKHJldHJpZXZlRmlsZUhhbmRsZXJzKSwgcmV0cmlldmVTb3VyY2VNYXBGcm9tSGFuZGxlcnMgPSBjcmVhdGVFeGVjSGFuZGxlcnMocmV0cmlldmVTb3VyY2VNYXBIYW5kbGVycyk7XG5sZXQgb3ZlcnJpZGRlbiA9ICExO1xuY29uc3Qgb3JpZ2luYWxQcmVwYXJlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7XG5mdW5jdGlvbiByZXNldEludGVyY2VwdG9yKHJ1bm5lciwgb3B0aW9ucykge1xuXHRldmFsdWF0ZWRNb2R1bGVzQ2FjaGUuZGVsZXRlKHJ1bm5lci5ldmFsdWF0ZWRNb2R1bGVzKSwgb3B0aW9ucy5yZXRyaWV2ZUZpbGUgJiYgcmV0cmlldmVGaWxlSGFuZGxlcnMuZGVsZXRlKG9wdGlvbnMucmV0cmlldmVGaWxlKSwgb3B0aW9ucy5yZXRyaWV2ZVNvdXJjZU1hcCAmJiByZXRyaWV2ZVNvdXJjZU1hcEhhbmRsZXJzLmRlbGV0ZShvcHRpb25zLnJldHJpZXZlU291cmNlTWFwKSwgZXZhbHVhdGVkTW9kdWxlc0NhY2hlLnNpemUgPT09IDAgJiYgKEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gb3JpZ2luYWxQcmVwYXJlLCBvdmVycmlkZGVuID0gITEpO1xufVxuZnVuY3Rpb24gaW50ZXJjZXB0U3RhY2tUcmFjZShydW5uZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRyZXR1cm4gb3ZlcnJpZGRlbiB8fD0gKEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJlcGFyZVN0YWNrVHJhY2UsICEwKSwgZXZhbHVhdGVkTW9kdWxlc0NhY2hlLmFkZChydW5uZXIuZXZhbHVhdGVkTW9kdWxlcyksIG9wdGlvbnMucmV0cmlldmVGaWxlICYmIHJldHJpZXZlRmlsZUhhbmRsZXJzLmFkZChvcHRpb25zLnJldHJpZXZlRmlsZSksIG9wdGlvbnMucmV0cmlldmVTb3VyY2VNYXAgJiYgcmV0cmlldmVTb3VyY2VNYXBIYW5kbGVycy5hZGQob3B0aW9ucy5yZXRyaWV2ZVNvdXJjZU1hcCksICgpID0+IHJlc2V0SW50ZXJjZXB0b3IocnVubmVyLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHN1cHBvcnRSZWxhdGl2ZVVSTChmaWxlLCB1cmwpIHtcblx0aWYgKCFmaWxlKSByZXR1cm4gdXJsO1xuXHRsZXQgZGlyID0gcG9zaXhEaXJuYW1lKHNsYXNoKGZpbGUpKSwgbWF0Y2ggPSAvXlxcdys6XFwvXFwvW14vXSovLmV4ZWMoZGlyKSwgcHJvdG9jb2wgPSBtYXRjaCA/IG1hdGNoWzBdIDogXCJcIiwgc3RhcnRQYXRoID0gZGlyLnNsaWNlKHByb3RvY29sLmxlbmd0aCk7XG5cdHJldHVybiBwcm90b2NvbCAmJiAvXlxcL1xcdzovLnRlc3Qoc3RhcnRQYXRoKSA/IChwcm90b2NvbCArPSBcIi9cIiwgcHJvdG9jb2wgKyBzbGFzaChwb3NpeFJlc29sdmUoc3RhcnRQYXRoLCB1cmwpKSkgOiBwcm90b2NvbCArIHBvc2l4UmVzb2x2ZShzdGFydFBhdGgsIHVybCk7XG59XG5mdW5jdGlvbiBnZXRSdW5uZXJTb3VyY2VNYXAocG9zaXRpb24pIHtcblx0Zm9yIChsZXQgbW9kdWxlR3JhcGggb2YgZXZhbHVhdGVkTW9kdWxlc0NhY2hlKSB7XG5cdFx0bGV0IHNvdXJjZU1hcCA9IG1vZHVsZUdyYXBoLmdldE1vZHVsZVNvdXJjZU1hcEJ5SWQocG9zaXRpb24uc291cmNlKTtcblx0XHRpZiAoc291cmNlTWFwKSByZXR1cm4ge1xuXHRcdFx0dXJsOiBwb3NpdGlvbi5zb3VyY2UsXG5cdFx0XHRtYXA6IHNvdXJjZU1hcCxcblx0XHRcdHZpdGU6ICEwXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHJldHJpZXZlRmlsZShwYXRoKSB7XG5cdGlmIChwYXRoIGluIGZpbGVDb250ZW50c0NhY2hlKSByZXR1cm4gZmlsZUNvbnRlbnRzQ2FjaGVbcGF0aF07XG5cdGxldCBjb250ZW50ID0gcmV0cmlldmVGaWxlRnJvbUhhbmRsZXJzKHBhdGgpO1xuXHRyZXR1cm4gdHlwZW9mIGNvbnRlbnQgPT0gXCJzdHJpbmdcIiA/IChmaWxlQ29udGVudHNDYWNoZVtwYXRoXSA9IGNvbnRlbnQsIGNvbnRlbnQpIDogbnVsbDtcbn1cbmZ1bmN0aW9uIHJldHJpZXZlU291cmNlTWFwVVJMKHNvdXJjZSkge1xuXHRsZXQgZmlsZURhdGEgPSByZXRyaWV2ZUZpbGUoc291cmNlKTtcblx0aWYgKCFmaWxlRGF0YSkgcmV0dXJuIG51bGw7XG5cdGxldCByZSA9IC9cXC9cXC9bQCNdXFxzKnNvdXJjZU1hcHBpbmdVUkw9KFteXFxzJ1wiXSspXFxzKiR8XFwvXFwqW0AjXVxccypzb3VyY2VNYXBwaW5nVVJMPVteXFxzKidcIl0rXFxzKlxcKlxcL1xccyokL2dtLCBsYXN0TWF0Y2gsIG1hdGNoO1xuXHRmb3IgKDsgbWF0Y2ggPSByZS5leGVjKGZpbGVEYXRhKTspIGxhc3RNYXRjaCA9IG1hdGNoO1xuXHRyZXR1cm4gbGFzdE1hdGNoID8gbGFzdE1hdGNoWzFdIDogbnVsbDtcbn1cbmNvbnN0IHJlU291cmNlTWFwID0gL15kYXRhOmFwcGxpY2F0aW9uXFwvanNvblteLF0rYmFzZTY0LC87XG5mdW5jdGlvbiByZXRyaWV2ZVNvdXJjZU1hcChzb3VyY2UpIHtcblx0bGV0IHVybEFuZE1hcCA9IHJldHJpZXZlU291cmNlTWFwRnJvbUhhbmRsZXJzKHNvdXJjZSk7XG5cdGlmICh1cmxBbmRNYXApIHJldHVybiB1cmxBbmRNYXA7XG5cdGxldCBzb3VyY2VNYXBwaW5nVVJMID0gcmV0cmlldmVTb3VyY2VNYXBVUkwoc291cmNlKTtcblx0aWYgKCFzb3VyY2VNYXBwaW5nVVJMKSByZXR1cm4gbnVsbDtcblx0bGV0IHNvdXJjZU1hcERhdGE7XG5cdGlmIChyZVNvdXJjZU1hcC50ZXN0KHNvdXJjZU1hcHBpbmdVUkwpKSB7XG5cdFx0bGV0IHJhd0RhdGEgPSBzb3VyY2VNYXBwaW5nVVJMLnNsaWNlKHNvdXJjZU1hcHBpbmdVUkwuaW5kZXhPZihcIixcIikgKyAxKTtcblx0XHRzb3VyY2VNYXBEYXRhID0gQnVmZmVyLmZyb20ocmF3RGF0YSwgXCJiYXNlNjRcIikudG9TdHJpbmcoKSwgc291cmNlTWFwcGluZ1VSTCA9IHNvdXJjZTtcblx0fSBlbHNlIHNvdXJjZU1hcHBpbmdVUkwgPSBzdXBwb3J0UmVsYXRpdmVVUkwoc291cmNlLCBzb3VyY2VNYXBwaW5nVVJMKSwgc291cmNlTWFwRGF0YSA9IHJldHJpZXZlRmlsZShzb3VyY2VNYXBwaW5nVVJMKTtcblx0cmV0dXJuIHNvdXJjZU1hcERhdGEgPyB7XG5cdFx0dXJsOiBzb3VyY2VNYXBwaW5nVVJMLFxuXHRcdG1hcDogc291cmNlTWFwRGF0YVxuXHR9IDogbnVsbDtcbn1cbmZ1bmN0aW9uIG1hcFNvdXJjZVBvc2l0aW9uKHBvc2l0aW9uKSB7XG5cdGlmICghcG9zaXRpb24uc291cmNlKSByZXR1cm4gcG9zaXRpb247XG5cdGxldCBzb3VyY2VNYXAgPSBnZXRSdW5uZXJTb3VyY2VNYXAocG9zaXRpb24pO1xuXHRpZiAoc291cmNlTWFwIHx8PSBzb3VyY2VNYXBDYWNoZVtwb3NpdGlvbi5zb3VyY2VdLCAhc291cmNlTWFwKSB7XG5cdFx0bGV0IHVybEFuZE1hcCA9IHJldHJpZXZlU291cmNlTWFwKHBvc2l0aW9uLnNvdXJjZSk7XG5cdFx0aWYgKHVybEFuZE1hcCAmJiB1cmxBbmRNYXAubWFwKSB7XG5cdFx0XHRsZXQgdXJsID0gdXJsQW5kTWFwLnVybDtcblx0XHRcdHNvdXJjZU1hcCA9IHNvdXJjZU1hcENhY2hlW3Bvc2l0aW9uLnNvdXJjZV0gPSB7XG5cdFx0XHRcdHVybCxcblx0XHRcdFx0bWFwOiBuZXcgRGVjb2RlZE1hcCh0eXBlb2YgdXJsQW5kTWFwLm1hcCA9PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZSh1cmxBbmRNYXAubWFwKSA6IHVybEFuZE1hcC5tYXAsIHVybClcblx0XHRcdH07XG5cdFx0XHRsZXQgY29udGVudHMgPSBzb3VyY2VNYXAubWFwPy5tYXAuc291cmNlc0NvbnRlbnQ7XG5cdFx0XHRzb3VyY2VNYXAubWFwICYmIGNvbnRlbnRzICYmIHNvdXJjZU1hcC5tYXAucmVzb2x2ZWRTb3VyY2VzLmZvckVhY2goKHNvdXJjZSwgaSkgPT4ge1xuXHRcdFx0XHRsZXQgY29udGVudCA9IGNvbnRlbnRzW2ldO1xuXHRcdFx0XHRpZiAoY29udGVudCAmJiBzb3VyY2UgJiYgdXJsKSB7XG5cdFx0XHRcdFx0bGV0IGNvbnRlbnRVcmwgPSBzdXBwb3J0UmVsYXRpdmVVUkwodXJsLCBzb3VyY2UpO1xuXHRcdFx0XHRcdGZpbGVDb250ZW50c0NhY2hlW2NvbnRlbnRVcmxdID0gY29udGVudDtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHNvdXJjZU1hcCA9IHNvdXJjZU1hcENhY2hlW3Bvc2l0aW9uLnNvdXJjZV0gPSB7XG5cdFx0XHR1cmw6IG51bGwsXG5cdFx0XHRtYXA6IG51bGxcblx0XHR9O1xuXHR9XG5cdGlmIChzb3VyY2VNYXAubWFwICYmIHNvdXJjZU1hcC51cmwpIHtcblx0XHRsZXQgb3JpZ2luYWxQb3NpdGlvbiA9IGdldE9yaWdpbmFsUG9zaXRpb24oc291cmNlTWFwLm1hcCwgcG9zaXRpb24pO1xuXHRcdGlmIChvcmlnaW5hbFBvc2l0aW9uICYmIG9yaWdpbmFsUG9zaXRpb24uc291cmNlICE9IG51bGwpIHJldHVybiBvcmlnaW5hbFBvc2l0aW9uLnNvdXJjZSA9IHN1cHBvcnRSZWxhdGl2ZVVSTChzb3VyY2VNYXAudXJsLCBvcmlnaW5hbFBvc2l0aW9uLnNvdXJjZSksIHNvdXJjZU1hcC52aXRlICYmIChvcmlnaW5hbFBvc2l0aW9uLl92aXRlID0gITApLCBvcmlnaW5hbFBvc2l0aW9uO1xuXHR9XG5cdHJldHVybiBwb3NpdGlvbjtcbn1cbmZ1bmN0aW9uIG1hcEV2YWxPcmlnaW4ob3JpZ2luKSB7XG5cdGxldCBtYXRjaCA9IC9eZXZhbCBhdCAoW14oXSspIFxcKCguKyk6KFxcZCspOihcXGQrKVxcKSQvLmV4ZWMob3JpZ2luKTtcblx0aWYgKG1hdGNoKSB7XG5cdFx0bGV0IHBvc2l0aW9uID0gbWFwU291cmNlUG9zaXRpb24oe1xuXHRcdFx0bmFtZTogbnVsbCxcblx0XHRcdHNvdXJjZTogbWF0Y2hbMl0sXG5cdFx0XHRsaW5lOiArbWF0Y2hbM10sXG5cdFx0XHRjb2x1bW46IG1hdGNoWzRdIC0gMVxuXHRcdH0pO1xuXHRcdHJldHVybiBgZXZhbCBhdCAke21hdGNoWzFdfSAoJHtwb3NpdGlvbi5zb3VyY2V9OiR7cG9zaXRpb24ubGluZX06JHtwb3NpdGlvbi5jb2x1bW4gKyAxfSlgO1xuXHR9XG5cdHJldHVybiBtYXRjaCA9IC9eZXZhbCBhdCAoW14oXSspIFxcKCguKylcXCkkLy5leGVjKG9yaWdpbiksIG1hdGNoID8gYGV2YWwgYXQgJHttYXRjaFsxXX0gKCR7bWFwRXZhbE9yaWdpbihtYXRjaFsyXSl9KWAgOiBvcmlnaW47XG59XG5mdW5jdGlvbiBDYWxsU2l0ZVRvU3RyaW5nKCkge1xuXHRsZXQgZmlsZU5hbWUsIGZpbGVMb2NhdGlvbiA9IFwiXCI7XG5cdGlmICh0aGlzLmlzTmF0aXZlKCkpIGZpbGVMb2NhdGlvbiA9IFwibmF0aXZlXCI7XG5cdGVsc2Uge1xuXHRcdGZpbGVOYW1lID0gdGhpcy5nZXRTY3JpcHROYW1lT3JTb3VyY2VVUkwoKSwgIWZpbGVOYW1lICYmIHRoaXMuaXNFdmFsKCkgJiYgKGZpbGVMb2NhdGlvbiA9IHRoaXMuZ2V0RXZhbE9yaWdpbigpLCBmaWxlTG9jYXRpb24gKz0gXCIsIFwiKSwgZmlsZU5hbWUgPyBmaWxlTG9jYXRpb24gKz0gZmlsZU5hbWUgOiBmaWxlTG9jYXRpb24gKz0gXCI8YW5vbnltb3VzPlwiO1xuXHRcdGxldCBsaW5lTnVtYmVyID0gdGhpcy5nZXRMaW5lTnVtYmVyKCk7XG5cdFx0aWYgKGxpbmVOdW1iZXIgIT0gbnVsbCkge1xuXHRcdFx0ZmlsZUxvY2F0aW9uICs9IGA6JHtsaW5lTnVtYmVyfWA7XG5cdFx0XHRsZXQgY29sdW1uTnVtYmVyID0gdGhpcy5nZXRDb2x1bW5OdW1iZXIoKTtcblx0XHRcdGNvbHVtbk51bWJlciAmJiAoZmlsZUxvY2F0aW9uICs9IGA6JHtjb2x1bW5OdW1iZXJ9YCk7XG5cdFx0fVxuXHR9XG5cdGxldCBsaW5lID0gXCJcIiwgZnVuY3Rpb25OYW1lID0gdGhpcy5nZXRGdW5jdGlvbk5hbWUoKSwgYWRkU3VmZml4ID0gITAsIGlzQ29uc3RydWN0b3IgPSB0aGlzLmlzQ29uc3RydWN0b3IoKTtcblx0aWYgKHRoaXMuaXNUb3BsZXZlbCgpIHx8IGlzQ29uc3RydWN0b3IpIGlzQ29uc3RydWN0b3IgPyBsaW5lICs9IGBuZXcgJHtmdW5jdGlvbk5hbWUgfHwgXCI8YW5vbnltb3VzPlwifWAgOiBmdW5jdGlvbk5hbWUgPyBsaW5lICs9IGZ1bmN0aW9uTmFtZSA6IChsaW5lICs9IGZpbGVMb2NhdGlvbiwgYWRkU3VmZml4ID0gITEpO1xuXHRlbHNlIHtcblx0XHRsZXQgdHlwZU5hbWUgPSB0aGlzLmdldFR5cGVOYW1lKCk7XG5cdFx0dHlwZU5hbWUgPT09IFwiW29iamVjdCBPYmplY3RdXCIgJiYgKHR5cGVOYW1lID0gXCJudWxsXCIpO1xuXHRcdGxldCBtZXRob2ROYW1lID0gdGhpcy5nZXRNZXRob2ROYW1lKCk7XG5cdFx0ZnVuY3Rpb25OYW1lID8gKHR5cGVOYW1lICYmIGZ1bmN0aW9uTmFtZS5pbmRleE9mKHR5cGVOYW1lKSAhPT0gMCAmJiAobGluZSArPSBgJHt0eXBlTmFtZX0uYCksIGxpbmUgKz0gZnVuY3Rpb25OYW1lLCBtZXRob2ROYW1lICYmIGZ1bmN0aW9uTmFtZS5pbmRleE9mKGAuJHttZXRob2ROYW1lfWApICE9PSBmdW5jdGlvbk5hbWUubGVuZ3RoIC0gbWV0aG9kTmFtZS5sZW5ndGggLSAxICYmIChsaW5lICs9IGAgW2FzICR7bWV0aG9kTmFtZX1dYCkpIDogbGluZSArPSBgJHt0eXBlTmFtZX0uJHttZXRob2ROYW1lIHx8IFwiPGFub255bW91cz5cIn1gO1xuXHR9XG5cdHJldHVybiBhZGRTdWZmaXggJiYgKGxpbmUgKz0gYCAoJHtmaWxlTG9jYXRpb259KWApLCBsaW5lO1xufVxuZnVuY3Rpb24gY2xvbmVDYWxsU2l0ZShmcmFtZSkge1xuXHRsZXQgb2JqZWN0ID0ge307XG5cdHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPYmplY3QuZ2V0UHJvdG90eXBlT2YoZnJhbWUpKS5mb3JFYWNoKChuYW1lKSA9PiB7XG5cdFx0bGV0IGtleSA9IG5hbWU7XG5cdFx0b2JqZWN0W2tleV0gPSAvXig/OmlzfGdldCkvLnRlc3QobmFtZSkgPyBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBmcmFtZVtrZXldLmNhbGwoZnJhbWUpO1xuXHRcdH0gOiBmcmFtZVtrZXldO1xuXHR9KSwgb2JqZWN0LnRvU3RyaW5nID0gQ2FsbFNpdGVUb1N0cmluZywgb2JqZWN0O1xufVxuZnVuY3Rpb24gd3JhcENhbGxTaXRlKGZyYW1lLCBzdGF0ZSkge1xuXHRpZiAoc3RhdGUgPT09IHZvaWQgMCAmJiAoc3RhdGUgPSB7XG5cdFx0bmV4dFBvc2l0aW9uOiBudWxsLFxuXHRcdGN1clBvc2l0aW9uOiBudWxsXG5cdH0pLCBmcmFtZS5pc05hdGl2ZSgpKSByZXR1cm4gc3RhdGUuY3VyUG9zaXRpb24gPSBudWxsLCBmcmFtZTtcblx0bGV0IHNvdXJjZSA9IGZyYW1lLmdldEZpbGVOYW1lKCkgfHwgZnJhbWUuZ2V0U2NyaXB0TmFtZU9yU291cmNlVVJMKCk7XG5cdGlmIChzb3VyY2UpIHtcblx0XHRsZXQgcG9zaXRpb24gPSBtYXBTb3VyY2VQb3NpdGlvbih7XG5cdFx0XHRuYW1lOiBudWxsLFxuXHRcdFx0c291cmNlLFxuXHRcdFx0bGluZTogZnJhbWUuZ2V0TGluZU51bWJlcigpID8/IDAsXG5cdFx0XHRjb2x1bW46IChmcmFtZS5nZXRDb2x1bW5OdW1iZXIoKSA/PyAxKSAtIDFcblx0XHR9KTtcblx0XHRzdGF0ZS5jdXJQb3NpdGlvbiA9IHBvc2l0aW9uLCBmcmFtZSA9IGNsb25lQ2FsbFNpdGUoZnJhbWUpO1xuXHRcdGxldCBvcmlnaW5hbEZ1bmN0aW9uTmFtZSA9IGZyYW1lLmdldEZ1bmN0aW9uTmFtZTtcblx0XHRyZXR1cm4gZnJhbWUuZ2V0RnVuY3Rpb25OYW1lID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRsZXQgbmFtZSA9IHN0YXRlLm5leHRQb3NpdGlvbiA9PSBudWxsID8gb3JpZ2luYWxGdW5jdGlvbk5hbWUoKSA6IHN0YXRlLm5leHRQb3NpdGlvbi5uYW1lIHx8IG9yaWdpbmFsRnVuY3Rpb25OYW1lKCk7XG5cdFx0XHRyZXR1cm4gbmFtZSA9PT0gXCJldmFsXCIgJiYgXCJfdml0ZVwiIGluIHBvc2l0aW9uID8gbnVsbCA6IG5hbWU7XG5cdFx0fSwgZnJhbWUuZ2V0RmlsZU5hbWUgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBwb3NpdGlvbi5zb3VyY2UgPz8gbnVsbDtcblx0XHR9LCBmcmFtZS5nZXRMaW5lTnVtYmVyID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gcG9zaXRpb24ubGluZTtcblx0XHR9LCBmcmFtZS5nZXRDb2x1bW5OdW1iZXIgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBwb3NpdGlvbi5jb2x1bW4gKyAxO1xuXHRcdH0sIGZyYW1lLmdldFNjcmlwdE5hbWVPclNvdXJjZVVSTCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHBvc2l0aW9uLnNvdXJjZTtcblx0XHR9LCBmcmFtZTtcblx0fVxuXHRsZXQgb3JpZ2luID0gZnJhbWUuaXNFdmFsKCkgJiYgZnJhbWUuZ2V0RXZhbE9yaWdpbigpO1xuXHRyZXR1cm4gb3JpZ2luID8gKG9yaWdpbiA9IG1hcEV2YWxPcmlnaW4ob3JpZ2luKSwgZnJhbWUgPSBjbG9uZUNhbGxTaXRlKGZyYW1lKSwgZnJhbWUuZ2V0RXZhbE9yaWdpbiA9IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBvcmlnaW4gfHwgdm9pZCAwO1xuXHR9LCBmcmFtZSkgOiBmcmFtZTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVTdGFja1RyYWNlKGVycm9yLCBzdGFjaykge1xuXHRsZXQgZXJyb3JTdHJpbmcgPSBgJHtlcnJvci5uYW1lIHx8IFwiRXJyb3JcIn06ICR7ZXJyb3IubWVzc2FnZSB8fCBcIlwifWAsIHN0YXRlID0ge1xuXHRcdG5leHRQb3NpdGlvbjogbnVsbCxcblx0XHRjdXJQb3NpdGlvbjogbnVsbFxuXHR9LCBwcm9jZXNzZWRTdGFjayA9IFtdO1xuXHRmb3IgKGxldCBpID0gc3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHByb2Nlc3NlZFN0YWNrLnB1c2goYFxcbiAgICBhdCAke3dyYXBDYWxsU2l0ZShzdGFja1tpXSwgc3RhdGUpfWApLCBzdGF0ZS5uZXh0UG9zaXRpb24gPSBzdGF0ZS5jdXJQb3NpdGlvbjtcblx0cmV0dXJuIHN0YXRlLmN1clBvc2l0aW9uID0gc3RhdGUubmV4dFBvc2l0aW9uID0gbnVsbCwgZXJyb3JTdHJpbmcgKyBwcm9jZXNzZWRTdGFjay5yZXZlcnNlKCkuam9pbihcIlwiKTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL3NvdXJjZW1hcC9pbmRleC50c1xuZnVuY3Rpb24gZW5hYmxlU291cmNlTWFwU3VwcG9ydChydW5uZXIpIHtcblx0aWYgKHJ1bm5lci5vcHRpb25zLnNvdXJjZW1hcEludGVyY2VwdG9yID09PSBcIm5vZGVcIikge1xuXHRcdGlmICh0eXBlb2YgcHJvY2VzcyA+IFwidVwiKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlIFxcXCJzb3VyY2VtYXBJbnRlcmNlcHRvcjogJ25vZGUnXFxcIiBiZWNhdXNlIGdsb2JhbCBcXFwicHJvY2Vzc1xcXCIgdmFyaWFibGUgaXMgbm90IGF2YWlsYWJsZS5cIik7XG5cdFx0aWYgKHR5cGVvZiBwcm9jZXNzLnNldFNvdXJjZU1hcHNFbmFibGVkICE9IFwiZnVuY3Rpb25cIikgdGhyb3cgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSBcXFwic291cmNlbWFwSW50ZXJjZXB0b3I6ICdub2RlJ1xcXCIgYmVjYXVzZSBcXFwicHJvY2Vzcy5zZXRTb3VyY2VNYXBzRW5hYmxlZFxcXCIgZnVuY3Rpb24gaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIHVzZSBOb2RlID49IDE2LjYuMC5cIik7XG5cdFx0bGV0IGlzRW5hYmxlZEFscmVhZHkgPSBwcm9jZXNzLnNvdXJjZU1hcHNFbmFibGVkID8/ICExO1xuXHRcdHJldHVybiBwcm9jZXNzLnNldFNvdXJjZU1hcHNFbmFibGVkKCEwKSwgKCkgPT4gIWlzRW5hYmxlZEFscmVhZHkgJiYgcHJvY2Vzcy5zZXRTb3VyY2VNYXBzRW5hYmxlZCghMSk7XG5cdH1cblx0cmV0dXJuIGludGVyY2VwdFN0YWNrVHJhY2UocnVubmVyLCB0eXBlb2YgcnVubmVyLm9wdGlvbnMuc291cmNlbWFwSW50ZXJjZXB0b3IgPT0gXCJvYmplY3RcIiA/IHJ1bm5lci5vcHRpb25zLnNvdXJjZW1hcEludGVyY2VwdG9yIDogdm9pZCAwKTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL2VzbUV2YWx1YXRvci50c1xudmFyIEVTTW9kdWxlc0V2YWx1YXRvciA9IGNsYXNzIHtcblx0c3RhcnRPZmZzZXQgPSBnZXRBc3luY0Z1bmN0aW9uRGVjbGFyYXRpb25QYWRkaW5nTGluZUNvdW50KCk7XG5cdGFzeW5jIHJ1bklubGluZWRNb2R1bGUoY29udGV4dCwgY29kZSkge1xuXHRcdGF3YWl0IG5ldyBBc3luY0Z1bmN0aW9uKHNzck1vZHVsZUV4cG9ydHNLZXksIHNzckltcG9ydE1ldGFLZXksIHNzckltcG9ydEtleSwgc3NyRHluYW1pY0ltcG9ydEtleSwgc3NyRXhwb3J0QWxsS2V5LCBzc3JFeHBvcnROYW1lS2V5LCBcIlxcXCJ1c2Ugc3RyaWN0XFxcIjtcIiArIGNvZGUpKGNvbnRleHRbc3NyTW9kdWxlRXhwb3J0c0tleV0sIGNvbnRleHRbc3NySW1wb3J0TWV0YUtleV0sIGNvbnRleHRbc3NySW1wb3J0S2V5XSwgY29udGV4dFtzc3JEeW5hbWljSW1wb3J0S2V5XSwgY29udGV4dFtzc3JFeHBvcnRBbGxLZXldLCBjb250ZXh0W3NzckV4cG9ydE5hbWVLZXldKSwgT2JqZWN0LnNlYWwoY29udGV4dFtzc3JNb2R1bGVFeHBvcnRzS2V5XSk7XG5cdH1cblx0cnVuRXh0ZXJuYWxNb2R1bGUoZmlsZXBhdGgpIHtcblx0XHRyZXR1cm4gaW1wb3J0KGZpbGVwYXRoKTtcblx0fVxufTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL2ltcG9ydE1ldGFSZXNvbHZlci50c1xuY29uc3QgY3VzdG9taXphdGlvbkhvb2tOYW1lc3BhY2UgPSBcInZpdGUtbW9kdWxlLXJ1bm5lcjppbXBvcnQtbWV0YS1yZXNvbHZlL3YxL1wiLCBjdXN0b21pemF0aW9uSG9va3NNb2R1bGUgPSBgXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlKHNwZWNpZmllciwgY29udGV4dCwgbmV4dFJlc29sdmUpIHtcbiAgaWYgKHNwZWNpZmllci5zdGFydHNXaXRoKCR7SlNPTi5zdHJpbmdpZnkoY3VzdG9taXphdGlvbkhvb2tOYW1lc3BhY2UpfSkpIHtcbiAgICBjb25zdCBkYXRhID0gc3BlY2lmaWVyLnNsaWNlKCR7SlNPTi5zdHJpbmdpZnkoY3VzdG9taXphdGlvbkhvb2tOYW1lc3BhY2UpfS5sZW5ndGgpXG4gICAgY29uc3QgW3BhcnNlZFNwZWNpZmllciwgcGFyc2VkSW1wb3J0ZXJdID0gSlNPTi5wYXJzZShkYXRhKVxuICAgIHNwZWNpZmllciA9IHBhcnNlZFNwZWNpZmllclxuICAgIGNvbnRleHQucGFyZW50VVJMID0gcGFyc2VkSW1wb3J0ZXJcbiAgfVxuICByZXR1cm4gbmV4dFJlc29sdmUoc3BlY2lmaWVyLCBjb250ZXh0KVxufVxuXG5gO1xuZnVuY3Rpb24gY3VzdG9taXphdGlvbkhvb2tSZXNvbHZlKHNwZWNpZmllciwgY29udGV4dCwgbmV4dFJlc29sdmUpIHtcblx0aWYgKHNwZWNpZmllci5zdGFydHNXaXRoKGN1c3RvbWl6YXRpb25Ib29rTmFtZXNwYWNlKSkge1xuXHRcdGxldCBkYXRhID0gc3BlY2lmaWVyLnNsaWNlKDQyKSwgW3BhcnNlZFNwZWNpZmllciwgcGFyc2VkSW1wb3J0ZXJdID0gSlNPTi5wYXJzZShkYXRhKTtcblx0XHRzcGVjaWZpZXIgPSBwYXJzZWRTcGVjaWZpZXIsIGNvbnRleHQucGFyZW50VVJMID0gcGFyc2VkSW1wb3J0ZXI7XG5cdH1cblx0cmV0dXJuIG5leHRSZXNvbHZlKHNwZWNpZmllciwgY29udGV4dCk7XG59XG5sZXQgaXNIb29rUmVnaXN0ZXJlZCA9ICExO1xuZnVuY3Rpb24gY3JlYXRlSW1wb3J0TWV0YVJlc29sdmVyKCkge1xuXHRpZiAoaXNIb29rUmVnaXN0ZXJlZCkgcmV0dXJuIGltcG9ydE1ldGFSZXNvbHZlV2l0aEN1c3RvbUhvb2s7XG5cdGxldCBtb2R1bGU7XG5cdHRyeSB7XG5cdFx0bW9kdWxlID0gdHlwZW9mIHByb2Nlc3MgPCBcInVcIiA/IHByb2Nlc3MuZ2V0QnVpbHRpbk1vZHVsZShcIm5vZGU6bW9kdWxlXCIpLk1vZHVsZSA6IHZvaWQgMDtcblx0fSBjYXRjaCB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGlmIChtb2R1bGUpIHtcblx0XHRpZiAobW9kdWxlLnJlZ2lzdGVySG9va3MpIHJldHVybiBtb2R1bGUucmVnaXN0ZXJIb29rcyh7IHJlc29sdmU6IGN1c3RvbWl6YXRpb25Ib29rUmVzb2x2ZSB9KSwgaXNIb29rUmVnaXN0ZXJlZCA9ICEwLCBpbXBvcnRNZXRhUmVzb2x2ZVdpdGhDdXN0b21Ib29rO1xuXHRcdGlmIChtb2R1bGUucmVnaXN0ZXIpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGxldCBob29rTW9kdWxlQ29udGVudCA9IGBkYXRhOnRleHQvamF2YXNjcmlwdCwke2VuY29kZVVSSShjdXN0b21pemF0aW9uSG9va3NNb2R1bGUpfWA7XG5cdFx0XHRcdG1vZHVsZS5yZWdpc3Rlcihob29rTW9kdWxlQ29udGVudCk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGlmIChcImNvZGVcIiBpbiBlICYmIGUuY29kZSA9PT0gXCJFUlJfTkVUV09SS19JTVBPUlRfRElTQUxMT1dFRFwiKSByZXR1cm47XG5cdFx0XHRcdHRocm93IGU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gaXNIb29rUmVnaXN0ZXJlZCA9ICEwLCBpbXBvcnRNZXRhUmVzb2x2ZVdpdGhDdXN0b21Ib29rO1xuXHRcdH1cblx0fVxufVxuZnVuY3Rpb24gaW1wb3J0TWV0YVJlc29sdmVXaXRoQ3VzdG9tSG9vayhzcGVjaWZpZXIsIGltcG9ydGVyKSB7XG5cdHJldHVybiBpbXBvcnQubWV0YS5yZXNvbHZlKGAke2N1c3RvbWl6YXRpb25Ib29rTmFtZXNwYWNlfSR7SlNPTi5zdHJpbmdpZnkoW3NwZWNpZmllciwgaW1wb3J0ZXJdKX1gKTtcbn1cbmAke2N1c3RvbWl6YXRpb25Ib29rTmFtZXNwYWNlfWA7XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbW9kdWxlLXJ1bm5lci9jcmVhdGVJbXBvcnRNZXRhLnRzXG5jb25zdCBlbnZQcm94eSA9IG5ldyBQcm94eSh7fSwgeyBnZXQoXywgcCkge1xuXHR0aHJvdyBFcnJvcihgW21vZHVsZSBydW5uZXJdIER5bmFtaWMgYWNjZXNzIG9mIFwiaW1wb3J0Lm1ldGEuZW52XCIgaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlLCB1c2UgXCJpbXBvcnQubWV0YS5lbnYuJHtTdHJpbmcocCl9XCIgaW5zdGVhZC5gKTtcbn0gfSk7XG5mdW5jdGlvbiBjcmVhdGVEZWZhdWx0SW1wb3J0TWV0YShtb2R1bGVQYXRoKSB7XG5cdGxldCBocmVmID0gcG9zaXhQYXRoVG9GaWxlSHJlZihtb2R1bGVQYXRoKSwgZmlsZW5hbWUgPSBtb2R1bGVQYXRoLCBkaXJuYW1lID0gcG9zaXhEaXJuYW1lKG1vZHVsZVBhdGgpO1xuXHRyZXR1cm4ge1xuXHRcdGZpbGVuYW1lOiBpc1dpbmRvd3MgPyB0b1dpbmRvd3NQYXRoKGZpbGVuYW1lKSA6IGZpbGVuYW1lLFxuXHRcdGRpcm5hbWU6IGlzV2luZG93cyA/IHRvV2luZG93c1BhdGgoZGlybmFtZSkgOiBkaXJuYW1lLFxuXHRcdHVybDogaHJlZixcblx0XHRlbnY6IGVudlByb3h5LFxuXHRcdHJlc29sdmUoX2lkLCBfcGFyZW50KSB7XG5cdFx0XHR0aHJvdyBFcnJvcihcIlttb2R1bGUgcnVubmVyXSBcXFwiaW1wb3J0Lm1ldGEucmVzb2x2ZVxcXCIgaXMgbm90IHN1cHBvcnRlZC5cIik7XG5cdFx0fSxcblx0XHRnbG9iKCkge1xuXHRcdFx0dGhyb3cgRXJyb3IoXCJbbW9kdWxlIHJ1bm5lcl0gXFxcImltcG9ydC5tZXRhLmdsb2JcXFwiIGlzIHN0YXRpY2FsbHkgcmVwbGFjZWQgZHVyaW5nIGZpbGUgdHJhbnNmb3JtYXRpb24uIE1ha2Ugc3VyZSB0byByZWZlcmVuY2UgaXQgYnkgdGhlIGZ1bGwgbmFtZS5cIik7XG5cdFx0fVxuXHR9O1xufVxuLyoqXG4qIENyZWF0ZSBpbXBvcnQubWV0YSBvYmplY3QgZm9yIE5vZGUuanMuXG4qL1xuZnVuY3Rpb24gY3JlYXRlTm9kZUltcG9ydE1ldGEobW9kdWxlUGF0aCkge1xuXHRsZXQgZGVmYXVsdE1ldGEgPSBjcmVhdGVEZWZhdWx0SW1wb3J0TWV0YShtb2R1bGVQYXRoKSwgaHJlZiA9IGRlZmF1bHRNZXRhLnVybCwgaW1wb3J0TWV0YVJlc29sdmVyID0gY3JlYXRlSW1wb3J0TWV0YVJlc29sdmVyKCk7XG5cdHJldHVybiB7XG5cdFx0Li4uZGVmYXVsdE1ldGEsXG5cdFx0bWFpbjogITEsXG5cdFx0cmVzb2x2ZShpZCwgcGFyZW50KSB7XG5cdFx0XHRyZXR1cm4gKGltcG9ydE1ldGFSZXNvbHZlciA/PyBkZWZhdWx0TWV0YS5yZXNvbHZlKShpZCwgcGFyZW50ID8/IGhyZWYpO1xuXHRcdH1cblx0fTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL3J1bm5lci50c1xudmFyIE1vZHVsZVJ1bm5lciA9IGNsYXNzIHtcblx0ZXZhbHVhdGVkTW9kdWxlcztcblx0aG1yQ2xpZW50O1xuXHR0cmFuc3BvcnQ7XG5cdHJlc2V0U291cmNlTWFwU3VwcG9ydDtcblx0Y29uY3VycmVudE1vZHVsZU5vZGVQcm9taXNlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdGlzQnVpbHRpbjtcblx0YnVpbHRpbnNQcm9taXNlO1xuXHRjbG9zZWQgPSAhMTtcblx0Y29uc3RydWN0b3Iob3B0aW9ucywgZXZhbHVhdG9yID0gbmV3IEVTTW9kdWxlc0V2YWx1YXRvcigpLCBkZWJ1Zykge1xuXHRcdGlmICh0aGlzLm9wdGlvbnMgPSBvcHRpb25zLCB0aGlzLmV2YWx1YXRvciA9IGV2YWx1YXRvciwgdGhpcy5kZWJ1ZyA9IGRlYnVnLCB0aGlzLmV2YWx1YXRlZE1vZHVsZXMgPSBvcHRpb25zLmV2YWx1YXRlZE1vZHVsZXMgPz8gbmV3IEV2YWx1YXRlZE1vZHVsZXMoKSwgdGhpcy50cmFuc3BvcnQgPSBub3JtYWxpemVNb2R1bGVSdW5uZXJUcmFuc3BvcnQob3B0aW9ucy50cmFuc3BvcnQpLCBvcHRpb25zLmhtciAhPT0gITEpIHtcblx0XHRcdGxldCBvcHRpb25zSG1yID0gb3B0aW9ucy5obXIgPz8gITA7XG5cdFx0XHRpZiAodGhpcy5obXJDbGllbnQgPSBuZXcgSE1SQ2xpZW50KG9wdGlvbnNIbXIgPT09ICEwIHx8IG9wdGlvbnNIbXIubG9nZ2VyID09PSB2b2lkIDAgPyBobXJMb2dnZXIgOiBvcHRpb25zSG1yLmxvZ2dlciA9PT0gITEgPyBzaWxlbnRDb25zb2xlIDogb3B0aW9uc0htci5sb2dnZXIsIHRoaXMudHJhbnNwb3J0LCAoeyBhY2NlcHRlZFBhdGggfSkgPT4gdGhpcy5pbXBvcnQoYWNjZXB0ZWRQYXRoKSksICF0aGlzLnRyYW5zcG9ydC5jb25uZWN0KSB0aHJvdyBFcnJvcihcIkhNUiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcnVubmVyIHRyYW5zcG9ydCwgYnV0IGBobXJgIG9wdGlvbiB3YXMgc2V0IHRvIHRydWVcIik7XG5cdFx0XHR0aGlzLnRyYW5zcG9ydC5jb25uZWN0KGNyZWF0ZUhNUkhhbmRsZXJGb3JSdW5uZXIodGhpcykpO1xuXHRcdH0gZWxzZSB0aGlzLnRyYW5zcG9ydC5jb25uZWN0Py4oKTtcblx0XHRvcHRpb25zLnNvdXJjZW1hcEludGVyY2VwdG9yICE9PSAhMSAmJiAodGhpcy5yZXNldFNvdXJjZU1hcFN1cHBvcnQgPSBlbmFibGVTb3VyY2VNYXBTdXBwb3J0KHRoaXMpKTtcblx0fVxuXHQvKipcblx0KiBVUkwgdG8gZXhlY3V0ZS4gQWNjZXB0cyBmaWxlIHBhdGgsIHNlcnZlciBwYXRoIG9yIGlkIHJlbGF0aXZlIHRvIHRoZSByb290LlxuXHQqL1xuXHRhc3luYyBpbXBvcnQodXJsKSB7XG5cdFx0bGV0IGZldGNoZWRNb2R1bGUgPSBhd2FpdCB0aGlzLmNhY2hlZE1vZHVsZSh1cmwpO1xuXHRcdHJldHVybiBhd2FpdCB0aGlzLmNhY2hlZFJlcXVlc3QodXJsLCBmZXRjaGVkTW9kdWxlKTtcblx0fVxuXHQvKipcblx0KiBDbGVhciBhbGwgY2FjaGVzIGluY2x1ZGluZyBITVIgbGlzdGVuZXJzLlxuXHQqL1xuXHRjbGVhckNhY2hlKCkge1xuXHRcdHRoaXMuZXZhbHVhdGVkTW9kdWxlcy5jbGVhcigpLCB0aGlzLmhtckNsaWVudD8uY2xlYXIoKTtcblx0fVxuXHQvKipcblx0KiBDbGVhcnMgYWxsIGNhY2hlcywgcmVtb3ZlcyBhbGwgSE1SIGxpc3RlbmVycywgYW5kIHJlc2V0cyBzb3VyY2UgbWFwIHN1cHBvcnQuXG5cdCogVGhpcyBtZXRob2QgZG9lc24ndCBzdG9wIHRoZSBITVIgY29ubmVjdGlvbi5cblx0Ki9cblx0YXN5bmMgY2xvc2UoKSB7XG5cdFx0dGhpcy5yZXNldFNvdXJjZU1hcFN1cHBvcnQ/LigpLCB0aGlzLmNsZWFyQ2FjaGUoKSwgdGhpcy5obXJDbGllbnQgPSB2b2lkIDAsIHRoaXMuY2xvc2VkID0gITAsIGF3YWl0IHRoaXMudHJhbnNwb3J0LmRpc2Nvbm5lY3Q/LigpO1xuXHR9XG5cdC8qKlxuXHQqIFJldHVybnMgYHRydWVgIGlmIHRoZSBydW50aW1lIGhhcyBiZWVuIGNsb3NlZCBieSBjYWxsaW5nIGBjbG9zZSgpYCBtZXRob2QuXG5cdCovXG5cdGlzQ2xvc2VkKCkge1xuXHRcdHJldHVybiB0aGlzLmNsb3NlZDtcblx0fVxuXHRwcm9jZXNzSW1wb3J0KGV4cG9ydHMsIGZldGNoUmVzdWx0LCBtZXRhZGF0YSkge1xuXHRcdGlmICghKFwiZXh0ZXJuYWxpemVcIiBpbiBmZXRjaFJlc3VsdCkpIHJldHVybiBleHBvcnRzO1xuXHRcdGxldCB7IHVybCwgdHlwZSB9ID0gZmV0Y2hSZXN1bHQ7XG5cdFx0cmV0dXJuIHR5cGUgIT09IFwibW9kdWxlXCIgJiYgdHlwZSAhPT0gXCJjb21tb25qc1wiIHx8IGFuYWx5emVJbXBvcnRlZE1vZERpZmZlcmVuY2UoZXhwb3J0cywgdXJsLCB0eXBlLCBtZXRhZGF0YSksIGV4cG9ydHM7XG5cdH1cblx0aXNDaXJjdWxhck1vZHVsZShtb2QpIHtcblx0XHRmb3IgKGxldCBpbXBvcnRlZEZpbGUgb2YgbW9kLmltcG9ydHMpIGlmIChtb2QuaW1wb3J0ZXJzLmhhcyhpbXBvcnRlZEZpbGUpKSByZXR1cm4gITA7XG5cdFx0cmV0dXJuICExO1xuXHR9XG5cdGlzQ2lyY3VsYXJJbXBvcnQoaW1wb3J0ZXJzLCBtb2R1bGVVcmwsIHZpc2l0ZWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKSB7XG5cdFx0Zm9yIChsZXQgaW1wb3J0ZXIgb2YgaW1wb3J0ZXJzKSB7XG5cdFx0XHRpZiAodmlzaXRlZC5oYXMoaW1wb3J0ZXIpKSBjb250aW51ZTtcblx0XHRcdGlmICh2aXNpdGVkLmFkZChpbXBvcnRlciksIGltcG9ydGVyID09PSBtb2R1bGVVcmwpIHJldHVybiAhMDtcblx0XHRcdGxldCBtb2QgPSB0aGlzLmV2YWx1YXRlZE1vZHVsZXMuZ2V0TW9kdWxlQnlJZChpbXBvcnRlcik7XG5cdFx0XHRpZiAobW9kICYmIG1vZC5pbXBvcnRlcnMuc2l6ZSAmJiB0aGlzLmlzQ2lyY3VsYXJJbXBvcnQobW9kLmltcG9ydGVycywgbW9kdWxlVXJsLCB2aXNpdGVkKSkgcmV0dXJuICEwO1xuXHRcdH1cblx0XHRyZXR1cm4gITE7XG5cdH1cblx0YXN5bmMgY2FjaGVkUmVxdWVzdCh1cmwsIG1vZCwgY2FsbHN0YWNrID0gW10sIG1ldGFkYXRhKSB7XG5cdFx0bGV0IG1ldGEgPSBtb2QubWV0YSwgbW9kdWxlSWQgPSBtZXRhLmlkLCB7IGltcG9ydGVycyB9ID0gbW9kLCBpbXBvcnRlZSA9IGNhbGxzdGFja1tjYWxsc3RhY2subGVuZ3RoIC0gMV07XG5cdFx0aWYgKGltcG9ydGVlICYmIGltcG9ydGVycy5hZGQoaW1wb3J0ZWUpLCBtb2QuZXZhbHVhdGVkICYmIG1vZC5wcm9taXNlKSByZXR1cm4gdGhpcy5wcm9jZXNzSW1wb3J0KGF3YWl0IG1vZC5wcm9taXNlLCBtZXRhLCBtZXRhZGF0YSk7XG5cdFx0aWYgKChjYWxsc3RhY2suaW5jbHVkZXMobW9kdWxlSWQpIHx8IHRoaXMuaXNDaXJjdWxhck1vZHVsZShtb2QpIHx8IHRoaXMuaXNDaXJjdWxhckltcG9ydChpbXBvcnRlcnMsIG1vZHVsZUlkKSkgJiYgbW9kLmV4cG9ydHMpIHJldHVybiB0aGlzLnByb2Nlc3NJbXBvcnQobW9kLmV4cG9ydHMsIG1ldGEsIG1ldGFkYXRhKTtcblx0XHRsZXQgZGVidWdUaW1lcjtcblx0XHR0aGlzLmRlYnVnICYmIChkZWJ1Z1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR0aGlzLmRlYnVnKGBbbW9kdWxlIHJ1bm5lcl0gbW9kdWxlICR7bW9kdWxlSWR9IHRha2VzIG92ZXIgMnMgdG8gbG9hZC5cXG4ke2BzdGFjazpcXG4ke1suLi5jYWxsc3RhY2ssIG1vZHVsZUlkXS5yZXZlcnNlKCkubWFwKChwKSA9PiBgICAtICR7cH1gKS5qb2luKFwiXFxuXCIpfWB9YCk7XG5cdFx0fSwgMmUzKSk7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChtb2QucHJvbWlzZSkgcmV0dXJuIHRoaXMucHJvY2Vzc0ltcG9ydChhd2FpdCBtb2QucHJvbWlzZSwgbWV0YSwgbWV0YWRhdGEpO1xuXHRcdFx0bGV0IHByb21pc2UgPSB0aGlzLmRpcmVjdFJlcXVlc3QodXJsLCBtb2QsIGNhbGxzdGFjayk7XG5cdFx0XHRyZXR1cm4gbW9kLnByb21pc2UgPSBwcm9taXNlLCBtb2QuZXZhbHVhdGVkID0gITEsIHRoaXMucHJvY2Vzc0ltcG9ydChhd2FpdCBwcm9taXNlLCBtZXRhLCBtZXRhZGF0YSk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdG1vZC5ldmFsdWF0ZWQgPSAhMCwgZGVidWdUaW1lciAmJiBjbGVhclRpbWVvdXQoZGVidWdUaW1lcik7XG5cdFx0fVxuXHR9XG5cdGFzeW5jIGNhY2hlZE1vZHVsZSh1cmwsIGltcG9ydGVyKSB7XG5cdFx0bGV0IGNhY2hlZCA9IHRoaXMuY29uY3VycmVudE1vZHVsZU5vZGVQcm9taXNlcy5nZXQodXJsKTtcblx0XHRpZiAoY2FjaGVkKSB0aGlzLmRlYnVnPy4oXCJbbW9kdWxlIHJ1bm5lcl0gdXNpbmcgY2FjaGVkIG1vZHVsZSBpbmZvIGZvclwiLCB1cmwpO1xuXHRcdGVsc2Uge1xuXHRcdFx0bGV0IGNhY2hlZE1vZHVsZSA9IHRoaXMuZXZhbHVhdGVkTW9kdWxlcy5nZXRNb2R1bGVCeVVybCh1cmwpO1xuXHRcdFx0Y2FjaGVkID0gdGhpcy5nZXRNb2R1bGVJbmZvcm1hdGlvbih1cmwsIGltcG9ydGVyLCBjYWNoZWRNb2R1bGUpLmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmNvbmN1cnJlbnRNb2R1bGVOb2RlUHJvbWlzZXMuZGVsZXRlKHVybCk7XG5cdFx0XHR9KSwgdGhpcy5jb25jdXJyZW50TW9kdWxlTm9kZVByb21pc2VzLnNldCh1cmwsIGNhY2hlZCk7XG5cdFx0fVxuXHRcdHJldHVybiBjYWNoZWQ7XG5cdH1cblx0ZW5zdXJlQnVpbHRpbnMoKSB7XG5cdFx0aWYgKCF0aGlzLmlzQnVpbHRpbikgcmV0dXJuIHRoaXMuYnVpbHRpbnNQcm9taXNlID8/PSAoYXN5bmMgKCkgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5kZWJ1Zz8uKFwiW21vZHVsZSBydW5uZXJdIGZldGNoaW5nIGJ1aWx0aW5zIGZyb20gc2VydmVyXCIpO1xuXHRcdFx0XHRsZXQgYnVpbHRpbnMgPSAoYXdhaXQgdGhpcy50cmFuc3BvcnQuaW52b2tlKFwiZ2V0QnVpbHRpbnNcIiwgW10pKS5tYXAoKGJ1aWx0aW4pID0+IHR5cGVvZiBidWlsdGluID09IFwib2JqZWN0XCIgJiYgYnVpbHRpbiAmJiBcInR5cGVcIiBpbiBidWlsdGluID8gYnVpbHRpbi50eXBlID09PSBcInN0cmluZ1wiID8gYnVpbHRpbi52YWx1ZSA6IG5ldyBSZWdFeHAoYnVpbHRpbi5zb3VyY2UsIGJ1aWx0aW4uZmxhZ3MpIDogYnVpbHRpbik7XG5cdFx0XHRcdHRoaXMuaXNCdWlsdGluID0gY3JlYXRlSXNCdWlsdGluKGJ1aWx0aW5zKSwgdGhpcy5kZWJ1Zz8uKFwiW21vZHVsZSBydW5uZXJdIGJ1aWx0aW5zIGxvYWRlZDpcIiwgYnVpbHRpbnMpO1xuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0dGhpcy5idWlsdGluc1Byb21pc2UgPSB2b2lkIDA7XG5cdFx0XHR9XG5cdFx0fSkoKSwgdGhpcy5idWlsdGluc1Byb21pc2U7XG5cdH1cblx0YXN5bmMgZ2V0TW9kdWxlSW5mb3JtYXRpb24odXJsLCBpbXBvcnRlciwgY2FjaGVkTW9kdWxlKSB7XG5cdFx0aWYgKHRoaXMuY2xvc2VkKSB0aHJvdyBFcnJvcihcIlZpdGUgbW9kdWxlIHJ1bm5lciBoYXMgYmVlbiBjbG9zZWQuXCIpO1xuXHRcdGF3YWl0IHRoaXMuZW5zdXJlQnVpbHRpbnMoKSwgdGhpcy5kZWJ1Zz8uKFwiW21vZHVsZSBydW5uZXJdIGZldGNoaW5nXCIsIHVybCk7XG5cdFx0bGV0IGlzQ2FjaGVkID0gISEodHlwZW9mIGNhY2hlZE1vZHVsZSA9PSBcIm9iamVjdFwiICYmIGNhY2hlZE1vZHVsZS5tZXRhKSwgZmV0Y2hlZE1vZHVsZSA9IHVybC5zdGFydHNXaXRoKFwiZGF0YTpcIikgfHwgdGhpcy5pc0J1aWx0aW4/Lih1cmwpID8ge1xuXHRcdFx0ZXh0ZXJuYWxpemU6IHVybCxcblx0XHRcdHR5cGU6IFwiYnVpbHRpblwiXG5cdFx0fSA6IGF3YWl0IHRoaXMudHJhbnNwb3J0Lmludm9rZShcImZldGNoTW9kdWxlXCIsIFtcblx0XHRcdHVybCxcblx0XHRcdGltcG9ydGVyLFxuXHRcdFx0e1xuXHRcdFx0XHRjYWNoZWQ6IGlzQ2FjaGVkLFxuXHRcdFx0XHRzdGFydE9mZnNldDogdGhpcy5ldmFsdWF0b3Iuc3RhcnRPZmZzZXRcblx0XHRcdH1cblx0XHRdKTtcblx0XHRpZiAoXCJjYWNoZVwiIGluIGZldGNoZWRNb2R1bGUpIHtcblx0XHRcdGlmICghY2FjaGVkTW9kdWxlIHx8ICFjYWNoZWRNb2R1bGUubWV0YSkgdGhyb3cgRXJyb3IoYE1vZHVsZSBcIiR7dXJsfVwiIHdhcyBtaXN0YWtlbmx5IGludmFsaWRhdGVkIGR1cmluZyBmZXRjaCBwaGFzZS5gKTtcblx0XHRcdHJldHVybiBjYWNoZWRNb2R1bGU7XG5cdFx0fVxuXHRcdGxldCBtb2R1bGVJZCA9IFwiZXh0ZXJuYWxpemVcIiBpbiBmZXRjaGVkTW9kdWxlID8gZmV0Y2hlZE1vZHVsZS5leHRlcm5hbGl6ZSA6IGZldGNoZWRNb2R1bGUuaWQsIG1vZHVsZVVybCA9IFwidXJsXCIgaW4gZmV0Y2hlZE1vZHVsZSA/IGZldGNoZWRNb2R1bGUudXJsIDogdXJsLCBtb2R1bGUgPSB0aGlzLmV2YWx1YXRlZE1vZHVsZXMuZW5zdXJlTW9kdWxlKG1vZHVsZUlkLCBtb2R1bGVVcmwpO1xuXHRcdHJldHVybiBcImludmFsaWRhdGVcIiBpbiBmZXRjaGVkTW9kdWxlICYmIGZldGNoZWRNb2R1bGUuaW52YWxpZGF0ZSAmJiB0aGlzLmV2YWx1YXRlZE1vZHVsZXMuaW52YWxpZGF0ZU1vZHVsZShtb2R1bGUpLCBmZXRjaGVkTW9kdWxlLnVybCA9IG1vZHVsZVVybCwgZmV0Y2hlZE1vZHVsZS5pZCA9IG1vZHVsZUlkLCBtb2R1bGUubWV0YSA9IGZldGNoZWRNb2R1bGUsIG1vZHVsZTtcblx0fVxuXHRhc3luYyBkaXJlY3RSZXF1ZXN0KHVybCwgbW9kLCBfY2FsbHN0YWNrKSB7XG5cdFx0bGV0IGZldGNoUmVzdWx0ID0gbW9kLm1ldGEsIG1vZHVsZUlkID0gZmV0Y2hSZXN1bHQuaWQsIGNhbGxzdGFjayA9IFsuLi5fY2FsbHN0YWNrLCBtb2R1bGVJZF0sIHJlcXVlc3QgPSBhc3luYyAoZGVwLCBtZXRhZGF0YSkgPT4ge1xuXHRcdFx0bGV0IGltcG9ydGVyID0gXCJmaWxlXCIgaW4gZmV0Y2hSZXN1bHQgJiYgZmV0Y2hSZXN1bHQuZmlsZSB8fCBtb2R1bGVJZCwgZGVwTW9kID0gYXdhaXQgdGhpcy5jYWNoZWRNb2R1bGUoZGVwLCBpbXBvcnRlcik7XG5cdFx0XHRyZXR1cm4gZGVwTW9kLmltcG9ydGVycy5hZGQobW9kdWxlSWQpLCBtb2QuaW1wb3J0cy5hZGQoZGVwTW9kLmlkKSwgdGhpcy5jYWNoZWRSZXF1ZXN0KGRlcCwgZGVwTW9kLCBjYWxsc3RhY2ssIG1ldGFkYXRhKTtcblx0XHR9LCBkeW5hbWljUmVxdWVzdCA9IGFzeW5jIChkZXApID0+IChkZXAgPSBTdHJpbmcoZGVwKSwgZGVwWzBdID09PSBcIi5cIiAmJiAoZGVwID0gcG9zaXhSZXNvbHZlKHBvc2l4RGlybmFtZSh1cmwpLCBkZXApKSwgcmVxdWVzdChkZXAsIHsgaXNEeW5hbWljSW1wb3J0OiAhMCB9KSk7XG5cdFx0aWYgKFwiZXh0ZXJuYWxpemVcIiBpbiBmZXRjaFJlc3VsdCkge1xuXHRcdFx0bGV0IHsgZXh0ZXJuYWxpemUgfSA9IGZldGNoUmVzdWx0O1xuXHRcdFx0dGhpcy5kZWJ1Zz8uKFwiW21vZHVsZSBydW5uZXJdIGV4dGVybmFsaXppbmdcIiwgZXh0ZXJuYWxpemUpO1xuXHRcdFx0bGV0IGV4cG9ydHMgPSBhd2FpdCB0aGlzLmV2YWx1YXRvci5ydW5FeHRlcm5hbE1vZHVsZShleHRlcm5hbGl6ZSk7XG5cdFx0XHRyZXR1cm4gbW9kLmV4cG9ydHMgPSBleHBvcnRzLCBleHBvcnRzO1xuXHRcdH1cblx0XHRsZXQgeyBjb2RlLCBmaWxlIH0gPSBmZXRjaFJlc3VsdDtcblx0XHRpZiAoY29kZSA9PSBudWxsKSB7XG5cdFx0XHRsZXQgaW1wb3J0ZXIgPSBjYWxsc3RhY2tbY2FsbHN0YWNrLmxlbmd0aCAtIDJdO1xuXHRcdFx0dGhyb3cgRXJyb3IoYFttb2R1bGUgcnVubmVyXSBGYWlsZWQgdG8gbG9hZCBcIiR7dXJsfVwiJHtpbXBvcnRlciA/IGAgaW1wb3J0ZWQgZnJvbSAke2ltcG9ydGVyfWAgOiBcIlwifWApO1xuXHRcdH1cblx0XHRsZXQgY3JlYXRlSW1wb3J0TWV0YSA9IHRoaXMub3B0aW9ucy5jcmVhdGVJbXBvcnRNZXRhID8/IGNyZWF0ZURlZmF1bHRJbXBvcnRNZXRhLCBtb2R1bGVQYXRoID0gY2xlYW5VcmwoZmlsZSB8fCBtb2R1bGVJZCksIGhyZWYgPSBwb3NpeFBhdGhUb0ZpbGVIcmVmKG1vZHVsZVBhdGgpLCBtZXRhID0gYXdhaXQgY3JlYXRlSW1wb3J0TWV0YShtb2R1bGVQYXRoKSwgZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywge1xuXHRcdFx0dmFsdWU6IFwiTW9kdWxlXCIsXG5cdFx0XHRlbnVtZXJhYmxlOiAhMSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogITFcblx0XHR9KSwgbW9kLmV4cG9ydHMgPSBleHBvcnRzO1xuXHRcdGxldCBob3RDb250ZXh0O1xuXHRcdHRoaXMuaG1yQ2xpZW50ICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXRhLCBcImhvdFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiAhMCxcblx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRpZiAoIXRoaXMuaG1yQ2xpZW50KSB0aHJvdyBFcnJvcihcIlttb2R1bGUgcnVubmVyXSBITVIgY2xpZW50IHdhcyBjbG9zZWQuXCIpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5kZWJ1Zz8uKFwiW21vZHVsZSBydW5uZXJdIGNyZWF0aW5nIGhtciBjb250ZXh0IGZvclwiLCBtb2QudXJsKSwgaG90Q29udGV4dCB8fD0gbmV3IEhNUkNvbnRleHQodGhpcy5obXJDbGllbnQsIG1vZC51cmwpLCBob3RDb250ZXh0O1xuXHRcdFx0fSxcblx0XHRcdHNldDogKHZhbHVlKSA9PiB7XG5cdFx0XHRcdGhvdENvbnRleHQgPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRsZXQgY29udGV4dCA9IHtcblx0XHRcdFtzc3JJbXBvcnRLZXldOiByZXF1ZXN0LFxuXHRcdFx0W3NzckR5bmFtaWNJbXBvcnRLZXldOiBkeW5hbWljUmVxdWVzdCxcblx0XHRcdFtzc3JNb2R1bGVFeHBvcnRzS2V5XTogZXhwb3J0cyxcblx0XHRcdFtzc3JFeHBvcnRBbGxLZXldOiAob2JqKSA9PiBleHBvcnRBbGwoZXhwb3J0cywgb2JqKSxcblx0XHRcdFtzc3JFeHBvcnROYW1lS2V5XTogKG5hbWUsIGdldHRlcikgPT4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcblx0XHRcdFx0ZW51bWVyYWJsZTogITAsXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogITAsXG5cdFx0XHRcdGdldDogZ2V0dGVyXG5cdFx0XHR9KSxcblx0XHRcdFtzc3JJbXBvcnRNZXRhS2V5XTogbWV0YVxuXHRcdH07XG5cdFx0cmV0dXJuIHRoaXMuZGVidWc/LihcIlttb2R1bGUgcnVubmVyXSBleGVjdXRpbmdcIiwgaHJlZiksIGF3YWl0IHRoaXMuZXZhbHVhdG9yLnJ1bklubGluZWRNb2R1bGUoY29udGV4dCwgY29kZSwgbW9kKSwgZXhwb3J0cztcblx0fVxufTtcbmZ1bmN0aW9uIGV4cG9ydEFsbChleHBvcnRzLCBzb3VyY2VNb2R1bGUpIHtcblx0aWYgKGV4cG9ydHMgIT09IHNvdXJjZU1vZHVsZSAmJiAhKGlzUHJpbWl0aXZlKHNvdXJjZU1vZHVsZSkgfHwgQXJyYXkuaXNBcnJheShzb3VyY2VNb2R1bGUpIHx8IHNvdXJjZU1vZHVsZSBpbnN0YW5jZW9mIFByb21pc2UpKSB7XG5cdFx0Zm9yIChsZXQga2V5IGluIHNvdXJjZU1vZHVsZSkgaWYgKGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiAmJiAhKGtleSBpbiBleHBvcnRzKSkgdHJ5IHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHtcblx0XHRcdFx0ZW51bWVyYWJsZTogITAsXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogITAsXG5cdFx0XHRcdGdldDogKCkgPT4gc291cmNlTW9kdWxlW2tleV1cblx0XHRcdH0pO1xuXHRcdH0gY2F0Y2gge31cblx0fVxufVxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBFU01vZHVsZXNFdmFsdWF0b3IsIEV2YWx1YXRlZE1vZHVsZXMsIE1vZHVsZVJ1bm5lciwgY3JlYXRlRGVmYXVsdEltcG9ydE1ldGEsIGNyZWF0ZU5vZGVJbXBvcnRNZXRhLCBjcmVhdGVXZWJTb2NrZXRNb2R1bGVSdW5uZXJUcmFuc3BvcnQsIG5vcm1hbGl6ZU1vZHVsZUlkLCBzc3JEeW5hbWljSW1wb3J0S2V5LCBzc3JFeHBvcnRBbGxLZXksIHNzckV4cG9ydE5hbWVLZXksIHNzckltcG9ydEtleSwgc3NySW1wb3J0TWV0YUtleSwgc3NyTW9kdWxlRXhwb3J0c0tleSB9O1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswXSwibWFwcGluZ3MiOiI7QUFBQSxJQUFJLG9CQUFvQjtBQUN4QixxQkFBcUI7QUFHckIsTUFBTSxZQUFZLE9BQU8sVUFBVSxPQUFPLFFBQVEsYUFB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
|