@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.
Files changed (140) hide show
  1. package/README.md +9 -1
  2. package/dist/demo-vault-helper/main.js +499 -17
  3. package/dist/integration-test-plugin/main.js +11251 -2472
  4. package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +9 -22
  5. package/dist/lib/cjs/bundlers/esbuild-impl/dependency.cjs +9 -22
  6. package/dist/lib/cjs/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +9 -22
  7. package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +9 -22
  8. package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +9 -22
  9. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +9 -22
  10. package/dist/lib/cjs/bundlers/esbuild-impl/rename-css-plugin.cjs +9 -22
  11. package/dist/lib/cjs/bundlers/esbuild.cjs +9 -22
  12. package/dist/lib/cjs/bundlers/index.cjs +9 -22
  13. package/dist/lib/cjs/demo-vault-app-json.cjs +9 -22
  14. package/dist/lib/cjs/demo-vault-buttons.cjs +9 -22
  15. package/dist/lib/cjs/demo-vault-buttons.d.cts +7 -7
  16. package/dist/lib/cjs/demo-vault-coverage.cjs +11 -23
  17. package/dist/lib/cjs/demo-vault.cjs +9 -22
  18. package/dist/lib/cjs/formatters/dprint.cjs +9 -22
  19. package/dist/lib/cjs/formatters/index.cjs +9 -22
  20. package/dist/lib/cjs/index.cjs +9 -22
  21. package/dist/lib/cjs/integration-test-setup.cjs +9 -22
  22. package/dist/lib/cjs/integration-test-vitest-global-setup.cjs +9 -22
  23. package/dist/lib/cjs/jest-setup.cjs +9 -22
  24. package/dist/lib/cjs/linters/eslint-config.cjs +60 -22
  25. package/dist/lib/cjs/linters/eslint-rules/index.cjs +23 -24
  26. package/dist/lib/cjs/linters/eslint-rules/index.d.cts +4 -0
  27. package/dist/lib/cjs/linters/eslint-rules/manifest-description.cjs +9 -22
  28. package/dist/lib/cjs/linters/eslint-rules/manifest-helpers.cjs +9 -22
  29. package/dist/lib/cjs/linters/eslint-rules/manifest-id.cjs +9 -22
  30. package/dist/lib/cjs/linters/eslint-rules/manifest-name.cjs +9 -22
  31. package/dist/lib/cjs/linters/eslint-rules/manifest-schema.cjs +9 -22
  32. package/dist/lib/cjs/linters/eslint-rules/no-local-obsidian-internals.cjs +259 -0
  33. package/dist/lib/cjs/linters/eslint-rules/no-local-obsidian-internals.d.cts +10 -0
  34. package/dist/lib/cjs/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.cjs +9 -22
  35. package/dist/lib/cjs/linters/eslint-rules/no-untrusted-input-events.cjs +9 -22
  36. package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +18 -23
  37. package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code-in-ui.cjs +263 -0
  38. package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code-in-ui.d.cts +30 -0
  39. package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code.cjs +215 -0
  40. package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code.d.cts +29 -0
  41. package/dist/lib/cjs/linters/eslint-rules/require-component-suffix.cjs +9 -22
  42. package/dist/lib/cjs/linters/eslint-rules/require-plugin-api-contract-schemas.cjs +306 -0
  43. package/dist/lib/cjs/linters/eslint-rules/require-plugin-api-contract-schemas.d.cts +10 -0
  44. package/dist/lib/cjs/linters/eslint.cjs +9 -22
  45. package/dist/lib/cjs/linters/index.cjs +20 -24
  46. package/dist/lib/cjs/linters/index.d.cts +3 -0
  47. package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +171 -0
  48. package/dist/lib/cjs/linters/markdownlint-cli2-config.d.cts +12 -0
  49. package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +164 -0
  50. package/dist/lib/cjs/linters/markdownlint-rules/index.d.cts +2 -0
  51. package/dist/lib/cjs/linters/markdownlint-rules/plugin-name-as-code.cjs +246 -0
  52. package/dist/lib/cjs/linters/markdownlint-rules/plugin-name-as-code.d.cts +32 -0
  53. package/dist/lib/cjs/linters/markdownlint.cjs +9 -22
  54. package/dist/lib/cjs/linters/obsidianmd-rule-custom-message.cjs +9 -22
  55. package/dist/lib/cjs/linters/plugin-names.cjs +249 -0
  56. package/dist/lib/cjs/linters/plugin-names.d.cts +81 -0
  57. package/dist/lib/cjs/obsidian-plugin-repo-paths.cjs +9 -22
  58. package/dist/lib/cjs/setup.cjs +9 -22
  59. package/dist/lib/cjs/templates.cjs +9 -22
  60. package/dist/lib/cjs/test-runners/index.cjs +9 -22
  61. package/dist/lib/cjs/test-runners/integration-test-plugin.cjs +9 -22
  62. package/dist/lib/cjs/test-runners/performance-eval-cap.cjs +9 -22
  63. package/dist/lib/cjs/test-runners/stale-build-global-setup.cjs +9 -22
  64. package/dist/lib/cjs/test-runners/vitest-config.cjs +9 -22
  65. package/dist/lib/cjs/version.cjs +9 -22
  66. package/dist/lib/cjs/vitest-setup.cjs +9 -22
  67. package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +6 -14
  68. package/dist/lib/esm/bundlers/esbuild-impl/dependency.mjs +6 -14
  69. package/dist/lib/esm/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +6 -14
  70. package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +6 -14
  71. package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +6 -14
  72. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +6 -14
  73. package/dist/lib/esm/bundlers/esbuild-impl/rename-css-plugin.mjs +6 -14
  74. package/dist/lib/esm/bundlers/esbuild.mjs +6 -14
  75. package/dist/lib/esm/bundlers/index.mjs +6 -14
  76. package/dist/lib/esm/demo-vault-app-json.mjs +6 -14
  77. package/dist/lib/esm/demo-vault-buttons.d.mts +7 -7
  78. package/dist/lib/esm/demo-vault-buttons.mjs +6 -14
  79. package/dist/lib/esm/demo-vault-coverage.mjs +8 -15
  80. package/dist/lib/esm/demo-vault.mjs +6 -14
  81. package/dist/lib/esm/formatters/dprint.mjs +6 -14
  82. package/dist/lib/esm/formatters/index.mjs +6 -14
  83. package/dist/lib/esm/index.mjs +6 -14
  84. package/dist/lib/esm/integration-test-setup.mjs +6 -14
  85. package/dist/lib/esm/integration-test-vitest-global-setup.mjs +6 -14
  86. package/dist/lib/esm/jest-setup.mjs +6 -14
  87. package/dist/lib/esm/linters/eslint-config.mjs +57 -14
  88. package/dist/lib/esm/linters/eslint-rules/index.d.mts +4 -0
  89. package/dist/lib/esm/linters/eslint-rules/index.mjs +15 -15
  90. package/dist/lib/esm/linters/eslint-rules/manifest-description.mjs +6 -14
  91. package/dist/lib/esm/linters/eslint-rules/manifest-helpers.mjs +6 -14
  92. package/dist/lib/esm/linters/eslint-rules/manifest-id.mjs +6 -14
  93. package/dist/lib/esm/linters/eslint-rules/manifest-name.mjs +6 -14
  94. package/dist/lib/esm/linters/eslint-rules/manifest-schema.mjs +6 -14
  95. package/dist/lib/esm/linters/eslint-rules/no-local-obsidian-internals.d.mts +10 -0
  96. package/dist/lib/esm/linters/eslint-rules/no-local-obsidian-internals.mjs +150 -0
  97. package/dist/lib/esm/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.mjs +6 -14
  98. package/dist/lib/esm/linters/eslint-rules/no-untrusted-input-events.mjs +6 -14
  99. package/dist/lib/esm/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +15 -15
  100. package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code-in-ui.d.mts +30 -0
  101. package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code-in-ui.mjs +157 -0
  102. package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code.d.mts +29 -0
  103. package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code.mjs +108 -0
  104. package/dist/lib/esm/linters/eslint-rules/require-component-suffix.mjs +6 -14
  105. package/dist/lib/esm/linters/eslint-rules/require-plugin-api-contract-schemas.d.mts +10 -0
  106. package/dist/lib/esm/linters/eslint-rules/require-plugin-api-contract-schemas.mjs +197 -0
  107. package/dist/lib/esm/linters/eslint.mjs +6 -14
  108. package/dist/lib/esm/linters/index.d.mts +3 -0
  109. package/dist/lib/esm/linters/index.mjs +13 -15
  110. package/dist/lib/esm/linters/markdownlint-cli2-config.d.mts +12 -0
  111. package/dist/lib/esm/linters/markdownlint-cli2-config.mjs +66 -0
  112. package/dist/lib/esm/linters/markdownlint-rules/index.d.mts +2 -0
  113. package/dist/lib/esm/linters/markdownlint-rules/index.mjs +46 -0
  114. package/dist/lib/esm/linters/markdownlint-rules/plugin-name-as-code.d.mts +32 -0
  115. package/dist/lib/esm/linters/markdownlint-rules/plugin-name-as-code.mjs +130 -0
  116. package/dist/lib/esm/linters/markdownlint.mjs +6 -14
  117. package/dist/lib/esm/linters/obsidianmd-rule-custom-message.mjs +6 -14
  118. package/dist/lib/esm/linters/plugin-names.d.mts +81 -0
  119. package/dist/lib/esm/linters/plugin-names.mjs +141 -0
  120. package/dist/lib/esm/obsidian-plugin-repo-paths.mjs +6 -14
  121. package/dist/lib/esm/setup.mjs +6 -14
  122. package/dist/lib/esm/templates.mjs +6 -14
  123. package/dist/lib/esm/test-runners/index.mjs +6 -14
  124. package/dist/lib/esm/test-runners/integration-test-plugin.mjs +6 -14
  125. package/dist/lib/esm/test-runners/performance-eval-cap.mjs +6 -14
  126. package/dist/lib/esm/test-runners/stale-build-global-setup.mjs +6 -14
  127. package/dist/lib/esm/test-runners/vitest-config.mjs +6 -14
  128. package/dist/lib/esm/version.mjs +6 -14
  129. package/dist/lib/esm/vitest-setup.mjs +6 -14
  130. package/dist/templates/scripts/markdownlint-cli2-config.ts +2 -2
  131. package/linters/eslint-rules/no-local-obsidian-internals/package.json +6 -0
  132. package/linters/eslint-rules/plugin-name-as-code/package.json +6 -0
  133. package/linters/eslint-rules/plugin-name-as-code-in-ui/package.json +6 -0
  134. package/linters/eslint-rules/require-plugin-api-contract-schemas/package.json +6 -0
  135. package/linters/markdownlint-cli2-config/package.json +6 -0
  136. package/linters/markdownlint-rules/index/package.json +6 -0
  137. package/linters/markdownlint-rules/package.json +6 -0
  138. package/linters/markdownlint-rules/plugin-name-as-code/package.json +6 -0
  139. package/linters/plugin-names/package.json +6 -0
  140. package/package.json +84 -23
@@ -0,0 +1,259 @@
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 keepName($unknown) {
37
+ return $unknown;
38
+ }
39
+
40
+ (function initCjs() {
41
+ const globalThisRecord = globalThis;
42
+ ensureDisposeSymbols();
43
+ globalThisRecord["__name"] ??= keepName;
44
+ globalThisRecord["__extractDefault"] ??= extractDefault;
45
+ ensureBrowserProcess();
46
+ function extractDefault(module) {
47
+ return module && module.__esModule && "default" in module ? module.default : module;
48
+ }
49
+ })();
50
+ })();
51
+ (function patchObsidianRequire() {
52
+ const originalRequire = require;
53
+ if (!originalRequire || originalRequire.__isPatched) {
54
+ return;
55
+ }
56
+
57
+ require = Object.assign(
58
+ (id) => requirePatched(id),
59
+ originalRequire,
60
+ {
61
+ __isPatched: true
62
+ }
63
+ );
64
+
65
+ function extractDefault(module) {
66
+ return module && module.__esModule && 'default' in module ? module.default : module;
67
+ }
68
+
69
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
70
+ '@codemirror/autocomplete',
71
+ '@codemirror/collab',
72
+ '@codemirror/commands',
73
+ '@codemirror/language',
74
+ '@codemirror/lint',
75
+ '@codemirror/search',
76
+ '@codemirror/state',
77
+ '@codemirror/text',
78
+ '@codemirror/view',
79
+ '@lezer/common',
80
+ '@lezer/highlight',
81
+ '@lezer/lr',
82
+ 'obsidian']
83
+ );
84
+
85
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
86
+ '@codemirror/closebrackets',
87
+ '@codemirror/comment',
88
+ '@codemirror/fold',
89
+ '@codemirror/gutter',
90
+ '@codemirror/highlight',
91
+ '@codemirror/history',
92
+ '@codemirror/matchbrackets',
93
+ '@codemirror/panel',
94
+ '@codemirror/rangeset',
95
+ '@codemirror/rectangular-selection',
96
+ '@codemirror/stream-parser',
97
+ '@codemirror/tooltip']
98
+ );
99
+
100
+ function requirePatched(id) {
101
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
102
+ return originalRequire?.(id);
103
+ }
104
+
105
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
106
+ if (globalThis.app.isMobile) {
107
+ if (id === 'process' || id === 'node:process') {
108
+ // eslint-disable-next-line no-console -- Valid usage.
109
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
110
+
111
+ return process;
112
+ }
113
+ } else {
114
+ const module = originalRequire?.(id);
115
+ if (module) {
116
+ return extractDefault(module);
117
+ }
118
+ }
119
+
120
+ // eslint-disable-next-line no-console -- Valid usage.
121
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
122
+ return {};
123
+ }
124
+ })();
125
+
126
+ "use strict";
127
+ var __defProp = Object.defineProperty;
128
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
129
+ var __getOwnPropNames = Object.getOwnPropertyNames;
130
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
131
+ var __export = (target, all) => {
132
+ for (var name in all)
133
+ __defProp(target, name, { get: all[name], enumerable: true });
134
+ };
135
+ var __copyProps = (to, from, except, desc) => {
136
+ if (from && typeof from === "object" || typeof from === "function") {
137
+ for (let key of __getOwnPropNames(from))
138
+ if (!__hasOwnProp.call(to, key) && key !== except)
139
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
140
+ }
141
+ return to;
142
+ };
143
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
144
+ var no_local_obsidian_internals_exports = {};
145
+ __export(no_local_obsidian_internals_exports, {
146
+ MESSAGE_ID: () => MESSAGE_ID,
147
+ noLocalObsidianInternals: () => noLocalObsidianInternals
148
+ });
149
+ module.exports = __toCommonJS(no_local_obsidian_internals_exports);
150
+ var import_ts_estree_node = require('@mnaoumov/typescript-dev-toolkit/linters/eslint-rules/ts-estree-node');
151
+ var import_utils = require('@typescript-eslint/utils');
152
+ const MESSAGE_ID = "noLocalObsidianInternals";
153
+ const OBSIDIAN_MODULE_NAME = "obsidian";
154
+ const EVENT_METHOD_NAMES = /* @__PURE__ */ new Set(["off", "on", "trigger", "tryTrigger"]);
155
+ const noLocalObsidianInternals = {
156
+ create(context) {
157
+ return {
158
+ "TSModuleDeclaration"(node) {
159
+ const moduleNode = (0, import_ts_estree_node.toTSESTreeNode)(node);
160
+ if (moduleNode.id.type !== import_utils.AST_NODE_TYPES.Literal || moduleNode.id.value !== OBSIDIAN_MODULE_NAME || !moduleNode.body) {
161
+ return;
162
+ }
163
+ const isStringLiteralType = createStringLiteralTypeCheck(context);
164
+ for (const statement of moduleNode.body.body) {
165
+ for (const reported of collectReportedNodes(statement, isStringLiteralType)) {
166
+ context.report({
167
+ data: { name: describeNode(reported) },
168
+ loc: reported.loc,
169
+ messageId: MESSAGE_ID
170
+ });
171
+ }
172
+ }
173
+ }
174
+ };
175
+ },
176
+ meta: {
177
+ docs: {
178
+ description: "Disallow declaring Obsidian internals locally in a `declare module 'obsidian'` augmentation"
179
+ },
180
+ messages: {
181
+ [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."
182
+ },
183
+ schema: [],
184
+ type: "problem"
185
+ }
186
+ };
187
+ function collectReportedNodes(statement, isStringLiteralType) {
188
+ const declaration = statement.type === import_utils.AST_NODE_TYPES.ExportNamedDeclaration && statement.declaration ? statement.declaration : statement;
189
+ if (declaration.type !== import_utils.AST_NODE_TYPES.TSInterfaceDeclaration) {
190
+ return [declaration];
191
+ }
192
+ return [
193
+ ...declaration.extends,
194
+ ...declaration.body.body.filter((member) => !isCustomEventOverload(member, isStringLiteralType))
195
+ ];
196
+ }
197
+ function createStringLiteralTypeCheck(context) {
198
+ const services = context.sourceCode.parserServices;
199
+ const checker = services.program?.getTypeChecker() ?? null;
200
+ return isStringLiteralType;
201
+ function isStringLiteralType(typeNode) {
202
+ if (typeNode.type === import_utils.AST_NODE_TYPES.TSUnionType) {
203
+ return typeNode.types.every((member) => isStringLiteralType(member));
204
+ }
205
+ if (typeNode.type === import_utils.AST_NODE_TYPES.TSLiteralType) {
206
+ return typeNode.literal.type === import_utils.AST_NODE_TYPES.Literal && typeof typeNode.literal.value === "string";
207
+ }
208
+ if (!checker) {
209
+ return false;
210
+ }
211
+ const type = checker.getTypeFromTypeNode(services.esTreeNodeToTSNodeMap.get(typeNode));
212
+ return type.isUnion() ? type.types.every((member) => member.isStringLiteral()) : type.isStringLiteral();
213
+ }
214
+ }
215
+ function describeNode(node) {
216
+ switch (node.type) {
217
+ case import_utils.AST_NODE_TYPES.ClassDeclaration:
218
+ case import_utils.AST_NODE_TYPES.FunctionDeclaration:
219
+ case import_utils.AST_NODE_TYPES.TSDeclareFunction:
220
+ case import_utils.AST_NODE_TYPES.TSEnumDeclaration:
221
+ case import_utils.AST_NODE_TYPES.TSModuleDeclaration:
222
+ case import_utils.AST_NODE_TYPES.TSTypeAliasDeclaration: {
223
+ return node.id?.type === import_utils.AST_NODE_TYPES.Identifier ? node.id.name : node.type;
224
+ }
225
+ case import_utils.AST_NODE_TYPES.TSInterfaceHeritage: {
226
+ return node.expression.type === import_utils.AST_NODE_TYPES.Identifier ? `extends ${node.expression.name}` : "extends";
227
+ }
228
+ case import_utils.AST_NODE_TYPES.TSMethodSignature:
229
+ case import_utils.AST_NODE_TYPES.TSPropertySignature: {
230
+ return readKeyName(node.key) ?? node.type;
231
+ }
232
+ default: {
233
+ return node.type;
234
+ }
235
+ }
236
+ }
237
+ function isCustomEventOverload(member, isStringLiteralType) {
238
+ if (member.type !== import_utils.AST_NODE_TYPES.TSMethodSignature) {
239
+ return false;
240
+ }
241
+ const name = readKeyName(member.key);
242
+ if (name === null || !EVENT_METHOD_NAMES.has(name)) {
243
+ return false;
244
+ }
245
+ const firstParameter = member.params[0];
246
+ return firstParameter?.type === import_utils.AST_NODE_TYPES.Identifier && firstParameter.typeAnnotation !== void 0 && isStringLiteralType(firstParameter.typeAnnotation.typeAnnotation);
247
+ }
248
+ function readKeyName(key) {
249
+ if (key.type === import_utils.AST_NODE_TYPES.Identifier) {
250
+ return key.name;
251
+ }
252
+ return key.type === import_utils.AST_NODE_TYPES.Literal && typeof key.value === "string" ? key.value : null;
253
+ }
254
+ // Annotate the CommonJS export names for ESM import in node:
255
+ 0 && (module.exports = {
256
+ MESSAGE_ID,
257
+ noLocalObsidianInternals
258
+ });
259
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpbnRlcnMvZXNsaW50LXJ1bGVzL25vLWxvY2FsLW9ic2lkaWFuLWludGVybmFscy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEVTTGludCBydWxlOiBuby1sb2NhbC1vYnNpZGlhbi1pbnRlcm5hbHNcbiAqXG4gKiBSZXBvcnRzIGV2ZXJ5IG1lbWJlciBhIGBkZWNsYXJlIG1vZHVsZSAnb2JzaWRpYW4nYCBhdWdtZW50YXRpb24gYWRkcyB0byBPYnNpZGlhbidzIHR5cGVzLlxuICpcbiAqIE9ic2lkaWFuJ3MgaW50ZXJuYWwgKHVuZG9jdW1lbnRlZCkgQVBJIGlzIHR5cGVkIGluIGBvYnNpZGlhbi10eXBpbmdzYCwgd2hlcmUgZWFjaCBtZW1iZXIgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZVxuICogc2hpcHBlZCBgYXBwLmpzYCBvbiBldmVyeSByZWxlYXNlIHRoYXQgaGFzIGl0LiBBIGxvY2FsIGF1Z21lbnRhdGlvbiBpcyBhIHNlY29uZCwgdW5jaGVja2VkIGNvcHkgb2YgdGhlIHNhbWVcbiAqIGNsYWltOiBpdCBkcmlmdHMgZnJvbSB3aGF0IE9ic2lkaWFuIGFjdHVhbGx5IHNoaXBzLCBhbmQgd2hlbiBgb2JzaWRpYW4tdHlwaW5nc2AgZ2FpbnMgdGhlIG1lbWJlciB0aGUgdHdvXG4gKiBkZWNsYXJhdGlvbnMgbWVyZ2Ugc2lsZW50bHksIG9yIGNsYXNoLiBUaGUgZml4IGZvciBhIG1lbWJlciBgb2JzaWRpYW4tdHlwaW5nc2AgbGFja3Mgb3IgZGVjbGFyZXMgd3JvbmdseSBnb2VzXG4gKiBpbnRvIGBvYnNpZGlhbi10eXBpbmdzYCwgYW5kIHRoZSBjb25zdW1lciBpbXBvcnRzIGl0IGZyb20gdGhlcmUuXG4gKlxuICogT25lIHNoYXBlIGlzIGV4ZW1wdDogYW4gb3ZlcmxvYWQgb2YgYG9uYCwgYG9mZmAsIGB0cmlnZ2VyYCBvciBgdHJ5VHJpZ2dlcmAgd2hvc2UgZmlyc3QgcGFyYW1ldGVyIGlzIGFcbiAqIHN0cmluZy1saXRlcmFsIHR5cGUsIG9yIGEgdW5pb24gb2YgdGhlbS4gVGhhdCBpcyBob3cgYSBwbHVnaW4gdHlwZXMgaXRzIE9XTiBjdXN0b20gZXZlbnRzIG9uIGBXb3Jrc3BhY2VgIG9yXG4gKiBhbm90aGVyIGBFdmVudHNgIHN1YmNsYXNzLCBzbyBpdCBkZXNjcmliZXMgdGhlIHBsdWdpbidzIGNvZGUgcmF0aGVyIHRoYW4gT2JzaWRpYW4ncy4gQSBuYW1lIHR5cGVkIHRocm91Z2ggYW5cbiAqIGFsaWFzIChgbmFtZTogTXlFdmVudE5hbWVgKSBpcyByZWNvZ25pemVkIG9ubHkgd2hlbiB0aGUgZmlsZSBpcyBsaW50ZWQgd2l0aCB0eXBlIGluZm9ybWF0aW9uLCB3aGljaCB0aGUgc2hhcmVkXG4gKiBjb25maWd1cmF0aW9uIGFsd2F5cyBoYXMuXG4gKlxuICogT25seSB0aGUgbW9kdWxlIG5hbWVkIGV4YWN0bHkgYG9ic2lkaWFuYCBpcyByZWFkLiBBIGBkZWNsYXJlIG1vZHVsZSAnb2JzaWRpYW4tdHlwaW5ncydgIGF1Z21lbnRhdGlvbiBvZlxuICogYFBsdWdpbnNQbHVnaW5zUmVjb3JkYCBpcyBgb2JzaWRpYW4tdHlwaW5nc2AnIGRlc2lnbmVkIGV4dGVuc2lvbiBwb2ludCBmb3IgdGhpcmQtcGFydHkgcGx1Z2luIHR5cGVzLCBhbmQgaXNcbiAqIG5vdCByZXBvcnRlZC5cbiAqXG4gKiBOb3QgYXR0ZW1wdGVkOiBhIGxvY2FsIGludGVyZmFjZSBvciBhbiBpbmxpbmUgY2FzdCB0aGF0IHNwZWxscyBhbiBpbnRlcm5hbCBzaGFwZSBjYW5ub3QgYmUgdG9sZCBhcGFydCBmcm9tIGFcbiAqIHJlcG9zaXRvcnkncyBvd24gdHlwZXMgbWVjaGFuaWNhbGx5LCBzbyB0aG9zZSBhcmUgbGVmdCB0byByZXZpZXcuXG4gKi9cbmltcG9ydCB0eXBlIHtcbiAgUGFyc2VyU2VydmljZXMsXG4gIFRTRVNUcmVlXG59IGZyb20gJ0B0eXBlc2NyaXB0LWVzbGludC91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tICdlc2xpbnQnO1xuaW1wb3J0IHR5cGUgeyBUeXBlTm9kZSB9IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyB0b1RTRVNUcmVlTm9kZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L2xpbnRlcnMvZXNsaW50LXJ1bGVzL3RzLWVzdHJlZS1ub2RlJztcbmltcG9ydCB7IEFTVF9OT0RFX1RZUEVTIH0gZnJvbSAnQHR5cGVzY3JpcHQtZXNsaW50L3V0aWxzJztcblxuLyoqXG5NZXNzYWdlIElEIHJlcG9ydGVkIGZvciBhIG1lbWJlciBhIGBkZWNsYXJlIG1vZHVsZSAnb2JzaWRpYW4nYCBhdWdtZW50YXRpb24gYWRkcy5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfSUQgPSAnbm9Mb2NhbE9ic2lkaWFuSW50ZXJuYWxzJztcblxuLyoqXG5UaGUgbW9kdWxlIG5hbWUgd2hvc2UgYXVnbWVudGF0aW9ucyBhcmUgcmVwb3J0ZWQuXG4gKi9cbmNvbnN0IE9CU0lESUFOX01PRFVMRV9OQU1FID0gJ29ic2lkaWFuJztcblxuLyoqXG5UaGUgYEV2ZW50c2AgbWV0aG9kcyBhIGN1c3RvbS1ldmVudCBvdmVybG9hZCBtYXkgYmUgZGVjbGFyZWQgb24uXG4gKi9cbmNvbnN0IEVWRU5UX01FVEhPRF9OQU1FUyA9IG5ldyBTZXQoWydvZmYnLCAnb24nLCAndHJpZ2dlcicsICd0cnlUcmlnZ2VyJ10pO1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdHlwZSBpcyBhIHN0cmluZy1saXRlcmFsIHR5cGUsIG9yIGEgdW5pb24gbWFkZSBvbmx5IG9mIHRoZW0uXG4gKi9cbnR5cGUgU3RyaW5nTGl0ZXJhbFR5cGVDaGVjayA9ICh0eXBlTm9kZTogVFNFU1RyZWUuVHlwZU5vZGUpID0+IGJvb2xlYW47XG5cbi8qKlxuICogRVNMaW50IHJ1bGUgZGlzYWxsb3dpbmcgbG9jYWxseSBkZWNsYXJlZCBPYnNpZGlhbiBpbnRlcm5hbHMgaW4gYSBgZGVjbGFyZSBtb2R1bGUgJ29ic2lkaWFuJ2AgYXVnbWVudGF0aW9uLlxuICovXG5leHBvcnQgY29uc3Qgbm9Mb2NhbE9ic2lkaWFuSW50ZXJuYWxzOiBSdWxlLlJ1bGVNb2R1bGUgPSB7XG4gIGNyZWF0ZShjb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdUU01vZHVsZURlY2xhcmF0aW9uJyhub2RlOiBSdWxlLk5vZGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbW9kdWxlTm9kZSA9IHRvVFNFU1RyZWVOb2RlKG5vZGUpIGFzIFRTRVNUcmVlLlRTTW9kdWxlRGVjbGFyYXRpb247XG5cbiAgICAgICAgaWYgKG1vZHVsZU5vZGUuaWQudHlwZSAhPT0gQVNUX05PREVfVFlQRVMuTGl0ZXJhbCB8fCBtb2R1bGVOb2RlLmlkLnZhbHVlICE9PSBPQlNJRElBTl9NT0RVTEVfTkFNRSB8fCAhbW9kdWxlTm9kZS5ib2R5KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNTdHJpbmdMaXRlcmFsVHlwZSA9IGNyZWF0ZVN0cmluZ0xpdGVyYWxUeXBlQ2hlY2soY29udGV4dCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgbW9kdWxlTm9kZS5ib2R5LmJvZHkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJlcG9ydGVkIG9mIGNvbGxlY3RSZXBvcnRlZE5vZGVzKHN0YXRlbWVudCwgaXNTdHJpbmdMaXRlcmFsVHlwZSkpIHtcbiAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgICAgZGF0YTogeyBuYW1lOiBkZXNjcmliZU5vZGUocmVwb3J0ZWQpIH0sXG4gICAgICAgICAgICAgIGxvYzogcmVwb3J0ZWQubG9jLFxuICAgICAgICAgICAgICBtZXNzYWdlSWQ6IE1FU1NBR0VfSURcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH0sXG4gIG1ldGE6IHtcbiAgICBkb2NzOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0Rpc2FsbG93IGRlY2xhcmluZyBPYnNpZGlhbiBpbnRlcm5hbHMgbG9jYWxseSBpbiBhIGBkZWNsYXJlIG1vZHVsZSBcXCdvYnNpZGlhblxcJ2AgYXVnbWVudGF0aW9uJ1xuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIFtNRVNTQUdFX0lEXTogJ2B7eyBuYW1lIH19YCBkZWNsYXJlcyBPYnNpZGlhbiBBUEkgbG9jYWxseS4gSW1wb3J0IGl0IGZyb20gYG9ic2lkaWFuLXR5cGluZ3NgIGluc3RlYWQsIGFkZGluZyBpdCB0aGVyZSBmaXJzdCBpZiBpdCBpcyBtaXNzaW5nIG9yIHdyb25nLiBPbmx5IGEgY3VzdG9tLWV2ZW50IG92ZXJsb2FkIG9mIGBvbmAgLyBgb2ZmYCAvIGB0cmlnZ2VyYCAvIGB0cnlUcmlnZ2VyYCBtYXkgc3RheSBoZXJlLidcbiAgICB9LFxuICAgIHNjaGVtYTogW10sXG4gICAgdHlwZTogJ3Byb2JsZW0nXG4gIH1cbn07XG5cbi8qKlxuICogQ29sbGVjdHMgdGhlIG5vZGVzIHRvIHJlcG9ydCBmb3Igb25lIHN0YXRlbWVudCBvZiBhIGBkZWNsYXJlIG1vZHVsZSAnb2JzaWRpYW4nYCBibG9jay5cbiAqXG4gKiBBbiBpbnRlcmZhY2UgaXMgcmVwb3J0ZWQgbWVtYmVyIGJ5IG1lbWJlciwgc28gYSBjdXN0b20tZXZlbnQgb3ZlcmxvYWQgY2FuIHNpdCBiZXNpZGUgYSByZXBvcnRlZCBtZW1iZXIsIGFuZCBpdHNcbiAqIGBleHRlbmRzYCBjbGF1c2UgaXMgcmVwb3J0ZWQgdG9vLCBzaW5jZSB0aGF0IGJvbHRzIG1lbWJlcnMgb24gYXMgc3VyZWx5IGFzIGRlY2xhcmluZyB0aGVtLiBBbnkgb3RoZXIgc3RhdGVtZW50XG4gKiAoYSBjbGFzcywgYSBmdW5jdGlvbiwgYSB0eXBlIGFsaWFzLCBhIHZhcmlhYmxlKSBpcyByZXBvcnRlZCB3aG9sZS5cbiAqXG4gKiBAcGFyYW0gc3RhdGVtZW50IC0gQSBzdGF0ZW1lbnQgb2YgdGhlIG1vZHVsZSBibG9jay5cbiAqIEBwYXJhbSBpc1N0cmluZ0xpdGVyYWxUeXBlIC0gVGhlIGNoZWNrIG9mIHdoZXRoZXIgYSB0eXBlIGlzIGEgc3RyaW5nLWxpdGVyYWwgdHlwZSBvciBhIHVuaW9uIG9mIHRoZW0uXG4gKiBAcmV0dXJucyBUaGUgbm9kZXMgdG8gcmVwb3J0LlxuICovXG5mdW5jdGlvbiBjb2xsZWN0UmVwb3J0ZWROb2RlcyhzdGF0ZW1lbnQ6IFRTRVNUcmVlLlByb2dyYW1TdGF0ZW1lbnQsIGlzU3RyaW5nTGl0ZXJhbFR5cGU6IFN0cmluZ0xpdGVyYWxUeXBlQ2hlY2spOiBUU0VTVHJlZS5Ob2RlW10ge1xuICBjb25zdCBkZWNsYXJhdGlvbiA9IHN0YXRlbWVudC50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5FeHBvcnROYW1lZERlY2xhcmF0aW9uICYmIHN0YXRlbWVudC5kZWNsYXJhdGlvbiA/IHN0YXRlbWVudC5kZWNsYXJhdGlvbiA6IHN0YXRlbWVudDtcblxuICBpZiAoZGVjbGFyYXRpb24udHlwZSAhPT0gQVNUX05PREVfVFlQRVMuVFNJbnRlcmZhY2VEZWNsYXJhdGlvbikge1xuICAgIHJldHVybiBbZGVjbGFyYXRpb25dO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICAuLi5kZWNsYXJhdGlvbi5leHRlbmRzLFxuICAgIC4uLmRlY2xhcmF0aW9uLmJvZHkuYm9keS5maWx0ZXIoKG1lbWJlcikgPT4gIWlzQ3VzdG9tRXZlbnRPdmVybG9hZChtZW1iZXIsIGlzU3RyaW5nTGl0ZXJhbFR5cGUpKVxuICBdO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGNoZWNrIG9mIHdoZXRoZXIgYSB0eXBlIGlzIGEgc3RyaW5nLWxpdGVyYWwgdHlwZSwgb3IgYSB1bmlvbiBtYWRlIG9ubHkgb2YgdGhlbS5cbiAqXG4gKiBBIHR5cGUgd3JpdHRlbiBvdXQgYXMgbGl0ZXJhbHMgKGAnbXktZXZlbnQnIHwgJ290aGVyLWV2ZW50J2ApIGlzIHJlY29nbml6ZWQgZnJvbSB0aGUgc3ludGF4IGFsb25lLiBBIHR5cGUgcmVhY2hlZFxuICogdGhyb3VnaCBhbiBhbGlhcyAoYG5hbWU6IE15RXZlbnROYW1lYCkgbmVlZHMgdGhlIHR5cGUgY2hlY2tlciwgc28gaXQgaXMgcmVjb2duaXplZCBvbmx5IHdoZW4gdGhlIGZpbGUgaXMgbGludGVkXG4gKiB3aXRoIHR5cGUgaW5mb3JtYXRpb24sIGFuZCByZXBvcnRlZCBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUgcnVsZSBjb250ZXh0LlxuICogQHJldHVybnMgVGhlIGNoZWNrLlxuICovXG5mdW5jdGlvbiBjcmVhdGVTdHJpbmdMaXRlcmFsVHlwZUNoZWNrKGNvbnRleHQ6IFJ1bGUuUnVsZUNvbnRleHQpOiBTdHJpbmdMaXRlcmFsVHlwZUNoZWNrIHtcbiAgY29uc3Qgc2VydmljZXMgPSBjb250ZXh0LnNvdXJjZUNvZGUucGFyc2VyU2VydmljZXMgYXMgUGFyc2VyU2VydmljZXM7XG4gIGNvbnN0IGNoZWNrZXIgPSBzZXJ2aWNlcy5wcm9ncmFtPy5nZXRUeXBlQ2hlY2tlcigpID8/IG51bGw7XG5cbiAgcmV0dXJuIGlzU3RyaW5nTGl0ZXJhbFR5cGU7XG5cbiAgZnVuY3Rpb24gaXNTdHJpbmdMaXRlcmFsVHlwZSh0eXBlTm9kZTogVFNFU1RyZWUuVHlwZU5vZGUpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZU5vZGUudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuVFNVbmlvblR5cGUpIHtcbiAgICAgIHJldHVybiB0eXBlTm9kZS50eXBlcy5ldmVyeSgobWVtYmVyKSA9PiBpc1N0cmluZ0xpdGVyYWxUeXBlKG1lbWJlcikpO1xuICAgIH1cblxuICAgIGlmICh0eXBlTm9kZS50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5UU0xpdGVyYWxUeXBlKSB7XG4gICAgICByZXR1cm4gdHlwZU5vZGUubGl0ZXJhbC50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5MaXRlcmFsICYmIHR5cGVvZiB0eXBlTm9kZS5saXRlcmFsLnZhbHVlID09PSAnc3RyaW5nJztcbiAgICB9XG5cbiAgICBpZiAoIWNoZWNrZXIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlID0gY2hlY2tlci5nZXRUeXBlRnJvbVR5cGVOb2RlKHNlcnZpY2VzLmVzVHJlZU5vZGVUb1RTTm9kZU1hcC5nZXQodHlwZU5vZGUpIGFzIFR5cGVOb2RlKTtcbiAgICByZXR1cm4gdHlwZS5pc1VuaW9uKCkgPyB0eXBlLnR5cGVzLmV2ZXJ5KChtZW1iZXIpID0+IG1lbWJlci5pc1N0cmluZ0xpdGVyYWwoKSkgOiB0eXBlLmlzU3RyaW5nTGl0ZXJhbCgpO1xuICB9XG59XG5cbi8qKlxuICogTmFtZXMgYSByZXBvcnRlZCBub2RlIGZvciB0aGUgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSByZXBvcnRlZCBub2RlLlxuICogQHJldHVybnMgVGhlIG5hbWUgdG8gc2hvdy5cbiAqL1xuZnVuY3Rpb24gZGVzY3JpYmVOb2RlKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgQVNUX05PREVfVFlQRVMuQ2xhc3NEZWNsYXJhdGlvbjpcbiAgICBjYXNlIEFTVF9OT0RFX1RZUEVTLkZ1bmN0aW9uRGVjbGFyYXRpb246XG4gICAgY2FzZSBBU1RfTk9ERV9UWVBFUy5UU0RlY2xhcmVGdW5jdGlvbjpcbiAgICBjYXNlIEFTVF9OT0RFX1RZUEVTLlRTRW51bURlY2xhcmF0aW9uOlxuICAgIGNhc2UgQVNUX05PREVfVFlQRVMuVFNNb2R1bGVEZWNsYXJhdGlvbjpcbiAgICBjYXNlIEFTVF9OT0RFX1RZUEVTLlRTVHlwZUFsaWFzRGVjbGFyYXRpb246IHtcbiAgICAgIHJldHVybiBub2RlLmlkPy50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5JZGVudGlmaWVyID8gbm9kZS5pZC5uYW1lIDogbm9kZS50eXBlO1xuICAgIH1cbiAgICBjYXNlIEFTVF9OT0RFX1RZUEVTLlRTSW50ZXJmYWNlSGVyaXRhZ2U6IHtcbiAgICAgIHJldHVybiBub2RlLmV4cHJlc3Npb24udHlwZSA9PT0gQVNUX05PREVfVFlQRVMuSWRlbnRpZmllciA/IGBleHRlbmRzICR7bm9kZS5leHByZXNzaW9uLm5hbWV9YCA6ICdleHRlbmRzJztcbiAgICB9XG4gICAgY2FzZSBBU1RfTk9ERV9UWVBFUy5UU01ldGhvZFNpZ25hdHVyZTpcbiAgICBjYXNlIEFTVF9OT0RFX1RZUEVTLlRTUHJvcGVydHlTaWduYXR1cmU6IHtcbiAgICAgIHJldHVybiByZWFkS2V5TmFtZShub2RlLmtleSkgPz8gbm9kZS50eXBlO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gbm9kZS50eXBlO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGFuIGludGVyZmFjZSBtZW1iZXIgaXMgYSBjdXN0b20tZXZlbnQgb3ZlcmxvYWQ6IGFuIGBvbmAgLyBgb2ZmYCAvIGB0cmlnZ2VyYCAvIGB0cnlUcmlnZ2VyYCBtZXRob2RcbiAqIHdob3NlIGZpcnN0IHBhcmFtZXRlciBpcyB0eXBlZCBhcyBhIHN0cmluZy1saXRlcmFsIHR5cGUgb3IgYSB1bmlvbiBvZiB0aGVtLlxuICpcbiAqIEBwYXJhbSBtZW1iZXIgLSBUaGUgaW50ZXJmYWNlIG1lbWJlci5cbiAqIEBwYXJhbSBpc1N0cmluZ0xpdGVyYWxUeXBlIC0gVGhlIGNoZWNrIG9mIHdoZXRoZXIgYSB0eXBlIGlzIGEgc3RyaW5nLWxpdGVyYWwgdHlwZSBvciBhIHVuaW9uIG9mIHRoZW0uXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgbWVtYmVyIGlzIGV4ZW1wdC5cbiAqL1xuZnVuY3Rpb24gaXNDdXN0b21FdmVudE92ZXJsb2FkKG1lbWJlcjogVFNFU1RyZWUuVHlwZUVsZW1lbnQsIGlzU3RyaW5nTGl0ZXJhbFR5cGU6IFN0cmluZ0xpdGVyYWxUeXBlQ2hlY2spOiBib29sZWFuIHtcbiAgaWYgKG1lbWJlci50eXBlICE9PSBBU1RfTk9ERV9UWVBFUy5UU01ldGhvZFNpZ25hdHVyZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG5hbWUgPSByZWFkS2V5TmFtZShtZW1iZXIua2V5KTtcbiAgaWYgKG5hbWUgPT09IG51bGwgfHwgIUVWRU5UX01FVEhPRF9OQU1FUy5oYXMobmFtZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBmaXJzdFBhcmFtZXRlciA9IG1lbWJlci5wYXJhbXNbMF07XG4gIHJldHVybiBmaXJzdFBhcmFtZXRlcj8udHlwZSA9PT0gQVNUX05PREVfVFlQRVMuSWRlbnRpZmllciAmJiBmaXJzdFBhcmFtZXRlci50eXBlQW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkXG4gICAgJiYgaXNTdHJpbmdMaXRlcmFsVHlwZShmaXJzdFBhcmFtZXRlci50eXBlQW5ub3RhdGlvbi50eXBlQW5ub3RhdGlvbik7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIG5hbWUgb2YgYSBtZW1iZXIga2V5IHdyaXR0ZW4gYXMgYW4gaWRlbnRpZmllciBvciBhIHN0cmluZyBsaXRlcmFsLlxuICpcbiAqIEBwYXJhbSBrZXkgLSBUaGUgbWVtYmVyIGtleS5cbiAqIEByZXR1cm5zIFRoZSBuYW1lLCBvciBgbnVsbGAgZm9yIGEgY29tcHV0ZWQga2V5LlxuICovXG5mdW5jdGlvbiByZWFkS2V5TmFtZShrZXk6IFRTRVNUcmVlLlByb3BlcnR5TmFtZSk6IG51bGwgfCBzdHJpbmcge1xuICBpZiAoa2V5LnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLklkZW50aWZpZXIpIHtcbiAgICByZXR1cm4ga2V5Lm5hbWU7XG4gIH1cblxuICByZXR1cm4ga2V5LnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLkxpdGVyYWwgJiYgdHlwZW9mIGtleS52YWx1ZSA9PT0gJ3N0cmluZycgPyBrZXkudmFsdWUgOiBudWxsO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
@@ -0,0 +1,10 @@
1
+ /// <reference path="../../index.d.cts" />
2
+ import type { Rule } from 'eslint' with { 'resolution-mode': 'import' };
3
+ /**
4
+ Message ID reported for a member a `declare module 'obsidian'` augmentation adds.
5
+ */
6
+ export declare const MESSAGE_ID = "noLocalObsidianInternals";
7
+ /**
8
+ * ESLint rule disallowing locally declared Obsidian internals in a `declare module 'obsidian'` augmentation.
9
+ */
10
+ export declare const noLocalObsidianInternals: Rule.RuleModule;