@anansi/webpack-config
Version:
Production ready webpack for React
271 lines (247 loc) • 32.1 kB
JavaScript
;
/* global __react_refresh_socket__ */
/**
* Copyright (c) 2015-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of https://github.com/facebook/create-react-app/blob/master/packages/react-dev-utils/webpackHotDevClient.js
*/
// This is adapted to hook create-react-app directly into react-refresh's existing socket connections
var runWithRetry = require('@pmmmwh/react-refresh-webpack-plugin/client/utils/retry');
var formatWebpackMessages = require('react-dev-utils/formatWebpackMessages');
var launchEditorEndpoint = require('react-dev-utils/launchEditorEndpoint');
var ErrorOverlay = require('react-error-overlay');
var stripAnsi = require('strip-ansi');
ErrorOverlay.setEditorHandler(function editorHandler(errorLocation) {
// Keep this sync with errorOverlayMiddleware.js
fetch(launchEditorEndpoint + '?fileName=' + window.encodeURIComponent(errorLocation.fileName) + '&lineNumber=' + window.encodeURIComponent(errorLocation.lineNumber || 1) + '&colNumber=' + window.encodeURIComponent(errorLocation.colNumber || 1));
});
// Don't show overlay for certain errors as they are disruptive
if (typeof window !== 'undefined') {
window.addEventListener('error', e => {
if (e.message.includes('The server could not finish this Suspense boundary') || e.status) {
e.stopImmediatePropagation();
}
});
}
// We need to keep track of if there has been a runtime error.
// Essentially, we cannot guarantee application state was not corrupted by the
// runtime error. To prevent confusing behavior, we forcibly reload the entire
// application. This is handled below when we are notified of a compile (code
// change).
// See https://github.com/facebook/create-react-app/issues/3096
var hadRuntimeError = false;
ErrorOverlay.startReportingRuntimeErrors({
onError: function () {
hadRuntimeError = true;
},
filename: '/App.js'
});
if (module.hot && typeof module.hot.dispose === 'function') {
module.hot.dispose(function () {
// TODO: why do we need this?
ErrorOverlay.stopReportingRuntimeErrors();
});
}
// Remember some state related to hot module replacement.
var isFirstCompilation = true;
var mostRecentCompilationHash = null;
var hasCompileErrors = false;
function clearOutdatedErrors() {
// Clean up outdated compile errors, if any.
if (typeof console !== 'undefined' && typeof console.clear === 'function') {
if (hasCompileErrors) {
console.clear();
}
}
}
// Successful compilation.
function handleSuccess() {
clearOutdatedErrors();
var isHotUpdate = !isFirstCompilation;
isFirstCompilation = false;
hasCompileErrors = false;
// Attempt to apply hot updates or reload.
if (isHotUpdate) {
tryApplyUpdates(function onHotUpdateSuccess() {
// Only dismiss it when we're sure it's a hot update.
// Otherwise it would flicker right before the reload.
tryDismissErrorOverlay();
});
}
}
// Compilation with warnings (e.g. ESLint).
function handleWarnings(warnings) {
clearOutdatedErrors();
var isHotUpdate = !isFirstCompilation;
isFirstCompilation = false;
hasCompileErrors = false;
function printWarnings() {
// Print warnings to the console.
var formatted = formatWebpackMessages({
warnings: warnings.map(errorObjOrMessage => [errorObjOrMessage.moduleName, errorObjOrMessage.message].join('\n')),
errors: []
});
if (typeof console !== 'undefined' && typeof console.warn === 'function') {
for (var i = 0; i < formatted.warnings.length; i++) {
if (i === 5) {
console.warn('There were more warnings in other files.\n' + 'You can find a complete log in the terminal.');
break;
}
console.warn(stripAnsi(formatted.warnings[i]));
}
}
}
printWarnings();
// Attempt to apply hot updates or reload.
if (isHotUpdate) {
tryApplyUpdates(function onSuccessfulHotUpdate() {
// Only dismiss it when we're sure it's a hot update.
// Otherwise it would flicker right before the reload.
tryDismissErrorOverlay();
});
}
}
// Compilation with errors (e.g. syntax error or missing modules).
function handleErrors(errors) {
clearOutdatedErrors();
isFirstCompilation = false;
hasCompileErrors = true;
// "Massage" webpack messages.
var formatted = formatWebpackMessages({
errors: errors.map(errorObjOrMessage => [errorObjOrMessage.moduleName, errorObjOrMessage.message].join('\n')),
warnings: []
});
// Only show the first error.
ErrorOverlay.reportBuildError(formatted.errors[0]);
// Also log them to the console.
if (typeof console !== 'undefined' && typeof console.error === 'function') {
for (var i = 0; i < formatted.errors.length; i++) {
console.error(stripAnsi(formatted.errors[i]));
}
}
// Do not attempt to reload now.
// We will reload on next success instead.
}
function tryDismissErrorOverlay() {
if (!hasCompileErrors) {
ErrorOverlay.dismissBuildError();
}
}
// There is a newer version of the code available.
function handleAvailableHash(hash) {
// Update last known compilation hash.
mostRecentCompilationHash = hash;
}
// Handle messages from the server.
function compileMessageHandler(message) {
switch (message.type) {
case 'hash':
handleAvailableHash(message.data);
break;
case 'still-ok':
case 'ok':
handleSuccess();
break;
case 'content-changed':
// Triggered when a file from `contentBase` changed.
window.location.reload();
break;
case 'warnings':
handleWarnings(message.data);
break;
case 'errors':
handleErrors(message.data);
break;
default:
// Do nothing.
}
}
// Is there a newer version of this code available?
function isUpdateAvailable() {
/* globals __webpack_hash__ */
// __webpack_hash__ is the hash of the current compilation.
// It's a global variable injected by webpack.
return mostRecentCompilationHash !== __webpack_hash__;
}
// webpack disallows updates in other states.
function canApplyUpdates() {
return module.hot.status() === 'idle';
}
function canAcceptErrors() {
// NOTE: This var is injected by Webpack's DefinePlugin, and is a boolean instead of string.
const hasReactRefresh = process.env.FAST_REFRESH;
const status = module.hot.status();
// React refresh can handle hot-reloading over errors.
// However, when hot-reload status is abort or fail,
// it indicates the current update cannot be applied safely,
// and thus we should bail out to a forced reload for consistency.
return hasReactRefresh && ['abort', 'fail'].indexOf(status) === -1;
}
// Attempt to update code on the fly, fall back to a hard reload.
function tryApplyUpdates(onHotUpdateSuccess) {
if (!module.hot) {
// HotModuleReplacementPlugin is not in webpack configuration.
window.location.reload();
return;
}
// we know it's hot, so dismiss error
if (typeof onHotUpdateSuccess === 'function') {
onHotUpdateSuccess();
}
if (!isUpdateAvailable() || !canApplyUpdates()) {
return;
}
function handleApplyUpdates(err, updatedModules) {
const haveErrors = err || hadRuntimeError;
// When there is no error but updatedModules is unavailable,
// it indicates a critical failure in hot-reloading,
// e.g. server is not ready to serve new bundle,
// and hence we need to do a forced reload.
const needsForcedReload = !err && !updatedModules;
if (haveErrors && !canAcceptErrors() || needsForcedReload) {
window.location.reload();
return;
}
if (typeof onHotUpdateSuccess === 'function') {
// Maybe we want to do something.
onHotUpdateSuccess();
}
if (isUpdateAvailable()) {
// While we were updating, there was a new update! Do it again.
tryApplyUpdates();
}
}
// https://webpack.github.io/docs/hot-module-replacement.html#check
var result = module.hot.check(/* autoApply */true, handleApplyUpdates);
// // webpack 2 returns a Promise instead of invoking a callback
if (result && result.then) {
result.then(function (updatedModules) {
handleApplyUpdates(null, updatedModules);
}, function (err) {
handleApplyUpdates(err, null);
});
}
}
if (process.env.NODE_ENV !== 'production' && typeof window !== 'undefined') {
// Only register if no other overlay have been registered
if (!window.__reactRefreshOverlayInjected && __react_refresh_socket__) {
// Registers handlers for compile errors with retry -
// This is to prevent mismatching injection order causing errors to be thrown
runWithRetry(function initSocket() {
__react_refresh_socket__.init(compileMessageHandler);
}, 3, 'Failed to set up the socket connection.');
// Registers handlers for runtime errors
/*handleError(function handleError(error) {
hasRuntimeErrors = true;
__react_refresh_error_overlay__.handleRuntimeError(error);
});
handleUnhandledRejection(function handleUnhandledPromiseRejection(error) {
hasRuntimeErrors = true;
__react_refresh_error_overlay__.handleRuntimeError(error);
});*/
// Mark overlay as injected to prevent double-injection
window.__reactRefreshOverlayInjected = true;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJydW5XaXRoUmV0cnkiLCJyZXF1aXJlIiwiZm9ybWF0V2VicGFja01lc3NhZ2VzIiwibGF1bmNoRWRpdG9yRW5kcG9pbnQiLCJFcnJvck92ZXJsYXkiLCJzdHJpcEFuc2kiLCJzZXRFZGl0b3JIYW5kbGVyIiwiZWRpdG9ySGFuZGxlciIsImVycm9yTG9jYXRpb24iLCJmZXRjaCIsIndpbmRvdyIsImVuY29kZVVSSUNvbXBvbmVudCIsImZpbGVOYW1lIiwibGluZU51bWJlciIsImNvbE51bWJlciIsImFkZEV2ZW50TGlzdGVuZXIiLCJlIiwibWVzc2FnZSIsImluY2x1ZGVzIiwic3RhdHVzIiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwiaGFkUnVudGltZUVycm9yIiwic3RhcnRSZXBvcnRpbmdSdW50aW1lRXJyb3JzIiwib25FcnJvciIsImZpbGVuYW1lIiwibW9kdWxlIiwiaG90IiwiZGlzcG9zZSIsInN0b3BSZXBvcnRpbmdSdW50aW1lRXJyb3JzIiwiaXNGaXJzdENvbXBpbGF0aW9uIiwibW9zdFJlY2VudENvbXBpbGF0aW9uSGFzaCIsImhhc0NvbXBpbGVFcnJvcnMiLCJjbGVhck91dGRhdGVkRXJyb3JzIiwiY29uc29sZSIsImNsZWFyIiwiaGFuZGxlU3VjY2VzcyIsImlzSG90VXBkYXRlIiwidHJ5QXBwbHlVcGRhdGVzIiwib25Ib3RVcGRhdGVTdWNjZXNzIiwidHJ5RGlzbWlzc0Vycm9yT3ZlcmxheSIsImhhbmRsZVdhcm5pbmdzIiwid2FybmluZ3MiLCJwcmludFdhcm5pbmdzIiwiZm9ybWF0dGVkIiwibWFwIiwiZXJyb3JPYmpPck1lc3NhZ2UiLCJtb2R1bGVOYW1lIiwiam9pbiIsImVycm9ycyIsIndhcm4iLCJpIiwibGVuZ3RoIiwib25TdWNjZXNzZnVsSG90VXBkYXRlIiwiaGFuZGxlRXJyb3JzIiwicmVwb3J0QnVpbGRFcnJvciIsImVycm9yIiwiZGlzbWlzc0J1aWxkRXJyb3IiLCJoYW5kbGVBdmFpbGFibGVIYXNoIiwiaGFzaCIsImNvbXBpbGVNZXNzYWdlSGFuZGxlciIsInR5cGUiLCJkYXRhIiwibG9jYXRpb24iLCJyZWxvYWQiLCJpc1VwZGF0ZUF2YWlsYWJsZSIsIl9fd2VicGFja19oYXNoX18iLCJjYW5BcHBseVVwZGF0ZXMiLCJjYW5BY2NlcHRFcnJvcnMiLCJoYXNSZWFjdFJlZnJlc2giLCJwcm9jZXNzIiwiZW52IiwiRkFTVF9SRUZSRVNIIiwiaW5kZXhPZiIsImhhbmRsZUFwcGx5VXBkYXRlcyIsImVyciIsInVwZGF0ZWRNb2R1bGVzIiwiaGF2ZUVycm9ycyIsIm5lZWRzRm9yY2VkUmVsb2FkIiwicmVzdWx0IiwiY2hlY2siLCJ0aGVuIiwiTk9ERV9FTlYiLCJfX3JlYWN0UmVmcmVzaE92ZXJsYXlJbmplY3RlZCIsIl9fcmVhY3RfcmVmcmVzaF9zb2NrZXRfXyIsImluaXRTb2NrZXQiLCJpbml0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbnMvRXJyb3JPdmVybGF5RW50cnkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIF9fcmVhY3RfcmVmcmVzaF9zb2NrZXRfXyAqL1xuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2NyZWF0ZS1yZWFjdC1hcHAvYmxvYi9tYXN0ZXIvcGFja2FnZXMvcmVhY3QtZGV2LXV0aWxzL3dlYnBhY2tIb3REZXZDbGllbnQuanNcbiAqL1xuXG4vLyBUaGlzIGlzIGFkYXB0ZWQgdG8gaG9vayBjcmVhdGUtcmVhY3QtYXBwIGRpcmVjdGx5IGludG8gcmVhY3QtcmVmcmVzaCdzIGV4aXN0aW5nIHNvY2tldCBjb25uZWN0aW9uc1xuXG52YXIgcnVuV2l0aFJldHJ5ID0gcmVxdWlyZSgnQHBtbW13aC9yZWFjdC1yZWZyZXNoLXdlYnBhY2stcGx1Z2luL2NsaWVudC91dGlscy9yZXRyeScpO1xudmFyIGZvcm1hdFdlYnBhY2tNZXNzYWdlcyA9IHJlcXVpcmUoJ3JlYWN0LWRldi11dGlscy9mb3JtYXRXZWJwYWNrTWVzc2FnZXMnKTtcbnZhciBsYXVuY2hFZGl0b3JFbmRwb2ludCA9IHJlcXVpcmUoJ3JlYWN0LWRldi11dGlscy9sYXVuY2hFZGl0b3JFbmRwb2ludCcpO1xudmFyIEVycm9yT3ZlcmxheSA9IHJlcXVpcmUoJ3JlYWN0LWVycm9yLW92ZXJsYXknKTtcbnZhciBzdHJpcEFuc2kgPSByZXF1aXJlKCdzdHJpcC1hbnNpJyk7XG5cbkVycm9yT3ZlcmxheS5zZXRFZGl0b3JIYW5kbGVyKGZ1bmN0aW9uIGVkaXRvckhhbmRsZXIoZXJyb3JMb2NhdGlvbikge1xuICAvLyBLZWVwIHRoaXMgc3luYyB3aXRoIGVycm9yT3ZlcmxheU1pZGRsZXdhcmUuanNcbiAgZmV0Y2goXG4gICAgbGF1bmNoRWRpdG9yRW5kcG9pbnQgK1xuICAgICAgJz9maWxlTmFtZT0nICtcbiAgICAgIHdpbmRvdy5lbmNvZGVVUklDb21wb25lbnQoZXJyb3JMb2NhdGlvbi5maWxlTmFtZSkgK1xuICAgICAgJyZsaW5lTnVtYmVyPScgK1xuICAgICAgd2luZG93LmVuY29kZVVSSUNvbXBvbmVudChlcnJvckxvY2F0aW9uLmxpbmVOdW1iZXIgfHwgMSkgK1xuICAgICAgJyZjb2xOdW1iZXI9JyArXG4gICAgICB3aW5kb3cuZW5jb2RlVVJJQ29tcG9uZW50KGVycm9yTG9jYXRpb24uY29sTnVtYmVyIHx8IDEpLFxuICApO1xufSk7XG5cbi8vIERvbid0IHNob3cgb3ZlcmxheSBmb3IgY2VydGFpbiBlcnJvcnMgYXMgdGhleSBhcmUgZGlzcnVwdGl2ZVxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGUgPT4ge1xuICAgIGlmIChcbiAgICAgIGUubWVzc2FnZS5pbmNsdWRlcyhcbiAgICAgICAgJ1RoZSBzZXJ2ZXIgY291bGQgbm90IGZpbmlzaCB0aGlzIFN1c3BlbnNlIGJvdW5kYXJ5JyxcbiAgICAgICkgfHxcbiAgICAgIGUuc3RhdHVzXG4gICAgKSB7XG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIFdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBpZiB0aGVyZSBoYXMgYmVlbiBhIHJ1bnRpbWUgZXJyb3IuXG4vLyBFc3NlbnRpYWxseSwgd2UgY2Fubm90IGd1YXJhbnRlZSBhcHBsaWNhdGlvbiBzdGF0ZSB3YXMgbm90IGNvcnJ1cHRlZCBieSB0aGVcbi8vIHJ1bnRpbWUgZXJyb3IuIFRvIHByZXZlbnQgY29uZnVzaW5nIGJlaGF2aW9yLCB3ZSBmb3JjaWJseSByZWxvYWQgdGhlIGVudGlyZVxuLy8gYXBwbGljYXRpb24uIFRoaXMgaXMgaGFuZGxlZCBiZWxvdyB3aGVuIHdlIGFyZSBub3RpZmllZCBvZiBhIGNvbXBpbGUgKGNvZGVcbi8vIGNoYW5nZSkuXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2NyZWF0ZS1yZWFjdC1hcHAvaXNzdWVzLzMwOTZcbnZhciBoYWRSdW50aW1lRXJyb3IgPSBmYWxzZTtcbkVycm9yT3ZlcmxheS5zdGFydFJlcG9ydGluZ1J1bnRpbWVFcnJvcnMoe1xuICBvbkVycm9yOiBmdW5jdGlvbiAoKSB7XG4gICAgaGFkUnVudGltZUVycm9yID0gdHJ1ZTtcbiAgfSxcbiAgZmlsZW5hbWU6ICcvQXBwLmpzJyxcbn0pO1xuXG5pZiAobW9kdWxlLmhvdCAmJiB0eXBlb2YgbW9kdWxlLmhvdC5kaXNwb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gIG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbiAoKSB7XG4gICAgLy8gVE9ETzogd2h5IGRvIHdlIG5lZWQgdGhpcz9cbiAgICBFcnJvck92ZXJsYXkuc3RvcFJlcG9ydGluZ1J1bnRpbWVFcnJvcnMoKTtcbiAgfSk7XG59XG5cbi8vIFJlbWVtYmVyIHNvbWUgc3RhdGUgcmVsYXRlZCB0byBob3QgbW9kdWxlIHJlcGxhY2VtZW50LlxudmFyIGlzRmlyc3RDb21waWxhdGlvbiA9IHRydWU7XG52YXIgbW9zdFJlY2VudENvbXBpbGF0aW9uSGFzaCA9IG51bGw7XG52YXIgaGFzQ29tcGlsZUVycm9ycyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBjbGVhck91dGRhdGVkRXJyb3JzKCkge1xuICAvLyBDbGVhbiB1cCBvdXRkYXRlZCBjb21waWxlIGVycm9ycywgaWYgYW55LlxuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlLmNsZWFyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGhhc0NvbXBpbGVFcnJvcnMpIHtcbiAgICAgIGNvbnNvbGUuY2xlYXIoKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gU3VjY2Vzc2Z1bCBjb21waWxhdGlvbi5cbmZ1bmN0aW9uIGhhbmRsZVN1Y2Nlc3MoKSB7XG4gIGNsZWFyT3V0ZGF0ZWRFcnJvcnMoKTtcblxuICB2YXIgaXNIb3RVcGRhdGUgPSAhaXNGaXJzdENvbXBpbGF0aW9uO1xuICBpc0ZpcnN0Q29tcGlsYXRpb24gPSBmYWxzZTtcbiAgaGFzQ29tcGlsZUVycm9ycyA9IGZhbHNlO1xuXG4gIC8vIEF0dGVtcHQgdG8gYXBwbHkgaG90IHVwZGF0ZXMgb3IgcmVsb2FkLlxuICBpZiAoaXNIb3RVcGRhdGUpIHtcbiAgICB0cnlBcHBseVVwZGF0ZXMoZnVuY3Rpb24gb25Ib3RVcGRhdGVTdWNjZXNzKCkge1xuICAgICAgLy8gT25seSBkaXNtaXNzIGl0IHdoZW4gd2UncmUgc3VyZSBpdCdzIGEgaG90IHVwZGF0ZS5cbiAgICAgIC8vIE90aGVyd2lzZSBpdCB3b3VsZCBmbGlja2VyIHJpZ2h0IGJlZm9yZSB0aGUgcmVsb2FkLlxuICAgICAgdHJ5RGlzbWlzc0Vycm9yT3ZlcmxheSgpO1xuICAgIH0pO1xuICB9XG59XG5cbi8vIENvbXBpbGF0aW9uIHdpdGggd2FybmluZ3MgKGUuZy4gRVNMaW50KS5cbmZ1bmN0aW9uIGhhbmRsZVdhcm5pbmdzKHdhcm5pbmdzKSB7XG4gIGNsZWFyT3V0ZGF0ZWRFcnJvcnMoKTtcblxuICB2YXIgaXNIb3RVcGRhdGUgPSAhaXNGaXJzdENvbXBpbGF0aW9uO1xuICBpc0ZpcnN0Q29tcGlsYXRpb24gPSBmYWxzZTtcbiAgaGFzQ29tcGlsZUVycm9ycyA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIHByaW50V2FybmluZ3MoKSB7XG4gICAgLy8gUHJpbnQgd2FybmluZ3MgdG8gdGhlIGNvbnNvbGUuXG4gICAgdmFyIGZvcm1hdHRlZCA9IGZvcm1hdFdlYnBhY2tNZXNzYWdlcyh7XG4gICAgICB3YXJuaW5nczogd2FybmluZ3MubWFwKGVycm9yT2JqT3JNZXNzYWdlID0+XG4gICAgICAgIFtlcnJvck9iak9yTWVzc2FnZS5tb2R1bGVOYW1lLCBlcnJvck9iak9yTWVzc2FnZS5tZXNzYWdlXS5qb2luKCdcXG4nKSxcbiAgICAgICksXG4gICAgICBlcnJvcnM6IFtdLFxuICAgIH0pO1xuXG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc29sZS53YXJuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcm1hdHRlZC53YXJuaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSA9PT0gNSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdUaGVyZSB3ZXJlIG1vcmUgd2FybmluZ3MgaW4gb3RoZXIgZmlsZXMuXFxuJyArXG4gICAgICAgICAgICAgICdZb3UgY2FuIGZpbmQgYSBjb21wbGV0ZSBsb2cgaW4gdGhlIHRlcm1pbmFsLicsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oc3RyaXBBbnNpKGZvcm1hdHRlZC53YXJuaW5nc1tpXSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaW50V2FybmluZ3MoKTtcblxuICAvLyBBdHRlbXB0IHRvIGFwcGx5IGhvdCB1cGRhdGVzIG9yIHJlbG9hZC5cbiAgaWYgKGlzSG90VXBkYXRlKSB7XG4gICAgdHJ5QXBwbHlVcGRhdGVzKGZ1bmN0aW9uIG9uU3VjY2Vzc2Z1bEhvdFVwZGF0ZSgpIHtcbiAgICAgIC8vIE9ubHkgZGlzbWlzcyBpdCB3aGVuIHdlJ3JlIHN1cmUgaXQncyBhIGhvdCB1cGRhdGUuXG4gICAgICAvLyBPdGhlcndpc2UgaXQgd291bGQgZmxpY2tlciByaWdodCBiZWZvcmUgdGhlIHJlbG9hZC5cbiAgICAgIHRyeURpc21pc3NFcnJvck92ZXJsYXkoKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBDb21waWxhdGlvbiB3aXRoIGVycm9ycyAoZS5nLiBzeW50YXggZXJyb3Igb3IgbWlzc2luZyBtb2R1bGVzKS5cbmZ1bmN0aW9uIGhhbmRsZUVycm9ycyhlcnJvcnMpIHtcbiAgY2xlYXJPdXRkYXRlZEVycm9ycygpO1xuXG4gIGlzRmlyc3RDb21waWxhdGlvbiA9IGZhbHNlO1xuICBoYXNDb21waWxlRXJyb3JzID0gdHJ1ZTtcblxuICAvLyBcIk1hc3NhZ2VcIiB3ZWJwYWNrIG1lc3NhZ2VzLlxuICB2YXIgZm9ybWF0dGVkID0gZm9ybWF0V2VicGFja01lc3NhZ2VzKHtcbiAgICBlcnJvcnM6IGVycm9ycy5tYXAoZXJyb3JPYmpPck1lc3NhZ2UgPT5cbiAgICAgIFtlcnJvck9iak9yTWVzc2FnZS5tb2R1bGVOYW1lLCBlcnJvck9iak9yTWVzc2FnZS5tZXNzYWdlXS5qb2luKCdcXG4nKSxcbiAgICApLFxuICAgIHdhcm5pbmdzOiBbXSxcbiAgfSk7XG5cbiAgLy8gT25seSBzaG93IHRoZSBmaXJzdCBlcnJvci5cbiAgRXJyb3JPdmVybGF5LnJlcG9ydEJ1aWxkRXJyb3IoZm9ybWF0dGVkLmVycm9yc1swXSk7XG5cbiAgLy8gQWxzbyBsb2cgdGhlbSB0byB0aGUgY29uc29sZS5cbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybWF0dGVkLmVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc29sZS5lcnJvcihzdHJpcEFuc2koZm9ybWF0dGVkLmVycm9yc1tpXSkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIERvIG5vdCBhdHRlbXB0IHRvIHJlbG9hZCBub3cuXG4gIC8vIFdlIHdpbGwgcmVsb2FkIG9uIG5leHQgc3VjY2VzcyBpbnN0ZWFkLlxufVxuXG5mdW5jdGlvbiB0cnlEaXNtaXNzRXJyb3JPdmVybGF5KCkge1xuICBpZiAoIWhhc0NvbXBpbGVFcnJvcnMpIHtcbiAgICBFcnJvck92ZXJsYXkuZGlzbWlzc0J1aWxkRXJyb3IoKTtcbiAgfVxufVxuXG4vLyBUaGVyZSBpcyBhIG5ld2VyIHZlcnNpb24gb2YgdGhlIGNvZGUgYXZhaWxhYmxlLlxuZnVuY3Rpb24gaGFuZGxlQXZhaWxhYmxlSGFzaChoYXNoKSB7XG4gIC8vIFVwZGF0ZSBsYXN0IGtub3duIGNvbXBpbGF0aW9uIGhhc2guXG4gIG1vc3RSZWNlbnRDb21waWxhdGlvbkhhc2ggPSBoYXNoO1xufVxuXG4vLyBIYW5kbGUgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyLlxuZnVuY3Rpb24gY29tcGlsZU1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UpIHtcbiAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICBjYXNlICdoYXNoJzpcbiAgICAgIGhhbmRsZUF2YWlsYWJsZUhhc2gobWVzc2FnZS5kYXRhKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3N0aWxsLW9rJzpcbiAgICBjYXNlICdvayc6XG4gICAgICBoYW5kbGVTdWNjZXNzKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjb250ZW50LWNoYW5nZWQnOlxuICAgICAgLy8gVHJpZ2dlcmVkIHdoZW4gYSBmaWxlIGZyb20gYGNvbnRlbnRCYXNlYCBjaGFuZ2VkLlxuICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnd2FybmluZ3MnOlxuICAgICAgaGFuZGxlV2FybmluZ3MobWVzc2FnZS5kYXRhKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Vycm9ycyc6XG4gICAgICBoYW5kbGVFcnJvcnMobWVzc2FnZS5kYXRhKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgLy8gRG8gbm90aGluZy5cbiAgfVxufVxuXG4vLyBJcyB0aGVyZSBhIG5ld2VyIHZlcnNpb24gb2YgdGhpcyBjb2RlIGF2YWlsYWJsZT9cbmZ1bmN0aW9uIGlzVXBkYXRlQXZhaWxhYmxlKCkge1xuICAvKiBnbG9iYWxzIF9fd2VicGFja19oYXNoX18gKi9cbiAgLy8gX193ZWJwYWNrX2hhc2hfXyBpcyB0aGUgaGFzaCBvZiB0aGUgY3VycmVudCBjb21waWxhdGlvbi5cbiAgLy8gSXQncyBhIGdsb2JhbCB2YXJpYWJsZSBpbmplY3RlZCBieSB3ZWJwYWNrLlxuICByZXR1cm4gbW9zdFJlY2VudENvbXBpbGF0aW9uSGFzaCAhPT0gX193ZWJwYWNrX2hhc2hfXztcbn1cblxuLy8gd2VicGFjayBkaXNhbGxvd3MgdXBkYXRlcyBpbiBvdGhlciBzdGF0ZXMuXG5mdW5jdGlvbiBjYW5BcHBseVVwZGF0ZXMoKSB7XG4gIHJldHVybiBtb2R1bGUuaG90LnN0YXR1cygpID09PSAnaWRsZSc7XG59XG5cbmZ1bmN0aW9uIGNhbkFjY2VwdEVycm9ycygpIHtcbiAgLy8gTk9URTogVGhpcyB2YXIgaXMgaW5qZWN0ZWQgYnkgV2VicGFjaydzIERlZmluZVBsdWdpbiwgYW5kIGlzIGEgYm9vbGVhbiBpbnN0ZWFkIG9mIHN0cmluZy5cbiAgY29uc3QgaGFzUmVhY3RSZWZyZXNoID0gcHJvY2Vzcy5lbnYuRkFTVF9SRUZSRVNIO1xuXG4gIGNvbnN0IHN0YXR1cyA9IG1vZHVsZS5ob3Quc3RhdHVzKCk7XG4gIC8vIFJlYWN0IHJlZnJlc2ggY2FuIGhhbmRsZSBob3QtcmVsb2FkaW5nIG92ZXIgZXJyb3JzLlxuICAvLyBIb3dldmVyLCB3aGVuIGhvdC1yZWxvYWQgc3RhdHVzIGlzIGFib3J0IG9yIGZhaWwsXG4gIC8vIGl0IGluZGljYXRlcyB0aGUgY3VycmVudCB1cGRhdGUgY2Fubm90IGJlIGFwcGxpZWQgc2FmZWx5LFxuICAvLyBhbmQgdGh1cyB3ZSBzaG91bGQgYmFpbCBvdXQgdG8gYSBmb3JjZWQgcmVsb2FkIGZvciBjb25zaXN0ZW5jeS5cbiAgcmV0dXJuIGhhc1JlYWN0UmVmcmVzaCAmJiBbJ2Fib3J0JywgJ2ZhaWwnXS5pbmRleE9mKHN0YXR1cykgPT09IC0xO1xufVxuXG4vLyBBdHRlbXB0IHRvIHVwZGF0ZSBjb2RlIG9uIHRoZSBmbHksIGZhbGwgYmFjayB0byBhIGhhcmQgcmVsb2FkLlxuZnVuY3Rpb24gdHJ5QXBwbHlVcGRhdGVzKG9uSG90VXBkYXRlU3VjY2Vzcykge1xuICBpZiAoIW1vZHVsZS5ob3QpIHtcbiAgICAvLyBIb3RNb2R1bGVSZXBsYWNlbWVudFBsdWdpbiBpcyBub3QgaW4gd2VicGFjayBjb25maWd1cmF0aW9uLlxuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyB3ZSBrbm93IGl0J3MgaG90LCBzbyBkaXNtaXNzIGVycm9yXG4gIGlmICh0eXBlb2Ygb25Ib3RVcGRhdGVTdWNjZXNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgb25Ib3RVcGRhdGVTdWNjZXNzKCk7XG4gIH1cblxuICBpZiAoIWlzVXBkYXRlQXZhaWxhYmxlKCkgfHwgIWNhbkFwcGx5VXBkYXRlcygpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlQXBwbHlVcGRhdGVzKGVyciwgdXBkYXRlZE1vZHVsZXMpIHtcbiAgICBjb25zdCBoYXZlRXJyb3JzID0gZXJyIHx8IGhhZFJ1bnRpbWVFcnJvcjtcbiAgICAvLyBXaGVuIHRoZXJlIGlzIG5vIGVycm9yIGJ1dCB1cGRhdGVkTW9kdWxlcyBpcyB1bmF2YWlsYWJsZSxcbiAgICAvLyBpdCBpbmRpY2F0ZXMgYSBjcml0aWNhbCBmYWlsdXJlIGluIGhvdC1yZWxvYWRpbmcsXG4gICAgLy8gZS5nLiBzZXJ2ZXIgaXMgbm90IHJlYWR5IHRvIHNlcnZlIG5ldyBidW5kbGUsXG4gICAgLy8gYW5kIGhlbmNlIHdlIG5lZWQgdG8gZG8gYSBmb3JjZWQgcmVsb2FkLlxuICAgIGNvbnN0IG5lZWRzRm9yY2VkUmVsb2FkID0gIWVyciAmJiAhdXBkYXRlZE1vZHVsZXM7XG4gICAgaWYgKChoYXZlRXJyb3JzICYmICFjYW5BY2NlcHRFcnJvcnMoKSkgfHwgbmVlZHNGb3JjZWRSZWxvYWQpIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9uSG90VXBkYXRlU3VjY2VzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gTWF5YmUgd2Ugd2FudCB0byBkbyBzb21ldGhpbmcuXG4gICAgICBvbkhvdFVwZGF0ZVN1Y2Nlc3MoKTtcbiAgICB9XG5cbiAgICBpZiAoaXNVcGRhdGVBdmFpbGFibGUoKSkge1xuICAgICAgLy8gV2hpbGUgd2Ugd2VyZSB1cGRhdGluZywgdGhlcmUgd2FzIGEgbmV3IHVwZGF0ZSEgRG8gaXQgYWdhaW4uXG4gICAgICB0cnlBcHBseVVwZGF0ZXMoKTtcbiAgICB9XG4gIH1cblxuICAvLyBodHRwczovL3dlYnBhY2suZ2l0aHViLmlvL2RvY3MvaG90LW1vZHVsZS1yZXBsYWNlbWVudC5odG1sI2NoZWNrXG4gIHZhciByZXN1bHQgPSBtb2R1bGUuaG90LmNoZWNrKC8qIGF1dG9BcHBseSAqLyB0cnVlLCBoYW5kbGVBcHBseVVwZGF0ZXMpO1xuXG4gIC8vIC8vIHdlYnBhY2sgMiByZXR1cm5zIGEgUHJvbWlzZSBpbnN0ZWFkIG9mIGludm9raW5nIGEgY2FsbGJhY2tcbiAgaWYgKHJlc3VsdCAmJiByZXN1bHQudGhlbikge1xuICAgIHJlc3VsdC50aGVuKFxuICAgICAgZnVuY3Rpb24gKHVwZGF0ZWRNb2R1bGVzKSB7XG4gICAgICAgIGhhbmRsZUFwcGx5VXBkYXRlcyhudWxsLCB1cGRhdGVkTW9kdWxlcyk7XG4gICAgICB9LFxuICAgICAgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBoYW5kbGVBcHBseVVwZGF0ZXMoZXJyLCBudWxsKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxufVxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAvLyBPbmx5IHJlZ2lzdGVyIGlmIG5vIG90aGVyIG92ZXJsYXkgaGF2ZSBiZWVuIHJlZ2lzdGVyZWRcbiAgaWYgKCF3aW5kb3cuX19yZWFjdFJlZnJlc2hPdmVybGF5SW5qZWN0ZWQgJiYgX19yZWFjdF9yZWZyZXNoX3NvY2tldF9fKSB7XG4gICAgLy8gUmVnaXN0ZXJzIGhhbmRsZXJzIGZvciBjb21waWxlIGVycm9ycyB3aXRoIHJldHJ5IC1cbiAgICAvLyBUaGlzIGlzIHRvIHByZXZlbnQgbWlzbWF0Y2hpbmcgaW5qZWN0aW9uIG9yZGVyIGNhdXNpbmcgZXJyb3JzIHRvIGJlIHRocm93blxuICAgIHJ1bldpdGhSZXRyeShcbiAgICAgIGZ1bmN0aW9uIGluaXRTb2NrZXQoKSB7XG4gICAgICAgIF9fcmVhY3RfcmVmcmVzaF9zb2NrZXRfXy5pbml0KGNvbXBpbGVNZXNzYWdlSGFuZGxlcik7XG4gICAgICB9LFxuICAgICAgMyxcbiAgICAgICdGYWlsZWQgdG8gc2V0IHVwIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4nLFxuICAgICk7XG4gICAgLy8gUmVnaXN0ZXJzIGhhbmRsZXJzIGZvciBydW50aW1lIGVycm9yc1xuICAgIC8qaGFuZGxlRXJyb3IoZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXJyb3IpIHtcbiAgICAgIGhhc1J1bnRpbWVFcnJvcnMgPSB0cnVlO1xuICAgICAgX19yZWFjdF9yZWZyZXNoX2Vycm9yX292ZXJsYXlfXy5oYW5kbGVSdW50aW1lRXJyb3IoZXJyb3IpO1xuICAgIH0pO1xuICAgIGhhbmRsZVVuaGFuZGxlZFJlamVjdGlvbihmdW5jdGlvbiBoYW5kbGVVbmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uKGVycm9yKSB7XG4gICAgICBoYXNSdW50aW1lRXJyb3JzID0gdHJ1ZTtcbiAgICAgIF9fcmVhY3RfcmVmcmVzaF9lcnJvcl9vdmVybGF5X18uaGFuZGxlUnVudGltZUVycm9yKGVycm9yKTtcbiAgICB9KTsqL1xuXG4gICAgLy8gTWFyayBvdmVybGF5IGFzIGluamVjdGVkIHRvIHByZXZlbnQgZG91YmxlLWluamVjdGlvblxuICAgIHdpbmRvdy5fX3JlYWN0UmVmcmVzaE92ZXJsYXlJbmplY3RlZCA9IHRydWU7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxJQUFJQSxZQUFZLEdBQUdDLE9BQU8sQ0FBQyx5REFBeUQsQ0FBQztBQUNyRixJQUFJQyxxQkFBcUIsR0FBR0QsT0FBTyxDQUFDLHVDQUF1QyxDQUFDO0FBQzVFLElBQUlFLG9CQUFvQixHQUFHRixPQUFPLENBQUMsc0NBQXNDLENBQUM7QUFDMUUsSUFBSUcsWUFBWSxHQUFHSCxPQUFPLENBQUMscUJBQXFCLENBQUM7QUFDakQsSUFBSUksU0FBUyxHQUFHSixPQUFPLENBQUMsWUFBWSxDQUFDO0FBRXJDRyxZQUFZLENBQUNFLGdCQUFnQixDQUFDLFNBQVNDLGFBQWFBLENBQUNDLGFBQWEsRUFBRTtFQUNsRTtFQUNBQyxLQUFLLENBQ0hOLG9CQUFvQixHQUNsQixZQUFZLEdBQ1pPLE1BQU0sQ0FBQ0Msa0JBQWtCLENBQUNILGFBQWEsQ0FBQ0ksUUFBUSxDQUFDLEdBQ2pELGNBQWMsR0FDZEYsTUFBTSxDQUFDQyxrQkFBa0IsQ0FBQ0gsYUFBYSxDQUFDSyxVQUFVLElBQUksQ0FBQyxDQUFD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