import { createHotContext as __vite__createHotContext } from "/@vite/client";import.meta.hot = __vite__createHotContext("/src/app/root.tsx");import.meta.env = {"BASE_URL": "/", "DEV": true, "MODE": "development", "PROD": false, "REACT_ROUTER_HONO_SERVER_ASSETS_DIR": "assets", "REACT_ROUTER_HONO_SERVER_BASENAME": "/", "REACT_ROUTER_HONO_SERVER_BUILD_DIRECTORY": "build", "REACT_ROUTER_HONO_SERVER_RUNTIME": "node", "SSR": false}; if (typeof window !== 'undefined') { const $public = {}; globalThis.process ??= {}; // Preserve any env vars set by other libraries const base = globalThis.process.env ?? {}; globalThis.process.env = new Proxy(Object.assign({}, $public, base), { get(t, p) { return p in t ? t[p] : undefined; }, has() { return true; } }); } import RefreshRuntime from "/@id/__x00__virtual:react-router/hmr-runtime";const inWebWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;let prevRefreshReg;let prevRefreshSig;if (import.meta.hot && !inWebWorker) { if (!window.__vite_plugin_react_preamble_installed__) { throw new Error( "React Router Vite plugin can't detect preamble. Something is wrong." ); } prevRefreshReg = window.$RefreshReg$; prevRefreshSig = window.$RefreshSig$; window.$RefreshReg$ = (type, id) => { RefreshRuntime.register(type, "/root/doctorapp/create-anything/apps/web/src/app/root.tsx" + " " + id) }; window.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform;}var _s = $RefreshSig$(), _s2 = $RefreshSig$(), _s3 = $RefreshSig$(), _s4 = $RefreshSig$(), _s5 = $RefreshSig$(), _s6 = $RefreshSig$(), _s7 = $RefreshSig$(), _s8 = $RefreshSig$(), _s9 = $RefreshSig$(), _s0 = $RefreshSig$(); import { UNSAFE_withErrorBoundaryProps as _UNSAFE_withErrorBoundaryProps, UNSAFE_withComponentProps as _UNSAFE_withComponentProps } from "/node_modules/.vite/deps/react-router.js?v=2cbdaaaa"; import "/@id/__x00__virtual:console-to-parent"; import CreatePolymorphicComponent from "/src/__create/PolymorphicComponent.tsx"; import { Links, Meta, Outlet, Scripts, ScrollRestoration, useAsyncError, useLocation, useRouteError } from "/node_modules/.vite/deps/react-router.js?v=2cbdaaaa"; import { useButton } from "/node_modules/.vite/deps/@react-aria_button.js?v=2cbdaaaa"; import __vite__cjsImport7_react from "/node_modules/.vite/deps/react.js?v=2cbdaaaa"; const useCallback = __vite__cjsImport7_react["useCallback"]; const useEffect = __vite__cjsImport7_react["useEffect"]; const useRef = __vite__cjsImport7_react["useRef"]; const useState = __vite__cjsImport7_react["useState"]; const Component = __vite__cjsImport7_react["Component"]; import "/src/app/global.css?t=1766303981710"; import { toPng } from "/node_modules/.vite/deps/html-to-image.js?v=2cbdaaaa"; import fetch from "/src/__create/fetch.ts"; import { SessionProvider } from "/node_modules/.vite/deps/@auth_create_react.js?v=2cbdaaaa"; import { useNavigate } from "/node_modules/.vite/deps/react-router.js?v=2cbdaaaa"; import { serializeError } from "/node_modules/.vite/deps/serialize-error.js?v=2cbdaaaa"; import { Toaster } from "/node_modules/.vite/deps/sonner.js?v=2cbdaaaa"; import { LoadFonts } from "/@id/virtual:load-fonts.jsx"; import { HotReloadIndicator } from "/src/__create/HotReload.tsx"; import { useSandboxStore } from "/src/__create/hmr-sandbox-store.ts"; import { useDevServerHeartbeat } from "/src/__create/useDevServerHeartbeat.ts"; import __vite__cjsImport19_react_jsxRuntime from "/node_modules/.vite/deps/react_jsx-runtime.js?v=2cbdaaaa"; const _jsx = __vite__cjsImport19_react_jsxRuntime["jsx"]; const _jsxs = __vite__cjsImport19_react_jsxRuntime["jsxs"]; const _Fragment = __vite__cjsImport19_react_jsxRuntime["Fragment"]; export const links = () => []; if (globalThis.window && globalThis.window !== void 0) { globalThis.window.fetch = fetch; } const LoadFontsSSR = import.meta.env.SSR ? LoadFonts : null; if (import.meta.hot) { import.meta.hot.on("update-font-links", urls => { for (const link of document.querySelectorAll("link[data-auto-font]")) { link.remove(); } for (const url of urls) { const link = document.createElement("link"); link.rel = "stylesheet"; link.href = url; link.dataset.autoFont = "true"; document.head.appendChild(link); } }); } function SharedErrorBoundary({ isOpen, children }) { return /* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: `fixed bottom-4 left-1/2 transform -translate-x-1/2 z-50 transition-all duration-500 ease-out ${isOpen ? "translate-y-0 opacity-100" : "translate-y-full opacity-0"}`, renderId: "render-33305a73", as: "div", children: /* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "bg-[#18191B] text-[#F2F2F2] rounded-lg p-4 max-w-md w-full mx-4 shadow-lg", renderId: "render-8a7f49e2", as: "div", children: /* @__PURE__ */_jsxs(CreatePolymorphicComponent, { className: "flex items-start gap-3", renderId: "render-a50768a1", as: "div", children: [/* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "flex-shrink-0", renderId: "render-b5e29222", as: "div", children: /* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "w-8 h-8 bg-[#F2F2F2] rounded-full flex items-center justify-center", renderId: "render-72c1f5df", as: "div", children: /* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "text-black text-[1.125rem] leading-none", renderId: "render-920cb7d3", as: "span", children: "!" }) }) }), /* @__PURE__ */_jsxs(CreatePolymorphicComponent, { className: "flex flex-col gap-2 flex-1", renderId: "render-cc6fdc05", as: "div", children: [/* @__PURE__ */_jsxs(CreatePolymorphicComponent, { className: "flex flex-col gap-1", renderId: "render-e53ee0ed", as: "div", children: [/* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "font-light text-[#F2F2F2] text-sm", renderId: "render-82f3128f", as: "p", children: "App Error Detected" }), /* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "text-[#959697] text-sm font-light", renderId: "render-641bb201", as: "p", children: "It looks like an error occurred while trying to use your app." })] }), children] })] }) }) }); } _c = SharedErrorBoundary; export const ErrorBoundary = _UNSAFE_withErrorBoundaryProps(_c2 = function ErrorBoundary({ error }) { return /* @__PURE__ */_jsx(SharedErrorBoundary, { isOpen: true }); }); _c3 = ErrorBoundary; class ErrorCatcher extends Component { constructor(props) { super(props); this.state = { error: null }; } static getDerivedStateFromError(error) { return { error }; } render() { if (this.state.error) { const text = `${this.state.error.message} ${this.props.diagnostics}`; return /* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "page flex items-center justify-center p-6", renderId: "render-6575cf5f", as: "div", children: /* @__PURE__ */_jsxs(CreatePolymorphicComponent, { className: "card w-full max-w-lg text-center", renderId: "render-3af08831", as: "div", children: [/* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "text-2xl font-semibold text-[#1a1915]", renderId: "render-6e98c795", as: "h1", children: "Something went wrong" }), /* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "mt-2 text-sm text-[#6c655b]", renderId: "render-1cdeda2a", as: "p", children: "The app hit an unexpected error. You can copy diagnostics below." }), /* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "mt-4 max-h-48 overflow-auto rounded-xl border border-[#e8e1d4] bg-white p-3 text-left text-xs text-[#6c655b]", renderId: "render-85657173", as: "pre", children: text }), /* @__PURE__ */_jsx(CreatePolymorphicComponent, { type: "button", onClick: () => { if (navigator?.clipboard?.writeText) { navigator.clipboard.writeText(text); } else { window.prompt("Copy diagnostics", text); } }, className: "btn btn-primary mt-4 w-full justify-center", renderId: "render-16ff1a40", as: "button", children: "Copy diagnostics" })] }) }); } return this.props.children; } } function DebugOverlay() { _s(); const location = useLocation(); const [enabled, setEnabled] = useState(false); const [lastError, setLastError] = useState(""); const [lastRejection, setLastRejection] = useState(""); const [health, setHealth] = useState("pending"); useEffect(() => { if (typeof window === "undefined") return; const params = new URLSearchParams(window.location.search); const shouldEnable = params.get("debug") === "1" || !import.meta.env.PROD; setEnabled(shouldEnable); }, []); useEffect(() => { if (!enabled) return; const onError = event => { setLastError(event.message || "Unknown error"); }; const onRejection = event => { const msg = event.reason?.message || event.reason?.toString?.() || "Unhandled rejection"; setLastRejection(msg); }; window.addEventListener("error", onError); window.addEventListener("unhandledrejection", onRejection); return () => { window.removeEventListener("error", onError); window.removeEventListener("unhandledrejection", onRejection); }; }, [enabled]); useEffect(() => { if (!enabled) return; const load = async () => { try { const res = await fetch("/api/health"); const json = await res.json(); setHealth(res.ok ? `ok: ${json?.time || ""}` : `error: ${res.status}`); } catch (error) { setHealth(`error: ${error instanceof Error ? error.message : "unknown"}`); } }; load(); }, [enabled]); if (!enabled) return null; const build = import.meta.env.VITE_APP_VERSION || import.meta.env.MODE || "unknown"; return /* @__PURE__ */_jsxs(CreatePolymorphicComponent, { className: "fixed bottom-4 right-4 z-50 w-[320px] rounded-2xl border border-[#e8e1d4] bg-white/95 p-4 text-xs text-[#1a1915] shadow-lg", renderId: "render-0ffe5259", as: "div", children: [/* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "text-xs font-semibold uppercase tracking-[0.2em] text-[#6c655b]", renderId: "render-32f8585a", as: "div", children: "Debug Overlay" }), /* @__PURE__ */_jsxs(CreatePolymorphicComponent, { className: "mt-2 space-y-1", renderId: "render-3daae3e5", as: "div", children: [/* @__PURE__ */_jsxs(CreatePolymorphicComponent, { renderId: "render-0ff8928d", as: "div", children: [/* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "text-[#6c655b]", renderId: "render-7c1320f6", as: "span", children: "Route:" }), " ", location.pathname, location.search] }), /* @__PURE__ */_jsxs(CreatePolymorphicComponent, { renderId: "render-fc5e7242", as: "div", children: [/* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "text-[#6c655b]", renderId: "render-21384640", as: "span", children: "Build:" }), " ", build] }), /* @__PURE__ */_jsxs(CreatePolymorphicComponent, { renderId: "render-7261b8ef", as: "div", children: [/* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "text-[#6c655b]", renderId: "render-3d66bc5c", as: "span", children: "API /health:" }), " ", health] }), /* @__PURE__ */_jsxs(CreatePolymorphicComponent, { renderId: "render-c52941d4", as: "div", children: [/* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "text-[#6c655b]", renderId: "render-e01ada20", as: "span", children: "window.onerror:" }), " ", lastError || "none"] }), /* @__PURE__ */_jsxs(CreatePolymorphicComponent, { renderId: "render-ddf579fd", as: "div", children: [/* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "text-[#6c655b]", renderId: "render-c1a6a796", as: "span", children: "unhandledrejection:" }), " ", lastRejection || "none"] })] })] }); } _s(DebugOverlay, "G4RG4FlQb17/nIVJ8/v2xKxYa6Q=", false, function () { return [useLocation]; }); _c4 = DebugOverlay; function InternalErrorBoundary({ error: errorArg }) { _s2(); const routeError = useRouteError(); const asyncError = useAsyncError(); const error = errorArg ?? asyncError ?? routeError; const [isOpen, setIsOpen] = useState(false); useEffect(() => { const animateTimer = setTimeout(() => setIsOpen(true), 100); return () => clearTimeout(animateTimer); }, []); const { buttonProps: showLogsButtonProps } = useButton({ onPress: useCallback(() => { window.parent.postMessage({ type: "sandbox:web:show-logs" }, "*"); }, []) }, useRef(null)); const { buttonProps: fixButtonProps } = useButton({ onPress: useCallback(() => { window.parent.postMessage({ type: "sandbox:web:fix", error: serializeError(error) }, "*"); setIsOpen(false); }, [error]), isDisabled: !error }, useRef(null)); const { buttonProps: copyButtonProps } = useButton({ onPress: useCallback(() => { const text = JSON.stringify(serializeError(error)); if (navigator?.clipboard?.writeText) { navigator.clipboard.writeText(text); } else { window.prompt("Copy error", text); } }, [error]) }, useRef(null)); function isInIframe() { try { return window.parent !== window; } catch { return true; } } return /* @__PURE__ */_jsx(SharedErrorBoundary, { isOpen, children: isInIframe() ? /* @__PURE__ */_jsxs(CreatePolymorphicComponent, { className: "flex gap-2", renderId: "render-0e8ec49d", as: "div", children: [!!error && /* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "flex flex-row items-center justify-center gap-[4px] outline-none transition-colors rounded-[8px] border-[1px] bg-[#f9f9f9] hover:bg-[#dbdbdb] active:bg-[#c4c4c4] border-[#c4c4c4] text-[#18191B] text-sm px-[8px] py-[4px] cursor-pointer", type: "button", ...fixButtonProps, renderId: "render-7b1157cc", as: "button", children: "Try to fix" }), /* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "flex flex-row items-center justify-center gap-[4px] outline-none transition-colors rounded-[8px] border-[1px] bg-[#2C2D2F] hover:bg-[#414243] active:bg-[#555658] border-[#414243] text-white text-sm px-[8px] py-[4px]", type: "button", ...showLogsButtonProps, renderId: "render-39e556a1", as: "button", children: "Show logs" })] }) : /* @__PURE__ */_jsx(CreatePolymorphicComponent, { className: "flex flex-row items-center justify-center gap-[4px] outline-none transition-colors rounded-[8px] border-[1px] bg-[#2C2D2F] hover:bg-[#414243] active:bg-[#555658] border-[#414243] text-white text-sm px-[8px] py-[4px] w-fit", type: "button", ...copyButtonProps, renderId: "render-5589417e", as: "button", children: "Copy error" }) }); } _s2(InternalErrorBoundary, "yezDJozrE4OBBrUvsKLo6EzK44U=", false, function () { return [useRouteError, useAsyncError, useButton, useButton, useButton]; }); _c5 = InternalErrorBoundary; class ErrorBoundaryWrapper extends Component { state = { hasError: false, error: null }; static getDerivedStateFromError(error) { return { hasError: true, error }; } componentDidCatch(error, info) { console.error(error, info); } render() { if (this.state.hasError) { return /* @__PURE__ */_jsx(InternalErrorBoundary, { error: this.state.error, params: {} }); } return this.props.children; } } function LoaderWrapper({ loader }) { return /* @__PURE__ */_jsx(_Fragment, { children: loader() }); } _c6 = LoaderWrapper; export const ClientOnly = ({ loader }) => { _s3(); const [isMounted, setIsMounted] = useState(false); useEffect(() => { setIsMounted(true); }, []); if (!isMounted) return null; return /* @__PURE__ */_jsx(ErrorBoundaryWrapper, { children: /* @__PURE__ */_jsx(LoaderWrapper, { loader }) }); }; _s3(ClientOnly, "h7njlszr1nxUzrk46zHyBTBrvgI="); _c7 = ClientOnly; export function useHmrConnection() { _s4(); const [connected, setConnected] = useState(() => !!import.meta.hot); useEffect(() => { if (!import.meta.hot) return; const onDisconnect = () => setConnected(false); const onConnect = () => setConnected(true); import.meta.hot.on("vite:ws:disconnect", onDisconnect); import.meta.hot.on("vite:ws:connect", onConnect); const onFullReload = () => setConnected(false); import.meta.hot.on("vite:beforeFullReload", onFullReload); return () => { import.meta.hot?.off("vite:ws:disconnect", onDisconnect); import.meta.hot?.off("vite:ws:connect", onConnect); import.meta.hot?.off("vite:beforeFullReload", onFullReload); }; }, []); return connected; } _s4(useHmrConnection, "butPJRtt3YfBaevz/pv7/miBg3s="); const healthyResponseType = "sandbox:web:healthcheck:response"; const useHandshakeParent = () => { _s5(); const isHmrConnected = useHmrConnection(); useEffect(() => { const healthyResponse = { type: healthyResponseType, healthy: isHmrConnected }; const handleMessage = event => { if (event.data.type === "sandbox:web:healthcheck") { window.parent.postMessage(healthyResponse, "*"); } }; window.addEventListener("message", handleMessage); window.parent.postMessage(healthyResponse, "*"); return () => { window.removeEventListener("message", handleMessage); }; }, [isHmrConnected]); }; _s5(useHandshakeParent, "arPQ+PIrC8lGzQpkvxu1LJie7lE=", false, function () { return [useHmrConnection]; }); const useCodeGen = () => { _s6(); const { startCodeGen, setCodeGenGenerating, completeCodeGen, errorCodeGen, stopCodeGen } = useSandboxStore(); useEffect(() => { const handleMessage = event => { const { type } = event.data; switch (type) { case "sandbox:web:codegen:started": startCodeGen(); break; case "sandbox:web:codegen:generating": setCodeGenGenerating(); break; case "sandbox:web:codegen:complete": completeCodeGen(); break; case "sandbox:web:codegen:error": errorCodeGen(); break; case "sandbox:web:codegen:stopped": stopCodeGen(); break; } }; window.addEventListener("message", handleMessage); return () => { window.removeEventListener("message", handleMessage); }; }, [startCodeGen, setCodeGenGenerating, completeCodeGen, errorCodeGen, stopCodeGen]); }; _s6(useCodeGen, "Yan7wFYouezS3Nypb3cc/P1Q8m8=", false, function () { return [useSandboxStore]; }); const useRefresh = () => { _s7(); useEffect(() => { const handleMessage = event => { if (event.data.type === "sandbox:web:refresh:request") { setTimeout(() => { window.location.reload(); }, 1e3); window.parent.postMessage({ type: "sandbox:web:refresh:complete" }, "*"); } }; window.addEventListener("message", handleMessage); return () => { window.removeEventListener("message", handleMessage); }; }, []); }; _s7(useRefresh, "OD7bBpZva5O2jO+Puf00hKivP7c="); const waitForScreenshotReady = async () => { const images = Array.from(document.images); await Promise.all([ // make sure custom fonts are loaded "fonts" in document ? document.fonts.ready : Promise.resolve(), ...images.map(img => new Promise(resolve => { img.crossOrigin = "anonymous"; if (img.complete) { resolve(true); return; } img.onload = () => resolve(true); img.onerror = () => resolve(true); }))]); await new Promise(resolve => setTimeout(resolve, 250)); }; export const useHandleScreenshotRequest = () => { _s8(); useEffect(() => { const handleMessage = async event => { if (event.data.type === "sandbox:web:screenshot:request") { try { await waitForScreenshotReady(); const width = window.innerWidth; const aspectRatio = 16 / 9; const height = Math.floor(width / aspectRatio); const dataUrl = await toPng(document.body, { cacheBust: true, skipFonts: false, width, height, style: { // force snapshot sizing width: `${width}px`, height: `${height}px`, margin: "0" } }); window.parent.postMessage({ type: "sandbox:web:screenshot:response", dataUrl }, "*"); } catch (error) { window.parent.postMessage({ type: "sandbox:web:screenshot:error", error: error instanceof Error ? error.message : String(error) }, "*"); } } }; window.addEventListener("message", handleMessage); return () => { window.removeEventListener("message", handleMessage); }; }, []); }; _s8(useHandleScreenshotRequest, "OD7bBpZva5O2jO+Puf00hKivP7c="); export function Layout({ children }) { _s9(); useHandshakeParent(); useCodeGen(); useRefresh(); useHandleScreenshotRequest(); useDevServerHeartbeat(); const navigate = useNavigate(); const location = useLocation(); const pathname = location?.pathname; useEffect(() => { const handleMessage = event => { if (event.data.type === "sandbox:navigation") { navigate(event.data.pathname); } }; window.addEventListener("message", handleMessage); window.parent.postMessage({ type: "sandbox:web:ready" }, "*"); return () => { window.removeEventListener("message", handleMessage); }; }, [navigate]); useEffect(() => { if (pathname) { window.parent.postMessage({ type: "sandbox:web:navigation", pathname }, "*"); } }, [pathname]); return /* @__PURE__ */_jsxs("html", { lang: "en", children: [/* @__PURE__ */_jsxs("head", { children: [/* @__PURE__ */_jsx("meta", { charSet: "utf-8" }), /* @__PURE__ */_jsx("meta", { name: "viewport", content: "width=device-width, initial-scale=1" }), /* @__PURE__ */_jsx(Meta, {}), /* @__PURE__ */_jsx(Links, {}), /* @__PURE__ */_jsx("script", { type: "module", src: "/src/__create/dev-error-overlay.js" }), /* @__PURE__ */_jsx("link", { rel: "icon", href: "/src/__create/favicon.png" }), LoadFontsSSR ? /* @__PURE__ */_jsx(LoadFontsSSR, {}) : null] }), /* @__PURE__ */_jsxs("body", { children: [/* @__PURE__ */_jsx(ClientOnly, { loader: () => children }), /* @__PURE__ */_jsx(HotReloadIndicator, {}), /* @__PURE__ */_jsx(Toaster, { position: "bottom-right" }), /* @__PURE__ */_jsx(ScrollRestoration, {}), /* @__PURE__ */_jsx(Scripts, {}), /* @__PURE__ */_jsx("script", { src: "https://kit.fontawesome.com/2c15cc0cc7.js", crossOrigin: "anonymous", async: true })] })] }); } _s9(Layout, "tn8stNE4DfUFnPdUQ1DBlZ2b3+Y=", false, function () { return [useHandshakeParent, useCodeGen, useRefresh, useHandleScreenshotRequest, useDevServerHeartbeat, useNavigate, useLocation]; }); _c8 = Layout; export default _c0 = _s0(_UNSAFE_withComponentProps(_c9 = _s0(function App() { _s0(); const location = useLocation(); useEffect(() => { if (typeof window === "undefined") return; const cap = window.Capacitor; if (!cap?.isNativePlatform?.()) return; document.body.classList.add("cap-native"); const appPlugin = cap.Plugins?.App; const backHandler = appPlugin?.addListener && appPlugin.addListener("backButton", () => { if (window.history.length > 1) { window.history.back(); return; } if (appPlugin?.exitApp) { appPlugin.exitApp(); } }); const pushError = entry => { try { const key = "debug:lastErrors"; const existing = JSON.parse(localStorage.getItem(key) || "[]"); existing.push({ entry, time: (/* @__PURE__ */new Date()).toISOString() }); localStorage.setItem(key, JSON.stringify(existing.slice(-20))); } catch {} }; const onError = event => { pushError(event.message || "Unknown error"); }; const onRejection = event => { const message = event.reason?.message || event.reason?.toString?.() || "Unhandled promise rejection"; pushError(message); }; window.addEventListener("error", onError); window.addEventListener("unhandledrejection", onRejection); return () => { window.removeEventListener("error", onError); window.removeEventListener("unhandledrejection", onRejection); if (backHandler?.remove) { backHandler.remove(); } }; }, []); return /* @__PURE__ */_jsx(SessionProvider, { children: /* @__PURE__ */_jsxs(ErrorCatcher, { diagnostics: `route=${location.pathname}${location.search}`, children: [/* @__PURE__ */_jsx(Outlet, {}), /* @__PURE__ */_jsx(DebugOverlay, {})] }) }); }, "BXcZrDMM76mmm4zA8/QV5UbMNXE=", false, function () { return [useLocation]; })), "BXcZrDMM76mmm4zA8/QV5UbMNXE=", false, function () { return [useLocation]; }); var _c, _c2, _c3, _c4, _c5, _c6, _c7, _c8, _c9, _c0; $RefreshReg$(_c, "SharedErrorBoundary"); $RefreshReg$(_c2, "ErrorBoundary$_UNSAFE_withErrorBoundaryProps"); $RefreshReg$(_c3, "ErrorBoundary"); $RefreshReg$(_c4, "DebugOverlay"); $RefreshReg$(_c5, "InternalErrorBoundary"); $RefreshReg$(_c6, "LoaderWrapper"); $RefreshReg$(_c7, "ClientOnly"); $RefreshReg$(_c8, "Layout"); $RefreshReg$(_c9, "%default%$_UNSAFE_withComponentProps"); $RefreshReg$(_c0, "%default%"); if (import.meta.hot && !inWebWorker) { window.$RefreshReg$ = prevRefreshReg; window.$RefreshSig$ = prevRefreshSig; RefreshRuntime.__hmr_import(import.meta.url).then((currentExports) => { RefreshRuntime.registerExportsForReactRefresh("/root/doctorapp/create-anything/apps/web/src/app/root.tsx", currentExports); import.meta.hot.accept((nextExports) => { if (!nextExports) return; "root" && window.__reactRouterRouteModuleUpdates.set("root", nextExports); const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate(currentExports, nextExports, ["clientAction","clientLoader","clientMiddleware","handle","meta","links","shouldRevalidate"]); if (invalidateMessage) import.meta.hot.invalidate(invalidateMessage); }); }); } //# sourceMappingURL=data:application/json;base64,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R0FBQTtRQUFBTCxRQUFFRDtVQUFPdEg7VUFBZ0NBLElBQUEsc0JBQUE2SCxJQUFBLElBQUFDLFdBQUE7UUFDdkROO1FBQ0ZBLFlBQVEsQ0FBQU8sT0FBQSxDQUFBSCxHQUFBLEVBQUFILElBQUEsQ0FBQW5HLFNBQUEsQ0FBQWlHLFFBQUEsQ0FBQVMsS0FBQTtNQUNOLFNBRUo7SUFFQTtJQUNFWCxhQUFVaEksUUFBTXZCO01BQ2xCdUosU0FBQSxDQUFBaEksS0FBQSxDQUFBdkIsT0FBQTtJQUNBO0lBQ0UsTUFBQXdCLFdBQU14QixHQUNKdUIsS0FBTUU7TUFDUjhILGFBQVV2SixRQUFPLENBQUF5QixNQUFBLEVBQUF6QixPQUFBLElBQUF1QixLQUFBLENBQUFFLE1BQUEsRUFBQUUsUUFBQTtNQUNuQjRILFNBQUEsQ0FBQXZKLE9BQUE7SUFFQXZDO0lBQ0FBLE9BQU9tRSxpQkFBaUIsU0FBQU4sT0FBQTtJQUV4QjdELE1BQUEsQ0FBT21FLGdCQUFNLHVCQUFBSixXQUFBO0lBQ1gvRCxhQUFPb0U7TUFDUHBFLE9BQU9vRSxvQkFBb0IsU0FBQVAsT0FBQTtNQUMzQjdELE1BQUl3TCxvQkFBcUIsdUJBQUF6SCxXQUFBO01BQ3ZCeUgsZUFBWS9LLFFBQU87UUFDckIrSyxXQUFBLENBQUEvSyxNQUFBO01BQ0Y7SUFDRixDQUFHO0VBRUg7RUFDa0IsT0FBQVcsZUFDZHpCLG9CQUFDK007SUFBWXRMLFFBQUNrQixpQkFBc0JRLGtCQUFvQkE7TUFBa0IxQixXQUN4RUUsNEJBQUNxTCxHQUFRN0osUUFDVHhCO01BQ1lGLFFBQUEsa0JBQUFFLElBQUEsQ0FBQXFMLE1BQUEsc0JBQUFyTCxJQUFBLENBQUFzTCxZQUFBO0lBQ0M7RUFFckI7O1VBNURrQm5PLFdBQUE7QUFBQTtVQUFBQSxXQUFBO0FBQUEiLCJuYW1lcyI6WyJDcmVhdGVQb2x5bW9ycGhpY0NvbXBvbmVudCIsIlNjcmlwdHMiLCJTY3JvbGxSZXN0b3JhdGlvbiIsInVzZUFzeW5jRXJyb3IiLCJ1c2VCdXR0b24iLCJ1c2VMb2NhdGlvbiIsInVzZVJvdXRlRXJyb3IiLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwidXNlUmVmIiwiQ29tcG9uZW50IiwidG9QbmciLCJmZXRjaCIsIlNlc3Npb25Qcm92aWRlciIsInVzZU5hdmlnYXRlIiwic2VyaWFsaXplRXJyb3IiLCJUb2FzdGVyIiwiTG9hZEZvbnRzIiwiSG90UmVsb2FkSW5kaWNhdG9yIiwidXNlU2FuZGJveFN0b3JlIiwidXNlRGV2U2VydmVySGVhcnRiZWF0IiwianN4IiwiX2pzeHMiLCJGcmFnbWVudCIsImxpbmtzIiwiX0ZyYWdtZW50IiwiZ2xvYmFsVGhpcyIsIndpbmRvdyIsImltcG9ydCIsImhvdCIsIm1ldGEiLCJlbnYiLCJTU1IiLCJvbiIsImxpbmsiLCJxdWVyeVNlbGVjdG9yQWxsIiwicmVtb3ZlIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwicmVsIiwiaHJlZiIsInVybCIsImRhdGFzZXQiLCJhdXRvRm9udCIsImhlYWQiLCJhcHBlbmRDaGlsZCIsImlzT3BlbiIsImNoaWxkcmVuIiwiY2xhc3NOYW1lIiwiX2pzeCIsInJlbmRlcklkIiwiYXMiLCJfYyIsIkVycm9yQm91bmRhcnkiLCJfVU5TQUZFX3dpdGhFcnJvckJvdW5kYXJ5UHJvcHMiLCJfYzIiLCJlcnJvciIsIlNoYXJlZEVycm9yQm91bmRhcnkiLCJfYzMiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwic3RhdGUiLCJnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IiLCJyZW5kZXIiLCJ0ZXh0IiwiZGlhZ25vc3RpY3MiLCJtZXNzYWdlIiwidHlwZSIsIm9uQ2xpY2siLCJuYXZpZ2F0b3IiLCJjbGlwYm9hcmQiLCJ3cml0ZVRleHQiLCJwcm9tcHQiLCJsb2NhdGlvbiIsImVuYWJsZWQiLCJzZXRFbmFibGVkIiwibGFzdEVycm9yIiwic2V0TGFzdEVycm9yIiwibGFzdFJlamVjdGlvbiIsInNldExhc3RSZWplY3Rpb24iLCJoZWFsdGgiLCJzZXRIZWFsdGgiLCJwYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJzaG91bGRFbmFibGUiLCJzZWFyY2giLCJnZXQiLCJQUk9EIiwib25FcnJvciIsImV2ZW50Iiwib25SZWplY3Rpb24iLCJyZWFzb24iLCJtc2ciLCJ0b1N0cmluZyIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwibG9hZCIsImpzb24iLCJyZXMiLCJvayIsInRpbWUiLCJzdGF0dXMiLCJFcnJvciIsImJ1aWxkIiwiTU9ERSIsIl9zIiwiX2M0IiwiZXJyb3JBcmciLCJfczIiLCJhc3luY0Vycm9yIiwic2V0SXNPcGVuIiwicm91dGVFcnJvciIsImFuaW1hdGVUaW1lciIsImNsZWFyVGltZW91dCIsImJ1dHRvblByb3BzIiwic2hvd0xvZ3NCdXR0b25Qcm9wcyIsIm9uUHJlc3MiLCJwYXJlbnQiLCJwb3N0TWVzc2FnZSIsImZpeEJ1dHRvblByb3BzIiwiaXNEaXNhYmxlZCIsImNvcHlCdXR0b25Qcm9wcyIsInN0cmluZ2lmeSIsImlzSW5JZnJhbWUiLCJoYXNFcnJvciIsImNvbXBvbmVudERpZENhdGNoIiwiY29uc29sZSIsImluZm8iLCJsb2FkZXIiLCJfYzYiLCJfczMiLCJzZXRJc01vdW50ZWQiLCJpc01vdW50ZWQiLCJjb25uZWN0ZWQiLCJ1c2VIbXJDb25uZWN0aW9uIiwiX3M0Iiwic2V0Q29ubmVjdGVkIiwib25EaXNjb25uZWN0Iiwib25Db25uZWN0Iiwib25GdWxsUmVsb2FkIiwib2ZmIiwidXNlSGFuZHNoYWtlUGFyZW50IiwiaXNIbXJDb25uZWN0ZWQiLCJoZWFsdGh5UmVzcG9uc2UiLCJoZWFsdGh5UmVzcG9uc2VUeXBlIiwiaGVhbHRoeSIsImhhbmRsZU1lc3NhZ2UiLCJfczUiLCJ1c2VDb2RlR2VuIiwiX3M2Iiwic3RhcnRDb2RlR2VuIiwic2V0Q29kZUdlbkdlbmVyYXRpbmciLCJjb21wbGV0ZUNvZGVHZW4iLCJlcnJvckNvZGVHZW4iLCJzdG9wQ29kZUdlbiIsInVzZVJlZnJlc2giLCJfczciLCJzZXRUaW1lb3V0IiwicmVsb2FkIiwid2FpdEZvclNjcmVlbnNob3RSZWFkeSIsIlByb21pc2UiLCJhbGwiLCJmcm9tIiwiaW1hZ2VzIiwibWFwIiwiaW1nIiwicmVzb2x2ZSIsImNyb3NzT3JpZ2luIiwiY29tcGxldGUiLCJvbmVycm9yIiwidXNlSGFuZGxlU2NyZWVuc2hvdFJlcXVlc3QiLCJfczgiLCJkYXRhIiwid2lkdGgiLCJpbm5lcldpZHRoIiwiYXNwZWN0UmF0aW8iLCJoZWlnaHQiLCJNYXRoIiwiZmxvb3IiLCJkYXRhVXJsIiwiY2FjaGVCdXN0IiwiYm9keSIsInNraXBGb250cyIsInN0eWxlIiwibWFyZ2luIiwiU3RyaW5nIiwicGF0aG5hbWUiLCJuYXZpZ2F0ZSIsImxhbmciLCJjaGFyU2V0IiwibmFtZSIsImNvbnRlbnQiLCJNZXRhIiwiTGlua3MiLCJzcmMiLCJMb2FkRm9udHNTU1IiLCJDbGllbnRPbmx5IiwicG9zaXRpb24iLCJhc3luYyIsIl9zOSIsIl9jMCIsIl9zMCIsIl9VTlNBRkVfd2l0aENvbXBvbmVudFByb3BzIiwiX2M5IiwiY2FwIiwiQ2FwYWNpdG9yIiwiaXNOYXRpdmVQbGF0Zm9ybSIsImFkZCIsImFwcFBsdWdpbiIsIlBsdWdpbnMiLCJBcHAiLCJiYWNrSGFuZGxlciIsImFkZExpc3RlbmVyIiwiaGlzdG9yeSIsImxlbmd0aCIsImJhY2siLCJleGl0QXBwIiwicHVzaEVycm9yIiwiZW50cnkiLCJleGlzdGluZyIsImxvY2FsU3RvcmFnZSIsIkpTT04iLCJwYXJzZSIsImdldEl0ZW0iLCJrZXkiLCJEYXRlIiwidG9JU09TdHJpbmciLCJzZXRJdGVtIiwic2xpY2UiLCJFcnJvckNhdGNoZXIiLCJPdXRsZXQiLCJEZWJ1Z092ZXJsYXkiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsicm9vdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgTGlua3MsXG4gIE1ldGEsXG4gIE91dGxldCxcbiAgU2NyaXB0cyxcbiAgU2Nyb2xsUmVzdG9yYXRpb24sXG4gIHVzZUFzeW5jRXJyb3IsXG4gIHVzZUxvY2F0aW9uLFxuICB1c2VSb3V0ZUVycm9yLFxufSBmcm9tICdyZWFjdC1yb3V0ZXInO1xuXG5pbXBvcnQgeyB1c2VCdXR0b24gfSBmcm9tICdAcmVhY3QtYXJpYS9idXR0b24nO1xuaW1wb3J0IHtcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbiAgdHlwZSBSZWFjdE5vZGUsXG4gIHR5cGUgRkMsXG4gIENvbXBvbmVudCxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICcuL2dsb2JhbC5jc3MnO1xuXG5pbXBvcnQgeyB0b1BuZyB9IGZyb20gJ2h0bWwtdG8taW1hZ2UnO1xuaW1wb3J0IGZldGNoIGZyb20gJ0AvX19jcmVhdGUvZmV0Y2gnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgU2Vzc2lvblByb3ZpZGVyIH0gZnJvbSAnQGF1dGgvY3JlYXRlL3JlYWN0JztcbmltcG9ydCB7IHVzZU5hdmlnYXRlIH0gZnJvbSAncmVhY3Qtcm91dGVyJztcbmltcG9ydCB7IHNlcmlhbGl6ZUVycm9yIH0gZnJvbSAnc2VyaWFsaXplLWVycm9yJztcbmltcG9ydCB7IFRvYXN0ZXIgfSBmcm9tICdzb25uZXInO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgTG9hZEZvbnRzIH0gZnJvbSAndmlydHVhbDpsb2FkLWZvbnRzLmpzeCc7XG5pbXBvcnQgeyBIb3RSZWxvYWRJbmRpY2F0b3IgfSBmcm9tICcuLi9fX2NyZWF0ZS9Ib3RSZWxvYWQnO1xuaW1wb3J0IHsgdXNlU2FuZGJveFN0b3JlIH0gZnJvbSAnLi4vX19jcmVhdGUvaG1yLXNhbmRib3gtc3RvcmUnO1xuaW1wb3J0IHR5cGUgeyBSb3V0ZSB9IGZyb20gJy4vK3R5cGVzL3Jvb3QnO1xuaW1wb3J0IHsgdXNlRGV2U2VydmVySGVhcnRiZWF0IH0gZnJvbSAnLi4vX19jcmVhdGUvdXNlRGV2U2VydmVySGVhcnRiZWF0JztcblxuZXhwb3J0IGNvbnN0IGxpbmtzID0gKCkgPT4gW107XG5cbmlmIChnbG9iYWxUaGlzLndpbmRvdyAmJiBnbG9iYWxUaGlzLndpbmRvdyAhPT0gdW5kZWZpbmVkKSB7XG4gIGdsb2JhbFRoaXMud2luZG93LmZldGNoID0gZmV0Y2g7XG59XG5cbmNvbnN0IExvYWRGb250c1NTUiA9IGltcG9ydC5tZXRhLmVudi5TU1IgPyBMb2FkRm9udHMgOiBudWxsO1xuaWYgKGltcG9ydC5tZXRhLmhvdCkge1xuICBpbXBvcnQubWV0YS5ob3Qub24oJ3VwZGF0ZS1mb250LWxpbmtzJywgKHVybHM6IHN0cmluZ1tdKSA9PiB7XG4gICAgLy8gcmVtb3ZlIG9sZCBmb250IGxpbmtzXG4gICAgZm9yIChjb25zdCBsaW5rIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2xpbmtbZGF0YS1hdXRvLWZvbnRdJykpIHtcbiAgICAgIGxpbmsucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgLy8gYWRkIG5ldyBvbmVzXG4gICAgZm9yIChjb25zdCB1cmwgb2YgdXJscykge1xuICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgbGluay5ocmVmID0gdXJsO1xuICAgICAgbGluay5kYXRhc2V0LmF1dG9Gb250ID0gJ3RydWUnO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBTaGFyZWRFcnJvckJvdW5kYXJ5KHtcbiAgaXNPcGVuLFxuICBjaGlsZHJlbixcbn06IHtcbiAgaXNPcGVuOiBib29sZWFuO1xuICBjaGlsZHJlbj86IFJlYWN0Tm9kZTtcbn0pOiBSZWFjdC5SZWFjdEVsZW1lbnQge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17YGZpeGVkIGJvdHRvbS00IGxlZnQtMS8yIHRyYW5zZm9ybSAtdHJhbnNsYXRlLXgtMS8yIHotNTAgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tNTAwIGVhc2Utb3V0ICR7XG4gICAgICAgIGlzT3BlbiA/ICd0cmFuc2xhdGUteS0wIG9wYWNpdHktMTAwJyA6ICd0cmFuc2xhdGUteS1mdWxsIG9wYWNpdHktMCdcbiAgICAgIH1gfVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctWyMxODE5MUJdIHRleHQtWyNGMkYyRjJdIHJvdW5kZWQtbGcgcC00IG1heC13LW1kIHctZnVsbCBteC00IHNoYWRvdy1sZ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQgZ2FwLTNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy04IGgtOCBiZy1bI0YyRjJGMl0gcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtYmxhY2sgdGV4dC1bMS4xMjVyZW1dIGxlYWRpbmctbm9uZVwiPiE8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMiBmbGV4LTFcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMVwiPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJmb250LWxpZ2h0IHRleHQtWyNGMkYyRjJdIHRleHQtc21cIj5BcHAgRXJyb3IgRGV0ZWN0ZWQ8L3A+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtWyM5NTk2OTddIHRleHQtc20gZm9udC1saWdodFwiPlxuICAgICAgICAgICAgICAgIEl0IGxvb2tzIGxpa2UgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHVzZSB5b3VyIGFwcC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8qKlxuICogTk9URTogd2UgaGF2ZSBhIHNoYXJlZCBlcnJvciBib3VuZGFyeSBmb3IgdGhlIGFwcCwgYnV0IHRoZW4gd2UgYWxzbyBleHBvc2VcbiAqIHRoaXMgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZyBvdXRzaWRlIG9mIHRoZSBub3JtYWwgdXNlcidzIGFwcCBmbG93LlxuICogUmVhY3Qtcm91dGVyIHdpbGwgbW91bnQgdGhpcyBvbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVycm9yQm91bmRhcnkoeyBlcnJvciB9OiBSb3V0ZS5FcnJvckJvdW5kYXJ5UHJvcHMpIHtcbiAgcmV0dXJuIDxTaGFyZWRFcnJvckJvdW5kYXJ5IGlzT3Blbj17dHJ1ZX0gLz47XG59XG5cbmNsYXNzIEVycm9yQ2F0Y2hlciBleHRlbmRzIENvbXBvbmVudDxcbiAgeyBjaGlsZHJlbjogUmVhY3ROb2RlOyBkaWFnbm9zdGljczogc3RyaW5nIH0sXG4gIHsgZXJyb3I6IEVycm9yIHwgbnVsbCB9XG4+IHtcbiAgY29uc3RydWN0b3IocHJvcHM6IHsgY2hpbGRyZW46IFJlYWN0Tm9kZTsgZGlhZ25vc3RpY3M6IHN0cmluZyB9KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7IGVycm9yOiBudWxsIH07XG4gIH1cblxuICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGVycm9yOiBFcnJvcikge1xuICAgIHJldHVybiB7IGVycm9yIH07XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuZXJyb3IpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBgJHt0aGlzLnN0YXRlLmVycm9yLm1lc3NhZ2V9XFxuJHt0aGlzLnByb3BzLmRpYWdub3N0aWNzfWA7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBhZ2UgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcC02XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjYXJkIHctZnVsbCBtYXgtdy1sZyB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgdGV4dC1bIzFhMTkxNV1cIj5cbiAgICAgICAgICAgICAgU29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0yIHRleHQtc20gdGV4dC1bIzZjNjU1Yl1cIj5cbiAgICAgICAgICAgICAgVGhlIGFwcCBoaXQgYW4gdW5leHBlY3RlZCBlcnJvci4gWW91IGNhbiBjb3B5IGRpYWdub3N0aWNzIGJlbG93LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPHByZSBjbGFzc05hbWU9XCJtdC00IG1heC1oLTQ4IG92ZXJmbG93LWF1dG8gcm91bmRlZC14bCBib3JkZXIgYm9yZGVyLVsjZThlMWQ0XSBiZy13aGl0ZSBwLTMgdGV4dC1sZWZ0IHRleHQteHMgdGV4dC1bIzZjNjU1Yl1cIj5cbiAgICAgICAgICAgICAge3RleHR9XG4gICAgICAgICAgICA8L3ByZT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobmF2aWdhdG9yPy5jbGlwYm9hcmQ/LndyaXRlVGV4dCkge1xuICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHdpbmRvdy5wcm9tcHQoJ0NvcHkgZGlhZ25vc3RpY3MnLCB0ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0biBidG4tcHJpbWFyeSBtdC00IHctZnVsbCBqdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIENvcHkgZGlhZ25vc3RpY3NcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gIH1cbn1cblxuZnVuY3Rpb24gRGVidWdPdmVybGF5KCkge1xuICBjb25zdCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG4gIGNvbnN0IFtlbmFibGVkLCBzZXRFbmFibGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2xhc3RFcnJvciwgc2V0TGFzdEVycm9yXSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgW2xhc3RSZWplY3Rpb24sIHNldExhc3RSZWplY3Rpb25dID0gdXNlU3RhdGUoJycpO1xuICBjb25zdCBbaGVhbHRoLCBzZXRIZWFsdGhdID0gdXNlU3RhdGUoJ3BlbmRpbmcnKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgY29uc3Qgc2hvdWxkRW5hYmxlID0gcGFyYW1zLmdldCgnZGVidWcnKSA9PT0gJzEnIHx8ICFpbXBvcnQubWV0YS5lbnYuUFJPRDtcbiAgICBzZXRFbmFibGVkKHNob3VsZEVuYWJsZSk7XG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICAgIGNvbnN0IG9uRXJyb3IgPSAoZXZlbnQ6IEVycm9yRXZlbnQpID0+IHtcbiAgICAgIHNldExhc3RFcnJvcihldmVudC5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJyk7XG4gICAgfTtcbiAgICBjb25zdCBvblJlamVjdGlvbiA9IChldmVudDogUHJvbWlzZVJlamVjdGlvbkV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBtc2cgPVxuICAgICAgICBldmVudC5yZWFzb24/Lm1lc3NhZ2UgfHwgZXZlbnQucmVhc29uPy50b1N0cmluZz8uKCkgfHwgJ1VuaGFuZGxlZCByZWplY3Rpb24nO1xuICAgICAgc2V0TGFzdFJlamVjdGlvbihtc2cpO1xuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3VuaGFuZGxlZHJlamVjdGlvbicsIG9uUmVqZWN0aW9uKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndW5oYW5kbGVkcmVqZWN0aW9uJywgb25SZWplY3Rpb24pO1xuICAgIH07XG4gIH0sIFtlbmFibGVkXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcbiAgICBjb25zdCBsb2FkID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvaGVhbHRoJyk7XG4gICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBzZXRIZWFsdGgocmVzLm9rID8gYG9rOiAke2pzb24/LnRpbWUgfHwgJyd9YCA6IGBlcnJvcjogJHtyZXMuc3RhdHVzfWApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2V0SGVhbHRoKGBlcnJvcjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duJ31gKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGxvYWQoKTtcbiAgfSwgW2VuYWJsZWRdKTtcblxuICBpZiAoIWVuYWJsZWQpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IGJ1aWxkID1cbiAgICBpbXBvcnQubWV0YS5lbnYuVklURV9BUFBfVkVSU0lPTiB8fCBpbXBvcnQubWV0YS5lbnYuTU9ERSB8fCAndW5rbm93bic7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZpeGVkIGJvdHRvbS00IHJpZ2h0LTQgei01MCB3LVszMjBweF0gcm91bmRlZC0yeGwgYm9yZGVyIGJvcmRlci1bI2U4ZTFkNF0gYmctd2hpdGUvOTUgcC00IHRleHQteHMgdGV4dC1bIzFhMTkxNV0gc2hhZG93LWxnXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMmVtXSB0ZXh0LVsjNmM2NTViXVwiPlxuICAgICAgICBEZWJ1ZyBPdmVybGF5XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBzcGFjZS15LTFcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsjNmM2NTViXVwiPlJvdXRlOjwvc3Bhbj57JyAnfVxuICAgICAgICAgIHtsb2NhdGlvbi5wYXRobmFtZX1cbiAgICAgICAgICB7bG9jYXRpb24uc2VhcmNofVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsjNmM2NTViXVwiPkJ1aWxkOjwvc3Bhbj4ge2J1aWxkfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsjNmM2NTViXVwiPkFQSSAvaGVhbHRoOjwvc3Bhbj4ge2hlYWx0aH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bIzZjNjU1Yl1cIj53aW5kb3cub25lcnJvcjo8L3NwYW4+eycgJ31cbiAgICAgICAgICB7bGFzdEVycm9yIHx8ICdub25lJ31cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bIzZjNjU1Yl1cIj51bmhhbmRsZWRyZWplY3Rpb246PC9zcGFuPnsnICd9XG4gICAgICAgICAge2xhc3RSZWplY3Rpb24gfHwgJ25vbmUnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5mdW5jdGlvbiBJbnRlcm5hbEVycm9yQm91bmRhcnkoeyBlcnJvcjogZXJyb3JBcmcgfTogUm91dGUuRXJyb3JCb3VuZGFyeVByb3BzKSB7XG4gIGNvbnN0IHJvdXRlRXJyb3IgPSB1c2VSb3V0ZUVycm9yKCk7XG4gIGNvbnN0IGFzeW5jRXJyb3IgPSB1c2VBc3luY0Vycm9yKCk7XG4gIGNvbnN0IGVycm9yID0gZXJyb3JBcmcgPz8gYXN5bmNFcnJvciA/PyByb3V0ZUVycm9yO1xuICBjb25zdCBbaXNPcGVuLCBzZXRJc09wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgYW5pbWF0ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBzZXRJc09wZW4odHJ1ZSksIDEwMCk7XG4gICAgcmV0dXJuICgpID0+IGNsZWFyVGltZW91dChhbmltYXRlVGltZXIpO1xuICB9LCBbXSk7XG4gIGNvbnN0IHsgYnV0dG9uUHJvcHM6IHNob3dMb2dzQnV0dG9uUHJvcHMgfSA9IHVzZUJ1dHRvbihcbiAgICB7XG4gICAgICBvblByZXNzOiB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ3NhbmRib3g6d2ViOnNob3ctbG9ncycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnKidcbiAgICAgICAgKTtcbiAgICAgIH0sIFtdKSxcbiAgICB9LFxuICAgIHVzZVJlZjxIVE1MQnV0dG9uRWxlbWVudD4obnVsbClcbiAgKTtcbiAgY29uc3QgeyBidXR0b25Qcm9wczogZml4QnV0dG9uUHJvcHMgfSA9IHVzZUJ1dHRvbihcbiAgICB7XG4gICAgICBvblByZXNzOiB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ3NhbmRib3g6d2ViOmZpeCcsXG4gICAgICAgICAgICBlcnJvcjogc2VyaWFsaXplRXJyb3IoZXJyb3IpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyonXG4gICAgICAgICk7XG4gICAgICAgIHNldElzT3BlbihmYWxzZSk7XG4gICAgICB9LCBbZXJyb3JdKSxcbiAgICAgIGlzRGlzYWJsZWQ6ICFlcnJvcixcbiAgICB9LFxuICAgIHVzZVJlZjxIVE1MQnV0dG9uRWxlbWVudD4obnVsbClcbiAgKTtcbiAgY29uc3QgeyBidXR0b25Qcm9wczogY29weUJ1dHRvblByb3BzIH0gPSB1c2VCdXR0b24oXG4gICAge1xuICAgICAgb25QcmVzczogdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXh0ID0gSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgaWYgKG5hdmlnYXRvcj8uY2xpcGJvYXJkPy53cml0ZVRleHQpIHtcbiAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3aW5kb3cucHJvbXB0KCdDb3B5IGVycm9yJywgdGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH0sIFtlcnJvcl0pLFxuICAgIH0sXG4gICAgdXNlUmVmPEhUTUxCdXR0b25FbGVtZW50PihudWxsKVxuICApO1xuXG4gIGZ1bmN0aW9uIGlzSW5JZnJhbWUoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB3aW5kb3cucGFyZW50ICE9PSB3aW5kb3c7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChcbiAgICA8U2hhcmVkRXJyb3JCb3VuZGFyeSBpc09wZW49e2lzT3Blbn0+XG4gICAgICB7aXNJbklmcmFtZSgpID8gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTJcIj5cbiAgICAgICAgICB7ISFlcnJvciAmJiAoXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC1bNHB4XSBvdXRsaW5lLW5vbmUgdHJhbnNpdGlvbi1jb2xvcnMgcm91bmRlZC1bOHB4XSBib3JkZXItWzFweF0gYmctWyNmOWY5ZjldIGhvdmVyOmJnLVsjZGJkYmRiXSBhY3RpdmU6YmctWyNjNGM0YzRdIGJvcmRlci1bI2M0YzRjNF0gdGV4dC1bIzE4MTkxQl0gdGV4dC1zbSBweC1bOHB4XSBweS1bNHB4XSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICB7Li4uZml4QnV0dG9uUHJvcHN9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFRyeSB0byBmaXhcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtWzRweF0gb3V0bGluZS1ub25lIHRyYW5zaXRpb24tY29sb3JzIHJvdW5kZWQtWzhweF0gYm9yZGVyLVsxcHhdIGJnLVsjMkMyRDJGXSBob3ZlcjpiZy1bIzQxNDI0M10gYWN0aXZlOmJnLVsjNTU1NjU4XSBib3JkZXItWyM0MTQyNDNdIHRleHQtd2hpdGUgdGV4dC1zbSBweC1bOHB4XSBweS1bNHB4XVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHsuLi5zaG93TG9nc0J1dHRvblByb3BzfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIFNob3cgbG9nc1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICkgOiAoXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtWzRweF0gb3V0bGluZS1ub25lIHRyYW5zaXRpb24tY29sb3JzIHJvdW5kZWQtWzhweF0gYm9yZGVyLVsxcHhdIGJnLVsjMkMyRDJGXSBob3ZlcjpiZy1bIzQxNDI0M10gYWN0aXZlOmJnLVsjNTU1NjU4XSBib3JkZXItWyM0MTQyNDNdIHRleHQtd2hpdGUgdGV4dC1zbSBweC1bOHB4XSBweS1bNHB4XSB3LWZpdFwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgey4uLmNvcHlCdXR0b25Qcm9wc31cbiAgICAgICAgPlxuICAgICAgICAgIENvcHkgZXJyb3JcbiAgICAgICAgPC9idXR0b24+XG4gICAgICApfVxuICAgIDwvU2hhcmVkRXJyb3JCb3VuZGFyeT5cbiAgKTtcbn1cblxudHlwZSBFcnJvckJvdW5kYXJ5UHJvcHMgPSB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59O1xuXG50eXBlIEVycm9yQm91bmRhcnlTdGF0ZSA9IHsgaGFzRXJyb3I6IGJvb2xlYW47IGVycm9yOiB1bmtub3duIHwgbnVsbCB9O1xuXG5jbGFzcyBFcnJvckJvdW5kYXJ5V3JhcHBlciBleHRlbmRzIENvbXBvbmVudDxFcnJvckJvdW5kYXJ5UHJvcHMsIEVycm9yQm91bmRhcnlTdGF0ZT4ge1xuICBzdGF0ZTogRXJyb3JCb3VuZGFyeVN0YXRlID0geyBoYXNFcnJvcjogZmFsc2UsIGVycm9yOiBudWxsIH07XG5cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcjogdW5rbm93bik6IEVycm9yQm91bmRhcnlTdGF0ZSB7XG4gICAgcmV0dXJuIHsgaGFzRXJyb3I6IHRydWUsIGVycm9yIH07XG4gIH1cblxuICBjb21wb25lbnREaWRDYXRjaChlcnJvcjogdW5rbm93biwgaW5mbzogdW5rbm93bikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IsIGluZm8pO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmhhc0Vycm9yKSB7XG4gICAgICByZXR1cm4gPEludGVybmFsRXJyb3JCb3VuZGFyeSBlcnJvcj17dGhpcy5zdGF0ZS5lcnJvcn0gcGFyYW1zPXt7fX0gLz47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICB9XG59XG5cbmZ1bmN0aW9uIExvYWRlcldyYXBwZXIoeyBsb2FkZXIgfTogeyBsb2FkZXI6ICgpID0+IFJlYWN0LlJlYWN0Tm9kZSB9KSB7XG4gIHJldHVybiA8Pntsb2FkZXIoKX08Lz47XG59XG5cbnR5cGUgQ2xpZW50T25seVByb3BzID0ge1xuICBsb2FkZXI6ICgpID0+IFJlYWN0LlJlYWN0Tm9kZTtcbn07XG5cbmV4cG9ydCBjb25zdCBDbGllbnRPbmx5OiBSZWFjdC5GQzxDbGllbnRPbmx5UHJvcHM+ID0gKHsgbG9hZGVyIH0pID0+IHtcbiAgY29uc3QgW2lzTW91bnRlZCwgc2V0SXNNb3VudGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldElzTW91bnRlZCh0cnVlKTtcbiAgfSwgW10pO1xuXG4gIGlmICghaXNNb3VudGVkKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gKFxuICAgIDxFcnJvckJvdW5kYXJ5V3JhcHBlcj5cbiAgICAgIDxMb2FkZXJXcmFwcGVyIGxvYWRlcj17bG9hZGVyfSAvPlxuICAgIDwvRXJyb3JCb3VuZGFyeVdyYXBwZXI+XG4gICk7XG59O1xuXG4vKipcbiAqIHVzZUhtckNvbm5lY3Rpb24oKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDigKIgYHRydWVgICDihpIgSE1SIHNvY2tldCBpcyBoZWFsdGh5XG4gKiDigKIgYGZhbHNlYCDihpIgc29ja2V0IGxvc3QgKFZpdGUgaXMgcG9sbGluZyAvIG1heSBhdXRv4oCRcmVsb2FkIHNvb24pXG4gKlxuICogV29ya3Mgb25seSBpbiBkZXY7IGluIHByb2QgaXQgYWx3YXlzIHJldHVybnMgYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSG1yQ29ubmVjdGlvbigpOiBib29sZWFuIHtcbiAgY29uc3QgW2Nvbm5lY3RlZCwgc2V0Q29ubmVjdGVkXSA9IHVzZVN0YXRlKCgpID0+ICEhaW1wb3J0Lm1ldGEuaG90KTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIE5vIEhNUiBvYmplY3Qgb3V0c2lkZSBkZXYgYnVpbGRzXG4gICAgaWYgKCFpbXBvcnQubWV0YS5ob3QpIHJldHVybjtcblxuICAgIC8qKiBGaXJlZCB0aGUgbW9tZW50IHRoZSBXUyBjbG9zZXMgdW5leHBlY3RlZGx5ICovXG4gICAgY29uc3Qgb25EaXNjb25uZWN0ID0gKCkgPT4gc2V0Q29ubmVjdGVkKGZhbHNlKTtcbiAgICAvKiogRmlyZWQgZXZlcnkgdGltZSB0aGUgV1MgKHJl4oCRKW9wZW5zICovXG4gICAgY29uc3Qgb25Db25uZWN0ID0gKCkgPT4gc2V0Q29ubmVjdGVkKHRydWUpO1xuXG4gICAgaW1wb3J0Lm1ldGEuaG90Lm9uKCd2aXRlOndzOmRpc2Nvbm5lY3QnLCBvbkRpc2Nvbm5lY3QpO1xuICAgIGltcG9ydC5tZXRhLmhvdC5vbigndml0ZTp3czpjb25uZWN0Jywgb25Db25uZWN0KTtcblxuICAgIC8vIE9wdGlvbmFsOiBjYXRjaCB0aGUg4oCcYWJvdXQgdG8gZnVsbOKAkXJlbG9hZOKAnSBldmVudCBhcyBhIGxhc3QgcmVzb3J0XG4gICAgY29uc3Qgb25GdWxsUmVsb2FkID0gKCkgPT4gc2V0Q29ubmVjdGVkKGZhbHNlKTtcbiAgICBpbXBvcnQubWV0YS5ob3Qub24oJ3ZpdGU6YmVmb3JlRnVsbFJlbG9hZCcsIG9uRnVsbFJlbG9hZCk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaW1wb3J0Lm1ldGEuaG90Py5vZmYoJ3ZpdGU6d3M6ZGlzY29ubmVjdCcsIG9uRGlzY29ubmVjdCk7XG4gICAgICBpbXBvcnQubWV0YS5ob3Q/Lm9mZigndml0ZTp3czpjb25uZWN0Jywgb25Db25uZWN0KTtcbiAgICAgIGltcG9ydC5tZXRhLmhvdD8ub2ZmKCd2aXRlOmJlZm9yZUZ1bGxSZWxvYWQnLCBvbkZ1bGxSZWxvYWQpO1xuICAgIH07XG4gIH0sIFtdKTtcblxuICByZXR1cm4gY29ubmVjdGVkO1xufVxuXG5jb25zdCBoZWFsdGh5UmVzcG9uc2VUeXBlID0gJ3NhbmRib3g6d2ViOmhlYWx0aGNoZWNrOnJlc3BvbnNlJztcbmNvbnN0IHVzZUhhbmRzaGFrZVBhcmVudCA9ICgpID0+IHtcbiAgY29uc3QgaXNIbXJDb25uZWN0ZWQgPSB1c2VIbXJDb25uZWN0aW9uKCk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGVhbHRoeVJlc3BvbnNlID0ge1xuICAgICAgdHlwZTogaGVhbHRoeVJlc3BvbnNlVHlwZSxcbiAgICAgIGhlYWx0aHk6IGlzSG1yQ29ubmVjdGVkLFxuICAgIH07XG4gICAgY29uc3QgaGFuZGxlTWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQuZGF0YS50eXBlID09PSAnc2FuZGJveDp3ZWI6aGVhbHRoY2hlY2snKSB7XG4gICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoaGVhbHRoeVJlc3BvbnNlLCAnKicpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAvLyBJbW1lZGlhdGVseSByZXNwb25kIHRvIHRoZSBwYXJlbnQgd2luZG93IHdpdGggYSBoZWFsdGh5IHJlc3BvbnNlIGluXG4gICAgLy8gY2FzZSB3ZSBtaXNzZWQgdGhlIGhlYWx0aGNoZWNrIG1lc3NhZ2VcbiAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKGhlYWx0aHlSZXNwb25zZSwgJyonKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVNZXNzYWdlKTtcbiAgICB9O1xuICB9LCBbaXNIbXJDb25uZWN0ZWRdKTtcbn07XG5cbmNvbnN0IHVzZUNvZGVHZW4gPSAoKSA9PiB7XG4gIGNvbnN0IHsgc3RhcnRDb2RlR2VuLCBzZXRDb2RlR2VuR2VuZXJhdGluZywgY29tcGxldGVDb2RlR2VuLCBlcnJvckNvZGVHZW4sIHN0b3BDb2RlR2VuIH0gPVxuICAgIHVzZVNhbmRib3hTdG9yZSgpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlTWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IHR5cGUgfSA9IGV2ZW50LmRhdGE7XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdzYW5kYm94OndlYjpjb2RlZ2VuOnN0YXJ0ZWQnOlxuICAgICAgICAgIHN0YXJ0Q29kZUdlbigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzYW5kYm94OndlYjpjb2RlZ2VuOmdlbmVyYXRpbmcnOlxuICAgICAgICAgIHNldENvZGVHZW5HZW5lcmF0aW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NhbmRib3g6d2ViOmNvZGVnZW46Y29tcGxldGUnOlxuICAgICAgICAgIGNvbXBsZXRlQ29kZUdlbigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzYW5kYm94OndlYjpjb2RlZ2VuOmVycm9yJzpcbiAgICAgICAgICBlcnJvckNvZGVHZW4oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc2FuZGJveDp3ZWI6Y29kZWdlbjpzdG9wcGVkJzpcbiAgICAgICAgICBzdG9wQ29kZUdlbigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVNZXNzYWdlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVNZXNzYWdlKTtcbiAgICB9O1xuICB9LCBbc3RhcnRDb2RlR2VuLCBzZXRDb2RlR2VuR2VuZXJhdGluZywgY29tcGxldGVDb2RlR2VuLCBlcnJvckNvZGVHZW4sIHN0b3BDb2RlR2VuXSk7XG59O1xuXG5jb25zdCB1c2VSZWZyZXNoID0gKCkgPT4ge1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZU1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmRhdGEudHlwZSA9PT0gJ3NhbmRib3g6d2ViOnJlZnJlc2g6cmVxdWVzdCcpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7IHR5cGU6ICdzYW5kYm94OndlYjpyZWZyZXNoOmNvbXBsZXRlJyB9LCAnKicpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVNZXNzYWdlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVNZXNzYWdlKTtcbiAgICB9O1xuICB9LCBbXSk7XG59O1xuXG5jb25zdCB3YWl0Rm9yU2NyZWVuc2hvdFJlYWR5ID0gYXN5bmMgKCkgPT4ge1xuICBjb25zdCBpbWFnZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LmltYWdlcyk7XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIC8vIG1ha2Ugc3VyZSBjdXN0b20gZm9udHMgYXJlIGxvYWRlZFxuICAgICdmb250cycgaW4gZG9jdW1lbnQgPyBkb2N1bWVudC5mb250cy5yZWFkeSA6IFByb21pc2UucmVzb2x2ZSgpLFxuICAgIC4uLmltYWdlcy5tYXAoXG4gICAgICAoaW1nKSA9PlxuICAgICAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIGltZy5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnO1xuICAgICAgICAgIGlmIChpbWcuY29tcGxldGUpIHtcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHRydWUpO1xuICAgICAgICAgIGltZy5vbmVycm9yID0gKCkgPT4gcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfSlcbiAgICApLFxuICBdKTtcblxuICAvLyBzbWFsbCBidWZmZXIgdG8gZW5zdXJlIHJlbmRlcmluZyBpcyBzdGFibGVcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMjUwKSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlSGFuZGxlU2NyZWVuc2hvdFJlcXVlc3QgPSAoKSA9PiB7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlTWVzc2FnZSA9IGFzeW5jIChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQuZGF0YS50eXBlID09PSAnc2FuZGJveDp3ZWI6c2NyZWVuc2hvdDpyZXF1ZXN0Jykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHdhaXRGb3JTY3JlZW5zaG90UmVhZHkoKTtcblxuICAgICAgICAgIGNvbnN0IHdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgICAgY29uc3QgYXNwZWN0UmF0aW8gPSAxNiAvIDk7XG4gICAgICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5mbG9vcih3aWR0aCAvIGFzcGVjdFJhdGlvKTtcblxuICAgICAgICAgIC8vIGh0bWwtdG8taW1hZ2UgYWxyZWFkeSBoYW5kbGVzIENPUlMsIGZvbnRzLCBhbmQgQ1NTIGlubGluaW5nXG4gICAgICAgICAgY29uc3QgZGF0YVVybCA9IGF3YWl0IHRvUG5nKGRvY3VtZW50LmJvZHksIHtcbiAgICAgICAgICAgIGNhY2hlQnVzdDogdHJ1ZSxcbiAgICAgICAgICAgIHNraXBGb250czogZmFsc2UsXG4gICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgIC8vIGZvcmNlIHNuYXBzaG90IHNpemluZ1xuICAgICAgICAgICAgICB3aWR0aDogYCR7d2lkdGh9cHhgLFxuICAgICAgICAgICAgICBoZWlnaHQ6IGAke2hlaWdodH1weGAsXG4gICAgICAgICAgICAgIG1hcmdpbjogJzAnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoeyB0eXBlOiAnc2FuZGJveDp3ZWI6c2NyZWVuc2hvdDpyZXNwb25zZScsIGRhdGFVcmwgfSwgJyonKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAnc2FuZGJveDp3ZWI6c2NyZWVuc2hvdDplcnJvcicsXG4gICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyonXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZU1lc3NhZ2UpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZU1lc3NhZ2UpO1xuICAgIH07XG4gIH0sIFtdKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gTGF5b3V0KHsgY2hpbGRyZW4gfTogeyBjaGlsZHJlbjogUmVhY3ROb2RlIH0pIHtcbiAgdXNlSGFuZHNoYWtlUGFyZW50KCk7XG4gIHVzZUNvZGVHZW4oKTtcbiAgdXNlUmVmcmVzaCgpO1xuICB1c2VIYW5kbGVTY3JlZW5zaG90UmVxdWVzdCgpO1xuICB1c2VEZXZTZXJ2ZXJIZWFydGJlYXQoKTtcbiAgY29uc3QgbmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuICBjb25zdCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG4gIGNvbnN0IHBhdGhuYW1lID0gbG9jYXRpb24/LnBhdGhuYW1lO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZU1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmRhdGEudHlwZSA9PT0gJ3NhbmRib3g6bmF2aWdhdGlvbicpIHtcbiAgICAgICAgbmF2aWdhdGUoZXZlbnQuZGF0YS5wYXRobmFtZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZU1lc3NhZ2UpO1xuICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoeyB0eXBlOiAnc2FuZGJveDp3ZWI6cmVhZHknIH0sICcqJyk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlTWVzc2FnZSk7XG4gICAgfTtcbiAgfSwgW25hdmlnYXRlXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocGF0aG5hbWUpIHtcbiAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnc2FuZGJveDp3ZWI6bmF2aWdhdGlvbicsXG4gICAgICAgICAgcGF0aG5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgICcqJ1xuICAgICAgKTtcbiAgICB9XG4gIH0sIFtwYXRobmFtZV0pO1xuICByZXR1cm4gKFxuICAgIDxodG1sIGxhbmc9XCJlblwiPlxuICAgICAgPGhlYWQ+XG4gICAgICAgIDxtZXRhIGNoYXJTZXQ9XCJ1dGYtOFwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiIC8+XG4gICAgICAgIDxNZXRhIC8+XG4gICAgICAgIDxMaW5rcyAvPlxuICAgICAgICA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIiBzcmM9XCIvc3JjL19fY3JlYXRlL2Rldi1lcnJvci1vdmVybGF5LmpzXCI+PC9zY3JpcHQ+XG4gICAgICAgIDxsaW5rIHJlbD1cImljb25cIiBocmVmPVwiL3NyYy9fX2NyZWF0ZS9mYXZpY29uLnBuZ1wiIC8+XG4gICAgICAgIHtMb2FkRm9udHNTU1IgPyA8TG9hZEZvbnRzU1NSIC8+IDogbnVsbH1cbiAgICAgIDwvaGVhZD5cbiAgICAgIDxib2R5PlxuICAgICAgICA8Q2xpZW50T25seSBsb2FkZXI9eygpID0+IGNoaWxkcmVufSAvPlxuICAgICAgICA8SG90UmVsb2FkSW5kaWNhdG9yIC8+XG4gICAgICAgIDxUb2FzdGVyIHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgLz5cbiAgICAgICAgPFNjcm9sbFJlc3RvcmF0aW9uIC8+XG4gICAgICAgIDxTY3JpcHRzIC8+XG4gICAgICAgIDxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9raXQuZm9udGF3ZXNvbWUuY29tLzJjMTVjYzBjYzcuanNcIiBjcm9zc09yaWdpbj1cImFub255bW91c1wiIGFzeW5jIC8+XG4gICAgICA8L2JvZHk+XG4gICAgPC9odG1sPlxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBcHAoKSB7XG4gIGNvbnN0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICBjb25zdCBjYXAgPSAod2luZG93IGFzIHR5cGVvZiB3aW5kb3cgJiB7IENhcGFjaXRvcj86IGFueSB9KS5DYXBhY2l0b3I7XG4gICAgaWYgKCFjYXA/LmlzTmF0aXZlUGxhdGZvcm0/LigpKSByZXR1cm47XG5cbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2NhcC1uYXRpdmUnKTtcblxuICAgIGNvbnN0IGFwcFBsdWdpbiA9IGNhcC5QbHVnaW5zPy5BcHA7XG4gICAgY29uc3QgYmFja0hhbmRsZXIgPVxuICAgICAgYXBwUGx1Z2luPy5hZGRMaXN0ZW5lciAmJlxuICAgICAgYXBwUGx1Z2luLmFkZExpc3RlbmVyKCdiYWNrQnV0dG9uJywgKCkgPT4ge1xuICAgICAgICBpZiAod2luZG93Lmhpc3RvcnkubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHdpbmRvdy5oaXN0b3J5LmJhY2soKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFwcFBsdWdpbj8uZXhpdEFwcCkge1xuICAgICAgICAgIGFwcFBsdWdpbi5leGl0QXBwKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgY29uc3QgcHVzaEVycm9yID0gKGVudHJ5OiBzdHJpbmcpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGtleSA9ICdkZWJ1ZzpsYXN0RXJyb3JzJztcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkgfHwgJ1tdJyk7XG4gICAgICAgIGV4aXN0aW5nLnB1c2goeyBlbnRyeSwgdGltZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0pO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nLnNsaWNlKC0yMCkpKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBpZ25vcmUgc3RvcmFnZSBlcnJvcnNcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25FcnJvciA9IChldmVudDogRXJyb3JFdmVudCkgPT4ge1xuICAgICAgcHVzaEVycm9yKGV2ZW50Lm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uUmVqZWN0aW9uID0gKGV2ZW50OiBQcm9taXNlUmVqZWN0aW9uRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICBldmVudC5yZWFzb24/Lm1lc3NhZ2UgfHwgZXZlbnQucmVhc29uPy50b1N0cmluZz8uKCkgfHwgJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbic7XG4gICAgICBwdXNoRXJyb3IobWVzc2FnZSk7XG4gICAgfTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd1bmhhbmRsZWRyZWplY3Rpb24nLCBvblJlamVjdGlvbik7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndW5oYW5kbGVkcmVqZWN0aW9uJywgb25SZWplY3Rpb24pO1xuICAgICAgaWYgKGJhY2tIYW5kbGVyPy5yZW1vdmUpIHtcbiAgICAgICAgYmFja0hhbmRsZXIucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIHJldHVybiAoXG4gICAgPFNlc3Npb25Qcm92aWRlcj5cbiAgICAgIDxFcnJvckNhdGNoZXIgZGlhZ25vc3RpY3M9e2Byb3V0ZT0ke2xvY2F0aW9uLnBhdGhuYW1lfSR7bG9jYXRpb24uc2VhcmNofWB9PlxuICAgICAgICA8T3V0bGV0IC8+XG4gICAgICAgIDxEZWJ1Z092ZXJsYXkgLz5cbiAgICAgIDwvRXJyb3JDYXRjaGVyPlxuICAgIDwvU2Vzc2lvblByb3ZpZGVyPlxuICApO1xufVxuIl0sImZpbGUiOiIvcm9vdC9kb2N0b3JhcHAvY3JlYXRlLWFueXRoaW5nL2FwcHMvd2ViL3NyYy9hcHAvcm9vdC50c3gifQ==