UNPKG

vite-plugin-react-server

Version:
232 lines (229 loc) 37.9 kB
/** * vite-plugin-react-server * Copyright (c) Nico Brinkkemper * MIT License */ import { resolveAutoDiscover } from '../config/autoDiscover/resolveAutoDiscover.js'; import { resolveUserConfig } from '../config/resolveUserConfig.js'; import { resolveOptions } from '../config/resolveOptions.js'; import { handleError } from '../error/handleError.js'; import { createDefaultModuleID } from '../config/createModuleID.js'; import { createLogger } from 'vite'; import { join } from 'node:path'; import { DEFAULT_LOADER_CONFIG } from '../config/defaults.js'; import { runDeferredStaticGeneration } from '../bundle/deferredStaticGeneration.js'; const createEnvironmentPlugin = (options) => { const environmentPlugin = { name: "vite:plugin-react-server/environments", enforce: "pre", async config(config, configEnv) { const resolvedOptionsResult = resolveOptions(options); if (resolvedOptionsResult.type === "error") { throw resolvedOptionsResult.error; } const userOptions = resolvedOptionsResult.userOptions; if (!config.plugins) { config.plugins = []; } const logger = config.customLogger || createLogger(); if (typeof userOptions.moduleID !== "function") { userOptions.moduleID = createDefaultModuleID( userOptions, configEnv, userOptions.loader?.mode ); } if (!userOptions.loader) { userOptions.loader = DEFAULT_LOADER_CONFIG; } userOptions.loader.moduleID = createDefaultModuleID( userOptions, configEnv, userOptions.loader?.mode ); const autoDiscoverResult = await resolveAutoDiscover({ config, configEnv, userOptions, logger }); if (autoDiscoverResult.type === "error") { const panicError = handleError({ error: autoDiscoverResult.error, logger, panicThreshold: userOptions.panicThreshold, critical: true // Auto-discovery is critical for environment setup }); if (panicError != null) { throw panicError; } else { throw new Error("Cannot continue without auto-discovery"); } } const autoDiscoveredFiles = autoDiscoverResult.autoDiscoveredFiles; const allEnvironmentConfigs = [ { name: "client", condition: "react-client", ssr: false, outDir: join(userOptions.build.outDir, userOptions.build.static) }, { name: "ssr", condition: "react-client", ssr: true, outDir: join(userOptions.build.outDir, userOptions.build.client) }, { name: "server", condition: "react-server", ssr: true, outDir: join(userOptions.build.outDir, userOptions.build.server) } ]; const availableEnvironments = userOptions.availableEnvironments || ["client", "ssr", "server"]; const environmentConfigs = allEnvironmentConfigs.filter( (config2) => availableEnvironments.includes(config2.name) ); const environments = {}; const sortedEnvConfigs = environmentConfigs; for (const envConfig of sortedEnvConfigs) { const configResult = resolveUserConfig({ condition: envConfig.condition, config, configEnv, userOptions, autoDiscoveredFiles, ssr: envConfig.ssr }); if (configResult.type === "error") { const panicError = handleError({ error: configResult.error, logger, context: `createEnvironmentPlugin(${envConfig.name}Config)`, panicThreshold: userOptions.panicThreshold, critical: true }); if (panicError != null) { throw panicError; } else { throw new Error( `Cannot continue without ${envConfig.name} environment configuration` ); } } const userConfig = configResult.userConfig; if (userOptions.verbose) { logger?.info( `${envConfig.name} environment rollup inputs: ${JSON.stringify( userConfig.build.rollupOptions.input, null, 2 )}` ); logger?.info( `${envConfig.name} environment output preserveModulesRoot: ${JSON.stringify( userConfig.build.rollupOptions.output, null, 2 )}` ); } if (userOptions.verbose) { logger?.info( `${envConfig.name} userConfig.resolve: ${JSON.stringify( userConfig.resolve, null, 2 )}` ); logger?.info( `${envConfig.name} userConfig.build.rollupOptions.external: ${JSON.stringify( userConfig.build.rollupOptions.external, null, 2 )}` ); } const legacyBuild = userOptions.strategy?.legacyBuilder && !config?.builder; const implicitSsr = userOptions.strategy?.mainThreadCondition === "react-server" && userOptions.strategy?.legacyBuilder; const implicitViteBuildName = userOptions.strategy?.legacyBuilder && !config.build?.ssr ? "client" : "ssr"; const consumer = legacyBuild ? implicitViteBuildName === "ssr" ? "server" : "client" : envConfig.name === "server" || envConfig.name === "ssr" ? "server" : "client"; environments[envConfig.name] = { keepProcessEnv: envConfig.name === "server" ? true : false, define: userConfig.define, consumer, resolve: { ...userConfig.resolve, // IMPORTANT: Map externals from resolveUserConfig (rollupOptions.external) to Environment API format // In Environment API, externals go in resolve.external, not build.rollupOptions.external // For static builds (browser/ESM): don't externalize anything - bundle everything to avoid _virtual files // For client/server builds (SSR): externalize as configured external: (() => { const isStaticBuild = envConfig.name === "static" || !envConfig.ssr && envConfig.name === "client"; if (isStaticBuild) { return []; } return Array.isArray(userConfig.build.rollupOptions.external) ? userConfig.build.rollupOptions.external.filter( (item) => typeof item === "string" ) : []; })() }, build: { ...userConfig.build, ssr: envConfig.name === "server" ? true : legacyBuild ? implicitSsr : envConfig.name === "ssr", target: userConfig.build.target, // Remove externals from rollupOptions since they should be in resolve.external for Environment API rollupOptions: { ...userConfig.build.rollupOptions, external: void 0, // Remove external from rollupOptions, it's now in resolve.external // Set preserveModules in the output configuration, not at the top level output: (() => { const output = userConfig.build.rollupOptions.output; if (Array.isArray(output)) { const pluginOutput = output.find((o) => o && typeof o === "object" && "preserveModulesRoot" in o); if (pluginOutput) { return pluginOutput; } if (output.length > 0) { return output[0]; } } if (output && typeof output === "object" && !Array.isArray(output)) { const hasPreserveModulesRoot = "preserveModulesRoot" in output; if (hasPreserveModulesRoot) { return output; } else { const preserveModulesRootString = userOptions.build.preserveModulesRoot === false ? userOptions.moduleBase : void 0; return { ...output, preserveModulesRoot: preserveModulesRootString }; } } return output; })() } } }; } const esbuildJsxDevOverride = configEnv.command === "build" && config.esbuild !== false ? { esbuild: { ...config.esbuild, jsxDev: false } } : {}; return { root: userOptions.projectRoot, ...config, ...esbuildJsxDevOverride, environments, builder: { async buildApp(builder) { for (const environment of Object.values(builder.environments)) { await builder.build(environment); } await runDeferredStaticGeneration(); } } }; } }; return environmentPlugin; }; export { createEnvironmentPlugin }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlRW52aXJvbm1lbnRQbHVnaW4uanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BsdWdpbi9lbnZpcm9ubWVudHMvY3JlYXRlRW52aXJvbm1lbnRQbHVnaW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQbHVnaW4sIFVzZXJDb25maWcsIFZpdGVCdWlsZGVyIH0gZnJvbSBcInZpdGVcIjtcbmltcG9ydCB0eXBlIHsgVml0ZVBsdWdpbkZuIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5cbmltcG9ydCB7IHJlc29sdmVBdXRvRGlzY292ZXIgfSBmcm9tIFwiLi4vY29uZmlnL2F1dG9EaXNjb3Zlci9yZXNvbHZlQXV0b0Rpc2NvdmVyLmpzXCI7XG5pbXBvcnQgeyByZXNvbHZlVXNlckNvbmZpZyB9IGZyb20gXCIuLi9jb25maWcvcmVzb2x2ZVVzZXJDb25maWcuanNcIjtcbmltcG9ydCB7IHJlc29sdmVPcHRpb25zIH0gZnJvbSBcIi4uL2NvbmZpZy9yZXNvbHZlT3B0aW9ucy5qc1wiO1xuaW1wb3J0IHsgaGFuZGxlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvaGFuZGxlRXJyb3IuanNcIjtcbmltcG9ydCB7IGNyZWF0ZURlZmF1bHRNb2R1bGVJRCB9IGZyb20gXCIuLi9jb25maWcvY3JlYXRlTW9kdWxlSUQuanNcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gXCJ2aXRlXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgREVGQVVMVF9MT0FERVJfQ09ORklHIH0gZnJvbSBcIi4uL2NvbmZpZy9kZWZhdWx0cy5qc1wiO1xuaW1wb3J0IHsgcnVuRGVmZXJyZWRTdGF0aWNHZW5lcmF0aW9uIH0gZnJvbSBcIi4uL2J1bmRsZS9kZWZlcnJlZFN0YXRpY0dlbmVyYXRpb24uanNcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgcGx1Z2luIHRoYXQgZW5zdXJlcyBjb25zaXN0ZW50IGhhc2ggZ2VuZXJhdGlvbiBhY3Jvc3MgZW52aXJvbm1lbnRzXG4gKiBieSB1c2luZyB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUgY29udGVudCBhcyB0aGUgYmFzaXMgZm9yIGhhc2ggZ2VuZXJhdGlvbi5cblxuKi9cbi8vIE5vdGU6IFBhdGggbm9ybWFsaXphdGlvbiBzaG91bGQgYmUgaGFuZGxlZCBpbiB0aGUgZmlsZSBuYW1pbmcgZnVuY3Rpb25zLCBub3QgaW4gd3JpdGVCdW5kbGVcblxuLyoqXG4gKiBFbnZpcm9ubWVudCBDb25maWd1cmF0aW9uIFBsdWdpblxuICpcbiAqIFRoaXMgcGx1Z2luIGNvbmZpZ3VyZXMgVml0ZSBFbnZpcm9ubWVudCBBUEkgZW52aXJvbm1lbnRzIGZvciBSZWFjdCBTZXJ2ZXIgQ29tcG9uZW50cy5cbiAqIEl0J3Mgc2VwYXJhdGUgZnJvbSB0aGUgZW52IHBsdWdpbiB3aGljaCBoYW5kbGVzIHByb2Nlc3MgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICpcbiAqIEVudmlyb25tZW50IG1hcHBpbmc6XG4gKiAtIGNsaWVudCAoVml0ZSBjbGllbnQgPSBicm93c2VyKSDihpIgZGlzdC9jbGllbnQgKFJlYWN0IGNsaWVudCBjb21wb25lbnRzIC0gcmVhbCBpbXBsZW1lbnRhdGlvbnMpXG4gKiAtIHNzciAoVml0ZSBTU1IgPSBTU1Itc2FmZSkg4oaSIGRpc3Qvc3RhdGljIChTU1ItY29tcGF0aWJsZSBzdGF0aWMgZmlsZXMpXG4gKiAtIHNlcnZlciAoY3VzdG9tKSDihpIgZGlzdC9zZXJ2ZXIgKFJlYWN0IHNlcnZlciBjb21wb25lbnRzIHdpdGggcmVnaXN0ZXJDbGllbnRSZWZlcmVuY2UpXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVFbnZpcm9ubWVudFBsdWdpbjogVml0ZVBsdWdpbkZuID0gKG9wdGlvbnMpOiBQbHVnaW4gPT4ge1xuICBjb25zdCBlbnZpcm9ubWVudFBsdWdpbjogUGx1Z2luID0ge1xuICAgIG5hbWU6IFwidml0ZTpwbHVnaW4tcmVhY3Qtc2VydmVyL2Vudmlyb25tZW50c1wiLFxuICAgIGVuZm9yY2U6IFwicHJlXCIsXG5cbiAgICBhc3luYyBjb25maWcoY29uZmlnOiBVc2VyQ29uZmlnLCBjb25maWdFbnYpIHtcbiAgICAgIC8vIFJlc29sdmUgcGx1Z2luIG9wdGlvbnNcbiAgICAgIGNvbnN0IHJlc29sdmVkT3B0aW9uc1Jlc3VsdCA9IHJlc29sdmVPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgaWYgKHJlc29sdmVkT3B0aW9uc1Jlc3VsdC50eXBlID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgdGhyb3cgcmVzb2x2ZWRPcHRpb25zUmVzdWx0LmVycm9yO1xuICAgICAgfVxuICAgICAgY29uc3QgdXNlck9wdGlvbnMgPSByZXNvbHZlZE9wdGlvbnNSZXN1bHQudXNlck9wdGlvbnM7XG5cbiAgICAgIC8vIEFkZCB0cmFuc2Zvcm1lciBwbHVnaW5zIGF0IHRoZSBWaXRlIGxldmVsIHdpdGggcHJvcGVyIGVudmlyb25tZW50IGZpbHRlcmluZ1xuICAgICAgaWYgKCFjb25maWcucGx1Z2lucykge1xuICAgICAgICBjb25maWcucGx1Z2lucyA9IFtdO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3RlOiBUcmFuc2Zvcm1lciBpcyBub3cgYWRkZWQgdmlhIG9yY2hlc3RyYXRvciwgc28gc2tpcCBhZGRpbmcgaXQgaGVyZVxuICAgICAgLy8gdG8gYXZvaWQgZHVwbGljYXRlcyBhbmQgZW5zdXJlIHByb3BlciByZWdpc3RyYXRpb25cblxuICAgICAgLy8gTm90ZTogSGFzaCBjb29yZGluYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgc2VxdWVudGlhbCBidWlsZCBhcHByb2FjaFxuICAgICAgLy8gRWFjaCBlbnZpcm9ubWVudCB3aWxsIHVzZSB0aGUgbWFuaWZlc3QgZnJvbSB0aGUgcHJldmlvdXMgYnVpbGRcblxuICAgICAgLy8gU2V0IHVwIGxvZ2dlciBhbmQgbW9kdWxlSURcbiAgICAgIGNvbnN0IGxvZ2dlciA9IGNvbmZpZy5jdXN0b21Mb2dnZXIgfHwgY3JlYXRlTG9nZ2VyKCk7XG4gICAgICBpZiAodHlwZW9mIHVzZXJPcHRpb25zLm1vZHVsZUlEICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdXNlck9wdGlvbnMubW9kdWxlSUQgPSBjcmVhdGVEZWZhdWx0TW9kdWxlSUQoXG4gICAgICAgICAgdXNlck9wdGlvbnMsXG4gICAgICAgICAgY29uZmlnRW52LFxuICAgICAgICAgIHVzZXJPcHRpb25zLmxvYWRlcj8ubW9kZVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gQWx3YXlzIG92ZXJyaWRlIHRoZSBtb2R1bGVJRCBmdW5jdGlvbiB0byBlbnN1cmUgaXQgaGFzIHRoZSBmb3JUcmFuc2Zvcm1lciBsb2dpY1xuICAgICAgaWYgKCF1c2VyT3B0aW9ucy5sb2FkZXIpIHtcbiAgICAgICAgdXNlck9wdGlvbnMubG9hZGVyID0gREVGQVVMVF9MT0FERVJfQ09ORklHO1xuICAgICAgfVxuICAgICAgdXNlck9wdGlvbnMubG9hZGVyLm1vZHVsZUlEID0gY3JlYXRlRGVmYXVsdE1vZHVsZUlEKFxuICAgICAgICB1c2VyT3B0aW9ucyxcbiAgICAgICAgY29uZmlnRW52LFxuICAgICAgICB1c2VyT3B0aW9ucy5sb2FkZXI/Lm1vZGVcbiAgICAgICk7XG5cbiAgICAgIC8vIFJ1biBhdXRvLWRpc2NvdmVyeSBvbmNlIHRvIGdldCBhbGwgZmlsZXMgLSB3ZSBkb24ndCBuZWVkIHNlcGFyYXRlIGNhbGxzIHNpbmNlXG4gICAgICAvLyB0aGUgZmlsZSBkaXNjb3ZlcnkgcHJvY2VzcyBpcyBpZGVudGljYWwsIG9ubHkgdGhlIG9yZ2FuaXphdGlvbiBkaWZmZXJzXG4gICAgICBjb25zdCBhdXRvRGlzY292ZXJSZXN1bHQgPSBhd2FpdCByZXNvbHZlQXV0b0Rpc2NvdmVyKHtcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBjb25maWdFbnYsXG4gICAgICAgIHVzZXJPcHRpb25zLFxuICAgICAgICBsb2dnZXIsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGF1dG9EaXNjb3ZlclJlc3VsdC50eXBlID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgY29uc3QgcGFuaWNFcnJvciA9IGhhbmRsZUVycm9yKHtcbiAgICAgICAgICBlcnJvcjogYXV0b0Rpc2NvdmVyUmVzdWx0LmVycm9yLFxuICAgICAgICAgIGxvZ2dlcixcbiAgICAgICAgICBjb250ZXh0OiBcImNyZWF0ZUVudmlyb25tZW50UGx1Z2luKGF1dG9EaXNjb3ZlcilcIixcbiAgICAgICAgICBwYW5pY1RocmVzaG9sZDogdXNlck9wdGlvbnMucGFuaWNUaHJlc2hvbGQsXG4gICAgICAgICAgY3JpdGljYWw6IHRydWUsIC8vIEF1dG8tZGlzY292ZXJ5IGlzIGNyaXRpY2FsIGZvciBlbnZpcm9ubWVudCBzZXR1cFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHBhbmljRXJyb3IgIT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IHBhbmljRXJyb3I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgaGFuZGxlRXJyb3IgcmV0dXJucyBudWxsIGJ1dCB0aGlzIGlzIGNyaXRpY2FsLCB3ZSBjYW4ndCBjb250aW51ZVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb250aW51ZSB3aXRob3V0IGF1dG8tZGlzY292ZXJ5XCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB0aGUgYXV0by1kaXNjb3ZlcmVkIGZpbGVzIChzYWZlIHRvIGFjY2VzcyBzaW5jZSB3ZSBjaGVja2VkIGZvciBlcnJvcnMgYWJvdmUpXG4gICAgICBjb25zdCBhdXRvRGlzY292ZXJlZEZpbGVzID0gYXV0b0Rpc2NvdmVyUmVzdWx0LmF1dG9EaXNjb3ZlcmVkRmlsZXMhO1xuXG4gICAgICAvLyBEZWZpbmUgZW52aXJvbm1lbnQgY29uZmlndXJhdGlvbnNcbiAgICAgIGNvbnN0IGFsbEVudmlyb25tZW50Q29uZmlncyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiY2xpZW50XCIsXG4gICAgICAgICAgY29uZGl0aW9uOiBcInJlYWN0LWNsaWVudFwiIGFzIGNvbnN0LFxuICAgICAgICAgIHNzcjogZmFsc2UsXG4gICAgICAgICAgb3V0RGlyOiBqb2luKHVzZXJPcHRpb25zLmJ1aWxkLm91dERpciwgdXNlck9wdGlvbnMuYnVpbGQuc3RhdGljKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwic3NyXCIsXG4gICAgICAgICAgY29uZGl0aW9uOiBcInJlYWN0LWNsaWVudFwiIGFzIGNvbnN0LFxuICAgICAgICAgIHNzcjogdHJ1ZSxcbiAgICAgICAgICBvdXREaXI6IGpvaW4odXNlck9wdGlvbnMuYnVpbGQub3V0RGlyLCB1c2VyT3B0aW9ucy5idWlsZC5jbGllbnQpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJzZXJ2ZXJcIixcbiAgICAgICAgICBjb25kaXRpb246IFwicmVhY3Qtc2VydmVyXCIgYXMgY29uc3QsXG4gICAgICAgICAgc3NyOiB0cnVlLFxuICAgICAgICAgIG91dERpcjogam9pbih1c2VyT3B0aW9ucy5idWlsZC5vdXREaXIsIHVzZXJPcHRpb25zLmJ1aWxkLnNlcnZlciksXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBGaWx0ZXIgZW52aXJvbm1lbnRzIGJhc2VkIG9uIGF2YWlsYWJsZUVudmlyb25tZW50cyBmcm9tIG9yY2hlc3RyYXRvclxuXG4gICAgICBjb25zdCBhdmFpbGFibGVFbnZpcm9ubWVudHMgPSAodXNlck9wdGlvbnMgYXMgYW55KVxuICAgICAgICAuYXZhaWxhYmxlRW52aXJvbm1lbnRzIHx8IFtcImNsaWVudFwiLCBcInNzclwiLCBcInNlcnZlclwiXTtcblxuICAgICAgY29uc3QgZW52aXJvbm1lbnRDb25maWdzID0gYWxsRW52aXJvbm1lbnRDb25maWdzLmZpbHRlcigoY29uZmlnKSA9PlxuICAgICAgICBhdmFpbGFibGVFbnZpcm9ubWVudHMuaW5jbHVkZXMoY29uZmlnLm5hbWUpXG4gICAgICApO1xuXG5cbiAgICAgIC8vIFJlc29sdmUgYWxsIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb25zIHVzaW5nIHJlc29sdmVVc2VyQ29uZmlnXG4gICAgICBjb25zdCBlbnZpcm9ubWVudHM6IFJlY29yZDxzdHJpbmcsIGltcG9ydChcInZpdGVcIikuRW52aXJvbm1lbnRPcHRpb25zPiA9XG4gICAgICAgIHt9O1xuXG4gICAgICAvLyBTb3J0IGVudmlyb25tZW50cyB0byBwcm9jZXNzIHN0YXRpYyBmaXJzdCAodG8gZXN0YWJsaXNoIGhhc2hlcylcbiAgICAgIC8vIFVzZSB0aGUgZW52aXJvbm1lbnQgY29uZmlncyBhcy1pc1xuICAgICAgY29uc3Qgc29ydGVkRW52Q29uZmlncyA9IGVudmlyb25tZW50Q29uZmlncztcblxuICAgICAgZm9yIChjb25zdCBlbnZDb25maWcgb2Ygc29ydGVkRW52Q29uZmlncykge1xuICAgICAgICBjb25zdCBjb25maWdSZXN1bHQgPSByZXNvbHZlVXNlckNvbmZpZyh7XG4gICAgICAgICAgY29uZGl0aW9uOiBlbnZDb25maWcuY29uZGl0aW9uLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICBjb25maWdFbnYsXG4gICAgICAgICAgdXNlck9wdGlvbnMsXG4gICAgICAgICAgYXV0b0Rpc2NvdmVyZWRGaWxlcyxcbiAgICAgICAgICBzc3I6IGVudkNvbmZpZy5zc3IsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChjb25maWdSZXN1bHQudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgY29uc3QgcGFuaWNFcnJvciA9IGhhbmRsZUVycm9yKHtcbiAgICAgICAgICAgIGVycm9yOiBjb25maWdSZXN1bHQuZXJyb3IsXG4gICAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgICBjb250ZXh0OiBgY3JlYXRlRW52aXJvbm1lbnRQbHVnaW4oJHtlbnZDb25maWcubmFtZX1Db25maWcpYCxcbiAgICAgICAgICAgIHBhbmljVGhyZXNob2xkOiB1c2VyT3B0aW9ucy5wYW5pY1RocmVzaG9sZCxcbiAgICAgICAgICAgIGNyaXRpY2FsOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChwYW5pY0Vycm9yICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IHBhbmljRXJyb3I7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYENhbm5vdCBjb250aW51ZSB3aXRob3V0ICR7ZW52Q29uZmlnLm5hbWV9IGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb25gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcCB0aGUgcmVzb2x2ZWQgdXNlciBjb25maWcgdG8gRW52aXJvbm1lbnQgQVBJIGNvbXBhdGlibGUgb3B0aW9uc1xuICAgICAgICBjb25zdCB1c2VyQ29uZmlnID0gY29uZmlnUmVzdWx0LnVzZXJDb25maWc7XG5cbiAgICAgICAgLy8gTG9nIHRoZSByb2xsdXAgaW5wdXRzIGZvciB0aGlzIGVudmlyb25tZW50IChvbmx5IGluIHZlcmJvc2UgbW9kZSlcbiAgICAgICAgaWYgKHVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXI/LmluZm8oXG4gICAgICAgICAgICBgJHtlbnZDb25maWcubmFtZX0gZW52aXJvbm1lbnQgcm9sbHVwIGlucHV0czogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgdXNlckNvbmZpZy5idWlsZC5yb2xsdXBPcHRpb25zLmlucHV0LFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAyXG4gICAgICAgICAgICApfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgIGAke1xuICAgICAgICAgICAgICBlbnZDb25maWcubmFtZVxuICAgICAgICAgICAgfSBlbnZpcm9ubWVudCBvdXRwdXQgcHJlc2VydmVNb2R1bGVzUm9vdDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgdXNlckNvbmZpZy5idWlsZC5yb2xsdXBPcHRpb25zLm91dHB1dCxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgKX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlYnVnOiBMb2cgd2hhdCByZXNvbHZlVXNlckNvbmZpZyBwcm92aWRlZFxuICAgICAgICBpZiAodXNlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgIGAke2VudkNvbmZpZy5uYW1lfSB1c2VyQ29uZmlnLnJlc29sdmU6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIHVzZXJDb25maWcucmVzb2x2ZSxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgKX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2dnZXI/LmluZm8oXG4gICAgICAgICAgICBgJHtcbiAgICAgICAgICAgICAgZW52Q29uZmlnLm5hbWVcbiAgICAgICAgICAgIH0gdXNlckNvbmZpZy5idWlsZC5yb2xsdXBPcHRpb25zLmV4dGVybmFsOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICB1c2VyQ29uZmlnLmJ1aWxkLnJvbGx1cE9wdGlvbnMuZXh0ZXJuYWwsXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICl9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGV0ZWN0IGlmIGxlZ2FjeSBidWlsZCBvciBub3RcbiAgICAgICAgY29uc3QgbGVnYWN5QnVpbGQgPSB1c2VyT3B0aW9ucy5zdHJhdGVneT8ubGVnYWN5QnVpbGRlciAmJiAhY29uZmlnPy5idWlsZGVyO1xuICAgICAgICBjb25zdCBpbXBsaWNpdFNzciA9XG4gICAgICAgICAgdXNlck9wdGlvbnMuc3RyYXRlZ3k/Lm1haW5UaHJlYWRDb25kaXRpb24gPT09IFwicmVhY3Qtc2VydmVyXCIgJiZcbiAgICAgICAgICB1c2VyT3B0aW9ucy5zdHJhdGVneT8ubGVnYWN5QnVpbGRlcjtcbiAgICAgICAgLy8gdGhpcyBmb2xsb3dzIHZpdGUncyBsb2dpYyBmb3IgbGVnYWN5IGJ1aWxkc1xuICAgICAgICBjb25zdCBpbXBsaWNpdFZpdGVCdWlsZE5hbWUgPVxuICAgICAgICAgIHVzZXJPcHRpb25zLnN0cmF0ZWd5Py5sZWdhY3lCdWlsZGVyICYmICFjb25maWcuYnVpbGQ/LnNzclxuICAgICAgICAgICAgPyBcImNsaWVudFwiXG4gICAgICAgICAgICA6IFwic3NyXCI7XG4gICAgICAgIGNvbnN0IGNvbnN1bWVyID0gbGVnYWN5QnVpbGRcbiAgICAgICAgICA/IGltcGxpY2l0Vml0ZUJ1aWxkTmFtZSA9PT0gXCJzc3JcIlxuICAgICAgICAgICAgPyBcInNlcnZlclwiXG4gICAgICAgICAgICA6IFwiY2xpZW50XCJcbiAgICAgICAgICA6IGVudkNvbmZpZy5uYW1lID09PSBcInNlcnZlclwiIHx8IGVudkNvbmZpZy5uYW1lID09PSBcInNzclwiXG4gICAgICAgICAgPyBcInNlcnZlclwiXG4gICAgICAgICAgOiBcImNsaWVudFwiO1xuXG4gICAgICAgIC8vIE5vdGU6IFBhdGggbm9ybWFsaXphdGlvbiBzaG91bGQgYmUgaGFuZGxlZCBpbiB0aGUgZmlsZSBuYW1pbmcgZnVuY3Rpb25zXG4gICAgICAgIGVudmlyb25tZW50c1tlbnZDb25maWcubmFtZV0gPSB7XG4gICAgICAgICAga2VlcFByb2Nlc3NFbnY6IGVudkNvbmZpZy5uYW1lID09PSBcInNlcnZlclwiID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgIGRlZmluZTogdXNlckNvbmZpZy5kZWZpbmUsXG4gICAgICAgICAgY29uc3VtZXI6IGNvbnN1bWVyLFxuICAgICAgICAgIHJlc29sdmU6IHtcbiAgICAgICAgICAgIC4uLnVzZXJDb25maWcucmVzb2x2ZSxcbiAgICAgICAgICAgIC8vIElNUE9SVEFOVDogTWFwIGV4dGVybmFscyBmcm9tIHJlc29sdmVVc2VyQ29uZmlnIChyb2xsdXBPcHRpb25zLmV4dGVybmFsKSB0byBFbnZpcm9ubWVudCBBUEkgZm9ybWF0XG4gICAgICAgICAgICAvLyBJbiBFbnZpcm9ubWVudCBBUEksIGV4dGVybmFscyBnbyBpbiByZXNvbHZlLmV4dGVybmFsLCBub3QgYnVpbGQucm9sbHVwT3B0aW9ucy5leHRlcm5hbFxuICAgICAgICAgICAgLy8gRm9yIHN0YXRpYyBidWlsZHMgKGJyb3dzZXIvRVNNKTogZG9uJ3QgZXh0ZXJuYWxpemUgYW55dGhpbmcgLSBidW5kbGUgZXZlcnl0aGluZyB0byBhdm9pZCBfdmlydHVhbCBmaWxlc1xuICAgICAgICAgICAgLy8gRm9yIGNsaWVudC9zZXJ2ZXIgYnVpbGRzIChTU1IpOiBleHRlcm5hbGl6ZSBhcyBjb25maWd1cmVkXG4gICAgICAgICAgICBleHRlcm5hbDogKCgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaXNTdGF0aWNCdWlsZCA9IGVudkNvbmZpZy5uYW1lID09PSBcInN0YXRpY1wiIHx8ICghZW52Q29uZmlnLnNzciAmJiBlbnZDb25maWcubmFtZSA9PT0gXCJjbGllbnRcIik7XG4gICAgICAgICAgICAgIGlmIChpc1N0YXRpY0J1aWxkKSB7XG4gICAgICAgICAgICAgICAgLy8gRm9yIHN0YXRpYyBidWlsZHMsIGRvbid0IGV4dGVybmFsaXplIGFueXRoaW5nIChidW5kbGUgZXZlcnl0aGluZylcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gRm9yIFNTUiBidWlsZHMsIHVzZSBjb25maWd1cmVkIGV4dGVybmFsc1xuICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh1c2VyQ29uZmlnLmJ1aWxkLnJvbGx1cE9wdGlvbnMuZXh0ZXJuYWwpXG4gICAgICAgICAgICAgICAgPyB1c2VyQ29uZmlnLmJ1aWxkLnJvbGx1cE9wdGlvbnMuZXh0ZXJuYWwuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgICAgIH0pKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBidWlsZDoge1xuICAgICAgICAgICAgLi4udXNlckNvbmZpZy5idWlsZCxcbiAgICAgICAgICAgIHNzcjpcbiAgICAgICAgICAgICAgZW52Q29uZmlnLm5hbWUgPT09IFwic2VydmVyXCJcbiAgICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgICA6IGxlZ2FjeUJ1aWxkXG4gICAgICAgICAgICAgICAgPyBpbXBsaWNpdFNzclxuICAgICAgICAgICAgICAgIDogZW52Q29uZmlnLm5hbWUgPT09IFwic3NyXCIsXG4gICAgICAgICAgICB0YXJnZXQ6IHVzZXJDb25maWcuYnVpbGQudGFyZ2V0LFxuICAgICAgICAgICAgLy8gUmVtb3ZlIGV4dGVybmFscyBmcm9tIHJvbGx1cE9wdGlvbnMgc2luY2UgdGhleSBzaG91bGQgYmUgaW4gcmVzb2x2ZS5leHRlcm5hbCBmb3IgRW52aXJvbm1lbnQgQVBJXG4gICAgICAgICAgICByb2xsdXBPcHRpb25zOiB7XG4gICAgICAgICAgICAgIC4uLnVzZXJDb25maWcuYnVpbGQucm9sbHVwT3B0aW9ucyxcbiAgICAgICAgICAgICAgZXh0ZXJuYWw6IHVuZGVmaW5lZCwgLy8gUmVtb3ZlIGV4dGVybmFsIGZyb20gcm9sbHVwT3B0aW9ucywgaXQncyBub3cgaW4gcmVzb2x2ZS5leHRlcm5hbFxuICAgICAgICAgICAgICAvLyBTZXQgcHJlc2VydmVNb2R1bGVzIGluIHRoZSBvdXRwdXQgY29uZmlndXJhdGlvbiwgbm90IGF0IHRoZSB0b3AgbGV2ZWxcbiAgICAgICAgICAgICAgb3V0cHV0OiAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHVzZXJDb25maWcuYnVpbGQucm9sbHVwT3B0aW9ucy5vdXRwdXQ7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIGFycmF5IG91dHB1dCBjb25maWd1cmF0aW9uIC0gZXh0cmFjdCB0aGUgcGx1Z2luIG91dHB1dCB0aGF0IGNvbnRhaW5zIHByZXNlcnZlTW9kdWxlc1Jvb3RcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvdXRwdXQpKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwbHVnaW5PdXRwdXQgPSBvdXRwdXQuZmluZChvID0+IG8gJiYgdHlwZW9mIG8gPT09ICdvYmplY3QnICYmICdwcmVzZXJ2ZU1vZHVsZXNSb290JyBpbiBvKTtcbiAgICAgICAgICAgICAgICAgIGlmIChwbHVnaW5PdXRwdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsdWdpbk91dHB1dDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8vIElmIG5vIHBsdWdpbk91dHB1dCBmb3VuZCwgdXNlIHRoZSBmaXJzdCBvdXRwdXQgY29uZmlndXJhdGlvblxuICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXRbMF07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEVuc3VyZSBwcmVzZXJ2ZU1vZHVsZXNSb290IGlzIGFsd2F5cyBwcmVzZW50IGluIHRoZSBvdXRwdXQgY29uZmlndXJhdGlvblxuICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgJiYgdHlwZW9mIG91dHB1dCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkob3V0cHV0KSkge1xuICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3BlcnR5IGV4aXN0cyBpbiB0aGUgb2JqZWN0IChub3QganVzdCBjaGVja2luZyB0aGUgdmFsdWUpXG4gICAgICAgICAgICAgICAgICBjb25zdCBoYXNQcmVzZXJ2ZU1vZHVsZXNSb290ID0gJ3ByZXNlcnZlTW9kdWxlc1Jvb3QnIGluIG91dHB1dDtcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgaWYgKGhhc1ByZXNlcnZlTW9kdWxlc1Jvb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJvcGVydHkgZXhpc3RzLCBwcmVzZXJ2ZSB0aGUgcHJlc2VydmVNb2R1bGVzIHZhbHVlIGZyb20gdGhlIG91dHB1dCAoZG9uJ3Qgb3ZlcnJpZGUgaXQpXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgY3JpdGljYWwgZm9yIHN0YXRpYyBidWlsZHMgd2hlcmUgcHJlc2VydmVNb2R1bGVzOiBmYWxzZSBpcyBzZXRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsgLy8gUmV0dXJuIGFzLWlzLCBwcmVzZXJ2ZU1vZHVsZXMgaXMgYWxyZWFkeSBzZXQgY29ycmVjdGx5XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBQcm9wZXJ0eSBtaXNzaW5nLCBhZGQgaXQgYmFzZWQgb24gdXNlciBvcHRpb25zXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXNlcnZlTW9kdWxlc1Jvb3RTdHJpbmcgPSB1c2VyT3B0aW9ucy5idWlsZC5wcmVzZXJ2ZU1vZHVsZXNSb290ID09PSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgID8gdXNlck9wdGlvbnMubW9kdWxlQmFzZVxuICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5vdXRwdXQsIHByZXNlcnZlTW9kdWxlc1Jvb3Q6IHByZXNlcnZlTW9kdWxlc1Jvb3RTdHJpbmcgfTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yY2UgdGhlIFBST0RVQ1RJT04gSlNYIHRyYW5zZm9ybSBmb3IgZXZlcnkgYnVpbGQgZW52aXJvbm1lbnQuXG4gICAgICAvL1xuICAgICAgLy8gVW5kZXIgYSBkZXYtbW9kZSBidWlsZCAoYE5PREVfRU5WPWRldmVsb3BtZW50IOKApiB2aXRlIGJ1aWxkIC0tbW9kZVxuICAgICAgLy8gZGV2ZWxvcG1lbnRgKSBlc2J1aWxkJ3MgYXV0b21hdGljLXJ1bnRpbWUgSlNYIHRyYW5zZm9ybSBlbWl0cyB0aGVcbiAgICAgIC8vIGRldiBjYWxsIHNoYXBlIGBqc3hERVYodHlwZSwgcHJvcHMsIGtleSwgaXNTdGF0aWNDaGlsZHJlbiwgc291cmNlLFxuICAgICAgLy8gc2VsZilgLiBlc2J1aWxkIHJlbmRlcnMgdGhlIHRyYWlsaW5nIGBzZWxmYCBhcmd1bWVudCBhcyBhIGJhcmVcbiAgICAgIC8vIGBtb2R1bGVgIHJlZmVyZW5jZSB3aGVuIGl0IGNhbid0IHByb3ZlIHRoZSBmaWxlIGlzIEVTTSBhdFxuICAgICAgLy8gcGVyLWZpbGUgdHJhbnNmb3JtIHRpbWUuIFRoZSB2cHJzIHNlcnZlciBidW5kbGUgaXMgcHVyZSBFU01cbiAgICAgIC8vIChgZGlzdC9zZXJ2ZXIvKi5qc2ApLCBzbyBhdCBTU0ctcHJlcmVuZGVyIHRpbWUgdGhhdCBgbW9kdWxlYFxuICAgICAgLy8gaWRlbnRpZmllciBpcyB1bmRlZmluZWQgYW5kIHRoZSB2ZXJ5IGZpcnN0IHNlcnZlciBjb21wb25lbnQgdG9cbiAgICAgIC8vIHJlbmRlciAoZS5nLiB0aGUgYnVpbHQtaW4gYEh0bWxgIGNvbXBvbmVudCkgdGhyb3dzXG4gICAgICAvLyBgUmVmZXJlbmNlRXJyb3I6IG1vZHVsZSBpcyBub3QgZGVmaW5lZGAuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHNlcnZlciBidW5kbGUgbmV2ZXIgY29uc3VtZXMganN4REVWJ3MgY2xpZW50LXdhcm5pbmdcbiAgICAgIC8vIGBzb3VyY2VgL2BzZWxmYCBpbmZvLCBzbyBkcm9wcGluZyB0byB0aGUgcHJvZHVjdGlvbiB0cmFuc2Zvcm1cbiAgICAgIC8vIChganN4YC9ganN4c2AsIG5vIGBzZWxmYCBhcmcpIGlzIGEgcHVyZSB3aW4gZm9yIGJ1aWxkczpcbiAgICAgIC8vICAgLSBJdCBvbmx5IGNoYW5nZXMgdGhlIEpTWCAqY2FsbCBzaGFwZSosIE5PVCB3aGljaCBSZWFjdCBidWlsZCBpc1xuICAgICAgLy8gICAgIGJ1bmRsZWQg4oCUIGBOT0RFX0VOVj1kZXZlbG9wbWVudGAgc3RpbGwgcmVzb2x2ZXMgdGhlIGRldmVsb3BtZW50XG4gICAgICAvLyAgICAgKG5vbi1taW5pZmllZCkgUmVhY3QsIHNvIGRldiBidWlsZHMga2VlcCBzdXJmYWNpbmcgdGhlIGVycm9yc1xuICAgICAgLy8gICAgIHByb2R1Y3Rpb24gbWluaWZpZXMgYXdheS5cbiAgICAgIC8vICAgLSBQcm9kdWN0aW9uIGJ1aWxkcyBhbHJlYWR5IHVzZSB0aGUgcHJvZHVjdGlvbiBKU1ggdHJhbnNmb3JtXG4gICAgICAvLyAgICAgKGVzYnVpbGQgb25seSBlbWl0cyBqc3hERVYgaW4gZGV2KSwgc28gdGhpcyBpcyBhIG5vLW9wIHRoZXJlLlxuICAgICAgLy8gICAtIFNjb3BlZCB0byBgY29tbWFuZCA9PT0gXCJidWlsZFwiYCwgc28gdGhlIGRldiBTRVJWRVIgLyBjbGllbnRcbiAgICAgIC8vICAgICBGYXN0IFJlZnJlc2ggcGF0aCAoYGNvbW1hbmQgPT09IFwic2VydmVcImApIGlzIHVudG91Y2hlZC5cbiAgICAgIGNvbnN0IGVzYnVpbGRKc3hEZXZPdmVycmlkZSA9XG4gICAgICAgIGNvbmZpZ0Vudi5jb21tYW5kID09PSBcImJ1aWxkXCIgJiYgY29uZmlnLmVzYnVpbGQgIT09IGZhbHNlXG4gICAgICAgICAgPyB7IGVzYnVpbGQ6IHsgLi4uY29uZmlnLmVzYnVpbGQsIGpzeERldjogZmFsc2UgfSB9XG4gICAgICAgICAgOiB7fTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBjb25maWd1cmF0aW9uIHdpdGggYWxsIGVudmlyb25tZW50c1xuICAgICAgLy8gQnVpbGQgb3JkZXI6IGNsaWVudCDihpIgc3NyIOKGkiBzZXJ2ZXIg4oaSIHN0YXRpYyBnZW5lcmF0aW9uIChzdGVwIDQpXG4gICAgICAvLyBTZXJ2ZXIgYnVpbGQgcnVucyBMQVNUIHNvIGRpc3QvY2xpZW50IGV4aXN0cyB3aGVuIEhUTUwgcmVuZGVyaW5nIHJlZmVyZW5jZXMgY2xpZW50IGNvbXBvbmVudHNcbiAgICAgIC8vIFN0YXRpYyBnZW5lcmF0aW9uIGlzIGRlZmVycmVkIHRvIHJ1biBhZnRlciBBTEwgZW52aXJvbm1lbnRzIGNvbXBsZXRlIChuZWVkcyBzZXJ2ZXIgbWFuaWZlc3QpXG4gICAgICByZXR1cm4ge1xuICAgICAgICByb290OiB1c2VyT3B0aW9ucy5wcm9qZWN0Um9vdCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAuLi5lc2J1aWxkSnN4RGV2T3ZlcnJpZGUsXG4gICAgICAgIGVudmlyb25tZW50cyxcbiAgICAgICAgYnVpbGRlcjoge1xuICAgICAgICAgIGFzeW5jIGJ1aWxkQXBwKGJ1aWxkZXI6IFZpdGVCdWlsZGVyKSB7XG4gICAgICAgICAgICAvLyBCdWlsZCBhbGwgZW52aXJvbm1lbnRzIGluIGRlZmluaXRpb24gb3JkZXJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZW52aXJvbm1lbnQgb2YgT2JqZWN0LnZhbHVlcyhidWlsZGVyLmVudmlyb25tZW50cykpIHtcbiAgICAgICAgICAgICAgYXdhaXQgYnVpbGRlci5idWlsZChlbnZpcm9ubWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTdGVwIDQ6IFJ1biBkZWZlcnJlZCBzdGF0aWMgZ2VuZXJhdGlvbiBub3cgdGhhdCBhbGwgbWFuaWZlc3RzIGFyZSBhdmFpbGFibGVcbiAgICAgICAgICAgIGF3YWl0IHJ1bkRlZmVycmVkU3RhdGljR2VuZXJhdGlvbigpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIGVudmlyb25tZW50UGx1Z2luO1xufTtcbiJdLCJuYW1lcyI6WyJjb25maWciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQStCYSxNQUFBLHVCQUFBLEdBQXdDLENBQUMsT0FBb0IsS0FBQTtBQUN4RSxFQUFBLE1BQU0saUJBQTRCLEdBQUE7QUFBQSxJQUNoQyxJQUFNLEVBQUEsdUNBQUE7QUFBQSxJQUNOLE9BQVMsRUFBQSxLQUFBO0FBQUEsSUFFVCxNQUFNLE1BQU8sQ0FBQSxNQUFBLEVBQW9CLFNBQVcsRUFBQTtBQUUxQyxNQUFNLE1BQUEscUJBQUEsR0FBd0IsZUFBZSxPQUFPLENBQUE7QUFDcEQsTUFBSSxJQUFBLHFCQUFBLENBQXNCLFNBQVMsT0FBUyxFQUFBO0FBQzFDLFFBQUEsTUFBTSxxQkFBc0IsQ0FBQSxLQUFBO0FBQUE7QUFFOUIsTUFBQSxNQUFNLGNBQWMscUJBQXNCLENBQUEsV0FBQTtBQUcxQyxNQUFJLElBQUEsQ0FBQyxPQUFPLE9BQVMsRUFBQTtBQUNuQixRQUFBLE1BQUEsQ0FBTyxVQUFVLEVBQUM7QUFBQTtBQVVwQixNQUFNLE1BQUEsTUFBQSxHQUFTLE1BQU8sQ0FBQSxZQUFBLElBQWdCLFlBQWEsRUFBQTtBQUNuRCxNQUFJLElBQUEsT0FBTyxXQUFZLENBQUEsUUFBQSxLQUFhLFVBQVksRUFBQTtBQUM5QyxRQUFBLFdBQUEsQ0FBWSxRQUFXLEdBQUEscUJBQUE7QUFBQSxVQUNyQixXQUFBO0FBQUEsVUFDQSxTQUFBO0FBQUEsVUFDQSxZQUFZLE1BQVEsRUFBQTtBQUFBLFNBQ3RCO0FBQUE7QUFHRixNQUFJLElBQUEsQ0FB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