UNPKG

vite-plugin-react-server

Version:
159 lines (156 loc) 22.1 kB
/** * vite-plugin-react-server * Copyright (c) Nico Brinkkemper * MIT License */ import { createWorker } from '../worker/createWorker.js'; import { cleanupWorker } from '../helpers/workerCleanup.js'; import { serializedDevServerConfig } from '../helpers/serializeUserOptions.js'; import { MessageChannel } from 'node:worker_threads'; import { DEFAULT_CONFIG } from '../config/defaults.js'; import { React } from '../vendor/vendor.client.js'; import { getNodeEnv } from '../config/getNodeEnv.js'; import { handleError } from '../error/handleError.js'; import { setMaxListenersOnPort, unrefPort } from '../stream/setMaxListeners.js'; import { attachRunnerFetchHandler } from './handleRunnerFetch.server.js'; let currentWorker = null; let isRestarting = false; let currentHmrChannel = null; let currentMessageHandler = null; let currentErrorHandler = null; let currentRunnerChannel = null; let currentRunnerDetach = null; const restartWorker = async function _restartWorker({ server, autoDiscoveredFiles, userOptions, configEnv, hmrChannel }) { if (isRestarting) { while (isRestarting) { await new Promise((resolve) => setTimeout(resolve, 10)); } return currentWorker; } isRestarting = true; try { cleanupWorker(currentWorker); currentWorker = null; if (currentHmrChannel) { currentHmrChannel.port1.close(); currentHmrChannel.port2.close(); currentHmrChannel = null; } if (currentRunnerDetach) { currentRunnerDetach(); currentRunnerDetach = null; } if (currentRunnerChannel) { currentRunnerChannel.port1.close(); currentRunnerChannel.port2.close(); currentRunnerChannel = null; } if (currentMessageHandler) { hmrChannel.port1.removeEventListener("message", currentMessageHandler); currentMessageHandler = null; } if (currentErrorHandler) { hmrChannel.port1.removeEventListener("messageerror", currentErrorHandler); currentErrorHandler = null; } const routeCount = autoDiscoveredFiles.urlMap.size; const hmrBuffer = 20; const maxListeners = routeCount + hmrBuffer; const workerHmrChannel = new MessageChannel(); currentHmrChannel = workerHmrChannel; setMaxListenersOnPort(workerHmrChannel.port1, maxListeners); setMaxListenersOnPort(workerHmrChannel.port2, maxListeners); unrefPort(workerHmrChannel.port1); unrefPort(workerHmrChannel.port2); const messageHandler = (event) => { try { workerHmrChannel.port1.postMessage(event.data); } catch (error) { if (userOptions.verbose) { server.config.logger.info(`[restartWorker] HMR message error: ${error}`); } } }; const errorHandler = (error) => { if (userOptions.verbose) { server.config.logger.warn(`[restartWorker] HMR message error: ${error}`); } }; currentMessageHandler = messageHandler; currentErrorHandler = errorHandler; setMaxListenersOnPort(hmrChannel.port1, maxListeners); hmrChannel.port1.addEventListener("message", messageHandler); hmrChannel.port1.addEventListener("messageerror", errorHandler); if (userOptions.verbose) { server.config.logger.info(`[restartWorker] userOptions.projectRoot: ${userOptions.projectRoot}`); server.config.logger.info(`[restartWorker] server.config.root: ${server.config.root}`); server.config.logger.info(`[restartWorker] Using projectRoot: ${userOptions.projectRoot || server.config.root}`); server.config.logger.info(`[restartWorker] configEnv.command: ${configEnv?.command}`); server.config.logger.info(`[restartWorker] configEnv.mode: ${configEnv?.mode}`); } const runnerChannel = new MessageChannel(); currentRunnerChannel = runnerChannel; setMaxListenersOnPort(runnerChannel.port1, maxListeners); setMaxListenersOnPort(runnerChannel.port2, maxListeners); unrefPort(runnerChannel.port1); unrefPort(runnerChannel.port2); const fetchHandlerLogger = server.config.customLogger || server.config.logger; currentRunnerDetach = attachRunnerFetchHandler( runnerChannel.port1, server, fetchHandlerLogger, Boolean(userOptions.verbose) ); const runnerPortForWorker = runnerChannel.port2; const transferList = [workerHmrChannel.port2, runnerChannel.port2]; const workerResult = await createWorker({ projectRoot: userOptions.projectRoot || server.config.root, workerPath: userOptions.rscWorkerPath, reverseCondition: "react-server", currentCondition: "react-client", maxListeners, envPrefix: typeof server.config.envPrefix === "string" ? server.config.envPrefix : Array.isArray(server.config.envPrefix) ? server.config.envPrefix[0] : DEFAULT_CONFIG.ENV_PREFIX, workerData: { userOptions, resolvedConfig: serializedDevServerConfig(server.config), configEnv, reactVersion: React.version, id: "worker/rsc", serverManifest: {}, // staticManifest removed from AutoDiscoveredFiles runnerPort: runnerPortForWorker }, transferList }); if (workerResult.type === "success") { currentWorker = workerResult.worker; if (userOptions.verbose) server.config.logger.info( `[react-client] Set max listeners to ${maxListeners} for ${routeCount} routes` ); } else if (workerResult.type === "error") { const panicError = handleError({ error: workerResult.error, logger: server.config.customLogger || server.config.logger, mode: getNodeEnv(server.config.mode), panicThreshold: userOptions.panicThreshold, critical: false, context: "restartWorker" }); if (panicError != null) { throw panicError; } } } finally { isRestarting = false; } return currentWorker; }; export { restartWorker }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdGFydFdvcmtlci5jbGllbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BsdWdpbi9kZXYtc2VydmVyL3Jlc3RhcnRXb3JrZXIuY2xpZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZVdvcmtlciB9IGZyb20gXCIuLi93b3JrZXIvY3JlYXRlV29ya2VyLmpzXCI7XG5pbXBvcnQgeyBjbGVhbnVwV29ya2VyIH0gZnJvbSBcIi4uL2hlbHBlcnMvd29ya2VyQ2xlYW51cC5qc1wiO1xuaW1wb3J0IHsgc2VyaWFsaXplZERldlNlcnZlckNvbmZpZyB9IGZyb20gXCIuLi9oZWxwZXJzL3NlcmlhbGl6ZVVzZXJPcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBNZXNzYWdlQ2hhbm5lbCwgdHlwZSBXb3JrZXIgfSBmcm9tIFwibm9kZTp3b3JrZXJfdGhyZWFkc1wiO1xuaW1wb3J0IHsgREVGQVVMVF9DT05GSUcgfSBmcm9tIFwiLi4vY29uZmlnL2RlZmF1bHRzLmpzXCI7XG5pbXBvcnQgeyBSZWFjdCB9IGZyb20gXCIuLi92ZW5kb3IvdmVuZG9yLmNsaWVudC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXN0YXJ0V29ya2VyRm4gfSBmcm9tIFwiLi4vcmVhY3QtY2xpZW50L3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBnZXROb2RlRW52IH0gZnJvbSBcIi4uL2NvbmZpZy9nZXROb2RlRW52LmpzXCI7XG5pbXBvcnQgeyBoYW5kbGVFcnJvciB9IGZyb20gXCIuLi9lcnJvci9oYW5kbGVFcnJvci5qc1wiO1xuaW1wb3J0IHsgc2V0TWF4TGlzdGVuZXJzT25Qb3J0LCB1bnJlZlBvcnQgfSBmcm9tIFwiLi4vc3RyZWFtL3NldE1heExpc3RlbmVycy5qc1wiO1xuaW1wb3J0IHsgYXR0YWNoUnVubmVyRmV0Y2hIYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlUnVubmVyRmV0Y2guc2VydmVyLmpzXCI7XG5cbmxldCBjdXJyZW50V29ya2VyOiBXb3JrZXIgfCBudWxsID0gbnVsbDtcbmxldCBpc1Jlc3RhcnRpbmcgPSBmYWxzZTtcbmxldCBjdXJyZW50SG1yQ2hhbm5lbDogTWVzc2FnZUNoYW5uZWwgfCBudWxsID0gbnVsbDtcbmxldCBjdXJyZW50TWVzc2FnZUhhbmRsZXI6ICgoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xubGV0IGN1cnJlbnRFcnJvckhhbmRsZXI6ICgoZXJyb3I6IGFueSkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbmxldCBjdXJyZW50UnVubmVyQ2hhbm5lbDogTWVzc2FnZUNoYW5uZWwgfCBudWxsID0gbnVsbDtcbmxldCBjdXJyZW50UnVubmVyRGV0YWNoOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGNvbnN0IHJlc3RhcnRXb3JrZXI6IFJlc3RhcnRXb3JrZXJGbiA9IGFzeW5jIGZ1bmN0aW9uIF9yZXN0YXJ0V29ya2VyKHtcbiAgc2VydmVyLFxuICBhdXRvRGlzY292ZXJlZEZpbGVzLFxuICB1c2VyT3B0aW9ucyxcbiAgY29uZmlnRW52LFxuICBobXJDaGFubmVsLFxufSkge1xuICBpZiAoaXNSZXN0YXJ0aW5nKSB7XG4gICAgLy8gV2FpdCBmb3IgdGhlIGN1cnJlbnQgcmVzdGFydCB0byBjb21wbGV0ZVxuICAgIHdoaWxlIChpc1Jlc3RhcnRpbmcpIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMCkpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudFdvcmtlcjtcbiAgfVxuICBpc1Jlc3RhcnRpbmcgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgLy8gVGVybWluYXRlIHRoZSBjdXJyZW50IHdvcmtlciBpZiBpdCBleGlzdHNcbiAgICBjbGVhbnVwV29ya2VyKGN1cnJlbnRXb3JrZXIpO1xuICAgIGN1cnJlbnRXb3JrZXIgPSBudWxsO1xuXG4gICAgLy8gQ2xlYW4gdXAgYW55IGV4aXN0aW5nIEhNUiBjaGFubmVsXG4gICAgaWYgKGN1cnJlbnRIbXJDaGFubmVsKSB7XG4gICAgICBjdXJyZW50SG1yQ2hhbm5lbC5wb3J0MS5jbG9zZSgpO1xuICAgICAgY3VycmVudEhtckNoYW5uZWwucG9ydDIuY2xvc2UoKTtcbiAgICAgIGN1cnJlbnRIbXJDaGFubmVsID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDbGVhbiB1cCB0aGUgcnVubmVyIGNoYW5uZWwgKyBmZXRjaCBoYW5kbGVyIGZyb20gYW55IHByaW9yIHdvcmtlclxuICAgIGlmIChjdXJyZW50UnVubmVyRGV0YWNoKSB7XG4gICAgICBjdXJyZW50UnVubmVyRGV0YWNoKCk7XG4gICAgICBjdXJyZW50UnVubmVyRGV0YWNoID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnRSdW5uZXJDaGFubmVsKSB7XG4gICAgICBjdXJyZW50UnVubmVyQ2hhbm5lbC5wb3J0MS5jbG9zZSgpO1xuICAgICAgY3VycmVudFJ1bm5lckNoYW5uZWwucG9ydDIuY2xvc2UoKTtcbiAgICAgIGN1cnJlbnRSdW5uZXJDaGFubmVsID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDbGVhbiB1cCBhbnkgZXhpc3RpbmcgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSBtYWluIEhNUiBjaGFubmVsXG4gICAgaWYgKGN1cnJlbnRNZXNzYWdlSGFuZGxlcikge1xuICAgICAgaG1yQ2hhbm5lbC5wb3J0MS5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBjdXJyZW50TWVzc2FnZUhhbmRsZXIpO1xuICAgICAgY3VycmVudE1lc3NhZ2VIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnRFcnJvckhhbmRsZXIpIHtcbiAgICAgIGhtckNoYW5uZWwucG9ydDEucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VlcnJvclwiLCBjdXJyZW50RXJyb3JIYW5kbGVyKTtcbiAgICAgIGN1cnJlbnRFcnJvckhhbmRsZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJvdXRlQ291bnQgPSBhdXRvRGlzY292ZXJlZEZpbGVzLnVybE1hcC5zaXplO1xuICAgIGNvbnN0IGhtckJ1ZmZlciA9IDIwOyAvLyBCdWZmZXIgZm9yIEhNUiBhbmQgb3RoZXIgb3BlcmF0aW9uc1xuICAgIGNvbnN0IG1heExpc3RlbmVycyA9IHJvdXRlQ291bnQgKyBobXJCdWZmZXI7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgTWVzc2FnZUNoYW5uZWwgZm9yIHRoaXMgd29ya2VyXG4gICAgY29uc3Qgd29ya2VySG1yQ2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIGN1cnJlbnRIbXJDaGFubmVsID0gd29ya2VySG1yQ2hhbm5lbDtcbiAgICBcbiAgICAvLyBJbmNyZWFzZSBtYXggbGlzdGVuZXJzIHRvIHByZXZlbnQgd2FybmluZ3MgZHVyaW5nIGRldmVsb3BtZW50XG4gICAgc2V0TWF4TGlzdGVuZXJzT25Qb3J0KHdvcmtlckhtckNoYW5uZWwucG9ydDEsIG1heExpc3RlbmVycyk7XG4gICAgc2V0TWF4TGlzdGVuZXJzT25Qb3J0KHdvcmtlckhtckNoYW5uZWwucG9ydDIsIG1heExpc3RlbmVycyk7XG4gICAgdW5yZWZQb3J0KHdvcmtlckhtckNoYW5uZWwucG9ydDEpO1xuICAgIHVucmVmUG9ydCh3b3JrZXJIbXJDaGFubmVsLnBvcnQyKTtcblxuICAgIC8vIEZvcndhcmQgbWVzc2FnZXMgZnJvbSB0aGUgcGx1Z2luJ3MgSE1SIGNoYW5uZWwgdG8gdGhlIHdvcmtlcidzIGNoYW5uZWxcbiAgICBjb25zdCBtZXNzYWdlSGFuZGxlciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHdvcmtlckhtckNoYW5uZWwucG9ydDEucG9zdE1lc3NhZ2UoKGV2ZW50IGFzIE1lc3NhZ2VFdmVudCkuZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZ25vcmUgSE1SIGVycm9ycyBmb3Igbm93IHRvIGF2b2lkIERhdGFDbG9uZUVycm9yXG4gICAgICAgIGlmICh1c2VyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgc2VydmVyLmNvbmZpZy5sb2dnZXIuaW5mbyhgW3Jlc3RhcnRXb3JrZXJdIEhNUiBtZXNzYWdlIGVycm9yOiAke2Vycm9yfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBITVIgY2hhbm5lbCBlcnJvcnNcbiAgICBjb25zdCBlcnJvckhhbmRsZXIgPSAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgaWYgKHVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgc2VydmVyLmNvbmZpZy5sb2dnZXIud2FybihgW3Jlc3RhcnRXb3JrZXJdIEhNUiBtZXNzYWdlIGVycm9yOiAke2Vycm9yfWApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAgICAgLy8gU3RvcmUgaGFuZGxlcnMgZm9yIGNsZWFudXBcbiAgICAgICAgY3VycmVudE1lc3NhZ2VIYW5kbGVyID0gbWVzc2FnZUhhbmRsZXI7XG4gICAgICAgIGN1cnJlbnRFcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXI7XG5cbiAgICAgICAgLy8gSW5jcmVhc2UgbWF4IGxpc3RlbmVycyB0byBwcmV2ZW50IHdhcm5pbmdzIGR1cmluZyBkZXZlbG9wbWVudFxuICAgICAgICAvLyBUaGlzIGlzIGEgdGFyZ2V0ZWQgZml4IGZvciB0aGUgbWVtb3J5IGxlYWsgd2FybmluZ3NcbiAgICAgICAgc2V0TWF4TGlzdGVuZXJzT25Qb3J0KGhtckNoYW5uZWwucG9ydDEsIG1heExpc3RlbmVycyk7XG5cbiAgICAgICAgaG1yQ2hhbm5lbC5wb3J0MS5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBtZXNzYWdlSGFuZGxlcik7XG4gICAgICAgIGhtckNoYW5uZWwucG9ydDEuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VlcnJvclwiLCBlcnJvckhhbmRsZXIpO1xuXG4gICAgaWYgKHVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgIHNlcnZlci5jb25maWcubG9nZ2VyLmluZm8oYFtyZXN0YXJ0V29ya2VyXSB1c2VyT3B0aW9ucy5wcm9qZWN0Um9vdDogJHt1c2VyT3B0aW9ucy5wcm9qZWN0Um9vdH1gKTtcbiAgICAgIHNlcnZlci5jb25maWcubG9nZ2VyLmluZm8oYFtyZXN0YXJ0V29ya2VyXSBzZXJ2ZXIuY29uZmlnLnJvb3Q6ICR7c2VydmVyLmNvbmZpZy5yb290fWApO1xuICAgICAgc2VydmVyLmNvbmZpZy5sb2dnZXIuaW5mbyhgW3Jlc3RhcnRXb3JrZXJdIFVzaW5nIHByb2plY3RSb290OiAke3VzZXJPcHRpb25zLnByb2plY3RSb290IHx8IHNlcnZlci5jb25maWcucm9vdH1gKTtcbiAgICAgIHNlcnZlci5jb25maWcubG9nZ2VyLmluZm8oYFtyZXN0YXJ0V29ya2VyXSBjb25maWdFbnYuY29tbWFuZDogJHtjb25maWdFbnY/LmNvbW1hbmR9YCk7XG4gICAgICBzZXJ2ZXIuY29uZmlnLmxvZ2dlci5pbmZvKGBbcmVzdGFydFdvcmtlcl0gY29uZmlnRW52Lm1vZGU6ICR7Y29uZmlnRW52Py5tb2RlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJ1bm5lckNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBjdXJyZW50UnVubmVyQ2hhbm5lbCA9IHJ1bm5lckNoYW5uZWw7XG4gICAgc2V0TWF4TGlzdGVuZXJzT25Qb3J0KHJ1bm5lckNoYW5uZWwucG9ydDEsIG1heExpc3RlbmVycyk7XG4gICAgc2V0TWF4TGlzdGVuZXJzT25Qb3J0KHJ1bm5lckNoYW5uZWwucG9ydDIsIG1heExpc3RlbmVycyk7XG4gICAgdW5yZWZQb3J0KHJ1bm5lckNoYW5uZWwucG9ydDEpO1xuICAgIHVucmVmUG9ydChydW5uZXJDaGFubmVsLnBvcnQyKTtcbiAgICBjb25zdCBmZXRjaEhhbmRsZXJMb2dnZXIgPVxuICAgICAgc2VydmVyLmNvbmZpZy5jdXN0b21Mb2dnZXIgfHwgc2VydmVyLmNvbmZpZy5sb2dnZXI7XG4gICAgY3VycmVudFJ1bm5lckRldGFjaCA9IGF0dGFjaFJ1bm5lckZldGNoSGFuZGxlcihcbiAgICAgIHJ1bm5lckNoYW5uZWwucG9ydDEsXG4gICAgICBzZXJ2ZXIsXG4gICAgICBmZXRjaEhhbmRsZXJMb2dnZXIsXG4gICAgICBCb29sZWFuKHVzZXJPcHRpb25zLnZlcmJvc2UpXG4gICAgKTtcbiAgICBjb25zdCBydW5uZXJQb3J0Rm9yV29ya2VyID0gcnVubmVyQ2hhbm5lbC5wb3J0MjtcbiAgICBjb25zdCB0cmFuc2Zlckxpc3Q6IGFueVtdID0gW3dvcmtlckhtckNoYW5uZWwucG9ydDIsIHJ1bm5lckNoYW5uZWwucG9ydDJdO1xuXG4gICAgY29uc3Qgd29ya2VyUmVzdWx0ID0gYXdhaXQgY3JlYXRlV29ya2VyKHtcbiAgICAgIHByb2plY3RSb290OiB1c2VyT3B0aW9ucy5wcm9qZWN0Um9vdCB8fCBzZXJ2ZXIuY29uZmlnLnJvb3QsXG4gICAgICB3b3JrZXJQYXRoOiB1c2VyT3B0aW9ucy5yc2NXb3JrZXJQYXRoLFxuICAgICAgcmV2ZXJzZUNvbmRpdGlvbjogXCJyZWFjdC1zZXJ2ZXJcIixcbiAgICAgIGN1cnJlbnRDb25kaXRpb246IFwicmVhY3QtY2xpZW50XCIsXG4gICAgICBtYXhMaXN0ZW5lcnM6IG1heExpc3RlbmVycyxcbiAgICAgIGVudlByZWZpeDpcbiAgICAgICAgdHlwZW9mIHNlcnZlci5jb25maWcuZW52UHJlZml4ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyBzZXJ2ZXIuY29uZmlnLmVudlByZWZpeFxuICAgICAgICAgIDogQXJyYXkuaXNBcnJheShzZXJ2ZXIuY29uZmlnLmVudlByZWZpeClcbiAgICAgICAgICA/IHNlcnZlci5jb25maWcuZW52UHJlZml4WzBdXG4gICAgICAgICAgOiBERUZBVUxUX0NPTkZJRy5FTlZfUFJFRklYLFxuICAgICAgd29ya2VyRGF0YToge1xuICAgICAgICB1c2VyT3B0aW9uczogdXNlck9wdGlvbnMsXG4gICAgICAgIHJlc29sdmVkQ29uZmlnOiBzZXJpYWxpemVkRGV2U2VydmVyQ29uZmlnKHNlcnZlci5jb25maWcpLFxuICAgICAgICBjb25maWdFbnY6IGNvbmZpZ0VudixcbiAgICAgICAgcmVhY3RWZXJzaW9uOiBSZWFjdC52ZXJzaW9uLFxuICAgICAgICBpZDogXCJ3b3JrZXIvcnNjXCIsXG4gICAgICAgIHNlcnZlck1hbmlmZXN0OiB7fSwgLy8gc3RhdGljTWFuaWZlc3QgcmVtb3ZlZCBmcm9tIEF1dG9EaXNjb3ZlcmVkRmlsZXNcbiAgICAgICAgcnVubmVyUG9ydDogcnVubmVyUG9ydEZvcldvcmtlcixcbiAgICAgIH0sXG4gICAgICB0cmFuc2Zlckxpc3QsXG4gICAgfSk7XG4gICAgXG4gICAgaWYgKHdvcmtlclJlc3VsdC50eXBlID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgY3VycmVudFdvcmtlciA9IHdvcmtlclJlc3VsdC53b3JrZXI7XG4gICAgICBpZiAodXNlck9wdGlvbnMudmVyYm9zZSlcbiAgICAgICAgc2VydmVyLmNvbmZpZy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICBgW3JlYWN0LWNsaWVudF0gU2V0IG1heCBsaXN0ZW5lcnMgdG8gJHttYXhMaXN0ZW5lcnN9IGZvciAke3JvdXRlQ291bnR9IHJvdXRlc2BcbiAgICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHdvcmtlclJlc3VsdC50eXBlID09PSBcImVycm9yXCIpIHtcbiAgICAgIGNvbnN0IHBhbmljRXJyb3IgPSBoYW5kbGVFcnJvcih7XG4gICAgICAgIGVycm9yOiB3b3JrZXJSZXN1bHQuZXJyb3IsXG4gICAgICAgIGxvZ2dlcjogc2VydmVyLmNvbmZpZy5jdXN0b21Mb2dnZXIgfHwgc2VydmVyLmNvbmZpZy5sb2dnZXIsXG4gICAgICAgIG1vZGU6IGdldE5vZGVFbnYoc2VydmVyLmNvbmZpZy5tb2RlKSxcbiAgICAgICAgcGFuaWNUaHJlc2hvbGQ6IHVzZXJPcHRpb25zLnBhbmljVGhyZXNob2xkLFxuICAgICAgICBjcml0aWNhbDogZmFsc2UsXG4gICAgICAgIGNvbnRleHQ6IFwicmVzdGFydFdvcmtlclwiLFxuICAgICAgfSk7XG4gICAgICBpZiAocGFuaWNFcnJvciAhPSBudWxsKSB7XG4gICAgICAgIHRocm93IHBhbmljRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGlzUmVzdGFydGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnRXb3JrZXI7XG59O1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFZQSxJQUFJLGFBQStCLEdBQUEsSUFBQTtBQUNuQyxJQUFJLFlBQWUsR0FBQSxLQUFBO0FBQ25CLElBQUksaUJBQTJDLEdBQUEsSUFBQTtBQUMvQyxJQUFJLHFCQUF5RCxHQUFBLElBQUE7QUFDN0QsSUFBSSxtQkFBcUQsR0FBQSxJQUFBO0FBQ3pELElBQUksb0JBQThDLEdBQUEsSUFBQTtBQUNsRCxJQUFJLG1CQUEyQyxHQUFBLElBQUE7QUFFbEMsTUFBQSxhQUFBLEdBQWlDLGVBQWUsY0FBZSxDQUFBO0FBQUEsRUFDMUUsTUFBQTtBQUFBLEVBQ0EsbUJBQUE7QUFBQSxFQUNBLFdBQUE7QUFBQSxFQUNBLFNBQUE7QUFBQSxFQUNBO0FBQ0YsQ0FBRyxFQUFBO0FBQ0QsRUFBQSxJQUFJLFlBQWMsRUFBQTtBQUVoQixJQUFBLE9BQU8sWUFBYyxFQUFBO0FBQ25CLE1BQUEsTUFBTSxJQUFJLE9BQVEsQ0FBQSxDQUFBLE9BQUEsS0FBVyxVQUFXLENBQUEsT0FBQSxFQUFTLEVBQUUsQ0FBQyxDQUFBO0FBQUE7QUFFdEQsSUFBTyxPQUFBLGFBQUE7QUFBQTtBQUVULEVBQWUsWUFBQSxHQUFBLElBQUE7QUFFZixFQUFJLElBQUE7QUFFRixJQUFBLGFBQUEsQ0FBYyxhQUFhLENBQUE7QUFDM0IsSUFBZ0IsYUFBQSxHQUFBLElBQUE7QUFHaEIsSUFBQSxJQUFJLGlCQUFtQixFQUFBO0FBQ3JCLE1BQUEsaUJBQUEsQ0FBa0IsTUFBTSxLQUFNLEVBQUE7QUFDOUIsTUFBQSxpQkFBQSxDQUFrQixNQUFNLEtBQU0sRUFBQTtBQUM5QixN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