vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
295 lines (292 loc) • 33.5 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { cleanObject } from './cleanObject.js';
import { DEFAULT_CONFIG } from '../config/defaults.js';
const VITE_NON_SERIALIZABLE_FUNCTIONS = /* @__PURE__ */ new Set([
"renderChunk",
"buildStart",
"buildEnd",
"watchChange",
"resolveId",
"config",
"output[].entryFileNames",
"output[].chunkFileNames",
"output[].assetFileNames",
"transform",
"handler",
"configureServer",
"shouldTransformCachedModule",
"generateBundle",
"renderStart",
"writeBundle",
"hotUpdate",
"configResolved",
"configurePreviewServer",
"handleHotUpdate",
"load",
"augmentChunkHash",
"closeBundle",
"entryFileNames",
"assetFileNames",
"chunkFileNames",
"createEnvironment",
"sourcemapIgnoreList",
"assetsInclude",
"info",
"warn",
"warnOnce",
"error",
"clearScreen",
"hasErrorLogged",
"set",
"plugins",
"getSortedPlugins",
"getSortedPluginHooks",
"createResolver",
"fsDenyGlob",
// Nested plugin functions
"plugins[].renderChunk",
"plugins[].buildStart",
"plugins[].buildEnd",
"plugins[].watchChange",
"plugins[].resolveId",
"plugins[].config",
"plugins[].transform",
"plugins[].handler",
"plugins[].configureServer",
"plugins[].shouldTransformCachedModule",
"plugins[].generateBundle",
"plugins[].renderStart",
"plugins[].writeBundle",
"plugins[].hotUpdate",
"plugins[].configResolved",
"plugins[].configurePreviewServer",
"plugins[].handleHotUpdate",
"plugins[].load",
"plugins[].augmentChunkHash",
"plugins[].closeBundle",
"plugins[].entryFileNames",
"plugins[].assetFileNames",
"plugins[].chunkFileNames",
"plugins[].createEnvironment",
"plugins[].sourcemapIgnoreList",
"plugins[].assetsInclude"
]);
const PLUGIN_NON_SERIALIZABLE_FUNCTIONS = /* @__PURE__ */ new Set([
"Page",
"props",
"normalizer",
"Root",
"Html",
"onEvent",
"onMetrics",
"autoDiscover"
]);
function serializeRegExp(regex) {
return {
source: regex.source,
flags: regex.flags,
__isRegExp: true
};
}
function deserializeRegExp(obj) {
if (obj && typeof obj === "object" && obj != null && "__isRegExp" in obj && typeof obj["__isRegExp"] === "boolean" && "source" in obj && typeof obj["source"] === "string" && "flags" in obj && typeof obj["flags"] === "string") {
return new RegExp(obj["source"], obj["flags"]);
}
if (Array.isArray(obj)) {
if (obj.length > 0 && Array.isArray(obj[0]) && obj[0].length === 2) {
return new Map(obj);
}
return obj.map(deserializeRegExp);
}
if (obj && typeof obj === "object") {
const result = {};
for (const [key, value] of Object.entries(obj)) {
result[key] = deserializeRegExp(value);
}
return result;
}
return obj;
}
function processForSerialization(obj) {
if (obj instanceof RegExp) {
return serializeRegExp(obj);
}
if (obj instanceof Map) {
return Array.from(obj.entries());
}
if (Array.isArray(obj)) {
return obj.map(processForSerialization);
}
if (obj && typeof obj === "object") {
const result = {};
for (const [key, value] of Object.entries(obj)) {
result[key] = processForSerialization(value);
}
return result;
}
return obj;
}
function serializeResolvedConfig(config, knownNonSerializableFunctions = VITE_NON_SERIALIZABLE_FUNCTIONS) {
if (!config) {
return void 0;
}
const {
getSortedPluginHooks: _getSortedPluginHooks,
getSortedPlugins: _getSortedPlugins,
assetsInclude: _assetsInclude,
environments: _environments,
// extract known vite function properties
...handlerOptions
} = config;
const minimalEnvironments = _environments ? {
client: {
resolve: { conditions: ["browser", "module", "import"] },
consumer: "client",
optimizeDeps: { include: [] },
dev: { optimizeDeps: { include: [] } },
build: { outDir: "dist" }
},
ssr: {
resolve: { conditions: ["node", "import"] },
consumer: "server",
optimizeDeps: { include: [] },
dev: { optimizeDeps: { include: [] } },
build: { outDir: "dist" }
}
} : void 0;
const cleaned = cleanObject(handlerOptions, knownNonSerializableFunctions);
if (minimalEnvironments) {
cleaned.environments = minimalEnvironments;
}
return processForSerialization(cleaned);
}
function serializeResolvedUserConfig(config, knownNonSerializableFunctions = VITE_NON_SERIALIZABLE_FUNCTIONS) {
const {
assetsInclude: _assetsInclude,
// extract known vite function properties
...handlerOptions
} = config;
return processForSerialization(
cleanObject(handlerOptions, knownNonSerializableFunctions)
);
}
const serializedDevServerConfig = (config, customNonSerializableFunctions = PLUGIN_NON_SERIALIZABLE_FUNCTIONS) => {
const {
getSortedPluginHooks: _getSortedPluginHooks,
getSortedPlugins: _getSortedPlugins,
assetsInclude: _assetsInclude,
build: _build,
...handlerOptions
} = config;
return processForSerialization(
cleanObject(handlerOptions, customNonSerializableFunctions)
);
};
const serializedOptions = (userOptions, autoDiscoveredFiles, customNonSerializableFunctions = PLUGIN_NON_SERIALIZABLE_FUNCTIONS) => {
const {
Page: _Page,
props: _props,
normalizer: _normalizer,
Root: _Root,
Html: _Html,
onEvent: _onEvent,
onMetrics: _onMetrics,
build: _build,
loader: _loader,
autoDiscover,
propsExportName,
pageExportName,
serverPipeableStreamOptions,
clientPipeableStreamOptions,
...handlerOptions
} = userOptions;
const {
entryFile: _entryFile,
chunkFile: _chunkFile,
assetFile: _assetFile,
pages: _pages,
...buildOptions
} = _build ?? {};
const serializedBuild = {
...DEFAULT_CONFIG.BUILD,
// Start with defaults
...buildOptions,
// Override with user options
pages: autoDiscoveredFiles ? Array.from(autoDiscoveredFiles.urlMap.keys()) : []
};
const {
isServerFunctionCode: _isServerFunctionCode,
isClientComponentCode: _isClientComponentCode,
isClientComponentByCode: _isClientComponentByCode,
isClientComponentByName: _isClientComponentByName,
getDirectiveType: _getDirectiveType,
allowedDirectives,
...loaderOptions
} = _loader ?? {};
const {
modulePattern: _modulePattern,
cssPattern: _cssPattern,
jsonPattern: _jsonPattern,
clientPattern: _clientPattern,
propsPattern: _propsPattern,
pagePattern: _pagePattern,
htmlPattern: _htmlPattern,
rscPattern: _rscPattern,
serverPattern: _serverPattern,
cssModulePattern: _cssModulePattern,
vendorPattern: _vendorPattern,
nodePattern: _nodePattern,
dotPattern: _dotPattern,
virtualPattern: _virtualPattern,
...serializedAutoDiscover
} = autoDiscover;
const result = {
...handlerOptions,
Page: typeof _Page === "string" ? _Page : void 0,
Html: typeof _Html === "string" ? _Html : void 0,
Root: typeof _Root === "string" ? _Root : void 0,
normalizer: void 0,
onEvent: void 0,
onMetrics: void 0,
propsExportName,
pageExportName,
build: serializedBuild,
loader: {
directivePattern: {
config: {
validate: void 0,
...allowedDirectives
}
},
...loaderOptions
},
autoDiscover: {
modulePattern: serializeRegExp(_modulePattern),
serverPattern: serializeRegExp(_serverPattern),
clientPattern: serializeRegExp(_clientPattern),
pagePattern: serializeRegExp(_pagePattern),
propsPattern: serializeRegExp(_propsPattern),
cssPattern: serializeRegExp(_cssPattern),
jsonPattern: serializeRegExp(_jsonPattern),
htmlPattern: serializeRegExp(_htmlPattern),
cssModulePattern: serializeRegExp(_cssModulePattern),
vendorPattern: serializeRegExp(_vendorPattern),
nodePattern: serializeRegExp(_nodePattern),
dotPattern: serializeRegExp(_dotPattern),
virtualPattern: serializeRegExp(_virtualPattern),
rscPattern: serializeRegExp(_rscPattern),
...serializedAutoDiscover
},
serverPipeableStreamOptions,
clientPipeableStreamOptions
};
const cleanedResult = cleanObject(result, customNonSerializableFunctions);
const finalResult = processForSerialization(cleanedResult);
return finalResult;
};
export { deserializeRegExp, processForSerialization, serializeResolvedConfig, serializeResolvedUserConfig, serializedDevServerConfig, serializedOptions };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXplVXNlck9wdGlvbnMuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BsdWdpbi9oZWxwZXJzL3NlcmlhbGl6ZVVzZXJPcHRpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVzb2x2ZWRDb25maWcsIFZpdGVEZXZTZXJ2ZXIgfSBmcm9tIFwidml0ZVwiO1xuaW1wb3J0IHR5cGUge1xuICBBdXRvRGlzY292ZXJlZEZpbGVzLFxuICBSZXNvbHZlZFVzZXJPcHRpb25zLFxuICBTZXJpYWxpemFibGVSZWNvcmQsXG4gIFJlc29sdmVkVXNlckNvbmZpZyxcbiAgU2VyaWFsaXplZFVzZXJPcHRpb25zLFxuICBTZXJpYWxpemFibGUsXG59IGZyb20gXCIuLi90eXBlcy5qc1wiO1xuaW1wb3J0IHsgY2xlYW5PYmplY3QgfSBmcm9tIFwiLi9jbGVhbk9iamVjdC5qc1wiO1xuaW1wb3J0IHsgREVGQVVMVF9DT05GSUcgfSBmcm9tIFwiLi4vY29uZmlnL2RlZmF1bHRzLmpzXCI7XG5cbi8vIENvbW1vbiBub24tc2VyaWFsaXphYmxlIGZ1bmN0aW9ucyBpbiBWaXRlJ3MgcmVzb2x2ZWQgY29uZmlnXG5jb25zdCBWSVRFX05PTl9TRVJJQUxJWkFCTEVfRlVOQ1RJT05TID0gbmV3IFNldChbXG4gIFwicmVuZGVyQ2h1bmtcIixcbiAgXCJidWlsZFN0YXJ0XCIsXG4gIFwiYnVpbGRFbmRcIixcbiAgXCJ3YXRjaENoYW5nZVwiLFxuICBcInJlc29sdmVJZFwiLFxuICBcImNvbmZpZ1wiLFxuICBcIm91dHB1dFtdLmVudHJ5RmlsZU5hbWVzXCIsXG4gIFwib3V0cHV0W10uY2h1bmtGaWxlTmFtZXNcIixcbiAgXCJvdXRwdXRbXS5hc3NldEZpbGVOYW1lc1wiLFxuICBcInRyYW5zZm9ybVwiLFxuICBcImhhbmRsZXJcIixcbiAgXCJjb25maWd1cmVTZXJ2ZXJcIixcbiAgXCJzaG91bGRUcmFuc2Zvcm1DYWNoZWRNb2R1bGVcIixcbiAgXCJnZW5lcmF0ZUJ1bmRsZVwiLFxuICBcInJlbmRlclN0YXJ0XCIsXG4gIFwid3JpdGVCdW5kbGVcIixcbiAgXCJob3RVcGRhdGVcIixcbiAgXCJjb25maWdSZXNvbHZlZFwiLFxuICBcImNvbmZpZ3VyZVByZXZpZXdTZXJ2ZXJcIixcbiAgXCJoYW5kbGVIb3RVcGRhdGVcIixcbiAgXCJsb2FkXCIsXG4gIFwiYXVnbWVudENodW5rSGFzaFwiLFxuICBcImNsb3NlQnVuZGxlXCIsXG4gIFwiZW50cnlGaWxlTmFtZXNcIixcbiAgXCJhc3NldEZpbGVOYW1lc1wiLFxuICBcImNodW5rRmlsZU5hbWVzXCIsXG4gIFwiY3JlYXRlRW52aXJvbm1lbnRcIixcbiAgXCJzb3VyY2VtYXBJZ25vcmVMaXN0XCIsXG4gIFwiYXNzZXRzSW5jbHVkZVwiLFxuICBcImluZm9cIixcbiAgXCJ3YXJuXCIsXG4gIFwid2Fybk9uY2VcIixcbiAgXCJlcnJvclwiLFxuICBcImNsZWFyU2NyZWVuXCIsXG4gIFwiaGFzRXJyb3JMb2dnZWRcIixcbiAgXCJzZXRcIixcbiAgXCJwbHVnaW5zXCIsXG4gIFwiZ2V0U29ydGVkUGx1Z2luc1wiLFxuICBcImdldFNvcnRlZFBsdWdpbkhvb2tzXCIsXG4gIFwiY3JlYXRlUmVzb2x2ZXJcIixcbiAgXCJmc0RlbnlHbG9iXCIsXG4gIC8vIE5lc3RlZCBwbHVnaW4gZnVuY3Rpb25zXG4gIFwicGx1Z2luc1tdLnJlbmRlckNodW5rXCIsXG4gIFwicGx1Z2luc1tdLmJ1aWxkU3RhcnRcIixcbiAgXCJwbHVnaW5zW10uYnVpbGRFbmRcIixcbiAgXCJwbHVnaW5zW10ud2F0Y2hDaGFuZ2VcIixcbiAgXCJwbHVnaW5zW10ucmVzb2x2ZUlkXCIsXG4gIFwicGx1Z2luc1tdLmNvbmZpZ1wiLFxuICBcInBsdWdpbnNbXS50cmFuc2Zvcm1cIixcbiAgXCJwbHVnaW5zW10uaGFuZGxlclwiLFxuICBcInBsdWdpbnNbXS5jb25maWd1cmVTZXJ2ZXJcIixcbiAgXCJwbHVnaW5zW10uc2hvdWxkVHJhbnNmb3JtQ2FjaGVkTW9kdWxlXCIsXG4gIFwicGx1Z2luc1tdLmdlbmVyYXRlQnVuZGxlXCIsXG4gIFwicGx1Z2luc1tdLnJlbmRlclN0YXJ0XCIsXG4gIFwicGx1Z2luc1tdLndyaXRlQnVuZGxlXCIsXG4gIFwicGx1Z2luc1tdLmhvdFVwZGF0ZVwiLFxuICBcInBsdWdpbnNbXS5jb25maWdSZXNvbHZlZFwiLFxuICBcInBsdWdpbnNbXS5jb25maWd1cmVQcmV2aWV3U2VydmVyXCIsXG4gIFwicGx1Z2luc1tdLmhhbmRsZUhvdFVwZGF0ZVwiLFxuICBcInBsdWdpbnNbXS5sb2FkXCIsXG4gIFwicGx1Z2luc1tdLmF1Z21lbnRDaHVua0hhc2hcIixcbiAgXCJwbHVnaW5zW10uY2xvc2VCdW5kbGVcIixcbiAgXCJwbHVnaW5zW10uZW50cnlGaWxlTmFtZXNcIixcbiAgXCJwbHVnaW5zW10uYXNzZXRGaWxlTmFtZXNcIixcbiAgXCJwbHVnaW5zW10uY2h1bmtGaWxlTmFtZXNcIixcbiAgXCJwbHVnaW5zW10uY3JlYXRlRW52aXJvbm1lbnRcIixcbiAgXCJwbHVnaW5zW10uc291cmNlbWFwSWdub3JlTGlzdFwiLFxuICBcInBsdWdpbnNbXS5hc3NldHNJbmNsdWRlXCIsXG5dKTtcblxuLy8gQ29tbW9uIG5vbi1zZXJpYWxpemFibGUgZnVuY3Rpb25zIGluIG91ciBwbHVnaW4ncyBvcHRpb25zXG5jb25zdCBQTFVHSU5fTk9OX1NFUklBTElaQUJMRV9GVU5DVElPTlMgPSBuZXcgU2V0KFtcbiAgXCJQYWdlXCIsXG4gIFwicHJvcHNcIixcbiAgXCJub3JtYWxpemVyXCIsXG4gIFwiUm9vdFwiLFxuICBcIkh0bWxcIixcbiAgXCJvbkV2ZW50XCIsXG4gIFwib25NZXRyaWNzXCIsXG4gIFwiYXV0b0Rpc2NvdmVyXCIsXG5dKTtcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHNlcmlhbGl6ZSBSZWdFeHAgb2JqZWN0c1xuZnVuY3Rpb24gc2VyaWFsaXplUmVnRXhwKHJlZ2V4OiBSZWdFeHApIHtcbiAgcmV0dXJuIHtcbiAgICBzb3VyY2U6IHJlZ2V4LnNvdXJjZSxcbiAgICBmbGFnczogcmVnZXguZmxhZ3MsXG4gICAgX19pc1JlZ0V4cDogdHJ1ZSxcbiAgfTtcbn1cblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGRlc2VyaWFsaXplIFJlZ0V4cCBvYmplY3RzXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVSZWdFeHA8VD4ob2JqOiBUKTogRXh0cmFjdDxULCBTZXJpYWxpemFibGVSZWNvcmQ+IHtcbiAgaWYgKFxuICAgIG9iaiAmJlxuICAgIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiZcbiAgICBvYmogIT0gbnVsbCAmJlxuICAgIFwiX19pc1JlZ0V4cFwiIGluIG9iaiAmJlxuICAgIHR5cGVvZiBvYmpbXCJfX2lzUmVnRXhwXCJdID09PSBcImJvb2xlYW5cIiAmJlxuICAgIFwic291cmNlXCIgaW4gb2JqICYmXG4gICAgdHlwZW9mIG9ialtcInNvdXJjZVwiXSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIFwiZmxhZ3NcIiBpbiBvYmogJiZcbiAgICB0eXBlb2Ygb2JqW1wiZmxhZ3NcIl0gPT09IFwic3RyaW5nXCJcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAob2JqW1wic291cmNlXCJdLCBvYmpbXCJmbGFnc1wiXSkgYXMgdW5rbm93biBhcyBFeHRyYWN0PFxuICAgICAgVCxcbiAgICAgIFNlcmlhbGl6YWJsZVJlY29yZFxuICAgID47XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBzZXJpYWxpemVkIE1hcCAoYXJyYXkgb2YgW2tleSwgdmFsdWVdIHBhaXJzKVxuICAgIGlmIChvYmoubGVuZ3RoID4gMCAmJiBBcnJheS5pc0FycmF5KG9ialswXSkgJiYgb2JqWzBdLmxlbmd0aCA9PT0gMikge1xuICAgICAgcmV0dXJuIG5ldyBNYXAob2JqKSBhcyB1bmtub3duIGFzIEV4dHJhY3Q8VCwgU2VyaWFsaXphYmxlUmVjb3JkPjtcbiAgICB9XG4gICAgcmV0dXJuIG9iai5tYXAoZGVzZXJpYWxpemVSZWdFeHApIGFzIHVua25vd24gYXMgRXh0cmFjdDxcbiAgICAgIFQsXG4gICAgICBTZXJpYWxpemFibGVSZWNvcmRcbiAgICA+O1xuICB9XG4gIGlmIChvYmogJiYgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICByZXN1bHRba2V5XSA9IGRlc2VyaWFsaXplUmVnRXhwKHZhbHVlKSBhcyB1bmtub3duIGFzIEV4dHJhY3Q8XG4gICAgICAgIFQsXG4gICAgICAgIFNlcmlhbGl6YWJsZVJlY29yZFxuICAgICAgPltrZXlvZiBUXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdCBhcyB1bmtub3duIGFzIEV4dHJhY3Q8VCwgU2VyaWFsaXphYmxlUmVjb3JkPjtcbiAgfVxuICByZXR1cm4gb2JqIGFzIHVua25vd24gYXMgRXh0cmFjdDxULCBTZXJpYWxpemFibGVSZWNvcmQ+O1xufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gcmVjdXJzaXZlbHkgcHJvY2VzcyBvYmplY3RzIGZvciBzZXJpYWxpemF0aW9uXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ZvclNlcmlhbGl6YXRpb248VD4oXG4gIG9iajogVFxuKTogRXh0cmFjdDxULCBTZXJpYWxpemFibGU+IHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIHJldHVybiBzZXJpYWxpemVSZWdFeHAob2JqKSBhcyB1bmtub3duIGFzIEV4dHJhY3Q8VCwgU2VyaWFsaXphYmxlPjtcbiAgfVxuICBpZiAob2JqIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgLy8gQ29udmVydCBNYXAgdG8gYXJyYXkgb2YgW2tleSwgdmFsdWVdIHBhaXJzIGZvciBzZXJpYWxpemF0aW9uXG4gICAgcmV0dXJuIEFycmF5LmZyb20ob2JqLmVudHJpZXMoKSkgYXMgdW5rbm93biBhcyBFeHRyYWN0PFQsIFNlcmlhbGl6YWJsZT47XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmoubWFwKHByb2Nlc3NGb3JTZXJpYWxpemF0aW9uKSBhcyB1bmtub3duIGFzIEV4dHJhY3Q8XG4gICAgICBULFxuICAgICAgU2VyaWFsaXphYmxlXG4gICAgPjtcbiAgfVxuICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBwcm9jZXNzRm9yU2VyaWFsaXphdGlvbih2YWx1ZSkgYXMgdW5rbm93biBhcyBFeHRyYWN0PFxuICAgICAgICBULFxuICAgICAgICBTZXJpYWxpemFibGVcbiAgICAgID5ba2V5b2YgVF07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQgYXMgdW5rbm93biBhcyBFeHRyYWN0PFQsIFNlcmlhbGl6YWJsZT47XG4gIH1cbiAgcmV0dXJuIG9iaiBhcyB1bmtub3duIGFzIEV4dHJhY3Q8VCwgU2VyaWFsaXphYmxlPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVJlc29sdmVkQ29uZmlnPFQgZXh0ZW5kcyBSZXNvbHZlZENvbmZpZyA9IFJlc29sdmVkQ29uZmlnPihcbiAgY29uZmlnOiBULFxuICBrbm93bk5vblNlcmlhbGl6YWJsZUZ1bmN0aW9uczogU2V0PHN0cmluZz4gPSBWSVRFX05PTl9TRVJJQUxJWkFCTEVfRlVOQ1RJT05TXG4pIHtcbiAgaWYgKCFjb25maWcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGdldFNvcnRlZFBsdWdpbkhvb2tzOiBfZ2V0U29ydGVkUGx1Z2luSG9va3MsXG4gICAgZ2V0U29ydGVkUGx1Z2luczogX2dldFNvcnRlZFBsdWdpbnMsXG4gICAgYXNzZXRzSW5jbHVkZTogX2Fzc2V0c0luY2x1ZGUsXG4gICAgZW52aXJvbm1lbnRzOiBfZW52aXJvbm1lbnRzLFxuICAgIC8vIGV4dHJhY3Qga25vd24gdml0ZSBmdW5jdGlvbiBwcm9wZXJ0aWVzXG4gICAgLi4uaGFuZGxlck9wdGlvbnNcbiAgfSA9IGNvbmZpZztcblxuICAvLyBQcmVzZXJ2ZSBhIG1pbmltYWwgZW52aXJvbm1lbnRzIHN0cnVjdHVyZSBmb3IgQ1NTIHByb2Nlc3NpbmdcbiAgY29uc3QgbWluaW1hbEVudmlyb25tZW50cyA9IF9lbnZpcm9ubWVudHMgPyB7XG4gICAgY2xpZW50OiB7XG4gICAgICByZXNvbHZlOiB7IGNvbmRpdGlvbnM6IFsnYnJvd3NlcicsICdtb2R1bGUnLCAnaW1wb3J0J10gfSxcbiAgICAgIGNvbnN1bWVyOiAnY2xpZW50JyxcbiAgICAgIG9wdGltaXplRGVwczogeyBpbmNsdWRlOiBbXSB9LFxuICAgICAgZGV2OiB7IG9wdGltaXplRGVwczogeyBpbmNsdWRlOiBbXSB9IH0sXG4gICAgICBidWlsZDogeyBvdXREaXI6ICdkaXN0JyB9LFxuICAgIH0sXG4gICAgc3NyOiB7XG4gICAgICByZXNvbHZlOiB7IGNvbmRpdGlvbnM6IFsnbm9kZScsICdpbXBvcnQnXSB9LFxuICAgICAgY29uc3VtZXI6ICdzZXJ2ZXInLCBcbiAgICAgIG9wdGltaXplRGVwczogeyBpbmNsdWRlOiBbXSB9LFxuICAgICAgZGV2OiB7IG9wdGltaXplRGVwczogeyBpbmNsdWRlOiBbXSB9IH0sXG4gICAgICBidWlsZDogeyBvdXREaXI6ICdkaXN0JyB9LFxuICAgIH0sXG4gIH0gOiB1bmRlZmluZWQ7XG5cbiAgLy8gQ2xlYW4gdGhlIG9iamVjdCB0byByZW1vdmUgbm9uLXNlcmlhbGl6YWJsZSBwcm9wZXJ0aWVzIGFuZCBwcm9jZXNzIFJlZ0V4cCBvYmplY3RzXG4gIGNvbnN0IGNsZWFuZWQgPSBjbGVhbk9iamVjdChoYW5kbGVyT3B0aW9ucywga25vd25Ob25TZXJpYWxpemFibGVGdW5jdGlvbnMpIGFzIGFueTtcbiAgXG4gIC8vIEFkZCBiYWNrIHRoZSBtaW5pbWFsIGVudmlyb25tZW50cyBpZiB0aGV5IGV4aXN0ZWRcbiAgaWYgKG1pbmltYWxFbnZpcm9ubWVudHMpIHtcbiAgICBjbGVhbmVkLmVudmlyb25tZW50cyA9IG1pbmltYWxFbnZpcm9ubWVudHM7XG4gIH1cbiAgXG4gIHJldHVybiBwcm9jZXNzRm9yU2VyaWFsaXphdGlvbihjbGVhbmVkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVJlc29sdmVkVXNlckNvbmZpZzxUIGV4dGVuZHMgUmVzb2x2ZWRVc2VyQ29uZmlnPihcbiAgY29uZmlnOiBULFxuICBrbm93bk5vblNlcmlhbGl6YWJsZUZ1bmN0aW9uczogU2V0PHN0cmluZz4gPSBWSVRFX05PTl9TRVJJQUxJWkFCTEVfRlVOQ1RJT05TXG4pIHtcbiAgY29uc3Qge1xuICAgIGFzc2V0c0luY2x1ZGU6IF9hc3NldHNJbmNsdWRlLFxuICAgIC8vIGV4dHJhY3Qga25vd24gdml0ZSBmdW5jdGlvbiBwcm9wZXJ0aWVzXG4gICAgLi4uaGFuZGxlck9wdGlvbnNcbiAgfSA9IGNvbmZpZztcblxuICAvLyBDbGVhbiB0aGUgb2JqZWN0IHRvIHJlbW92ZSBub24tc2VyaWFsaXphYmxlIHByb3BlcnRpZXMgYW5kIHByb2Nlc3MgUmVnRXhwIG9iamVjdHNcbiAgcmV0dXJuIHByb2Nlc3NGb3JTZXJpYWxpemF0aW9uKFxuICAgIGNsZWFuT2JqZWN0KGhhbmRsZXJPcHRpb25zLCBrbm93bk5vblNlcmlhbGl6YWJsZUZ1bmN0aW9ucylcbiAgKTtcbn1cblxuLy8gRm9yIFZpdGUncyBjb25maWdcbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkRGV2U2VydmVyQ29uZmlnID0gPFQgZXh0ZW5kcyBWaXRlRGV2U2VydmVyW1wiY29uZmlnXCJdPihcbiAgY29uZmlnOiBULFxuICBjdXN0b21Ob25TZXJpYWxpemFibGVGdW5jdGlvbnM6IFNldDxzdHJpbmc+ID0gUExVR0lOX05PTl9TRVJJQUxJWkFCTEVfRlVOQ1RJT05TXG4pID0+IHtcbiAgY29uc3Qge1xuICAgIGdldFNvcnRlZFBsdWdpbkhvb2tzOiBfZ2V0U29ydGVkUGx1Z2luSG9va3MsXG4gICAgZ2V0U29ydGVkUGx1Z2luczogX2dldFNvcnRlZFBsdWdpbnMsXG4gICAgYXNzZXRzSW5jbHVkZTogX2Fzc2V0c0luY2x1ZGUsXG4gICAgYnVpbGQ6IF9idWlsZCxcbiAgICAuLi5oYW5kbGVyT3B0aW9uc1xuICB9ID0gY29uZmlnO1xuICBcbiAgcmV0dXJuIHByb2Nlc3NGb3JTZXJpYWxpemF0aW9uKFxuICAgIGNsZWFuT2JqZWN0KGhhbmRsZXJPcHRpb25zLCBjdXN0b21Ob25TZXJpYWxpemFibGVGdW5jdGlvbnMpXG4gICk7XG59O1xuXG5cblxuLy8gRm9yIHlvdXIgb3duIG9wdGlvbnMgKGlmIHlvdSBuZWVkIGN1c3RvbSBub24tc2VyaWFsaXphYmxlIGZ1bmN0aW9ucylcbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkT3B0aW9ucyA9IDxUIGV4dGVuZHMgUmVzb2x2ZWRVc2VyT3B0aW9ucz4oXG4gIHVzZXJPcHRpb25zOiBULFxuICBhdXRvRGlzY292ZXJlZEZpbGVzOiBBdXRvRGlzY292ZXJlZEZpbGVzLFxuICBjdXN0b21Ob25TZXJpYWxpemFibGVGdW5jdGlvbnM6IFNldDxzdHJpbmc+ID0gUExVR0lOX05PTl9TRVJJQUxJWkFCTEVfRlVOQ1RJT05TXG4pOiBTZXJpYWxpemVkVXNlck9wdGlvbnMgPT4ge1xuICBjb25zdCB7XG4gICAgUGFnZTogX1BhZ2UsXG4gICAgcHJvcHM6IF9wcm9wcyxcbiAgICBub3JtYWxpemVyOiBfbm9ybWFsaXplcixcbiAgICBSb290OiBfUm9vdCxcbiAgICBIdG1sOiBfSHRtbCxcbiAgICBvbkV2ZW50OiBfb25FdmVudCxcbiAgICBvbk1ldHJpY3M6IF9vbk1ldHJpY3MsXG4gICAgYnVpbGQ6IF9idWlsZCxcbiAgICBsb2FkZXI6IF9sb2FkZXIsXG4gICAgYXV0b0Rpc2NvdmVyOiBhdXRvRGlzY292ZXIsXG4gICAgcHJvcHNFeHBvcnROYW1lOiBwcm9wc0V4cG9ydE5hbWUsXG4gICAgcGFnZUV4cG9ydE5hbWU6IHBhZ2VFeHBvcnROYW1lLFxuICAgIHNlcnZlclBpcGVhYmxlU3RyZWFtT3B0aW9uczogc2VydmVyUGlwZWFibGVTdHJlYW1PcHRpb25zLFxuICAgIGNsaWVudFBpcGVhYmxlU3RyZWFtT3B0aW9uczogY2xpZW50UGlwZWFibGVTdHJlYW1PcHRpb25zLFxuICAgIC4uLmhhbmRsZXJPcHRpb25zXG4gIH0gPSB1c2VyT3B0aW9ucztcbiAgY29uc3Qge1xuICAgIGVudHJ5RmlsZTogX2VudHJ5RmlsZSxcbiAgICBjaHVua0ZpbGU6IF9jaHVua0ZpbGUsXG4gICAgYXNzZXRGaWxlOiBfYXNzZXRGaWxlLFxuICAgIHBhZ2VzOiBfcGFnZXMsXG4gICAgLi4uYnVpbGRPcHRpb25zXG4gIH0gPSBfYnVpbGQgPz8ge307XG4gIC8vIFByZXNlcnZlIHRoZSBidWlsZCBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIHNlcmlhbGl6ZWRcbiAgLy8gUmVzcGVjdCB1c2VyIG9wdGlvbnMgZmlyc3QsIHRoZW4gZmFsbCBiYWNrIHRvIGRlZmF1bHRzXG4gIGNvbnN0IHNlcmlhbGl6ZWRCdWlsZCA9IHtcbiAgICAuLi5ERUZBVUxUX0NPTkZJRy5CVUlMRCwgIC8vIFN0YXJ0IHdpdGggZGVmYXVsdHNcbiAgICAuLi5idWlsZE9wdGlvbnMsICAgICAgICAgIC8vIE92ZXJyaWRlIHdpdGggdXNlciBvcHRpb25zXG4gICAgcGFnZXM6IGF1dG9EaXNjb3ZlcmVkRmlsZXNcbiAgICAgID8gQXJyYXkuZnJvbShhdXRvRGlzY292ZXJlZEZpbGVzLnVybE1hcC5rZXlzKCkpXG4gICAgICA6IFtdLFxuICB9O1xuICBcbiAgY29uc3Qge1xuICAgIGlzU2VydmVyRnVuY3Rpb25Db2RlOiBfaXNTZXJ2ZXJGdW5jdGlvbkNvZGUsXG4gICAgaXNDbGllbnRDb21wb25lbnRDb2RlOiBfaXNDbGllbnRDb21wb25lbnRDb2RlLFxuICAgIGlzQ2xpZW50Q29tcG9uZW50QnlDb2RlOiBfaXNDbGllbnRDb21wb25lbnRCeUNvZGUsXG4gICAgaXNDbGllbnRDb21wb25lbnRCeU5hbWU6IF9pc0NsaWVudENvbXBvbmVudEJ5TmFtZSxcbiAgICBnZXREaXJlY3RpdmVUeXBlOiBfZ2V0RGlyZWN0aXZlVHlwZSxcbiAgICBhbGxvd2VkRGlyZWN0aXZlczogYWxsb3dlZERpcmVjdGl2ZXMsXG4gICAgLi4ubG9hZGVyT3B0aW9uc1xuICB9ID0gX2xvYWRlciA/PyB7fTtcbiAgY29uc3Qge1xuICAgIG1vZHVsZVBhdHRlcm46IF9tb2R1bGVQYXR0ZXJuLFxuICAgIGNzc1BhdHRlcm46IF9jc3NQYXR0ZXJuLFxuICAgIGpzb25QYXR0ZXJuOiBfanNvblBhdHRlcm4sXG4gICAgY2xpZW50UGF0dGVybjogX2NsaWVudFBhdHRlcm4sXG4gICAgcHJvcHNQYXR0ZXJuOiBfcHJvcHNQYXR0ZXJuLFxuICAgIHBhZ2VQYXR0ZXJuOiBfcGFnZVBhdHRlcm4sXG4gICAgaHRtbFBhdHRlcm46IF9odG1sUGF0dGVybixcbiAgICByc2NQYXR0ZXJuOiBfcnNjUGF0dGVybixcbiAgICBzZXJ2ZXJQYXR0ZXJuOiBfc2VydmVyUGF0dGVybixcbiAgICBjc3NNb2R1bGVQYXR0ZXJuOiBfY3NzTW9kdWxlUGF0dGVybixcbiAgICB2ZW5kb3JQYXR0ZXJuOiBfdmVuZG9yUGF0dGVybixcbiAgICBub2RlUGF0dGVybjogX25vZGVQYXR0ZXJuLFxuICAgIGRvdFBhdHRlcm46IF9kb3RQYXR0ZXJuLFxuICAgIHZpcnR1YWxQYXR0ZXJuOiBfdmlydHVhbFBhdHRlcm4sXG4gICAgLi4uc2VyaWFsaXplZEF1dG9EaXNjb3ZlclxuICB9ID0gYXV0b0Rpc2NvdmVyO1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgLi4uaGFuZGxlck9wdGlvbnMsXG4gICAgUGFnZTogdHlwZW9mIF9QYWdlID09PSAnc3RyaW5nJyA/IF9QYWdlIDogdW5kZWZpbmVkLFxuICAgIEh0bWw6IHR5cGVvZiBfSHRtbCA9PT0gJ3N0cmluZycgPyBfSHRtbCA6IHVuZGVmaW5lZCxcbiAgICBSb290OiB0eXBlb2YgX1Jvb3QgPT09ICdzdHJpbmcnID8gX1Jvb3QgOiB1bmRlZmluZWQsXG4gICAgbm9ybWFsaXplcjogdW5kZWZpbmVkLFxuICAgIG9uRXZlbnQ6IHVuZGVmaW5lZCxcbiAgICBvbk1ldHJpY3M6IHVuZGVmaW5lZCxcbiAgICBwcm9wc0V4cG9ydE5hbWU6IHByb3BzRXhwb3J0TmFtZSxcbiAgICBwYWdlRXhwb3J0TmFtZTogcGFnZUV4cG9ydE5hbWUsXG4gICAgYnVpbGQ6IHNlcmlhbGl6ZWRCdWlsZCxcbiAgICBsb2FkZXI6IHtcbiAgICAgIGRpcmVjdGl2ZVBhdHRlcm46IHtcbiAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgdmFsaWRhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAuLi5hbGxvd2VkRGlyZWN0aXZlcyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAuLi5sb2FkZXJPcHRpb25zLFxuICAgIH0sXG4gICAgYXV0b0Rpc2NvdmVyOiB7XG4gICAgICBtb2R1bGVQYXR0ZXJuOiBzZXJpYWxpemVSZWdFeHAoX21vZHVsZVBhdHRlcm4pLFxuICAgICAgc2VydmVyUGF0dGVybjogc2VyaWFsaXplUmVnRXhwKF9zZXJ2ZXJQYXR0ZXJuKSxcbiAgICAgIGNsaWVudFBhdHRlcm46IHNlcmlhbGl6ZVJlZ0V4cChfY2xpZW50UGF0dGVybiksXG4gICAgICBwYWdlUGF0dGVybjogc2VyaWFsaXplUmVnRXhwKF9wYWdlUGF0dGVybiksXG4gICAgICBwcm9wc1BhdHRlcm46IHNlcmlhbGl6ZVJlZ0V4cChfcHJvcHNQYXR0ZXJuKSxcbiAgICAgIGNzc1BhdHRlcm46IHNlcmlhbGl6ZVJlZ0V4cChfY3NzUGF0dGVybiksXG4gICAgICBqc29uUGF0dGVybjogc2VyaWFsaXplUmVnRXhwKF9qc29uUGF0dGVybiksXG4gICAgICBodG1sUGF0dGVybjogc2VyaWFsaXplUmVnRXhwKF9odG1sUGF0dGVybiksXG4gICAgICBjc3NNb2R1bGVQYXR0ZXJuOiBzZXJpYWxpemVSZWdFeHAoX2Nzc01vZHVsZVBhdHRlcm4pLFxuICAgICAgdmVuZG9yUGF0dGVybjogc2VyaWFsaXplUmVnRXhwKF92ZW5kb3JQYXR0ZXJuKSxcbiAgICAgIG5vZGVQYXR0ZXJuOiBzZXJpYWxpemVSZWdFeHAoX25vZGVQYXR0ZXJuKSxcbiAgICAgIGRvdFBhdHRlcm46IHNlcmlhbGl6ZVJlZ0V4cChfZG90UGF0dGVybiksXG4gICAgICB2aXJ0dWFsUGF0dGVybjogc2VyaWFsaXplUmVnRXhwKF92aXJ0dWFsUGF0dGVybiksXG4gICAgICByc2NQYXR0ZXJuOiBzZXJpYWxpemVSZWdFeHAoX3JzY1BhdHRlcm4pLFxuICAgICAgLi4uc2VyaWFsaXplZEF1dG9EaXNjb3ZlcixcbiAgICB9LFxuICAgIHNlcnZlclBpcGVhYmxlU3RyZWFtT3B0aW9uczogc2VydmVyUGlwZWFibGVTdHJlYW1PcHRpb25zLFxuICAgIGNsaWVudFBpcGVhYmxlU3RyZWFtT3B0aW9uczogY2xpZW50UGlwZWFibGVTdHJlYW1PcHRpb25zLFxuICB9IGFzIGNvbnN0XG5cbiAgLy8gQ2xlYW4gdGhlIG9iamVjdCB0byByZW1vdmUgbm9uLXNlcmlhbGl6YWJsZSBwcm9wZXJ0aWVzIGFuZCBwcm9jZXNzIFJlZ0V4cCBvYmplY3RzXG4gIGNvbnN0IGNsZWFuZWRSZXN1bHQgPSBjbGVhbk9iamVjdChyZXN1bHQsIGN1c3RvbU5vblNlcmlhbGl6YWJsZUZ1bmN0aW9ucyk7XG4gIGNvbnN0IGZpbmFsUmVzdWx0ID0gcHJvY2Vzc0ZvclNlcmlhbGl6YXRpb24oY2xlYW5lZFJlc3VsdCk7XG4gIHJldHVybiBmaW5hbFJlc3VsdCBhcyBuZXZlclxufTsiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFhQSxNQUFNLCtCQUFBLHVCQUFzQyxHQUFJLENBQUE7QUFBQSxFQUM5Qyxh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