@anansi/webpack-config
Version:
Production ready webpack for React
229 lines (228 loc) • 29.6 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
exports.__esModule = true;
exports.default = makeBaseConfig;
exports.getStyleRules = void 0;
var _stringify = _interopRequireDefault(require("core-js-pure/stable/json/stringify.js"));
var _miniCssExtractPlugin = _interopRequireDefault(require("mini-css-extract-plugin"));
var _path = _interopRequireDefault(require("path"));
var _tsconfigPathsWebpackPlugin = _interopRequireDefault(require("tsconfig-paths-webpack-plugin"));
var _webpackStatsPlugin = require("webpack-stats-plugin");
var _constants = require("./constants");
exports.ROOT_PATH = _constants.ROOT_PATH;
var _generateBabelLoader = require("./generateBabelLoader");
var _nodePolyfill = require("./node-polyfill");
var _package = require("../../package.json");
var _css = _interopRequireDefault(require("./css"));
exports.getStyleRules = _css.default;
function makeBaseConfig({
rootPath,
basePath,
libraryInclude,
libraryExclude,
babelRoot,
buildDir,
mode,
manifestFilename,
babelLoader: babelLoaderOptions,
extraJsLoaders,
inJSOptions,
tsconfigPathsOptions,
svgoOptions,
svgrOptions,
globalStyleDir,
nohash,
argv,
env,
cssExtractOptions,
library
}) {
const WEBPACK_PUBLIC_HOST = process.env.WEBPACK_PUBLIC_HOST || '';
const WEBPACK_PUBLIC_PATH = process.env.WEBPACK_PUBLIC_PATH || '/';
const modules = [_path.default.join(rootPath, basePath), 'node_modules'];
if (globalStyleDir) {
modules.splice(1, 0, _path.default.join(rootPath, basePath, globalStyleDir));
}
const resolve = {
modules,
extensions: ['.ts', '.tsx', '.mts', '.cts', '...'],
extensionAlias: {
'.js': ['.js', '.ts', '.tsx', '.jsx'],
'.mjs': ['.mjs', '.mts'],
'.cjs': ['.cjs', '.cts']
},
fallback: _nodePolyfill.NODE_ALIAS,
plugins: tsconfigPathsOptions !== false ? [new _tsconfigPathsWebpackPlugin.default(tsconfigPathsOptions)] : []
};
const mainBabelLoader = (0, _generateBabelLoader.generateBabelLoader)({
rootPath,
babelRoot,
target: argv?.target,
mode,
babelLoaderOptions,
library
});
const inJSBabelOptions = {
...mainBabelLoader.options
};
delete inJSBabelOptions.cacheDirectory;
delete inJSBabelOptions.cacheIdentifier;
delete inJSBabelOptions.cacheCompression;
if (inJSOptions !== false) {
if (inJSOptions === undefined) {
inJSOptions = {
sourceMap: mode !== 'production'
};
}
extraJsLoaders = [{
loader: require.resolve('@wyw-in-js/webpack-loader'),
options: {
// `resolveOptions` was dropped in https://github.com/callstack/linaria/pull/1001 as it uses webpack directly
//resolveOptions: { ...resolve },
babelOptions: inJSBabelOptions,
...inJSOptions
}
}, ...extraJsLoaders];
}
const plugins = [new _webpackStatsPlugin.StatsWriterPlugin({
filename: manifestFilename,
stats: {
chunkModules: false,
source: false,
chunks: false,
modules: false,
assets: true
}
})];
if (cssExtractOptions !== false) {
plugins.push(new _miniCssExtractPlugin.default({
filename: mode !== 'production' | nohash ? '[name].css' : '[name].[contenthash].css',
chunkFilename: mode !== 'production' | nohash ? '[name].css' : '[name].[contenthash].css',
...cssExtractOptions
}));
}
const assetModuleFilename = nohash || mode !== 'production' ? '[name].[ext][query]' : '[contenthash].[ext][query]';
const config = {
context: rootPath,
entry: {
[env?.name || 'App']: [env?.entrypath || `./${basePath}`]
},
output: {
path: _path.default.join(rootPath, buildDir),
publicPath: WEBPACK_PUBLIC_HOST + WEBPACK_PUBLIC_PATH,
filename: nohash || mode !== 'production' ? '[name].js' : '[name]-[contenthash].js',
chunkFilename: nohash || mode !== 'production' ? '[name].chunk.js' : '[name]-[contenthash].chunk.js',
assetModuleFilename,
globalObject: "(typeof self !== 'undefined' ? self : this)",
// this improves performance and makes this compatible across node 16 and 18 at the same time.
hashFunction: 'xxhash64'
},
cache: {
type: 'filesystem',
buildDependencies: {
config: [__filename] // you may omit this when your CLI automatically adds it
},
// Environment variables that affect webpack output
version: (0, _stringify.default)({
version: _package.version,
target: argv?.target,
mode,
envVars: [process.env.NODE_ENV, process.env.BROWSERSLIST_ENV, process.env.BABEL_ENV, WEBPACK_PUBLIC_HOST, WEBPACK_PUBLIC_PATH, process.env.WEBPACK_ANALYZE, process.env.DEBUG, process.env.NODE_DEBUG
// avoid collisions while being minimal and performant
].join('\0')
})
},
plugins: plugins,
module: {
rules: [{
test: /\.(t|j)sx?$/,
include: [_path.default.join(rootPath, basePath), _path.default.join(rootPath, 'stories'), /\.storybook/, libraryInclude],
exclude: libraryExclude,
oneOf: [/* TODO(deprecated): Drop this once people have a chance to migrate */
{
test: /\.worker\.(t|j)s$/,
include: [new RegExp(basePath), libraryInclude],
use: [{
loader: require.resolve('worker-loader'),
options: {
inline: 'fallback',
filename: nohash ? '[name].js' : mode === 'production' ? '[name]-[contenthash].js' : '[name].js'
}
}, (0, _generateBabelLoader.generateBabelLoader)({
rootPath,
babelRoot,
target: argv?.target,
mode,
babelLoaderOptions,
noHotReload: true
})]
}, {
test: /\.(t|j)sx?$/,
use: [mainBabelLoader, ...extraJsLoaders].filter(l => l)
}]
}, {
test: /\.html$/,
use: [{
loader: require.resolve('html-loader')
}]
}, {
test: /\.(md|txt)$/,
type: 'asset/source'
}, {
test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
oneOf: [{
issuer: /\.(j|t)sx?$/,
use: [{
loader: require.resolve('@svgr/webpack'),
options: {
svgoConfig: svgoOptions,
...svgrOptions
}
}, {
loader: require.resolve('file-loader'),
options: {
name: nohash || mode !== 'production' ? '[name].[ext][query]' : '[md5:contenthash:base64:8].[ext][query]'
}
}],
type: 'javascript/auto'
},
// for non-js files always use file-loader
{
type: 'asset',
generator: {
emit: !argv?.target?.includes?.('node')
}
}]
}, {
test: /\.(apng|png|jpg|gif|ico|webp|avif|cur|ani|otf|eot|woff2|woff|ttf)(\?v=\d+\.\d+\.\d+)?$/,
type: 'asset',
generator: {
emit: !argv?.target?.includes?.('node')
}
}, {
test: /\.(pdf|mp4|webm|wav|mp3|m4a|aac|oga)(\?v=\d+\.\d+\.\d+)?$/,
type: 'asset/resource',
generator: {
emit: !argv?.target?.includes?.('node')
}
}]
},
resolve,
devtool: 'source-map',
stats: {
children: false,
chunks: false,
excludeAssets: [/\.map/]
}
};
if (env?.name) config.name = env.name;
if (process.env.WEBPACK_NO_CACHE === true || process.env.WEBPACK_NO_CACHE === 'true' || process.env.WEBPACK_CACHE === 'none') {
delete config.cache;
} else if (process.env.WEBPACK_CACHE === 'memory') {
config.cache = true;
} else if (process.env.WEBPACK_CACHE === 'filesystem') {
config.cache.type = 'filesystem';
}
return config;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWluaUNzc0V4dHJhY3RQbHVnaW4iLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9wYXRoIiwiX3RzY29uZmlnUGF0aHNXZWJwYWNrUGx1Z2luIiwiX3dlYnBhY2tTdGF0c1BsdWdpbiIsIl9jb25zdGFudHMiLCJleHBvcnRzIiwiUk9PVF9QQVRIIiwiX2dlbmVyYXRlQmFiZWxMb2FkZXIiLCJfbm9kZVBvbHlmaWxsIiwiX3BhY2thZ2UiLCJfY3NzIiwiZ2V0U3R5bGVSdWxlcyIsImRlZmF1bHQiLCJtYWtlQmFzZUNvbmZpZyIsInJvb3RQYXRoIiwiYmFzZVBhdGgiLCJsaWJyYXJ5SW5jbHVkZSIsImxpYnJhcnlFeGNsdWRlIiwiYmFiZWxSb290IiwiYnVpbGREaXIiLCJtb2RlIiwibWFuaWZlc3RGaWxlbmFtZSIsImJhYmVsTG9hZGVyIiwiYmFiZWxMb2FkZXJPcHRpb25zIiwiZXh0cmFKc0xvYWRlcnMiLCJpbkpTT3B0aW9ucyIsInRzY29uZmlnUGF0aHNPcHRpb25zIiwic3Znb09wdGlvbnMiLCJzdmdyT3B0aW9ucyIsImdsb2JhbFN0eWxlRGlyIiwibm9oYXNoIiwiYXJndiIsImVudiIsImNzc0V4dHJhY3RPcHRpb25zIiwibGlicmFyeSIsIldFQlBBQ0tfUFVCTElDX0hPU1QiLCJwcm9jZXNzIiwiV0VCUEFDS19QVUJMSUNfUEFUSCIsIm1vZHVsZXMiLCJwYXRoIiwiam9pbiIsInNwbGljZSIsInJlc29sdmUiLCJleHRlbnNpb25zIiwiZXh0ZW5zaW9uQWxpYXMiLCJmYWxsYmFjayIsIk5PREVfQUxJQVMiLCJwbHVnaW5zIiwiVHNjb25maWdQYXRoc1BsdWdpbiIsIm1haW5CYWJlbExvYWRlciIsImdlbmVyYXRlQmFiZWxMb2FkZXIiLCJ0YXJnZXQiLCJpbkpTQmFiZWxPcHRpb25zIiwib3B0aW9ucyIsImNhY2hlRGlyZWN0b3J5IiwiY2FjaGVJZGVudGlmaWVyIiwiY2FjaGVDb21wcmVzc2lvbiIsInVuZGVmaW5lZCIsInNvdXJjZU1hcCIsImxvYWRlciIsImJhYmVsT3B0aW9ucyIsIlN0YXRzV3JpdGVyUGx1Z2luIiwiZmlsZW5hbWUiLCJzdGF0cyIsImNodW5rTW9kdWxlcyIsInNvdXJjZSIsImNodW5rcyIsImFzc2V0cyIsInB1c2giLCJNaW5pQ3NzRXh0cmFjdFBsdWdpbiIsImNodW5rRmlsZW5hbWUiLCJhc3NldE1vZHVsZUZpbGVuYW1lIiwiY29uZmlnIiwiY29udGV4dCIsImVudHJ5IiwibmFtZSIsImVudHJ5cGF0aCIsIm91dHB1dCIsInB1YmxpY1BhdGgiLCJnbG9iYWxPYmplY3QiLCJoYXNoRnVuY3Rpb24iLCJjYWNoZSIsInR5cGUiLCJidWlsZERlcGVuZGVuY2llcyIsIl9fZmlsZW5hbWUiLCJ2ZXJzaW9uIiwiX3N0cmluZ2lmeSIsImVudlZhcnMiLCJOT0RFX0VOViIsIkJST1dTRVJTTElTVF9FTlYiLCJCQUJFTF9FTlYiLCJXRUJQQUNLX0FOQUxZWkUiLCJERUJVRyIsIk5PREVfREVCVUciLCJtb2R1bGUiLCJydWxlcyIsInRlc3QiLCJpbmNsdWRlIiwiZXhjbHVkZSIsIm9uZU9mIiwiUmVnRXhwIiwidXNlIiwiaW5saW5lIiwibm9Ib3RSZWxvYWQiLCJmaWx0ZXIiLCJsIiwiaXNzdWVyIiwic3Znb0NvbmZpZyIsImdlbmVyYXRvciIsImVtaXQiLCJpbmNsdWRlcyIsImRldnRvb2wiLCJjaGlsZHJlbiIsImV4Y2x1ZGVBc3NldHMiLCJXRUJQQUNLX05PX0NBQ0hFIiwiV0VCUEFDS19DQUNIRSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYXNlL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNaW5pQ3NzRXh0cmFjdFBsdWdpbiBmcm9tICdtaW5pLWNzcy1leHRyYWN0LXBsdWdpbic7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBUc2NvbmZpZ1BhdGhzUGx1Z2luIGZyb20gJ3RzY29uZmlnLXBhdGhzLXdlYnBhY2stcGx1Z2luJztcbmltcG9ydCB7IFN0YXRzV3JpdGVyUGx1Z2luIH0gZnJvbSAnd2VicGFjay1zdGF0cy1wbHVnaW4nO1xuXG5pbXBvcnQgeyBST09UX1BBVEggfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJhYmVsTG9hZGVyIH0gZnJvbSAnLi9nZW5lcmF0ZUJhYmVsTG9hZGVyJztcbmltcG9ydCB7IE5PREVfQUxJQVMgfSBmcm9tICcuL25vZGUtcG9seWZpbGwnO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uLy4uL3BhY2thZ2UuanNvbic7XG5cbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ2V0U3R5bGVSdWxlcyB9IGZyb20gJy4vY3NzJztcbmV4cG9ydCB7IFJPT1RfUEFUSCB9O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYWtlQmFzZUNvbmZpZyh7XG4gIHJvb3RQYXRoLFxuICBiYXNlUGF0aCxcbiAgbGlicmFyeUluY2x1ZGUsXG4gIGxpYnJhcnlFeGNsdWRlLFxuICBiYWJlbFJvb3QsXG4gIGJ1aWxkRGlyLFxuICBtb2RlLFxuICBtYW5pZmVzdEZpbGVuYW1lLFxuICBiYWJlbExvYWRlcjogYmFiZWxMb2FkZXJPcHRpb25zLFxuICBleHRyYUpzTG9hZGVycyxcbiAgaW5KU09wdGlvbnMsXG4gIHRzY29uZmlnUGF0aHNPcHRpb25zLFxuICBzdmdvT3B0aW9ucyxcbiAgc3Znck9wdGlvbnMsXG4gIGdsb2JhbFN0eWxlRGlyLFxuICBub2hhc2gsXG4gIGFyZ3YsXG4gIGVudixcbiAgY3NzRXh0cmFjdE9wdGlvbnMsXG4gIGxpYnJhcnksXG59KSB7XG4gIGNvbnN0IFdFQlBBQ0tfUFVCTElDX0hPU1QgPSBwcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19IT1NUIHx8ICcnO1xuICBjb25zdCBXRUJQQUNLX1BVQkxJQ19QQVRIID0gcHJvY2Vzcy5lbnYuV0VCUEFDS19QVUJMSUNfUEFUSCB8fCAnLyc7XG5cbiAgY29uc3QgbW9kdWxlcyA9IFtwYXRoLmpvaW4ocm9vdFBhdGgsIGJhc2VQYXRoKSwgJ25vZGVfbW9kdWxlcyddO1xuICBpZiAoZ2xvYmFsU3R5bGVEaXIpIHtcbiAgICBtb2R1bGVzLnNwbGljZSgxLCAwLCBwYXRoLmpvaW4ocm9vdFBhdGgsIGJhc2VQYXRoLCBnbG9iYWxTdHlsZURpcikpO1xuICB9XG4gIGNvbnN0IHJlc29sdmUgPSB7XG4gICAgbW9kdWxlcyxcbiAgICBleHRlbnNpb25zOiBbJy50cycsICcudHN4JywgJy5tdHMnLCAnLmN0cycsICcuLi4nXSxcbiAgICBleHRlbnNpb25BbGlhczoge1xuICAgICAgJy5qcyc6IFsnLmpzJywgJy50cycsICcudHN4JywgJy5qc3gnXSxcbiAgICAgICcubWpzJzogWycubWpzJywgJy5tdHMnXSxcbiAgICAgICcuY2pzJzogWycuY2pzJywgJy5jdHMnXSxcbiAgICB9LFxuICAgIGZhbGxiYWNrOiBOT0RFX0FMSUFTLFxuICAgIHBsdWdpbnM6XG4gICAgICB0c2NvbmZpZ1BhdGhzT3B0aW9ucyAhPT0gZmFsc2UgP1xuICAgICAgICBbbmV3IFRzY29uZmlnUGF0aHNQbHVnaW4odHNjb25maWdQYXRoc09wdGlvbnMpXVxuICAgICAgOiBbXSxcbiAgfTtcblxuICBjb25zdCBtYWluQmFiZWxMb2FkZXIgPSBnZW5lcmF0ZUJhYmVsTG9hZGVyKHtcbiAgICByb290UGF0aCxcbiAgICBiYWJlbFJvb3QsXG4gICAgdGFyZ2V0OiBhcmd2Py50YXJnZXQsXG4gICAgbW9kZSxcbiAgICBiYWJlbExvYWRlck9wdGlvbnMsXG4gICAgbGlicmFyeSxcbiAgfSk7XG4gIGNvbnN0IGluSlNCYWJlbE9wdGlvbnMgPSB7XG4gICAgLi4ubWFpbkJhYmVsTG9hZGVyLm9wdGlvbnMsXG4gIH07XG4gIGRlbGV0ZSBpbkpTQmFiZWxPcHRpb25zLmNhY2hlRGlyZWN0b3J5O1xuICBkZWxldGUgaW5KU0JhYmVsT3B0aW9ucy5jYWNoZUlkZW50aWZpZXI7XG4gIGRlbGV0ZSBpbkpTQmFiZWxPcHRpb25zLmNhY2hlQ29tcHJlc3Npb247XG5cbiAgaWYgKGluSlNPcHRpb25zICE9PSBmYWxzZSkge1xuICAgIGlmIChpbkpTT3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpbkpTT3B0aW9ucyA9IHtcbiAgICAgICAgc291cmNlTWFwOiBtb2RlICE9PSAncHJvZHVjdGlvbicsXG4gICAgICB9O1xuICAgIH1cbiAgICBleHRyYUpzTG9hZGVycyA9IFtcbiAgICAgIHtcbiAgICAgICAgbG9hZGVyOiByZXF1aXJlLnJlc29sdmUoJ0B3eXctaW4tanMvd2VicGFjay1sb2FkZXInKSxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIC8vIGByZXNvbHZlT3B0aW9uc2Agd2FzIGRyb3BwZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL2NhbGxzdGFjay9saW5hcmlhL3B1bGwvMTAwMSBhcyBpdCB1c2VzIHdlYnBhY2sgZGlyZWN0bHlcbiAgICAgICAgICAvL3Jlc29sdmVPcHRpb25zOiB7IC4uLnJlc29sdmUgfSxcbiAgICAgICAgICBiYWJlbE9wdGlvbnM6IGluSlNCYWJlbE9wdGlvbnMsXG4gICAgICAgICAgLi4uaW5KU09wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgLi4uZXh0cmFKc0xvYWRlcnMsXG4gICAgXTtcbiAgfVxuXG4gIGNvbnN0IHBsdWdpbnMgPSBbXG4gICAgbmV3IFN0YXRzV3JpdGVyUGx1Z2luKHtcbiAgICAgIGZpbGVuYW1lOiBtYW5pZmVzdEZpbGVuYW1lLFxuICAgICAgc3RhdHM6IHtcbiAgICAgICAgY2h1bmtNb2R1bGVzOiBmYWxzZSxcbiAgICAgICAgc291cmNlOiBmYWxzZSxcbiAgICAgICAgY2h1bmtzOiBmYWxzZSxcbiAgICAgICAgbW9kdWxlczogZmFsc2UsXG4gICAgICAgIGFzc2V0czogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSksXG4gIF07XG5cbiAgaWYgKGNzc0V4dHJhY3RPcHRpb25zICE9PSBmYWxzZSkge1xuICAgIHBsdWdpbnMucHVzaChcbiAgICAgIG5ldyBNaW5pQ3NzRXh0cmFjdFBsdWdpbih7XG4gICAgICAgIGZpbGVuYW1lOlxuICAgICAgICAgIChtb2RlICE9PSAncHJvZHVjdGlvbicpIHwgbm9oYXNoID9cbiAgICAgICAgICAgICdbbmFtZV0uY3NzJ1xuICAgICAgICAgIDogJ1tuYW1lXS5bY29udGVudGhhc2hdLmNzcycsXG4gICAgICAgIGNodW5rRmlsZW5hbWU6XG4gICAgICAgICAgKG1vZGUgIT09ICdwcm9kdWN0aW9uJykgfCBub2hhc2ggP1xuICAgICAgICAgICAgJ1tuYW1lXS5jc3MnXG4gICAgICAgICAgOiAnW25hbWVdLltjb250ZW50aGFzaF0uY3NzJyxcbiAgICAgICAgLi4uY3NzRXh0cmFjdE9wdGlvbnMsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgYXNzZXRNb2R1bGVGaWxlbmFtZSA9XG4gICAgbm9oYXNoIHx8IG1vZGUgIT09ICdwcm9kdWN0aW9uJyA/XG4gICAgICAnW25hbWVdLltleHRdW3F1ZXJ5XSdcbiAgICA6ICdbY29udGVudGhhc2hdLltleHRdW3F1ZXJ5XSc7XG4gIGNvbnN0IGNvbmZpZyA9IHtcbiAgICBjb250ZXh0OiByb290UGF0aCxcbiAgICBlbnRyeToge1xuICAgICAgW2Vudj8ubmFtZSB8fCAnQXBwJ106IFtlbnY/LmVudHJ5cGF0aCB8fCBgLi8ke2Jhc2VQYXRofWBdLFxuICAgIH0sXG4gICAgb3V0cHV0OiB7XG4gICAgICBwYXRoOiBwYXRoLmpvaW4ocm9vdFBhdGgsIGJ1aWxkRGlyKSxcbiAgICAgIHB1YmxpY1BhdGg6IFdFQlBBQ0tfUFVCTElDX0hPU1QgKyBXRUJQQUNLX1BVQkxJQ19QQVRILFxuICAgICAgZmlsZW5hbWU6XG4gICAgICAgIG5vaGFzaCB8fCBtb2RlICE9PSAncHJvZHVjdGlvbicgP1xuICAgICAgICAgICdbbmFtZV0uanMnXG4gICAgICAgIDogJ1tuYW1lXS1bY29udGVudGhhc2hdLmpzJyxcbiAgICAgIGNodW5rRmlsZW5hbWU6XG4gICAgICAgIG5vaGFzaCB8fCBtb2RlICE9PSAncHJvZHVjdGlvbicgP1xuICAgICAgICAgICdbbmFtZV0uY2h1bmsuanMnXG4gICAgICAgIDogJ1tuYW1lXS1bY29udGVudGhhc2hdLmNodW5rLmpzJyxcbiAgICAgIGFzc2V0TW9kdWxlRmlsZW5hbWUsXG4gICAgICBnbG9iYWxPYmplY3Q6IFwiKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzKVwiLFxuICAgICAgLy8gdGhpcyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBhbmQgbWFrZXMgdGhpcyBjb21wYXRpYmxlIGFjcm9zcyBub2RlIDE2IGFuZCAxOCBhdCB0aGUgc2FtZSB0aW1lLlxuICAgICAgaGFzaEZ1bmN0aW9uOiAneHhoYXNoNjQnLFxuICAgIH0sXG4gICAgY2FjaGU6IHtcbiAgICAgIHR5cGU6ICdmaWxlc3lzdGVtJyxcbiAgICAgIGJ1aWxkRGVwZW5kZW5jaWVzOiB7XG4gICAgICAgIGNvbmZpZzogW19fZmlsZW5hbWVdLCAvLyB5b3UgbWF5IG9taXQgdGhpcyB3aGVuIHlvdXIgQ0xJIGF1dG9tYXRpY2FsbHkgYWRkcyBpdFxuICAgICAgfSxcbiAgICAgIC8vIEVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IGFmZmVjdCB3ZWJwYWNrIG91dHB1dFxuICAgICAgdmVyc2lvbjogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICB0YXJnZXQ6IGFyZ3Y/LnRhcmdldCxcbiAgICAgICAgbW9kZSxcbiAgICAgICAgZW52VmFyczogW1xuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WLFxuICAgICAgICAgIHByb2Nlc3MuZW52LkJST1dTRVJTTElTVF9FTlYsXG4gICAgICAgICAgcHJvY2Vzcy5lbnYuQkFCRUxfRU5WLFxuICAgICAgICAgIFdFQlBBQ0tfUFVCTElDX0hPU1QsXG4gICAgICAgICAgV0VCUEFDS19QVUJMSUNfUEFUSCxcbiAgICAgICAgICBwcm9jZXNzLmVudi5XRUJQQUNLX0FOQUxZWkUsXG4gICAgICAgICAgcHJvY2Vzcy5lbnYuREVCVUcsXG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyxcbiAgICAgICAgICAvLyBhdm9pZCBjb2xsaXNpb25zIHdoaWxlIGJlaW5nIG1pbmltYWwgYW5kIHBlcmZvcm1hbnRcbiAgICAgICAgXS5qb2luKCdcXDAnKSxcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgcGx1Z2luczogcGx1Z2lucyxcbiAgICBtb2R1bGU6IHtcbiAgICAgIHJ1bGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXN0OiAvXFwuKHR8ailzeD8kLyxcbiAgICAgICAgICBpbmNsdWRlOiBbXG4gICAgICAgICAgICBwYXRoLmpvaW4ocm9vdFBhdGgsIGJhc2VQYXRoKSxcbiAgICAgICAgICAgIHBhdGguam9pbihyb290UGF0aCwgJ3N0b3JpZXMnKSxcbiAgICAgICAgICAgIC9cXC5zdG9yeWJvb2svLFxuICAgICAgICAgICAgbGlicmFyeUluY2x1ZGUsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBleGNsdWRlOiBsaWJyYXJ5RXhjbHVkZSxcbiAgICAgICAgICBvbmVPZjogW1xuICAgICAgICAgICAgLyogVE9ETyhkZXByZWNhdGVkKTogRHJvcCB0aGlzIG9uY2UgcGVvcGxlIGhhdmUgYSBjaGFuY2UgdG8gbWlncmF0ZSAqL1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0ZXN0OiAvXFwud29ya2VyXFwuKHR8ailzJC8sXG4gICAgICAgICAgICAgIGluY2x1ZGU6IFtuZXcgUmVnRXhwKGJhc2VQYXRoKSwgbGlicmFyeUluY2x1ZGVdLFxuICAgICAgICAgICAgICB1c2U6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBsb2FkZXI6IHJlcXVpcmUucmVzb2x2ZSgnd29ya2VyLWxvYWRlcicpLFxuICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICBpbmxpbmU6ICdmYWxsYmFjaycsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOlxuICAgICAgICAgICAgICAgICAgICAgIG5vaGFzaCA/ICdbbmFtZV0uanMnXG4gICAgICAgICAgICAgICAgICAgICAgOiBtb2RlID09PSAncHJvZHVjdGlvbicgPyAnW25hbWVdLVtjb250ZW50aGFzaF0uanMnXG4gICAgICAgICAgICAgICAgICAgICAgOiAnW25hbWVdLmpzJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZUJhYmVsTG9hZGVyKHtcbiAgICAgICAgICAgICAgICAgIHJvb3RQYXRoLFxuICAgICAgICAgICAgICAgICAgYmFiZWxSb290LFxuICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBhcmd2Py50YXJnZXQsXG4gICAgICAgICAgICAgICAgICBtb2RlLFxuICAgICAgICAgICAgICAgICAgYmFiZWxMb2FkZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgbm9Ib3RSZWxvYWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0ZXN0OiAvXFwuKHR8ailzeD8kLyxcbiAgICAgICAgICAgICAgdXNlOiBbbWFpbkJhYmVsTG9hZGVyLCAuLi5leHRyYUpzTG9hZGVyc10uZmlsdGVyKGwgPT4gbCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXN0OiAvXFwuaHRtbCQvLFxuICAgICAgICAgIHVzZTogW3sgbG9hZGVyOiByZXF1aXJlLnJlc29sdmUoJ2h0bWwtbG9hZGVyJykgfV0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXN0OiAvXFwuKG1kfHR4dCkkLyxcbiAgICAgICAgICB0eXBlOiAnYXNzZXQvc291cmNlJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRlc3Q6IC9cXC5zdmcoXFw/dj1cXGQrXFwuXFxkK1xcLlxcZCspPyQvLFxuICAgICAgICAgIG9uZU9mOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlzc3VlcjogL1xcLihqfHQpc3g/JC8sXG4gICAgICAgICAgICAgIHVzZTogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGxvYWRlcjogcmVxdWlyZS5yZXNvbHZlKCdAc3Znci93ZWJwYWNrJyksXG4gICAgICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIHN2Z29Db25maWc6IHN2Z29PcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAuLi5zdmdyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBsb2FkZXI6IHJlcXVpcmUucmVzb2x2ZSgnZmlsZS1sb2FkZXInKSxcbiAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTpcbiAgICAgICAgICAgICAgICAgICAgICBub2hhc2ggfHwgbW9kZSAhPT0gJ3Byb2R1Y3Rpb24nID9cbiAgICAgICAgICAgICAgICAgICAgICAgICdbbmFtZV0uW2V4dF1bcXVlcnldJ1xuICAgICAgICAgICAgICAgICAgICAgIDogJ1ttZDU6Y29udGVudGhhc2g6YmFzZTY0OjhdLltleHRdW3F1ZXJ5XScsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHR5cGU6ICdqYXZhc2NyaXB0L2F1dG8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIGZvciBub24tanMgZmlsZXMgYWx3YXlzIHVzZSBmaWxlLWxvYWRlclxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAnYXNzZXQnLFxuICAgICAgICAgICAgICBnZW5lcmF0b3I6IHtcbiAgICAgICAgICAgICAgICBlbWl0OiAhYXJndj8udGFyZ2V0Py5pbmNsdWRlcz8uKCdub2RlJyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXN0OiAvXFwuKGFwbmd8cG5nfGpwZ3xnaWZ8aWNvfHdlYnB8YXZpZnxjdXJ8YW5pfG90Znxlb3R8d29mZjJ8d29mZnx0dGYpKFxcP3Y9XFxkK1xcLlxcZCtcXC5cXGQrKT8kLyxcbiAgICAgICAgICB0eXBlOiAnYXNzZXQnLFxuICAgICAgICAgIGdlbmVyYXRvcjoge1xuICAgICAgICAgICAgZW1pdDogIWFyZ3Y/LnRhcmdldD8uaW5jbHVkZXM/Lignbm9kZScpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXN0OiAvXFwuKHBkZnxtcDR8d2VibXx3YXZ8bXAzfG00YXxhYWN8b2dhKShcXD92PVxcZCtcXC5cXGQrXFwuXFxkKyk/JC8sXG4gICAgICAgICAgdHlwZTogJ2Fzc2V0L3Jlc291cmNlJyxcbiAgICAgICAgICBnZW5lcmF0b3I6IHtcbiAgICAgICAgICAgIGVtaXQ6ICFhcmd2Py50YXJnZXQ/LmluY2x1ZGVzPy4oJ25vZGUnKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHJlc29sdmUsXG4gICAgZGV2dG9vbDogJ3NvdXJjZS1tYXAnLFxuICAgIHN0YXRzOiB7XG4gICAgICBjaGlsZHJlbjogZmFsc2UsXG4gICAgICBjaHVua3M6IGZhbHNlLFxuICAgICAgZXhjbHVkZUFzc2V0czogWy9cXC5tYXAvXSxcbiAgICB9LFxuICB9O1xuICBpZiAoZW52Py5uYW1lKSBjb25maWcubmFtZSA9IGVudi5uYW1lO1xuXG4gIGlmIChcbiAgICBwcm9jZXNzLmVudi5XRUJQQUNLX05PX0NBQ0hFID09PSB0cnVlIHx8XG4gICAgcHJvY2Vzcy5lbnYuV0VCUEFDS19OT19DQUNIRSA9PT0gJ3RydWUnIHx8XG4gICAgcHJvY2Vzcy5lbnYuV0VCUEFDS19DQUNIRSA9PT0gJ25vbmUnXG4gICkge1xuICAgIGRlbGV0ZSBjb25maWcuY2FjaGU7XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuV0VCUEFDS19DQUNIRSA9PT0gJ21lbW9yeScpIHtcbiAgICBjb25maWcuY2FjaGUgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52LldFQlBBQ0tfQ0FDSEUgPT09ICdmaWxlc3lzdGVtJykge1xuICAgIGNvbmZpZy5jYWNoZS50eXBlID0gJ2ZpbGVzeXN0ZW0nO1xuICB9XG4gIHJldHVybiBjb25maWc7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxJQUFBQSxxQkFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsS0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsMkJBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLG1CQUFBLEdBQUFILE9BQUE7QUFFQSxJQUFBSSxVQUFBLEdBQUFKLE9BQUE7QUFBd0NLLE9BQUEsQ0FBQUMsU0FBQSxHQUFBRixVQUFBLENBQUFFLFNBQUE7QUFDeEMsSUFBQUMsb0JBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLGFBQUEsR0FBQVIsT0FBQTtBQUNBLElBQUFTLFFBQUEsR0FBQVQsT0FBQTtBQUVBLElBQUFVLElBQUEsR0FBQVgsc0JBQUEsQ0FBQUMsT0FBQTtBQUFpREssT0FBQSxDQUFBTSxhQUFBLEdBQUFELElBQUEsQ0FBQUUsT0FBQTtBQUdsQyxTQUFTQyxjQUFjQSxDQUFDO0VBQ3JDQyxRQUFRO0VBQ1JDLFFBQVE7RUFDUkMsY0FBYztFQUNkQyxjQUFjO0VBQ2RDLFNBQVM7RUFDVEMsUUFBUTtFQUNSQyxJQUFJO0VBQ0pDLGdCQUFnQjtFQUNoQkMsV0FBVyxFQUFFQyxrQkFBa0I7RUFDL0JDLGNBQWM7RUFDZEMsV0FBVztFQUNYQyxvQkFBb0I7RUFDcEJDLFdBQVc7RUFDWEMsV0FBVztFQUNY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