131 lines
18 KiB
Plaintext
131 lines
18 KiB
Plaintext
import __vite__cjsImport0_dayjs from "/_nuxt/node_modules/.cache/vite/client/deps/dayjs.js?v=e4f18c29"; const dayjs = __vite__cjsImport0_dayjs.__esModule ? __vite__cjsImport0_dayjs.default : __vite__cjsImport0_dayjs;
|
|
import {
|
|
upperFirst,
|
|
get,
|
|
isBoolean,
|
|
isNumber,
|
|
isObjectLike,
|
|
isString,
|
|
noop
|
|
} from "/_nuxt/node_modules/.cache/vite/client/deps/lodash-es.js?v=e4f18c29";
|
|
import { ResourceLoadError } from "/_nuxt/lib/core/errors/base.ts";
|
|
export const prettify = (log, msg) => msg.replace(/{([^{}]+)}/g, (match, p1) => {
|
|
const val = get(log, p1);
|
|
if (val === void 0) return match;
|
|
const formattedValue = isString(val) || isNumber(val) || isBoolean(val) ? val : JSON.stringify(val);
|
|
return formattedValue;
|
|
});
|
|
export const prettifiedLoggerFactory = (logger, bindings, options) => (...vals) => {
|
|
const { time } = options || {};
|
|
const finalVals = vals.slice();
|
|
const firstObject = finalVals.find((v) => isObjectLike(v) && !Array.isArray(v));
|
|
const firstMessageIdx = finalVals.findIndex(isString);
|
|
if (firstMessageIdx !== -1) {
|
|
const msg = finalVals[firstMessageIdx];
|
|
finalVals.splice(firstMessageIdx, 1);
|
|
const finalMsg = prettify(firstObject || {}, msg);
|
|
finalVals.unshift(finalMsg);
|
|
}
|
|
if (bindings) {
|
|
const boundVals = JSON.parse(JSON.stringify(bindings()));
|
|
finalVals.push(boundVals);
|
|
}
|
|
logger(
|
|
...finalVals,
|
|
...time ? [
|
|
{
|
|
time: dayjs().format("HH:mm:ss.SSS")
|
|
}
|
|
] : []
|
|
);
|
|
};
|
|
export function buildFakePinoLogger(options) {
|
|
const { time = false } = options || {};
|
|
const bindings = options?.consoleBindings;
|
|
const logger = {
|
|
debug: prettifiedLoggerFactory(console.debug, bindings, { time }),
|
|
info: prettifiedLoggerFactory(console.info, bindings, { time }),
|
|
warn: prettifiedLoggerFactory(console.warn, bindings, { time }),
|
|
error: prettifiedLoggerFactory(console.error, bindings, { time }),
|
|
fatal: prettifiedLoggerFactory(console.error, bindings, { time }),
|
|
trace: prettifiedLoggerFactory(console.trace, bindings, { time }),
|
|
silent: noop
|
|
};
|
|
logger.child = () => logger;
|
|
return logger;
|
|
}
|
|
export const formatAppError = (err) => {
|
|
const { statusCode, message, stack } = err;
|
|
let finalMessage = message || "";
|
|
let finalStatusCode = statusCode || 500;
|
|
if (finalMessage.match(/^fetch failed$/i)) {
|
|
finalMessage = "Internal API call failed, please contact site administrators";
|
|
}
|
|
if (finalMessage.match(/status code 429/i)) {
|
|
finalMessage = "You are sending too many requests. You have been rate limited. Please try again later.";
|
|
finalStatusCode = 429;
|
|
}
|
|
if (finalMessage.match(/\/_nuxt\/builds\/meta.*?404/i)) {
|
|
finalMessage = "Speckle is currently upgrading to a newer version. Please reload the page in a few seconds.";
|
|
finalStatusCode = 500;
|
|
}
|
|
finalMessage = upperFirst(finalMessage);
|
|
return {
|
|
statusCode: finalStatusCode,
|
|
message: finalMessage,
|
|
stack
|
|
};
|
|
};
|
|
export function enableCustomLoggerHandling(params) {
|
|
const { logger, handler } = params;
|
|
return new Proxy(logger, {
|
|
get(target, prop) {
|
|
if (["trace", "debug", "info", "warn", "error", "fatal"].includes(prop)) {
|
|
const logMethod = get(target, prop);
|
|
return (...args) => {
|
|
const log = logMethod.bind(target);
|
|
args = args.map((arg) => {
|
|
if (arg instanceof Event && arg.type === "error") {
|
|
return new ResourceLoadError();
|
|
}
|
|
return arg;
|
|
}).filter((arg) => {
|
|
return !!arg && !["null", "undefined"].includes(arg);
|
|
});
|
|
if (args.length === 0) return;
|
|
const level = prop;
|
|
const firstError = args.find((arg) => arg instanceof Error);
|
|
const firstString = args.find(isString);
|
|
const otherData = args.filter(
|
|
(o) => o !== firstString && o !== firstError
|
|
);
|
|
const errorMessage = firstError?.message ?? firstString ?? `Unknown error`;
|
|
if (errorMessage !== firstString) {
|
|
otherData.unshift(firstString);
|
|
}
|
|
const otherDataObjects = otherData.filter(isObjectLike);
|
|
const otherDataNonObjects = otherData.filter((o) => !isObjectLike(o));
|
|
const mergedOtherDataObject = Object.assign(
|
|
{},
|
|
...otherDataObjects
|
|
);
|
|
handler(
|
|
{
|
|
args,
|
|
firstError,
|
|
firstString,
|
|
otherData: mergedOtherDataObject,
|
|
nonObjectOtherData: otherDataNonObjects,
|
|
level
|
|
},
|
|
{ prettifyMessage: (msg) => prettify(mergedOtherDataObject, msg) }
|
|
);
|
|
return log(...args);
|
|
};
|
|
}
|
|
return get(target, prop);
|
|
}
|
|
});
|
|
}
|
|
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm9ic2VydmFiaWxpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXHJcblxyXG5pbXBvcnQgdHlwZSB7IE9wdGlvbmFsIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgdHlwZSAqIGFzIE9ic2VydmFiaWxpdHkgZnJvbSAnQHNwZWNrbGUvc2hhcmVkL29ic2VydmFiaWxpdHknXHJcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcydcclxuaW1wb3J0IHtcclxuICB1cHBlckZpcnN0LFxyXG4gIGdldCxcclxuICBpc0Jvb2xlYW4sXHJcbiAgaXNOdW1iZXIsXHJcbiAgaXNPYmplY3RMaWtlLFxyXG4gIGlzU3RyaW5nLFxyXG4gIG5vb3BcclxufSBmcm9tICdsb2Rhc2gtZXMnXHJcbmltcG9ydCB0eXBlIHsgTG9nZ2VyLCBMZXZlbCB9IGZyb20gJ3Bpbm8nXHJcbmltcG9ydCB7IFJlc291cmNlTG9hZEVycm9yIH0gZnJvbSAnfi9saWIvY29yZS9lcnJvcnMvYmFzZSdcclxuXHJcbi8qKlxyXG4gKiBBZGQgcGluby1wcmV0dHkgbGlrZSBmb3JtYXR0aW5nXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcHJldHRpZnkgPSAobG9nOiBvYmplY3QsIG1zZzogc3RyaW5nKSA9PlxyXG4gIG1zZy5yZXBsYWNlKC97KFtee31dKyl9L2csIChtYXRjaDogc3RyaW5nLCBwMTogc3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCB2YWwgPSBnZXQobG9nLCBwMSlcclxuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG1hdGNoXHJcblxyXG4gICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPVxyXG4gICAgICBpc1N0cmluZyh2YWwpIHx8IGlzTnVtYmVyKHZhbCkgfHwgaXNCb29sZWFuKHZhbCkgPyB2YWwgOiBKU09OLnN0cmluZ2lmeSh2YWwpXHJcbiAgICByZXR1cm4gZm9ybWF0dGVkVmFsdWUgYXMgc3RyaW5nXHJcbiAgfSlcclxuXHJcbi8qKlxyXG4gKiBXcmFwIGFueSBsb2dnZXIgY2FsbCB3LyBsb2dpYyB0aGF0IHByZXR0aWZpZXMgdGhlIGVycm9yIG1lc3NhZ2UgbGlrZSBwaW5vLXByZXR0eSBkb2VzXHJcbiAqIGFuZCBlbWl0cyBiaW5kaW5ncyBpZiB0aGV5IGFyZSBwcm92aWRlZFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHByZXR0aWZpZWRMb2dnZXJGYWN0b3J5ID1cclxuICAoXHJcbiAgICBsb2dnZXI6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQsXHJcbiAgICBiaW5kaW5ncz86ICgpID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxyXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8e1xyXG4gICAgICB0aW1lOiBib29sZWFuXHJcbiAgICB9PlxyXG4gICkgPT5cclxuICAoLi4udmFsczogdW5rbm93bltdKSA9PiB7XHJcbiAgICBjb25zdCB7IHRpbWUgfSA9IG9wdGlvbnMgfHwge31cclxuICAgIGNvbnN0IGZpbmFsVmFscyA9IHZhbHMuc2xpY2UoKVxyXG5cclxuICAgIGNvbnN0IGZpcnN0T2JqZWN0ID0gZmluYWxWYWxzLmZpbmQoKHYpID0+IGlzT2JqZWN0TGlrZSh2KSAmJiAhQXJyYXkuaXNBcnJheSh2KSlcclxuICAgIGNvbnN0IGZpcnN0TWVzc2FnZUlkeCA9IGZpbmFsVmFscy5maW5kSW5kZXgoaXNTdHJpbmcpXHJcblxyXG4gICAgaWYgKGZpcnN0TWVzc2FnZUlkeCAhPT0gLTEpIHtcclxuICAgICAgY29uc3QgbXNnID0gZmluYWxWYWxzW2ZpcnN0TWVzc2FnZUlkeF0gYXMgc3RyaW5nXHJcbiAgICAgIGZpbmFsVmFscy5zcGxpY2UoZmlyc3RNZXNzYWdlSWR4LCAxKSAvLyByZW1vdmUgZnJvbSBhcnJheVxyXG5cclxuICAgICAgY29uc3QgZmluYWxNc2cgPSBwcmV0dGlmeShmaXJzdE9iamVjdCB8fCB7fSwgbXNnKVxyXG4gICAgICBmaW5hbFZhbHMudW5zaGlmdChmaW5hbE1zZylcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYmluZGluZ3MpIHtcclxuICAgICAgY29uc3QgYm91bmRWYWxzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShiaW5kaW5ncygpKSlcclxuICAgICAgZmluYWxWYWxzLnB1c2goYm91bmRWYWxzKVxyXG4gICAgfVxyXG5cclxuICAgIGxvZ2dlcihcclxuICAgICAgLi4uZmluYWxWYWxzLFxyXG4gICAgICAuLi4odGltZVxyXG4gICAgICAgID8gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdGltZTogZGF5anMoKS5mb3JtYXQoJ0hIOm1tOnNzLlNTUycpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICA6IFtdKVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZha2VQaW5vTG9nZ2VyKFxyXG4gIG9wdGlvbnM/OiBQYXJ0aWFsPHtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoZSBsb2cgY29udGV4dCB3aGVuIG91dHB1dHRpbmcgdG8gdGhlIGNvbnNvbGUuXHJcbiAgICAgKiBUaGVzZSB3aWxsIG5vdCBiZSBzZW50IHRvIHNlcSFcclxuICAgICAqL1xyXG4gICAgY29uc29sZUJpbmRpbmdzOiAoKSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxyXG4gICAgdGltZTogYm9vbGVhblxyXG4gIH0+XHJcbikge1xyXG4gIGNvbnN0IHsgdGltZSA9IGZhbHNlIH0gPSBvcHRpb25zIHx8IHt9XHJcbiAgY29uc3QgYmluZGluZ3MgPSBvcHRpb25zPy5jb25zb2xlQmluZGluZ3NcclxuXHJcbiAgY29uc3QgbG9nZ2VyID0ge1xyXG4gICAgZGVidWc6IHByZXR0aWZpZWRMb2dnZXJGYWN0b3J5KGNvbnNvbGUuZGVidWcsIGJpbmRpbmdzLCB7IHRpbWUgfSksXHJcbiAgICBpbmZvOiBwcmV0dGlmaWVkTG9nZ2VyRmFjdG9yeShjb25zb2xlLmluZm8sIGJpbmRpbmdzLCB7IHRpbWUgfSksXHJcbiAgICB3YXJuOiBwcmV0dGlmaWVkTG9nZ2VyRmFjdG9yeShjb25zb2xlLndhcm4sIGJpbmRpbmdzLCB7IHRpbWUgfSksXHJcbiAgICBlcnJvcjogcHJldHRpZmllZExvZ2dlckZhY3RvcnkoY29uc29sZS5lcnJvciwgYmluZGluZ3MsIHsgdGltZSB9KSxcclxuICAgIGZhdGFsOiBwcmV0dGlmaWVkTG9nZ2VyRmFjdG9yeShjb25zb2xlLmVycm9yLCBiaW5kaW5ncywgeyB0aW1lIH0pLFxyXG4gICAgdHJhY2U6IHByZXR0aWZpZWRMb2dnZXJGYWN0b3J5KGNvbnNvbGUudHJhY2UsIGJpbmRpbmdzLCB7IHRpbWUgfSksXHJcbiAgICBzaWxlbnQ6IG5vb3BcclxuICB9IGFzIHVua25vd24gYXMgUmV0dXJuVHlwZTx0eXBlb2YgT2JzZXJ2YWJpbGl0eS5nZXRMb2dnZXI+XHJcblxyXG4gIGxvZ2dlci5jaGlsZCA9ICgpID0+IGxvZ2dlciBhcyBhbnlcclxuXHJcbiAgcmV0dXJuIGxvZ2dlclxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBTaW1wbGVFcnJvciA9IHtcclxuICBzdGF0dXNDb2RlOiBudW1iZXJcclxuICBtZXNzYWdlOiBzdHJpbmdcclxuICBzdGFjaz86IHN0cmluZ1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZm9ybWF0QXBwRXJyb3IgPSAoZXJyOiBTaW1wbGVFcnJvcik6IFNpbXBsZUVycm9yID0+IHtcclxuICBjb25zdCB7IHN0YXR1c0NvZGUsIG1lc3NhZ2UsIHN0YWNrIH0gPSBlcnJcclxuXHJcbiAgbGV0IGZpbmFsTWVzc2FnZSA9IG1lc3NhZ2UgfHwgJydcclxuICBsZXQgZmluYWxTdGF0dXNDb2RlID0gc3RhdHVzQ29kZSB8fCA1MDBcclxuXHJcbiAgaWYgKGZpbmFsTWVzc2FnZS5tYXRjaCgvXmZldGNoIGZhaWxlZCQvaSkpIHtcclxuICAgIGZpbmFsTWVzc2FnZSA9ICdJbnRlcm5hbCBBUEkgY2FsbCBmYWlsZWQsIHBsZWFzZSBjb250YWN0IHNpdGUgYWRtaW5pc3RyYXRvcnMnXHJcbiAgfVxyXG5cclxuICBpZiAoZmluYWxNZXNzYWdlLm1hdGNoKC9zdGF0dXMgY29kZSA0MjkvaSkpIHtcclxuICAgIGZpbmFsTWVzc2FnZSA9XHJcbiAgICAgICdZb3UgYXJlIHNlbmRpbmcgdG9vIG1hbnkgcmVxdWVzdHMuIFlvdSBoYXZlIGJlZW4gcmF0ZSBsaW1pdGVkLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLidcclxuICAgIGZpbmFsU3RhdHVzQ29kZSA9IDQyOVxyXG4gIH1cclxuXHJcbiAgaWYgKGZpbmFsTWVzc2FnZS5tYXRjaCgvXFwvX251eHRcXC9idWlsZHNcXC9tZXRhLio/NDA0L2kpKSB7XHJcbiAgICBmaW5hbE1lc3NhZ2UgPVxyXG4gICAgICAnU3BlY2tsZSBpcyBjdXJyZW50bHkgdXBncmFkaW5nIHRvIGEgbmV3ZXIgdmVyc2lvbi4gUGxlYXNlIHJlbG9hZCB0aGUgcGFnZSBpbiBhIGZldyBzZWNvbmRzLidcclxuICAgIGZpbmFsU3RhdHVzQ29kZSA9IDUwMFxyXG4gIH1cclxuXHJcbiAgZmluYWxNZXNzYWdlID0gdXBwZXJGaXJzdChmaW5hbE1lc3NhZ2UpXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzdGF0dXNDb2RlOiBmaW5hbFN0YXR1c0NvZGUsXHJcbiAgICBtZXNzYWdlOiBmaW5hbE1lc3NhZ2UsXHJcbiAgICBzdGFja1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IHR5cGUgQWJzdHJhY3RMb2dnZXJIYW5kbGVyID0gKFxyXG4gIHBhcmFtczoge1xyXG4gICAgYXJnczogdW5rbm93bltdXHJcbiAgICBmaXJzdFN0cmluZzogT3B0aW9uYWw8c3RyaW5nPlxyXG4gICAgZmlyc3RFcnJvcjogT3B0aW9uYWw8RXJyb3I+XHJcbiAgICBvdGhlckRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XHJcbiAgICBub25PYmplY3RPdGhlckRhdGE6IHVua25vd25bXVxyXG4gICAgbGV2ZWw6IExldmVsXHJcbiAgfSxcclxuICBoZWxwZXJzOiB7XHJcbiAgICBwcmV0dGlmeU1lc3NhZ2U6IChtc2c6IHN0cmluZykgPT4gc3RyaW5nXHJcbiAgfVxyXG4pID0+IHZvaWRcclxuXHJcbmV4cG9ydCB0eXBlIEFic3RyYWN0VW5oYW5kbGVkRXJyb3JIYW5kbGVyID0gKHBhcmFtczoge1xyXG4gIGV2ZW50OiBFcnJvckV2ZW50IHwgUHJvbWlzZVJlamVjdGlvbkV2ZW50XHJcbiAgaXNVbmhhbmRsZWRSZWplY3Rpb246IGJvb2xlYW5cclxuICBlcnJvcjogRXJyb3IgfCB1bmtub3duXHJcbiAgbWVzc2FnZTogc3RyaW5nXHJcbn0pID0+IHZvaWRcclxuXHJcbmV4cG9ydCB0eXBlIEFic3RyYWN0TG9nZ2VySGFuZGxlclBhcmFtcyA9IFBhcmFtZXRlcnM8QWJzdHJhY3RMb2dnZXJIYW5kbGVyPlswXVxyXG5cclxuLyoqXHJcbiAqIEFkZHMgcHJveHkgdGhhdCBpbnRlcmNlcHRzIGxvZ2dlciBjYWxscyBzbyB0aGF0IHRoZXkgY2FuIGJlIHNlbnQgdG8gYW55IHRyYW5zcG9ydFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZUN1c3RvbUxvZ2dlckhhbmRsaW5nKHBhcmFtczoge1xyXG4gIGxvZ2dlcjogTG9nZ2VyXHJcbiAgaGFuZGxlcjogQWJzdHJhY3RMb2dnZXJIYW5kbGVyXHJcbn0pOiBMb2dnZXIge1xyXG4gIGNvbnN0IHsgbG9nZ2VyLCBoYW5kbGVyIH0gPSBwYXJhbXNcclxuICByZXR1cm4gbmV3IFByb3h5KGxvZ2dlciwge1xyXG4gICAgZ2V0KHRhcmdldCwgcHJvcCkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgWyd0cmFjZScsICdkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InLCAnZmF0YWwnXS5pbmNsdWRlcyhwcm9wIGFzIHN0cmluZylcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29uc3QgbG9nTWV0aG9kID0gZ2V0KHRhcmdldCwgcHJvcCkgYXMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZFxyXG4gICAgICAgIHJldHVybiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBsb2cgPSBsb2dNZXRob2QuYmluZCh0YXJnZXQpXHJcblxyXG4gICAgICAgICAgLy8gRm9ybWF0IHBhc3NlZCBpbiBkYXRhLCBpZiBuZWVkZWRcclxuICAgICAgICAgIGFyZ3MgPSBhcmdzXHJcbiAgICAgICAgICAgIC5tYXAoKGFyZykgPT4ge1xyXG4gICAgICAgICAgICAgIC8vIENvbnZlcnQgZXJyb3IgZXZlbnRzIHRvIGVycm9yIHR5cGVcclxuICAgICAgICAgICAgICBpZiAoYXJnIGluc3RhbmNlb2YgRXZlbnQgJiYgYXJnLnR5cGUgPT09ICdlcnJvcicpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VMb2FkRXJyb3IoKVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIGFyZ1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuZmlsdGVyKChhcmcpID0+IHtcclxuICAgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IGZhbHN5IHZhbHVlc1xyXG4gICAgICAgICAgICAgIHJldHVybiAhIWFyZyAmJiAhKFsnbnVsbCcsICd1bmRlZmluZWQnXSBhcyB1bmtub3duW10pLmluY2x1ZGVzKGFyZylcclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAvLyBJZiBub3RoaW5nIHZhbGlkIHRvIGxvZywgc2tpcCBlbnRpcmVseVxyXG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm5cclxuXHJcbiAgICAgICAgICBjb25zdCBsZXZlbCA9IHByb3AgYXMgTGV2ZWxcclxuICAgICAgICAgIGNvbnN0IGZpcnN0RXJyb3IgPSBhcmdzLmZpbmQoKGFyZyk6IGFyZyBpcyBFcnJvciA9PiBhcmcgaW5zdGFuY2VvZiBFcnJvcilcclxuXHJcbiAgICAgICAgICBjb25zdCBmaXJzdFN0cmluZyA9IGFyZ3MuZmluZChpc1N0cmluZylcclxuICAgICAgICAgIGNvbnN0IG90aGVyRGF0YTogdW5rbm93bltdID0gYXJncy5maWx0ZXIoXHJcbiAgICAgICAgICAgIChvKSA9PiBvICE9PSBmaXJzdFN0cmluZyAmJiBvICE9PSBmaXJzdEVycm9yXHJcbiAgICAgICAgICApXHJcblxyXG4gICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZmlyc3RFcnJvcj8ubWVzc2FnZSA/PyBmaXJzdFN0cmluZyA/PyBgVW5rbm93biBlcnJvcmBcclxuICAgICAgICAgIGlmIChlcnJvck1lc3NhZ2UgIT09IGZpcnN0U3RyaW5nKSB7XHJcbiAgICAgICAgICAgIG90aGVyRGF0YS51bnNoaWZ0KGZpcnN0U3RyaW5nKVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IG90aGVyRGF0YU9iamVjdHMgPSBvdGhlckRhdGEuZmlsdGVyKGlzT2JqZWN0TGlrZSlcclxuICAgICAgICAgIGNvbnN0IG90aGVyRGF0YU5vbk9iamVjdHMgPSBvdGhlckRhdGEuZmlsdGVyKChvKSA9PiAhaXNPYmplY3RMaWtlKG8pKVxyXG4gICAgICAgICAgY29uc3QgbWVyZ2VkT3RoZXJEYXRhT2JqZWN0ID0gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgIC4uLm90aGVyRGF0YU9iamVjdHNcclxuICAgICAgICAgICkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cclxuXHJcbiAgICAgICAgICBoYW5kbGVyKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgYXJncyxcclxuICAgICAgICAgICAgICBmaXJzdEVycm9yLFxyXG4gICAgICAgICAgICAgIGZpcnN0U3RyaW5nLFxyXG4gICAgICAgICAgICAgIG90aGVyRGF0YTogbWVyZ2VkT3RoZXJEYXRhT2JqZWN0LFxyXG4gICAgICAgICAgICAgIG5vbk9iamVjdE90aGVyRGF0YTogb3RoZXJEYXRhTm9uT2JqZWN0cyxcclxuICAgICAgICAgICAgICBsZXZlbFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7IHByZXR0aWZ5TWVzc2FnZTogKG1zZykgPT4gcHJldHRpZnkobWVyZ2VkT3RoZXJEYXRhT2JqZWN0LCBtc2cpIH1cclxuICAgICAgICAgIClcclxuXHJcbiAgICAgICAgICByZXR1cm4gbG9nKC4uLmFyZ3MpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZ2V0KHRhcmdldCwgcHJvcClcclxuICAgIH1cclxuICB9KVxyXG59XHJcbiJdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxXQUFXO0FBQ2xCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLHlCQUF5QjtBQUszQixhQUFNLFdBQVcsQ0FBQyxLQUFhLFFBQ3BDLElBQUksUUFBUSxlQUFlLENBQUMsT0FBZSxPQUFlO0FBQ3hELFFBQU0sTUFBTSxJQUFJLEtBQUssRUFBRTtBQUN2QixNQUFJLFFBQVEsT0FBVyxRQUFPO0FBRTlCLFFBQU0saUJBQ0osU0FBUyxHQUFHLEtBQUssU0FBUyxHQUFHLEtBQUssVUFBVSxHQUFHLElBQUksTUFBTSxLQUFLLFVBQVUsR0FBRztBQUM3RSxTQUFPO0FBQ1QsQ0FBQztBQU1JLGFBQU0sMEJBQ1gsQ0FDRSxRQUNBLFVBQ0EsWUFJRixJQUFJLFNBQW9CO0FBQ3RCLFFBQU0sRUFBRSxLQUFLLElBQUksV0FBVyxDQUFDO0FBQzdCLFFBQU0sWUFBWSxLQUFLLE1BQU07QUFFN0IsUUFBTSxjQUFjLFVBQVUsS0FBSyxDQUFDLE1BQU0sYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQyxDQUFDO0FBQzlFLFFBQU0sa0JBQWtCLFVB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 |