@anansi/webpack-config
Version:
Production ready webpack for React
153 lines (152 loc) • 18.9 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
exports.__esModule = true;
exports.default = makeDevConfig;
var _htmlWebpackPlugin = _interopRequireDefault(require("html-webpack-plugin"));
var _path = _interopRequireDefault(require("path"));
var _webpack = _interopRequireDefault(require("webpack"));
var _runtime = _interopRequireDefault(require("webpack/lib/logging/runtime"));
var _base = require("./base");
var _getHttpsConfig = _interopRequireDefault(require("./getHttpsConfig"));
var _ErrorOverlayPlugin = _interopRequireDefault(require("./plugins/ErrorOverlayPlugin"));
const chalk = require('react-dev-utils/chalk');
function makeDevConfig(baseConfig, {
rootPath,
basePath,
libraryInclude,
libraryExclude,
htmlOptions = {
title: 'Anansi app',
scriptLoading: 'defer'
},
argv = {},
// eslint-disable-next-line no-unused-vars
env = {},
sassOptions,
sassResources,
cssModulesOptions,
globalStyleDir,
isStackblitz,
cssExtractOptions
}) {
const config = {
...baseConfig
};
config.mode = 'development';
// https://webpack.js.org/guides/build-performance/#output-without-path-info
config.output.pathinfo = false;
config.output.devtoolModuleFilenameTemplate = info => _path.default.resolve(info.absoluteResourcePath).replace(/\\/g, '/');
config.optimization = {
// https://webpack.js.org/guides/build-performance/#avoid-extra-optimization-steps
removeAvailableModules: false,
removeEmptyChunks: false,
splitChunks: false,
// save perf when errors occur
emitOnErrors: false,
// https://webpack.js.org/guides/build-performance/#minimal-entry-chunk
runtimeChunk: true
};
const watchIgnorePaths = [/(hot-update\.[^.]|\.map|s?css\.d\.ts)$/, _path.default.join(rootPath, '.cache'), /node_modules\/\.cache(?!\/(\.wyw-in-js-(cache|development|production)\/))/];
config.plugins = [new _webpack.default.WatchIgnorePlugin({
paths: watchIgnorePaths
}), ...config.plugins];
// not for server builds
if (!argv?.target?.includes?.('node')) {
config.plugins.unshift(new _htmlWebpackPlugin.default(htmlOptions));
}
let server = 'http';
try {
server = (0, _getHttpsConfig.default)(rootPath);
} catch {
console.warn(chalk.yellow('Falling back to http'));
}
config.devServer = {
hot: true,
compress: true,
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': '*',
'Access-Control-Allow-Headers': '*'
},
allowedHosts: ['localhost', '127.0.0.1', '.csb.app'],
server,
devMiddleware: {
publicPath: config.output.publicPath,
stats: {
preset: 'minimal',
children: 'errors-only',
excludeAssets: [/\.map/]
}
},
client: {
logging: 'warn',
overlay: false,
// we have our own overlay, so ignore this
webSocketURL: {
hostname: 'localhost',
pathname: '/ws',
port: argv.port
}
},
historyApiFallback: true
// TODO: add proxy options
};
config.devtool = 'cheap-module-source-map';
// if we know the port, force it in case this is encapsulated in another host
if (argv.port) {
config.output.publicPath = `http://localhost:${argv.port}${config.output.publicPath}`;
}
if (!config.resolve.alias) {
config.resolve.alias = {};
}
if (process.env.NO_HOT_RELOAD !== 'true' && process.env.NO_HOT_RELOAD !== true && !argv?.target?.includes?.('node')) {
try {
require('react-refresh/babel');
const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
config.plugins.push(
// these are needed by the react-dev-utils overlay
new _webpack.default.EnvironmentPlugin({
WDS_SOCKET_HOST: '',
WDS_SOCKET_PATH: '',
WDS_SOCKET_PORT: '',
FAST_REFRESH: true
}), new ReactRefreshWebpackPlugin({
overlay: {
// provides editor opening when combined with ErrorOverlayPlugin
entry: require.resolve('./plugins/ErrorOverlayEntry'),
// registers error handlers
module: require.resolve('./plugins/refreshOverlayModule')
}
}), new _ErrorOverlayPlugin.default());
config.devServer.hot = 'only';
_runtime.default.getLogger('anansi').info('React fast refresh detected and enabled');
// eslint-disable-next-line no-empty
} catch {}
}
if (!config.experiments) {
config.experiments = {};
}
// this doesn't work well with webcontainers
if (!isStackblitz) {
// TODO: enable once we can figure out how to make it work with manifest and await for SSR
//config.experiments.lazyCompilation = { entries: false };
}
const styleRules = (0, _base.getStyleRules)({
rootPath,
basePath,
libraryInclude,
libraryExclude,
cssModulesOptions: {
localIdentName: '[folder]_[name]__[local]___[xxhash64:hash:base64:5]',
...cssModulesOptions
},
sassOptions,
sassResources,
globalStyleDir,
target: argv?.target,
cssExtractOptions
});
config.module.rules = [...config.module.rules, styleRules];
return config;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaHRtbFdlYnBhY2tQbHVnaW4iLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9wYXRoIiwiX3dlYnBhY2siLCJfcnVudGltZSIsIl9iYXNlIiwiX2dldEh0dHBzQ29uZmlnIiwiX0Vycm9yT3ZlcmxheVBsdWdpbiIsImNoYWxrIiwibWFrZURldkNvbmZpZyIsImJhc2VDb25maWciLCJyb290UGF0aCIsImJhc2VQYXRoIiwibGlicmFyeUluY2x1ZGUiLCJsaWJyYXJ5RXhjbHVkZSIsImh0bWxPcHRpb25zIiwidGl0bGUiLCJzY3JpcHRMb2FkaW5nIiwiYXJndiIsImVudiIsInNhc3NPcHRpb25zIiwic2Fzc1Jlc291cmNlcyIsImNzc01vZHVsZXNPcHRpb25zIiwiZ2xvYmFsU3R5bGVEaXIiLCJpc1N0YWNrYmxpdHoiLCJjc3NFeHRyYWN0T3B0aW9ucyIsImNvbmZpZyIsIm1vZGUiLCJvdXRwdXQiLCJwYXRoaW5mbyIsImRldnRvb2xNb2R1bGVGaWxlbmFtZVRlbXBsYXRlIiwiaW5mbyIsInBhdGgiLCJyZXNvbHZlIiwiYWJzb2x1dGVSZXNvdXJjZVBhdGgiLCJyZXBsYWNlIiwib3B0aW1pemF0aW9uIiwicmVtb3ZlQXZhaWxhYmxlTW9kdWxlcyIsInJlbW92ZUVtcHR5Q2h1bmtzIiwic3BsaXRDaHVua3MiLCJlbWl0T25FcnJvcnMiLCJydW50aW1lQ2h1bmsiLCJ3YXRjaElnbm9yZVBhdGhzIiwiam9pbiIsInBsdWdpbnMiLCJ3ZWJwYWNrIiwiV2F0Y2hJZ25vcmVQbHVnaW4iLCJwYXRocyIsInRhcmdldCIsImluY2x1ZGVzIiwidW5zaGlmdCIsIkh0bWxXZWJwYWNrUGx1Z2luIiwic2VydmVyIiwiZ2V0SHR0cHNDb25maWciLCJjb25zb2xlIiwid2FybiIsInllbGxvdyIsImRldlNlcnZlciIsImhvdCIsImNvbXByZXNzIiwiaGVhZGVycyIsImFsbG93ZWRIb3N0cyIsImRldk1pZGRsZXdhcmUiLCJwdWJsaWNQYXRoIiwic3RhdHMiLCJwcmVzZXQiLCJjaGlsZHJlbiIsImV4Y2x1ZGVBc3NldHMiLCJjbGllbnQiLCJsb2dnaW5nIiwib3ZlcmxheSIsIndlYlNvY2tldFVSTCIsImhvc3RuYW1lIiwicGF0aG5hbWUiLCJwb3J0IiwiaGlzdG9yeUFwaUZhbGxiYWNrIiwiZGV2dG9vbCIsImFsaWFzIiwicHJvY2VzcyIsIk5PX0hPVF9SRUxPQUQiLCJSZWFjdFJlZnJlc2hXZWJwYWNrUGx1Z2luIiwicHVzaCIsIkVudmlyb25tZW50UGx1Z2luIiwiV0RTX1NPQ0tFVF9IT1NUIiwiV0RTX1NPQ0tFVF9QQVRIIiwiV0RTX1NPQ0tFVF9QT1JUIiwiRkFTVF9SRUZSRVNIIiwiZW50cnkiLCJtb2R1bGUiLCJFcnJvck92ZXJsYXlQbHVnaW4iLCJnZXRMb2dnZXIiLCJleHBlcmltZW50cyIsInN0eWxlUnVsZXMiLCJnZXRTdHlsZVJ1bGVzIiwibG9jYWxJZGVudE5hbWUiLCJydWxlcyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9kZXYuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEh0bWxXZWJwYWNrUGx1Z2luIGZyb20gJ2h0bWwtd2VicGFjay1wbHVnaW4nO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgd2VicGFjayBmcm9tICd3ZWJwYWNrJztcbmltcG9ydCBsb2dnaW5nIGZyb20gJ3dlYnBhY2svbGliL2xvZ2dpbmcvcnVudGltZSc7XG5cbmltcG9ydCB7IGdldFN0eWxlUnVsZXMgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IGdldEh0dHBzQ29uZmlnIGZyb20gJy4vZ2V0SHR0cHNDb25maWcnO1xuaW1wb3J0IEVycm9yT3ZlcmxheVBsdWdpbiBmcm9tICcuL3BsdWdpbnMvRXJyb3JPdmVybGF5UGx1Z2luJztcblxuY29uc3QgY2hhbGsgPSByZXF1aXJlKCdyZWFjdC1kZXYtdXRpbHMvY2hhbGsnKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWFrZURldkNvbmZpZyhcbiAgYmFzZUNvbmZpZyxcbiAge1xuICAgIHJvb3RQYXRoLFxuICAgIGJhc2VQYXRoLFxuICAgIGxpYnJhcnlJbmNsdWRlLFxuICAgIGxpYnJhcnlFeGNsdWRlLFxuICAgIGh0bWxPcHRpb25zID0geyB0aXRsZTogJ0FuYW5zaSBhcHAnLCBzY3JpcHRMb2FkaW5nOiAnZGVmZXInIH0sXG4gICAgYXJndiA9IHt9LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGVudiA9IHt9LFxuICAgIHNhc3NPcHRpb25zLFxuICAgIHNhc3NSZXNvdXJjZXMsXG4gICAgY3NzTW9kdWxlc09wdGlvbnMsXG4gICAgZ2xvYmFsU3R5bGVEaXIsXG4gICAgaXNTdGFja2JsaXR6LFxuICAgIGNzc0V4dHJhY3RPcHRpb25zLFxuICB9LFxuKSB7XG4gIGNvbnN0IGNvbmZpZyA9IHsgLi4uYmFzZUNvbmZpZyB9O1xuXG4gIGNvbmZpZy5tb2RlID0gJ2RldmVsb3BtZW50JztcbiAgLy8gaHR0cHM6Ly93ZWJwYWNrLmpzLm9yZy9ndWlkZXMvYnVpbGQtcGVyZm9ybWFuY2UvI291dHB1dC13aXRob3V0LXBhdGgtaW5mb1xuICBjb25maWcub3V0cHV0LnBhdGhpbmZvID0gZmFsc2U7XG4gIGNvbmZpZy5vdXRwdXQuZGV2dG9vbE1vZHVsZUZpbGVuYW1lVGVtcGxhdGUgPSBpbmZvID0+XG4gICAgcGF0aC5yZXNvbHZlKGluZm8uYWJzb2x1dGVSZXNvdXJjZVBhdGgpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgY29uZmlnLm9wdGltaXphdGlvbiA9IHtcbiAgICAvLyBodHRwczovL3dlYnBhY2suanMub3JnL2d1aWRlcy9idWlsZC1wZXJmb3JtYW5jZS8jYXZvaWQtZXh0cmEtb3B0aW1pemF0aW9uLXN0ZXBzXG4gICAgcmVtb3ZlQXZhaWxhYmxlTW9kdWxlczogZmFsc2UsXG4gICAgcmVtb3ZlRW1wdHlDaHVua3M6IGZhbHNlLFxuICAgIHNwbGl0Q2h1bmtzOiBmYWxzZSxcbiAgICAvLyBzYXZlIHBlcmYgd2hlbiBlcnJvcnMgb2NjdXJcbiAgICBlbWl0T25FcnJvcnM6IGZhbHNlLFxuICAgIC8vIGh0dHBzOi8vd2VicGFjay5qcy5vcmcvZ3VpZGVzL2J1aWxkLXBlcmZvcm1hbmNlLyNtaW5pbWFsLWVudHJ5LWNodW5rXG4gICAgcnVudGltZUNodW5rOiB0cnVlLFxuICB9O1xuXG4gIGNvbnN0IHdhdGNoSWdub3JlUGF0aHMgPSBbXG4gICAgLyhob3QtdXBkYXRlXFwuW14uXXxcXC5tYXB8cz9jc3NcXC5kXFwudHMpJC8sXG4gICAgcGF0aC5qb2luKHJvb3RQYXRoLCAnLmNhY2hlJyksXG4gICAgL25vZGVfbW9kdWxlc1xcL1xcLmNhY2hlKD8hXFwvKFxcLnd5dy1pbi1qcy0oY2FjaGV8ZGV2ZWxvcG1lbnR8cHJvZHVjdGlvbilcXC8pKS8sXG4gIF07XG4gIGNvbmZpZy5wbHVnaW5zID0gW1xuICAgIG5ldyB3ZWJwYWNrLldhdGNoSWdub3JlUGx1Z2luKHsgcGF0aHM6IHdhdGNoSWdub3JlUGF0aHMgfSksXG4gICAgLi4uY29uZmlnLnBsdWdpbnMsXG4gIF07XG4gIC8vIG5vdCBmb3Igc2VydmVyIGJ1aWxkc1xuICBpZiAoIWFyZ3Y/LnRhcmdldD8uaW5jbHVkZXM/Lignbm9kZScpKSB7XG4gICAgY29uZmlnLnBsdWdpbnMudW5zaGlmdChuZXcgSHRtbFdlYnBhY2tQbHVnaW4oaHRtbE9wdGlvbnMpKTtcbiAgfVxuICBsZXQgc2VydmVyID0gJ2h0dHAnO1xuICB0cnkge1xuICAgIHNlcnZlciA9IGdldEh0dHBzQ29uZmlnKHJvb3RQYXRoKTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdygnRmFsbGluZyBiYWNrIHRvIGh0dHAnKSk7XG4gIH1cbiAgY29uZmlnLmRldlNlcnZlciA9IHtcbiAgICBob3Q6IHRydWUsXG4gICAgY29tcHJlc3M6IHRydWUsXG4gICAgaGVhZGVyczoge1xuICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbic6ICcqJyxcbiAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJzogJyonLFxuICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnOiAnKicsXG4gICAgfSxcbiAgICBhbGxvd2VkSG9zdHM6IFsnbG9jYWxob3N0JywgJzEyNy4wLjAuMScsICcuY3NiLmFwcCddLFxuICAgIHNlcnZlcixcbiAgICBkZXZNaWRkbGV3YXJlOiB7XG4gICAgICBwdWJsaWNQYXRoOiBjb25maWcub3V0cHV0LnB1YmxpY1BhdGgsXG4gICAgICBzdGF0czoge1xuICAgICAgICBwcmVzZXQ6ICdtaW5pbWFsJyxcbiAgICAgICAgY2hpbGRyZW46ICdlcnJvcnMtb25seScsXG4gICAgICAgIGV4Y2x1ZGVBc3NldHM6IFsvXFwubWFwL10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY2xpZW50OiB7XG4gICAgICBsb2dnaW5nOiAnd2FybicsXG4gICAgICBvdmVybGF5OiBmYWxzZSwgLy8gd2UgaGF2ZSBvdXIgb3duIG92ZXJsYXksIHNvIGlnbm9yZSB0aGlzXG4gICAgICB3ZWJTb2NrZXRVUkw6IHtcbiAgICAgICAgaG9zdG5hbWU6ICdsb2NhbGhvc3QnLFxuICAgICAgICBwYXRobmFtZTogJy93cycsXG4gICAgICAgIHBvcnQ6IGFyZ3YucG9ydCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBoaXN0b3J5QXBpRmFsbGJhY2s6IHRydWUsXG4gICAgLy8gVE9ETzogYWRkIHByb3h5IG9wdGlvbnNcbiAgfTtcbiAgY29uZmlnLmRldnRvb2wgPSAnY2hlYXAtbW9kdWxlLXNvdXJjZS1tYXAnO1xuICAvLyBpZiB3ZSBrbm93IHRoZSBwb3J0LCBmb3JjZSBpdCBpbiBjYXNlIHRoaXMgaXMgZW5jYXBzdWxhdGVkIGluIGFub3RoZXIgaG9zdFxuICBpZiAoYXJndi5wb3J0KSB7XG4gICAgY29uZmlnLm91dHB1dC5wdWJsaWNQYXRoID0gYGh0dHA6Ly9sb2NhbGhvc3Q6JHthcmd2LnBvcnR9JHtjb25maWcub3V0cHV0LnB1YmxpY1BhdGh9YDtcbiAgfVxuICBpZiAoIWNvbmZpZy5yZXNvbHZlLmFsaWFzKSB7XG4gICAgY29uZmlnLnJlc29sdmUuYWxpYXMgPSB7fTtcbiAgfVxuICBpZiAoXG4gICAgcHJvY2Vzcy5lbnYuTk9fSE9UX1JFTE9BRCAhPT0gJ3RydWUnICYmXG4gICAgcHJvY2Vzcy5lbnYuTk9fSE9UX1JFTE9BRCAhPT0gdHJ1ZSAmJlxuICAgICFhcmd2Py50YXJnZXQ/LmluY2x1ZGVzPy4oJ25vZGUnKVxuICApIHtcbiAgICB0cnkge1xuICAgICAgcmVxdWlyZSgncmVhY3QtcmVmcmVzaC9iYWJlbCcpO1xuICAgICAgY29uc3QgUmVhY3RSZWZyZXNoV2VicGFja1BsdWdpbiA9IHJlcXVpcmUoJ0BwbW1td2gvcmVhY3QtcmVmcmVzaC13ZWJwYWNrLXBsdWdpbicpO1xuICAgICAgY29uZmlnLnBsdWdpbnMucHVzaChcbiAgICAgICAgLy8gdGhlc2UgYXJlIG5lZWRlZCBieSB0aGUgcmVhY3QtZGV2LXV0aWxzIG92ZXJsYXlcbiAgICAgICAgbmV3IHdlYnBhY2suRW52aXJvbm1lbnRQbHVnaW4oe1xuICAgICAgICAgIFdEU19TT0NLRVRfSE9TVDogJycsXG4gICAgICAgICAgV0RTX1NPQ0tFVF9QQVRIOiAnJyxcbiAgICAgICAgICBXRFNfU09DS0VUX1BPUlQ6ICcnLFxuICAgICAgICAgIEZBU1RfUkVGUkVTSDogdHJ1ZSxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBSZWFjdFJlZnJlc2hXZWJwYWNrUGx1Z2luKHtcbiAgICAgICAgICBvdmVybGF5OiB7XG4gICAgICAgICAgICAvLyBwcm92aWRlcyBlZGl0b3Igb3BlbmluZyB3aGVuIGNvbWJpbmVkIHdpdGggRXJyb3JPdmVybGF5UGx1Z2luXG4gICAgICAgICAgICBlbnRyeTogcmVxdWlyZS5yZXNvbHZlKCcuL3BsdWdpbnMvRXJyb3JPdmVybGF5RW50cnknKSxcbiAgICAgICAgICAgIC8vIHJlZ2lzdGVycyBlcnJvciBoYW5kbGVyc1xuICAgICAgICAgICAgbW9kdWxlOiByZXF1aXJlLnJlc29sdmUoJy4vcGx1Z2lucy9yZWZyZXNoT3ZlcmxheU1vZHVsZScpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBuZXcgRXJyb3JPdmVybGF5UGx1Z2luKCksXG4gICAgICApO1xuICAgICAgY29uZmlnLmRldlNlcnZlci5ob3QgPSAnb25seSc7XG4gICAgICBsb2dnaW5nXG4gICAgICAgIC5nZXRMb2dnZXIoJ2FuYW5zaScpXG4gICAgICAgIC5pbmZvKCdSZWFjdCBmYXN0IHJlZnJlc2ggZGV0ZWN0ZWQgYW5kIGVuYWJsZWQnKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIGlmICghY29uZmlnLmV4cGVyaW1lbnRzKSB7XG4gICAgY29uZmlnLmV4cGVyaW1lbnRzID0ge307XG4gIH1cbiAgLy8gdGhpcyBkb2Vzbid0IHdvcmsgd2VsbCB3aXRoIHdlYmNvbnRhaW5lcnNcbiAgaWYgKCFpc1N0YWNrYmxpdHopIHtcbiAgICAvLyBUT0RPOiBlbmFibGUgb25jZSB3ZSBjYW4gZmlndXJlIG91dCBob3cgdG8gbWFrZSBpdCB3b3JrIHdpdGggbWFuaWZlc3QgYW5kIGF3YWl0IGZvciBTU1JcbiAgICAvL2NvbmZpZy5leHBlcmltZW50cy5sYXp5Q29tcGlsYXRpb24gPSB7IGVudHJpZXM6IGZhbHNlIH07XG4gIH1cblxuICBjb25zdCBzdHlsZVJ1bGVzID0gZ2V0U3R5bGVSdWxlcyh7XG4gICAgcm9vdFBhdGgsXG4gICAgYmFzZVBhdGgsXG4gICAgbGlicmFyeUluY2x1ZGUsXG4gICAgbGlicmFyeUV4Y2x1ZGUsXG4gICAgY3NzTW9kdWxlc09wdGlvbnM6IHtcbiAgICAgIGxvY2FsSWRlbnROYW1lOiAnW2ZvbGRlcl1fW25hbWVdX19bbG9jYWxdX19fW3h4aGFzaDY0Omhhc2g6YmFzZTY0OjVdJyxcbiAgICAgIC4uLmNzc01vZHVsZXNPcHRpb25zLFxuICAgIH0sXG4gICAgc2Fzc09wdGlvbnMsXG4gICAgc2Fzc1Jlc291cmNlcyxcbiAgICBnbG9iYWxTdHlsZURpcixcbiAgICB0YXJnZXQ6IGFyZ3Y/LnRhcmdldCxcbiAgICBjc3NFeHRyYWN0T3B0aW9ucyxcbiAgfSk7XG4gIGNvbmZpZy5tb2R1bGUucnVsZXMgPSBbLi4uY29uZmlnLm1vZHVsZS5ydWxlcywgc3R5bGVSdWxlc107XG4gIHJldHVybiBjb25maWc7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsSUFBQUEsa0JBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFFBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLFFBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFJLEtBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLGVBQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLG1CQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFFQSxNQUFNTyxLQUFLLEdBQUdQLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQztBQUUvQixTQUFTUSxhQUFhQSxDQUNuQ0MsVUFBVSxFQUNWO0VBQ0VDLFFBQVE7RUFDUkMsUUFBUTtFQUNSQyxjQUFjO0VBQ2RDLGNBQWM7RUFDZEMsV0FBVyxHQUFHO0lBQUVDLEtBQUssRUFBRSxZQUFZO0lBQUVDLGFBQWEsRUFBRTtFQUFRLENBQUM7RUFDN0RDLElBQUksR0FBRyxDQUFDLENBQUM7RUFDVDtFQUNBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQ1JDLFdBQVc7RUFDWEMsYUFBYTtFQUNiQyxpQkFBaUI7RUFDakJDLGNBQWM7RUFDZEMsWUFBWTtFQUNaQztBQUNGLENBQUMsRUFDRDtFQUNBLE1BQU1DLE1BQU0sR0FBRztJQUFFLEdBQUdoQjtFQUFXLENBQUM7RUFFaENnQixNQUFNLENBQUNDLElBQUksR0FBRyxhQUFhO0VBQzNCO0VBQ0FELE1BQU0sQ0FBQ0UsTUFBTSxDQUFDQyxRQUFRLEdBQUcsS0FBSztF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