@mnaoumov/obsidian-dev-toolkit 1.0.0 → 1.1.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.
- package/README.md +9 -1
- package/dist/demo-vault-helper/main.js +499 -17
- package/dist/integration-test-plugin/main.js +11251 -2472
- package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +9 -22
- package/dist/lib/cjs/bundlers/esbuild-impl/dependency.cjs +9 -22
- package/dist/lib/cjs/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +9 -22
- package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +9 -22
- package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +9 -22
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +9 -22
- package/dist/lib/cjs/bundlers/esbuild-impl/rename-css-plugin.cjs +9 -22
- package/dist/lib/cjs/bundlers/esbuild.cjs +9 -22
- package/dist/lib/cjs/bundlers/index.cjs +9 -22
- package/dist/lib/cjs/demo-vault-app-json.cjs +9 -22
- package/dist/lib/cjs/demo-vault-buttons.cjs +9 -22
- package/dist/lib/cjs/demo-vault-buttons.d.cts +7 -7
- package/dist/lib/cjs/demo-vault-coverage.cjs +11 -23
- package/dist/lib/cjs/demo-vault.cjs +9 -22
- package/dist/lib/cjs/formatters/dprint.cjs +9 -22
- package/dist/lib/cjs/formatters/index.cjs +9 -22
- package/dist/lib/cjs/index.cjs +9 -22
- package/dist/lib/cjs/integration-test-setup.cjs +9 -22
- package/dist/lib/cjs/integration-test-vitest-global-setup.cjs +9 -22
- package/dist/lib/cjs/jest-setup.cjs +9 -22
- package/dist/lib/cjs/linters/eslint-config.cjs +60 -22
- package/dist/lib/cjs/linters/eslint-rules/index.cjs +23 -24
- package/dist/lib/cjs/linters/eslint-rules/index.d.cts +4 -0
- package/dist/lib/cjs/linters/eslint-rules/manifest-description.cjs +9 -22
- package/dist/lib/cjs/linters/eslint-rules/manifest-helpers.cjs +9 -22
- package/dist/lib/cjs/linters/eslint-rules/manifest-id.cjs +9 -22
- package/dist/lib/cjs/linters/eslint-rules/manifest-name.cjs +9 -22
- package/dist/lib/cjs/linters/eslint-rules/manifest-schema.cjs +9 -22
- package/dist/lib/cjs/linters/eslint-rules/no-local-obsidian-internals.cjs +259 -0
- package/dist/lib/cjs/linters/eslint-rules/no-local-obsidian-internals.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.cjs +9 -22
- package/dist/lib/cjs/linters/eslint-rules/no-untrusted-input-events.cjs +9 -22
- package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +18 -23
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code-in-ui.cjs +263 -0
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code-in-ui.d.cts +30 -0
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code.cjs +215 -0
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code.d.cts +29 -0
- package/dist/lib/cjs/linters/eslint-rules/require-component-suffix.cjs +9 -22
- package/dist/lib/cjs/linters/eslint-rules/require-plugin-api-contract-schemas.cjs +306 -0
- package/dist/lib/cjs/linters/eslint-rules/require-plugin-api-contract-schemas.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint.cjs +9 -22
- package/dist/lib/cjs/linters/index.cjs +20 -24
- package/dist/lib/cjs/linters/index.d.cts +3 -0
- package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +171 -0
- package/dist/lib/cjs/linters/markdownlint-cli2-config.d.cts +12 -0
- package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +164 -0
- package/dist/lib/cjs/linters/markdownlint-rules/index.d.cts +2 -0
- package/dist/lib/cjs/linters/markdownlint-rules/plugin-name-as-code.cjs +246 -0
- package/dist/lib/cjs/linters/markdownlint-rules/plugin-name-as-code.d.cts +32 -0
- package/dist/lib/cjs/linters/markdownlint.cjs +9 -22
- package/dist/lib/cjs/linters/obsidianmd-rule-custom-message.cjs +9 -22
- package/dist/lib/cjs/linters/plugin-names.cjs +249 -0
- package/dist/lib/cjs/linters/plugin-names.d.cts +81 -0
- package/dist/lib/cjs/obsidian-plugin-repo-paths.cjs +9 -22
- package/dist/lib/cjs/setup.cjs +9 -22
- package/dist/lib/cjs/templates.cjs +9 -22
- package/dist/lib/cjs/test-runners/index.cjs +9 -22
- package/dist/lib/cjs/test-runners/integration-test-plugin.cjs +9 -22
- package/dist/lib/cjs/test-runners/performance-eval-cap.cjs +9 -22
- package/dist/lib/cjs/test-runners/stale-build-global-setup.cjs +9 -22
- package/dist/lib/cjs/test-runners/vitest-config.cjs +9 -22
- package/dist/lib/cjs/version.cjs +9 -22
- package/dist/lib/cjs/vitest-setup.cjs +9 -22
- package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +6 -14
- package/dist/lib/esm/bundlers/esbuild-impl/dependency.mjs +6 -14
- package/dist/lib/esm/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +6 -14
- package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +6 -14
- package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +6 -14
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +6 -14
- package/dist/lib/esm/bundlers/esbuild-impl/rename-css-plugin.mjs +6 -14
- package/dist/lib/esm/bundlers/esbuild.mjs +6 -14
- package/dist/lib/esm/bundlers/index.mjs +6 -14
- package/dist/lib/esm/demo-vault-app-json.mjs +6 -14
- package/dist/lib/esm/demo-vault-buttons.d.mts +7 -7
- package/dist/lib/esm/demo-vault-buttons.mjs +6 -14
- package/dist/lib/esm/demo-vault-coverage.mjs +8 -15
- package/dist/lib/esm/demo-vault.mjs +6 -14
- package/dist/lib/esm/formatters/dprint.mjs +6 -14
- package/dist/lib/esm/formatters/index.mjs +6 -14
- package/dist/lib/esm/index.mjs +6 -14
- package/dist/lib/esm/integration-test-setup.mjs +6 -14
- package/dist/lib/esm/integration-test-vitest-global-setup.mjs +6 -14
- package/dist/lib/esm/jest-setup.mjs +6 -14
- package/dist/lib/esm/linters/eslint-config.mjs +57 -14
- package/dist/lib/esm/linters/eslint-rules/index.d.mts +4 -0
- package/dist/lib/esm/linters/eslint-rules/index.mjs +15 -15
- package/dist/lib/esm/linters/eslint-rules/manifest-description.mjs +6 -14
- package/dist/lib/esm/linters/eslint-rules/manifest-helpers.mjs +6 -14
- package/dist/lib/esm/linters/eslint-rules/manifest-id.mjs +6 -14
- package/dist/lib/esm/linters/eslint-rules/manifest-name.mjs +6 -14
- package/dist/lib/esm/linters/eslint-rules/manifest-schema.mjs +6 -14
- package/dist/lib/esm/linters/eslint-rules/no-local-obsidian-internals.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/no-local-obsidian-internals.mjs +150 -0
- package/dist/lib/esm/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.mjs +6 -14
- package/dist/lib/esm/linters/eslint-rules/no-untrusted-input-events.mjs +6 -14
- package/dist/lib/esm/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +15 -15
- package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code-in-ui.d.mts +30 -0
- package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code-in-ui.mjs +157 -0
- package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code.d.mts +29 -0
- package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code.mjs +108 -0
- package/dist/lib/esm/linters/eslint-rules/require-component-suffix.mjs +6 -14
- package/dist/lib/esm/linters/eslint-rules/require-plugin-api-contract-schemas.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/require-plugin-api-contract-schemas.mjs +197 -0
- package/dist/lib/esm/linters/eslint.mjs +6 -14
- package/dist/lib/esm/linters/index.d.mts +3 -0
- package/dist/lib/esm/linters/index.mjs +13 -15
- package/dist/lib/esm/linters/markdownlint-cli2-config.d.mts +12 -0
- package/dist/lib/esm/linters/markdownlint-cli2-config.mjs +66 -0
- package/dist/lib/esm/linters/markdownlint-rules/index.d.mts +2 -0
- package/dist/lib/esm/linters/markdownlint-rules/index.mjs +46 -0
- package/dist/lib/esm/linters/markdownlint-rules/plugin-name-as-code.d.mts +32 -0
- package/dist/lib/esm/linters/markdownlint-rules/plugin-name-as-code.mjs +130 -0
- package/dist/lib/esm/linters/markdownlint.mjs +6 -14
- package/dist/lib/esm/linters/obsidianmd-rule-custom-message.mjs +6 -14
- package/dist/lib/esm/linters/plugin-names.d.mts +81 -0
- package/dist/lib/esm/linters/plugin-names.mjs +141 -0
- package/dist/lib/esm/obsidian-plugin-repo-paths.mjs +6 -14
- package/dist/lib/esm/setup.mjs +6 -14
- package/dist/lib/esm/templates.mjs +6 -14
- package/dist/lib/esm/test-runners/index.mjs +6 -14
- package/dist/lib/esm/test-runners/integration-test-plugin.mjs +6 -14
- package/dist/lib/esm/test-runners/performance-eval-cap.mjs +6 -14
- package/dist/lib/esm/test-runners/stale-build-global-setup.mjs +6 -14
- package/dist/lib/esm/test-runners/vitest-config.mjs +6 -14
- package/dist/lib/esm/version.mjs +6 -14
- package/dist/lib/esm/vitest-setup.mjs +6 -14
- package/dist/templates/scripts/markdownlint-cli2-config.ts +2 -2
- package/linters/eslint-rules/no-local-obsidian-internals/package.json +6 -0
- package/linters/eslint-rules/plugin-name-as-code/package.json +6 -0
- package/linters/eslint-rules/plugin-name-as-code-in-ui/package.json +6 -0
- package/linters/eslint-rules/require-plugin-api-contract-schemas/package.json +6 -0
- package/linters/markdownlint-cli2-config/package.json +6 -0
- package/linters/markdownlint-rules/index/package.json +6 -0
- package/linters/markdownlint-rules/package.json +6 -0
- package/linters/markdownlint-rules/plugin-name-as-code/package.json +6 -0
- package/linters/plugin-names/package.json +6 -0
- package/package.json +84 -23
|
@@ -0,0 +1,150 @@
|
|
|
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
|
+
(function () {
|
|
7
|
+
function ensureDisposeSymbols(symbolConstructor = Symbol) {
|
|
8
|
+
symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
|
|
9
|
+
symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function ensureBrowserProcess() {
|
|
13
|
+
const browserProcess = {
|
|
14
|
+
browser: true,
|
|
15
|
+
cwd() {
|
|
16
|
+
return "/";
|
|
17
|
+
},
|
|
18
|
+
env: {},
|
|
19
|
+
platform: "android"
|
|
20
|
+
};
|
|
21
|
+
const existingProcess = globalThis.process;
|
|
22
|
+
if (!existingProcess) {
|
|
23
|
+
globalThis.process = browserProcess;
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (existingProcess.versions?.node) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const existingProcessRecord = existingProcess;
|
|
30
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
31
|
+
existingProcessRecord[key] ??= value;
|
|
32
|
+
}
|
|
33
|
+
existingProcessRecord["browser"] = true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
(function initEsm() {
|
|
37
|
+
ensureDisposeSymbols();
|
|
38
|
+
ensureBrowserProcess();
|
|
39
|
+
})();
|
|
40
|
+
})();
|
|
41
|
+
|
|
42
|
+
import { toTSESTreeNode } from "@mnaoumov/typescript-dev-toolkit/linters/eslint-rules/ts-estree-node";
|
|
43
|
+
import { AST_NODE_TYPES } from "@typescript-eslint/utils";
|
|
44
|
+
const MESSAGE_ID = "noLocalObsidianInternals";
|
|
45
|
+
const OBSIDIAN_MODULE_NAME = "obsidian";
|
|
46
|
+
const EVENT_METHOD_NAMES = /* @__PURE__ */ new Set(["off", "on", "trigger", "tryTrigger"]);
|
|
47
|
+
const noLocalObsidianInternals = {
|
|
48
|
+
create(context) {
|
|
49
|
+
return {
|
|
50
|
+
"TSModuleDeclaration"(node) {
|
|
51
|
+
const moduleNode = toTSESTreeNode(node);
|
|
52
|
+
if (moduleNode.id.type !== AST_NODE_TYPES.Literal || moduleNode.id.value !== OBSIDIAN_MODULE_NAME || !moduleNode.body) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const isStringLiteralType = createStringLiteralTypeCheck(context);
|
|
56
|
+
for (const statement of moduleNode.body.body) {
|
|
57
|
+
for (const reported of collectReportedNodes(statement, isStringLiteralType)) {
|
|
58
|
+
context.report({
|
|
59
|
+
data: { name: describeNode(reported) },
|
|
60
|
+
loc: reported.loc,
|
|
61
|
+
messageId: MESSAGE_ID
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
},
|
|
68
|
+
meta: {
|
|
69
|
+
docs: {
|
|
70
|
+
description: "Disallow declaring Obsidian internals locally in a `declare module 'obsidian'` augmentation"
|
|
71
|
+
},
|
|
72
|
+
messages: {
|
|
73
|
+
[MESSAGE_ID]: "`{{ name }}` declares Obsidian API locally. Import it from `obsidian-typings` instead, adding it there first if it is missing or wrong. Only a custom-event overload of `on` / `off` / `trigger` / `tryTrigger` may stay here."
|
|
74
|
+
},
|
|
75
|
+
schema: [],
|
|
76
|
+
type: "problem"
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
function collectReportedNodes(statement, isStringLiteralType) {
|
|
80
|
+
const declaration = statement.type === AST_NODE_TYPES.ExportNamedDeclaration && statement.declaration ? statement.declaration : statement;
|
|
81
|
+
if (declaration.type !== AST_NODE_TYPES.TSInterfaceDeclaration) {
|
|
82
|
+
return [declaration];
|
|
83
|
+
}
|
|
84
|
+
return [
|
|
85
|
+
...declaration.extends,
|
|
86
|
+
...declaration.body.body.filter((member) => !isCustomEventOverload(member, isStringLiteralType))
|
|
87
|
+
];
|
|
88
|
+
}
|
|
89
|
+
function createStringLiteralTypeCheck(context) {
|
|
90
|
+
const services = context.sourceCode.parserServices;
|
|
91
|
+
const checker = services.program?.getTypeChecker() ?? null;
|
|
92
|
+
return isStringLiteralType;
|
|
93
|
+
function isStringLiteralType(typeNode) {
|
|
94
|
+
if (typeNode.type === AST_NODE_TYPES.TSUnionType) {
|
|
95
|
+
return typeNode.types.every((member) => isStringLiteralType(member));
|
|
96
|
+
}
|
|
97
|
+
if (typeNode.type === AST_NODE_TYPES.TSLiteralType) {
|
|
98
|
+
return typeNode.literal.type === AST_NODE_TYPES.Literal && typeof typeNode.literal.value === "string";
|
|
99
|
+
}
|
|
100
|
+
if (!checker) {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
const type = checker.getTypeFromTypeNode(services.esTreeNodeToTSNodeMap.get(typeNode));
|
|
104
|
+
return type.isUnion() ? type.types.every((member) => member.isStringLiteral()) : type.isStringLiteral();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function describeNode(node) {
|
|
108
|
+
switch (node.type) {
|
|
109
|
+
case AST_NODE_TYPES.ClassDeclaration:
|
|
110
|
+
case AST_NODE_TYPES.FunctionDeclaration:
|
|
111
|
+
case AST_NODE_TYPES.TSDeclareFunction:
|
|
112
|
+
case AST_NODE_TYPES.TSEnumDeclaration:
|
|
113
|
+
case AST_NODE_TYPES.TSModuleDeclaration:
|
|
114
|
+
case AST_NODE_TYPES.TSTypeAliasDeclaration: {
|
|
115
|
+
return node.id?.type === AST_NODE_TYPES.Identifier ? node.id.name : node.type;
|
|
116
|
+
}
|
|
117
|
+
case AST_NODE_TYPES.TSInterfaceHeritage: {
|
|
118
|
+
return node.expression.type === AST_NODE_TYPES.Identifier ? `extends ${node.expression.name}` : "extends";
|
|
119
|
+
}
|
|
120
|
+
case AST_NODE_TYPES.TSMethodSignature:
|
|
121
|
+
case AST_NODE_TYPES.TSPropertySignature: {
|
|
122
|
+
return readKeyName(node.key) ?? node.type;
|
|
123
|
+
}
|
|
124
|
+
default: {
|
|
125
|
+
return node.type;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function isCustomEventOverload(member, isStringLiteralType) {
|
|
130
|
+
if (member.type !== AST_NODE_TYPES.TSMethodSignature) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
const name = readKeyName(member.key);
|
|
134
|
+
if (name === null || !EVENT_METHOD_NAMES.has(name)) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
const firstParameter = member.params[0];
|
|
138
|
+
return firstParameter?.type === AST_NODE_TYPES.Identifier && firstParameter.typeAnnotation !== void 0 && isStringLiteralType(firstParameter.typeAnnotation.typeAnnotation);
|
|
139
|
+
}
|
|
140
|
+
function readKeyName(key) {
|
|
141
|
+
if (key.type === AST_NODE_TYPES.Identifier) {
|
|
142
|
+
return key.name;
|
|
143
|
+
}
|
|
144
|
+
return key.type === AST_NODE_TYPES.Literal && typeof key.value === "string" ? key.value : null;
|
|
145
|
+
}
|
|
146
|
+
export {
|
|
147
|
+
MESSAGE_ID,
|
|
148
|
+
noLocalObsidianInternals
|
|
149
|
+
};
|
|
150
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpbnRlcnMvZXNsaW50LXJ1bGVzL25vLWxvY2FsLW9ic2lkaWFuLWludGVybmFscy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEVTTGludCBydWxlOiBuby1sb2NhbC1vYnNpZGlhbi1pbnRlcm5hbHNcbiAqXG4gKiBSZXBvcnRzIGV2ZXJ5IG1lbWJlciBhIGBkZWNsYXJlIG1vZHVsZSAnb2JzaWRpYW4nYCBhdWdtZW50YXRpb24gYWRkcyB0byBPYnNpZGlhbidzIHR5cGVzLlxuICpcbiAqIE9ic2lkaWFuJ3MgaW50ZXJuYWwgKHVuZG9jdW1lbnRlZCkgQVBJIGlzIHR5cGVkIGluIGBvYnNpZGlhbi10eXBpbmdzYCwgd2hlcmUgZWFjaCBtZW1iZXIgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZVxuICogc2hpcHBlZCBgYXBwLmpzYCBvbiBldmVyeSByZWxlYXNlIHRoYXQgaGFzIGl0LiBBIGxvY2FsIGF1Z21lbnRhdGlvbiBpcyBhIHNlY29uZCwgdW5jaGVja2VkIGNvcHkgb2YgdGhlIHNhbWVcbiAqIGNsYWltOiBpdCBkcmlmdHMgZnJvbSB3aGF0IE9ic2lkaWFuIGFjdHVhbGx5IHNoaXBzLCBhbmQgd2hlbiBgb2JzaWRpYW4tdHlwaW5nc2AgZ2FpbnMgdGhlIG1lbWJlciB0aGUgdHdvXG4gKiBkZWNsYXJhdGlvbnMgbWVyZ2Ugc2lsZW50bHksIG9yIGNsYXNoLiBUaGUgZml4IGZvciBhIG1lbWJlciBgb2JzaWRpYW4tdHlwaW5nc2AgbGFja3Mgb3IgZGVjbGFyZXMgd3JvbmdseSBnb2VzXG4gKiBpbnRvIGBvYnNpZGlhbi10eXBpbmdzYCwgYW5kIHRoZSBjb25zdW1lciBpbXBvcnRzIGl0IGZyb20gdGhlcmUuXG4gKlxuICogT25lIHNoYXBlIGlzIGV4ZW1wdDogYW4gb3ZlcmxvYWQgb2YgYG9uYCwgYG9mZmAsIGB0cmlnZ2VyYCBvciBgdHJ5VHJpZ2dlcmAgd2hvc2UgZmlyc3QgcGFyYW1ldGVyIGlzIGFcbiAqIHN0cmluZy1saXRlcmFsIHR5cGUsIG9yIGEgdW5pb24gb2YgdGhlbS4gVGhhdCBpcyBob3cgYSBwbHVnaW4gdHlwZXMgaXRzIE9XTiBjdXN0b20gZXZlbnRzIG9uIGBXb3Jrc3BhY2VgIG9yXG4gKiBhbm90aGVyIGBFdmVudHNgIHN1YmNsYXNzLCBzbyBpdCBkZXNjcmliZXMgdGhlIHBsdWdpbidzIGNvZGUgcmF0aGVyIHRoYW4gT2JzaWRpYW4ncy4gQSBuYW1lIHR5cGVkIHRocm91Z2ggYW5cbiAqIGFsaWFzIChgbmFtZTogTXlFdmVudE5hbWVgKSBpcyByZWNvZ25pemVkIG9ubHkgd2hlbiB0aGUgZmlsZSBpcyBsaW50ZWQgd2l0aCB0eXBlIGluZm9ybWF0aW9uLCB3aGljaCB0aGUgc2hhcmVkXG4gKiBjb25maWd1cmF0aW9uIGFsd2F5cyBoYXMuXG4gKlxuICogT25seSB0aGUgbW9kdWxlIG5hbWVkIGV4YWN0bHkgYG9ic2lkaWFuYCBpcyByZWFkLiBBIGBkZWNsYXJlIG1vZHVsZSAnb2JzaWRpYW4tdHlwaW5ncydgIGF1Z21lbnRhdGlvbiBvZlxuICogYFBsdWdpbnNQbHVnaW5zUmVjb3JkYCBpcyBgb2JzaWRpYW4tdHlwaW5nc2AnIGRlc2lnbmVkIGV4dGVuc2lvbiBwb2ludCBmb3IgdGhpcmQtcGFydHkgcGx1Z2luIHR5cGVzLCBhbmQgaXNcbiAqIG5vdCByZXBvcnRlZC5cbiAqXG4gKiBOb3QgYXR0ZW1wdGVkOiBhIGxvY2FsIGludGVyZmFjZSBvciBhbiBpbmxpbmUgY2FzdCB0aGF0IHNwZWxscyBhbiBpbnRlcm5hbCBzaGFwZSBjYW5ub3QgYmUgdG9sZCBhcGFydCBmcm9tIGFcbiAqIHJlcG9zaXRvcnkncyBvd24gdHlwZXMgbWVjaGFuaWNhbGx5LCBzbyB0aG9zZSBhcmUgbGVmdCB0byByZXZpZXcuXG4gKi9cbmltcG9ydCB0eXBlIHtcbiAgUGFyc2VyU2VydmljZXMsXG4gIFRTRVNUcmVlXG59IGZyb20gJ0B0eXBlc2NyaXB0LWVzbGludC91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tICdlc2xpbnQnO1xuaW1wb3J0IHR5cGUgeyBUeXBlTm9kZSB9IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyB0b1RTRVNUcmVlTm9kZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L2xpbnRlcnMvZXNsaW50LXJ1bGVzL3RzLWVzdHJlZS1ub2RlJztcbmltcG9ydCB7IEFTVF9OT0RFX1RZUEVTIH0gZnJvbSAnQHR5cGVzY3JpcHQtZXNsaW50L3V0aWxzJztcblxuLyoqXG5NZXNzYWdlIElEIHJlcG9ydGVkIGZvciBhIG1lbWJlciBhIGBkZWNsYXJlIG1vZHVsZSAnb2JzaWRpYW4nYCBhdWdtZW50YXRpb24gYWRkcy5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfSUQgPSAnbm9Mb2NhbE9ic2lkaWFuSW50ZXJuYWxzJztcblxuLyoqXG5UaGUgbW9kdWxlIG5hbWUgd2hvc2UgYXVnbWVudGF0aW9ucyBhcmUgcmVwb3J0ZWQuXG4gKi9cbmNvbnN0IE9CU0lESUFOX01PRFVMRV9OQU1FID0gJ29ic2lkaWFuJztcblxuLyoqXG5UaGUgYEV2ZW50c2AgbWV0aG9kcyBhIGN1c3RvbS1ldmVudCBvdmVybG9hZCBtYXkgYmUgZGVjbGFyZWQgb24uXG4gKi9cbmNvbnN0IEVWRU5UX01FVEhPRF9OQU1FUyA9IG5ldyBTZXQoWydvZmYnLCAnb24nLCAndHJpZ2dlcicsICd0cnlUcmlnZ2VyJ10pO1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdHlwZSBpcyBhIHN0cmluZy1saXRlcmFsIHR5cGUsIG9yIGEgdW5pb24gbWFkZSBvbmx5IG9mIHRoZW0uXG4gKi9cbnR5cGUgU3RyaW5nTGl0ZXJhbFR5cGVDaGVjayA9ICh0eXBlTm9kZTogVFNFU1RyZWUuVHlwZU5vZGUpID0+IGJvb2xlYW47XG5cbi8qKlxuICogRVNMaW50IHJ1bGUgZGlzYWxsb3dpbmcgbG9jYWxseSBkZWNsYXJlZCBPYnNpZGlhbiBpbnRlcm5hbHMgaW4gYSBgZGVjbGFyZSBtb2R1bGUgJ29ic2lkaWFuJ2AgYXVnbWVudGF0aW9uLlxuICovXG5leHBvcnQgY29uc3Qgbm9Mb2NhbE9ic2lkaWFuSW50ZXJuYWxzOiBSdWxlLlJ1bGVNb2R1bGUgPSB7XG4gIGNyZWF0ZShjb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdUU01vZHVsZURlY2xhcmF0aW9uJyhub2RlOiBSdWxlLk5vZGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbW9kdWxlTm9kZSA9IHRvVFNFU1RyZWVOb2RlKG5vZGUpIGFzIFRTRVNUcmVlLlRTTW9kdWxlRGVjbGFyYXRpb247XG5cbiAgICAgICAgaWYgKG1vZHVsZU5vZGUuaWQudHlwZSAhPT0gQVNUX05PREVfVFlQRVMuTGl0ZXJhbCB8fCBtb2R1bGVOb2RlLmlkLnZhbHVlICE9PSBPQlNJRElBTl9NT0RVTEVfTkFNRSB8fCAhbW9kdWxlTm9kZS5ib2R5KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNTdHJpbmdMaXRlcmFsVHlwZSA9IGNyZWF0ZVN0cmluZ0xpdGVyYWxUeXBlQ2hlY2soY29udGV4dCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgbW9kdWxlTm9kZS5ib2R5LmJvZHkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJlcG9ydGVkIG9mIGNvbGxlY3RSZXBvcnRlZE5vZGVzKHN0YXRlbWVudCwgaXNTdHJpbmdMaXRlcmFsVHlwZSkpIHtcbiAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgICAgZGF0YTogeyBuYW1lOiBkZXNjcmliZU5vZGUocmVwb3J0ZWQpIH0sXG4gICAgICAgICAgICAgIGxvYzogcmVwb3J0ZWQubG9jLFxuICAgICAgICAgICAgICBtZXNzYWdlSWQ6IE1FU1NBR0VfSURcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH0sXG4gIG1ldGE6IHtcbiAgICBkb2NzOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0Rpc2FsbG93IGRlY2xhcmluZyBPYnNpZGlhbiBpbnRlcm5hbHMgbG9jYWxseSBpbiBhIGBkZWNsYXJlIG1vZHVsZSBcXCdvYnNpZGlhblxcJ2AgYXVnbWVudGF0aW9uJ1xuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIFtNRVNTQUdFX0lEXTogJ2B7eyBuYW1lIH19YCBkZWNsYXJlcyBPYnNpZGlhbiBBUEkgbG9jYWxseS4gSW1wb3J0IGl0IGZyb20gYG9ic2lkaWFuLXR5cGluZ3NgIGluc3RlYWQsIGFkZGluZyBpdCB0aGVyZSBmaXJzdCBpZiBpdCBpcyBtaXNzaW5nIG9yIHdyb25nLiBPbmx5IGEgY3VzdG9tLWV2ZW50IG92ZXJsb2FkIG9mIGBvbmAgLyBgb2ZmYCAvIGB0cmlnZ2VyYCAvIGB0cnlUcmlnZ2VyYCBtYXkgc3RheSBoZXJlLidcbiAgICB9LFxuICAgIHNjaGVtYTogW10sXG4gICAgdHlwZTogJ3Byb2JsZW0nXG4gIH1cbn07XG5cbi8qKlxuICogQ29sbGVjdHMgdGhlIG5vZGVzIHRvIHJlcG9ydCBmb3Igb25lIHN0YXRlbWVudCBvZiBhIGBkZWNsYXJlIG1vZHVsZSAnb2JzaWRpYW4nYCBibG9jay5cbiAqXG4gKiBBbiBpbnRlcmZhY2UgaXMgcmVwb3J0ZWQgbWVtYmVyIGJ5IG1lbWJlciwgc28gYSBjdXN0b20tZXZlbnQgb3ZlcmxvYWQgY2FuIHNpdCBiZXNpZGUgYSByZXBvcnRlZCBtZW1iZXIsIGFuZCBpdHNcbiAqIGBleHRlbmRzYCBjbGF1c2UgaXMgcmVwb3J0ZWQgdG9vLCBzaW5jZSB0aGF0IGJvbHRzIG1lbWJlcnMgb24gYXMgc3VyZWx5IGFzIGRlY2xhcmluZyB0aGVtLiBBbnkgb3RoZXIgc3RhdGVtZW50XG4gKiAoYSBjbGFzcywgYSBmdW5jdGlvbiwgYSB0eXBlIGFsaWFzLCBhIHZhcmlhYmxlKSBpcyByZXBvcnRlZCB3aG9sZS5cbiAqXG4gKiBAcGFyYW0gc3RhdGVtZW50IC0gQSBzdGF0ZW1lbnQgb2YgdGhlIG1vZHVsZSBibG9jay5cbiAqIEBwYXJhbSBpc1N0cmluZ0xpdGVyYWxUeXBlIC0gVGhlIGNoZWNrIG9mIHdoZXRoZXIgYSB0eXBlIGlzIGEgc3RyaW5nLWxpdGVyYWwgdHlwZSBvciBhIHVuaW9uIG9mIHRoZW0uXG4gKiBAcmV0dXJucyBUaGUgbm9kZXMgdG8gcmVwb3J0LlxuICovXG5mdW5jdGlvbiBjb2xsZWN0UmVwb3J0ZWROb2RlcyhzdGF0ZW1lbnQ6IFRTRVNUcmVlLlByb2dyYW1TdGF0ZW1lbnQsIGlzU3RyaW5nTGl0ZXJhbFR5cGU6IFN0cmluZ0xpdGVyYWxUeXBlQ2hlY2spOiBUU0VTVHJlZS5Ob2RlW10ge1xuICBjb25zdCBkZWNsYXJhdGlvbiA9IHN0YXRlbWVudC50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5FeHBvcnROYW1lZERlY2xhcmF0aW9uICYmIHN0YXRlbWVudC5kZWNsYXJhdGlvbiA/IHN0YXRlbWVudC5kZWNsYXJhdGlvbiA6IHN0YXRlbWVudDtcblxuICBpZiAoZGVjbGFyYXRpb24udHlwZSAhPT0gQVNUX05PREVfVFlQRVMuVFNJbnRlcmZhY2VEZWNsYXJhdGlvbikge1xuICAgIHJldHVybiBbZGVjbGFyYXRpb25dO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICAuLi5kZWNsYXJhdGlvbi5leHRlbmRzLFxuICAgIC4uLmRlY2xhcmF0aW9uLmJvZHkuYm9keS5maWx0ZXIoKG1lbWJlcikgPT4gIWlzQ3VzdG9tRXZlbnRPdmVybG9hZChtZW1iZXIsIGlzU3RyaW5nTGl0ZXJhbFR5cGUpKVxuICBdO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGNoZWNrIG9mIHdoZXRoZXIgYSB0eXBlIGlzIGEgc3RyaW5nLWxpdGVyYWwgdHlwZSwgb3IgYSB1bmlvbiBtYWRlIG9ubHkgb2YgdGhlbS5cbiAqXG4gKiBBIHR5cGUgd3JpdHRlbiBvdXQgYXMgbGl0ZXJhbHMgKGAnbXktZXZlbnQnIHwgJ290aGVyLWV2ZW50J2ApIGlzIHJlY29nbml6ZWQgZnJvbSB0aGUgc3ludGF4IGFsb25lLiBBIHR5cGUgcmVhY2hlZFxuICogdGhyb3VnaCBhbiBhbGlhcyAoYG5hbWU6IE15RXZlbnROYW1lYCkgbmVlZHMgdGhlIHR5cGUgY2hlY2tlciwgc28gaXQgaXMgcmVjb2duaXplZCBvbmx5IHdoZW4gdGhlIGZpbGUgaXMgbGludGVkXG4gKiB3aXRoIHR5cGUgaW5mb3JtYXRpb24sIGFuZCByZXBvcnRlZCBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUgcnVsZSBjb250ZXh0LlxuICogQHJldHVybnMgVGhlIGNoZWNrLlxuICovXG5mdW5jdGlvbiBjcmVhdGVTdHJpbmdMaXRlcmFsVHlwZUNoZWNrKGNvbnRleHQ6IFJ1bGUuUnVsZUNvbnRleHQpOiBTdHJpbmdMaXRlcmFsVHlwZUNoZWNrIHtcbiAgY29uc3Qgc2VydmljZXMgPSBjb250ZXh0LnNvdXJjZUNvZGUucGFyc2VyU2VydmljZXMgYXMgUGFyc2VyU2VydmljZXM7XG4gIGNvbnN0IGNoZWNrZXIgPSBzZXJ2aWNlcy5wcm9ncmFtPy5nZXRUeXBlQ2hlY2tlcigpID8/IG51bGw7XG5cbiAgcmV0dXJuIGlzU3RyaW5nTGl0ZXJhbFR5cGU7XG5cbiAgZnVuY3Rpb24gaXNTdHJpbmdMaXRlcmFsVHlwZSh0eXBlTm9kZTogVFNFU1RyZWUuVHlwZU5vZGUpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZU5vZGUudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuVFNVbmlvblR5cGUpIHtcbiAgICAgIHJldHVybiB0eXBlTm9kZS50eXBlcy5ldmVyeSgobWVtYmVyKSA9PiBpc1N0cmluZ0xpdGVyYWxUeXBlKG1lbWJlcikpO1xuICAgIH1cblxuICAgIGlmICh0eXBlTm9kZS50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5UU0xpdGVyYWxUeXBlKSB7XG4gICAgICByZXR1cm4gdHlwZU5vZGUubGl0ZXJhbC50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5MaXRlcmFsICYmIHR5cGVvZiB0eXBlTm9kZS5saXRlcmFsLnZhbHVlID09PSAnc3RyaW5nJztcbiAgICB9XG5cbiAgICBpZiAoIWNoZWNrZXIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlID0gY2hlY2tlci5nZXRUeXBlRnJvbVR5cGVOb2RlKHNlcnZpY2VzLmVzVHJlZU5vZGVUb1RTTm9kZU1hcC5nZXQodHlwZU5vZGUpIGFzIFR5cGVOb2RlKTtcbiAgICByZXR1cm4gdHlwZS5pc1VuaW9uKCkgPyB0eXBlLnR5cGVzLmV2ZXJ5KChtZW1iZXIpID0+IG1lbWJlci5pc1N0cmluZ0xpdGVyYWwoKSkgOiB0eXBlLmlzU3RyaW5nTGl0ZXJhbCgpO1xuICB9XG59XG5cbi8qKlxuICogTmFtZXMgYSByZXBvcnRlZCBub2RlIGZvciB0aGUgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSByZXBvcnRlZCBub2RlLlxuICogQHJldHVybnMgVGhlIG5hbWUgdG8gc2hvdy5cbiAqL1xuZnVuY3Rpb24gZGVzY3JpYmVOb2RlKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgQVNUX05PREVfVFlQRVMuQ2xhc3NEZWNsYXJhdGlvbjpcbiAgICBjYXNlIEFTVF9OT0RFX1RZUEVTLkZ1bmN0aW9uRGVjbGFyYXRpb246XG4gICAgY2FzZSBBU1RfTk9ERV9UWVBFUy5UU0RlY2xhcmVGdW5jdGlvbjpcbiAgICBjYXNlIEFTVF9OT0RFX1RZUEVTLlRTRW51bURlY2xhcmF0aW9uOlxuICAgIGNhc2UgQVNUX05PREVfVFlQRVMuVFNNb2R1bGVEZWNsYXJhdGlvbjpcbiAgICBjYXNlIEFTVF9OT0RFX1RZUEVTLlRTVHlwZUFsaWFzRGVjbGFyYXRpb246IHtcbiAgICAgIHJldHVybiBub2RlLmlkPy50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5JZGVudGlmaWVyID8gbm9kZS5pZC5uYW1lIDogbm9kZS50eXBlO1xuICAgIH1cbiAgICBjYXNlIEFTVF9OT0RFX1RZUEVTLlRTSW50ZXJmYWNlSGVyaXRhZ2U6IHtcbiAgICAgIHJldHVybiBub2RlLmV4cHJlc3Npb24udHlwZSA9PT0gQVNUX05PREVfVFlQRVMuSWRlbnRpZmllciA/IGBleHRlbmRzICR7bm9kZS5leHByZXNzaW9uLm5hbWV9YCA6ICdleHRlbmRzJztcbiAgICB9XG4gICAgY2FzZSBBU1RfTk9ERV9UWVBFUy5UU01ldGhvZFNpZ25hdHVyZTpcbiAgICBjYXNlIEFTVF9OT0RFX1RZUEVTLlRTUHJvcGVydHlTaWduYXR1cmU6IHtcbiAgICAgIHJldHVybiByZWFkS2V5TmFtZShub2RlLmtleSkgPz8gbm9kZS50eXBlO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gbm9kZS50eXBlO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGFuIGludGVyZmFjZSBtZW1iZXIgaXMgYSBjdXN0b20tZXZlbnQgb3ZlcmxvYWQ6IGFuIGBvbmAgLyBgb2ZmYCAvIGB0cmlnZ2VyYCAvIGB0cnlUcmlnZ2VyYCBtZXRob2RcbiAqIHdob3NlIGZpcnN0IHBhcmFtZXRlciBpcyB0eXBlZCBhcyBhIHN0cmluZy1saXRlcmFsIHR5cGUgb3IgYSB1bmlvbiBvZiB0aGVtLlxuICpcbiAqIEBwYXJhbSBtZW1iZXIgLSBUaGUgaW50ZXJmYWNlIG1lbWJlci5cbiAqIEBwYXJhbSBpc1N0cmluZ0xpdGVyYWxUeXBlIC0gVGhlIGNoZWNrIG9mIHdoZXRoZXIgYSB0eXBlIGlzIGEgc3RyaW5nLWxpdGVyYWwgdHlwZSBvciBhIHVuaW9uIG9mIHRoZW0uXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgbWVtYmVyIGlzIGV4ZW1wdC5cbiAqL1xuZnVuY3Rpb24gaXNDdXN0b21FdmVudE92ZXJsb2FkKG1lbWJlcjogVFNFU1RyZWUuVHlwZUVsZW1lbnQsIGlzU3RyaW5nTGl0ZXJhbFR5cGU6IFN0cmluZ0xpdGVyYWxUeXBlQ2hlY2spOiBib29sZWFuIHtcbiAgaWYgKG1lbWJlci50eXBlICE9PSBBU1RfTk9ERV9UWVBFUy5UU01ldGhvZFNpZ25hdHVyZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG5hbWUgPSByZWFkS2V5TmFtZShtZW1iZXIua2V5KTtcbiAgaWYgKG5hbWUgPT09IG51bGwgfHwgIUVWRU5UX01FVEhPRF9OQU1FUy5oYXMobmFtZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBmaXJzdFBhcmFtZXRlciA9IG1lbWJlci5wYXJhbXNbMF07XG4gIHJldHVybiBmaXJzdFBhcmFtZXRlcj8udHlwZSA9PT0gQVNUX05PREVfVFlQRVMuSWRlbnRpZmllciAmJiBmaXJzdFBhcmFtZXRlci50eXBlQW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkXG4gICAgJiYgaXNTdHJpbmdMaXRlcmFsVHlwZShmaXJzdFBhcmFtZXRlci50eXBlQW5ub3RhdGlvbi50eXBlQW5ub3RhdGlvbik7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIG5hbWUgb2YgYSBtZW1iZXIga2V5IHdyaXR0ZW4gYXMgYW4gaWRlbnRpZmllciBvciBhIHN0cmluZyBsaXRlcmFsLlxuICpcbiAqIEBwYXJhbSBrZXkgLSBUaGUgbWVtYmVyIGtleS5cbiAqIEByZXR1cm5zIFRoZSBuYW1lLCBvciBgbnVsbGAgZm9yIGEgY29tcHV0ZWQga2V5LlxuICovXG5mdW5jdGlvbiByZWFkS2V5TmFtZShrZXk6IFRTRVNUcmVlLlByb3BlcnR5TmFtZSk6IG51bGwgfCBzdHJpbmcge1xuICBpZiAoa2V5LnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLklkZW50aWZpZXIpIHtcbiAgICByZXR1cm4ga2V5Lm5hbWU7XG4gIH1cblxuICByZXR1cm4ga2V5LnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkxpdGVyYWwgJiYgdHlwZW9mIGtleS52YWx1ZSA9PT0gJ3N0cmluZycgPyBrZXkudmFsdWUgOiBudWxsO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
|