obsidian-dev-utils 101.7.0 → 102.0.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 (31) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/lib/cjs/desktop-zip-extractor.cjs +1 -1
  3. package/dist/lib/cjs/desktop-zip-extractor.d.cts +4 -3
  4. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  5. package/dist/lib/cjs/script-utils/demo-vault-app-json.cjs +1 -1
  6. package/dist/lib/cjs/script-utils/demo-vault-app-json.d.cts +1 -1
  7. package/dist/lib/cjs/script-utils/demo-vault-buttons.cjs +3 -3
  8. package/dist/lib/cjs/script-utils/demo-vault-buttons.d.cts +8 -2
  9. package/dist/lib/cjs/script-utils/demo-vault.cjs +50 -29
  10. package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +9 -1
  11. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +4 -1
  12. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.d.cts +1 -0
  13. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.cjs +408 -0
  14. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.d.cts +10 -0
  15. package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +3 -1
  16. package/dist/lib/esm/desktop-zip-extractor.d.mts +4 -3
  17. package/dist/lib/esm/desktop-zip-extractor.mjs +1 -1
  18. package/dist/lib/esm/generated-during-build.mjs +1 -1
  19. package/dist/lib/esm/script-utils/demo-vault-app-json.d.mts +1 -1
  20. package/dist/lib/esm/script-utils/demo-vault-app-json.mjs +1 -1
  21. package/dist/lib/esm/script-utils/demo-vault-buttons.d.mts +8 -2
  22. package/dist/lib/esm/script-utils/demo-vault-buttons.mjs +3 -3
  23. package/dist/lib/esm/script-utils/demo-vault.mjs +52 -20
  24. package/dist/lib/esm/script-utils/linters/eslint-config.mjs +9 -1
  25. package/dist/lib/esm/script-utils/linters/eslint-rules/index.d.mts +1 -0
  26. package/dist/lib/esm/script-utils/linters/eslint-rules/index.mjs +3 -1
  27. package/dist/lib/esm/script-utils/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.d.mts +10 -0
  28. package/dist/lib/esm/script-utils/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.mjs +302 -0
  29. package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +3 -1
  30. package/package.json +3 -4
  31. package/script-utils/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian/package.json +6 -0
@@ -0,0 +1,408 @@
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 ensureBrowserProcess() {
8
+ const browserProcess = {
9
+ browser: true,
10
+ cwd() {
11
+ return '/';
12
+ },
13
+ env: {},
14
+ platform: 'android'
15
+ };
16
+
17
+ // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
18
+ const existingProcess = globalThis.process;
19
+
20
+ if (!existingProcess) {
21
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
22
+ globalThis.process = browserProcess;
23
+ return;
24
+ }
25
+
26
+ if (existingProcess.versions?.node) {
27
+ return;
28
+ }
29
+
30
+ const existingProcessRecord = existingProcess;
31
+
32
+ for (const [key, value] of Object.entries(browserProcess)) {
33
+ existingProcessRecord[key] ??= value;
34
+ }
35
+
36
+ existingProcessRecord['browser'] = true;
37
+ }
38
+
39
+ function keepName($unknown) {
40
+ return $unknown;
41
+ }
42
+
43
+ (function initCjs() {
44
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
45
+ const globalThisRecord = globalThis;
46
+ globalThisRecord['__name'] ??= keepName;
47
+ const originalRequire = require;
48
+ if (originalRequire && !originalRequire.__isPatched) {
49
+ // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
50
+ require = Object.assign(
51
+ (id) => requirePatched(id),
52
+ originalRequire,
53
+ {
54
+ __isPatched: true
55
+ }
56
+ );
57
+ }
58
+
59
+ globalThisRecord['__extractDefault'] ??= extractDefault;
60
+
61
+ ensureBrowserProcess();
62
+
63
+ function extractDefault(module) {
64
+ return module && module.__esModule && 'default' in module ? module.default : module;
65
+ }
66
+
67
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
68
+ '@codemirror/autocomplete',
69
+ '@codemirror/collab',
70
+ '@codemirror/commands',
71
+ '@codemirror/language',
72
+ '@codemirror/lint',
73
+ '@codemirror/search',
74
+ '@codemirror/state',
75
+ '@codemirror/text',
76
+ '@codemirror/view',
77
+ '@lezer/common',
78
+ '@lezer/highlight',
79
+ '@lezer/lr',
80
+ 'obsidian']
81
+ );
82
+
83
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
84
+ '@codemirror/closebrackets',
85
+ '@codemirror/comment',
86
+ '@codemirror/fold',
87
+ '@codemirror/gutter',
88
+ '@codemirror/highlight',
89
+ '@codemirror/history',
90
+ '@codemirror/matchbrackets',
91
+ '@codemirror/panel',
92
+ '@codemirror/rangeset',
93
+ '@codemirror/rectangular-selection',
94
+ '@codemirror/stream-parser',
95
+ '@codemirror/tooltip']
96
+ );
97
+
98
+ function requirePatched(id) {
99
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
100
+ return originalRequire?.(id);
101
+ }
102
+
103
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
104
+ if (globalThis.app.isMobile) {
105
+ if (id === 'process' || id === 'node:process') {
106
+ // eslint-disable-next-line no-console -- Valid usage.
107
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
108
+
109
+ return process;
110
+ }
111
+ } else {
112
+ const module = originalRequire?.(id);
113
+ if (module) {
114
+ return extractDefault(module);
115
+ }
116
+ }
117
+
118
+ // eslint-disable-next-line no-console -- Valid usage.
119
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
120
+ return {};
121
+ }
122
+ })();
123
+ })();
124
+
125
+ "use strict";
126
+ var __defProp = Object.defineProperty;
127
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
128
+ var __getOwnPropNames = Object.getOwnPropertyNames;
129
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
130
+ var __export = (target, all) => {
131
+ for (var name in all)
132
+ __defProp(target, name, { get: all[name], enumerable: true });
133
+ };
134
+ var __copyProps = (to, from, except, desc) => {
135
+ if (from && typeof from === "object" || typeof from === "function") {
136
+ for (let key of __getOwnPropNames(from))
137
+ if (!__hasOwnProp.call(to, key) && key !== except)
138
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
139
+ }
140
+ return to;
141
+ };
142
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
143
+ var no_over_cap_wait_in_eval_in_obsidian_exports = {};
144
+ __export(no_over_cap_wait_in_eval_in_obsidian_exports, {
145
+ MESSAGE_ID: () => MESSAGE_ID,
146
+ noOverCapWaitInEvalInObsidian: () => noOverCapWaitInEvalInObsidian
147
+ });
148
+ module.exports = __toCommonJS(no_over_cap_wait_in_eval_in_obsidian_exports);
149
+ const MESSAGE_ID = "noOverCapWaitInEvalInObsidian";
150
+ const DEFAULT_CAP_IN_MILLISECONDS = 3e4;
151
+ const WAIT_UNTIL_DEFAULT_TIMEOUT_IN_MILLISECONDS = 5e3;
152
+ const INPUT_PROPERTY_NAME = "input";
153
+ const SLEEP_CALLEE_NAME = "sleep";
154
+ const TIMEOUT_PROPERTY_NAME = "timeoutInMilliseconds";
155
+ const WAIT_UNTIL_CALLEE_NAME = "waitUntil";
156
+ const CLOSURE_NAMES_BY_CALLEE_NAME = /* @__PURE__ */ new Map([
157
+ ["evalInObsidian", ["callback"]],
158
+ ["pollInObsidian", ["poll", "start"]]
159
+ ]);
160
+ const noOverCapWaitInEvalInObsidian = {
161
+ create(context) {
162
+ const options = context.options[0];
163
+ const capInMilliseconds = options?.capInMilliseconds ?? DEFAULT_CAP_IN_MILLISECONDS;
164
+ const budgetByClosureNode = /* @__PURE__ */ new Map();
165
+ return {
166
+ "CallExpression"(node) {
167
+ const callNode = node;
168
+ const budgetExpression = readWaitBudgetExpression(callNode);
169
+ if (budgetExpression === void 0) {
170
+ return;
171
+ }
172
+ const closure = findEnclosingEvalClosure(callNode);
173
+ if (!closure) {
174
+ return;
175
+ }
176
+ const waitInMilliseconds = budgetExpression === null ? WAIT_UNTIL_DEFAULT_TIMEOUT_IN_MILLISECONDS : resolveMilliseconds(budgetExpression, closure, context);
177
+ if (waitInMilliseconds === null) {
178
+ return;
179
+ }
180
+ const runningTotalInMilliseconds = budgetByClosureNode.get(closure.closureNode)?.totalInMilliseconds ?? 0;
181
+ budgetByClosureNode.set(closure.closureNode, {
182
+ reportNode: closure.reportNode,
183
+ totalInMilliseconds: runningTotalInMilliseconds + waitInMilliseconds
184
+ });
185
+ },
186
+ "Program:exit"() {
187
+ for (const budget of budgetByClosureNode.values()) {
188
+ if (budget.totalInMilliseconds < capInMilliseconds) {
189
+ continue;
190
+ }
191
+ context.report({
192
+ data: {
193
+ capInMilliseconds: String(capInMilliseconds),
194
+ totalInMilliseconds: String(budget.totalInMilliseconds)
195
+ },
196
+ messageId: MESSAGE_ID,
197
+ node: budget.reportNode
198
+ });
199
+ }
200
+ }
201
+ };
202
+ },
203
+ meta: {
204
+ docs: {
205
+ description: "Disallow an in-Obsidian closure declaring more waiting than the transport's script-timeout cap allows"
206
+ },
207
+ messages: {
208
+ [MESSAGE_ID]: "This closure declares {{ totalInMilliseconds }} ms of waiting, at or over the transport's {{ capInMilliseconds }} ms cap, so it can only ever die as a bare `script timeout`: wait in Node instead, with a short DOM-reading `pollInObsidian` `poll`, an `until` evaluated in Node, and the long budget in `timeoutInMilliseconds`."
209
+ },
210
+ schema: [{
211
+ additionalProperties: false,
212
+ properties: {
213
+ capInMilliseconds: {
214
+ minimum: 1,
215
+ type: "integer"
216
+ }
217
+ },
218
+ type: "object"
219
+ }],
220
+ type: "problem"
221
+ }
222
+ };
223
+ function findEnclosingEvalClosure(node) {
224
+ let currentNode = node.parent;
225
+ while (currentNode) {
226
+ const closure = readEvalClosure(currentNode);
227
+ if (closure) {
228
+ return closure;
229
+ }
230
+ currentNode = currentNode.parent;
231
+ }
232
+ return null;
233
+ }
234
+ function findVariable(scope, name) {
235
+ let currentScope = scope;
236
+ while (currentScope) {
237
+ const variable = currentScope.variables.find((candidate) => candidate.name === name);
238
+ if (variable) {
239
+ return variable;
240
+ }
241
+ currentScope = currentScope.upper;
242
+ }
243
+ return null;
244
+ }
245
+ function isBinaryExpression(node) {
246
+ return node.type === "BinaryExpression";
247
+ }
248
+ function isCallExpression(node) {
249
+ return node.type === "CallExpression";
250
+ }
251
+ function isClosureFunction(node) {
252
+ return node.type === "FunctionExpression" || node.type === "ArrowFunctionExpression";
253
+ }
254
+ function isIdentifier(node) {
255
+ return node.type === "Identifier";
256
+ }
257
+ function isNumericLiteral(node) {
258
+ return node.type === "Literal" && typeof node.value === "number";
259
+ }
260
+ function isObjectExpression(node) {
261
+ return node.type === "ObjectExpression";
262
+ }
263
+ function isObjectPattern(node) {
264
+ return node.type === "ObjectPattern";
265
+ }
266
+ function isProperty(node) {
267
+ return node.type === "Property";
268
+ }
269
+ function isVariableDeclarator(node) {
270
+ return node.type === "VariableDeclarator";
271
+ }
272
+ function readBoundExpression(node, closure, context) {
273
+ const variable = findVariable(context.sourceCode.getScope(node), node.name);
274
+ if (!variable) {
275
+ return null;
276
+ }
277
+ for (const definition of variable.defs) {
278
+ const definitionNode = definition.node;
279
+ if (isVariableDeclarator(definitionNode) && definitionNode.init) {
280
+ return definitionNode.init;
281
+ }
282
+ if (definitionNode === closure.closureNode) {
283
+ const inputKey = readParameterInputKey(closure.closureNode, node.name);
284
+ if (inputKey === null) {
285
+ return null;
286
+ }
287
+ return readInputPropertyValue(closure.paramsNode, inputKey);
288
+ }
289
+ }
290
+ return null;
291
+ }
292
+ function readClosureNames(callNode) {
293
+ if (!isIdentifier(callNode.callee)) {
294
+ return null;
295
+ }
296
+ return CLOSURE_NAMES_BY_CALLEE_NAME.get(callNode.callee.name) ?? null;
297
+ }
298
+ function readEvalClosure(node) {
299
+ if (!isClosureFunction(node)) {
300
+ return null;
301
+ }
302
+ const propertyNode = node.parent;
303
+ if (!isProperty(propertyNode)) {
304
+ return null;
305
+ }
306
+ const paramsNode = propertyNode.parent;
307
+ if (!isObjectExpression(paramsNode)) {
308
+ return null;
309
+ }
310
+ if (!isIdentifier(propertyNode.key)) {
311
+ return null;
312
+ }
313
+ const callNode = paramsNode.parent;
314
+ if (!isCallExpression(callNode) || callNode.arguments[0] !== paramsNode) {
315
+ return null;
316
+ }
317
+ const closureNames = readClosureNames(callNode);
318
+ if (!closureNames?.includes(propertyNode.key.name)) {
319
+ return null;
320
+ }
321
+ return {
322
+ closureNode: node,
323
+ paramsNode,
324
+ reportNode: propertyNode
325
+ };
326
+ }
327
+ function readInputPropertyValue(paramsNode, keyName) {
328
+ const inputProperty = paramsNode.properties.find(
329
+ (property) => isProperty(property) && isIdentifier(property.key) && property.key.name === INPUT_PROPERTY_NAME
330
+ );
331
+ const inputNode = inputProperty?.value;
332
+ if (!inputNode || !isObjectExpression(inputNode)) {
333
+ return null;
334
+ }
335
+ const valueProperty = inputNode.properties.find(
336
+ (property) => isProperty(property) && isIdentifier(property.key) && property.key.name === keyName
337
+ );
338
+ return valueProperty?.value ?? null;
339
+ }
340
+ function readParameterInputKey(closureNode, localName) {
341
+ for (const parameterNode of closureNode.params) {
342
+ if (!isObjectPattern(parameterNode)) {
343
+ continue;
344
+ }
345
+ for (const property of parameterNode.properties) {
346
+ if (!isProperty(property) || property.computed || !isIdentifier(property.key) || !isIdentifier(property.value)) {
347
+ continue;
348
+ }
349
+ if (property.value.name === localName) {
350
+ return property.key.name;
351
+ }
352
+ }
353
+ }
354
+ return null;
355
+ }
356
+ function readWaitBudgetExpression(callNode) {
357
+ if (!isIdentifier(callNode.callee)) {
358
+ return void 0;
359
+ }
360
+ const calleeName = callNode.callee.name;
361
+ if (calleeName === SLEEP_CALLEE_NAME) {
362
+ return callNode.arguments[0] ?? void 0;
363
+ }
364
+ if (calleeName !== WAIT_UNTIL_CALLEE_NAME) {
365
+ return void 0;
366
+ }
367
+ const paramsNode = callNode.arguments[0];
368
+ if (!paramsNode || !isObjectExpression(paramsNode)) {
369
+ return void 0;
370
+ }
371
+ const timeoutProperty = paramsNode.properties.find(
372
+ (property) => isProperty(property) && isIdentifier(property.key) && property.key.name === TIMEOUT_PROPERTY_NAME
373
+ );
374
+ return timeoutProperty?.value ?? null;
375
+ }
376
+ function resolveMilliseconds(node, closure, context) {
377
+ const visitedNodes = /* @__PURE__ */ new Set();
378
+ let currentNode = node;
379
+ while (!visitedNodes.has(currentNode)) {
380
+ visitedNodes.add(currentNode);
381
+ if (isNumericLiteral(currentNode)) {
382
+ return currentNode.value;
383
+ }
384
+ if (isBinaryExpression(currentNode) && currentNode.operator === "*") {
385
+ const leftInMilliseconds = resolveMilliseconds(currentNode.left, closure, context);
386
+ const rightInMilliseconds = resolveMilliseconds(currentNode.right, closure, context);
387
+ if (leftInMilliseconds === null || rightInMilliseconds === null) {
388
+ return null;
389
+ }
390
+ return leftInMilliseconds * rightInMilliseconds;
391
+ }
392
+ if (!isIdentifier(currentNode)) {
393
+ return null;
394
+ }
395
+ const boundNode = readBoundExpression(currentNode, closure, context);
396
+ if (!boundNode) {
397
+ return null;
398
+ }
399
+ currentNode = boundNode;
400
+ }
401
+ return null;
402
+ }
403
+ // Annotate the CommonJS export names for ESM import in node:
404
+ 0 && (module.exports = {
405
+ MESSAGE_ID,
406
+ noOverCapWaitInEvalInObsidian
407
+ });
408
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL2VzbGludC1ydWxlcy9uby1vdmVyLWNhcC13YWl0LWluLWV2YWwtaW4tb2JzaWRpYW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBFU0xpbnQgcnVsZTogbm8tb3Zlci1jYXAtd2FpdC1pbi1ldmFsLWluLW9ic2lkaWFuXG4gKlxuICogUmVwb3J0cyBhbiBgZXZhbEluT2JzaWRpYW5gIC8gYHBvbGxJbk9ic2lkaWFuYCBjbG9zdXJlIHRoYXQgZGVjbGFyZXMgbW9yZSB3YWl0aW5nXG4gKiB0aGFuIHRoZSB0cmFuc3BvcnQgY2FuIGV2ZXIgaG9ub3VyLlxuICpcbiAqIEEgc2luZ2xlIGNsb3N1cmUgaXMgZXZhbHVhdGVkIHRocm91Z2ggb25lIHRyYW5zcG9ydCBjYWxsLCBhbmQgdGhhdCBjYWxsIGlzIGNhcHBlZCBhdFxuICogcm91Z2hseSAzMCBzZWNvbmRzIFx1MjAxNCBBcHBpdW0gc3VyZmFjZXMgdGhlIGNhcCBhcyBhIGJhcmUgYFdlYkRyaXZlckVycm9yOiBzY3JpcHQgdGltZW91dGBcbiAqIG5hbWluZyBvbmx5IGBBcHBpdW1UcmFuc3BvcnQuZXZhbHVhdGVgLCBDRFAgYXMgYSBjb21tYW5kIHRpbWVvdXQuIE5laXRoZXIgbmFtZXMgdGhlIHdhaXRcbiAqIHRoYXQgYWN0dWFsbHkgYmxldyB0aGUgYnVkZ2V0LCBzbyB0aGUgZmFpbHVyZSByZWFkcyBhcyBhIGJyb2tlbiBkZXZpY2UgcmF0aGVyIHRoYW4gYXMgYVxuICogY2xvc3VyZSBhc2tpbmcgZm9yIG1vcmUgdGltZSB0aGFuIGV4aXN0cy4gVGhhdCBtaXNkaWFnbm9zaXMgY29zdCBgVDc5NmAgdHdvIGRheXMuXG4gKlxuICogQSBjbG9zdXJlIGRlY2xhcmluZyBhIDMwIDAwMCBtcyBgd2FpdFVudGlsYCwgb3IgdHdvIDIwIDAwMCBtcyBvbmVzLCB0aGVyZWZvcmUgY2Fubm90XG4gKiBzdWNjZWVkIG9uIGFueSBtYWNoaW5lIHNsb3cgZW5vdWdoIHRvIG5lZWQgdGhlIHRpbWUgaXQgYXNrcyBmb3IuIFRoZSBmaXggaXMgdG8gbW92ZSB0aGVcbiAqIHdhaXRpbmcgdG8gTm9kZTogYHBvbGxJbk9ic2lkaWFuYCBydW5zIGEgU0hPUlQgRE9NLXJlYWRpbmcgYHBvbGxgIGNsb3N1cmUgcmVwZWF0ZWRseSxcbiAqIGV2YWx1YXRlcyBgdW50aWxgIGluIE5vZGUsIGFuZCBjYXJyaWVzIHRoZSBsb25nIGJ1ZGdldCBpbiBgdGltZW91dEluTWlsbGlzZWNvbmRzYCwgc28gbm9cbiAqIHNpbmdsZSB0cmFuc3BvcnQgY2FsbCBpcyBldmVyIGxvbmcuXG4gKlxuICogV0hBVCBDT1VOVFMgdG93YXJkIGEgY2xvc3VyZSdzIGJ1ZGdldCwgc3VtbWVkIGxleGljYWxseTogZXZlcnkgYHdhaXRVbnRpbGAgaW5zaWRlIGl0IFx1MjAxNFxuICogdGFraW5nIHRoZSBoZWxwZXIncyBkb2N1bWVudGVkIDUgMDAwIG1zIGRlZmF1bHQgd2hlbiBgdGltZW91dEluTWlsbGlzZWNvbmRzYCBpcyBvbWl0dGVkLFxuICogd2hpY2ggaXMgd2hhdCBtYWtlcyBzZXZlcmFsIHNtYWxsIHNpYmxpbmcgd2FpdHMgYWRkIHVwIGhvbmVzdGx5IFx1MjAxNCBwbHVzIGV2ZXJ5IGBzbGVlcChuKWBcbiAqIHNldHRsZS4gV2FpdHMgaW5zaWRlIGEgaGVscGVyIGRlY2xhcmVkIHdpdGhpbiB0aGUgY2xvc3VyZSBjb3VudCB0b287IHRoZSBlbmNsb3NpbmdcbiAqIGNsb3N1cmUgaXMgZm91bmQgYnkgd2Fsa2luZyBvdXR3YXJkcywgc28gYSBuZXN0ZWQgZnVuY3Rpb24gYXR0cmlidXRlcyB0byB0aGUgY2xvc3VyZSBpdFxuICogcnVucyBpbnNpZGUuXG4gKlxuICogV0hBVCBET0VTIE5PVC4gQSBidWRnZXQgdGhhdCBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSBudW1iZXIgY29udHJpYnV0ZXMgbm90aGluZyBhbmQgaXNcbiAqIG5ldmVyIHJlcG9ydGVkIChvd25lciwgMjAyNi0wOS0wOSkuIFNjb3BlIGFuYWx5c2lzIHJlc29sdmVzIHRoZSBzaGFwZXMgdGhhdCBhY3R1YWxseVxuICogb2NjdXIgXHUyMDE0IGEgbGl0ZXJhbCwgYSBgY29uc3RgIGluIGFueSBlbmNsb3Npbmcgc2NvcGUsIGFuZCBhIGRlc3RydWN0dXJlZCBjYWxsYmFja1xuICogcGFyYW1ldGVyIGZvbGxvd2VkIGJhY2sgdGhyb3VnaCB0aGUgY2FsbCdzIG93biBgaW5wdXRgIG9iamVjdCBcdTIwMTQgYW5kIHJlc29sdmluZyB0aHJvdWdoXG4gKiBzY29wZSByYXRoZXIgdGhhbiBieSByZWdleCBpcyB0aGUgd2hvbGUgcmVhc29uIHRoaXMgaXMgYSBydWxlIGFuZCBub3QgYSBzY3JpcHQuIEJ1dCBhXG4gKiB2YWx1ZSBhcnJpdmluZyBmcm9tIGEgY2FsbGVyIChgb3B0aW9ucy50aW1lb3V0ID8/IERFRkFVTFRgLCB0aHJlYWRlZCB0aHJvdWdoIGFcbiAqIHBhcmFtZXRlcikgd291bGQgbmVlZCBhbmFseXNpcyBhY3Jvc3MgY2FsbCBib3VuZGFyaWVzLCBhbmQgcmVwb3J0aW5nIGV2ZXJ5IHN1Y2ggc2l0ZSB3b3VsZFxuICogbWFrZSBlYWNoIGxlZ2l0aW1hdGVseSBwYXJhbWV0ZXJpemVkIGhlbHBlciByZWQgYWNyb3NzIHRoaXJ0eSByZXBvcy4gQSBMT09QIGlzIG91dCBvZiBzY29wZVxuICogZm9yIHRoZSBzYW1lIHJlYXNvbjogYSBgc2xlZXBgIGluIGEgYHdoaWxlYCBoYXMgbm8gc3RhdGljYWxseSBkZWNsYXJlZCBjZWlsaW5nLCBzbyB0aGVcbiAqIHN1bSBiZWxvdyBpcyBwZXItaXRlcmF0aW9uIGFuZCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHdob2xlLlxuICpcbiAqIE5vdCBldmVyeSBvdmVyLWNhcCBjbG9zdXJlIGNhbiBiZWNvbWUgYSBgcG9sbGAgLyBgdW50aWxgIHBhaXIsIHNvIHRoZSBydWxlIGlzIG1lYW50IHRvIGJlXG4gKiBkaXNhYmxlZCBcdTIwMTQgd2l0aCBhIHJlYXNvbiBcdTIwMTQgYXQgdGhlIHNpdGVzIHRoYXQgaGF2ZSBvbmUuIGByZXF1aXJlLWRlc2NyaXB0aW9uYCBtYWtlcyB0aGF0XG4gKiByZWFzb24gbWFuZGF0b3J5LCB3aGljaCBpcyB0aGUgcG9pbnQ6IGl0IHR1cm5zIGFuIGludmlzaWJsZSBhc3N1bXB0aW9uIGludG8gYSB3cml0dGVuIG9uZS5cbiAqL1xuaW1wb3J0IHR5cGUgeyBUU0VTVHJlZSB9IGZyb20gJ0B0eXBlc2NyaXB0LWVzbGludC91dGlscyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJ1bGUsXG4gIFNjb3BlXG59IGZyb20gJ2VzbGludCc7XG5cbi8qKlxuICogTWVzc2FnZSBJRCByZXBvcnRlZCB3aGVuIGFuIGluLU9ic2lkaWFuIGNsb3N1cmUgZGVjbGFyZXMgbW9yZSB3YWl0aW5nIHRoYW4gdGhlIHRyYW5zcG9ydCdzIGNhcCBhbGxvd3MuXG4gKi9cbmV4cG9ydCBjb25zdCBNRVNTQUdFX0lEID0gJ25vT3ZlckNhcFdhaXRJbkV2YWxJbk9ic2lkaWFuJztcblxuLyoqXG4gKiBUaGUgY2FwIGFzc3VtZWQgd2hlbiB0aGUgcnVsZSBpcyBjb25maWd1cmVkIHdpdGhvdXQgb25lLCBtYXRjaGluZyB0aGUgdHJhbnNwb3J0J3Mgb3duIHNjcmlwdCB0aW1lb3V0LlxuICovXG5jb25zdCBERUZBVUxUX0NBUF9JTl9NSUxMSVNFQ09ORFMgPSAzMF8wMDA7XG5cbi8qKlxuICogVGhlIGJ1ZGdldCBhIGB3YWl0VW50aWxgIHRha2VzIHdoZW4gaXQgb21pdHMgYHRpbWVvdXRJbk1pbGxpc2Vjb25kc2AsIHBlciBgV2FpdFVudGlsUGFyYW1zYC5cbiAqL1xuY29uc3QgV0FJVF9VTlRJTF9ERUZBVUxUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuY29uc3QgSU5QVVRfUFJPUEVSVFlfTkFNRSA9ICdpbnB1dCc7XG5jb25zdCBTTEVFUF9DQUxMRUVfTkFNRSA9ICdzbGVlcCc7XG5jb25zdCBUSU1FT1VUX1BST1BFUlRZX05BTUUgPSAndGltZW91dEluTWlsbGlzZWNvbmRzJztcbmNvbnN0IFdBSVRfVU5USUxfQ0FMTEVFX05BTUUgPSAnd2FpdFVudGlsJztcblxuLyoqXG4gKiBXaGljaCBwcm9wZXJ0aWVzIG9mIGVhY2ggaGVscGVyJ3MgcGFyYW1ldGVyIG9iamVjdCBob2xkIGEgY2xvc3VyZSB0aGF0IHJ1bnMgSU5TSURFIE9ic2lkaWFuLCBhbmQgaXNcbiAqIHRoZXJlZm9yZSBzdWJqZWN0IHRvIHRoZSBjYXAuIGBwb2xsSW5PYnNpZGlhbmAncyBgdW50aWxgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQ6IGl0IGlzIGV2YWx1YXRlZCBpblxuICogTm9kZSwgd2hpY2ggaXMgdGhlIGVudGlyZSBwb2ludCBvZiBjb252ZXJ0aW5nIHRvIGl0LlxuICovXG5jb25zdCBDTE9TVVJFX05BTUVTX0JZX0NBTExFRV9OQU1FID0gbmV3IE1hcDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPihbXG4gIFsnZXZhbEluT2JzaWRpYW4nLCBbJ2NhbGxiYWNrJ11dLFxuICBbJ3BvbGxJbk9ic2lkaWFuJywgWydwb2xsJywgJ3N0YXJ0J11dXG5dKTtcblxuLyoqXG4gKiBUaGUgcnVsZSdzIHNpbmdsZSBvcHRpb24gb2JqZWN0LlxuICovXG5pbnRlcmZhY2UgQ2FwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgYnVkZ2V0IGF0IG9yIG92ZXIgd2hpY2ggYSBjbG9zdXJlIGlzIHJlcG9ydGVkLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSBjYXBJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgd2FpdGluZyBzdW1tZWQgc28gZmFyIGZvciBvbmUgY2xvc3VyZS5cbiAqL1xuaW50ZXJmYWNlIENsb3N1cmVCdWRnZXQge1xuICAvKipcbiAgICogVGhlIG5vZGUgdG8gcmVwb3J0IG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3J0Tm9kZTogVFNFU1RyZWUuTm9kZTtcblxuICAvKipcbiAgICogVGhlIHN1bSBvZiBldmVyeSByZXNvbHZhYmxlIHdhaXQgZGVjbGFyZWQgaW5zaWRlIHRoZSBjbG9zdXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgdG90YWxJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgZnVuY3Rpb24gd3JpdHRlbiBhcyBhbiBvYmplY3QgcHJvcGVydHksIHdoaWNoIGlzIHRoZSBvbmx5IGZvcm0gZWl0aGVyIGhlbHBlcidzIGNsb3N1cmVzIHRha2UuXG4gKi9cbnR5cGUgQ2xvc3VyZUZ1bmN0aW9uID0gVFNFU1RyZWUuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24gfCBUU0VTVHJlZS5GdW5jdGlvbkV4cHJlc3Npb247XG5cbi8qKlxuICogQW4gaW4tT2JzaWRpYW4gY2xvc3VyZSwgdG9nZXRoZXIgd2l0aCB0aGUgY2FsbCBpdCBiZWxvbmdzIHRvIChuZWVkZWQgdG8gcmVzb2x2ZSBhIGJ1ZGdldCB0aHJlYWRlZFxuICogdGhyb3VnaCB0aGF0IGNhbGwncyBgaW5wdXRgKSBhbmQgdGhlIG5vZGUgdG8gcmVwb3J0IG9uLlxuICovXG5pbnRlcmZhY2UgRXZhbENsb3N1cmUge1xuICAvKipcbiAgICogVGhlIGNsb3N1cmUncyBmdW5jdGlvbiBub2RlLCB3aGljaCBpZGVudGlmaWVzIHRoZSBjbG9zdXJlIGFjcm9zcyBzaWJsaW5nIHdhaXRzIGFuZCBjYXJyaWVzIHRoZVxuICAgKiBwYXJhbWV0ZXIgcGF0dGVybiBhIGJ1ZGdldCB0aHJlYWRlZCB0aHJvdWdoIGBpbnB1dGAgaXMgZGVzdHJ1Y3R1cmVkIGJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgY2xvc3VyZU5vZGU6IENsb3N1cmVGdW5jdGlvbjtcblxuICAvKipcbiAgICogVGhlIGhlbHBlcidzIHBhcmFtZXRlciBvYmplY3QsIGNhcnJpZWQgc28gYSBidWRnZXQgdGhyZWFkZWQgdGhyb3VnaCBgaW5wdXRgIGlzIHJlYWQgZnJvbSB0aGUgb2JqZWN0XG4gICAqIHRoZSBjbG9zdXJlIHdhcyBhbHJlYWR5IGZvdW5kIGluIHJhdGhlciB0aGFuIHJlLWRlcml2ZWQgZnJvbSB0aGUgY2FsbC5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtc05vZGU6IFRTRVNUcmVlLk9iamVjdEV4cHJlc3Npb247XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSB0aGUgY2xvc3VyZSBpcyB3cml0dGVuIGFzLCByZXBvcnRlZCBvbiBzbyB0aGUgbWVzc2FnZSBwb2ludHMgYXQgYGNhbGxiYWNrYCAvIGBwb2xsYFxuICAgKiByYXRoZXIgdGhhbiBhdCB3aGljaGV2ZXIgd2FpdCBoYXBwZW5lZCB0byBjb21lIGZpcnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3J0Tm9kZTogVFNFU1RyZWUuTm9kZTtcbn1cblxuLyoqXG4gKiBFU0xpbnQgcnVsZSBkaXNhbGxvd2luZyBhbiBpbi1PYnNpZGlhbiBjbG9zdXJlIHdob3NlIGRlY2xhcmVkIHdhaXRpbmcgZXhjZWVkcyB0aGUgdHJhbnNwb3J0J3Mgc2NyaXB0LXRpbWVvdXQgY2FwLlxuICovXG5leHBvcnQgY29uc3Qgbm9PdmVyQ2FwV2FpdEluRXZhbEluT2JzaWRpYW46IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgY3JlYXRlKGNvbnRleHQpIHtcbiAgICBjb25zdCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zWzBdIGFzIENhcE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgY2FwSW5NaWxsaXNlY29uZHMgPSBvcHRpb25zPy5jYXBJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0NBUF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgY29uc3QgYnVkZ2V0QnlDbG9zdXJlTm9kZSA9IG5ldyBNYXA8VFNFU1RyZWUuTm9kZSwgQ2xvc3VyZUJ1ZGdldD4oKTtcblxuICAgIHJldHVybiB7XG4gICAgICAnQ2FsbEV4cHJlc3Npb24nKG5vZGU6IFJ1bGUuTm9kZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBjYWxsTm9kZSA9IG5vZGUgYXMgVFNFU1RyZWUuQ2FsbEV4cHJlc3Npb247XG5cbiAgICAgICAgY29uc3QgYnVkZ2V0RXhwcmVzc2lvbiA9IHJlYWRXYWl0QnVkZ2V0RXhwcmVzc2lvbihjYWxsTm9kZSk7XG4gICAgICAgIGlmIChidWRnZXRFeHByZXNzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbG9zdXJlID0gZmluZEVuY2xvc2luZ0V2YWxDbG9zdXJlKGNhbGxOb2RlKTtcbiAgICAgICAgaWYgKCFjbG9zdXJlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgd2FpdEluTWlsbGlzZWNvbmRzID0gYnVkZ2V0RXhwcmVzc2lvbiA9PT0gbnVsbFxuICAgICAgICAgID8gV0FJVF9VTlRJTF9ERUZBVUxUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgICAgICAgOiByZXNvbHZlTWlsbGlzZWNvbmRzKGJ1ZGdldEV4cHJlc3Npb24sIGNsb3N1cmUsIGNvbnRleHQpO1xuICAgICAgICBpZiAod2FpdEluTWlsbGlzZWNvbmRzID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcnVubmluZ1RvdGFsSW5NaWxsaXNlY29uZHMgPSBidWRnZXRCeUNsb3N1cmVOb2RlLmdldChjbG9zdXJlLmNsb3N1cmVOb2RlKT8udG90YWxJbk1pbGxpc2Vjb25kcyA/PyAwO1xuICAgICAgICBidWRnZXRCeUNsb3N1cmVOb2RlLnNldChjbG9zdXJlLmNsb3N1cmVOb2RlLCB7XG4gICAgICAgICAgcmVwb3J0Tm9kZTogY2xvc3VyZS5yZXBvcnROb2RlLFxuICAgICAgICAgIHRvdGFsSW5NaWxsaXNlY29uZHM6IHJ1bm5pbmdUb3RhbEluTWlsbGlzZWNvbmRzICsgd2FpdEluTWlsbGlzZWNvbmRzXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgICdQcm9ncmFtOmV4aXQnKCk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IGJ1ZGdldCBvZiBidWRnZXRCeUNsb3N1cmVOb2RlLnZhbHVlcygpKSB7XG4gICAgICAgICAgaWYgKGJ1ZGdldC50b3RhbEluTWlsbGlzZWNvbmRzIDwgY2FwSW5NaWxsaXNlY29uZHMpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgY2FwSW5NaWxsaXNlY29uZHM6IFN0cmluZyhjYXBJbk1pbGxpc2Vjb25kcyksXG4gICAgICAgICAgICAgIHRvdGFsSW5NaWxsaXNlY29uZHM6IFN0cmluZyhidWRnZXQudG90YWxJbk1pbGxpc2Vjb25kcylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXNzYWdlSWQ6IE1FU1NBR0VfSUQsXG4gICAgICAgICAgICBub2RlOiBidWRnZXQucmVwb3J0Tm9kZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgbWV0YToge1xuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGlzYWxsb3cgYW4gaW4tT2JzaWRpYW4gY2xvc3VyZSBkZWNsYXJpbmcgbW9yZSB3YWl0aW5nIHRoYW4gdGhlIHRyYW5zcG9ydFxcJ3Mgc2NyaXB0LXRpbWVvdXQgY2FwIGFsbG93cydcbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICBbTUVTU0FHRV9JRF06ICdUaGlzIGNsb3N1cmUgZGVjbGFyZXMge3sgdG90YWxJbk1pbGxpc2Vjb25kcyB9fSBtcyBvZiB3YWl0aW5nLCBhdCBvciBvdmVyIHRoZSB0cmFuc3BvcnRcXCdzIHt7IGNhcEluTWlsbGlzZWNvbmRzIH19IG1zIGNhcCwgc28gaXQgY2FuIG9ubHkgZXZlciBkaWUgYXMgYSBiYXJlIGBzY3JpcHQgdGltZW91dGA6IHdhaXQgaW4gTm9kZSBpbnN0ZWFkLCB3aXRoIGEgc2hvcnQgRE9NLXJlYWRpbmcgYHBvbGxJbk9ic2lkaWFuYCBgcG9sbGAsIGFuIGB1bnRpbGAgZXZhbHVhdGVkIGluIE5vZGUsIGFuZCB0aGUgbG9uZyBidWRnZXQgaW4gYHRpbWVvdXRJbk1pbGxpc2Vjb25kc2AuJ1xuICAgIH0sXG4gICAgc2NoZW1hOiBbe1xuICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBjYXBJbk1pbGxpc2Vjb25kczoge1xuICAgICAgICAgIG1pbmltdW06IDEsXG4gICAgICAgICAgdHlwZTogJ2ludGVnZXInXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0eXBlOiAnb2JqZWN0J1xuICAgIH1dLFxuICAgIHR5cGU6ICdwcm9ibGVtJ1xuICB9XG59O1xuXG4vKipcbiAqIEZpbmRzIHRoZSBpbi1PYnNpZGlhbiBjbG9zdXJlIGEgbm9kZSBydW5zIGluc2lkZSwgd2Fsa2luZyBvdXR3YXJkcy5cbiAqXG4gKiBUaGUgd2FsayBkb2VzIG5vdCBzdG9wIGF0IHRoZSBmaXJzdCBlbmNsb3NpbmcgZnVuY3Rpb246IGEgd2FpdCBpbnNpZGUgYSBoZWxwZXIgZGVjbGFyZWQgd2l0aGluIHRoZVxuICogY2FsbGJhY2sgc3RpbGwgcnVucyBpbnNpZGUgdGhlIGNhbGxiYWNrLCBzbyBpdCBrZWVwcyBnb2luZyB1bnRpbCBpdCByZWFjaGVzIGEgZnVuY3Rpb24gdGhhdCBJUyBvbmUgb2ZcbiAqIHRoZSBoZWxwZXIncyBpbi1PYnNpZGlhbiBjbG9zdXJlcy5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIHN0YXJ0IGZyb20uXG4gKiBAcmV0dXJucyBUaGUgZW5jbG9zaW5nIGNsb3N1cmUsIG9yIGBudWxsYCB3aGVuIHRoZSBub2RlIGRvZXMgbm90IHJ1biBpbnNpZGUgb25lLlxuICovXG5mdW5jdGlvbiBmaW5kRW5jbG9zaW5nRXZhbENsb3N1cmUobm9kZTogVFNFU1RyZWUuTm9kZSk6IEV2YWxDbG9zdXJlIHwgbnVsbCB7XG4gIGxldCBjdXJyZW50Tm9kZTogVFNFU1RyZWUuTm9kZSB8IHVuZGVmaW5lZCA9IG5vZGUucGFyZW50O1xuXG4gIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgIGNvbnN0IGNsb3N1cmUgPSByZWFkRXZhbENsb3N1cmUoY3VycmVudE5vZGUpO1xuICAgIGlmIChjbG9zdXJlKSB7XG4gICAgICByZXR1cm4gY2xvc3VyZTtcbiAgICB9XG4gICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBGaW5kcyBhIHZhcmlhYmxlIGJ5IG5hbWUsIHdhbGtpbmcgb3V0d2FyZHMgZnJvbSB0aGUgZ2l2ZW4gc2NvcGUuXG4gKlxuICogQHBhcmFtIHNjb3BlIC0gVGhlIHNjb3BlIHRvIHN0YXJ0IGZyb20uXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB2YXJpYWJsZSdzIG5hbWUuXG4gKiBAcmV0dXJucyBUaGUgdmFyaWFibGUsIG9yIGBudWxsYCB3aGVuIG5vdGhpbmcgaW4gc2NvcGUgZGVjbGFyZXMgdGhhdCBuYW1lLlxuICovXG5mdW5jdGlvbiBmaW5kVmFyaWFibGUoc2NvcGU6IFNjb3BlLlNjb3BlLCBuYW1lOiBzdHJpbmcpOiBudWxsIHwgU2NvcGUuVmFyaWFibGUge1xuICBsZXQgY3VycmVudFNjb3BlOiBudWxsIHwgU2NvcGUuU2NvcGUgPSBzY29wZTtcblxuICB3aGlsZSAoY3VycmVudFNjb3BlKSB7XG4gICAgY29uc3QgdmFyaWFibGUgPSBjdXJyZW50U2NvcGUudmFyaWFibGVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT09IG5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgcmV0dXJuIHZhcmlhYmxlO1xuICAgIH1cbiAgICBjdXJyZW50U2NvcGUgPSBjdXJyZW50U2NvcGUudXBwZXI7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYSBiaW5hcnkgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub2RlIGlzIGEgYEJpbmFyeUV4cHJlc3Npb25gLlxuICovXG5mdW5jdGlvbiBpc0JpbmFyeUV4cHJlc3Npb24obm9kZTogVFNFU1RyZWUuTm9kZSk6IG5vZGUgaXMgVFNFU1RyZWUuQmluYXJ5RXhwcmVzc2lvbiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdCaW5hcnlFeHByZXNzaW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYSBjYWxsIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhIGBDYWxsRXhwcmVzc2lvbmAuXG4gKi9cbmZ1bmN0aW9uIGlzQ2FsbEV4cHJlc3Npb24obm9kZTogVFNFU1RyZWUuTm9kZSk6IG5vZGUgaXMgVFNFU1RyZWUuQ2FsbEV4cHJlc3Npb24ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhIGZ1bmN0aW9uIHdyaXR0ZW4gYXMgYW4gb2JqZWN0IHByb3BlcnR5J3MgdmFsdWUuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhIGBGdW5jdGlvbkV4cHJlc3Npb25gIG9yIGFuIGBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbmAuXG4gKi9cbmZ1bmN0aW9uIGlzQ2xvc3VyZUZ1bmN0aW9uKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBub2RlIGlzIENsb3N1cmVGdW5jdGlvbiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdGdW5jdGlvbkV4cHJlc3Npb24nIHx8IG5vZGUudHlwZSA9PT0gJ0Fycm93RnVuY3Rpb25FeHByZXNzaW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYW4gaWRlbnRpZmllci5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub2RlIGlzIGFuIGBJZGVudGlmaWVyYC5cbiAqL1xuZnVuY3Rpb24gaXNJZGVudGlmaWVyKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBub2RlIGlzIFRTRVNUcmVlLklkZW50aWZpZXIge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnSWRlbnRpZmllcic7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGlzIGEgbnVtZXJpYyBsaXRlcmFsLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgYSBgTGl0ZXJhbGAgaG9sZGluZyBhIG51bWJlci5cbiAqL1xuZnVuY3Rpb24gaXNOdW1lcmljTGl0ZXJhbChub2RlOiBUU0VTVHJlZS5Ob2RlKTogbm9kZSBpcyBUU0VTVHJlZS5OdW1iZXJMaXRlcmFsIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZW51bS1jb21wYXJpc29uIC0tIEFTVCBub2RlIHR5cGUgc3RyaW5nIGxpdGVyYWxzIG1hdGNoIHRoZSBUU0VTVHJlZSBlbnVtIHZhbHVlcy5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0xpdGVyYWwnICYmIHR5cGVvZiBub2RlLnZhbHVlID09PSAnbnVtYmVyJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhbiBgT2JqZWN0RXhwcmVzc2lvbmAuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0RXhwcmVzc2lvbihub2RlOiBUU0VTVHJlZS5Ob2RlKTogbm9kZSBpcyBUU0VTVHJlZS5PYmplY3RFeHByZXNzaW9uIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZW51bS1jb21wYXJpc29uIC0tIEFTVCBub2RlIHR5cGUgc3RyaW5nIGxpdGVyYWxzIG1hdGNoIHRoZSBUU0VTVHJlZSBlbnVtIHZhbHVlcy5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ09iamVjdEV4cHJlc3Npb24nO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhbiBvYmplY3QgZGVzdHJ1Y3R1cmluZyBwYXR0ZXJuLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgYW4gYE9iamVjdFBhdHRlcm5gLlxuICovXG5mdW5jdGlvbiBpc09iamVjdFBhdHRlcm4obm9kZTogVFNFU1RyZWUuTm9kZSk6IG5vZGUgaXMgVFNFU1RyZWUuT2JqZWN0UGF0dGVybiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdPYmplY3RQYXR0ZXJuJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYW4gb2JqZWN0LWxpdGVyYWwgb3Igb2JqZWN0LXBhdHRlcm4gcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhIGBQcm9wZXJ0eWAuXG4gKi9cbmZ1bmN0aW9uIGlzUHJvcGVydHkobm9kZTogVFNFU1RyZWUuTm9kZSk6IG5vZGUgaXMgVFNFU1RyZWUuUHJvcGVydHkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnUHJvcGVydHknO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhIHZhcmlhYmxlIGRlY2xhcmF0b3IuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhIGBWYXJpYWJsZURlY2xhcmF0b3JgLlxuICovXG5mdW5jdGlvbiBpc1ZhcmlhYmxlRGVjbGFyYXRvcihub2RlOiBUU0VTVHJlZS5Ob2RlKTogbm9kZSBpcyBUU0VTVHJlZS5WYXJpYWJsZURlY2xhcmF0b3Ige1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnVmFyaWFibGVEZWNsYXJhdG9yJztcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgZXhwcmVzc2lvbiBhbiBpZGVudGlmaWVyIGlzIGJvdW5kIHRvLlxuICpcbiAqIEEgYGNvbnN0YCBhbnN3ZXJzIHdpdGggaXRzIGluaXRpYWxpemVyOyBhIGRlc3RydWN0dXJlZCBwYXJhbWV0ZXIgb2YgVEhJUyBjbG9zdXJlIGFuc3dlcnMgd2l0aCB3aGF0IHRoZVxuICogY2FsbCdzIG93biBgaW5wdXRgIHN1cHBsaWVzIGZvciB0aGUga2V5IGl0IHdhcyBkZXN0cnVjdHVyZWQgYnksIHdoaWNoIGlzIGhvdyBhIGJ1ZGdldCB3cml0dGVuIG9uY2UgYXRcbiAqIHRoZSBjYWxsIHNpdGUgcmVhY2hlcyBhIGNsb3N1cmUgdGhhdCBjYW4gY2xvc2Ugb3ZlciBub3RoaW5nLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIGlkZW50aWZpZXIgdG8gcmVzb2x2ZS5cbiAqIEBwYXJhbSBjbG9zdXJlIC0gVGhlIGNsb3N1cmUgdGhlIGlkZW50aWZpZXIgd2FzIHdyaXR0ZW4gaW5zaWRlLlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUgcnVsZSBjb250ZXh0LCB1c2VkIHRvIHJlc29sdmUgdGhlIGlkZW50aWZpZXIgdGhyb3VnaCBzY29wZS5cbiAqIEByZXR1cm5zIFRoZSBleHByZXNzaW9uIGl0IGlzIGJvdW5kIHRvLCBvciBgbnVsbGAgd2hlbiBub3RoaW5nIHN0YXRpY2FsbHkgYmluZHMgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlYWRCb3VuZEV4cHJlc3Npb24obm9kZTogVFNFU1RyZWUuSWRlbnRpZmllciwgY2xvc3VyZTogRXZhbENsb3N1cmUsIGNvbnRleHQ6IFJ1bGUuUnVsZUNvbnRleHQpOiBudWxsIHwgVFNFU1RyZWUuTm9kZSB7XG4gIGNvbnN0IHZhcmlhYmxlID0gZmluZFZhcmlhYmxlKGNvbnRleHQuc291cmNlQ29kZS5nZXRTY29wZShub2RlKSwgbm9kZS5uYW1lKTtcbiAgaWYgKCF2YXJpYWJsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9yIChjb25zdCBkZWZpbml0aW9uIG9mIHZhcmlhYmxlLmRlZnMpIHtcbiAgICBjb25zdCBkZWZpbml0aW9uTm9kZSA9IGRlZmluaXRpb24ubm9kZSBhcyBUU0VTVHJlZS5Ob2RlO1xuXG4gICAgaWYgKGlzVmFyaWFibGVEZWNsYXJhdG9yKGRlZmluaXRpb25Ob2RlKSAmJiBkZWZpbml0aW9uTm9kZS5pbml0KSB7XG4gICAgICByZXR1cm4gZGVmaW5pdGlvbk5vZGUuaW5pdDtcbiAgICB9XG5cbiAgICBpZiAoZGVmaW5pdGlvbk5vZGUgPT09IGNsb3N1cmUuY2xvc3VyZU5vZGUpIHtcbiAgICAgIGNvbnN0IGlucHV0S2V5ID0gcmVhZFBhcmFtZXRlcklucHV0S2V5KGNsb3N1cmUuY2xvc3VyZU5vZGUsIG5vZGUubmFtZSk7XG4gICAgICBpZiAoaW5wdXRLZXkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkSW5wdXRQcm9wZXJ0eVZhbHVlKGNsb3N1cmUucGFyYW1zTm9kZSwgaW5wdXRLZXkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBjbG9zdXJlIHByb3BlcnR5IG5hbWVzIGEgY2FsbCdzIHBhcmFtZXRlciBvYmplY3QgbWF5IGNhcnJ5LCBieSB0aGUgaGVscGVyIGl0IGNhbGxzLlxuICpcbiAqIEBwYXJhbSBjYWxsTm9kZSAtIFRoZSBjYWxsIGV4cHJlc3Npb24uXG4gKiBAcmV0dXJucyBUaGUgaW4tT2JzaWRpYW4gY2xvc3VyZSBwcm9wZXJ0eSBuYW1lcywgb3IgYG51bGxgIHdoZW4gdGhlIGNhbGxlZSBpcyBub3Qgb25lIG9mIHRoZSBoZWxwZXJzLlxuICovXG5mdW5jdGlvbiByZWFkQ2xvc3VyZU5hbWVzKGNhbGxOb2RlOiBUU0VTVHJlZS5DYWxsRXhwcmVzc2lvbik6IG51bGwgfCByZWFkb25seSBzdHJpbmdbXSB7XG4gIGlmICghaXNJZGVudGlmaWVyKGNhbGxOb2RlLmNhbGxlZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBDTE9TVVJFX05BTUVTX0JZX0NBTExFRV9OQU1FLmdldChjYWxsTm9kZS5jYWxsZWUubmFtZSkgPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgaW4tT2JzaWRpYW4gY2xvc3VyZSBhIGZ1bmN0aW9uIG5vZGUgaXMsIGlmIGl0IGlzIG9uZS5cbiAqXG4gKiBBIGNsb3N1cmUgcXVhbGlmaWVzIHdoZW4gaXQgaXMgdGhlIHZhbHVlIG9mIGEgYGNhbGxiYWNrYCAvIGBwb2xsYCAvIGBzdGFydGAgcHJvcGVydHkgb2YgdGhlIG9iamVjdFxuICogbGl0ZXJhbCBwYXNzZWQgYXMgdGhlIGhlbHBlcidzIGZpcnN0IGFyZ3VtZW50IFx1MjAxNCB3aGljaCBjb3ZlcnMgYm90aCB0aGUgbWV0aG9kIHNob3J0aGFuZFxuICogKGBhc3luYyBjYWxsYmFjayh7IFx1MjAyNiB9KSB7IFx1MjAyNiB9YCkgYW5kIGFuIGFycm93IChgY2FsbGJhY2s6IGFzeW5jICh7IFx1MjAyNiB9KSA9PiB7IFx1MjAyNiB9YCkuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFRoZSBjbG9zdXJlLCBvciBgbnVsbGAgd2hlbiB0aGUgbm9kZSBpcyBub3QgYW4gaW4tT2JzaWRpYW4gY2xvc3VyZS5cbiAqL1xuZnVuY3Rpb24gcmVhZEV2YWxDbG9zdXJlKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBFdmFsQ2xvc3VyZSB8IG51bGwge1xuICBpZiAoIWlzQ2xvc3VyZUZ1bmN0aW9uKG5vZGUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwcm9wZXJ0eU5vZGUgPSBub2RlLnBhcmVudDtcbiAgaWYgKCFpc1Byb3BlcnR5KHByb3BlcnR5Tm9kZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qXG4gICAqIFRoZSBvYmplY3QgY2hlY2sgY29tZXMgQkVGT1JFIHRoZSBrZXkgY2hlY2sgYmVjYXVzZSBhIGZ1bmN0aW9uIGNhbiByZWFjaCBhIHByb3BlcnR5IHRocm91Z2ggaXRzXG4gICAqIENPTVBVVEVEIEtFWSBhcyB3ZWxsIGFzIHRocm91Z2ggaXRzIHZhbHVlIC0tIGB7IFsoKSA9PiAnYSddOiAxIH1gIGlzIGxlZ2FsIC0tIGFuZCBhIGRlc3RydWN0dXJpbmdcbiAgICogcGF0dGVybiBjYW4gY2Fycnkgb25lIHRvby4gTmVpdGhlciBpcyBhIGhlbHBlciBjYWxsJ3MgcGFyYW1ldGVyIG9iamVjdC5cbiAgICovXG4gIGNvbnN0IHBhcmFtc05vZGUgPSBwcm9wZXJ0eU5vZGUucGFyZW50O1xuICBpZiAoIWlzT2JqZWN0RXhwcmVzc2lvbihwYXJhbXNOb2RlKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKCFpc0lkZW50aWZpZXIocHJvcGVydHlOb2RlLmtleSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNhbGxOb2RlID0gcGFyYW1zTm9kZS5wYXJlbnQ7XG4gIGlmICghaXNDYWxsRXhwcmVzc2lvbihjYWxsTm9kZSkgfHwgY2FsbE5vZGUuYXJndW1lbnRzWzBdICE9PSBwYXJhbXNOb2RlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBjbG9zdXJlTmFtZXMgPSByZWFkQ2xvc3VyZU5hbWVzKGNhbGxOb2RlKTtcbiAgaWYgKCFjbG9zdXJlTmFtZXM/LmluY2x1ZGVzKHByb3BlcnR5Tm9kZS5rZXkubmFtZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2xvc3VyZU5vZGU6IG5vZGUsXG4gICAgcGFyYW1zTm9kZSxcbiAgICByZXBvcnROb2RlOiBwcm9wZXJ0eU5vZGVcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgdmFsdWUgYSBjYWxsJ3Mgb3duIGBpbnB1dGAgb2JqZWN0IHN1cHBsaWVzIGZvciBvbmUga2V5LlxuICpcbiAqIFRoaXMgaXMgaG93IGEgYnVkZ2V0IGRlY2xhcmVkIG9uY2UgYXQgdGhlIGNhbGwgc2l0ZSByZWFjaGVzIHRoZSBjbG9zdXJlLCB3aGljaCBjYW5ub3QgY2xvc2Ugb3ZlclxuICogYW55dGhpbmc6IGBpbnB1dDogeyBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IFNFVFRMRSB9YCBhcnJpdmVzIGRlc3RydWN0dXJlZCBpbiB0aGUgY2FsbGJhY2snc1xuICogcGFyYW1ldGVyIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zTm9kZSAtIFRoZSBoZWxwZXIncyBwYXJhbWV0ZXIgb2JqZWN0LlxuICogQHBhcmFtIGtleU5hbWUgLSBUaGUgYGlucHV0YCBwcm9wZXJ0eSB0byByZWFkLlxuICogQHJldHVybnMgVGhlIGV4cHJlc3Npb24gc3VwcGx5aW5nIHRoYXQga2V5LCBvciBgbnVsbGAgd2hlbiB0aGUgY2FsbCdzIGBpbnB1dGAgZG9lcyBub3QgZGVjbGFyZSBpdC5cbiAqL1xuZnVuY3Rpb24gcmVhZElucHV0UHJvcGVydHlWYWx1ZShwYXJhbXNOb2RlOiBUU0VTVHJlZS5PYmplY3RFeHByZXNzaW9uLCBrZXlOYW1lOiBzdHJpbmcpOiBudWxsIHwgVFNFU1RyZWUuTm9kZSB7XG4gIGNvbnN0IGlucHV0UHJvcGVydHkgPSBwYXJhbXNOb2RlLnByb3BlcnRpZXMuZmluZCgocHJvcGVydHkpID0+XG4gICAgaXNQcm9wZXJ0eShwcm9wZXJ0eSBhcyBUU0VTVHJlZS5Ob2RlKVxuICAgICYmIGlzSWRlbnRpZmllcigocHJvcGVydHkgYXMgVFNFU1RyZWUuUHJvcGVydHkpLmtleSBhcyBUU0VTVHJlZS5Ob2RlKVxuICAgICYmICgocHJvcGVydHkgYXMgVFNFU1RyZWUuUHJvcGVydHkpLmtleSBhcyBUU0VTVHJlZS5JZGVudGlmaWVyKS5uYW1lID09PSBJTlBVVF9QUk9QRVJUWV9OQU1FXG4gICkgYXMgVFNFU1RyZWUuUHJvcGVydHkgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3QgaW5wdXROb2RlID0gaW5wdXRQcm9wZXJ0eT8udmFsdWUgYXMgVFNFU1RyZWUuTm9kZSB8IHVuZGVmaW5lZDtcbiAgaWYgKCFpbnB1dE5vZGUgfHwgIWlzT2JqZWN0RXhwcmVzc2lvbihpbnB1dE5vZGUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB2YWx1ZVByb3BlcnR5ID0gaW5wdXROb2RlLnByb3BlcnRpZXMuZmluZCgocHJvcGVydHkpID0+XG4gICAgaXNQcm9wZXJ0eShwcm9wZXJ0eSBhcyBUU0VTVHJlZS5Ob2RlKVxuICAgICYmIGlzSWRlbnRpZmllcigocHJvcGVydHkgYXMgVFNFU1RyZWUuUHJvcGVydHkpLmtleSBhcyBUU0VTVHJlZS5Ob2RlKVxuICAgICYmICgocHJvcGVydHkgYXMgVFNFU1RyZWUuUHJvcGVydHkpLmtleSBhcyBUU0VTVHJlZS5JZGVudGlmaWVyKS5uYW1lID09PSBrZXlOYW1lXG4gICkgYXMgVFNFU1RyZWUuUHJvcGVydHkgfCB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuICh2YWx1ZVByb3BlcnR5Py52YWx1ZSBhcyBUU0VTVHJlZS5Ob2RlIHwgdW5kZWZpbmVkKSA/PyBudWxsO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBgaW5wdXRgIGtleSBhIGRlc3RydWN0dXJlZCBjbG9zdXJlIHBhcmFtZXRlciBpcyBib3VuZCBmcm9tLlxuICpcbiAqIFRoZSBiaW5kaW5nIG1heSBiZSByZW5hbWVkIChgdGltZW91dEluTWlsbGlzZWNvbmRzOiB0aW1lb3V0YCksIHNvIHRoZSBLRVkgaXMgd2hhdCB0aGUgY2FsbCdzIGBpbnB1dGBcbiAqIGlzIGxvb2tlZCB1cCBieSwgbmV2ZXIgdGhlIGxvY2FsIG5hbWUuXG4gKlxuICogQHBhcmFtIGNsb3N1cmVOb2RlIC0gVGhlIGNsb3N1cmUgd2hvc2UgcGFyYW1ldGVycyB0byByZWFkLlxuICogQHBhcmFtIGxvY2FsTmFtZSAtIFRoZSBuYW1lIHRoZSBidWRnZXQgaXMgYm91bmQgdG8gaW5zaWRlIHRoZSBjbG9zdXJlLlxuICogQHJldHVybnMgVGhlIGBpbnB1dGAga2V5LCBvciBgbnVsbGAgd2hlbiB0aGUgbmFtZSBpcyBub3QgYm91bmQgYnkgYSBwbGFpbiBkZXN0cnVjdHVyZWQgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIHJlYWRQYXJhbWV0ZXJJbnB1dEtleShjbG9zdXJlTm9kZTogQ2xvc3VyZUZ1bmN0aW9uLCBsb2NhbE5hbWU6IHN0cmluZyk6IG51bGwgfCBzdHJpbmcge1xuICBmb3IgKGNvbnN0IHBhcmFtZXRlck5vZGUgb2YgY2xvc3VyZU5vZGUucGFyYW1zKSB7XG4gICAgaWYgKCFpc09iamVjdFBhdHRlcm4ocGFyYW1ldGVyTm9kZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcGFyYW1ldGVyTm9kZS5wcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAoIWlzUHJvcGVydHkocHJvcGVydHkpIHx8IHByb3BlcnR5LmNvbXB1dGVkIHx8ICFpc0lkZW50aWZpZXIocHJvcGVydHkua2V5KSB8fCAhaXNJZGVudGlmaWVyKHByb3BlcnR5LnZhbHVlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BlcnR5LnZhbHVlLm5hbWUgPT09IGxvY2FsTmFtZSkge1xuICAgICAgICByZXR1cm4gcHJvcGVydHkua2V5Lm5hbWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGV4cHJlc3Npb24gY2FycnlpbmcgYSB3YWl0IGNhbGwncyBkZWNsYXJlZCBidWRnZXQuXG4gKlxuICogQHBhcmFtIGNhbGxOb2RlIC0gVGhlIGNhbGwgZXhwcmVzc2lvbiB0byBpbnNwZWN0LlxuICogQHJldHVybnMgVGhlIGV4cHJlc3Npb24gdG8gcmVzb2x2ZTsgYG51bGxgIGZvciBhIGB3YWl0VW50aWxgIHRoYXQgb21pdHMgaXRzIHRpbWVvdXQsIHdoaWNoIHRha2VzIHRoZVxuICogaGVscGVyJ3MgZGVmYXVsdDsgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgY2FsbCBpcyBub3QgYSB3YWl0IGF0IGFsbC5cbiAqL1xuZnVuY3Rpb24gcmVhZFdhaXRCdWRnZXRFeHByZXNzaW9uKGNhbGxOb2RlOiBUU0VTVHJlZS5DYWxsRXhwcmVzc2lvbik6IG51bGwgfCBUU0VTVHJlZS5Ob2RlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFpc0lkZW50aWZpZXIoY2FsbE5vZGUuY2FsbGVlKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBjYWxsZWVOYW1lID0gY2FsbE5vZGUuY2FsbGVlLm5hbWU7XG5cbiAgaWYgKGNhbGxlZU5hbWUgPT09IFNMRUVQX0NBTExFRV9OQU1FKSB7XG4gICAgcmV0dXJuIChjYWxsTm9kZS5hcmd1bWVudHNbMF0pID8/IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChjYWxsZWVOYW1lICE9PSBXQUlUX1VOVElMX0NBTExFRV9OQU1FKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHBhcmFtc05vZGUgPSBjYWxsTm9kZS5hcmd1bWVudHNbMF0gYXMgVFNFU1RyZWUuTm9kZSB8IHVuZGVmaW5lZDtcbiAgaWYgKCFwYXJhbXNOb2RlIHx8ICFpc09iamVjdEV4cHJlc3Npb24ocGFyYW1zTm9kZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgdGltZW91dFByb3BlcnR5ID0gcGFyYW1zTm9kZS5wcm9wZXJ0aWVzLmZpbmQoKHByb3BlcnR5KSA9PlxuICAgIGlzUHJvcGVydHkocHJvcGVydHkgYXMgVFNFU1RyZWUuTm9kZSlcbiAgICAmJiBpc0lkZW50aWZpZXIoKHByb3BlcnR5IGFzIFRTRVNUcmVlLlByb3BlcnR5KS5rZXkgYXMgVFNFU1RyZWUuTm9kZSlcbiAgICAmJiAoKHByb3BlcnR5IGFzIFRTRVNUcmVlLlByb3BlcnR5KS5rZXkgYXMgVFNFU1RyZWUuSWRlbnRpZmllcikubmFtZSA9PT0gVElNRU9VVF9QUk9QRVJUWV9OQU1FXG4gICkgYXMgVFNFU1RyZWUuUHJvcGVydHkgfCB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuICh0aW1lb3V0UHJvcGVydHk/LnZhbHVlKSA/PyBudWxsO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGFuIGV4cHJlc3Npb24gdG8gYSBtaWxsaXNlY29uZCBjb3VudCwgdGhyb3VnaCBzY29wZS5cbiAqXG4gKiBIYW5kbGVzIGEgbnVtZXJpYyBsaXRlcmFsLCBhIGxpdGVyYWwtb25seSBwcm9kdWN0IChgNjAgKiAxMDAwYCksIGFuIGlkZW50aWZpZXIgYm91bmQgdG8gZWl0aGVyIGluIGFueVxuICogZW5jbG9zaW5nIHNjb3BlLCBhbmQgYSBkZXN0cnVjdHVyZWQgY2xvc3VyZSBwYXJhbWV0ZXIgZm9sbG93ZWQgYmFjayB0aHJvdWdoIHRoZSBjYWxsJ3Mgb3duIGBpbnB1dGAuXG4gKiBBbnl0aGluZyBlbHNlIGlzIHVucmVzb2x2YWJsZSBhbmQgYW5zd2VycyBgbnVsbGAsIHdoaWNoIHRoZSBjYWxsZXIgdHJlYXRzIGFzIGNvbnRyaWJ1dGluZyBub3RoaW5nLlxuICpcbiAqIEVhY2ggaWRlbnRpZmllciBpcyByZXNvbHZlZCBmcm9tIElUUyBPV04gc2NvcGUgcmF0aGVyIHRoYW4gZnJvbSB0aGUgd2FpdCdzLCBzbyBhIHZhbHVlIHN1cHBsaWVkIGJ5IHRoZVxuICogY2FsbCdzIGBpbnB1dGAgcmVzb2x2ZXMgYXQgdGhlIGNhbGwgc2l0ZSBcdTIwMTQgd2hlcmUgaXQgd2FzIHdyaXR0ZW4gXHUyMDE0IGFuZCBpcyBub3QgY2FwdHVyZWQgYnkgYSBzYW1lLW5hbWVkXG4gKiBiaW5kaW5nIHRoYXQgaGFwcGVucyB0byBleGlzdCBpbnNpZGUgdGhlIGNsb3N1cmUuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgZXhwcmVzc2lvbiB0byByZXNvbHZlLlxuICogQHBhcmFtIGNsb3N1cmUgLSBUaGUgY2xvc3VyZSB0aGUgZXhwcmVzc2lvbiB3YXMgd3JpdHRlbiBpbnNpZGUuXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBydWxlIGNvbnRleHQsIHVzZWQgdG8gcmVzb2x2ZSBpZGVudGlmaWVycyB0aHJvdWdoIHNjb3BlLlxuICogQHJldHVybnMgVGhlIG1pbGxpc2Vjb25kIGNvdW50LCBvciBgbnVsbGAgd2hlbiBpdCBjYW5ub3QgYmUgcmVzb2x2ZWQgc3RhdGljYWxseS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1pbGxpc2Vjb25kcyhub2RlOiBUU0VTVHJlZS5Ob2RlLCBjbG9zdXJlOiBFdmFsQ2xvc3VyZSwgY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCk6IG51bGwgfCBudW1iZXIge1xuICBjb25zdCB2aXNpdGVkTm9kZXMgPSBuZXcgU2V0PFRTRVNUcmVlLk5vZGU+KCk7XG4gIGxldCBjdXJyZW50Tm9kZSA9IG5vZGU7XG5cbiAgd2hpbGUgKCF2aXNpdGVkTm9kZXMuaGFzKGN1cnJlbnROb2RlKSkge1xuICAgIHZpc2l0ZWROb2Rlcy5hZGQoY3VycmVudE5vZGUpO1xuXG4gICAgaWYgKGlzTnVtZXJpY0xpdGVyYWwoY3VycmVudE5vZGUpKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGUudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKGlzQmluYXJ5RXhwcmVzc2lvbihjdXJyZW50Tm9kZSkgJiYgY3VycmVudE5vZGUub3BlcmF0b3IgPT09ICcqJykge1xuICAgICAgY29uc3QgbGVmdEluTWlsbGlzZWNvbmRzID0gcmVzb2x2ZU1pbGxpc2Vjb25kcyhjdXJyZW50Tm9kZS5sZWZ0LCBjbG9zdXJlLCBjb250ZXh0KTtcbiAgICAgIGNvbnN0IHJpZ2h0SW5NaWxsaXNlY29uZHMgPSByZXNvbHZlTWlsbGlzZWNvbmRzKGN1cnJlbnROb2RlLnJpZ2h0LCBjbG9zdXJlLCBjb250ZXh0KTtcblxuICAgICAgaWYgKGxlZnRJbk1pbGxpc2Vjb25kcyA9PT0gbnVsbCB8fCByaWdodEluTWlsbGlzZWNvbmRzID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGVmdEluTWlsbGlzZWNvbmRzICogcmlnaHRJbk1pbGxpc2Vjb25kcztcbiAgICB9XG5cbiAgICBpZiAoIWlzSWRlbnRpZmllcihjdXJyZW50Tm9kZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGJvdW5kTm9kZSA9IHJlYWRCb3VuZEV4cHJlc3Npb24oY3VycmVudE5vZGUsIGNsb3N1cmUsIGNvbnRleHQpO1xuICAgIGlmICghYm91bmROb2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjdXJyZW50Tm9kZSA9IGJvdW5kTm9kZTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW1ETyxNQUFNLGFBQWE7QUFLMUIsTUFBTSw4QkFBOEI7QUFLcEMsTUFBTSw2Q0FBNkM7QUFFbkQsTUFBTSxzQkFBc0I7QUFDNUIs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
@@ -0,0 +1,10 @@
1
+ /// <reference path="../../../library.d.cts" />
2
+ import type { Rule } from 'eslint' with { 'resolution-mode': 'import' };
3
+ /**
4
+ * Message ID reported when an in-Obsidian closure declares more waiting than the transport's cap allows.
5
+ */
6
+ export declare const MESSAGE_ID = "noOverCapWaitInEvalInObsidian";
7
+ /**
8
+ * ESLint rule disallowing an in-Obsidian closure whose declared waiting exceeds the transport's script-timeout cap.
9
+ */
10
+ export declare const noOverCapWaitInEvalInObsidian: Rule.RuleModule;
@@ -150,6 +150,7 @@ var import_manifest_id = require('./manifest-id.cjs');
150
150
  var import_manifest_name = require('./manifest-name.cjs');
151
151
  var import_manifest_schema = require('./manifest-schema.cjs');
152
152
  var import_no_async_callback_to_unsafe_return = require('./no-async-callback-to-unsafe-return.cjs');
153
+ var import_no_over_cap_wait_in_eval_in_obsidian = require('./no-over-cap-wait-in-eval-in-obsidian.cjs');
153
154
  var import_no_untrusted_input_events = require('./no-untrusted-input-events.cjs');
154
155
  var import_no_unused_params_members = require('./no-unused-params-members.cjs');
155
156
  var import_no_used_underscore_variables = require('./no-used-underscore-variables.cjs');
@@ -166,6 +167,7 @@ const obsidianDevUtilsPlugin = {
166
167
  "manifest-name": import_manifest_name.manifestName,
167
168
  "manifest-schema": import_manifest_schema.manifestSchema,
168
169
  "no-async-callback-to-unsafe-return": import_no_async_callback_to_unsafe_return.noAsyncCallbackToUnsafeReturn,
170
+ "no-over-cap-wait-in-eval-in-obsidian": import_no_over_cap_wait_in_eval_in_obsidian.noOverCapWaitInEvalInObsidian,
169
171
  "no-untrusted-input-events": import_no_untrusted_input_events.noUntrustedInputEvents,
170
172
  "no-unused-params-members": import_no_unused_params_members.noUnusedParamsMembers,
171
173
  "no-used-underscore-variables": import_no_used_underscore_variables.noUsedUnderscoreVariables,
@@ -181,4 +183,4 @@ const obsidianDevUtilsPlugin = {
181
183
  0 && (module.exports = {
182
184
  obsidianDevUtilsPlugin
183
185
  });
184
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL2VzbGludC1ydWxlcy9vYnNpZGlhbi1kZXYtdXRpbHMtcGx1Z2luLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRVNMaW50IHBsdWdpbiBmb3IgT2JzaWRpYW4gZGV2ZWxvcG1lbnQgdXRpbGl0aWVzLlxuICovXG5pbXBvcnQgdHlwZSB7IEVTTGludCB9IGZyb20gJ2VzbGludCc7XG5cbmltcG9ydCB7IG1hbmlmZXN0RGVzY3JpcHRpb24gfSBmcm9tICcuL21hbmlmZXN0LWRlc2NyaXB0aW9uLnRzJztcbmltcG9ydCB7IG1hbmlmZXN0SWQgfSBmcm9tICcuL21hbmlmZXN0LWlkLnRzJztcbmltcG9ydCB7IG1hbmlmZXN0TmFtZSB9IGZyb20gJy4vbWFuaWZlc3QtbmFtZS50cyc7XG5pbXBvcnQgeyBtYW5pZmVzdFNjaGVtYSB9IGZyb20gJy4vbWFuaWZlc3Qtc2NoZW1hLnRzJztcbmltcG9ydCB7IG5vQXN5bmNDYWxsYmFja1RvVW5zYWZlUmV0dXJuIH0gZnJvbSAnLi9uby1hc3luYy1jYWxsYmFjay10by11bnNhZmUtcmV0dXJuLnRzJztcbmltcG9ydCB7IG5vVW50cnVzdGVkSW5wdXRFdmVudHMgfSBmcm9tICcuL25vLXVudHJ1c3RlZC1pbnB1dC1ldmVudHMudHMnO1xuaW1wb3J0IHsgbm9VbnVzZWRQYXJhbXNNZW1iZXJzIH0gZnJvbSAnLi9uby11bnVzZWQtcGFyYW1zLW1lbWJlcnMudHMnO1xuaW1wb3J0IHsgbm9Vc2VkVW5kZXJzY29yZVZhcmlhYmxlcyB9IGZyb20gJy4vbm8tdXNlZC11bmRlcnNjb3JlLXZhcmlhYmxlcy50cyc7XG5pbXBvcnQgeyBwYXJhbXNPcHRpb25zTmFtZU1hdGNoIH0gZnJvbSAnLi9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoLnRzJztcbmltcG9ydCB7IHByZWZlck5vb3BBc3luYyB9IGZyb20gJy4vcHJlZmVyLW5vb3AtYXN5bmMudHMnO1xuaW1wb3J0IHsgcmVhZG9ubHlQYXJhbXNPcHRpb25zUmVzdWx0TWVtYmVycyB9IGZyb20gJy4vcmVhZG9ubHktcGFyYW1zLW9wdGlvbnMtcmVzdWx0LW1lbWJlcnMudHMnO1xuaW1wb3J0IHsgcmVxdWlyZUNvbXBvbmVudFN1ZmZpeCB9IGZyb20gJy4vcmVxdWlyZS1jb21wb25lbnQtc3VmZml4LnRzJztcbmltcG9ydCB7IHJlcXVpcmVNZXRob2RUZW1wbGF0ZSB9IGZyb20gJy4vcmVxdWlyZS1tZXRob2QtdGVtcGxhdGUudHMnO1xuaW1wb3J0IHsgcmVxdWlyZVN1cGVyQ2FsbCB9IGZyb20gJy4vcmVxdWlyZS1zdXBlci1jYWxsLnRzJztcblxuLyoqXG4gKiBFU0xpbnQgcGx1Z2luIGJ1bmRsaW5nIGV2ZXJ5IGBvYnNpZGlhbi1kZXYtdXRpbHNgIGN1c3RvbSBydWxlLCByZWdpc3RlcmVkIHVuZGVyIHRoZSBgb2JzaWRpYW4tZGV2LXV0aWxzYCBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBvYnNpZGlhbkRldlV0aWxzUGx1Z2luOiBFU0xpbnQuUGx1Z2luID0ge1xuICBydWxlczoge1xuICAgICdtYW5pZmVzdC1kZXNjcmlwdGlvbic6IG1hbmlmZXN0RGVzY3JpcHRpb24sXG4gICAgJ21hbmlmZXN0LWlkJzogbWFuaWZlc3RJZCxcbiAgICAnbWFuaWZlc3QtbmFtZSc6IG1hbmlmZXN0TmFtZSxcbiAgICAnbWFuaWZlc3Qtc2NoZW1hJzogbWFuaWZlc3RTY2hlbWEsXG4gICAgJ25vLWFzeW5jLWNhbGxiYWNrLXRvLXVuc2FmZS1yZXR1cm4nOiBub0FzeW5jQ2FsbGJhY2tUb1Vuc2FmZVJldHVybixcbiAgICAnbm8tdW50cnVzdGVkLWlucHV0LWV2ZW50cyc6IG5vVW50cnVzdGVkSW5wdXRFdmVudHMsXG4gICAgJ25vLXVudXNlZC1wYXJhbXMtbWVtYmVycyc6IG5vVW51c2VkUGFyYW1zTWVtYmVycyxcbiAgICAnbm8tdXNlZC11bmRlcnNjb3JlLXZhcmlhYmxlcyc6IG5vVXNlZFVuZGVyc2NvcmVWYXJpYWJsZXMsXG4gICAgJ3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2gnOiBwYXJhbXNPcHRpb25zTmFtZU1hdGNoLFxuICAgICdwcmVmZXItbm9vcC1hc3luYyc6IHByZWZlck5vb3BBc3luYyxcbiAgICAncmVhZG9ubHktcGFyYW1zLW9wdGlvbnMtcmVzdWx0LW1lbWJlcnMnOiByZWFkb25seVBhcmFtc09wdGlvbnNSZXN1bHRNZW1iZXJzLFxuICAgICdyZXF1aXJlLWNvbXBvbmVudC1zdWZmaXgnOiByZXF1aXJlQ29tcG9uZW50U3VmZml4LFxuICAgICdyZXF1aXJlLW1ldGhvZC10ZW1wbGF0ZSc6IHJlcXVpcmVNZXRob2RUZW1wbGF0ZSxcbiAgICAncmVxdWlyZS1zdXBlci1jYWxsJzogcmVxdWlyZVN1cGVyQ2FsbFxuICB9XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPQSxrQ0FBb0M7QUFDcEMseUJBQTJCO0FBQzNCLDJCQUE2QjtBQUM3Qiw2QkFBK0I7QUFDL0IsZ0RBQThDO0FBQzlDLHVDQUF1QztBQUN2QyxzQ0FBc0M7QUFDdEMsMENBQTBDO0FBQzFDLHVDQUF1QztBQUN2QywrQkFBZ0M7QUFDaEMsb0RBQW1EO0FBQ25ELHNDQUF1QztBQUN2QyxxQ0FBc0M7QUFDdEMsZ0NBQWlDO0FBSzFCLE1BQU0seUJBQXdDO0FBQUEsRUFDbkQsT0FBTztBQUFBLElBQ0wsd0JBQXdCO0FBQUEsSUFDeEIsZUFBZTtBQUFBLElBQ2YsaUJBQWlCO0FBQUEsSUFDakIsbUJBQW1CO0FBQUEsSUFDbkIsc0NBQXNDO0FBQUEsSUFDdEMsNkJBQTZCO0FBQUEsSUFDN0IsNEJBQTRCO0FBQUEsSUFDNUIsZ0NBQWdDO0FBQUEsSUFDaEMsNkJBQTZCO0FBQUEsSUFDN0IscUJBQXFCO0FBQUEsSUFDckIsMENBQTBDO0FBQUEsSUFDMUMsNEJBQTRCO0FBQUEsSUFDNUIsMkJBQTJCO0FBQUEsSUFDM0Isc0JBQXNCO0FBQUEsRUFDeEI7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
186
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL2VzbGludC1ydWxlcy9vYnNpZGlhbi1kZXYtdXRpbHMtcGx1Z2luLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRVNMaW50IHBsdWdpbiBmb3IgT2JzaWRpYW4gZGV2ZWxvcG1lbnQgdXRpbGl0aWVzLlxuICovXG5pbXBvcnQgdHlwZSB7IEVTTGludCB9IGZyb20gJ2VzbGludCc7XG5cbmltcG9ydCB7IG1hbmlmZXN0RGVzY3JpcHRpb24gfSBmcm9tICcuL21hbmlmZXN0LWRlc2NyaXB0aW9uLnRzJztcbmltcG9ydCB7IG1hbmlmZXN0SWQgfSBmcm9tICcuL21hbmlmZXN0LWlkLnRzJztcbmltcG9ydCB7IG1hbmlmZXN0TmFtZSB9IGZyb20gJy4vbWFuaWZlc3QtbmFtZS50cyc7XG5pbXBvcnQgeyBtYW5pZmVzdFNjaGVtYSB9IGZyb20gJy4vbWFuaWZlc3Qtc2NoZW1hLnRzJztcbmltcG9ydCB7IG5vQXN5bmNDYWxsYmFja1RvVW5zYWZlUmV0dXJuIH0gZnJvbSAnLi9uby1hc3luYy1jYWxsYmFjay10by11bnNhZmUtcmV0dXJuLnRzJztcbmltcG9ydCB7IG5vT3ZlckNhcFdhaXRJbkV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9uby1vdmVyLWNhcC13YWl0LWluLWV2YWwtaW4tb2JzaWRpYW4udHMnO1xuaW1wb3J0IHsgbm9VbnRydXN0ZWRJbnB1dEV2ZW50cyB9IGZyb20gJy4vbm8tdW50cnVzdGVkLWlucHV0LWV2ZW50cy50cyc7XG5pbXBvcnQgeyBub1VudXNlZFBhcmFtc01lbWJlcnMgfSBmcm9tICcuL25vLXVudXNlZC1wYXJhbXMtbWVtYmVycy50cyc7XG5pbXBvcnQgeyBub1VzZWRVbmRlcnNjb3JlVmFyaWFibGVzIH0gZnJvbSAnLi9uby11c2VkLXVuZGVyc2NvcmUtdmFyaWFibGVzLnRzJztcbmltcG9ydCB7IHBhcmFtc09wdGlvbnNOYW1lTWF0Y2ggfSBmcm9tICcuL3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2gudHMnO1xuaW1wb3J0IHsgcHJlZmVyTm9vcEFzeW5jIH0gZnJvbSAnLi9wcmVmZXItbm9vcC1hc3luYy50cyc7XG5pbXBvcnQgeyByZWFkb25seVBhcmFtc09wdGlvbnNSZXN1bHRNZW1iZXJzIH0gZnJvbSAnLi9yZWFkb25seS1wYXJhbXMtb3B0aW9ucy1yZXN1bHQtbWVtYmVycy50cyc7XG5pbXBvcnQgeyByZXF1aXJlQ29tcG9uZW50U3VmZml4IH0gZnJvbSAnLi9yZXF1aXJlLWNvbXBvbmVudC1zdWZmaXgudHMnO1xuaW1wb3J0IHsgcmVxdWlyZU1ldGhvZFRlbXBsYXRlIH0gZnJvbSAnLi9yZXF1aXJlLW1ldGhvZC10ZW1wbGF0ZS50cyc7XG5pbXBvcnQgeyByZXF1aXJlU3VwZXJDYWxsIH0gZnJvbSAnLi9yZXF1aXJlLXN1cGVyLWNhbGwudHMnO1xuXG4vKipcbiAqIEVTTGludCBwbHVnaW4gYnVuZGxpbmcgZXZlcnkgYG9ic2lkaWFuLWRldi11dGlsc2AgY3VzdG9tIHJ1bGUsIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHNgIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNvbnN0IG9ic2lkaWFuRGV2VXRpbHNQbHVnaW46IEVTTGludC5QbHVnaW4gPSB7XG4gIHJ1bGVzOiB7XG4gICAgJ21hbmlmZXN0LWRlc2NyaXB0aW9uJzogbWFuaWZlc3REZXNjcmlwdGlvbixcbiAgICAnbWFuaWZlc3QtaWQnOiBtYW5pZmVzdElkLFxuICAgICdtYW5pZmVzdC1uYW1lJzogbWFuaWZlc3ROYW1lLFxuICAgICdtYW5pZmVzdC1zY2hlbWEnOiBtYW5pZmVzdFNjaGVtYSxcbiAgICAnbm8tYXN5bmMtY2FsbGJhY2stdG8tdW5zYWZlLXJldHVybic6IG5vQXN5bmNDYWxsYmFja1RvVW5zYWZlUmV0dXJuLFxuICAgICduby1vdmVyLWNhcC13YWl0LWluLWV2YWwtaW4tb2JzaWRpYW4nOiBub092ZXJDYXBXYWl0SW5FdmFsSW5PYnNpZGlhbixcbiAgICAnbm8tdW50cnVzdGVkLWlucHV0LWV2ZW50cyc6IG5vVW50cnVzdGVkSW5wdXRFdmVudHMsXG4gICAgJ25vLXVudXNlZC1wYXJhbXMtbWVtYmVycyc6IG5vVW51c2VkUGFyYW1zTWVtYmVycyxcbiAgICAnbm8tdXNlZC11bmRlcnNjb3JlLXZhcmlhYmxlcyc6IG5vVXNlZFVuZGVyc2NvcmVWYXJpYWJsZXMsXG4gICAgJ3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2gnOiBwYXJhbXNPcHRpb25zTmFtZU1hdGNoLFxuICAgICdwcmVmZXItbm9vcC1hc3luYyc6IHByZWZlck5vb3BBc3luYyxcbiAgICAncmVhZG9ubHktcGFyYW1zLW9wdGlvbnMtcmVzdWx0LW1lbWJlcnMnOiByZWFkb25seVBhcmFtc09wdGlvbnNSZXN1bHRNZW1iZXJzLFxuICAgICdyZXF1aXJlLWNvbXBvbmVudC1zdWZmaXgnOiByZXF1aXJlQ29tcG9uZW50U3VmZml4LFxuICAgICdyZXF1aXJlLW1ldGhvZC10ZW1wbGF0ZSc6IHJlcXVpcmVNZXRob2RUZW1wbGF0ZSxcbiAgICAncmVxdWlyZS1zdXBlci1jYWxsJzogcmVxdWlyZVN1cGVyQ2FsbFxuICB9XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPQSxrQ0FBb0M7QUFDcEMseUJBQTJCO0FBQzNCLDJCQUE2QjtBQUM3Qiw2QkFBK0I7QUFDL0IsZ0RBQThDO0FBQzlDLGtEQUE4QztBQUM5Qyx1Q0FBdUM7QUFDdkMsc0NBQXNDO0FBQ3RDLDBDQUEwQztBQUMxQyx1Q0FBdUM7QUFDdkMsK0JBQWdDO0FBQ2hDLG9EQUFtRDtBQUNuRCxzQ0FBdUM7QUFDdkMscUNBQXNDO0FBQ3RDLGdDQUFpQztBQUsxQixNQUFNLHlCQUF3QztBQUFBLEVBQ25ELE9BQU87QUFBQSxJQUNMLHdCQUF3QjtBQUFBLElBQ3hCLGVBQWU7QUFBQSxJQUNmLGlCQUFpQjtBQUFBLElBQ2pCLG1CQUFtQjtBQUFBLElBQ25CLHNDQUFzQztBQUFBLElBQ3RDLHdDQUF3QztBQUFBLElBQ3hDLDZCQUE2QjtBQUFBLElBQzdCLDRCQUE0QjtBQUFBLElBQzVCLGdDQUFnQztBQUFBLElBQ2hDLDZCQUE2QjtBQUFBLElBQzdCLHFCQUFxQjtBQUFBLElBQ3JCLDBDQUEwQztBQUFBLElBQzFDLDRCQUE0QjtBQUFBLElBQzVCLDJCQUEyQjtBQUFBLElBQzNCLHNCQUFzQjtBQUFBLEVBQ3hCO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -8,9 +8,10 @@
8
8
  * roughly 34 KB of minified JavaScript into EVERY Obsidian plugin built with this library: a plugin
9
9
  * ships a single CJS `main.js`, esbuild has no code splitting to put a dependency behind, and a
10
10
  * `await import()` only defers evaluation — the module body is inlined either way. `node:zlib` is
11
- * already an esbuild external, so the same work now costs a plugin bundle nothing at all. Archives
12
- * are still WRITTEN with `adm-zip` at release time (`script-utils/demo-vault.ts`), which is Node-side
13
- * tooling and never reaches a plugin bundle.
11
+ * already an esbuild external, so the same work now costs a plugin bundle nothing at all. Archives are
12
+ * WRITTEN with `fflate` at release time (`script-utils/demo-vault.ts`), which is Node-side tooling and
13
+ * never reaches a plugin bundle — a third-party writer there is also what keeps this reader checked
14
+ * against an implementation that is not its own.
14
15
  *
15
16
  * Deliberately narrow: it reads exactly what that writer produces — stored and deflated entries in an
16
17
  * unencrypted archive below the 4 GB / 65535-entry ZIP64 threshold — and raises a named error for