UNPKG

@repka-kit/ts

Version:

Next generation build tools for monorepo: lint, bundle and package your TypeScript projects

274 lines (268 loc) 35.1 kB
import { ChildProcess, spawn } from 'node:child_process'; import { o as once } from './chunk.gqGVJwT_.js'; const levels = ["debug", "info", "warn", "error", "fatal"]; const enabledLevelsAfter = (level) => { if (level === "off") { return []; } const index = levels.findIndex((item) => item === level); if (index === -1) { throw new Error("Invalid level"); } return levels.slice(index); }; const isLevel = (level) => { return levels.includes(level); }; const verbosityFromProcessArgs = (args = process.argv) => { const index = args.findIndex((value) => value === "--log-level"); if (index === -1) { return void 0; } const level = args[index + 1]; if (level === "silent" || level === "off") { return "off"; } if (!isLevel(level)) { return void 0; } return level; }; const verbosityFromEnv = () => { const level = process.env["LOG_LEVEL"]; if (level === "silent" || level === "off") { return "off"; } if (!isLevel(level)) { return void 0; } return level; }; const getVerbosityConfig = () => { const argsLevel = verbosityFromProcessArgs(); const envLevel = verbosityFromEnv(); return argsLevel ?? envLevel ?? "info"; }; const noop = (..._args) => { return; }; const log = (...args) => { console.log(...args); }; const error = (...args) => { console.error(...args); }; const shouldEnableTip = () => !process.env["CI"] && !process.stdout.isTTY; const createLogger = (deps = { getVerbosityConfig, log, error, shouldEnableTip }) => { const logLevel = deps.getVerbosityConfig(); const enabled = enabledLevelsAfter(logLevel); return levels.reduce( (acc, lvl) => { return { ...acc, [lvl]: enabled.includes(lvl) ? ["fatal", "error"].includes(lvl) ? deps.error : deps.log : noop }; }, { logLevel, log: enabled.includes("info") ? deps.log : noop, tip: enabled.includes("info") && deps.shouldEnableTip() ? deps.log : noop } ); }; const createDelegatingLogger = (opts) => Object.freeze({ get logLevel() { return opts.parent.logLevel; }, debug(...params) { opts.parent.debug(...params); }, info(...params) { opts.parent.info(...params); }, log(...params) { opts.parent.log(...params); }, tip(...params) { opts.parent.tip(...params); }, warn(...params) { opts.parent.warn(...params); }, error(...params) { opts.parent.error(...params); }, fatal(...params) { opts.parent.fatal(...params); } }); let defaultLoggerFactory; const configureDefaultLogger = (factory) => { if (defaultLoggerFactory) { const error2 = { stack: "" }; Error.captureStackTrace(error2); logger.debug("Cannot override default logger multiple times", error2.stack); return; } defaultLoggerFactory = factory; }; const defaultLogger = once(() => { let factory = defaultLoggerFactory; if (!factory) { factory = () => createLogger(); } return factory(); }); const logger = createDelegatingLogger({ get parent() { return defaultLogger(); } }); function captureStackTrace(remove = 0) { const stackContainer = { stack: "" }; Error.captureStackTrace(stackContainer); const stackTrace = stackContainer.stack.split("\n").slice(6 + remove).join("\n"); return { /** * Captured stack trace information */ stackTrace, /** * Can be called in asynchronous callback to enrich exceptions with additional information * @param err Exception to enrich - it is going to have its `.stack` prop mutated * @returns Same exception */ prepareForRethrow: (err) => { const oldStackTrace = err.stack ?? "".split("\n").slice(1).join("\n"); err.stack = `${err.name || "Error"}: ${err.message} ${oldStackTrace} ${stackTrace}`; return err; } }; } function isSpawnArgs(args) { return !(args[0] instanceof ChildProcess) && typeof args[0] === "string"; } function spawnWithSpawnParameters(parameters) { const [child, [command, args, opts]] = isSpawnArgs(parameters) ? [ spawn(...parameters), parameters ] : [ parameters[0], [ parameters[0].spawnfile, parameters[0].spawnargs.slice(1), parameters[1] ] ]; return { child, command, args, opts }; } async function spawnToPromise(...parameters) { const { child, command, args, opts } = spawnWithSpawnParameters(parameters); const { prepareForRethrow } = captureStackTrace(); const exitCodes = opts.exitCodes; const cwd = opts.cwd ? opts.cwd.toString() : void 0; const cmd = () => [command, ...args].join(" "); logger.debug([">", cmd()].join(" "), ...cwd ? [`in ${cwd}`] : []); await new Promise( (res, rej) => child.on("close", (code, signal) => { if (typeof code === "number") { if (exitCodes !== "inherit" && exitCodes !== "any" && !exitCodes.includes(code)) { rej( prepareForRethrow( new Error(`Command "${cmd()}" has failed with code ${code}`) ) ); } else { res(); } } else if (signal) { rej( prepareForRethrow( new Error(`Failed to execute command "${cmd()}" - ${signal}`) ) ); } else { throw prepareForRethrow(new Error("Expected signal or error code")); } }).on("error", rej) ); if (exitCodes === "inherit") { if (typeof child.exitCode === "number" && (typeof process.exitCode !== "number" || process.exitCode === 0)) { process.exitCode = child.exitCode; } } } function includesAnyOf(target, hasAnyOfArgs) { return hasAnyOfArgs.some((variant) => target.includes(variant)); } function removeArgsFrom(target, args, opts) { const result = [...target]; for (const arg of args) { const index = target.findIndex( (value) => typeof arg === "string" ? value === arg : arg.test(value) ); if (index !== -1) { result.splice(index, (opts == null ? void 0 : opts.numValues) ? opts.numValues + 1 : 1); } } return result; } function setScript(script) { return (state) => { return { ...state, preArgs: [script, ...state.preArgs] }; }; } function removeInputArgs(args, opts) { return (state) => { return { ...state, inputArgs: removeArgsFrom(state.inputArgs, args, opts) }; }; } function setDefaultArgs(args, values = [], condition, apply) { return (state) => { if (condition) { if (!condition(state)) { return state; } } if (includesAnyOf(state.inputArgs, args)) { return state; } const set = apply ? apply : (args2, to) => ({ ...to, preArgs: [...state.preArgs, ...args2] }); return set([args[0], ...values], state); }; } const removeLogLevelOption = () => removeInputArgs(["--log-level"], { numValues: 1 }); function cliArgsPipe(transforms, inputArgs) { const { preArgs, inputArgs: modifiedInputArgs, postArgs } = transforms.reduce((acc, transform) => transform(acc), { inputArgs, preArgs: [], postArgs: [] }); return [...preArgs, ...modifiedInputArgs, ...postArgs]; } export { spawnWithSpawnParameters as a, createLogger as b, configureDefaultLogger as c, cliArgsPipe as d, setScript as e, setDefaultArgs as f, includesAnyOf as g, removeInputArgs as h, isSpawnArgs as i, logger as l, removeLogLevelOption as r, spawnToPromise as s }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2h1bmsuMkVYMjVfQ0cuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2dnZXIvbG9nZ2VyLnRzIiwiLi4vc3JjL3V0aWxzL3N0YWNrVHJhY2UudHMiLCIuLi9zcmMvY2hpbGQtcHJvY2Vzcy9zcGF3blRvUHJvbWlzZS50cyIsIi4uL3NyYy91dGlscy9jbGlBcmdzUGlwZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBvbmNlIH0gZnJvbSAnQHV0aWxzL3RzJztcblxuY29uc3QgbGV2ZWxzID0gWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InLCAnZmF0YWwnXSBhcyBjb25zdDtcblxudHlwZSBMb2dMZXZlbCA9IHR5cGVvZiBsZXZlbHNbbnVtYmVyXTtcblxudHlwZSBQYXJhbXMgPSBQYXJhbWV0ZXJzPHR5cGVvZiBjb25zb2xlLmxvZz47XG5cbnR5cGUgTG9nZ2VyID0ge1xuICBsb2dMZXZlbDogTG9nTGV2ZWw7XG4gIGRlYnVnKC4uLnBhcmFtczogUGFyYW1zKTogdm9pZDtcbiAgaW5mbyguLi5wYXJhbXM6IFBhcmFtcyk6IHZvaWQ7XG4gIC8vIGFsaWFzIGZvciBpbmZvXG4gIGxvZyguLi5wYXJhbXM6IFBhcmFtcyk6IHZvaWQ7XG4gIC8vIHNwZWNpYWwgdHJlYXRtZW50LCBkaXNhYmxlZCBvbiBDSS9UVFlcbiAgdGlwKC4uLnBhcmFtczogUGFyYW1zKTogdm9pZDtcbiAgd2FybiguLi5wYXJhbXM6IFBhcmFtcyk6IHZvaWQ7XG4gIGVycm9yKC4uLnBhcmFtczogUGFyYW1zKTogdm9pZDtcbiAgZmF0YWwoLi4ucGFyYW1zOiBQYXJhbXMpOiB2b2lkO1xufTtcblxuY29uc3QgZW5hYmxlZExldmVsc0FmdGVyID0gKGxldmVsOiBMb2dMZXZlbCB8ICdvZmYnKSA9PiB7XG4gIGlmIChsZXZlbCA9PT0gJ29mZicpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgaW5kZXggPSBsZXZlbHMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtID09PSBsZXZlbCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGV2ZWwnKTtcbiAgfVxuICByZXR1cm4gbGV2ZWxzLnNsaWNlKGluZGV4KTtcbn07XG5cbmNvbnN0IGlzTGV2ZWwgPSAobGV2ZWw/OiBzdHJpbmcpOiBsZXZlbCBpcyBMb2dMZXZlbCA9PiB7XG4gIHJldHVybiBsZXZlbHMuaW5jbHVkZXMobGV2ZWwgYXMgTG9nTGV2ZWwpO1xufTtcblxuY29uc3QgdmVyYm9zaXR5RnJvbVByb2Nlc3NBcmdzID0gKFxuICBhcmdzID0gcHJvY2Vzcy5hcmd2XG4pOiBMb2dMZXZlbCB8ICdvZmYnIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgaW5kZXggPSBhcmdzLmZpbmRJbmRleCgodmFsdWUpID0+IHZhbHVlID09PSAnLS1sb2ctbGV2ZWwnKTtcbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgbGV2ZWwgPSBhcmdzW2luZGV4ICsgMV07XG4gIGlmIChsZXZlbCA9PT0gJ3NpbGVudCcgfHwgbGV2ZWwgPT09ICdvZmYnKSB7XG4gICAgcmV0dXJuICdvZmYnO1xuICB9XG4gIGlmICghaXNMZXZlbChsZXZlbCkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBsZXZlbDtcbn07XG5cbmNvbnN0IHZlcmJvc2l0eUZyb21FbnYgPSAoKTogTG9nTGV2ZWwgfCAnb2ZmJyB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGxldmVsID0gcHJvY2Vzcy5lbnZbJ0xPR19MRVZFTCddO1xuICBpZiAobGV2ZWwgPT09ICdzaWxlbnQnIHx8IGxldmVsID09PSAnb2ZmJykge1xuICAgIHJldHVybiAnb2ZmJztcbiAgfVxuICBpZiAoIWlzTGV2ZWwobGV2ZWwpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gbGV2ZWw7XG59O1xuXG5jb25zdCBnZXRWZXJib3NpdHlDb25maWcgPSAoKSA9PiB7XG4gIGNvbnN0IGFyZ3NMZXZlbCA9IHZlcmJvc2l0eUZyb21Qcm9jZXNzQXJncygpO1xuICBjb25zdCBlbnZMZXZlbCA9IHZlcmJvc2l0eUZyb21FbnYoKTtcbiAgcmV0dXJuIGFyZ3NMZXZlbCA/PyBlbnZMZXZlbCA/PyAnaW5mbyc7XG59O1xuXG5jb25zdCBub29wID0gKC4uLl9hcmdzOiBQYXJhbXMpID0+IHtcbiAgcmV0dXJuO1xufTtcblxuY29uc3QgbG9nID0gKC4uLmFyZ3M6IFBhcmFtcykgPT4ge1xuICBjb25zb2xlLmxvZyguLi5hcmdzKTtcbn07XG5cbmNvbnN0IGVycm9yID0gKC4uLmFyZ3M6IFBhcmFtcykgPT4ge1xuICBjb25zb2xlLmVycm9yKC4uLmFyZ3MpO1xufTtcblxuY29uc3Qgc2hvdWxkRW5hYmxlVGlwID0gKCkgPT4gIXByb2Nlc3MuZW52WydDSSddICYmICFwcm9jZXNzLnN0ZG91dC5pc1RUWTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUxvZ2dlciA9IChcbiAgZGVwcyA9IHsgZ2V0VmVyYm9zaXR5Q29uZmlnLCBsb2csIGVycm9yLCBzaG91bGRFbmFibGVUaXAgfVxuKSA9PiB7XG4gIGNvbnN0IGxvZ0xldmVsID0gZGVwcy5nZXRWZXJib3NpdHlDb25maWcoKTtcbiAgY29uc3QgZW5hYmxlZCA9IGVuYWJsZWRMZXZlbHNBZnRlcihsb2dMZXZlbCk7XG4gIHJldHVybiBsZXZlbHMucmVkdWNlKFxuICAgIChhY2MsIGx2bCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYWNjLFxuICAgICAgICBbbHZsXTogZW5hYmxlZC5pbmNsdWRlcyhsdmwpXG4gICAgICAgICAgPyBbJ2ZhdGFsJywgJ2Vycm9yJ10uaW5jbHVkZXMobHZsKVxuICAgICAgICAgICAgPyBkZXBzLmVycm9yXG4gICAgICAgICAgICA6IGRlcHMubG9nXG4gICAgICAgICAgOiBub29wLFxuICAgICAgfTtcbiAgICB9LFxuICAgIHtcbiAgICAgIGxvZ0xldmVsLFxuICAgICAgbG9nOiBlbmFibGVkLmluY2x1ZGVzKCdpbmZvJykgPyBkZXBzLmxvZyA6IG5vb3AsXG4gICAgICB0aXA6IGVuYWJsZWQuaW5jbHVkZXMoJ2luZm8nKSAmJiBkZXBzLnNob3VsZEVuYWJsZVRpcCgpID8gZGVwcy5sb2cgOiBub29wLFxuICAgIH0gYXMgTG9nZ2VyXG4gICk7XG59O1xuXG5jb25zdCBjcmVhdGVEZWxlZ2F0aW5nTG9nZ2VyID0gKG9wdHM6IHsgcGFyZW50OiBMb2dnZXIgfSk6IExvZ2dlciA9PlxuICBPYmplY3QuZnJlZXplKHtcbiAgICBnZXQgbG9nTGV2ZWwoKSB7XG4gICAgICByZXR1cm4gb3B0cy5wYXJlbnQubG9nTGV2ZWw7XG4gICAgfSxcbiAgICBkZWJ1ZyguLi5wYXJhbXM6IFBhcmFtcyk6IHZvaWQge1xuICAgICAgb3B0cy5wYXJlbnQuZGVidWcoLi4ucGFyYW1zKTtcbiAgICB9LFxuICAgIGluZm8oLi4ucGFyYW1zOiBQYXJhbXMpOiB2b2lkIHtcbiAgICAgIG9wdHMucGFyZW50LmluZm8oLi4ucGFyYW1zKTtcbiAgICB9LFxuICAgIGxvZyguLi5wYXJhbXM6IFBhcmFtcyk6IHZvaWQge1xuICAgICAgb3B0cy5wYXJlbnQubG9nKC4uLnBhcmFtcyk7XG4gICAgfSxcbiAgICB0aXAoLi4ucGFyYW1zOiBQYXJhbXMpOiB2b2lkIHtcbiAgICAgIG9wdHMucGFyZW50LnRpcCguLi5wYXJhbXMpO1xuICAgIH0sXG4gICAgd2FybiguLi5wYXJhbXM6IFBhcmFtcyk6IHZvaWQge1xuICAgICAgb3B0cy5wYXJlbnQud2FybiguLi5wYXJhbXMpO1xuICAgIH0sXG4gICAgZXJyb3IoLi4ucGFyYW1zOiBQYXJhbXMpOiB2b2lkIHtcbiAgICAgIG9wdHMucGFyZW50LmVycm9yKC4uLnBhcmFtcyk7XG4gICAgfSxcbiAgICBmYXRhbCguLi5wYXJhbXM6IFBhcmFtcyk6IHZvaWQge1xuICAgICAgb3B0cy5wYXJlbnQuZmF0YWwoLi4ucGFyYW1zKTtcbiAgICB9LFxuICB9KTtcblxubGV0IGRlZmF1bHRMb2dnZXJGYWN0b3J5OiAoKCkgPT4gTG9nZ2VyKSB8IG51bGw7XG5cbmV4cG9ydCBjb25zdCBjb25maWd1cmVEZWZhdWx0TG9nZ2VyID0gKGZhY3Rvcnk6ICgpID0+IExvZ2dlcikgPT4ge1xuICBpZiAoZGVmYXVsdExvZ2dlckZhY3RvcnkpIHtcbiAgICBjb25zdCBlcnJvciA9IHtcbiAgICAgIHN0YWNrOiAnJyxcbiAgICB9O1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVycm9yKTtcbiAgICBsb2dnZXIuZGVidWcoJ0Nhbm5vdCBvdmVycmlkZSBkZWZhdWx0IGxvZ2dlciBtdWx0aXBsZSB0aW1lcycsIGVycm9yLnN0YWNrKTtcbiAgICByZXR1cm47XG4gIH1cbiAgZGVmYXVsdExvZ2dlckZhY3RvcnkgPSBmYWN0b3J5O1xufTtcblxuY29uc3QgZGVmYXVsdExvZ2dlciA9IG9uY2UoKCkgPT4ge1xuICBsZXQgZmFjdG9yeSA9IGRlZmF1bHRMb2dnZXJGYWN0b3J5O1xuICBpZiAoIWZhY3RvcnkpIHtcbiAgICBmYWN0b3J5ID0gKCkgPT4gY3JlYXRlTG9nZ2VyKCk7XG4gIH1cbiAgcmV0dXJuIGZhY3RvcnkoKTtcbn0pO1xuXG4vKipcbiAqIERlZmF1bHQgbG9nZ2VyIGluc3RhbmNlIGNhbiBiZSBjb25maWd1cmVkIG9uY2UgYXQgc3RhcnR1cFxuICovXG5leHBvcnQgY29uc3QgbG9nZ2VyOiBMb2dnZXIgPSBjcmVhdGVEZWxlZ2F0aW5nTG9nZ2VyKHtcbiAgZ2V0IHBhcmVudCgpIHtcbiAgICByZXR1cm4gZGVmYXVsdExvZ2dlcigpO1xuICB9LFxufSk7XG4iLCIvKipcbiAqIENhcHR1cmUgdGhlIHN0YWNrIHRyYWNlIGFuZCBhbGxvdyB0byBlbnJpY2ggZXhjZXB0aW9ucyB0aHJvd24gaW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrc1xuICogd2l0aCBhZGRpdGlvbmFsIHN0YWNrIGluZm9ybWF0aW9uIGNhcHR1cmVkIGF0IHRoZSBtb21lbnQgb2YgdGhlIGNhbGwgb2YgdGhpcyBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FwdHVyZVN0YWNrVHJhY2UocmVtb3ZlID0gMCkge1xuICBjb25zdCBzdGFja0NvbnRhaW5lciA9IHtcbiAgICBzdGFjazogJycsXG4gIH07XG4gIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHN0YWNrQ29udGFpbmVyKTtcbiAgY29uc3Qgc3RhY2tUcmFjZSA9IHN0YWNrQ29udGFpbmVyLnN0YWNrXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5zbGljZSg2ICsgcmVtb3ZlKVxuICAgIC5qb2luKCdcXG4nKTtcbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBDYXB0dXJlZCBzdGFjayB0cmFjZSBpbmZvcm1hdGlvblxuICAgICAqL1xuICAgIHN0YWNrVHJhY2UsXG4gICAgLyoqXG4gICAgICogQ2FuIGJlIGNhbGxlZCBpbiBhc3luY2hyb25vdXMgY2FsbGJhY2sgdG8gZW5yaWNoIGV4Y2VwdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gICAgICogQHBhcmFtIGVyciBFeGNlcHRpb24gdG8gZW5yaWNoIC0gaXQgaXMgZ29pbmcgdG8gaGF2ZSBpdHMgYC5zdGFja2AgcHJvcCBtdXRhdGVkXG4gICAgICogQHJldHVybnMgU2FtZSBleGNlcHRpb25cbiAgICAgKi9cbiAgICBwcmVwYXJlRm9yUmV0aHJvdzogKGVycjogRXJyb3IpID0+IHtcbiAgICAgIGNvbnN0IG9sZFN0YWNrVHJhY2UgPSBlcnIuc3RhY2sgPz8gJycuc3BsaXQoJ1xcbicpLnNsaWNlKDEpLmpvaW4oJ1xcbicpO1xuICAgICAgZXJyLnN0YWNrID0gYCR7ZXJyLm5hbWUgfHwgJ0Vycm9yJ306ICR7XG4gICAgICAgIGVyci5tZXNzYWdlXG4gICAgICB9XFxuJHtvbGRTdGFja1RyYWNlfVxcbiR7c3RhY2tUcmFjZX1gO1xuICAgICAgcmV0dXJuIGVycjtcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBTcGF3bk9wdGlvbnMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IENoaWxkUHJvY2VzcyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQXNzaWduIH0gZnJvbSAndXRpbGl0eS10eXBlcyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci9sb2dnZXInO1xuaW1wb3J0IHsgY2FwdHVyZVN0YWNrVHJhY2UgfSBmcm9tICcuLi91dGlscy9zdGFja1RyYWNlJztcblxuZXhwb3J0IHR5cGUgU3Bhd25Ub1Byb21pc2VPcHRzID0ge1xuICAvKipcbiAgICogU3BlY2lmeSBleGl0IGNvZGVzIHdoaWNoIHNob3VsZCBub3QgcmVzdWx0IGluIHRocm93aW5nIGFuIGVycm9yIHdoZW5cbiAgICogdGhlIHByb2Nlc3MgaGFzIGZpbmlzaGVkLCBlLmcuIHNwZWNpZnlpbmcgYFswXWAgbWVhbnMgaWYgcHJvY2VzcyBmaW5pc2hlZFxuICAgKiB3aXRoIHplcm8gZXhpdCBjb2RlIHRoZW4gdGhlIHByb21pc2Ugd2lsbCByZXNvbHZlIGluc3RlYWQgb2YgcmVqZWN0aW5nLlxuICAgKlxuICAgKiBBbHRlcm5hdGl2ZWx5LCBzcGVjaWZ5IGBpbmhlcml0YCB0byBzYXZlIHN0YXR1cyBjb2RlIHRvIHRoZSBjdXJyZW50IGBwcm9jZXNzLmV4aXRDb2RlYFxuICAgKlxuICAgKiBBbHRlcm5hdGl2ZWx5LCBjb21wbGV0ZWx5IGlnbm9yZSB0aGUgZXhpdCBjb2RlIChlLmcuIHlvdSBmb2xsb3cgdXAgYW5kIGludGVycm9nYXRlXG4gICAqIHRoZSBwcm9jZXNzIGNvZGUgbWFudWFsbHkgYWZ0ZXJ3YXJkcylcbiAgICovXG4gIGV4aXRDb2RlczogbnVtYmVyW10gfCAnaW5oZXJpdCcgfCAnYW55Jztcbn07XG5cbnR5cGUgU2hhcmVkT3B0cyA9IFBpY2s8U3Bhd25PcHRpb25zLCAnY3dkJz47XG5cbnR5cGUgU3Bhd25BcmdzPEUgZXh0ZW5kcyBvYmplY3Q+ID0gW1xuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgb3B0aW9uczogQXNzaWduPFNwYXduT3B0aW9ucywgRT5cbl07XG5cbmV4cG9ydCB0eXBlIFNwYXduT3B0aW9uc1dpdGhFeHRyYTxFIGV4dGVuZHMgb2JqZWN0ID0gU3Bhd25Ub1Byb21pc2VPcHRzPiA9XG4gIEFzc2lnbjxTcGF3bk9wdGlvbnMsIEU+O1xuXG5leHBvcnQgdHlwZSBTcGF3blBhcmFtZXRlck1peDxFIGV4dGVuZHMgb2JqZWN0ID0gU3Bhd25Ub1Byb21pc2VPcHRzPiA9XG4gIHwgW2NwOiBDaGlsZFByb2Nlc3MsIGV4dHJhT3B0czogQXNzaWduPEUsIFNoYXJlZE9wdHM+XVxuICB8IFNwYXduQXJnczxFPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3Bhd25BcmdzPEUgZXh0ZW5kcyBvYmplY3Q+KFxuICBhcmdzOiBTcGF3blBhcmFtZXRlck1peDxFPlxuKTogYXJncyBpcyBTcGF3bkFyZ3M8RT4ge1xuICByZXR1cm4gIShhcmdzWzBdIGluc3RhbmNlb2YgQ2hpbGRQcm9jZXNzKSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3bldpdGhTcGF3blBhcmFtZXRlcnM8RSBleHRlbmRzIG9iamVjdD4oXG4gIHBhcmFtZXRlcnM6IFNwYXduUGFyYW1ldGVyTWl4PEU+XG4pIHtcbiAgY29uc3QgW2NoaWxkLCBbY29tbWFuZCwgYXJncywgb3B0c11dID0gaXNTcGF3bkFyZ3MocGFyYW1ldGVycylcbiAgICA/IFtcbiAgICAgICAgc3Bhd24oLi4uKHBhcmFtZXRlcnMgYXMgdW5rbm93biBhcyBQYXJhbWV0ZXJzPHR5cGVvZiBzcGF3bj4pKSxcbiAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgIF1cbiAgICA6IFtcbiAgICAgICAgcGFyYW1ldGVyc1swXSxcbiAgICAgICAgW1xuICAgICAgICAgIHBhcmFtZXRlcnNbMF0uc3Bhd25maWxlLFxuICAgICAgICAgIHBhcmFtZXRlcnNbMF0uc3Bhd25hcmdzLnNsaWNlKDEpLFxuICAgICAgICAgIHBhcmFtZXRlcnNbMV0gYXMgQXNzaWduPFNwYXduT3B0aW9ucywgRT4sXG4gICAgICAgIF0sXG4gICAgICBdO1xuICByZXR1cm4ge1xuICAgIGNoaWxkLFxuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICBvcHRzLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25Ub1Byb21pc2UoXG4gIC4uLnBhcmFtZXRlcnM6IFNwYXduUGFyYW1ldGVyTWl4XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBjaGlsZCwgY29tbWFuZCwgYXJncywgb3B0cyB9ID0gc3Bhd25XaXRoU3Bhd25QYXJhbWV0ZXJzKHBhcmFtZXRlcnMpO1xuICBjb25zdCB7IHByZXBhcmVGb3JSZXRocm93IH0gPSBjYXB0dXJlU3RhY2tUcmFjZSgpO1xuXG4gIGNvbnN0IGV4aXRDb2RlcyA9IG9wdHMuZXhpdENvZGVzO1xuXG4gIGNvbnN0IGN3ZCA9IG9wdHMuY3dkID8gb3B0cy5jd2QudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBjbWQgPSAoKSA9PiBbY29tbWFuZCwgLi4uYXJnc10uam9pbignICcpO1xuXG4gIGxvZ2dlci5kZWJ1ZyhbJz4nLCBjbWQoKV0uam9pbignICcpLCAuLi4oY3dkID8gW2BpbiAke2N3ZH1gXSA6IFtdKSk7XG5cbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlcywgcmVqKSA9PlxuICAgIGNoaWxkXG4gICAgICAub24oJ2Nsb3NlJywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGNvZGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXhpdENvZGVzICE9PSAnaW5oZXJpdCcgJiZcbiAgICAgICAgICAgIGV4aXRDb2RlcyAhPT0gJ2FueScgJiZcbiAgICAgICAgICAgICFleGl0Q29kZXMuaW5jbHVkZXMoY29kZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJlaihcbiAgICAgICAgICAgICAgcHJlcGFyZUZvclJldGhyb3coXG4gICAgICAgICAgICAgICAgbmV3IEVycm9yKGBDb21tYW5kIFwiJHtjbWQoKX1cIiBoYXMgZmFpbGVkIHdpdGggY29kZSAke2NvZGV9YClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNpZ25hbCkge1xuICAgICAgICAgIHJlaihcbiAgICAgICAgICAgIHByZXBhcmVGb3JSZXRocm93KFxuICAgICAgICAgICAgICBuZXcgRXJyb3IoYEZhaWxlZCB0byBleGVjdXRlIGNvbW1hbmQgXCIke2NtZCgpfVwiIC0gJHtzaWduYWx9YClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IHByZXBhcmVGb3JSZXRocm93KG5ldyBFcnJvcignRXhwZWN0ZWQgc2lnbmFsIG9yIGVycm9yIGNvZGUnKSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAub24oJ2Vycm9yJywgcmVqKVxuICApO1xuICAvLyBpbmhlcml0IGV4aXQgY29kZVxuICBpZiAoZXhpdENvZGVzID09PSAnaW5oZXJpdCcpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgY2hpbGQuZXhpdENvZGUgPT09ICdudW1iZXInICYmXG4gICAgICAodHlwZW9mIHByb2Nlc3MuZXhpdENvZGUgIT09ICdudW1iZXInIHx8IHByb2Nlc3MuZXhpdENvZGUgPT09IDApXG4gICAgKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gY2hpbGQuZXhpdENvZGU7XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaW5jbHVkZXNBbnlPZih0YXJnZXQ6IHN0cmluZ1tdLCBoYXNBbnlPZkFyZ3M6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBoYXNBbnlPZkFyZ3Muc29tZSgodmFyaWFudCkgPT4gdGFyZ2V0LmluY2x1ZGVzKHZhcmlhbnQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEFmdGVyQW55T2YoXG4gIHRhcmdldDogc3RyaW5nW10sXG4gIGluc2VydDogc3RyaW5nW10sXG4gIGhhc0FueU9mQXJnczogc3RyaW5nW11cbikge1xuICBjb25zdCBpbmRleCA9IHRhcmdldC5maW5kSW5kZXgoKHZhbHVlKSA9PiBoYXNBbnlPZkFyZ3MuaW5jbHVkZXModmFsdWUpKTtcbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gWy4uLnRhcmdldF07XG4gIHJlc3VsdC5zcGxpY2UoaW5kZXggKyAxLCAwLCAuLi5pbnNlcnQpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQXJnc0Zyb20oXG4gIHRhcmdldDogc3RyaW5nW10sXG4gIGFyZ3M6IEFycmF5PHN0cmluZyB8IFJlZ0V4cD4sXG4gIG9wdHM/OiB7IG51bVZhbHVlczogbnVtYmVyIH1cbikge1xuICBjb25zdCByZXN1bHQgPSBbLi4udGFyZ2V0XTtcbiAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgIGNvbnN0IGluZGV4ID0gdGFyZ2V0LmZpbmRJbmRleCgodmFsdWUpID0+XG4gICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyA/IHZhbHVlID09PSBhcmcgOiBhcmcudGVzdCh2YWx1ZSlcbiAgICApO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJlc3VsdC5zcGxpY2UoaW5kZXgsIG9wdHM/Lm51bVZhbHVlcyA/IG9wdHMubnVtVmFsdWVzICsgMSA6IDEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0U2NyaXB0KHNjcmlwdDogc3RyaW5nKSB7XG4gIHJldHVybiAoc3RhdGU6IENsaUFyZ3MpOiBDbGlBcmdzID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBwcmVBcmdzOiBbc2NyaXB0LCAuLi5zdGF0ZS5wcmVBcmdzXSxcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlSW5wdXRBcmdzKFxuICBhcmdzOiBBcnJheTxzdHJpbmcgfCBSZWdFeHA+LFxuICBvcHRzPzogeyBudW1WYWx1ZXM6IG51bWJlciB9XG4pIHtcbiAgcmV0dXJuIChzdGF0ZTogQ2xpQXJncykgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGlucHV0QXJnczogcmVtb3ZlQXJnc0Zyb20oc3RhdGUuaW5wdXRBcmdzLCBhcmdzLCBvcHRzKSxcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdEFyZ3MoXG4gIGFyZ3M6IFtzdHJpbmcsIC4uLnN0cmluZ1tdXSxcbiAgdmFsdWVzOiBzdHJpbmdbXSA9IFtdLFxuICBjb25kaXRpb24/OiAoc3RhdGU6IENsaUFyZ3MpID0+IGJvb2xlYW4sXG4gIGFwcGx5PzogKGFyZ3M6IHN0cmluZ1tdLCBzdGF0ZTogQ2xpQXJncykgPT4gQ2xpQXJnc1xuKSB7XG4gIHJldHVybiAoc3RhdGU6IENsaUFyZ3MpID0+IHtcbiAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICBpZiAoIWNvbmRpdGlvbihzdGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5jbHVkZXNBbnlPZihzdGF0ZS5pbnB1dEFyZ3MsIGFyZ3MpKSB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICAgIGNvbnN0IHNldDogTm9uTnVsbGFibGU8dHlwZW9mIGFwcGx5PiA9IGFwcGx5XG4gICAgICA/IGFwcGx5XG4gICAgICA6IChhcmdzLCB0bykgPT4gKHtcbiAgICAgICAgICAuLi50byxcbiAgICAgICAgICBwcmVBcmdzOiBbLi4uc3RhdGUucHJlQXJncywgLi4uYXJnc10sXG4gICAgICAgIH0pO1xuICAgIHJldHVybiBzZXQoW2FyZ3NbMF0sIC4uLnZhbHVlc10sIHN0YXRlKTtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUxvZ0xldmVsT3B0aW9uID0gKCkgPT5cbiAgcmVtb3ZlSW5wdXRBcmdzKFsnLS1sb2ctbGV2ZWwnXSwgeyBudW1WYWx1ZXM6IDEgfSk7XG5cbmV4cG9ydCB0eXBlIENsaUFyZ3MgPSB7XG4gIC8qKlxuICAgKiBFeHRyYSBhcmd1bWVudHMgdGhhdCBnbyBiZWZvcmUgYXJndW1lbnRzIHBhc3NlZCBpbiBieSB0aGUgdXNlclxuICAgKi9cbiAgcHJlQXJnczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBBcmd1bWVudHMgYXMgcGFzc2VkIGluIGJ5IHRoZSB1c2VyLCBjb3VsZCBiZSBtb2RpZmllZCBieVxuICAgKiB0cmFuc2Zvcm1zIHRoYXQgY29tZSBiZWZvcmUgY3VycmVudFxuICAgKi9cbiAgaW5wdXRBcmdzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEV4dHJhIGFyZ3VtZW50cyB0aGF0IGdvIGFmdGVyIGFyZ3VtZW50cyBwYXNzZWQgaW4gYnkgdGhlIHVzZXJcbiAgICovXG4gIHBvc3RBcmdzOiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIENsaUFyZ3NUcmFuc2Zvcm0gPSAoc3RhdGU6IENsaUFyZ3MpID0+IENsaUFyZ3M7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGlBcmdzUGlwZShcbiAgdHJhbnNmb3JtczogQ2xpQXJnc1RyYW5zZm9ybVtdLFxuICBpbnB1dEFyZ3M6IHN0cmluZ1tdXG4pIHtcbiAgY29uc3Qge1xuICAgIHByZUFyZ3MsXG4gICAgaW5wdXRBcmdzOiBtb2RpZmllZElucHV0QXJncyxcbiAgICBwb3N0QXJncyxcbiAgfSA9IHRyYW5zZm9ybXMucmVkdWNlPENsaUFyZ3M+KChhY2MsIHRyYW5zZm9ybSkgPT4gdHJhbnNmb3JtKGFjYyksIHtcbiAgICBpbnB1dEFyZ3MsXG4gICAgcHJlQXJnczogW10sXG4gICAgcG9zdEFyZ3M6IFtdLFxuICB9KTtcbiAgcmV0dXJuIFsuLi5wcmVBcmdzLCAuLi5tb2RpZmllZElucHV0QXJncywgLi4ucG9zdEFyZ3NdO1xufVxuIl0sIm5hbWVzIjpbImVycm9yIiwiYXJncyJdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsTUFBTSxTQUFTLENBQUMsT0FBQSxFQUFTLE1BQVEsRUFBQSxNQUFBLEVBQVEsU0FBUyxPQUFPLENBQUEsQ0FBQTtBQW1CekQsTUFBTSxrQkFBQSxHQUFxQixDQUFDLEtBQTRCLEtBQUE7QUFDdEQsRUFBQSxJQUFJLFVBQVUsS0FBTyxFQUFBO0FBQ25CLElBQUEsT0FBTyxFQUFDLENBQUE7QUFBQSxHQUNWO0FBQ0EsRUFBQSxNQUFNLFFBQVEsTUFBTyxDQUFBLFNBQUEsQ0FBVSxDQUFDLElBQUEsS0FBUyxTQUFTLEtBQUssQ0FBQSxDQUFBO0FBQ3ZELEVBQUEsSUFBSSxVQUFVLENBQUksQ0FBQSxFQUFBO0FBQ2hCLElBQU0sTUFBQSxJQUFJLE1BQU0sZUFBZSxDQUFBLENBQUE7QUFBQSxHQUNqQztBQUNBLEVBQU8sT0FBQSxNQUFBLENBQU8sTUFBTSxLQUFLLENBQUEsQ0FBQTtBQUMzQixDQUFBLENBQUE7QUFFQSxNQUFNLE9BQUEsR0FBVSxDQUFDLEtBQXNDLEtBQUE7QUFDckQsRUFBTyxPQUFBLE1BQUEsQ0FBTyxTQUFTLEtBQWlCLENBQUEsQ0FBQTtBQUMxQyxDQUFBLENBQUE7QUFFQSxNQUFNLHdCQUEyQixHQUFBLENBQy9CLElBQU8sR0FBQSxPQUFBLENBQVEsSUFDa0IsS0FBQTtBQUNqQyxFQUFBLE1BQU0sUUFBUSxJQUFLLENBQUEsU0FBQSxDQUFVLENBQUMsS0FBQSxLQUFVLFVBQVUsYUFBYSxDQUFBLENBQUE7QUFDL0QsRUFBQSxJQUFJLFVBQVUsQ0FBSSxDQUFBLEVBQUE7QUFDaEIsSUFBTyxPQUFBLEtBQUEsQ0FBQSxDQUFBO0FBQUEsR0FDVDtBQUNBLEVBQU0sTUFBQSxLQUFBLEdBQVEs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