@mnaoumov/typescript-dev-toolkit 3.6.4 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,298 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return '/';
11
+ },
12
+ env: {},
13
+ platform: 'android'
14
+ };
15
+
16
+ const existingProcess = globalThis.process;
17
+
18
+ if (!existingProcess) {
19
+ globalThis.process = browserProcess;
20
+ return;
21
+ }
22
+
23
+ if (existingProcess.versions?.node) {
24
+ return;
25
+ }
26
+
27
+ const existingProcessRecord = existingProcess;
28
+
29
+ for (const [key, value] of Object.entries(browserProcess)) {
30
+ existingProcessRecord[key] ??= value;
31
+ }
32
+
33
+ existingProcessRecord['browser'] = true;
34
+ }
35
+
36
+ ensureBrowserProcess();
37
+ })();
38
+
39
+ import {
40
+ readdir,
41
+ readFile
42
+ } from "node:fs/promises";
43
+ import {
44
+ join,
45
+ relative,
46
+ resolve
47
+ } from "node:path";
48
+ import {
49
+ createCompilerHost,
50
+ createProgram,
51
+ createSourceFile,
52
+ flattenDiagnosticMessageText,
53
+ getParsedCommandLineOfConfigFile,
54
+ ScriptKind,
55
+ sys
56
+ } from "typescript";
57
+ const CHECKED_LANGUAGES = /* @__PURE__ */ new Map([
58
+ ["javascript", true],
59
+ ["js", true],
60
+ ["ts", false],
61
+ ["typescript", false]
62
+ ]);
63
+ const LINE_AFTER_FENCE_OFFSET = 2;
64
+ const MARKER_REG_EXP = /^<!--\s*snippet-check:\s*(?<kind>[a-z]+)\b(?<text>.*?)-->$/su;
65
+ const DIAGNOSTIC_DECLARED_BUT_VALUE_NEVER_READ = 6133;
66
+ const DIAGNOSTIC_ALL_IMPORTS_UNUSED = 6192;
67
+ const DIAGNOSTIC_DECLARED_BUT_NEVER_USED = 6196;
68
+ const DIAGNOSTIC_ALL_DESTRUCTURED_ELEMENTS_UNUSED = 6198;
69
+ const IGNORED_DIAGNOSTIC_CODES = /* @__PURE__ */ new Set([
70
+ DIAGNOSTIC_ALL_DESTRUCTURED_ELEMENTS_UNUSED,
71
+ DIAGNOSTIC_ALL_IMPORTS_UNUSED,
72
+ DIAGNOSTIC_DECLARED_BUT_NEVER_USED,
73
+ DIAGNOSTIC_DECLARED_BUT_VALUE_NEVER_READ
74
+ ]);
75
+ const DIAGNOSTIC_VARIABLE_IMPLICITLY_ANY = 7005;
76
+ const DIAGNOSTIC_PARAMETER_IMPLICITLY_ANY = 7006;
77
+ const DIAGNOSTIC_MEMBER_IMPLICITLY_ANY = 7008;
78
+ const DIAGNOSTIC_BINDING_ELEMENT_IMPLICITLY_ANY = 7031;
79
+ const DIAGNOSTIC_VARIABLE_IMPLICITLY_ANY_IN_SOME_LOCATIONS = 7034;
80
+ const DIAGNOSTIC_ARROW_FUNCTION_CAPTURES_GLOBAL_THIS = 7041;
81
+ const DIAGNOSTIC_ELEMENT_IMPLICITLY_ANY = 7053;
82
+ const JAVASCRIPT_IGNORED_DIAGNOSTIC_CODES = /* @__PURE__ */ new Set([
83
+ DIAGNOSTIC_ARROW_FUNCTION_CAPTURES_GLOBAL_THIS,
84
+ DIAGNOSTIC_BINDING_ELEMENT_IMPLICITLY_ANY,
85
+ DIAGNOSTIC_ELEMENT_IMPLICITLY_ANY,
86
+ DIAGNOSTIC_MEMBER_IMPLICITLY_ANY,
87
+ DIAGNOSTIC_PARAMETER_IMPLICITLY_ANY,
88
+ DIAGNOSTIC_VARIABLE_IMPLICITLY_ANY,
89
+ DIAGNOSTIC_VARIABLE_IMPLICITLY_ANY_IN_SOME_LOCATIONS
90
+ ]);
91
+ async function assertDocsSnippetsCompile(params) {
92
+ const problems = await findDocsSnippetProblems(params);
93
+ if (problems.length > 0) {
94
+ throw new Error(`${String(problems.length)} problem(s) in the documentation snippets:
95
+ ${formatDocsSnippetProblems(problems)}`);
96
+ }
97
+ }
98
+ function extractDocsSnippets(markdown) {
99
+ const lines = markdown.split(/\r?\n/u);
100
+ const snippets = [];
101
+ let openFence = null;
102
+ let codeLines = [];
103
+ let pendingSkipReason = null;
104
+ let pendingContext = [];
105
+ for (const [index, line] of lines.entries()) {
106
+ if (openFence) {
107
+ const content = stripPrefix(line, openFence.prefix);
108
+ if (content.trimEnd() === openFence.fence) {
109
+ const isJavaScript = CHECKED_LANGUAGES.get(openFence.language);
110
+ if (isJavaScript !== void 0) {
111
+ snippets.push({
112
+ code: codeLines.join("\n"),
113
+ codeStartLine: openFence.startLine,
114
+ context: openFence.context.join("\n"),
115
+ isJavaScript,
116
+ language: openFence.language,
117
+ skipReason: openFence.skipReason
118
+ });
119
+ }
120
+ openFence = null;
121
+ codeLines = [];
122
+ } else {
123
+ codeLines.push(content);
124
+ }
125
+ continue;
126
+ }
127
+ const fenceMatch = /^(?<prefix>(?:\s*>)*\s*)(?<fence>`{3,}|~{3,})(?<language>[\w-]*)/u.exec(line);
128
+ if (fenceMatch?.groups) {
129
+ openFence = {
130
+ context: pendingContext,
131
+ fence: fenceMatch.groups["fence"] ?? "",
132
+ language: (fenceMatch.groups["language"] ?? "").toLowerCase(),
133
+ prefix: fenceMatch.groups["prefix"] ?? "",
134
+ skipReason: pendingSkipReason,
135
+ startLine: index + LINE_AFTER_FENCE_OFFSET
136
+ };
137
+ pendingSkipReason = null;
138
+ pendingContext = [];
139
+ continue;
140
+ }
141
+ const text = line.replace(/^(?:\s*>)*\s*/u, "").trim();
142
+ const markerMatch = MARKER_REG_EXP.exec(text);
143
+ const kind = markerMatch?.groups?.["kind"];
144
+ const markerText = (markerMatch?.groups?.["text"] ?? "").trim();
145
+ if (kind === "skip") {
146
+ pendingSkipReason = markerText.replace(/^[-—:]\s*/u, "");
147
+ } else if (kind === "context") {
148
+ pendingContext.push(markerText);
149
+ } else if (text !== "") {
150
+ pendingSkipReason = null;
151
+ pendingContext = [];
152
+ }
153
+ }
154
+ return snippets;
155
+ }
156
+ async function findDocsSnippetProblems(params) {
157
+ const rootDirectory = resolve(params.rootDirectory);
158
+ const docsDirectory = join(rootDirectory, params.docsDirectory ?? "docs/src/content/docs");
159
+ const problems = [];
160
+ const virtualFiles = /* @__PURE__ */ new Map();
161
+ const rootNames = [];
162
+ const snippetsDirectory = join(rootDirectory, "docs", "__snippets__");
163
+ function addVirtualFile(path, file) {
164
+ virtualFiles.set(normalizePath(path), file);
165
+ rootNames.push(path);
166
+ }
167
+ const prelude = params.prelude ?? "";
168
+ if (prelude !== "") {
169
+ addVirtualFile(join(snippetsDirectory, "prelude.ts"), { code: prelude, codeStartLine: 1, contextLineCount: 0, filePath: "<prelude>" });
170
+ }
171
+ for (const guidePath of await listGuides(docsDirectory)) {
172
+ const filePath = toPosix(relative(rootDirectory, guidePath));
173
+ const markdown = await readFile(guidePath, "utf-8");
174
+ for (const snippet of extractDocsSnippets(markdown)) {
175
+ if (snippet.skipReason === "") {
176
+ problems.push({
177
+ filePath,
178
+ line: snippet.codeStartLine - 1,
179
+ message: "A `snippet-check: skip` marker must give its reason."
180
+ });
181
+ continue;
182
+ }
183
+ if (snippet.skipReason !== null) {
184
+ continue;
185
+ }
186
+ const extension = snippet.isJavaScript ? "js" : "ts";
187
+ const baseName = `${toPosix(relative(docsDirectory, guidePath)).replaceAll("/", "__")}.L${String(snippet.codeStartLine)}.${extension}`;
188
+ const context = snippet.context === "" ? "" : `${snippet.context}
189
+ `;
190
+ addVirtualFile(join(snippetsDirectory, baseName), {
191
+ code: `${context}${snippet.code}
192
+ export {};
193
+ `,
194
+ codeStartLine: snippet.codeStartLine,
195
+ contextLineCount: context === "" ? 0 : context.split("\n").length - 1,
196
+ filePath
197
+ });
198
+ }
199
+ }
200
+ problems.push(...compileSnippets({ compilerOptions: params.compilerOptions ?? {}, rootDirectory, rootNames, virtualFiles }));
201
+ return problems;
202
+ }
203
+ function formatDocsSnippetProblems(problems) {
204
+ return problems.map((problem) => `${problem.filePath}:${String(problem.line)} - ${problem.message}`).join("\n");
205
+ }
206
+ function compileSnippets(params) {
207
+ const { rootDirectory, rootNames, virtualFiles } = params;
208
+ const configPath = join(rootDirectory, "tsconfig.json");
209
+ const parsed = getParsedCommandLineOfConfigFile(configPath, {}, {
210
+ ...sys,
211
+ onUnRecoverableConfigFileDiagnostic(diagnostic) {
212
+ throw new Error(flattenDiagnosticMessageText(diagnostic.messageText, "\n"));
213
+ }
214
+ });
215
+ if (!parsed) {
216
+ throw new Error(`Cannot read ${configPath}`);
217
+ }
218
+ const compilerOptions = {
219
+ ...parsed.options,
220
+ ...params.compilerOptions,
221
+ allowJs: true,
222
+ checkJs: true,
223
+ composite: false,
224
+ incremental: false,
225
+ noEmit: true,
226
+ noUnusedLocals: false,
227
+ noUnusedParameters: false
228
+ };
229
+ delete compilerOptions.tsBuildInfoFile;
230
+ const host = createCompilerHost(compilerOptions, true);
231
+ const originalGetSourceFile = host.getSourceFile.bind(host);
232
+ const originalFileExists = host.fileExists.bind(host);
233
+ const originalReadFile = host.readFile.bind(host);
234
+ host.fileExists = (fileName) => virtualFiles.has(normalizePath(fileName)) || originalFileExists(fileName);
235
+ host.readFile = (fileName) => virtualFiles.get(normalizePath(fileName))?.code ?? originalReadFile(fileName);
236
+ host.getSourceFile = (fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile) => {
237
+ const virtualFile = virtualFiles.get(normalizePath(fileName));
238
+ if (virtualFile) {
239
+ const scriptKind = fileName.endsWith(".js") ? ScriptKind.JS : ScriptKind.TS;
240
+ return createSourceFile(fileName, virtualFile.code, languageVersionOrOptions, true, scriptKind);
241
+ }
242
+ return originalGetSourceFile(fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile);
243
+ };
244
+ const program = createProgram({ host, options: compilerOptions, rootNames });
245
+ const problems = [];
246
+ for (const rootName of rootNames) {
247
+ const sourceFile = program.getSourceFile(rootName);
248
+ const virtualFile = virtualFiles.get(normalizePath(rootName));
249
+ if (!sourceFile || !virtualFile) {
250
+ continue;
251
+ }
252
+ const isJavaScript = rootName.endsWith(".js");
253
+ const diagnostics = [...program.getSyntacticDiagnostics(sourceFile), ...program.getSemanticDiagnostics(sourceFile)];
254
+ for (const diagnostic of diagnostics) {
255
+ if (IGNORED_DIAGNOSTIC_CODES.has(diagnostic.code) || isJavaScript && JAVASCRIPT_IGNORED_DIAGNOSTIC_CODES.has(diagnostic.code)) {
256
+ continue;
257
+ }
258
+ const fileLine = diagnostic.start === void 0 ? 0 : sourceFile.getLineAndCharacterOfPosition(diagnostic.start).line;
259
+ const snippetLine = Math.max(0, fileLine - virtualFile.contextLineCount);
260
+ problems.push({
261
+ filePath: virtualFile.filePath,
262
+ line: virtualFile.codeStartLine + snippetLine,
263
+ message: `TS${String(diagnostic.code)}: ${flattenDiagnosticMessageText(diagnostic.messageText, " ")}`
264
+ });
265
+ }
266
+ }
267
+ return problems;
268
+ }
269
+ async function listGuides(directory) {
270
+ const guides = [];
271
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
272
+ const entryPath = join(directory, entry.name);
273
+ if (entry.isDirectory()) {
274
+ if (entry.name !== "api") {
275
+ guides.push(...await listGuides(entryPath));
276
+ }
277
+ } else if (/\.mdx?$/u.test(entry.name)) {
278
+ guides.push(entryPath);
279
+ }
280
+ }
281
+ return guides.sort();
282
+ }
283
+ function normalizePath(path) {
284
+ return toPosix(resolve(path)).toLowerCase();
285
+ }
286
+ function stripPrefix(line, prefix) {
287
+ return line.startsWith(prefix) ? line.slice(prefix.length) : line.replace(/^(?:\s*>)*\s?/u, "");
288
+ }
289
+ function toPosix(path) {
290
+ return path.replaceAll("\\", "/");
291
+ }
292
+ export {
293
+ assertDocsSnippetsCompile,
294
+ extractDocsSnippets,
295
+ findDocsSnippetProblems,
296
+ formatDocsSnippetProblems
297
+ };
298
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvZG9jcy1zbmlwcGV0cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogRXh0cmFjdHMgdGhlIGNvZGUgc25pcHBldHMgb2YgYSBwYWNrYWdlJ3MgZG9jdW1lbnRhdGlvbiBndWlkZXMgYW5kIHR5cGUtY2hlY2tzIHRoZW0gYWdhaW5zdCBpdHMgc291cmNlcy5cbiAqXG4gKiBBIGd1aWRlJ3Mgc25pcHBldCBpcyBjb2RlIGEgcmVhZGVyIGNvcGllcywgc28gYSByZW5hbWVkIG1lbWJlciBvciBhIHN0YWxlIGltcG9ydCBwYXRoIGluIGl0IGlzIGEgYnVnIHRoYXQgc2hpcHNcbiAqIHRvIHRoZSBzaXRlIHdpdGggZXZlcnkgY2hlY2sgZ3JlZW4uIEV2ZXJ5IGZlbmNlZCBgdHNgLCBgdHlwZXNjcmlwdGAsIGBqc2Agb3IgYGphdmFzY3JpcHRgIGJsb2NrIGluXG4gKiBgZG9jcy9zcmMvY29udGVudC9kb2NzYCBpcyBjb21waWxlZCBhcyBpdHMgb3duIG1vZHVsZSwgd2l0aCB0aGUgcHJvamVjdCdzIGB0c2NvbmZpZy5qc29uYCwgc28gYW4gaW1wb3J0IG9mIHRoZVxuICogcGFja2FnZSdzIG93biBuYW1lIHJlc29sdmVzIHdoZXJldmVyIHRoYXQgY29uZmlndXJhdGlvbiBzZW5kcyBpdCAoaXRzIGBwYXRoc2AsIG9yIHRoZSBgY29tcGlsZXJPcHRpb25zYCBwYXNzZWRcbiAqIGhlcmUpIGFuZCBhIHdyb25nIG5hbWUgZmFpbHMuIEEgYHRzYCAvIGB0eXBlc2NyaXB0YCBibG9jayBpcyBjb21waWxlZCBhcyBUeXBlU2NyaXB0OyBhIGBqc2AgLyBgamF2YXNjcmlwdGAgYmxvY2ssXG4gKiBvZnRlbiBhIGRldnRvb2xzLWNvbnNvbGUgcmVjaXBlLCBpcyBjb21waWxlZCBhcyBKYXZhU2NyaXB0IHdpdGggYGNoZWNrSnNgLCBzbyBhIHdyb25nIG1lbWJlciBvZiBhIHR5cGVkIG9iamVjdFxuICogc3RpbGwgZmFpbHMgd2hpbGUgYW4gdW50eXBlZCBsb29rdXAgZG9lcyBub3QuIFRoZSBnZW5lcmF0ZWQgQVBJIHJlZmVyZW5jZSAoYGRvY3Mvc3JjL2NvbnRlbnQvZG9jcy9hcGlgKSBpc1xuICogc2tpcHBlZDogaXQgaXMgcmVuZGVyZWQgZnJvbSB0aGUgVFNEb2MuXG4gKlxuICogVGhyZWUgdGhpbmdzIHNoYXBlIHdoYXQgYSBzbmlwcGV0IGlzIGNvbXBpbGVkIHdpdGgsIGVhY2ggYnV0IHRoZSBmaXJzdCB3cml0dGVuIGluIHRoZSBndWlkZSBhcyBhbiBIVE1MIGNvbW1lbnQsXG4gKiBpbnZpc2libGUgb24gdGhlIHNpdGUsIG9uIHRoZSBsaW5lcyByaWdodCBhYm92ZSB0aGUgZmVuY2U6XG4gKlxuICogLSBUaGUgbmFtZXMgZXZlcnkgZ3VpZGUgbWF5IHVzZSB3aXRob3V0IGRlY2xhcmluZyB0aGVtIGFyZSB0aGUgcGFja2FnZSdzIGBwcmVsdWRlYCwgY29tcGlsZWQgYXMgYSBtb2R1bGUgb2YgaXRzXG4gKiAgIG93biAoYSBgZGVjbGFyZSBnbG9iYWxgIGJsb2NrLCB3aXRoIHRoZSBpbXBvcnRzIGl0IG5lZWRzKS5cbiAqIC0gYDwhLS0gc25pcHBldC1jaGVjazogY29udGV4dCA8VHlwZVNjcmlwdD4gLS0+YCBwcmVwZW5kcyBkZWNsYXJhdGlvbnMgdG8gdGhhdCBvbmUgc25pcHBldCwgZm9yIHRoZSBuYW1lcyBpdHNcbiAqICAgcHJvc2UgaGFzIGFscmVhZHkgaW50cm9kdWNlZCAoYGRlY2xhcmUgY29uc3QgbGlua0VsOiBIVE1MQW5jaG9yRWxlbWVudDtgKS4gU2V2ZXJhbCBzdWNoIGxpbmVzIGFkZCB1cC5cbiAqIC0gYDwhLS0gc25pcHBldC1jaGVjazogc2tpcCA8cmVhc29uPiAtLT5gIGV4ZW1wdHMgYSBzbmlwcGV0IHRoYXQgaXMgZGVsaWJlcmF0ZWx5IG5vdCBjb21waWxhYmxlLCBzdWNoIGFzXG4gKiAgIHBzZXVkby1jb2RlLiBUaGUgcmVhc29uIGlzIHJlcXVpcmVkLCBzbyBhIHNraXAgaXMgYSBkZWNpc2lvbiBzb21lYm9keSB3cm90ZSBkb3duLCBuZXZlciBhIHNpbGVudCBob2xlLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29tcGlsZXJPcHRpb25zLFxuICBTb3VyY2VGaWxlXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge1xuICByZWFkZGlyLFxuICByZWFkRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7XG4gIGpvaW4sXG4gIHJlbGF0aXZlLFxuICByZXNvbHZlXG59IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge1xuICBjcmVhdGVDb21waWxlckhvc3QsXG4gIGNyZWF0ZVByb2dyYW0sXG4gIGNyZWF0ZVNvdXJjZUZpbGUsXG4gIGZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQsXG4gIGdldFBhcnNlZENvbW1hbmRMaW5lT2ZDb25maWdGaWxlLFxuICBTY3JpcHRLaW5kLFxuICBzeXNcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbi8qKlxuICogVGhlIGxhbmd1YWdlcyBvZiB0aGUgZmVuY2VkIGJsb2NrcyB0aGF0IGFyZSB0eXBlLWNoZWNrZWQsIGFuZCB3aGV0aGVyIGVhY2ggaXMgSmF2YVNjcmlwdC5cbiAqL1xuY29uc3QgQ0hFQ0tFRF9MQU5HVUFHRVM6IFJlYWRvbmx5TWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKFtcbiAgWydqYXZhc2NyaXB0JywgdHJ1ZV0sXG4gIFsnanMnLCB0cnVlXSxcbiAgWyd0cycsIGZhbHNlXSxcbiAgWyd0eXBlc2NyaXB0JywgZmFsc2VdXG5dKTtcblxuLyoqXG4gKiBUaGUgb2Zmc2V0IGZyb20gYSBmZW5jZSBsaW5lJ3MgMC1iYXNlZCBpbmRleCB0byB0aGUgMS1iYXNlZCBsaW5lIG9mIHRoZSBjb2RlIGFmdGVyIGl0LlxuICovXG5jb25zdCBMSU5FX0FGVEVSX0ZFTkNFX09GRlNFVCA9IDI7XG5cbmNvbnN0IE1BUktFUl9SRUdfRVhQID0gL148IS0tXFxzKnNuaXBwZXQtY2hlY2s6XFxzKig/PGtpbmQ+W2Etel0rKVxcYig/PHRleHQ+Lio/KS0tPiQvc3U7XG5cbi8qKlxuICogRGlhZ25vc3RpY3MgYSBzbmlwcGV0IGlzIG5vdCBoZWxkIHRvOiBhbiBpbGx1c3RyYXRpb24gZGVjbGFyZXMgbmFtZXMgaXQgbmV2ZXIgcmVhZHMuXG4gKi9cbmNvbnN0IERJQUdOT1NUSUNfREVDTEFSRURfQlVUX1ZBTFVFX05FVkVSX1JFQUQgPSA2MTMzO1xuY29uc3QgRElBR05PU1RJQ19BTExfSU1QT1JUU19VTlVTRUQgPSA2MTkyO1xuY29uc3QgRElBR05PU1RJQ19ERUNMQVJFRF9CVVRfTkVWRVJfVVNFRCA9IDYxOTY7XG5jb25zdCBESUFHTk9TVElDX0FMTF9ERVNUUlVDVFVSRURfRUxFTUVOVFNfVU5VU0VEID0gNjE5ODtcbmNvbnN0IElHTk9SRURfRElBR05PU1RJQ19DT0RFUyA9IG5ldyBTZXQoW1xuICBESUFHTk9TVElDX0FMTF9ERVNUUlVDVFVSRURfRUxFTUVOVFNfVU5VU0VELFxuICBESUFHTk9TVElDX0FMTF9JTVBPUlRTX1VOVVNFRCxcbiAgRElBR05PU1RJQ19ERUNMQVJFRF9CVVRfTkVWRVJfVVNFRCxcbiAgRElBR05PU1RJQ19ERUNMQVJFRF9CVVRfVkFMVUVfTkVWRVJfUkVBRFxuXSk7XG5cbi8qKlxuICogVGhlIGltcGxpY2l0LWBhbnlgIGRpYWdub3N0aWNzLCB3aGljaCBhIEphdmFTY3JpcHQgc25pcHBldCBpcyBub3QgaGVsZCB0bzogYSBjb25zb2xlIHJlY2lwZSBoYXMgbm8gYW5ub3RhdGlvbnMgdG9cbiAqIGdpdmUsIGFuZCBhbiB1bnR5cGVkIGxvb2t1cCBzdWNoIGFzIGEgYFN5bWJvbC5mb3JgIHNsb3Qgb24gYGdsb2JhbFRoaXNgIGlzIHdoYXQgcGxhaW4gSmF2YVNjcmlwdCBkb2VzLlxuICovXG5jb25zdCBESUFHTk9TVElDX1ZBUklBQkxFX0lNUExJQ0lUTFlfQU5ZID0gNzAwNTtcbmNvbnN0IERJQUdOT1NUSUNfUEFSQU1FVEVSX0lNUExJQ0lUTFlfQU5ZID0gNzAwNjtcbmNvbnN0IERJQUdOT1NUSUNfTUVNQkVSX0lNUExJQ0lUTFlfQU5ZID0gNzAwODtcbmNvbnN0IERJQUdOT1NUSUNfQklORElOR19FTEVNRU5UX0lNUExJQ0lUTFlfQU5ZID0gNzAzMTtcbmNvbnN0IERJQUdOT1NUSUNfVkFSSUFCTEVfSU1QTElDSVRMWV9BTllfSU5fU09NRV9MT0NBVElPTlMgPSA3MDM0O1xuY29uc3QgRElBR05PU1RJQ19BUlJPV19GVU5DVElPTl9DQVBUVVJFU19HTE9CQUxfVEhJUyA9IDcwNDE7XG5jb25zdCBESUFHTk9TVElDX0VMRU1FTlRfSU1QTElDSVRMWV9BTlkgPSA3MDUzO1xuY29uc3QgSkFWQVNDUklQVF9JR05PUkVEX0RJQUdOT1NUSUNfQ09ERVMgPSBuZXcgU2V0KFtcbiAgRElBR05PU1RJQ19BUlJPV19GVU5DVElPTl9DQVBUVVJFU19HTE9CQUxfVEhJUyxcbiAgRElBR05PU1RJQ19CSU5ESU5HX0VMRU1FTlRfSU1QTElDSVRMWV9BTlksXG4gIERJQUdOT1NUSUNfRUxFTUVOVF9JTVBMSUNJVExZX0FOWSxcbiAgRElBR05PU1RJQ19NRU1CRVJfSU1QTElDSVRMWV9BTlksXG4gIERJQUdOT1NUSUNfUEFSQU1FVEVSX0lNUExJQ0lUTFlfQU5ZLFxuICBESUFHTk9TVElDX1ZBUklBQkxFX0lNUExJQ0lUTFlfQU5ZLFxuICBESUFHTk9TVElDX1ZBUklBQkxFX0lNUExJQ0lUTFlfQU5ZX0lOX1NPTUVfTE9DQVRJT05TXG5dKTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYXNzZXJ0RG9jc1NuaXBwZXRzQ29tcGlsZX06IHRoZSBzYW1lIGFzIHtAbGluayBmaW5kRG9jc1NuaXBwZXRQcm9ibGVtc30gdGFrZXMuXG4gKi9cbmV4cG9ydCB0eXBlIEFzc2VydERvY3NTbmlwcGV0c0NvbXBpbGVQYXJhbXMgPSBGaW5kRG9jc1NuaXBwZXRQcm9ibGVtc1BhcmFtcztcblxuLyoqXG4gKiBPbmUgZmVuY2VkIGNvZGUgYmxvY2sgb2YgYSBndWlkZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NzU25pcHBldCB7XG4gIC8qKlxuICAgKiBUaGUgY29kZSwgd2l0aCBhbnkgYmxvY2txdW90ZSBvciBpbmRlbnRhdGlvbiBwcmVmaXggb2YgdGhlIGZlbmNlIHN0cmlwcGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgMS1iYXNlZCBsaW5lIG9mIHRoZSBndWlkZSBvbiB3aGljaCB0aGUgY29kZSBzdGFydHMgKHRoZSBsaW5lIGFmdGVyIHRoZSBvcGVuaW5nIGZlbmNlKS5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGVTdGFydExpbmU6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGRlY2xhcmF0aW9ucyBvZiB0aGUgYHNuaXBwZXQtY2hlY2s6IGNvbnRleHRgIG1hcmtlcnMgYWJvdmUgdGhlIGZlbmNlLCBqb2luZWQgYnkgbmV3bGluZXMuXG4gICAqL1xuICByZWFkb25seSBjb250ZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNuaXBwZXQgaXMgSmF2YVNjcmlwdCByYXRoZXIgdGhhbiBUeXBlU2NyaXB0LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNKYXZhU2NyaXB0OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFuZ3VhZ2Ugb2YgdGhlIGZlbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlYXNvbiBnaXZlbiBieSBhIGBzbmlwcGV0LWNoZWNrOiBza2lwYCBtYXJrZXIsIG9yIGBudWxsYCB3aGVuIHRoZSBzbmlwcGV0IGlzIGNoZWNrZWQuXG4gICAqL1xuICByZWFkb25seSBza2lwUmVhc29uOiBudWxsIHwgc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcHJvYmxlbSBmb3VuZCBpbiBhIGd1aWRlJ3Mgc25pcHBldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NzU25pcHBldFByb2JsZW0ge1xuICAvKipcbiAgICogVGhlIGd1aWRlJ3MgcGF0aCwgcmVsYXRpdmUgdG8gdGhlIHBhY2thZ2Ugcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSAxLWJhc2VkIGxpbmUgb2YgdGhlIGd1aWRlLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGF0IGlzIHdyb25nLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBmaW5kRG9jc1NuaXBwZXRQcm9ibGVtc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmluZERvY3NTbmlwcGV0UHJvYmxlbXNQYXJhbXMge1xuICAvKipcbiAgICogQ29tcGlsZXIgb3B0aW9ucyBsYWlkIG92ZXIgdGhlIG9uZXMgYHRzY29uZmlnLmpzb25gIGdpdmVzLCBmb3IgaW5zdGFuY2UgYHBhdGhzYCB0aGF0IHJlc29sdmUgdGhlIHBhY2thZ2UncyBvd25cbiAgICogbmFtZSBvbnRvIGl0cyBzb3VyY2VzIHdoZW4gaXRzIGB0c2NvbmZpZy5qc29uYCBoYXMgbm9uZS4gQSByZWxhdGl2ZSBwYXRoIGluIHRoZW0gaXMgbm90IHJlc29sdmVkLCBzbyBwYXNzXG4gICAqIGFic29sdXRlIG9uZXMuXG4gICAqL1xuICByZWFkb25seSBjb21waWxlck9wdGlvbnM/OiBDb21waWxlck9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBndWlkZXMgZGlyZWN0b3J5LCByZWxhdGl2ZSB0byB7QGxpbmsgRmluZERvY3NTbmlwcGV0UHJvYmxlbXNQYXJhbXMucm9vdERpcmVjdG9yeX0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnZG9jcy9zcmMvY29udGVudC9kb2NzJ2BcbiAgICovXG4gIHJlYWRvbmx5IGRvY3NEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhbWJpZW50IGNvbnRleHQgZXZlcnkgc25pcHBldCBpcyBjb21waWxlZCB3aXRoOiB0aGUgbmFtZXMgYSBndWlkZSBtYXkgdXNlIHdpdGhvdXQgZGVjbGFyaW5nIHRoZW0sIHdyaXR0ZW4gYXNcbiAgICogYSBtb2R1bGUgKGBkZWNsYXJlIGdsb2JhbCB7IC4uLiB9YCwgd2l0aCB0aGUgaW1wb3J0cyBpdCBuZWVkcykuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnJ2AsIG5vIHByZWx1ZGUuXG4gICAqL1xuICByZWFkb25seSBwcmVsdWRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFja2FnZSByb290LCBob2xkaW5nIGB0c2NvbmZpZy5qc29uYC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3REaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENvbXBpbGVTbmlwcGV0c1BhcmFtcyB7XG4gIHJlYWRvbmx5IGNvbXBpbGVyT3B0aW9uczogQ29tcGlsZXJPcHRpb25zO1xuICByZWFkb25seSByb290RGlyZWN0b3J5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJvb3ROYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IHZpcnR1YWxGaWxlczogUmVhZG9ubHlNYXA8c3RyaW5nLCBWaXJ0dWFsU25pcHBldEZpbGU+O1xufVxuXG5pbnRlcmZhY2UgT3BlbkZlbmNlIHtcbiAgcmVhZG9ubHkgY29udGV4dDogc3RyaW5nW107XG4gIHJlYWRvbmx5IGZlbmNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxhbmd1YWdlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByZWZpeDogc3RyaW5nO1xuICByZWFkb25seSBza2lwUmVhc29uOiBudWxsIHwgc3RyaW5nO1xuICByZWFkb25seSBzdGFydExpbmU6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFZpcnR1YWxTbmlwcGV0RmlsZSB7XG4gIHJlYWRvbmx5IGNvZGU6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZVN0YXJ0TGluZTogbnVtYmVyO1xuICByZWFkb25seSBjb250ZXh0TGluZUNvdW50OiBudW1iZXI7XG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVHlwZS1jaGVja3MgZXZlcnkgc25pcHBldCBvZiB0aGUgZ3VpZGVzIGFuZCB0aHJvd3Mgd2hlbiBvbmUgZmFpbHMsIGZvciBhIGBkb2NzOmNoZWNrLXNuaXBwZXRzYCBzY3JpcHQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQXNzZXJ0RG9jc1NuaXBwZXRzQ29tcGlsZVBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5IHNuaXBwZXQgY29tcGlsZXMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gTGlzdGluZyBldmVyeSBwcm9ibGVtLCBvbmUgcGVyIGxpbmUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnREb2NzU25pcHBldHNDb21waWxlKHBhcmFtczogQXNzZXJ0RG9jc1NuaXBwZXRzQ29tcGlsZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9ibGVtcyA9IGF3YWl0IGZpbmREb2NzU25pcHBldFByb2JsZW1zKHBhcmFtcyk7XG4gIGlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke1N0cmluZyhwcm9ibGVtcy5sZW5ndGgpfSBwcm9ibGVtKHMpIGluIHRoZSBkb2N1bWVudGF0aW9uIHNuaXBwZXRzOlxcbiR7Zm9ybWF0RG9jc1NuaXBwZXRQcm9ibGVtcyhwcm9ibGVtcyl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZmVuY2VkIGNvZGUgYmxvY2tzIG9mIHRoZSBjaGVja2VkIGxhbmd1YWdlcyBmcm9tIGEgbWFya2Rvd24gZG9jdW1lbnQuXG4gKlxuICogQSBmZW5jZSBpbnNpZGUgYSBibG9ja3F1b3RlIG9yIGEgbGlzdCBpdGVtIGlzIHJlY29nbml6ZWQgdG9vOiBpdHMgcHJlZml4IChgPiBgLCBpbmRlbnRhdGlvbikgaXMgc3RyaXBwZWQgZnJvbVxuICogZXZlcnkgbGluZSBvZiBpdHMgY29kZS5cbiAqXG4gKiBAcGFyYW0gbWFya2Rvd24gLSBUaGUgbWFya2Rvd24gZG9jdW1lbnQuXG4gKiBAcmV0dXJucyBUaGUgc25pcHBldHMsIGluIGRvY3VtZW50IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdERvY3NTbmlwcGV0cyhtYXJrZG93bjogc3RyaW5nKTogRG9jc1NuaXBwZXRbXSB7XG4gIGNvbnN0IGxpbmVzID0gbWFya2Rvd24uc3BsaXQoL1xccj9cXG4vdSk7XG4gIGNvbnN0IHNuaXBwZXRzOiBEb2NzU25pcHBldFtdID0gW107XG4gIGxldCBvcGVuRmVuY2U6IG51bGwgfCBPcGVuRmVuY2UgPSBudWxsO1xuICBsZXQgY29kZUxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgcGVuZGluZ1NraXBSZWFzb246IG51bGwgfCBzdHJpbmcgPSBudWxsO1xuICBsZXQgcGVuZGluZ0NvbnRleHQ6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIGxpbmVzLmVudHJpZXMoKSkge1xuICAgIGlmIChvcGVuRmVuY2UpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBzdHJpcFByZWZpeChsaW5lLCBvcGVuRmVuY2UucHJlZml4KTtcbiAgICAgIGlmIChjb250ZW50LnRyaW1FbmQoKSA9PT0gb3BlbkZlbmNlLmZlbmNlKSB7XG4gICAgICAgIGNvbnN0IGlzSmF2YVNjcmlwdCA9IENIRUNLRURfTEFOR1VBR0VTLmdldChvcGVuRmVuY2UubGFuZ3VhZ2UpO1xuICAgICAgICBpZiAoaXNKYXZhU2NyaXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzbmlwcGV0cy5wdXNoKHtcbiAgICAgICAgICAgIGNvZGU6IGNvZGVMaW5lcy5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgIGNvZGVTdGFydExpbmU6IG9wZW5GZW5jZS5zdGFydExpbmUsXG4gICAgICAgICAgICBjb250ZXh0OiBvcGVuRmVuY2UuY29udGV4dC5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgIGlzSmF2YVNjcmlwdCxcbiAgICAgICAgICAgIGxhbmd1YWdlOiBvcGVuRmVuY2UubGFuZ3VhZ2UsXG4gICAgICAgICAgICBza2lwUmVhc29uOiBvcGVuRmVuY2Uuc2tpcFJlYXNvblxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIG9wZW5GZW5jZSA9IG51bGw7XG4gICAgICAgIGNvZGVMaW5lcyA9IFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29kZUxpbmVzLnB1c2goY29udGVudCk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmZW5jZU1hdGNoID0gL14oPzxwcmVmaXg+KD86XFxzKj4pKlxccyopKD88ZmVuY2U+YHszLH18fnszLH0pKD88bGFuZ3VhZ2U+W1xcdy1dKikvdS5leGVjKGxpbmUpO1xuICAgIGlmIChmZW5jZU1hdGNoPy5ncm91cHMpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBFdmVyeSBncm91cCBvZiB0aGUgZmVuY2UgcGF0dGVybiB0YWtlcyBwYXJ0IGluIGEgbWF0Y2gsIHNvIHRoZSBmYWxsYmFja3MgbmV2ZXIgYXBwbHkuICovXG4gICAgICBvcGVuRmVuY2UgPSB7XG4gICAgICAgIGNvbnRleHQ6IHBlbmRpbmdDb250ZXh0LFxuICAgICAgICBmZW5jZTogZmVuY2VNYXRjaC5ncm91cHNbJ2ZlbmNlJ10gPz8gJycsXG4gICAgICAgIGxhbmd1YWdlOiAoZmVuY2VNYXRjaC5ncm91cHNbJ2xhbmd1YWdlJ10gPz8gJycpLnRvTG93ZXJDYXNlKCksXG4gICAgICAgIHByZWZpeDogZmVuY2VNYXRjaC5ncm91cHNbJ3ByZWZpeCddID8/ICcnLFxuICAgICAgICBza2lwUmVhc29uOiBwZW5kaW5nU2tpcFJlYXNvbixcbiAgICAgICAgc3RhcnRMaW5lOiBpbmRleCArIExJTkVfQUZURVJfRkVOQ0VfT0ZGU0VUXG4gICAgICB9O1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIHBlbmRpbmdTa2lwUmVhc29uID0gbnVsbDtcbiAgICAgIHBlbmRpbmdDb250ZXh0ID0gW107XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0ID0gbGluZS5yZXBsYWNlKC9eKD86XFxzKj4pKlxccyovdSwgJycpLnRyaW0oKTtcbiAgICBjb25zdCBtYXJrZXJNYXRjaCA9IE1BUktFUl9SRUdfRVhQLmV4ZWModGV4dCk7XG4gICAgY29uc3Qga2luZCA9IG1hcmtlck1hdGNoPy5ncm91cHM/Llsna2luZCddO1xuICAgIGNvbnN0IG1hcmtlclRleHQgPSAobWFya2VyTWF0Y2g/Lmdyb3Vwcz8uWyd0ZXh0J10gPz8gJycpLnRyaW0oKTtcbiAgICBpZiAoa2luZCA9PT0gJ3NraXAnKSB7XG4gICAgICBwZW5kaW5nU2tpcFJlYXNvbiA9IG1hcmtlclRleHQucmVwbGFjZSgvXlst4oCUOl1cXHMqL3UsICcnKTtcbiAgICB9IGVsc2UgaWYgKGtpbmQgPT09ICdjb250ZXh0Jykge1xuICAgICAgcGVuZGluZ0NvbnRleHQucHVzaChtYXJrZXJUZXh0KTtcbiAgICB9IGVsc2UgaWYgKHRleHQgIT09ICcnKSB7XG4gICAgICBwZW5kaW5nU2tpcFJlYXNvbiA9IG51bGw7XG4gICAgICBwZW5kaW5nQ29udGV4dCA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzbmlwcGV0cztcbn1cblxuLyoqXG4gKiBUeXBlLWNoZWNrcyBldmVyeSBzbmlwcGV0IG9mIHRoZSBndWlkZXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgRmluZERvY3NTbmlwcGV0UHJvYmxlbXNQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIHByb2JsZW1zIGZvdW5kLCBlbXB0eSB3aGVuIGV2ZXJ5IHNuaXBwZXQgY29tcGlsZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRG9jc1NuaXBwZXRQcm9ibGVtcyhwYXJhbXM6IEZpbmREb2NzU25pcHBldFByb2JsZW1zUGFyYW1zKTogUHJvbWlzZTxEb2NzU25pcHBldFByb2JsZW1bXT4ge1xuICBjb25zdCByb290RGlyZWN0b3J5ID0gcmVzb2x2ZShwYXJhbXMucm9vdERpcmVjdG9yeSk7XG4gIGNvbnN0IGRvY3NEaXJlY3RvcnkgPSBqb2luKHJvb3REaXJlY3RvcnksIHBhcmFtcy5kb2NzRGlyZWN0b3J5ID8/ICdkb2NzL3NyYy9jb250ZW50L2RvY3MnKTtcbiAgY29uc3QgcHJvYmxlbXM6IERvY3NTbmlwcGV0UHJvYmxlbVtdID0gW107XG4gIGNvbnN0IHZpcnR1YWxGaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBWaXJ0dWFsU25pcHBldEZpbGU+KCk7XG4gIGNvbnN0IHJvb3ROYW1lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc25pcHBldHNEaXJlY3RvcnkgPSBqb2luKHJvb3REaXJlY3RvcnksICdkb2NzJywgJ19fc25pcHBldHNfXycpO1xuXG4gIGZ1bmN0aW9uIGFkZFZpcnR1YWxGaWxlKHBhdGg6IHN0cmluZywgZmlsZTogVmlydHVhbFNuaXBwZXRGaWxlKTogdm9pZCB7XG4gICAgdmlydHVhbEZpbGVzLnNldChub3JtYWxpemVQYXRoKHBhdGgpLCBmaWxlKTtcbiAgICByb290TmFtZXMucHVzaChwYXRoKTtcbiAgfVxuXG4gIGNvbnN0IHByZWx1ZGUgPSBwYXJhbXMucHJlbHVkZSA/PyAnJztcbiAgaWYgKHByZWx1ZGUgIT09ICcnKSB7XG4gICAgYWRkVmlydHVhbEZpbGUoam9pbihzbmlwcGV0c0RpcmVjdG9yeSwgJ3ByZWx1ZGUudHMnKSwgeyBjb2RlOiBwcmVsdWRlLCBjb2RlU3RhcnRMaW5lOiAxLCBjb250ZXh0TGluZUNvdW50OiAwLCBmaWxlUGF0aDogJzxwcmVsdWRlPicgfSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGd1aWRlUGF0aCBvZiBhd2FpdCBsaXN0R3VpZGVzKGRvY3NEaXJlY3RvcnkpKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSB0b1Bvc2l4KHJlbGF0aXZlKHJvb3REaXJlY3RvcnksIGd1aWRlUGF0aCkpO1xuICAgIGNvbnN0IG1hcmtkb3duID0gYXdhaXQgcmVhZEZpbGUoZ3VpZGVQYXRoLCAndXRmLTgnKTtcbiAgICBmb3IgKGNvbnN0IHNuaXBwZXQgb2YgZXh0cmFjdERvY3NTbmlwcGV0cyhtYXJrZG93bikpIHtcbiAgICAgIGlmIChzbmlwcGV0LnNraXBSZWFzb24gPT09ICcnKSB7XG4gICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgIGxpbmU6IHNuaXBwZXQuY29kZVN0YXJ0TGluZSAtIDEsXG4gICAgICAgICAgbWVzc2FnZTogJ0EgYHNuaXBwZXQtY2hlY2s6IHNraXBgIG1hcmtlciBtdXN0IGdpdmUgaXRzIHJlYXNvbi4nXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChzbmlwcGV0LnNraXBSZWFzb24gIT09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBzbmlwcGV0LmlzSmF2YVNjcmlwdCA/ICdqcycgOiAndHMnO1xuICAgICAgY29uc3QgYmFzZU5hbWUgPSBgJHt0b1Bvc2l4KHJlbGF0aXZlKGRvY3NEaXJlY3RvcnksIGd1aWRlUGF0aCkpLnJlcGxhY2VBbGwoJy8nLCAnX18nKX0uTCR7U3RyaW5nKHNuaXBwZXQuY29kZVN0YXJ0TGluZSl9LiR7ZXh0ZW5zaW9ufWA7XG4gICAgICBjb25zdCBjb250ZXh0ID0gc25pcHBldC5jb250ZXh0ID09PSAnJyA/ICcnIDogYCR7c25pcHBldC5jb250ZXh0fVxcbmA7XG4gICAgICBhZGRWaXJ0dWFsRmlsZShqb2luKHNuaXBwZXRzRGlyZWN0b3J5LCBiYXNlTmFtZSksIHtcbiAgICAgICAgY29kZTogYCR7Y29udGV4dH0ke3NuaXBwZXQuY29kZX1cXG5leHBvcnQge307XFxuYCxcbiAgICAgICAgY29kZVN0YXJ0TGluZTogc25pcHBldC5jb2RlU3RhcnRMaW5lLFxuICAgICAgICBjb250ZXh0TGluZUNvdW50OiBjb250ZXh0ID09PSAnJyA/IDAgOiBjb250ZXh0LnNwbGl0KCdcXG4nKS5sZW5ndGggLSAxLFxuICAgICAgICBmaWxlUGF0aFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvYmxlbXMucHVzaCguLi5jb21waWxlU25pcHBldHMoeyBjb21waWxlck9wdGlvbnM6IHBhcmFtcy5jb21waWxlck9wdGlvbnMgPz8ge30sIHJvb3REaXJlY3RvcnksIHJvb3ROYW1lcywgdmlydHVhbEZpbGVzIH0pKTtcbiAgcmV0dXJuIHByb2JsZW1zO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgcHJvYmxlbXMgb25lIHBlciBsaW5lLCBhcyBgcGF0aDpsaW5lIC0gbWVzc2FnZWAuXG4gKlxuICogQHBhcmFtIHByb2JsZW1zIC0gVGhlIHByb2JsZW1zLlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCB0ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RG9jc1NuaXBwZXRQcm9ibGVtcyhwcm9ibGVtczogcmVhZG9ubHkgRG9jc1NuaXBwZXRQcm9ibGVtW10pOiBzdHJpbmcge1xuICByZXR1cm4gcHJvYmxlbXMubWFwKChwcm9ibGVtKSA9PiBgJHtwcm9ibGVtLmZpbGVQYXRofToke1N0cmluZyhwcm9ibGVtLmxpbmUpfSAtICR7cHJvYmxlbS5tZXNzYWdlfWApLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBjb21waWxlU25pcHBldHMocGFyYW1zOiBDb21waWxlU25pcHBldHNQYXJhbXMpOiBEb2NzU25pcHBldFByb2JsZW1bXSB7XG4gIGNvbnN0IHsgcm9vdERpcmVjdG9yeSwgcm9vdE5hbWVzLCB2aXJ0dWFsRmlsZXMgfSA9IHBhcmFtcztcbiAgY29uc3QgY29uZmlnUGF0aCA9IGpvaW4ocm9vdERpcmVjdG9yeSwgJ3RzY29uZmlnLmpzb24nKTtcbiAgY29uc3QgcGFyc2VkID0gZ2V0UGFyc2VkQ29tbWFuZExpbmVPZkNvbmZpZ0ZpbGUoY29uZmlnUGF0aCwge30sIHtcbiAgICAuLi5zeXMsXG4gICAgb25VblJlY292ZXJhYmxlQ29uZmlnRmlsZURpYWdub3N0aWMoZGlhZ25vc3RpYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQoZGlhZ25vc3RpYy5tZXNzYWdlVGV4dCwgJ1xcbicpKTtcbiAgICB9XG4gIH0pO1xuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQW4gdW5yZWFkYWJsZSBjb25maWd1cmF0aW9uIHRocm93cyBpbiB0aGUgaGFuZGxlciBhYm92ZSBiZWZvcmUgdGhpcyBjYW4gYmUgcmVhY2hlZC4gKi9cbiAgaWYgKCFwYXJzZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZWFkICR7Y29uZmlnUGF0aH1gKTtcbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9uczogQ29tcGlsZXJPcHRpb25zID0ge1xuICAgIC4uLnBhcnNlZC5vcHRpb25zLFxuICAgIC4uLnBhcmFtcy5jb21waWxlck9wdGlvbnMsXG4gICAgYWxsb3dKczogdHJ1ZSxcbiAgICBjaGVja0pzOiB0cnVlLFxuICAgIGNvbXBvc2l0ZTogZmFsc2UsXG4gICAgaW5jcmVtZW50YWw6IGZhbHNlLFxuICAgIG5vRW1pdDogdHJ1ZSxcbiAgICBub1VudXNlZExvY2FsczogZmFsc2UsXG4gICAgbm9VbnVzZWRQYXJhbWV0ZXJzOiBmYWxzZVxuICB9O1xuICBkZWxldGUgY29tcGlsZXJPcHRpb25zLnRzQnVpbGRJbmZvRmlsZTtcblxuICBjb25zdCBob3N0ID0gY3JlYXRlQ29tcGlsZXJIb3N0KGNvbXBpbGVyT3B0aW9ucywgdHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbmFsR2V0U291cmNlRmlsZSA9IGhvc3QuZ2V0U291cmNlRmlsZS5iaW5kKGhvc3QpO1xuICBjb25zdCBvcmlnaW5hbEZpbGVFeGlzdHMgPSBob3N0LmZpbGVFeGlzdHMuYmluZChob3N0KTtcbiAgY29uc3Qgb3JpZ2luYWxSZWFkRmlsZSA9IGhvc3QucmVhZEZpbGUuYmluZChob3N0KTtcbiAgaG9zdC5maWxlRXhpc3RzID0gKGZpbGVOYW1lKTogYm9vbGVhbiA9PiB2aXJ0dWFsRmlsZXMuaGFzKG5vcm1hbGl6ZVBhdGgoZmlsZU5hbWUpKSB8fCBvcmlnaW5hbEZpbGVFeGlzdHMoZmlsZU5hbWUpO1xuICBob3N0LnJlYWRGaWxlID0gKGZpbGVOYW1lKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHZpcnR1YWxGaWxlcy5nZXQobm9ybWFsaXplUGF0aChmaWxlTmFtZSkpPy5jb2RlID8/IG9yaWdpbmFsUmVhZEZpbGUoZmlsZU5hbWUpO1xuICBob3N0LmdldFNvdXJjZUZpbGUgPSAoZmlsZU5hbWUsIGxhbmd1YWdlVmVyc2lvbk9yT3B0aW9ucywgb25FcnJvciwgc2hvdWxkQ3JlYXRlTmV3U291cmNlRmlsZSk6IFNvdXJjZUZpbGUgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IHZpcnR1YWxGaWxlID0gdmlydHVhbEZpbGVzLmdldChub3JtYWxpemVQYXRoKGZpbGVOYW1lKSk7XG4gICAgaWYgKHZpcnR1YWxGaWxlKSB7XG4gICAgICBjb25zdCBzY3JpcHRLaW5kID0gZmlsZU5hbWUuZW5kc1dpdGgoJy5qcycpID8gU2NyaXB0S2luZC5KUyA6IFNjcmlwdEtpbmQuVFM7XG4gICAgICByZXR1cm4gY3JlYXRlU291cmNlRmlsZShmaWxlTmFtZSwgdmlydHVhbEZpbGUuY29kZSwgbGFuZ3VhZ2VWZXJzaW9uT3JPcHRpb25zLCB0cnVlLCBzY3JpcHRLaW5kKTtcbiAgICB9XG4gICAgcmV0dXJuIG9yaWdpbmFsR2V0U291cmNlRmlsZShmaWxlTmFtZSwgbGFuZ3VhZ2VWZXJzaW9uT3JPcHRpb25zLCBvbkVycm9yLCBzaG91bGRDcmVhdGVOZXdTb3VyY2VGaWxlKTtcbiAgfTtcblxuICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbSh7IGhvc3QsIG9wdGlvbnM6IGNvbXBpbGVyT3B0aW9ucywgcm9vdE5hbWVzIH0pO1xuICBjb25zdCBwcm9ibGVtczogRG9jc1NuaXBwZXRQcm9ibGVtW10gPSBbXTtcbiAgZm9yIChjb25zdCByb290TmFtZSBvZiByb290TmFtZXMpIHtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gcHJvZ3JhbS5nZXRTb3VyY2VGaWxlKHJvb3ROYW1lKTtcbiAgICBjb25zdCB2aXJ0dWFsRmlsZSA9IHZpcnR1YWxGaWxlcy5nZXQobm9ybWFsaXplUGF0aChyb290TmFtZSkpO1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBFdmVyeSByb290IG5hbWUgaXMgYSB2aXJ0dWFsIGZpbGUgdGhlIHByb2dyYW0gd2FzIGJ1aWx0IGZyb20uICovXG4gICAgaWYgKCFzb3VyY2VGaWxlIHx8ICF2aXJ0dWFsRmlsZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgY29uc3QgaXNKYXZhU2NyaXB0ID0gcm9vdE5hbWUuZW5kc1dpdGgoJy5qcycpO1xuICAgIGNvbnN0IGRpYWdub3N0aWNzID0gWy4uLnByb2dyYW0uZ2V0U3ludGFjdGljRGlhZ25vc3RpY3Moc291cmNlRmlsZSksIC4uLnByb2dyYW0uZ2V0U2VtYW50aWNEaWFnbm9zdGljcyhzb3VyY2VGaWxlKV07XG4gICAgZm9yIChjb25zdCBkaWFnbm9zdGljIG9mIGRpYWdub3N0aWNzKSB7XG4gICAgICBpZiAoSUdOT1JFRF9ESUFHTk9TVElDX0NPREVTLmhhcyhkaWFnbm9zdGljLmNvZGUpIHx8IChpc0phdmFTY3JpcHQgJiYgSkFWQVNDUklQVF9JR05PUkVEX0RJQUdOT1NUSUNfQ09ERVMuaGFzKGRpYWdub3N0aWMuY29kZSkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLyogdjggaWdub3JlIG5leHQgLS0gQSBkaWFnbm9zdGljIG9mIG9uZSBzb3VyY2UgZmlsZSBhbHdheXMgY2FycmllcyBpdHMgcG9zaXRpb24uICovXG4gICAgICBjb25zdCBmaWxlTGluZSA9IGRpYWdub3N0aWMuc3RhcnQgPT09IHVuZGVmaW5lZCA/IDAgOiBzb3VyY2VGaWxlLmdldExpbmVBbmRDaGFyYWN0ZXJPZlBvc2l0aW9uKGRpYWdub3N0aWMuc3RhcnQpLmxpbmU7XG4gICAgICBjb25zdCBzbmlwcGV0TGluZSA9IE1hdGgubWF4KDAsIGZpbGVMaW5lIC0gdmlydHVhbEZpbGUuY29udGV4dExpbmVDb3VudCk7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgZmlsZVBhdGg6IHZpcnR1YWxGaWxlLmZpbGVQYXRoLFxuICAgICAgICBsaW5lOiB2aXJ0dWFsRmlsZS5jb2RlU3RhcnRMaW5lICsgc25pcHBldExpbmUsXG4gICAgICAgIG1lc3NhZ2U6IGBUUyR7U3RyaW5nKGRpYWdub3N0aWMuY29kZSl9OiAke2ZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQoZGlhZ25vc3RpYy5tZXNzYWdlVGV4dCwgJyAnKX1gXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByb2JsZW1zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0R3VpZGVzKGRpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBndWlkZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgYXdhaXQgcmVhZGRpcihkaXJlY3RvcnksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGNvbnN0IGVudHJ5UGF0aCA9IGpvaW4oZGlyZWN0b3J5LCBlbnRyeS5uYW1lKTtcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgaWYgKGVudHJ5Lm5hbWUgIT09ICdhcGknKSB7XG4gICAgICAgIGd1aWRlcy5wdXNoKC4uLmF3YWl0IGxpc3RHdWlkZXMoZW50cnlQYXRoKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgvXFwubWR4PyQvdS50ZXN0KGVudHJ5Lm5hbWUpKSB7XG4gICAgICBndWlkZXMucHVzaChlbnRyeVBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ3VpZGVzLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdG9Qb3NpeChyZXNvbHZlKHBhdGgpKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBzdHJpcFByZWZpeChsaW5lOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxpbmUuc3RhcnRzV2l0aChwcmVmaXgpID8gbGluZS5zbGljZShwcmVmaXgubGVuZ3RoKSA6IGxpbmUucmVwbGFjZSgvXig/Olxccyo+KSpcXHM/L3UsICcnKTtcbn1cblxuZnVuY3Rpb24gdG9Qb3NpeChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4QkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBS1AsTUFBTSxvQkFBa0Qsb0JBQUksSUFBSTtBQUFBLEVBQzlELENBQUMsY0FBYyxJQUFJO0FBQUEsRUFDbkIsQ0FBQyxNQUFNLElBQUk7QUFBQSxFQUNYLENBQUMsTUFBTSxLQUFLO0FBQUEsRUFDWixDQUFDLGNBQWMsS0FBSztBQUN0QixDQUFDO0FBS0QsTUFBTSwwQkFBMEI7QUFFaEMsTUFBTSxpQkFBaUI7QUFLdkIsTUFBTSwyQ0FBMkM7QUFDakQsTUFBTSxnQ0FBZ0M7QUFDdEMsTUFBTSxxQ0FBcUM7QUFDM0MsTUFBTSw4Q0FBOEM7QUFDcEQsTUFBTSwyQkFBMkIsb0JBQUksSUFBSTtBQUFBLEVBQ3ZDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsQ0FBQztBQU1ELE1BQU0scUNBQXFDO0FBQzNDLE1BQU0sc0NBQXNDO0FBQzVDLE1BQU0sbUNBQW1DO0FBQ3pDLE1BQU0sNENBQTRDO0FBQ2xELE1BQU0sdURBQXVEO0FBQzdELE1BQU0saURBQWlEO0FBQ3ZELE1BQU0sb0NBQW9DO0FBQzFDLE1BQU0sc0NBQXNDLG9CQUFJLElBQUk7QUFBQSxFQUNsRDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLENBQUM7QUE0SEQsZUFBc0IsMEJBQTBCLFFBQXdEO0FBQ3RHLFFBQU0sV0FBVyxNQUFNLHdCQUF3QixNQUFNO0FBQ3JELE1BQUksU0FBUyxTQUFTLEdBQUc7QUFDdkIsVUFBTSxJQUFJLE1BQU0sR0FBRyxPQUFPLFNBQVMsTUFBTSxDQUFDO0FBQUEsRUFBK0MsMEJBQTBCLFFBQVEsQ0FBQyxFQUFFO0FBQUEsRUFDaEk7QUFDRjtBQVdPLFNBQVMsb0JBQW9CLFVBQWlDO0FBQ25FLFFBQU0sUUFBUSxTQUFTLE1BQU0sUUFBUTtBQUNyQyxRQUFNLFdBQTBCLENBQUM7QUFDakMsTUFBSSxZQUE4QjtBQUNsQyxNQUFJLFlBQXNCLENBQUM7QUFDM0IsTUFBSSxvQkFBbUM7QUFDdkMsTUFBSSxpQkFBMkIsQ0FBQztBQUVoQyxhQUFXLENBQUMsT0FBTyxJQUFJLEtBQUssTUFBTSxRQUFRLEdBQUc7QUFDM0MsUUFBSSxXQUFXO0FBQ2IsWUFBTSxVQUFVLFlBQVksTUFBTSxVQUFVLE1BQU07QUFDbEQsVUFBSSxRQUFRLFFBQVEsTUFBTSxVQUFVLE9BQU87QUFDekMsY0FBTSxlQUFlLGtCQUFrQixJQUFJLFVBQVUsUUFBUTtBQUM3RCxZQUFJLGlCQUFpQixRQUFXO0FBQzlCLG1CQUFTLEtBQUs7QUFBQSxZQUNaLE1BQU0sVUFBVSxLQUFLLElBQUk7QUFBQSxZQUN6QixlQUFlLFVBQVU7QUFBQSxZQUN6QixTQUFTLFVBQVUsUUFBUSxLQUFLLElBQUk7QUFBQSxZQUNwQztBQUFBLFlBQ0EsVUFBVSxVQUFVO0FBQUEsWUFDcEIsWUFBWSxVQUFVO0FBQUEsVUFDeEIsQ0FBQztBQUFBLFFBQ0g7QUFDQSxvQkFBWTtBQUNaLG9CQUFZLENBQUM7QUFBQSxNQUNmLE9BQU87QUFDTCxrQkFBVSxLQUFLLE9BQU87QUFBQSxNQUN4QjtBQUNBO0FBQUEsSUFDRjtBQUVBLFVBQU0sYUFBYSxvRUFBb0UsS0FBSyxJQUFJO0FBQ2hHLFFBQUksWUFBWSxRQUFRO0FBRXRCLGtCQUFZO0FBQUEsUUFDVixTQUFTO0FBQUEsUUFDVCxPQUFPLFdBQVcsT0FBTyxPQUFPLEtBQUs7QUFBQSxRQUNyQyxXQUFXLFdBQVcsT0FBTyxVQUFVLEtBQUssSUFBSSxZQUFZO0FBQUEsUUFDNUQsUUFBUSxXQUFXLE9BQU8sUUFBUSxLQUFLO0FBQUEsUUFDdkMsWUFBWTtBQUFBLFFBQ1osV0FBVyxRQUFRO0FBQUEsTUFDckI7QUFFQSwwQkFBb0I7QUFDcEIsdUJBQWlCLENBQUM7QUFDbEI7QUFBQSxJQUNGO0FBRUEsVUFBTSxPQUFPLEtBQUssUUFBUSxrQkFBa0IsRUFBRSxFQUFFLEtBQUs7QUFDckQsVUFBTSxjQUFjLGVBQWUsS0FBSyxJQUFJO0FBQzVDLFVBQU0sT0FBTyxhQUFhLFNBQVMsTUFBTTtBQUN6QyxVQUFNLGNBQWMsYUFBYSxTQUFTLE1BQU0sS0FBSyxJQUFJLEtBQUs7QUFDOUQsUUFBSSxTQUFTLFFBQVE7QUFDbkIsMEJBQW9CLFdBQVcsUUFBUSxjQUFjLEVBQUU7QUFBQSxJQUN6RCxXQUFXLFNBQVMsV0FBVztBQUM3QixxQkFBZSxLQUFLLFVBQVU7QUFBQSxJQUNoQyxXQUFXLFNBQVMsSUFBSTtBQUN0QiwwQkFBb0I7QUFDcEIsdUJBQWlCLENBQUM7QUFBQSxJQUNwQjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFRQSxlQUFzQix3QkFBd0IsUUFBc0U7QUFDbEgsUUFBTSxnQkFBZ0IsUUFBUSxPQUFPLGFBQWE7QUFDbEQsUUFBTSxnQkFBZ0IsS0FBSyxlQUFlLE9BQU8saUJBQWlCLHVCQUF1QjtBQUN6RixRQUFNLFdBQWlDLENBQUM7QUFDeEMsUUFBTSxlQUFlLG9CQUFJLElBQWdDO0FBQ3pELFFBQU0sWUFBc0IsQ0FBQztBQUM3QixRQUFNLG9CQUFvQixLQUFLLGVBQWUsUUFBUSxjQUFjO0FBRXBFLFdBQVMsZUFBZSxNQUFjLE1BQWdDO0FBQ3BFLGlCQUFhLElBQUksY0FBYyxJQUFJLEdBQUcsSUFBSTtBQUMxQyxjQUFVLEtBQUssSUFBSTtBQUFBLEVBQ3JCO0FBRUEsUUFBTSxVQUFVLE9BQU8sV0FBVztBQUNsQyxNQUFJLFlBQVksSUFBSTtBQUNsQixtQkFBZSxLQUFLLG1CQUFtQixZQUFZLEdBQUcsRUFBRSxNQUFNLFNBQVMsZUFBZSxHQUFHLGtCQUFrQixHQUFHLFVBQVUsWUFBWSxDQUFDO0FBQUEsRUFDdkk7QUFFQSxhQUFXLGFBQWEsTUFBTSxXQUFXLGFBQWEsR0FBRztBQUN2RCxVQUFNLFdBQVcsUUFBUSxTQUFTLGVBQWUsU0FBUyxDQUFDO0FBQzNELFVBQU0sV0FBVyxNQUFNLFNBQVMsV0FBVyxPQUFPO0FBQ2xELGVBQVcsV0FBVyxvQkFBb0IsUUFBUSxHQUFHO0FBQ25ELFVBQUksUUFBUSxlQUFlLElBQUk7QUFDN0IsaUJBQVMsS0FBSztBQUFBLFVBQ1o7QUFBQSxVQUNBLE1BQU0sUUFBUSxnQkFBZ0I7QUFBQSxVQUM5QixTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQ0Q7QUFBQSxNQUNGO0FBQ0EsVUFBSSxRQUFRLGVBQWUsTUFBTTtBQUMvQjtBQUFBLE1BQ0Y7QUFDQSxZQUFNLFlBQVksUUFBUSxlQUFlLE9BQU87QUFDaEQsWUFBTSxXQUFXLEdBQUcsUUFBUSxTQUFTLGVBQWUsU0FBUyxDQUFDLEVBQUUsV0FBVyxLQUFLLElBQUksQ0FBQyxLQUFLLE9BQU8sUUFBUSxhQUFhLENBQUMsSUFBSSxTQUFTO0FBQ3BJLFlBQU0sVUFBVSxRQUFRLFlBQVksS0FBSyxLQUFLLEdBQUcsUUFBUSxPQUFPO0FBQUE7QUFDaEUscUJBQWUsS0FBSyxtQkFBbUIsUUFBUSxHQUFHO0FBQUEsUUFDaEQsTUFBTSxHQUFHLE9BQU8sR0FBRyxRQUFRLElBQUk7QUFBQTtBQUFBO0FBQUEsUUFDL0IsZUFBZSxRQUFRO0FBQUEsUUFDdkIsa0JBQWtCLFlBQVksS0FBSyxJQUFJLFFBQVEsTUFBTSxJQUFJLEVBQUUsU0FBUztBQUFBLFFBQ3BFO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFFQSxXQUFTLEtBQUssR0FBRyxnQkFBZ0IsRUFBRSxpQkFBaUIsT0FBTyxtQkFBbUIsQ0FBQyxHQUFHLGVBQWUsV0FBVyxhQUFhLENBQUMsQ0FBQztBQUMzSCxTQUFPO0FBQ1Q7QUFRTyxTQUFTLDBCQUEwQixVQUFpRDtBQUN6RixTQUFPLFNBQVMsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLFFBQVEsSUFBSSxPQUFPLFFBQVEsSUFBSSxDQUFDLE1BQU0sUUFBUSxPQUFPLEVBQUUsRUFBRSxLQUFLLElBQUk7QUFDaEg7QUFFQSxTQUFTLGdCQUFnQixRQUFxRDtBQUM1RSxRQUFNLEVBQUUsZUFBZSxXQUFXLGFBQWEsSUFBSTtBQUNuRCxRQUFNLGFBQWEsS0FBSyxlQUFlLGVBQWU7QUFDdEQsUUFBTSxTQUFTLGlDQUFpQyxZQUFZLENBQUMsR0FBRztBQUFBLElBQzlELEdBQUc7QUFBQSxJQUNILG9DQUFvQyxZQUFZO0FBQzlDLFlBQU0sSUFBSSxNQUFNLDZCQUE2QixXQUFXLGFBQWEsSUFBSSxDQUFDO0FBQUEsSUFDNUU7QUFBQSxFQUNGLENBQUM7QUFFRCxNQUFJLENBQUMsUUFBUTtBQUNYLFVBQU0sSUFBSSxNQUFNLGVBQWUsVUFBVSxFQUFFO0FBQUEsRUFDN0M7QUFHQSxRQUFNLGtCQUFtQztBQUFBLElBQ3ZDLEdBQUcsT0FBTztBQUFBLElBQ1YsR0FBRyxPQUFPO0FBQUEsSUFDVixTQUFTO0FBQUEsSUFDVCxTQUFTO0FBQUEsSUFDVCxXQUFXO0FBQUEsSUFDWCxhQUFhO0FBQUEsSUFDYixRQUFRO0FBQUEsSUFDUixnQkFBZ0I7QUFBQSxJQUNoQixvQkFBb0I7QUFBQSxFQUN0QjtBQUNBLFNBQU8sZ0JBQWdCO0FBRXZCLFFBQU0sT0FBTyxtQkFBbUIsaUJBQWlCLElBQUk7QUFDckQsUUFBTSx3QkFBd0IsS0FBSyxjQUFjLEtBQUssSUFBSTtBQUMxRCxRQUFNLHFCQUFxQixLQUFLLFdBQVcsS0FBSyxJQUFJO0FBQ3BELFFBQU0sbUJBQW1CLEtBQUssU0FBUyxLQUFLLElBQUk7QUFDaEQsT0FBSyxhQUFhLENBQUMsYUFBc0IsYUFBYSxJQUFJLGNBQWMsUUFBUSxDQUFDLEtBQUssbUJBQW1CLFFBQVE7QUFDakgsT0FBSyxXQUFXLENBQUMsYUFBaUMsYUFBYSxJQUFJLGNBQWMsUUFBUSxDQUFDLEdBQUcsUUFBUSxpQkFBaUIsUUFBUTtBQUM5SCxPQUFLLGdCQUFnQixDQUFDLFVBQVUsMEJBQTBCLFNBQVMsOEJBQXNEO0FBQ3ZILFVBQU0sY0FBYyxhQUFhLElBQUksY0FBYyxRQUFRLENBQUM7QUFDNUQsUUFBSSxhQUFhO0FBQ2YsWUFBTSxhQUFhLFNBQVMsU0FBUyxLQUFLLElBQUksV0FBVyxLQUFLLFdBQVc7QUFDekUsYUFBTyxpQkFBaUIsVUFBVSxZQUFZLE1BQU0sMEJBQTBCLE1BQU0sVUFBVTtBQUFBLElBQ2hHO0FBQ0EsV0FBTyxzQkFBc0IsVUFBVSwwQkFBMEIsU0FBUyx5QkFBeUI7QUFBQSxFQUNyRztBQUVBLFFBQU0sVUFBVSxjQUFjLEVBQUUsTUFBTSxTQUFTLGlCQUFpQixVQUFVLENBQUM7QUFDM0UsUUFBTSxXQUFpQyxDQUFDO0FBQ3hDLGFBQVcsWUFBWSxXQUFXO0FBQ2hDLFVBQU0sYUFBYSxRQUFRLGNBQWMsUUFBUTtBQUNqRCxVQUFNLGNBQWMsYUFBYSxJQUFJLGNBQWMsUUFBUSxDQUFDO0FBRTVELFFBQUksQ0FBQyxjQUFjLENBQUMsYUFBYTtBQUMvQjtBQUFBLElBQ0Y7QUFFQSxVQUFNLGVBQWUsU0FBUyxTQUFTLEtBQUs7QUFDNUMsVUFBTSxjQUFjLENBQUMsR0FBRyxRQUFRLHdCQUF3QixVQUFVLEdBQUcsR0FBRyxRQUFRLHVCQUF1QixVQUFVLENBQUM7QUFDbEgsZUFBVyxjQUFjLGFBQWE7QUFDcEMsVUFBSSx5QkFBeUIsSUFBSSxXQUFXLElBQUksS0FBTSxnQkFBZ0Isb0NBQW9DLElBQUksV0FBVyxJQUFJLEdBQUk7QUFDL0g7QUFBQSxNQUNGO0FBRUEsWUFBTSxXQUFXLFdBQVcsVUFBVSxTQUFZLElBQUksV0FBVyw4QkFBOEIsV0FBVyxLQUFLLEVBQUU7QUFDakgsWUFBTSxjQUFjLEtBQUssSUFBSSxHQUFHLFdBQVcsWUFBWSxnQkFBZ0I7QUFDdkUsZUFBUyxLQUFLO0FBQUEsUUFDWixVQUFVLFlBQVk7QUFBQSxRQUN0QixNQUFNLFlBQVksZ0JBQWdCO0FBQUEsUUFDbEMsU0FBUyxLQUFLLE9BQU8sV0FBVyxJQUFJLENBQUMsS0FBSyw2QkFBNkIsV0FBVyxhQUFhLEdBQUcsQ0FBQztBQUFBLE1BQ3JHLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDtBQUVBLGVBQWUsV0FBVyxXQUFzQztBQUM5RCxRQUFNLFNBQW1CLENBQUM7QUFDMUIsYUFBVyxTQUFTLE1BQU0sUUFBUSxXQUFXLEVBQUUsZUFBZSxLQUFLLENBQUMsR0FBRztBQUNyRSxVQUFNLFlBQVksS0FBSyxXQUFXLE1BQU0sSUFBSTtBQUM1QyxRQUFJLE1BQU0sWUFBWSxHQUFHO0FBQ3ZCLFVBQUksTUFBTSxTQUFTLE9BQU87QUFDeEIsZUFBTyxLQUFLLEdBQUcsTUFBTSxXQUFXLFNBQVMsQ0FBQztBQUFBLE1BQzVDO0FBQUEsSUFDRixXQUFXLFdBQVcsS0FBSyxNQUFNLElBQUksR0FBRztBQUN0QyxhQUFPLEtBQUssU0FBUztBQUFBLElBQ3ZCO0FBQUEsRUFDRjtBQUNBLFNBQU8sT0FBTyxLQUFLO0FBQ3JCO0FBRUEsU0FBUyxjQUFjLE1BQXNCO0FBQzNDLFNBQU8sUUFBUSxRQUFRLElBQUksQ0FBQyxFQUFFLFlBQVk7QUFDNUM7QUFFQSxTQUFTLFlBQVksTUFBYyxRQUF3QjtBQUN6RCxTQUFPLEtBQUssV0FBVyxNQUFNLElBQUksS0FBSyxNQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUssUUFBUSxrQkFBa0IsRUFBRTtBQUNoRztBQUVBLFNBQVMsUUFBUSxNQUFzQjtBQUNyQyxTQUFPLEtBQUssV0FBVyxNQUFNLEdBQUc7QUFDbEM7IiwibmFtZXMiOltdfQ==
@@ -17,10 +17,12 @@ export * as 'docs-links' from './docs-links.mjs';
17
17
  export * as 'docs-site-assets' from './docs-site-assets.mjs';
18
18
  export * as 'docs-site-commands' from './docs-site-commands.mjs';
19
19
  export * as 'docs-site-config' from './docs-site-config.mjs';
20
+ export * as 'docs-snippets' from './docs-snippets.mjs';
20
21
  export * as 'link-check' from './link-check.mjs';
21
22
  export * as 'og-image-page' from './og-image-page.mjs';
22
23
  export * as 'og-image' from './og-image.mjs';
23
24
  export * as 'og-images' from './og-images.mjs';
25
+ export * as 'outdated-references' from './outdated-references.mjs';
24
26
  export * as 'repo-homepage' from './repo-homepage.mjs';
25
27
  export * as 'route-data' from './route-data.mjs';
26
28
  export * as 'satteri-github-alerts' from './satteri-github-alerts.mjs';
@@ -21,10 +21,12 @@ import * as docs_links from "./docs-links.mjs";
21
21
  import * as docs_site_assets from "./docs-site-assets.mjs";
22
22
  import * as docs_site_commands from "./docs-site-commands.mjs";
23
23
  import * as docs_site_config from "./docs-site-config.mjs";
24
+ import * as docs_snippets from "./docs-snippets.mjs";
24
25
  import * as link_check from "./link-check.mjs";
25
26
  import * as og_image_page from "./og-image-page.mjs";
26
27
  import * as og_image from "./og-image.mjs";
27
28
  import * as og_images from "./og-images.mjs";
29
+ import * as outdated_references from "./outdated-references.mjs";
28
30
  import * as repo_homepage from "./repo-homepage.mjs";
29
31
  import * as route_data from "./route-data.mjs";
30
32
  import * as satteri_github_alerts from "./satteri-github-alerts.mjs";
@@ -49,14 +51,16 @@ export {
49
51
  docs_site_assets as "docs-site-assets",
50
52
  docs_site_commands as "docs-site-commands",
51
53
  docs_site_config as "docs-site-config",
54
+ docs_snippets as "docs-snippets",
52
55
  link_check as "link-check",
53
56
  og_image as "og-image",
54
57
  og_image_page as "og-image-page",
55
58
  og_images as "og-images",
59
+ outdated_references as "outdated-references",
56
60
  repo_homepage as "repo-homepage",
57
61
  route_data as "route-data",
58
62
  satteri_github_alerts as "satteri-github-alerts",
59
63
  satteri_relative_links as "satteri-relative-links",
60
64
  unrendered_alerts as "unrendered-alerts"
61
65
  };
62
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RvY3Mtc2l0ZS9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdhcGktZG9jLWNvbnN0YW50cycgZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWRvYy1kb2N1bWVudGVkLWZpbGVzJyBmcm9tICcuL2FwaS1kb2MtZG9jdW1lbnRlZC1maWxlcy50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWRvYy1qc2RvYycgZnJvbSAnLi9hcGktZG9jLWpzZG9jLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jLWxpbmstcmVuZGVyaW5nJyBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuZXhwb3J0ICogYXMgJ2FwaS1kb2MtcGFja2FnZS1zaXRlcycgZnJvbSAnLi9hcGktZG9jLXBhY2thZ2Utc2l0ZXMudHMnO1xuZXhwb3J0ICogYXMgJ2FwaS1kb2MtcGFnZS1nZW5lcmF0aW9uJyBmcm9tICcuL2FwaS1kb2MtcGFnZS1nZW5lcmF0aW9uLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jLXJvdXRlLXNlZ21lbnRzJyBmcm9tICcuL2FwaS1kb2Mtcm91dGUtc2VnbWVudHMudHMnO1xuZXhwb3J0ICogYXMgJ2FwaS1kb2Mtc2V0dGluZ3MnIGZyb20gJy4vYXBpLWRvYy1zZXR0aW5ncy50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWRvYy1zb3VyY2UtcHJvY2Vzc2luZycgZnJvbSAnLi9hcGktZG9jLXNvdXJjZS1wcm9jZXNzaW5nLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jLXRleHQtdXRpbHMnIGZyb20gJy4vYXBpLWRvYy10ZXh0LXV0aWxzLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jLXR5cGUtbWVyZ2luZycgZnJvbSAnLi9hcGktZG9jLXR5cGUtbWVyZ2luZy50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWRvYy10eXBlcycgZnJvbSAnLi9hcGktZG9jLXR5cGVzLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jcycgZnJvbSAnLi9hcGktZG9jcy50cyc7XG5leHBvcnQgKiBhcyAnYXN0cm8tY29uZmlnJyBmcm9tICcuL2FzdHJvLWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnZG9jcy1saW5rcycgZnJvbSAnLi9kb2NzLWxpbmtzLnRzJztcbmV4cG9ydCAqIGFzICdkb2NzLXNpdGUtYXNzZXRzJyBmcm9tICcuL2RvY3Mtc2l0ZS1hc3NldHMudHMnO1xuZXhwb3J0ICogYXMgJ2RvY3Mtc2l0ZS1jb21tYW5kcycgZnJvbSAnLi9kb2NzLXNpdGUtY29tbWFuZHMudHMnO1xuZXhwb3J0ICogYXMgJ2RvY3Mtc2l0ZS1jb25maWcnIGZyb20gJy4vZG9jcy1zaXRlLWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnbGluay1jaGVjaycgZnJvbSAnLi9saW5rLWNoZWNrLnRzJztcbmV4cG9ydCAqIGFzICdvZy1pbWFnZS1wYWdlJyBmcm9tICcuL29nLWltYWdlLXBhZ2UudHMnO1xuZXhwb3J0ICogYXMgJ29nLWltYWdlJyBmcm9tICcuL29nLWltYWdlLnRzJztcbmV4cG9ydCAqIGFzICdvZy1pbWFnZXMnIGZyb20gJy4vb2ctaW1hZ2VzLnRzJztcbmV4cG9ydCAqIGFzICdyZXBvLWhvbWVwYWdlJyBmcm9tICcuL3JlcG8taG9tZXBhZ2UudHMnO1xuZXhwb3J0ICogYXMgJ3JvdXRlLWRhdGEnIGZyb20gJy4vcm91dGUtZGF0YS50cyc7XG5leHBvcnQgKiBhcyAnc2F0dGVyaS1naXRodWItYWxlcnRzJyBmcm9tICcuL3NhdHRlcmktZ2l0aHViLWFsZXJ0cy50cyc7XG5leHBvcnQgKiBhcyAnc2F0dGVyaS1yZWxhdGl2ZS1saW5rcycgZnJvbSAnLi9zYXR0ZXJpLXJlbGF0aXZlLWxpbmtzLnRzJztcbmV4cG9ydCAqIGFzICd1bnJlbmRlcmVkLWFsZXJ0cycgZnJvbSAnLi91bnJlbmRlcmVkLWFsZXJ0cy50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQUVBLFlBQVlBLHVCQUF5QjtBQUNyQyxZQUFZQyw4QkFBZ0M7QUFDNUMsWUFBWUMsbUJBQXFCO0FBQ2pDLFlBQVlDLDRCQUE4QjtBQUMxQyxZQUFZQywyQkFBNkI7QUFDekMsWUFBWUMsNkJBQStCO0FBQzNDLFlBQVlDLDRCQUE4QjtBQUMxQyxZQUFZQyxzQkFBd0I7QUFDcEMsWUFBWUMsK0JBQWlDO0FBQzdDLFlBQVlDLHdCQUEwQjtBQUN0QyxZQUFZQywwQkFBNEI7QUFDeEMsWUFBWUMsbUJBQXFCO0FBQ2pDLFlBQVlDLGNBQWdCO0FBQzVCLFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZQyxnQkFBa0I7QUFDOUIsWUFBWUMsc0JBQXdCO0FBQ3BDLFlBQVlDLHdCQUEwQjtBQUN0QyxZQUFZQyxzQkFBd0I7QUFDcEMsWUFBWUMsZ0JBQWtCO0FBQzlCLFlBQVlDLG1CQUFxQjtBQUNqQyxZQUFZQyxjQUFnQjtBQUM1QixZQUFZQyxlQUFpQjtBQUM3QixZQUFZQyxtQkFBcUI7QUFDakMsWUFBWUMsZ0JBQWtCO0FBQzlCLFlBQVlDLDJCQUE2QjtBQUN6QyxZQUFZQyw0QkFBOEI7QUFDMUMsWUFBWUMsdUJBQXlCOyIsCiAgIm5hbWVzIjogWyJhcGktZG9jLWNvbnN0YW50cyIsICJhcGktZG9jLWRvY3VtZW50ZWQtZmlsZXMiLCAiYXBpLWRvYy1qc2RvYyIsICJhcGktZG9jLWxpbmstcmVuZGVyaW5nIiwgImFwaS1kb2MtcGFja2FnZS1zaXRlcyIsICJhcGktZG9jLXBhZ2UtZ2VuZXJhdGlvbiIsICJhcGktZG9jLXJvdXRlLXNlZ21lbnRzIiwgImFwaS1kb2Mtc2V0dGluZ3MiLCAiYXBpLWRvYy1zb3VyY2UtcHJvY2Vzc2luZyIsICJhcGktZG9jLXRleHQtdXRpbHMiLCAiYXBpLWRvYy10eXBlLW1lcmdpbmciLCAiYXBpLWRvYy10eXBlcyIsICJhcGktZG9jcyIsICJhc3Ryby1jb25maWciLCAiZG9jcy1saW5rcyIsICJkb2NzLXNpdGUtYXNzZXRzIiwgImRvY3Mtc2l0ZS1jb21tYW5kcyIsICJkb2NzLXNpdGUtY29uZmlnIiwgImxpbmstY2hlY2siLCAib2ctaW1hZ2UtcGFnZSIsICJvZy1pbWFnZSIsICJvZy1pbWFnZXMiLCAicmVwby1ob21lcGFnZSIsICJyb3V0ZS1kYXRhIiwgInNhdHRlcmktZ2l0aHViLWFsZXJ0cyIsICJzYXR0ZXJpLXJlbGF0aXZlLWxpbmtzIiwgInVucmVuZGVyZWQtYWxlcnRzIl0KfQo=
66
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RvY3Mtc2l0ZS9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdhcGktZG9jLWNvbnN0YW50cycgZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWRvYy1kb2N1bWVudGVkLWZpbGVzJyBmcm9tICcuL2FwaS1kb2MtZG9jdW1lbnRlZC1maWxlcy50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWRvYy1qc2RvYycgZnJvbSAnLi9hcGktZG9jLWpzZG9jLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jLWxpbmstcmVuZGVyaW5nJyBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuZXhwb3J0ICogYXMgJ2FwaS1kb2MtcGFja2FnZS1zaXRlcycgZnJvbSAnLi9hcGktZG9jLXBhY2thZ2Utc2l0ZXMudHMnO1xuZXhwb3J0ICogYXMgJ2FwaS1kb2MtcGFnZS1nZW5lcmF0aW9uJyBmcm9tICcuL2FwaS1kb2MtcGFnZS1nZW5lcmF0aW9uLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jLXJvdXRlLXNlZ21lbnRzJyBmcm9tICcuL2FwaS1kb2Mtcm91dGUtc2VnbWVudHMudHMnO1xuZXhwb3J0ICogYXMgJ2FwaS1kb2Mtc2V0dGluZ3MnIGZyb20gJy4vYXBpLWRvYy1zZXR0aW5ncy50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWRvYy1zb3VyY2UtcHJvY2Vzc2luZycgZnJvbSAnLi9hcGktZG9jLXNvdXJjZS1wcm9jZXNzaW5nLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jLXRleHQtdXRpbHMnIGZyb20gJy4vYXBpLWRvYy10ZXh0LXV0aWxzLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jLXR5cGUtbWVyZ2luZycgZnJvbSAnLi9hcGktZG9jLXR5cGUtbWVyZ2luZy50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWRvYy10eXBlcycgZnJvbSAnLi9hcGktZG9jLXR5cGVzLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jcycgZnJvbSAnLi9hcGktZG9jcy50cyc7XG5leHBvcnQgKiBhcyAnYXN0cm8tY29uZmlnJyBmcm9tICcuL2FzdHJvLWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnZG9jcy1saW5rcycgZnJvbSAnLi9kb2NzLWxpbmtzLnRzJztcbmV4cG9ydCAqIGFzICdkb2NzLXNpdGUtYXNzZXRzJyBmcm9tICcuL2RvY3Mtc2l0ZS1hc3NldHMudHMnO1xuZXhwb3J0ICogYXMgJ2RvY3Mtc2l0ZS1jb21tYW5kcycgZnJvbSAnLi9kb2NzLXNpdGUtY29tbWFuZHMudHMnO1xuZXhwb3J0ICogYXMgJ2RvY3Mtc2l0ZS1jb25maWcnIGZyb20gJy4vZG9jcy1zaXRlLWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnZG9jcy1zbmlwcGV0cycgZnJvbSAnLi9kb2NzLXNuaXBwZXRzLnRzJztcbmV4cG9ydCAqIGFzICdsaW5rLWNoZWNrJyBmcm9tICcuL2xpbmstY2hlY2sudHMnO1xuZXhwb3J0ICogYXMgJ29nLWltYWdlLXBhZ2UnIGZyb20gJy4vb2ctaW1hZ2UtcGFnZS50cyc7XG5leHBvcnQgKiBhcyAnb2ctaW1hZ2UnIGZyb20gJy4vb2ctaW1hZ2UudHMnO1xuZXhwb3J0ICogYXMgJ29nLWltYWdlcycgZnJvbSAnLi9vZy1pbWFnZXMudHMnO1xuZXhwb3J0ICogYXMgJ291dGRhdGVkLXJlZmVyZW5jZXMnIGZyb20gJy4vb3V0ZGF0ZWQtcmVmZXJlbmNlcy50cyc7XG5leHBvcnQgKiBhcyAncmVwby1ob21lcGFnZScgZnJvbSAnLi9yZXBvLWhvbWVwYWdlLnRzJztcbmV4cG9ydCAqIGFzICdyb3V0ZS1kYXRhJyBmcm9tICcuL3JvdXRlLWRhdGEudHMnO1xuZXhwb3J0ICogYXMgJ3NhdHRlcmktZ2l0aHViLWFsZXJ0cycgZnJvbSAnLi9zYXR0ZXJpLWdpdGh1Yi1hbGVydHMudHMnO1xuZXhwb3J0ICogYXMgJ3NhdHRlcmktcmVsYXRpdmUtbGlua3MnIGZyb20gJy4vc2F0dGVyaS1yZWxhdGl2ZS1saW5rcy50cyc7XG5leHBvcnQgKiBhcyAndW5yZW5kZXJlZC1hbGVydHMnIGZyb20gJy4vdW5yZW5kZXJlZC1hbGVydHMudHMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFFQSxZQUFZQSx1QkFBeUI7QUFDckMsWUFBWUMsOEJBQWdDO0FBQzVDLFlBQVlDLG1CQUFxQjtBQUNqQyxZQUFZQyw0QkFBOEI7QUFDMUMsWUFBWUMsMkJBQTZCO0FBQ3pDLFlBQVlDLDZCQUErQjtBQUMzQyxZQUFZQyw0QkFBOEI7QUFDMUMsWUFBWUMsc0JBQXdCO0FBQ3BDLFlBQVlDLCtCQUFpQztBQUM3QyxZQUFZQyx3QkFBMEI7QUFDdEMsWUFBWUMsMEJBQTRCO0FBQ3hDLFlBQVlDLG1CQUFxQjtBQUNqQyxZQUFZQyxjQUFnQjtBQUM1QixZQUFZQyxrQkFBb0I7QUFDaEMsWUFBWUMsZ0JBQWtCO0FBQzlCLFlBQVlDLHNCQUF3QjtBQUNwQyxZQUFZQyx3QkFBMEI7QUFDdEMsWUFBWUMsc0JBQXdCO0FBQ3BDLFlBQVlDLG1CQUFxQjtBQUNqQyxZQUFZQyxnQkFBa0I7QUFDOUIsWUFBWUMsbUJBQXFCO0FBQ2pDLFlBQVlDLGNBQWdCO0FBQzVCLFlBQVlDLGVBQWlCO0FBQzdCLFlBQVlDLHlCQUEyQjtBQUN2QyxZQUFZQyxtQkFBcUI7QUFDakMsWUFBWUMsZ0JBQWtCO0FBQzlCLFlBQVlDLDJCQUE2QjtBQUN6QyxZQUFZQyw0QkFBOEI7QUFDMUMsWUFBWUMsdUJBQXlCOyIsCiAgIm5hbWVzIjogWyJhcGktZG9jLWNvbnN0YW50cyIsICJhcGktZG9jLWRvY3VtZW50ZWQtZmlsZXMiLCAiYXBpLWRvYy1qc2RvYyIsICJhcGktZG9jLWxpbmstcmVuZGVyaW5nIiwgImFwaS1kb2MtcGFja2FnZS1zaXRlcyIsICJhcGktZG9jLXBhZ2UtZ2VuZXJhdGlvbiIsICJhcGktZG9jLXJvdXRlLXNlZ21lbnRzIiwgImFwaS1kb2Mtc2V0dGluZ3MiLCAiYXBpLWRvYy1zb3VyY2UtcHJvY2Vzc2luZyIsICJhcGktZG9jLXRleHQtdXRpbHMiLCAiYXBpLWRvYy10eXBlLW1lcmdpbmciLCAiYXBpLWRvYy10eXBlcyIsICJhcGktZG9jcyIsICJhc3Ryby1jb25maWciLCAiZG9jcy1saW5rcyIsICJkb2NzLXNpdGUtYXNzZXRzIiwgImRvY3Mtc2l0ZS1jb21tYW5kcyIsICJkb2NzLXNpdGUtY29uZmlnIiwgImRvY3Mtc25pcHBldHMiLCAibGluay1jaGVjayIsICJvZy1pbWFnZS1wYWdlIiwgIm9nLWltYWdlIiwgIm9nLWltYWdlcyIsICJvdXRkYXRlZC1yZWZlcmVuY2VzIiwgInJlcG8taG9tZXBhZ2UiLCAicm91dGUtZGF0YSIsICJzYXR0ZXJpLWdpdGh1Yi1hbGVydHMiLCAic2F0dGVyaS1yZWxhdGl2ZS1saW5rcyIsICJ1bnJlbmRlcmVkLWFsZXJ0cyJdCn0K
@@ -0,0 +1,72 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Finds references to the retired `obsidian-dev-utils` package that point a reader at something that no longer
6
+ * exists: one of its module paths, a link into its repository, or the legacy console recipe for the shared abort
7
+ * controller.
8
+ *
9
+ * The bare name `obsidian-dev-utils` is NOT flagged: `@mnaoumov/obsidian-lib` keeps it on purpose as a wire name (its
10
+ * debug namespace, CSS class and event prefix), and a migration note may name the package. What is flagged is the
11
+ * name used as an ADDRESS.
12
+ *
13
+ * Scanned, where present: `README.md`, the guides under `docs/src/content/docs` (not the generated API reference,
14
+ * which is rendered from the TSDoc this also scans), and every non-test `.ts` file under `src/` and `scripts/`.
15
+ * `CHANGELOG.md` is history and is not scanned. A line that names an old address on purpose, such as a migration
16
+ * note, carries `outdated-reference-ok` on that line.
17
+ */
18
+ /**
19
+ * The marker that allows an outdated reference on its line.
20
+ */
21
+ export declare const OUTDATED_REFERENCE_ALLOW_MARKER = "outdated-reference-ok";
22
+ /**
23
+ * An outdated reference found in a file.
24
+ */
25
+ export interface OutdatedReference {
26
+ /**
27
+ * The file's path, relative to the package root.
28
+ */
29
+ readonly filePath: string;
30
+ /**
31
+ * What to write instead.
32
+ */
33
+ readonly hint: string;
34
+ /**
35
+ * The 1-based line.
36
+ */
37
+ readonly line: number;
38
+ /**
39
+ * The line's text, trimmed.
40
+ */
41
+ readonly text: string;
42
+ }
43
+ /**
44
+ * Finds the outdated references in the package and throws when there is one, for a gate test or script.
45
+ *
46
+ * @param rootDirectory - The package root.
47
+ * @returns A promise that resolves when there is none.
48
+ * @throws {Error} Listing every reference, one per line.
49
+ */
50
+ export declare function assertNoOutdatedReferences(rootDirectory: string): Promise<void>;
51
+ /**
52
+ * Finds the outdated references in the package.
53
+ *
54
+ * @param rootDirectory - The package root.
55
+ * @returns The outdated references.
56
+ */
57
+ export declare function findOutdatedReferences(rootDirectory: string): Promise<OutdatedReference[]>;
58
+ /**
59
+ * Finds the outdated references in one file's text.
60
+ *
61
+ * @param filePath - The file's path, used in the result.
62
+ * @param text - The file's text.
63
+ * @returns The outdated references, in line order.
64
+ */
65
+ export declare function findOutdatedReferencesInText(filePath: string, text: string): OutdatedReference[];
66
+ /**
67
+ * Formats references one per line, as `path:line - text (hint)`.
68
+ *
69
+ * @param references - The references.
70
+ * @returns The formatted text.
71
+ */
72
+ export declare function formatOutdatedReferences(references: readonly OutdatedReference[]): string;
@@ -0,0 +1,96 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ import { existsSync } from "node:fs";
7
+ import {
8
+ readdir,
9
+ readFile
10
+ } from "node:fs/promises";
11
+ import {
12
+ join,
13
+ relative
14
+ } from "node:path";
15
+ const OUTDATED_REFERENCE_ALLOW_MARKER = "outdated-reference-ok";
16
+ const OUTDATED_REFERENCE_PATTERNS = [
17
+ {
18
+ hint: "a module path or repository link of the retired `obsidian-dev-utils` package; name the `@mnaoumov/*` package that has it now",
19
+ regExp: /obsidian-dev-utils\//u
20
+ },
21
+ {
22
+ hint: "an import of the retired `obsidian-dev-utils` package; import the `@mnaoumov/*` package that has it now",
23
+ regExp: /from\s+['"]obsidian-dev-utils['"]/u
24
+ },
25
+ {
26
+ hint: "the legacy `__obsidianDevUtils` console recipe; use `getSharedAbortController()` or the `Symbol.for('@mnaoumov/typescript-lib/state')` slot",
27
+ regExp: /__obsidianDevUtils\.sharedAbortController/u
28
+ }
29
+ ];
30
+ async function assertNoOutdatedReferences(rootDirectory) {
31
+ const references = await findOutdatedReferences(rootDirectory);
32
+ if (references.length > 0) {
33
+ throw new Error(`${String(references.length)} outdated reference(s):
34
+ ${formatOutdatedReferences(references)}`);
35
+ }
36
+ }
37
+ async function findOutdatedReferences(rootDirectory) {
38
+ const readmePath = join(rootDirectory, "README.md");
39
+ const files = [
40
+ ...existsSync(readmePath) ? [readmePath] : [],
41
+ ...await listFiles(join(rootDirectory, "docs", "src", "content", "docs"), (name) => /\.mdx?$/u.test(name), ["api"]),
42
+ ...await listFiles(join(rootDirectory, "src"), isScannedSource, []),
43
+ ...await listFiles(join(rootDirectory, "scripts"), isScannedSource, [])
44
+ ];
45
+ const references = [];
46
+ for (const file of files) {
47
+ references.push(...findOutdatedReferencesInText(relative(rootDirectory, file).replaceAll("\\", "/"), await readFile(file, "utf-8")));
48
+ }
49
+ return references;
50
+ }
51
+ function findOutdatedReferencesInText(filePath, text) {
52
+ const references = [];
53
+ for (const [index, line] of text.split(/\r?\n/u).entries()) {
54
+ if (line.includes(OUTDATED_REFERENCE_ALLOW_MARKER)) {
55
+ continue;
56
+ }
57
+ for (const pattern of OUTDATED_REFERENCE_PATTERNS) {
58
+ if (pattern.regExp.test(line)) {
59
+ references.push({ filePath, hint: pattern.hint, line: index + 1, text: line.trim() });
60
+ break;
61
+ }
62
+ }
63
+ }
64
+ return references;
65
+ }
66
+ function formatOutdatedReferences(references) {
67
+ return references.map((reference) => `${reference.filePath}:${String(reference.line)} - ${reference.text} (${reference.hint})`).join("\n");
68
+ }
69
+ function isScannedSource(name) {
70
+ return name.endsWith(".ts") && !name.endsWith(".d.ts") && !name.endsWith(".test.ts") && name !== "__merged.ts";
71
+ }
72
+ async function listFiles(directory, isIncluded, excludedDirectories) {
73
+ const files = [];
74
+ if (!existsSync(directory)) {
75
+ return files;
76
+ }
77
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
78
+ const entryPath = join(directory, entry.name);
79
+ if (entry.isDirectory()) {
80
+ if (!excludedDirectories.includes(entry.name)) {
81
+ files.push(...await listFiles(entryPath, isIncluded, excludedDirectories));
82
+ }
83
+ } else if (isIncluded(entry.name)) {
84
+ files.push(entryPath);
85
+ }
86
+ }
87
+ return files.sort();
88
+ }
89
+ export {
90
+ OUTDATED_REFERENCE_ALLOW_MARKER,
91
+ assertNoOutdatedReferences,
92
+ findOutdatedReferences,
93
+ findOutdatedReferencesInText,
94
+ formatOutdatedReferences
95
+ };
96
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RvY3Mtc2l0ZS9vdXRkYXRlZC1yZWZlcmVuY2VzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmluZHMgcmVmZXJlbmNlcyB0byB0aGUgcmV0aXJlZCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBwYWNrYWdlIHRoYXQgcG9pbnQgYSByZWFkZXIgYXQgc29tZXRoaW5nIHRoYXQgbm8gbG9uZ2VyXG4gKiBleGlzdHM6IG9uZSBvZiBpdHMgbW9kdWxlIHBhdGhzLCBhIGxpbmsgaW50byBpdHMgcmVwb3NpdG9yeSwgb3IgdGhlIGxlZ2FjeSBjb25zb2xlIHJlY2lwZSBmb3IgdGhlIHNoYXJlZCBhYm9ydFxuICogY29udHJvbGxlci5cbiAqXG4gKiBUaGUgYmFyZSBuYW1lIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGlzIE5PVCBmbGFnZ2VkOiBgQG1uYW91bW92L29ic2lkaWFuLWxpYmAga2VlcHMgaXQgb24gcHVycG9zZSBhcyBhIHdpcmUgbmFtZSAoaXRzXG4gKiBkZWJ1ZyBuYW1lc3BhY2UsIENTUyBjbGFzcyBhbmQgZXZlbnQgcHJlZml4KSwgYW5kIGEgbWlncmF0aW9uIG5vdGUgbWF5IG5hbWUgdGhlIHBhY2thZ2UuIFdoYXQgaXMgZmxhZ2dlZCBpcyB0aGVcbiAqIG5hbWUgdXNlZCBhcyBhbiBBRERSRVNTLlxuICpcbiAqIFNjYW5uZWQsIHdoZXJlIHByZXNlbnQ6IGBSRUFETUUubWRgLCB0aGUgZ3VpZGVzIHVuZGVyIGBkb2NzL3NyYy9jb250ZW50L2RvY3NgIChub3QgdGhlIGdlbmVyYXRlZCBBUEkgcmVmZXJlbmNlLFxuICogd2hpY2ggaXMgcmVuZGVyZWQgZnJvbSB0aGUgVFNEb2MgdGhpcyBhbHNvIHNjYW5zKSwgYW5kIGV2ZXJ5IG5vbi10ZXN0IGAudHNgIGZpbGUgdW5kZXIgYHNyYy9gIGFuZCBgc2NyaXB0cy9gLlxuICogYENIQU5HRUxPRy5tZGAgaXMgaGlzdG9yeSBhbmQgaXMgbm90IHNjYW5uZWQuIEEgbGluZSB0aGF0IG5hbWVzIGFuIG9sZCBhZGRyZXNzIG9uIHB1cnBvc2UsIHN1Y2ggYXMgYSBtaWdyYXRpb25cbiAqIG5vdGUsIGNhcnJpZXMgYG91dGRhdGVkLXJlZmVyZW5jZS1va2Agb24gdGhhdCBsaW5lLlxuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIHJlYWRkaXIsXG4gIHJlYWRGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBUaGUgbWFya2VyIHRoYXQgYWxsb3dzIGFuIG91dGRhdGVkIHJlZmVyZW5jZSBvbiBpdHMgbGluZS5cbiAqL1xuZXhwb3J0IGNvbnN0IE9VVERBVEVEX1JFRkVSRU5DRV9BTExPV19NQVJLRVIgPSAnb3V0ZGF0ZWQtcmVmZXJlbmNlLW9rJztcblxuaW50ZXJmYWNlIE91dGRhdGVkUmVmZXJlbmNlUGF0dGVybiB7XG4gIHJlYWRvbmx5IGhpbnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVnRXhwOiBSZWdFeHA7XG59XG5cbmNvbnN0IE9VVERBVEVEX1JFRkVSRU5DRV9QQVRURVJOUzogcmVhZG9ubHkgT3V0ZGF0ZWRSZWZlcmVuY2VQYXR0ZXJuW10gPSBbXG4gIHtcbiAgICBoaW50OiAnYSBtb2R1bGUgcGF0aCBvciByZXBvc2l0b3J5IGxpbmsgb2YgdGhlIHJldGlyZWQgYG9ic2lkaWFuLWRldi11dGlsc2AgcGFja2FnZTsgbmFtZSB0aGUgYEBtbmFvdW1vdi8qYCBwYWNrYWdlIHRoYXQgaGFzIGl0IG5vdycsXG4gICAgcmVnRXhwOiAvb2JzaWRpYW4tZGV2LXV0aWxzXFwvL3VcbiAgfSxcbiAge1xuICAgIGhpbnQ6ICdhbiBpbXBvcnQgb2YgdGhlIHJldGlyZWQgYG9ic2lkaWFuLWRldi11dGlsc2AgcGFja2FnZTsgaW1wb3J0IHRoZSBgQG1uYW91bW92LypgIHBhY2thZ2UgdGhhdCBoYXMgaXQgbm93JyxcbiAgICByZWdFeHA6IC9mcm9tXFxzK1snXCJdb2JzaWRpYW4tZGV2LXV0aWxzWydcIl0vdVxuICB9LFxuICB7XG4gICAgaGludDogJ3RoZSBsZWdhY3kgYF9fb2JzaWRpYW5EZXZVdGlsc2AgY29uc29sZSByZWNpcGU7IHVzZSBgZ2V0U2hhcmVkQWJvcnRDb250cm9sbGVyKClgIG9yIHRoZSBgU3ltYm9sLmZvcihcXCdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RhdGVcXCcpYCBzbG90JyxcbiAgICByZWdFeHA6IC9fX29ic2lkaWFuRGV2VXRpbHNcXC5zaGFyZWRBYm9ydENvbnRyb2xsZXIvdVxuICB9XG5dO1xuXG4vKipcbiAqIEFuIG91dGRhdGVkIHJlZmVyZW5jZSBmb3VuZCBpbiBhIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3V0ZGF0ZWRSZWZlcmVuY2Uge1xuICAvKipcbiAgICogVGhlIGZpbGUncyBwYXRoLCByZWxhdGl2ZSB0byB0aGUgcGFja2FnZSByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogV2hhdCB0byB3cml0ZSBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgaGludDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgMS1iYXNlZCBsaW5lLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSdzIHRleHQsIHRyaW1tZWQuXG4gICAqL1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIG91dGRhdGVkIHJlZmVyZW5jZXMgaW4gdGhlIHBhY2thZ2UgYW5kIHRocm93cyB3aGVuIHRoZXJlIGlzIG9uZSwgZm9yIGEgZ2F0ZSB0ZXN0IG9yIHNjcmlwdC5cbiAqXG4gKiBAcGFyYW0gcm9vdERpcmVjdG9yeSAtIFRoZSBwYWNrYWdlIHJvb3QuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZXJlIGlzIG5vbmUuXG4gKiBAdGhyb3dzIHtFcnJvcn0gTGlzdGluZyBldmVyeSByZWZlcmVuY2UsIG9uZSBwZXIgbGluZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydE5vT3V0ZGF0ZWRSZWZlcmVuY2VzKHJvb3REaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWZlcmVuY2VzID0gYXdhaXQgZmluZE91dGRhdGVkUmVmZXJlbmNlcyhyb290RGlyZWN0b3J5KTtcbiAgaWYgKHJlZmVyZW5jZXMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtTdHJpbmcocmVmZXJlbmNlcy5sZW5ndGgpfSBvdXRkYXRlZCByZWZlcmVuY2Uocyk6XFxuJHtmb3JtYXRPdXRkYXRlZFJlZmVyZW5jZXMocmVmZXJlbmNlcyl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgb3V0ZGF0ZWQgcmVmZXJlbmNlcyBpbiB0aGUgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0gcm9vdERpcmVjdG9yeSAtIFRoZSBwYWNrYWdlIHJvb3QuXG4gKiBAcmV0dXJucyBUaGUgb3V0ZGF0ZWQgcmVmZXJlbmNlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRPdXRkYXRlZFJlZmVyZW5jZXMocm9vdERpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxPdXRkYXRlZFJlZmVyZW5jZVtdPiB7XG4gIGNvbnN0IHJlYWRtZVBhdGggPSBqb2luKHJvb3REaXJlY3RvcnksICdSRUFETUUubWQnKTtcbiAgY29uc3QgZmlsZXMgPSBbXG4gICAgLi4uZXhpc3RzU3luYyhyZWFkbWVQYXRoKSA/IFtyZWFkbWVQYXRoXSA6IFtdLFxuICAgIC4uLmF3YWl0IGxpc3RGaWxlcyhqb2luKHJvb3REaXJlY3RvcnksICdkb2NzJywgJ3NyYycsICdjb250ZW50JywgJ2RvY3MnKSwgKG5hbWUpID0+IC9cXC5tZHg/JC91LnRlc3QobmFtZSksIFsnYXBpJ10pLFxuICAgIC4uLmF3YWl0IGxpc3RGaWxlcyhqb2luKHJvb3REaXJlY3RvcnksICdzcmMnKSwgaXNTY2FubmVkU291cmNlLCBbXSksXG4gICAgLi4uYXdhaXQgbGlzdEZpbGVzKGpvaW4ocm9vdERpcmVjdG9yeSwgJ3NjcmlwdHMnKSwgaXNTY2FubmVkU291cmNlLCBbXSlcbiAgXTtcbiAgY29uc3QgcmVmZXJlbmNlczogT3V0ZGF0ZWRSZWZlcmVuY2VbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICByZWZlcmVuY2VzLnB1c2goLi4uZmluZE91dGRhdGVkUmVmZXJlbmNlc0luVGV4dChyZWxhdGl2ZShyb290RGlyZWN0b3J5LCBmaWxlKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKSwgYXdhaXQgcmVhZEZpbGUoZmlsZSwgJ3V0Zi04JykpKTtcbiAgfVxuICByZXR1cm4gcmVmZXJlbmNlcztcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgb3V0ZGF0ZWQgcmVmZXJlbmNlcyBpbiBvbmUgZmlsZSdzIHRleHQuXG4gKlxuICogQHBhcmFtIGZpbGVQYXRoIC0gVGhlIGZpbGUncyBwYXRoLCB1c2VkIGluIHRoZSByZXN1bHQuXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSBmaWxlJ3MgdGV4dC5cbiAqIEByZXR1cm5zIFRoZSBvdXRkYXRlZCByZWZlcmVuY2VzLCBpbiBsaW5lIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE91dGRhdGVkUmVmZXJlbmNlc0luVGV4dChmaWxlUGF0aDogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpOiBPdXRkYXRlZFJlZmVyZW5jZVtdIHtcbiAgY29uc3QgcmVmZXJlbmNlczogT3V0ZGF0ZWRSZWZlcmVuY2VbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbGluZV0gb2YgdGV4dC5zcGxpdCgvXFxyP1xcbi91KS5lbnRyaWVzKCkpIHtcbiAgICBpZiAobGluZS5pbmNsdWRlcyhPVVREQVRFRF9SRUZFUkVOQ0VfQUxMT1dfTUFSS0VSKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBPVVREQVRFRF9SRUZFUkVOQ0VfUEFUVEVSTlMpIHtcbiAgICAgIGlmIChwYXR0ZXJuLnJlZ0V4cC50ZXN0KGxpbmUpKSB7XG4gICAgICAgIHJlZmVyZW5jZXMucHVzaCh7IGZpbGVQYXRoLCBoaW50OiBwYXR0ZXJuLmhpbnQsIGxpbmU6IGluZGV4ICsgMSwgdGV4dDogbGluZS50cmltKCkgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVmZXJlbmNlcztcbn1cblxuLyoqXG4gKiBGb3JtYXRzIHJlZmVyZW5jZXMgb25lIHBlciBsaW5lLCBhcyBgcGF0aDpsaW5lIC0gdGV4dCAoaGludClgLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2VzIC0gVGhlIHJlZmVyZW5jZXMuXG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIHRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRPdXRkYXRlZFJlZmVyZW5jZXMocmVmZXJlbmNlczogcmVhZG9ubHkgT3V0ZGF0ZWRSZWZlcmVuY2VbXSk6IHN0cmluZyB7XG4gIHJldHVybiByZWZlcmVuY2VzLm1hcCgocmVmZXJlbmNlKSA9PiBgJHtyZWZlcmVuY2UuZmlsZVBhdGh9OiR7U3RyaW5nKHJlZmVyZW5jZS5saW5lKX0gLSAke3JlZmVyZW5jZS50ZXh0fSAoJHtyZWZlcmVuY2UuaGludH0pYCkuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGlzU2Nhbm5lZFNvdXJjZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoJy50cycpICYmICFuYW1lLmVuZHNXaXRoKCcuZC50cycpICYmICFuYW1lLmVuZHNXaXRoKCcudGVzdC50cycpICYmIG5hbWUgIT09ICdfX21lcmdlZC50cyc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3RGaWxlcyhkaXJlY3Rvcnk6IHN0cmluZywgaXNJbmNsdWRlZDogKG5hbWU6IHN0cmluZykgPT4gYm9vbGVhbiwgZXhjbHVkZWREaXJlY3RvcmllczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoIWV4aXN0c1N5bmMoZGlyZWN0b3J5KSkge1xuICAgIHJldHVybiBmaWxlcztcbiAgfVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGF3YWl0IHJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBjb25zdCBlbnRyeVBhdGggPSBqb2luKGRpcmVjdG9yeSwgZW50cnkubmFtZSk7XG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGlmICghZXhjbHVkZWREaXJlY3Rvcmllcy5pbmNsdWRlcyhlbnRyeS5uYW1lKSkge1xuICAgICAgICBmaWxlcy5wdXNoKC4uLmF3YWl0IGxpc3RGaWxlcyhlbnRyeVBhdGgsIGlzSW5jbHVkZWQsIGV4Y2x1ZGVkRGlyZWN0b3JpZXMpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzSW5jbHVkZWQoZW50cnkubmFtZSkpIHtcbiAgICAgIGZpbGVzLnB1c2goZW50cnlQYXRoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbGVzLnNvcnQoKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBaUJBLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFLQSxNQUFNLGtDQUFrQztBQU8vQyxNQUFNLDhCQUFtRTtBQUFBLEVBQ3ZFO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsRUFDVjtBQUFBLEVBQ0E7QUFBQSxJQUNFLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxFQUNWO0FBQUEsRUFDQTtBQUFBLElBQ0UsTUFBTTtBQUFBLElBQ04sUUFBUTtBQUFBLEVBQ1Y7QUFDRjtBQWtDQSxlQUFzQiwyQkFBMkIsZUFBc0M7QUFDckYsUUFBTSxhQUFhLE1BQU0sdUJBQXVCLGFBQWE7QUFDN0QsTUFBSSxXQUFXLFNBQVMsR0FBRztBQUN6QixVQUFNLElBQUksTUFBTSxHQUFHLE9BQU8sV0FBVyxNQUFNLENBQUM7QUFBQSxFQUE0Qix5QkFBeUIsVUFBVSxDQUFDLEVBQUU7QUFBQSxFQUNoSDtBQUNGO0FBUUEsZUFBc0IsdUJBQXVCLGVBQXFEO0FBQ2hHLFFBQU0sYUFBYSxLQUFLLGVBQWUsV0FBVztBQUNsRCxRQUFNLFFBQVE7QUFBQSxJQUNaLEdBQUcsV0FBVyxVQUFVLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQztBQUFBLElBQzVDLEdBQUcsTUFBTSxVQUFVLEtBQUssZUFBZSxRQUFRLE9BQU8sV0FBVyxNQUFNLEdBQUcsQ0FBQyxTQUFTLFdBQVcsS0FBSyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFBQSxJQUNsSCxHQUFHLE1BQU0sVUFBVSxLQUFLLGVBQWUsS0FBSyxHQUFHLGlCQUFpQixDQUFDLENBQUM7QUFBQSxJQUNsRSxHQUFHLE1BQU0sVUFBVSxLQUFLLGVBQWUsU0FBUyxHQUFHLGlCQUFpQixDQUFDLENBQUM7QUFBQSxFQUN4RTtBQUNBLFFBQU0sYUFBa0MsQ0FBQztBQUN6QyxhQUFXLFFBQVEsT0FBTztBQUN4QixlQUFXLEtBQUssR0FBRyw2QkFBNkIsU0FBUyxlQUFlLElBQUksRUFBRSxXQUFXLE1BQU0sR0FBRyxHQUFHLE1BQU0sU0FBUyxNQUFNLE9BQU8sQ0FBQyxDQUFDO0FBQUEsRUFDckk7QUFDQSxTQUFPO0FBQ1Q7QUFTTyxTQUFTLDZCQUE2QixVQUFrQixNQUFtQztBQUNoRyxRQUFNLGFBQWtDLENBQUM7QUFDekMsYUFBVyxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssTUFBTSxRQUFRLEVBQUUsUUFBUSxHQUFHO0FBQzFELFFBQUksS0FBSyxTQUFTLCtCQUErQixHQUFHO0FBQ2xEO0FBQUEsSUFDRjtBQUNBLGVBQVcsV0FBVyw2QkFBNkI7QUFDakQsVUFBSSxRQUFRLE9BQU8sS0FBSyxJQUFJLEdBQUc7QUFDN0IsbUJBQVcsS0FBSyxFQUFFLFVBQVUsTUFBTSxRQUFRLE1BQU0sTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO0FBQ3BGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBUU8sU0FBUyx5QkFBeUIsWUFBa0Q7QUFDekYsU0FBTyxXQUFXLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxRQUFRLElBQUksT0FBTyxVQUFVLElBQUksQ0FBQyxNQUFNLFVBQVUsSUFBSSxLQUFLLFVBQVUsSUFBSSxHQUFHLEVBQUUsS0FBSyxJQUFJO0FBQzNJO0FBRUEsU0FBUyxnQkFBZ0IsTUFBdUI7QUFDOUMsU0FBTyxLQUFLLFNBQVMsS0FBSyxLQUFLLENBQUMsS0FBSyxTQUFTLE9BQU8sS0FBSyxDQUFDLEtBQUssU0FBUyxVQUFVLEtBQUssU0FBUztBQUNuRztBQUVBLGVBQWUsVUFBVSxXQUFtQixZQUF1QyxxQkFBMkQ7QUFDNUksUUFBTSxRQUFrQixDQUFDO0FBQ3pCLE1BQUksQ0FBQyxXQUFXLFNBQVMsR0FBRztBQUMxQixXQUFPO0FBQUEsRUFDVDtBQUNBLGFBQVcsU0FBUyxNQUFNLFFBQVEsV0FBVyxFQUFFLGVBQWUsS0FBSyxDQUFDLEdBQUc7QUFDckUsVUFBTSxZQUFZLEtBQUssV0FBVyxNQUFNLElBQUk7QUFDNUMsUUFBSSxNQUFNLFlBQVksR0FBRztBQUN2QixVQUFJLENBQUMsb0JBQW9CLFNBQVMsTUFBTSxJQUFJLEdBQUc7QUFDN0MsY0FBTSxLQUFLLEdBQUcsTUFBTSxVQUFVLFdBQVcsWUFBWSxtQkFBbUIsQ0FBQztBQUFBLE1BQzNFO0FBQUEsSUFDRixXQUFXLFdBQVcsTUFBTSxJQUFJLEdBQUc7QUFDakMsWUFBTSxLQUFLLFNBQVM7QUFBQSxJQUN0QjtBQUFBLEVBQ0Y7QUFDQSxTQUFPLE1BQU0sS0FBSztBQUNwQjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../dist/lib/cjs/docs-site/docs-snippets.cjs",
3
+ "module": "../../dist/lib/esm/docs-site/docs-snippets.mjs",
4
+ "type": "module",
5
+ "types": "../../dist/lib/cjs/docs-site/docs-snippets.d.cts"
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../dist/lib/cjs/docs-site/outdated-references.cjs",
3
+ "module": "../../dist/lib/esm/docs-site/outdated-references.mjs",
4
+ "type": "module",
5
+ "types": "../../dist/lib/cjs/docs-site/outdated-references.d.cts"
6
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mnaoumov/typescript-dev-toolkit",
3
- "version": "3.6.4",
3
+ "version": "3.7.0",
4
4
  "description": "Generic TypeScript project tooling: build, lint, format, spellcheck, test, gate and release scripts.",
5
5
  "keywords": [
6
6
  "typescript",
@@ -262,6 +262,7 @@
262
262
  "build:validate-dependencies": "jiti scripts/build-validate-dependencies.ts",
263
263
  "commit": "jiti scripts/commit.ts",
264
264
  "docs:build": "jiti scripts/docs-build.ts",
265
+ "docs:check-snippets": "jiti scripts/docs-check-snippets.ts",
265
266
  "docs:dev": "jiti scripts/docs-dev.ts",
266
267
  "docs:preview": "jiti scripts/docs-preview.ts",
267
268
  "find-overexposed": "jiti scripts/find-overexposed.ts",