dialogLaunchers.tsx
dialogLaunchers.tsx
No strong subsystem tag
133
Lines
22948
Bytes
7
Exports
11
Imports
10
Keywords
What this is
This page documents one file from the repository and includes its full source so you can read it without leaving the docs site.
Beginner explanation
This file is one piece of the larger system. Its name, directory, imports, and exports show where it fits. Start by reading the exports and related files first.
How it is used
Start from the exports list and related files. Those are the easiest clues for where this file fits into the system.
Expert explanation
Architecturally, this file intersects with general runtime concerns. It contains 133 lines, 11 detected imports, and 7 detected exports.
Important relationships
Detected exports
launchSnapshotUpdateDialoglaunchInvalidSettingsDialoglaunchAssistantSessionChooserlaunchAssistantInstallWizardlaunchTeleportResumeWrapperlaunchTeleportRepoMismatchDialoglaunchResumeChooser
Keywords
donerootpromiseoncancelshowsetupdialogoriginalsiteresumeconversationcallbackassistant
Detected imports
react./assistant/sessionDiscovery.js./context/stats.js./ink.js./interactiveHelpers.js./keybindings/KeybindingProviderSetup.js./state/AppStateStore.js./tools/AgentTool/agentMemory.js./utils/conversationRecovery.js./utils/fpsTracker.js./utils/settings/validation.js
Source notes
This page embeds the full file contents. Small or leaf files are still indexed honestly instead of being over-explained.
Full source
/**
* Thin launchers for one-off dialog JSX sites in main.tsx.
* Each launcher dynamically imports its component and wires the `done` callback
* identically to the original inline call site. Zero behavior change.
*
* Part of the main.tsx React/JSX extraction effort. See sibling PRs
* perf/extract-interactive-helpers and perf/launch-repl.
*/
import React from 'react';
import type { AssistantSession } from './assistant/sessionDiscovery.js';
import type { StatsStore } from './context/stats.js';
import type { Root } from './ink.js';
import { renderAndRun, showSetupDialog } from './interactiveHelpers.js';
import { KeybindingSetup } from './keybindings/KeybindingProviderSetup.js';
import type { AppState } from './state/AppStateStore.js';
import type { AgentMemoryScope } from './tools/AgentTool/agentMemory.js';
import type { TeleportRemoteResponse } from './utils/conversationRecovery.js';
import type { FpsMetrics } from './utils/fpsTracker.js';
import type { ValidationError } from './utils/settings/validation.js';
// Type-only access to ResumeConversation's Props via the module type.
// No runtime cost - erased at compile time.
type ResumeConversationProps = React.ComponentProps<typeof import('./screens/ResumeConversation.js').ResumeConversation>;
/**
* Site ~3173: SnapshotUpdateDialog (agent memory snapshot update prompt).
* Original callback wiring: onComplete={done}, onCancel={() => done('keep')}.
*/
export async function launchSnapshotUpdateDialog(root: Root, props: {
agentType: string;
scope: AgentMemoryScope;
snapshotTimestamp: string;
}): Promise<'merge' | 'keep' | 'replace'> {
const {
SnapshotUpdateDialog
} = await import('./components/agents/SnapshotUpdateDialog.js');
return showSetupDialog<'merge' | 'keep' | 'replace'>(root, done => <SnapshotUpdateDialog agentType={props.agentType} scope={props.scope} snapshotTimestamp={props.snapshotTimestamp} onComplete={done} onCancel={() => done('keep')} />);
}
/**
* Site ~3250: InvalidSettingsDialog (settings validation errors).
* Original callback wiring: onContinue={done}, onExit passed through from caller.
*/
export async function launchInvalidSettingsDialog(root: Root, props: {
settingsErrors: ValidationError[];
onExit: () => void;
}): Promise<void> {
const {
InvalidSettingsDialog
} = await import('./components/InvalidSettingsDialog.js');
return showSetupDialog(root, done => <InvalidSettingsDialog settingsErrors={props.settingsErrors} onContinue={done} onExit={props.onExit} />);
}
/**
* Site ~4229: AssistantSessionChooser (pick a bridge session to attach to).
* Original callback wiring: onSelect={id => done(id)}, onCancel={() => done(null)}.
*/
export async function launchAssistantSessionChooser(root: Root, props: {
sessions: AssistantSession[];
}): Promise<string | null> {
const {
AssistantSessionChooser
} = await import('./assistant/AssistantSessionChooser.js');
return showSetupDialog<string | null>(root, done => <AssistantSessionChooser sessions={props.sessions} onSelect={id => done(id)} onCancel={() => done(null)} />);
}
/**
* `claude assistant` found zero sessions — show the same install wizard
* as `/assistant` when daemon.json is empty. Resolves to the installed dir on
* success, null on cancel. Rejects on install failure so the caller can
* distinguish errors from user cancellation.
*/
export async function launchAssistantInstallWizard(root: Root): Promise<string | null> {
const {
NewInstallWizard,
computeDefaultInstallDir
} = await import('./commands/assistant/assistant.js');
const defaultDir = await computeDefaultInstallDir();
let rejectWithError: (reason: Error) => void;
const errorPromise = new Promise<never>((_, reject) => {
rejectWithError = reject;
});
const resultPromise = showSetupDialog<string | null>(root, done => <NewInstallWizard defaultDir={defaultDir} onInstalled={dir => done(dir)} onCancel={() => done(null)} onError={message => rejectWithError(new Error(`Installation failed: ${message}`))} />);
return Promise.race([resultPromise, errorPromise]);
}
/**
* Site ~4549: TeleportResumeWrapper (interactive teleport session picker).
* Original callback wiring: onComplete={done}, onCancel={() => done(null)}, source="cliArg".
*/
export async function launchTeleportResumeWrapper(root: Root): Promise<TeleportRemoteResponse | null> {
const {
TeleportResumeWrapper
} = await import('./components/TeleportResumeWrapper.js');
return showSetupDialog<TeleportRemoteResponse | null>(root, done => <TeleportResumeWrapper onComplete={done} onCancel={() => done(null)} source="cliArg" />);
}
/**
* Site ~4597: TeleportRepoMismatchDialog (pick a local checkout of the target repo).
* Original callback wiring: onSelectPath={done}, onCancel={() => done(null)}.
*/
export async function launchTeleportRepoMismatchDialog(root: Root, props: {
targetRepo: string;
initialPaths: string[];
}): Promise<string | null> {
const {
TeleportRepoMismatchDialog
} = await import('./components/TeleportRepoMismatchDialog.js');
return showSetupDialog<string | null>(root, done => <TeleportRepoMismatchDialog targetRepo={props.targetRepo} initialPaths={props.initialPaths} onSelectPath={done} onCancel={() => done(null)} />);
}
/**
* Site ~4903: ResumeConversation mount (interactive session picker).
* Uses renderAndRun, NOT showSetupDialog. Wraps in <App><KeybindingSetup>.
* Preserves original Promise.all parallelism between getWorktreePaths and imports.
*/
export async function launchResumeChooser(root: Root, appProps: {
getFpsMetrics: () => FpsMetrics | undefined;
stats: StatsStore;
initialState: AppState;
}, worktreePathsPromise: Promise<string[]>, resumeProps: Omit<ResumeConversationProps, 'worktreePaths'>): Promise<void> {
const [worktreePaths, {
ResumeConversation
}, {
App
}] = await Promise.all([worktreePathsPromise, import('./screens/ResumeConversation.js'), import('./components/App.js')]);
await renderAndRun(root, <App getFpsMetrics={appProps.getFpsMetrics} stats={appProps.stats} initialState={appProps.initialState}>
<KeybindingSetup>
<ResumeConversation {...resumeProps} worktreePaths={worktreePaths} />
</KeybindingSetup>
</App>);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkFzc2lzdGFudFNlc3Npb24iLCJTdGF0c1N0b3JlIiwiUm9vdCIsInJlbmRlckFuZFJ1biIsInNob3dTZXR1cERpYWxvZyIsIktleWJpbmRpbmdTZXR1cCIsIkFwcFN0YXRlIiwiQWdlbnRNZW1vcnlTY29wZSIsIlRlbGVwb3J0UmVtb3RlUmVzcG9uc2UiLCJGcHNNZXRyaWNzIiwiVmFsaWRhdGlvbkVycm9yIiwiUmVzdW1lQ29udmVyc2F0aW9uUHJvcHMiLCJDb21wb25lbnRQcm9wcyIsIlJlc3VtZUNvbnZlcnNhdGlvbiIsImxhdW5jaFNuYXBzaG90VXBkYXRlRGlhbG9nIiwicm9vdCIsInByb3BzIiwiYWdlbnRUeXBlIiwic2NvcGUiLCJzbmFwc2hvdFRpbWVzdGFtcCIsIlByb21pc2UiLCJTbmFwc2hvdFVwZGF0ZURpYWxvZyIsImRvbmUiLCJsYXVuY2hJbnZhbGlkU2V0dGluZ3NEaWFsb2ciLCJzZXR0aW5nc0Vycm9ycyIsIm9uRXhpdCIsIkludmFsaWRTZXR0aW5nc0RpYWxvZyIsImxhdW5jaEFzc2lzdGFudFNlc3Npb25DaG9vc2VyIiwic2Vzc2lvbnMiLCJBc3Npc3RhbnRTZXNzaW9uQ2hvb3NlciIsImlkIiwibGF1bmNoQXNzaXN0YW50SW5zdGFsbFdpemFyZCIsIk5ld0luc3RhbGxXaXphcmQiLCJjb21wdXRlRGVmYXVsdEluc3RhbGxEaXIiLCJkZWZhdWx0RGlyIiwicmVqZWN0V2l0aEVycm9yIiwicmVhc29uIiwiRXJyb3IiLCJlcnJvclByb21pc2UiLCJfIiwicmVqZWN0IiwicmVzdWx0UHJvbWlzZSIsImRpciIsIm1lc3NhZ2UiLCJyYWNlIiwibGF1bmNoVGVsZXBvcnRSZXN1bWVXcmFwcGVyIiwiVGVsZXBvcnRSZXN1bWVXcmFwcGVyIiwibGF1bmNoVGVsZXBvcnRSZXBvTWlzbWF0Y2hEaWFsb2ciLCJ0YXJnZXRSZXBvIiwiaW5pdGlhbFBhdGhzIiwiVGVsZXBvcnRSZXBvTWlzbWF0Y2hEaWFsb2ciLCJsYXVuY2hSZXN1bWVDaG9vc2VyIiwiYXBwUHJvcHMiLCJnZXRGcHNNZXRyaWNzIiwic3RhdHMiLCJpbml0aWFsU3RhdGUiLCJ3b3JrdHJlZVBhdGhzUHJvbWlzZSIsInJlc3VtZVByb3BzIiwiT21pdCIsIndvcmt0cmVlUGF0aHMiLCJBcHAiLCJhbGwiXSwic291cmNlcyI6WyJkaWFsb2dMYXVuY2hlcnMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpbiBsYXVuY2hlcnMgZm9yIG9uZS1vZmYgZGlhbG9nIEpTWCBzaXRlcyBpbiBtYWluLnRzeC5cbiAqIEVhY2ggbGF1bmNoZXIgZHluYW1pY2FsbHkgaW1wb3J0cyBpdHMgY29tcG9uZW50IGFuZCB3aXJlcyB0aGUgYGRvbmVgIGNhbGxiYWNrXG4gKiBpZGVudGljYWxseSB0byB0aGUgb3JpZ2luYWwgaW5saW5lIGNhbGwgc2l0ZS4gWmVybyBiZWhhdmlvciBjaGFuZ2UuXG4gKlxuICogUGFydCBvZiB0aGUgbWFpbi50c3ggUmVhY3QvSlNYIGV4dHJhY3Rpb24gZWZmb3J0LiBTZWUgc2libGluZyBQUnNcbiAqIHBlcmYvZXh0cmFjdC1pbnRlcmFjdGl2ZS1oZWxwZXJzIGFuZCBwZXJmL2xhdW5jaC1yZXBsLlxuICovXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgdHlwZSB7IEFzc2lzdGFudFNlc3Npb24gfSBmcm9tICcuL2Fzc2lzdGFudC9zZXNzaW9uRGlzY292ZXJ5LmpzJ1xuaW1wb3J0IHR5cGUgeyBTdGF0c1N0b3JlIH0gZnJvbSAnLi9jb250ZXh0L3N0YXRzLmpzJ1xuaW1wb3J0IHR5cGUgeyBSb290IH0gZnJvbSAnLi9pbmsuanMnXG5pbXBvcnQgeyByZW5kZXJBbmRSdW4sIHNob3dTZXR1cERpYWxvZyB9IGZyb20gJy4vaW50ZXJhY3RpdmVIZWxwZXJzLmpzJ1xuaW1wb3J0IHsgS2V5YmluZGluZ1NldHVwIH0gZnJvbSAnLi9rZXliaW5kaW5ncy9LZXliaW5kaW5nUHJvdmlkZXJTZXR1cC5qcydcbmltcG9ydCB0eXBlIHsgQXBwU3RhdGUgfSBmcm9tICcuL3N0YXRlL0FwcFN0YXRlU3RvcmUuanMnXG5pbXBvcnQgdHlwZSB7IEFnZW50TWVtb3J5U2NvcGUgfSBmcm9tICcuL3Rvb2xzL0FnZW50VG9vbC9hZ2VudE1lbW9yeS5qcydcbmltcG9ydCB0eXBlIHsgVGVsZXBvcnRSZW1vdGVSZXNwb25zZSB9IGZyb20gJy4vdXRpbHMvY29udmVyc2F0aW9uUmVjb3ZlcnkuanMnXG5pbXBvcnQgdHlwZSB7IEZwc01ldHJpY3MgfSBmcm9tICcuL3V0aWxzL2Zwc1RyYWNrZXIuanMnXG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gJy4vdXRpbHMvc2V0dGluZ3MvdmFsaWRhdGlvbi5qcydcblxuLy8gVHlwZS1vbmx5IGFjY2VzcyB0byBSZXN1bWVDb252ZXJzYXRpb24ncyBQcm9wcyB2aWEgdGhlIG1vZHVsZSB0eXBlLlxuLy8gTm8gcnVudGltZSBjb3N0IC0gZXJhc2VkIGF0IGNvbXBpbGUgdGltZS5cbnR5cGUgUmVzdW1lQ29udmVyc2F0aW9uUHJvcHMgPSBSZWFjdC5Db21wb25lbnRQcm9wczxcbiAgdHlwZW9mIGltcG9ydCgnLi9zY3JlZW5zL1Jlc3VtZUNvbnZlcnNhdGlvbi5qcycpLlJlc3VtZUNvbnZlcnNhdGlvblxuPlxuXG4vKipcbiAqIFNpdGUgfjMxNzM6IFNuYXBzaG90VXBkYXRlRGlhbG9nIChhZ2VudCBtZW1vcnkgc25hcHNob3QgdXBkYXRlIHByb21wdCkuXG4gKiBPcmlnaW5hbCBjYWxsYmFjayB3aXJpbmc6IG9uQ29tcGxldGU9e2RvbmV9LCBvbkNhbmNlbD17KCkgPT4gZG9uZSgna2VlcCcpfS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxhdW5jaFNuYXBzaG90VXBkYXRlRGlhbG9nKFxuICByb290OiBSb290LFxuICBwcm9wczoge1xuICAgIGFnZW50VHlwZTogc3RyaW5nXG4gICAgc2NvcGU6IEFnZW50TWVtb3J5U2NvcGVcbiAgICBzbmFwc2hvdFRpbWVzdGFtcDogc3RyaW5nXG4gIH0sXG4pOiBQcm9taXNlPCdtZXJnZScgfCAna2VlcCcgfCAncmVwbGFjZSc+IHtcbiAgY29uc3QgeyBTbmFwc2hvdFVwZGF0ZURpYWxvZyB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICcuL2NvbXBvbmVudHMvYWdlbnRzL1NuYXBzaG90VXBkYXRlRGlhbG9nLmpzJ1xuICApXG4gIHJldHVybiBzaG93U2V0dXBEaWFsb2c8J21lcmdlJyB8ICdrZWVwJyB8ICdyZXBsYWNlJz4ocm9vdCwgZG9uZSA9PiAoXG4gICAgPFNuYXBzaG90VXBkYXRlRGlhbG9nXG4gICAgICBhZ2VudFR5cGU9e3Byb3BzLmFnZW50VHlwZX1cbiAgICAgIHNjb3BlPXtwcm9wcy5zY29wZX1cbiAgICAgIHNuYXBzaG90VGltZXN0YW1wPXtwcm9wcy5zbmFwc2hvdFRpbWVzdGFtcH1cbiAgICAgIG9uQ29tcGxldGU9e2RvbmV9XG4gICAgICBvbkNhbmNlbD17KCkgPT4gZG9uZSgna2VlcCcpfVxuICAgIC8+XG4gICkpXG59XG5cbi8qKlxuICogU2l0ZSB+MzI1MDogSW52YWxpZFNldHRpbmdzRGlhbG9nIChzZXR0aW5ncyB2YWxpZGF0aW9uIGVycm9ycykuXG4gKiBPcmlnaW5hbCBjYWxsYmFjayB3aXJpbmc6IG9uQ29udGludWU9e2RvbmV9LCBvbkV4aXQgcGFzc2VkIHRocm91Z2ggZnJvbSBjYWxsZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsYXVuY2hJbnZhbGlkU2V0dGluZ3NEaWFsb2coXG4gIHJvb3Q6IFJvb3QsXG4gIHByb3BzOiB7XG4gICAgc2V0dGluZ3NFcnJvcnM6IFZhbGlkYXRpb25FcnJvcltdXG4gICAgb25FeGl0OiAoKSA9PiB2b2lkXG4gIH0sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBJbnZhbGlkU2V0dGluZ3NEaWFsb2cgfSA9IGF3YWl0IGltcG9ydChcbiAgICAnLi9jb21wb25lbnRzL0ludmFsaWRTZXR0aW5nc0RpYWxvZy5qcydcbiAgKVxuICByZXR1cm4gc2hvd1NldHVwRGlhbG9nKHJvb3QsIGRvbmUgPT4gKFxuICAgIDxJbnZhbGlkU2V0dGluZ3NEaWFsb2dcbiAgICAgIHNldHRpbmdzRXJyb3JzPXtwcm9wcy5zZXR0aW5nc0Vycm9yc31cbiAgICAgIG9uQ29udGludWU9e2RvbmV9XG4gICAgICBvbkV4aXQ9e3Byb3BzLm9uRXhpdH1cbiAgICAvPlxuICApKVxufVxuXG4vKipcbiAqIFNpdGUgfjQyMjk6IEFzc2lzdGFudFNlc3Npb25DaG9vc2VyIChwaWNrIGEgYnJpZGdlIHNlc3Npb24gdG8gYXR0YWNoIHRvKS5cbiAqIE9yaWdpbmFsIGNhbGxiYWNrIHdpcmluZzogb25TZWxlY3Q9e2lkID0+IGRvbmUoaWQpfSwgb25DYW5jZWw9eygpID0+IGRvbmUobnVsbCl9LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGF1bmNoQXNzaXN0YW50U2Vzc2lvbkNob29zZXIoXG4gIHJvb3Q6IFJvb3QsXG4gIHByb3BzOiB7IHNlc3Npb25zOiBBc3Npc3RhbnRTZXNzaW9uW10gfSxcbik6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCB7IEFzc2lzdGFudFNlc3Npb25DaG9vc2VyIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgJy4vYXNzaXN0YW50L0Fzc2lzdGFudFNlc3Npb25DaG9vc2VyLmpzJ1xuICApXG4gIHJldHVybiBzaG93U2V0dXBEaWFsb2c8c3RyaW5nIHwgbnVsbD4ocm9vdCwgZG9uZSA9PiAoXG4gICAgPEFzc2lzdGFudFNlc3Npb25DaG9vc2VyXG4gICAgICBzZXNzaW9ucz17cHJvcHMuc2Vzc2lvbnN9XG4gICAgICBvblNlbGVjdD17aWQgPT4gZG9uZShpZCl9XG4gICAgICBvbkNhbmNlbD17KCkgPT4gZG9uZShudWxsKX1cbiAgICAvPlxuICApKVxufVxuXG4vKipcbiAqIGBjbGF1ZGUgYXNzaXN0YW50YCBmb3VuZCB6ZXJvIHNlc3Npb25zIOKAlCBzaG93IHRoZSBzYW1lIGluc3RhbGwgd2l6YXJkXG4gKiBhcyBgL2Fzc2lzdGFudGAgd2hlbiBkYWVtb24uanNvbiBpcyBlbXB0eS4gUmVzb2x2ZXMgdG8gdGhlIGluc3RhbGxlZCBkaXIgb25cbiAqIHN1Y2Nlc3MsIG51bGwgb24gY2FuY2VsLiBSZWplY3RzIG9uIGluc3RhbGwgZmFpbHVyZSBzbyB0aGUgY2FsbGVyIGNhblxuICogZGlzdGluZ3Vpc2ggZXJyb3JzIGZyb20gdXNlciBjYW5jZWxsYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsYXVuY2hBc3Npc3RhbnRJbnN0YWxsV2l6YXJkKFxuICByb290OiBSb290LFxuKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gIGNvbnN0IHsgTmV3SW5zdGFsbFdpemFyZCwgY29tcHV0ZURlZmF1bHRJbnN0YWxsRGlyIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgJy4vY29tbWFuZHMvYXNzaXN0YW50L2Fzc2lzdGFudC5qcydcbiAgKVxuICBjb25zdCBkZWZhdWx0RGlyID0gYXdhaXQgY29tcHV0ZURlZmF1bHRJbnN0YWxsRGlyKClcbiAgbGV0IHJlamVjdFdpdGhFcnJvcjogKHJlYXNvbjogRXJyb3IpID0+IHZvaWRcbiAgY29uc3QgZXJyb3JQcm9taXNlID0gbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+IHtcbiAgICByZWplY3RXaXRoRXJyb3IgPSByZWplY3RcbiAgfSlcbiAgY29uc3QgcmVzdWx0UHJvbWlzZSA9IHNob3dTZXR1cERpYWxvZzxzdHJpbmcgfCBudWxsPihyb290LCBkb25lID0+IChcbiAgICA8TmV3SW5zdGFsbFdpemFyZFxuICAgICAgZGVmYXVsdERpcj17ZGVmYXVsdERpcn1cbiAgICAgIG9uSW5zdGFsbGVkPXtkaXIgPT4gZG9uZShkaXIpfVxuICAgICAgb25DYW5jZWw9eygpID0+IGRvbmUobnVsbCl9XG4gICAgICBvbkVycm9yPXttZXNzYWdlID0+XG4gICAgICAgIHJlamVjdFdpdGhFcnJvcihuZXcgRXJyb3IoYEluc3RhbGxhdGlvbiBmYWlsZWQ6ICR7bWVzc2FnZX1gKSlcbiAgICAgIH1cbiAgICAvPlxuICApKVxuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtyZXN1bHRQcm9taXNlLCBlcnJvclByb21pc2VdKVxufVxuXG4vKipcbiAqIFNpdGUgfjQ1NDk6IFRlbGVwb3J0UmVzdW1lV3JhcHBlciAoaW50ZXJhY3RpdmUgdGVsZXBvcnQgc2Vzc2lvbiBwaWNrZXIpLlxuICogT3JpZ2luYWwgY2FsbGJhY2sgd2lyaW5nOiBvbkNvbXBsZXRlPXtkb25lfSwgb25DYW5jZWw9eygpID0+IGRvbmUobnVsbCl9LCBzb3VyY2U9XCJjbGlBcmdcIi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxhdW5jaFRlbGVwb3J0UmVzdW1lV3JhcHBlcihcbiAgcm9vdDogUm9vdCxcbik6IFByb21pc2U8VGVsZXBvcnRSZW1vdGVSZXNwb25zZSB8IG51bGw+IHtcbiAgY29uc3QgeyBUZWxlcG9ydFJlc3VtZVdyYXBwZXIgfSA9IGF3YWl0IGltcG9ydChcbiAgICAnLi9jb21wb25lbnRzL1RlbGVwb3J0UmVzdW1lV3JhcHBlci5qcydcbiAgKVxuICByZXR1cm4gc2hvd1NldHVwRGlhbG9nPFRlbGVwb3J0UmVtb3RlUmVzcG9uc2UgfCBudWxsPihyb290LCBkb25lID0+IChcbiAgICA8VGVsZXBvcnRSZXN1bWVXcmFwcGVyXG4gICAgICBvbkNvbXBsZXRlPXtkb25lfVxuICAgICAgb25DYW5jZWw9eygpID0+IGRvbmUobnVsbCl9XG4gICAgICBzb3VyY2U9XCJjbGlBcmdcIlxuICAgIC8+XG4gICkpXG59XG5cbi8qKlxuICogU2l0ZSB+NDU5NzogVGVsZXBvcnRSZXBvTWlzbWF0Y2hEaWFsb2cgKHBpY2sgYSBsb2NhbCBjaGVja291dCBvZiB0aGUgdGFyZ2V0IHJlcG8pLlxuICogT3JpZ2luYWwgY2FsbGJhY2sgd2lyaW5nOiBvblNlbGVjdFBhdGg9e2RvbmV9LCBvbkNhbmNlbD17KCkgPT4gZG9uZShudWxsKX0uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsYXVuY2hUZWxlcG9ydFJlcG9NaXNtYXRjaERpYWxvZyhcbiAgcm9vdDogUm9vdCxcbiAgcHJvcHM6IHtcbiAgICB0YXJnZXRSZXBvOiBzdHJpbmdcbiAgICBpbml0aWFsUGF0aHM6IHN0cmluZ1tdXG4gIH0sXG4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3QgeyBUZWxlcG9ydFJlcG9NaXNtYXRjaERpYWxvZyB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICcuL2NvbXBvbmVudHMvVGVsZXBvcnRSZXBvTWlzbWF0Y2hEaWFsb2cuanMnXG4gIClcbiAgcmV0dXJuIHNob3dTZXR1cERpYWxvZzxzdHJpbmcgfCBudWxsPihyb290LCBkb25lID0+IChcbiAgICA8VGVsZXBvcnRSZXBvTWlzbWF0Y2hEaWFsb2dcbiAgICAgIHRhcmdldFJlcG89e3Byb3BzLnRhcmdldFJlcG99XG4gICAgICBpbml0aWFsUGF0aHM9e3Byb3BzLmluaXRpYWxQYXRoc31cbiAgICAgIG9uU2VsZWN0UGF0aD17ZG9uZX1cbiAgICAgIG9uQ2FuY2VsPXsoKSA9PiBkb25lKG51bGwpfVxuICAgIC8+XG4gICkpXG59XG5cbi8qKlxuICogU2l0ZSB+NDkwMzogUmVzdW1lQ29udmVyc2F0aW9uIG1vdW50IChpbnRlcmFjdGl2ZSBzZXNzaW9uIHBpY2tlcikuXG4gKiBVc2VzIHJlbmRlckFuZFJ1biwgTk9UIHNob3dTZXR1cERpYWxvZy4gV3JhcHMgaW4gPEFwcD48S2V5YmluZGluZ1NldHVwPi5cbiAqIFByZXNlcnZlcyBvcmlnaW5hbCBQcm9taXNlLmFsbCBwYXJhbGxlbGlzbSBiZXR3ZWVuIGdldFdvcmt0cmVlUGF0aHMgYW5kIGltcG9ydHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsYXVuY2hSZXN1bWVDaG9vc2VyKFxuICByb290OiBSb290LFxuICBhcHBQcm9wczoge1xuICAgIGdldEZwc01ldHJpY3M6ICgpID0+IEZwc01ldHJpY3MgfCB1bmRlZmluZWRcbiAgICBzdGF0czogU3RhdHNTdG9yZVxuICAgIGluaXRpYWxTdGF0ZTogQXBwU3RhdGVcbiAgfSxcbiAgd29ya3RyZWVQYXRoc1Byb21pc2U6IFByb21pc2U8c3RyaW5nW10+LFxuICByZXN1bWVQcm9wczogT21pdDxSZXN1bWVDb252ZXJzYXRpb25Qcm9wcywgJ3dvcmt0cmVlUGF0aHMnPixcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbd29ya3RyZWVQYXRocywgeyBSZXN1bWVDb252ZXJzYXRpb24gfSwgeyBBcHAgfV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgd29ya3RyZWVQYXRoc1Byb21pc2UsXG4gICAgaW1wb3J0KCcuL3NjcmVlbnMvUmVzdW1lQ29udmVyc2F0aW9uLmpzJyksXG4gICAgaW1wb3J0KCcuL2NvbXBvbmVudHMvQXBwLmpzJyksXG4gIF0pXG4gIGF3YWl0IHJlbmRlckFuZFJ1bihcbiAgICByb290LFxuICAgIDxBcHBcbiAgICAgIGdldEZwc01ldHJpY3M9e2FwcFByb3BzLmdldEZwc01ldHJpY3N9XG4gICAgICBzdGF0cz17YXBwUHJvcHMuc3RhdHN9XG4gICAgICBpbml0aWFsU3RhdGU9e2FwcFByb3BzLmluaXRpYWxTdGF0ZX1cbiAgICA+XG4gICAgICA8S2V5YmluZGluZ1NldHVwPlxuICAgICAgICA8UmVzdW1lQ29udmVyc2F0aW9uIHsuLi5yZXN1bWVQcm9wc30gd29ya3RyZWVQYXRocz17d29ya3RyZWVQYXRoc30gLz5cbiAgICAgIDwvS2V5YmluZGluZ1NldHVwPlxuICAgIDwvQXBwPixcbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBT0EsS0FBSyxNQUFNLE9BQU87QUFDekIsY0FBY0MsZ0JBQWdCLFFBQVEsaUNBQWlDO0FBQ3ZFLGNBQWNDLFVBQVUsUUFBUSxvQkFBb0I7QUFDcEQsY0FBY0MsSUFBSSxRQUFRLFVBQVU7QUFDcEMsU0FBU0MsWUFBWSxFQUFFQyxlQUFlLFFBQVEseUJBQXlCO0FBQ3ZFLFNBQVNDLGVBQWUsUUFBUSwwQ0FBMEM7QUFDMUUsY0FB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