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,302 @@
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 initEsm() {
40
+ ensureBrowserProcess();
41
+ })();
42
+ })();
43
+
44
+ const MESSAGE_ID = "noOverCapWaitInEvalInObsidian";
45
+ const DEFAULT_CAP_IN_MILLISECONDS = 3e4;
46
+ const WAIT_UNTIL_DEFAULT_TIMEOUT_IN_MILLISECONDS = 5e3;
47
+ const INPUT_PROPERTY_NAME = "input";
48
+ const SLEEP_CALLEE_NAME = "sleep";
49
+ const TIMEOUT_PROPERTY_NAME = "timeoutInMilliseconds";
50
+ const WAIT_UNTIL_CALLEE_NAME = "waitUntil";
51
+ const CLOSURE_NAMES_BY_CALLEE_NAME = /* @__PURE__ */ new Map([
52
+ ["evalInObsidian", ["callback"]],
53
+ ["pollInObsidian", ["poll", "start"]]
54
+ ]);
55
+ const noOverCapWaitInEvalInObsidian = {
56
+ create(context) {
57
+ const options = context.options[0];
58
+ const capInMilliseconds = options?.capInMilliseconds ?? DEFAULT_CAP_IN_MILLISECONDS;
59
+ const budgetByClosureNode = /* @__PURE__ */ new Map();
60
+ return {
61
+ "CallExpression"(node) {
62
+ const callNode = node;
63
+ const budgetExpression = readWaitBudgetExpression(callNode);
64
+ if (budgetExpression === void 0) {
65
+ return;
66
+ }
67
+ const closure = findEnclosingEvalClosure(callNode);
68
+ if (!closure) {
69
+ return;
70
+ }
71
+ const waitInMilliseconds = budgetExpression === null ? WAIT_UNTIL_DEFAULT_TIMEOUT_IN_MILLISECONDS : resolveMilliseconds(budgetExpression, closure, context);
72
+ if (waitInMilliseconds === null) {
73
+ return;
74
+ }
75
+ const runningTotalInMilliseconds = budgetByClosureNode.get(closure.closureNode)?.totalInMilliseconds ?? 0;
76
+ budgetByClosureNode.set(closure.closureNode, {
77
+ reportNode: closure.reportNode,
78
+ totalInMilliseconds: runningTotalInMilliseconds + waitInMilliseconds
79
+ });
80
+ },
81
+ "Program:exit"() {
82
+ for (const budget of budgetByClosureNode.values()) {
83
+ if (budget.totalInMilliseconds < capInMilliseconds) {
84
+ continue;
85
+ }
86
+ context.report({
87
+ data: {
88
+ capInMilliseconds: String(capInMilliseconds),
89
+ totalInMilliseconds: String(budget.totalInMilliseconds)
90
+ },
91
+ messageId: MESSAGE_ID,
92
+ node: budget.reportNode
93
+ });
94
+ }
95
+ }
96
+ };
97
+ },
98
+ meta: {
99
+ docs: {
100
+ description: "Disallow an in-Obsidian closure declaring more waiting than the transport's script-timeout cap allows"
101
+ },
102
+ messages: {
103
+ [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`."
104
+ },
105
+ schema: [{
106
+ additionalProperties: false,
107
+ properties: {
108
+ capInMilliseconds: {
109
+ minimum: 1,
110
+ type: "integer"
111
+ }
112
+ },
113
+ type: "object"
114
+ }],
115
+ type: "problem"
116
+ }
117
+ };
118
+ function findEnclosingEvalClosure(node) {
119
+ let currentNode = node.parent;
120
+ while (currentNode) {
121
+ const closure = readEvalClosure(currentNode);
122
+ if (closure) {
123
+ return closure;
124
+ }
125
+ currentNode = currentNode.parent;
126
+ }
127
+ return null;
128
+ }
129
+ function findVariable(scope, name) {
130
+ let currentScope = scope;
131
+ while (currentScope) {
132
+ const variable = currentScope.variables.find((candidate) => candidate.name === name);
133
+ if (variable) {
134
+ return variable;
135
+ }
136
+ currentScope = currentScope.upper;
137
+ }
138
+ return null;
139
+ }
140
+ function isBinaryExpression(node) {
141
+ return node.type === "BinaryExpression";
142
+ }
143
+ function isCallExpression(node) {
144
+ return node.type === "CallExpression";
145
+ }
146
+ function isClosureFunction(node) {
147
+ return node.type === "FunctionExpression" || node.type === "ArrowFunctionExpression";
148
+ }
149
+ function isIdentifier(node) {
150
+ return node.type === "Identifier";
151
+ }
152
+ function isNumericLiteral(node) {
153
+ return node.type === "Literal" && typeof node.value === "number";
154
+ }
155
+ function isObjectExpression(node) {
156
+ return node.type === "ObjectExpression";
157
+ }
158
+ function isObjectPattern(node) {
159
+ return node.type === "ObjectPattern";
160
+ }
161
+ function isProperty(node) {
162
+ return node.type === "Property";
163
+ }
164
+ function isVariableDeclarator(node) {
165
+ return node.type === "VariableDeclarator";
166
+ }
167
+ function readBoundExpression(node, closure, context) {
168
+ const variable = findVariable(context.sourceCode.getScope(node), node.name);
169
+ if (!variable) {
170
+ return null;
171
+ }
172
+ for (const definition of variable.defs) {
173
+ const definitionNode = definition.node;
174
+ if (isVariableDeclarator(definitionNode) && definitionNode.init) {
175
+ return definitionNode.init;
176
+ }
177
+ if (definitionNode === closure.closureNode) {
178
+ const inputKey = readParameterInputKey(closure.closureNode, node.name);
179
+ if (inputKey === null) {
180
+ return null;
181
+ }
182
+ return readInputPropertyValue(closure.paramsNode, inputKey);
183
+ }
184
+ }
185
+ return null;
186
+ }
187
+ function readClosureNames(callNode) {
188
+ if (!isIdentifier(callNode.callee)) {
189
+ return null;
190
+ }
191
+ return CLOSURE_NAMES_BY_CALLEE_NAME.get(callNode.callee.name) ?? null;
192
+ }
193
+ function readEvalClosure(node) {
194
+ if (!isClosureFunction(node)) {
195
+ return null;
196
+ }
197
+ const propertyNode = node.parent;
198
+ if (!isProperty(propertyNode)) {
199
+ return null;
200
+ }
201
+ const paramsNode = propertyNode.parent;
202
+ if (!isObjectExpression(paramsNode)) {
203
+ return null;
204
+ }
205
+ if (!isIdentifier(propertyNode.key)) {
206
+ return null;
207
+ }
208
+ const callNode = paramsNode.parent;
209
+ if (!isCallExpression(callNode) || callNode.arguments[0] !== paramsNode) {
210
+ return null;
211
+ }
212
+ const closureNames = readClosureNames(callNode);
213
+ if (!closureNames?.includes(propertyNode.key.name)) {
214
+ return null;
215
+ }
216
+ return {
217
+ closureNode: node,
218
+ paramsNode,
219
+ reportNode: propertyNode
220
+ };
221
+ }
222
+ function readInputPropertyValue(paramsNode, keyName) {
223
+ const inputProperty = paramsNode.properties.find(
224
+ (property) => isProperty(property) && isIdentifier(property.key) && property.key.name === INPUT_PROPERTY_NAME
225
+ );
226
+ const inputNode = inputProperty?.value;
227
+ if (!inputNode || !isObjectExpression(inputNode)) {
228
+ return null;
229
+ }
230
+ const valueProperty = inputNode.properties.find(
231
+ (property) => isProperty(property) && isIdentifier(property.key) && property.key.name === keyName
232
+ );
233
+ return valueProperty?.value ?? null;
234
+ }
235
+ function readParameterInputKey(closureNode, localName) {
236
+ for (const parameterNode of closureNode.params) {
237
+ if (!isObjectPattern(parameterNode)) {
238
+ continue;
239
+ }
240
+ for (const property of parameterNode.properties) {
241
+ if (!isProperty(property) || property.computed || !isIdentifier(property.key) || !isIdentifier(property.value)) {
242
+ continue;
243
+ }
244
+ if (property.value.name === localName) {
245
+ return property.key.name;
246
+ }
247
+ }
248
+ }
249
+ return null;
250
+ }
251
+ function readWaitBudgetExpression(callNode) {
252
+ if (!isIdentifier(callNode.callee)) {
253
+ return void 0;
254
+ }
255
+ const calleeName = callNode.callee.name;
256
+ if (calleeName === SLEEP_CALLEE_NAME) {
257
+ return callNode.arguments[0] ?? void 0;
258
+ }
259
+ if (calleeName !== WAIT_UNTIL_CALLEE_NAME) {
260
+ return void 0;
261
+ }
262
+ const paramsNode = callNode.arguments[0];
263
+ if (!paramsNode || !isObjectExpression(paramsNode)) {
264
+ return void 0;
265
+ }
266
+ const timeoutProperty = paramsNode.properties.find(
267
+ (property) => isProperty(property) && isIdentifier(property.key) && property.key.name === TIMEOUT_PROPERTY_NAME
268
+ );
269
+ return timeoutProperty?.value ?? null;
270
+ }
271
+ function resolveMilliseconds(node, closure, context) {
272
+ const visitedNodes = /* @__PURE__ */ new Set();
273
+ let currentNode = node;
274
+ while (!visitedNodes.has(currentNode)) {
275
+ visitedNodes.add(currentNode);
276
+ if (isNumericLiteral(currentNode)) {
277
+ return currentNode.value;
278
+ }
279
+ if (isBinaryExpression(currentNode) && currentNode.operator === "*") {
280
+ const leftInMilliseconds = resolveMilliseconds(currentNode.left, closure, context);
281
+ const rightInMilliseconds = resolveMilliseconds(currentNode.right, closure, context);
282
+ if (leftInMilliseconds === null || rightInMilliseconds === null) {
283
+ return null;
284
+ }
285
+ return leftInMilliseconds * rightInMilliseconds;
286
+ }
287
+ if (!isIdentifier(currentNode)) {
288
+ return null;
289
+ }
290
+ const boundNode = readBoundExpression(currentNode, closure, context);
291
+ if (!boundNode) {
292
+ return null;
293
+ }
294
+ currentNode = boundNode;
295
+ }
296
+ return null;
297
+ }
298
+ export {
299
+ MESSAGE_ID,
300
+ noOverCapWaitInEvalInObsidian
301
+ };
302
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL2VzbGludC1ydWxlcy9uby1vdmVyLWNhcC13YWl0LWluLWV2YWwtaW4tb2JzaWRpYW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBFU0xpbnQgcnVsZTogbm8tb3Zlci1jYXAtd2FpdC1pbi1ldmFsLWluLW9ic2lkaWFuXG4gKlxuICogUmVwb3J0cyBhbiBgZXZhbEluT2JzaWRpYW5gIC8gYHBvbGxJbk9ic2lkaWFuYCBjbG9zdXJlIHRoYXQgZGVjbGFyZXMgbW9yZSB3YWl0aW5nXG4gKiB0aGFuIHRoZSB0cmFuc3BvcnQgY2FuIGV2ZXIgaG9ub3VyLlxuICpcbiAqIEEgc2luZ2xlIGNsb3N1cmUgaXMgZXZhbHVhdGVkIHRocm91Z2ggb25lIHRyYW5zcG9ydCBjYWxsLCBhbmQgdGhhdCBjYWxsIGlzIGNhcHBlZCBhdFxuICogcm91Z2hseSAzMCBzZWNvbmRzIFx1MjAxNCBBcHBpdW0gc3VyZmFjZXMgdGhlIGNhcCBhcyBhIGJhcmUgYFdlYkRyaXZlckVycm9yOiBzY3JpcHQgdGltZW91dGBcbiAqIG5hbWluZyBvbmx5IGBBcHBpdW1UcmFuc3BvcnQuZXZhbHVhdGVgLCBDRFAgYXMgYSBjb21tYW5kIHRpbWVvdXQuIE5laXRoZXIgbmFtZXMgdGhlIHdhaXRcbiAqIHRoYXQgYWN0dWFsbHkgYmxldyB0aGUgYnVkZ2V0LCBzbyB0aGUgZmFpbHVyZSByZWFkcyBhcyBhIGJyb2tlbiBkZXZpY2UgcmF0aGVyIHRoYW4gYXMgYVxuICogY2xvc3VyZSBhc2tpbmcgZm9yIG1vcmUgdGltZSB0aGFuIGV4aXN0cy4gVGhhdCBtaXNkaWFnbm9zaXMgY29zdCBgVDc5NmAgdHdvIGRheXMuXG4gKlxuICogQSBjbG9zdXJlIGRlY2xhcmluZyBhIDMwIDAwMCBtcyBgd2FpdFVudGlsYCwgb3IgdHdvIDIwIDAwMCBtcyBvbmVzLCB0aGVyZWZvcmUgY2Fubm90XG4gKiBzdWNjZWVkIG9uIGFueSBtYWNoaW5lIHNsb3cgZW5vdWdoIHRvIG5lZWQgdGhlIHRpbWUgaXQgYXNrcyBmb3IuIFRoZSBmaXggaXMgdG8gbW92ZSB0aGVcbiAqIHdhaXRpbmcgdG8gTm9kZTogYHBvbGxJbk9ic2lkaWFuYCBydW5zIGEgU0hPUlQgRE9NLXJlYWRpbmcgYHBvbGxgIGNsb3N1cmUgcmVwZWF0ZWRseSxcbiAqIGV2YWx1YXRlcyBgdW50aWxgIGluIE5vZGUsIGFuZCBjYXJyaWVzIHRoZSBsb25nIGJ1ZGdldCBpbiBgdGltZW91dEluTWlsbGlzZWNvbmRzYCwgc28gbm9cbiAqIHNpbmdsZSB0cmFuc3BvcnQgY2FsbCBpcyBldmVyIGxvbmcuXG4gKlxuICogV0hBVCBDT1VOVFMgdG93YXJkIGEgY2xvc3VyZSdzIGJ1ZGdldCwgc3VtbWVkIGxleGljYWxseTogZXZlcnkgYHdhaXRVbnRpbGAgaW5zaWRlIGl0IFx1MjAxNFxuICogdGFraW5nIHRoZSBoZWxwZXIncyBkb2N1bWVudGVkIDUgMDAwIG1zIGRlZmF1bHQgd2hlbiBgdGltZW91dEluTWlsbGlzZWNvbmRzYCBpcyBvbWl0dGVkLFxuICogd2hpY2ggaXMgd2hhdCBtYWtlcyBzZXZlcmFsIHNtYWxsIHNpYmxpbmcgd2FpdHMgYWRkIHVwIGhvbmVzdGx5IFx1MjAxNCBwbHVzIGV2ZXJ5IGBzbGVlcChuKWBcbiAqIHNldHRsZS4gV2FpdHMgaW5zaWRlIGEgaGVscGVyIGRlY2xhcmVkIHdpdGhpbiB0aGUgY2xvc3VyZSBjb3VudCB0b287IHRoZSBlbmNsb3NpbmdcbiAqIGNsb3N1cmUgaXMgZm91bmQgYnkgd2Fsa2luZyBvdXR3YXJkcywgc28gYSBuZXN0ZWQgZnVuY3Rpb24gYXR0cmlidXRlcyB0byB0aGUgY2xvc3VyZSBpdFxuICogcnVucyBpbnNpZGUuXG4gKlxuICogV0hBVCBET0VTIE5PVC4gQSBidWRnZXQgdGhhdCBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSBudW1iZXIgY29udHJpYnV0ZXMgbm90aGluZyBhbmQgaXNcbiAqIG5ldmVyIHJlcG9ydGVkIChvd25lciwgMjAyNi0wOS0wOSkuIFNjb3BlIGFuYWx5c2lzIHJlc29sdmVzIHRoZSBzaGFwZXMgdGhhdCBhY3R1YWxseVxuICogb2NjdXIgXHUyMDE0IGEgbGl0ZXJhbCwgYSBgY29uc3RgIGluIGFueSBlbmNsb3Npbmcgc2NvcGUsIGFuZCBhIGRlc3RydWN0dXJlZCBjYWxsYmFja1xuICogcGFyYW1ldGVyIGZvbGxvd2VkIGJhY2sgdGhyb3VnaCB0aGUgY2FsbCdzIG93biBgaW5wdXRgIG9iamVjdCBcdTIwMTQgYW5kIHJlc29sdmluZyB0aHJvdWdoXG4gKiBzY29wZSByYXRoZXIgdGhhbiBieSByZWdleCBpcyB0aGUgd2hvbGUgcmVhc29uIHRoaXMgaXMgYSBydWxlIGFuZCBub3QgYSBzY3JpcHQuIEJ1dCBhXG4gKiB2YWx1ZSBhcnJpdmluZyBmcm9tIGEgY2FsbGVyIChgb3B0aW9ucy50aW1lb3V0ID8/IERFRkFVTFRgLCB0aHJlYWRlZCB0aHJvdWdoIGFcbiAqIHBhcmFtZXRlcikgd291bGQgbmVlZCBhbmFseXNpcyBhY3Jvc3MgY2FsbCBib3VuZGFyaWVzLCBhbmQgcmVwb3J0aW5nIGV2ZXJ5IHN1Y2ggc2l0ZSB3b3VsZFxuICogbWFrZSBlYWNoIGxlZ2l0aW1hdGVseSBwYXJhbWV0ZXJpemVkIGhlbHBlciByZWQgYWNyb3NzIHRoaXJ0eSByZXBvcy4gQSBMT09QIGlzIG91dCBvZiBzY29wZVxuICogZm9yIHRoZSBzYW1lIHJlYXNvbjogYSBgc2xlZXBgIGluIGEgYHdoaWxlYCBoYXMgbm8gc3RhdGljYWxseSBkZWNsYXJlZCBjZWlsaW5nLCBzbyB0aGVcbiAqIHN1bSBiZWxvdyBpcyBwZXItaXRlcmF0aW9uIGFuZCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHdob2xlLlxuICpcbiAqIE5vdCBldmVyeSBvdmVyLWNhcCBjbG9zdXJlIGNhbiBiZWNvbWUgYSBgcG9sbGAgLyBgdW50aWxgIHBhaXIsIHNvIHRoZSBydWxlIGlzIG1lYW50IHRvIGJlXG4gKiBkaXNhYmxlZCBcdTIwMTQgd2l0aCBhIHJlYXNvbiBcdTIwMTQgYXQgdGhlIHNpdGVzIHRoYXQgaGF2ZSBvbmUuIGByZXF1aXJlLWRlc2NyaXB0aW9uYCBtYWtlcyB0aGF0XG4gKiByZWFzb24gbWFuZGF0b3J5LCB3aGljaCBpcyB0aGUgcG9pbnQ6IGl0IHR1cm5zIGFuIGludmlzaWJsZSBhc3N1bXB0aW9uIGludG8gYSB3cml0dGVuIG9uZS5cbiAqL1xuaW1wb3J0IHR5cGUgeyBUU0VTVHJlZSB9IGZyb20gJ0B0eXBlc2NyaXB0LWVzbGludC91dGlscyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJ1bGUsXG4gIFNjb3BlXG59IGZyb20gJ2VzbGludCc7XG5cbi8qKlxuICogTWVzc2FnZSBJRCByZXBvcnRlZCB3aGVuIGFuIGluLU9ic2lkaWFuIGNsb3N1cmUgZGVjbGFyZXMgbW9yZSB3YWl0aW5nIHRoYW4gdGhlIHRyYW5zcG9ydCdzIGNhcCBhbGxvd3MuXG4gKi9cbmV4cG9ydCBjb25zdCBNRVNTQUdFX0lEID0gJ25vT3ZlckNhcFdhaXRJbkV2YWxJbk9ic2lkaWFuJztcblxuLyoqXG4gKiBUaGUgY2FwIGFzc3VtZWQgd2hlbiB0aGUgcnVsZSBpcyBjb25maWd1cmVkIHdpdGhvdXQgb25lLCBtYXRjaGluZyB0aGUgdHJhbnNwb3J0J3Mgb3duIHNjcmlwdCB0aW1lb3V0LlxuICovXG5jb25zdCBERUZBVUxUX0NBUF9JTl9NSUxMSVNFQ09ORFMgPSAzMF8wMDA7XG5cbi8qKlxuICogVGhlIGJ1ZGdldCBhIGB3YWl0VW50aWxgIHRha2VzIHdoZW4gaXQgb21pdHMgYHRpbWVvdXRJbk1pbGxpc2Vjb25kc2AsIHBlciBgV2FpdFVudGlsUGFyYW1zYC5cbiAqL1xuY29uc3QgV0FJVF9VTlRJTF9ERUZBVUxUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuY29uc3QgSU5QVVRfUFJPUEVSVFlfTkFNRSA9ICdpbnB1dCc7XG5jb25zdCBTTEVFUF9DQUxMRUVfTkFNRSA9ICdzbGVlcCc7XG5jb25zdCBUSU1FT1VUX1BST1BFUlRZX05BTUUgPSAndGltZW91dEluTWlsbGlzZWNvbmRzJztcbmNvbnN0IFdBSVRfVU5USUxfQ0FMTEVFX05BTUUgPSAnd2FpdFVudGlsJztcblxuLyoqXG4gKiBXaGljaCBwcm9wZXJ0aWVzIG9mIGVhY2ggaGVscGVyJ3MgcGFyYW1ldGVyIG9iamVjdCBob2xkIGEgY2xvc3VyZSB0aGF0IHJ1bnMgSU5TSURFIE9ic2lkaWFuLCBhbmQgaXNcbiAqIHRoZXJlZm9yZSBzdWJqZWN0IHRvIHRoZSBjYXAuIGBwb2xsSW5PYnNpZGlhbmAncyBgdW50aWxgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQ6IGl0IGlzIGV2YWx1YXRlZCBpblxuICogTm9kZSwgd2hpY2ggaXMgdGhlIGVudGlyZSBwb2ludCBvZiBjb252ZXJ0aW5nIHRvIGl0LlxuICovXG5jb25zdCBDTE9TVVJFX05BTUVTX0JZX0NBTExFRV9OQU1FID0gbmV3IE1hcDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPihbXG4gIFsnZXZhbEluT2JzaWRpYW4nLCBbJ2NhbGxiYWNrJ11dLFxuICBbJ3BvbGxJbk9ic2lkaWFuJywgWydwb2xsJywgJ3N0YXJ0J11dXG5dKTtcblxuLyoqXG4gKiBUaGUgcnVsZSdzIHNpbmdsZSBvcHRpb24gb2JqZWN0LlxuICovXG5pbnRlcmZhY2UgQ2FwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgYnVkZ2V0IGF0IG9yIG92ZXIgd2hpY2ggYSBjbG9zdXJlIGlzIHJlcG9ydGVkLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSBjYXBJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgd2FpdGluZyBzdW1tZWQgc28gZmFyIGZvciBvbmUgY2xvc3VyZS5cbiAqL1xuaW50ZXJmYWNlIENsb3N1cmVCdWRnZXQge1xuICAvKipcbiAgICogVGhlIG5vZGUgdG8gcmVwb3J0IG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3J0Tm9kZTogVFNFU1RyZWUuTm9kZTtcblxuICAvKipcbiAgICogVGhlIHN1bSBvZiBldmVyeSByZXNvbHZhYmxlIHdhaXQgZGVjbGFyZWQgaW5zaWRlIHRoZSBjbG9zdXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgdG90YWxJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgZnVuY3Rpb24gd3JpdHRlbiBhcyBhbiBvYmplY3QgcHJvcGVydHksIHdoaWNoIGlzIHRoZSBvbmx5IGZvcm0gZWl0aGVyIGhlbHBlcidzIGNsb3N1cmVzIHRha2UuXG4gKi9cbnR5cGUgQ2xvc3VyZUZ1bmN0aW9uID0gVFNFU1RyZWUuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24gfCBUU0VTVHJlZS5GdW5jdGlvbkV4cHJlc3Npb247XG5cbi8qKlxuICogQW4gaW4tT2JzaWRpYW4gY2xvc3VyZSwgdG9nZXRoZXIgd2l0aCB0aGUgY2FsbCBpdCBiZWxvbmdzIHRvIChuZWVkZWQgdG8gcmVzb2x2ZSBhIGJ1ZGdldCB0aHJlYWRlZFxuICogdGhyb3VnaCB0aGF0IGNhbGwncyBgaW5wdXRgKSBhbmQgdGhlIG5vZGUgdG8gcmVwb3J0IG9uLlxuICovXG5pbnRlcmZhY2UgRXZhbENsb3N1cmUge1xuICAvKipcbiAgICogVGhlIGNsb3N1cmUncyBmdW5jdGlvbiBub2RlLCB3aGljaCBpZGVudGlmaWVzIHRoZSBjbG9zdXJlIGFjcm9zcyBzaWJsaW5nIHdhaXRzIGFuZCBjYXJyaWVzIHRoZVxuICAgKiBwYXJhbWV0ZXIgcGF0dGVybiBhIGJ1ZGdldCB0aHJlYWRlZCB0aHJvdWdoIGBpbnB1dGAgaXMgZGVzdHJ1Y3R1cmVkIGJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgY2xvc3VyZU5vZGU6IENsb3N1cmVGdW5jdGlvbjtcblxuICAvKipcbiAgICogVGhlIGhlbHBlcidzIHBhcmFtZXRlciBvYmplY3QsIGNhcnJpZWQgc28gYSBidWRnZXQgdGhyZWFkZWQgdGhyb3VnaCBgaW5wdXRgIGlzIHJlYWQgZnJvbSB0aGUgb2JqZWN0XG4gICAqIHRoZSBjbG9zdXJlIHdhcyBhbHJlYWR5IGZvdW5kIGluIHJhdGhlciB0aGFuIHJlLWRlcml2ZWQgZnJvbSB0aGUgY2FsbC5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtc05vZGU6IFRTRVNUcmVlLk9iamVjdEV4cHJlc3Npb247XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSB0aGUgY2xvc3VyZSBpcyB3cml0dGVuIGFzLCByZXBvcnRlZCBvbiBzbyB0aGUgbWVzc2FnZSBwb2ludHMgYXQgYGNhbGxiYWNrYCAvIGBwb2xsYFxuICAgKiByYXRoZXIgdGhhbiBhdCB3aGljaGV2ZXIgd2FpdCBoYXBwZW5lZCB0byBjb21lIGZpcnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3J0Tm9kZTogVFNFU1RyZWUuTm9kZTtcbn1cblxuLyoqXG4gKiBFU0xpbnQgcnVsZSBkaXNhbGxvd2luZyBhbiBpbi1PYnNpZGlhbiBjbG9zdXJlIHdob3NlIGRlY2xhcmVkIHdhaXRpbmcgZXhjZWVkcyB0aGUgdHJhbnNwb3J0J3Mgc2NyaXB0LXRpbWVvdXQgY2FwLlxuICovXG5leHBvcnQgY29uc3Qgbm9PdmVyQ2FwV2FpdEluRXZhbEluT2JzaWRpYW46IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgY3JlYXRlKGNvbnRleHQpIHtcbiAgICBjb25zdCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zWzBdIGFzIENhcE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgY2FwSW5NaWxsaXNlY29uZHMgPSBvcHRpb25zPy5jYXBJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0NBUF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgY29uc3QgYnVkZ2V0QnlDbG9zdXJlTm9kZSA9IG5ldyBNYXA8VFNFU1RyZWUuTm9kZSwgQ2xvc3VyZUJ1ZGdldD4oKTtcblxuICAgIHJldHVybiB7XG4gICAgICAnQ2FsbEV4cHJlc3Npb24nKG5vZGU6IFJ1bGUuTm9kZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBjYWxsTm9kZSA9IG5vZGUgYXMgVFNFU1RyZWUuQ2FsbEV4cHJlc3Npb247XG5cbiAgICAgICAgY29uc3QgYnVkZ2V0RXhwcmVzc2lvbiA9IHJlYWRXYWl0QnVkZ2V0RXhwcmVzc2lvbihjYWxsTm9kZSk7XG4gICAgICAgIGlmIChidWRnZXRFeHByZXNzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbG9zdXJlID0gZmluZEVuY2xvc2luZ0V2YWxDbG9zdXJlKGNhbGxOb2RlKTtcbiAgICAgICAgaWYgKCFjbG9zdXJlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgd2FpdEluTWlsbGlzZWNvbmRzID0gYnVkZ2V0RXhwcmVzc2lvbiA9PT0gbnVsbFxuICAgICAgICAgID8gV0FJVF9VTlRJTF9ERUZBVUxUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgICAgICAgOiByZXNvbHZlTWlsbGlzZWNvbmRzKGJ1ZGdldEV4cHJlc3Npb24sIGNsb3N1cmUsIGNvbnRleHQpO1xuICAgICAgICBpZiAod2FpdEluTWlsbGlzZWNvbmRzID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcnVubmluZ1RvdGFsSW5NaWxsaXNlY29uZHMgPSBidWRnZXRCeUNsb3N1cmVOb2RlLmdldChjbG9zdXJlLmNsb3N1cmVOb2RlKT8udG90YWxJbk1pbGxpc2Vjb25kcyA/PyAwO1xuICAgICAgICBidWRnZXRCeUNsb3N1cmVOb2RlLnNldChjbG9zdXJlLmNsb3N1cmVOb2RlLCB7XG4gICAgICAgICAgcmVwb3J0Tm9kZTogY2xvc3VyZS5yZXBvcnROb2RlLFxuICAgICAgICAgIHRvdGFsSW5NaWxsaXNlY29uZHM6IHJ1bm5pbmdUb3RhbEluTWlsbGlzZWNvbmRzICsgd2FpdEluTWlsbGlzZWNvbmRzXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgICdQcm9ncmFtOmV4aXQnKCk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IGJ1ZGdldCBvZiBidWRnZXRCeUNsb3N1cmVOb2RlLnZhbHVlcygpKSB7XG4gICAgICAgICAgaWYgKGJ1ZGdldC50b3RhbEluTWlsbGlzZWNvbmRzIDwgY2FwSW5NaWxsaXNlY29uZHMpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgY2FwSW5NaWxsaXNlY29uZHM6IFN0cmluZyhjYXBJbk1pbGxpc2Vjb25kcyksXG4gICAgICAgICAgICAgIHRvdGFsSW5NaWxsaXNlY29uZHM6IFN0cmluZyhidWRnZXQudG90YWxJbk1pbGxpc2Vjb25kcylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXNzYWdlSWQ6IE1FU1NBR0VfSUQsXG4gICAgICAgICAgICBub2RlOiBidWRnZXQucmVwb3J0Tm9kZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgbWV0YToge1xuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGlzYWxsb3cgYW4gaW4tT2JzaWRpYW4gY2xvc3VyZSBkZWNsYXJpbmcgbW9yZSB3YWl0aW5nIHRoYW4gdGhlIHRyYW5zcG9ydFxcJ3Mgc2NyaXB0LXRpbWVvdXQgY2FwIGFsbG93cydcbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICBbTUVTU0FHRV9JRF06ICdUaGlzIGNsb3N1cmUgZGVjbGFyZXMge3sgdG90YWxJbk1pbGxpc2Vjb25kcyB9fSBtcyBvZiB3YWl0aW5nLCBhdCBvciBvdmVyIHRoZSB0cmFuc3BvcnRcXCdzIHt7IGNhcEluTWlsbGlzZWNvbmRzIH19IG1zIGNhcCwgc28gaXQgY2FuIG9ubHkgZXZlciBkaWUgYXMgYSBiYXJlIGBzY3JpcHQgdGltZW91dGA6IHdhaXQgaW4gTm9kZSBpbnN0ZWFkLCB3aXRoIGEgc2hvcnQgRE9NLXJlYWRpbmcgYHBvbGxJbk9ic2lkaWFuYCBgcG9sbGAsIGFuIGB1bnRpbGAgZXZhbHVhdGVkIGluIE5vZGUsIGFuZCB0aGUgbG9uZyBidWRnZXQgaW4gYHRpbWVvdXRJbk1pbGxpc2Vjb25kc2AuJ1xuICAgIH0sXG4gICAgc2NoZW1hOiBbe1xuICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBjYXBJbk1pbGxpc2Vjb25kczoge1xuICAgICAgICAgIG1pbmltdW06IDEsXG4gICAgICAgICAgdHlwZTogJ2ludGVnZXInXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0eXBlOiAnb2JqZWN0J1xuICAgIH1dLFxuICAgIHR5cGU6ICdwcm9ibGVtJ1xuICB9XG59O1xuXG4vKipcbiAqIEZpbmRzIHRoZSBpbi1PYnNpZGlhbiBjbG9zdXJlIGEgbm9kZSBydW5zIGluc2lkZSwgd2Fsa2luZyBvdXR3YXJkcy5cbiAqXG4gKiBUaGUgd2FsayBkb2VzIG5vdCBzdG9wIGF0IHRoZSBmaXJzdCBlbmNsb3NpbmcgZnVuY3Rpb246IGEgd2FpdCBpbnNpZGUgYSBoZWxwZXIgZGVjbGFyZWQgd2l0aGluIHRoZVxuICogY2FsbGJhY2sgc3RpbGwgcnVucyBpbnNpZGUgdGhlIGNhbGxiYWNrLCBzbyBpdCBrZWVwcyBnb2luZyB1bnRpbCBpdCByZWFjaGVzIGEgZnVuY3Rpb24gdGhhdCBJUyBvbmUgb2ZcbiAqIHRoZSBoZWxwZXIncyBpbi1PYnNpZGlhbiBjbG9zdXJlcy5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIHN0YXJ0IGZyb20uXG4gKiBAcmV0dXJucyBUaGUgZW5jbG9zaW5nIGNsb3N1cmUsIG9yIGBudWxsYCB3aGVuIHRoZSBub2RlIGRvZXMgbm90IHJ1biBpbnNpZGUgb25lLlxuICovXG5mdW5jdGlvbiBmaW5kRW5jbG9zaW5nRXZhbENsb3N1cmUobm9kZTogVFNFU1RyZWUuTm9kZSk6IEV2YWxDbG9zdXJlIHwgbnVsbCB7XG4gIGxldCBjdXJyZW50Tm9kZTogVFNFU1RyZWUuTm9kZSB8IHVuZGVmaW5lZCA9IG5vZGUucGFyZW50O1xuXG4gIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgIGNvbnN0IGNsb3N1cmUgPSByZWFkRXZhbENsb3N1cmUoY3VycmVudE5vZGUpO1xuICAgIGlmIChjbG9zdXJlKSB7XG4gICAgICByZXR1cm4gY2xvc3VyZTtcbiAgICB9XG4gICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBGaW5kcyBhIHZhcmlhYmxlIGJ5IG5hbWUsIHdhbGtpbmcgb3V0d2FyZHMgZnJvbSB0aGUgZ2l2ZW4gc2NvcGUuXG4gKlxuICogQHBhcmFtIHNjb3BlIC0gVGhlIHNjb3BlIHRvIHN0YXJ0IGZyb20uXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB2YXJpYWJsZSdzIG5hbWUuXG4gKiBAcmV0dXJucyBUaGUgdmFyaWFibGUsIG9yIGBudWxsYCB3aGVuIG5vdGhpbmcgaW4gc2NvcGUgZGVjbGFyZXMgdGhhdCBuYW1lLlxuICovXG5mdW5jdGlvbiBmaW5kVmFyaWFibGUoc2NvcGU6IFNjb3BlLlNjb3BlLCBuYW1lOiBzdHJpbmcpOiBudWxsIHwgU2NvcGUuVmFyaWFibGUge1xuICBsZXQgY3VycmVudFNjb3BlOiBudWxsIHwgU2NvcGUuU2NvcGUgPSBzY29wZTtcblxuICB3aGlsZSAoY3VycmVudFNjb3BlKSB7XG4gICAgY29uc3QgdmFyaWFibGUgPSBjdXJyZW50U2NvcGUudmFyaWFibGVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT09IG5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgcmV0dXJuIHZhcmlhYmxlO1xuICAgIH1cbiAgICBjdXJyZW50U2NvcGUgPSBjdXJyZW50U2NvcGUudXBwZXI7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYSBiaW5hcnkgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub2RlIGlzIGEgYEJpbmFyeUV4cHJlc3Npb25gLlxuICovXG5mdW5jdGlvbiBpc0JpbmFyeUV4cHJlc3Npb24obm9kZTogVFNFU1RyZWUuTm9kZSk6IG5vZGUgaXMgVFNFU1RyZWUuQmluYXJ5RXhwcmVzc2lvbiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdCaW5hcnlFeHByZXNzaW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYSBjYWxsIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhIGBDYWxsRXhwcmVzc2lvbmAuXG4gKi9cbmZ1bmN0aW9uIGlzQ2FsbEV4cHJlc3Npb24obm9kZTogVFNFU1RyZWUuTm9kZSk6IG5vZGUgaXMgVFNFU1RyZWUuQ2FsbEV4cHJlc3Npb24ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhIGZ1bmN0aW9uIHdyaXR0ZW4gYXMgYW4gb2JqZWN0IHByb3BlcnR5J3MgdmFsdWUuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhIGBGdW5jdGlvbkV4cHJlc3Npb25gIG9yIGFuIGBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbmAuXG4gKi9cbmZ1bmN0aW9uIGlzQ2xvc3VyZUZ1bmN0aW9uKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBub2RlIGlzIENsb3N1cmVGdW5jdGlvbiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdGdW5jdGlvbkV4cHJlc3Npb24nIHx8IG5vZGUudHlwZSA9PT0gJ0Fycm93RnVuY3Rpb25FeHByZXNzaW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYW4gaWRlbnRpZmllci5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub2RlIGlzIGFuIGBJZGVudGlmaWVyYC5cbiAqL1xuZnVuY3Rpb24gaXNJZGVudGlmaWVyKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBub2RlIGlzIFRTRVNUcmVlLklkZW50aWZpZXIge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnSWRlbnRpZmllcic7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGlzIGEgbnVtZXJpYyBsaXRlcmFsLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgYSBgTGl0ZXJhbGAgaG9sZGluZyBhIG51bWJlci5cbiAqL1xuZnVuY3Rpb24gaXNOdW1lcmljTGl0ZXJhbChub2RlOiBUU0VTVHJlZS5Ob2RlKTogbm9kZSBpcyBUU0VTVHJlZS5OdW1iZXJMaXRlcmFsIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZW51bS1jb21wYXJpc29uIC0tIEFTVCBub2RlIHR5cGUgc3RyaW5nIGxpdGVyYWxzIG1hdGNoIHRoZSBUU0VTVHJlZSBlbnVtIHZhbHVlcy5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0xpdGVyYWwnICYmIHR5cGVvZiBub2RlLnZhbHVlID09PSAnbnVtYmVyJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhbiBgT2JqZWN0RXhwcmVzc2lvbmAuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0RXhwcmVzc2lvbihub2RlOiBUU0VTVHJlZS5Ob2RlKTogbm9kZSBpcyBUU0VTVHJlZS5PYmplY3RFeHByZXNzaW9uIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZW51bS1jb21wYXJpc29uIC0tIEFTVCBub2RlIHR5cGUgc3RyaW5nIGxpdGVyYWxzIG1hdGNoIHRoZSBUU0VTVHJlZSBlbnVtIHZhbHVlcy5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ09iamVjdEV4cHJlc3Npb24nO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhbiBvYmplY3QgZGVzdHJ1Y3R1cmluZyBwYXR0ZXJuLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgYW4gYE9iamVjdFBhdHRlcm5gLlxuICovXG5mdW5jdGlvbiBpc09iamVjdFBhdHRlcm4obm9kZTogVFNFU1RyZWUuTm9kZSk6IG5vZGUgaXMgVFNFU1RyZWUuT2JqZWN0UGF0dGVybiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdPYmplY3RQYXR0ZXJuJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYW4gb2JqZWN0LWxpdGVyYWwgb3Igb2JqZWN0LXBhdHRlcm4gcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhIGBQcm9wZXJ0eWAuXG4gKi9cbmZ1bmN0aW9uIGlzUHJvcGVydHkobm9kZTogVFNFU1RyZWUuTm9kZSk6IG5vZGUgaXMgVFNFU1RyZWUuUHJvcGVydHkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnUHJvcGVydHknO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhIHZhcmlhYmxlIGRlY2xhcmF0b3IuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhIGBWYXJpYWJsZURlY2xhcmF0b3JgLlxuICovXG5mdW5jdGlvbiBpc1ZhcmlhYmxlRGVjbGFyYXRvcihub2RlOiBUU0VTVHJlZS5Ob2RlKTogbm9kZSBpcyBUU0VTVHJlZS5WYXJpYWJsZURlY2xhcmF0b3Ige1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnVmFyaWFibGVEZWNsYXJhdG9yJztcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgZXhwcmVzc2lvbiBhbiBpZGVudGlmaWVyIGlzIGJvdW5kIHRvLlxuICpcbiAqIEEgYGNvbnN0YCBhbnN3ZXJzIHdpdGggaXRzIGluaXRpYWxpemVyOyBhIGRlc3RydWN0dXJlZCBwYXJhbWV0ZXIgb2YgVEhJUyBjbG9zdXJlIGFuc3dlcnMgd2l0aCB3aGF0IHRoZVxuICogY2FsbCdzIG93biBgaW5wdXRgIHN1cHBsaWVzIGZvciB0aGUga2V5IGl0IHdhcyBkZXN0cnVjdHVyZWQgYnksIHdoaWNoIGlzIGhvdyBhIGJ1ZGdldCB3cml0dGVuIG9uY2UgYXRcbiAqIHRoZSBjYWxsIHNpdGUgcmVhY2hlcyBhIGNsb3N1cmUgdGhhdCBjYW4gY2xvc2Ugb3ZlciBub3RoaW5nLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIGlkZW50aWZpZXIgdG8gcmVzb2x2ZS5cbiAqIEBwYXJhbSBjbG9zdXJlIC0gVGhlIGNsb3N1cmUgdGhlIGlkZW50aWZpZXIgd2FzIHdyaXR0ZW4gaW5zaWRlLlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUgcnVsZSBjb250ZXh0LCB1c2VkIHRvIHJlc29sdmUgdGhlIGlkZW50aWZpZXIgdGhyb3VnaCBzY29wZS5cbiAqIEByZXR1cm5zIFRoZSBleHByZXNzaW9uIGl0IGlzIGJvdW5kIHRvLCBvciBgbnVsbGAgd2hlbiBub3RoaW5nIHN0YXRpY2FsbHkgYmluZHMgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlYWRCb3VuZEV4cHJlc3Npb24obm9kZTogVFNFU1RyZWUuSWRlbnRpZmllciwgY2xvc3VyZTogRXZhbENsb3N1cmUsIGNvbnRleHQ6IFJ1bGUuUnVsZUNvbnRleHQpOiBudWxsIHwgVFNFU1RyZWUuTm9kZSB7XG4gIGNvbnN0IHZhcmlhYmxlID0gZmluZFZhcmlhYmxlKGNvbnRleHQuc291cmNlQ29kZS5nZXRTY29wZShub2RlKSwgbm9kZS5uYW1lKTtcbiAgaWYgKCF2YXJpYWJsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9yIChjb25zdCBkZWZpbml0aW9uIG9mIHZhcmlhYmxlLmRlZnMpIHtcbiAgICBjb25zdCBkZWZpbml0aW9uTm9kZSA9IGRlZmluaXRpb24ubm9kZSBhcyBUU0VTVHJlZS5Ob2RlO1xuXG4gICAgaWYgKGlzVmFyaWFibGVEZWNsYXJhdG9yKGRlZmluaXRpb25Ob2RlKSAmJiBkZWZpbml0aW9uTm9kZS5pbml0KSB7XG4gICAgICByZXR1cm4gZGVmaW5pdGlvbk5vZGUuaW5pdDtcbiAgICB9XG5cbiAgICBpZiAoZGVmaW5pdGlvbk5vZGUgPT09IGNsb3N1cmUuY2xvc3VyZU5vZGUpIHtcbiAgICAgIGNvbnN0IGlucHV0S2V5ID0gcmVhZFBhcmFtZXRlcklucHV0S2V5KGNsb3N1cmUuY2xvc3VyZU5vZGUsIG5vZGUubmFtZSk7XG4gICAgICBpZiAoaW5wdXRLZXkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkSW5wdXRQcm9wZXJ0eVZhbHVlKGNsb3N1cmUucGFyYW1zTm9kZSwgaW5wdXRLZXkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBjbG9zdXJlIHByb3BlcnR5IG5hbWVzIGEgY2FsbCdzIHBhcmFtZXRlciBvYmplY3QgbWF5IGNhcnJ5LCBieSB0aGUgaGVscGVyIGl0IGNhbGxzLlxuICpcbiAqIEBwYXJhbSBjYWxsTm9kZSAtIFRoZSBjYWxsIGV4cHJlc3Npb24uXG4gKiBAcmV0dXJucyBUaGUgaW4tT2JzaWRpYW4gY2xvc3VyZSBwcm9wZXJ0eSBuYW1lcywgb3IgYG51bGxgIHdoZW4gdGhlIGNhbGxlZSBpcyBub3Qgb25lIG9mIHRoZSBoZWxwZXJzLlxuICovXG5mdW5jdGlvbiByZWFkQ2xvc3VyZU5hbWVzKGNhbGxOb2RlOiBUU0VTVHJlZS5DYWxsRXhwcmVzc2lvbik6IG51bGwgfCByZWFkb25seSBzdHJpbmdbXSB7XG4gIGlmICghaXNJZGVudGlmaWVyKGNhbGxOb2RlLmNhbGxlZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBDTE9TVVJFX05BTUVTX0JZX0NBTExFRV9OQU1FLmdldChjYWxsTm9kZS5jYWxsZWUubmFtZSkgPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgaW4tT2JzaWRpYW4gY2xvc3VyZSBhIGZ1bmN0aW9uIG5vZGUgaXMsIGlmIGl0IGlzIG9uZS5cbiAqXG4gKiBBIGNsb3N1cmUgcXVhbGlmaWVzIHdoZW4gaXQgaXMgdGhlIHZhbHVlIG9mIGEgYGNhbGxiYWNrYCAvIGBwb2xsYCAvIGBzdGFydGAgcHJvcGVydHkgb2YgdGhlIG9iamVjdFxuICogbGl0ZXJhbCBwYXNzZWQgYXMgdGhlIGhlbHBlcidzIGZpcnN0IGFyZ3VtZW50IFx1MjAxNCB3aGljaCBjb3ZlcnMgYm90aCB0aGUgbWV0aG9kIHNob3J0aGFuZFxuICogKGBhc3luYyBjYWxsYmFjayh7IFx1MjAyNiB9KSB7IFx1MjAyNiB9YCkgYW5kIGFuIGFycm93IChgY2FsbGJhY2s6IGFzeW5jICh7IFx1MjAyNiB9KSA9PiB7IFx1MjAyNiB9YCkuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFRoZSBjbG9zdXJlLCBvciBgbnVsbGAgd2hlbiB0aGUgbm9kZSBpcyBub3QgYW4gaW4tT2JzaWRpYW4gY2xvc3VyZS5cbiAqL1xuZnVuY3Rpb24gcmVhZEV2YWxDbG9zdXJlKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBFdmFsQ2xvc3VyZSB8IG51bGwge1xuICBpZiAoIWlzQ2xvc3VyZUZ1bmN0aW9uKG5vZGUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwcm9wZXJ0eU5vZGUgPSBub2RlLnBhcmVudDtcbiAgaWYgKCFpc1Byb3BlcnR5KHByb3BlcnR5Tm9kZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qXG4gICAqIFRoZSBvYmplY3QgY2hlY2sgY29tZXMgQkVGT1JFIHRoZSBrZXkgY2hlY2sgYmVjYXVzZSBhIGZ1bmN0aW9uIGNhbiByZWFjaCBhIHByb3BlcnR5IHRocm91Z2ggaXRzXG4gICAqIENPTVBVVEVEIEtFWSBhcyB3ZWxsIGFzIHRocm91Z2ggaXRzIHZhbHVlIC0tIGB7IFsoKSA9PiAnYSddOiAxIH1gIGlzIGxlZ2FsIC0tIGFuZCBhIGRlc3RydWN0dXJpbmdcbiAgICogcGF0dGVybiBjYW4gY2Fycnkgb25lIHRvby4gTmVpdGhlciBpcyBhIGhlbHBlciBjYWxsJ3MgcGFyYW1ldGVyIG9iamVjdC5cbiAgICovXG4gIGNvbnN0IHBhcmFtc05vZGUgPSBwcm9wZXJ0eU5vZGUucGFyZW50O1xuICBpZiAoIWlzT2JqZWN0RXhwcmVzc2lvbihwYXJhbXNOb2RlKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKCFpc0lkZW50aWZpZXIocHJvcGVydHlOb2RlLmtleSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNhbGxOb2RlID0gcGFyYW1zTm9kZS5wYXJlbnQ7XG4gIGlmICghaXNDYWxsRXhwcmVzc2lvbihjYWxsTm9kZSkgfHwgY2FsbE5vZGUuYXJndW1lbnRzWzBdICE9PSBwYXJhbXNOb2RlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBjbG9zdXJlTmFtZXMgPSByZWFkQ2xvc3VyZU5hbWVzKGNhbGxOb2RlKTtcbiAgaWYgKCFjbG9zdXJlTmFtZXM/LmluY2x1ZGVzKHByb3BlcnR5Tm9kZS5rZXkubmFtZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2xvc3VyZU5vZGU6IG5vZGUsXG4gICAgcGFyYW1zTm9kZSxcbiAgICByZXBvcnROb2RlOiBwcm9wZXJ0eU5vZGVcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgdmFsdWUgYSBjYWxsJ3Mgb3duIGBpbnB1dGAgb2JqZWN0IHN1cHBsaWVzIGZvciBvbmUga2V5LlxuICpcbiAqIFRoaXMgaXMgaG93IGEgYnVkZ2V0IGRlY2xhcmVkIG9uY2UgYXQgdGhlIGNhbGwgc2l0ZSByZWFjaGVzIHRoZSBjbG9zdXJlLCB3aGljaCBjYW5ub3QgY2xvc2Ugb3ZlclxuICogYW55dGhpbmc6IGBpbnB1dDogeyBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IFNFVFRMRSB9YCBhcnJpdmVzIGRlc3RydWN0dXJlZCBpbiB0aGUgY2FsbGJhY2snc1xuICogcGFyYW1ldGVyIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zTm9kZSAtIFRoZSBoZWxwZXIncyBwYXJhbWV0ZXIgb2JqZWN0LlxuICogQHBhcmFtIGtleU5hbWUgLSBUaGUgYGlucHV0YCBwcm9wZXJ0eSB0byByZWFkLlxuICogQHJldHVybnMgVGhlIGV4cHJlc3Npb24gc3VwcGx5aW5nIHRoYXQga2V5LCBvciBgbnVsbGAgd2hlbiB0aGUgY2FsbCdzIGBpbnB1dGAgZG9lcyBub3QgZGVjbGFyZSBpdC5cbiAqL1xuZnVuY3Rpb24gcmVhZElucHV0UHJvcGVydHlWYWx1ZShwYXJhbXNOb2RlOiBUU0VTVHJlZS5PYmplY3RFeHByZXNzaW9uLCBrZXlOYW1lOiBzdHJpbmcpOiBudWxsIHwgVFNFU1RyZWUuTm9kZSB7XG4gIGNvbnN0IGlucHV0UHJvcGVydHkgPSBwYXJhbXNOb2RlLnByb3BlcnRpZXMuZmluZCgocHJvcGVydHkpID0+XG4gICAgaXNQcm9wZXJ0eShwcm9wZXJ0eSBhcyBUU0VTVHJlZS5Ob2RlKVxuICAgICYmIGlzSWRlbnRpZmllcigocHJvcGVydHkgYXMgVFNFU1RyZWUuUHJvcGVydHkpLmtleSBhcyBUU0VTVHJlZS5Ob2RlKVxuICAgICYmICgocHJvcGVydHkgYXMgVFNFU1RyZWUuUHJvcGVydHkpLmtleSBhcyBUU0VTVHJlZS5JZGVudGlmaWVyKS5uYW1lID09PSBJTlBVVF9QUk9QRVJUWV9OQU1FXG4gICkgYXMgVFNFU1RyZWUuUHJvcGVydHkgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3QgaW5wdXROb2RlID0gaW5wdXRQcm9wZXJ0eT8udmFsdWUgYXMgVFNFU1RyZWUuTm9kZSB8IHVuZGVmaW5lZDtcbiAgaWYgKCFpbnB1dE5vZGUgfHwgIWlzT2JqZWN0RXhwcmVzc2lvbihpbnB1dE5vZGUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB2YWx1ZVByb3BlcnR5ID0gaW5wdXROb2RlLnByb3BlcnRpZXMuZmluZCgocHJvcGVydHkpID0+XG4gICAgaXNQcm9wZXJ0eShwcm9wZXJ0eSBhcyBUU0VTVHJlZS5Ob2RlKVxuICAgICYmIGlzSWRlbnRpZmllcigocHJvcGVydHkgYXMgVFNFU1RyZWUuUHJvcGVydHkpLmtleSBhcyBUU0VTVHJlZS5Ob2RlKVxuICAgICYmICgocHJvcGVydHkgYXMgVFNFU1RyZWUuUHJvcGVydHkpLmtleSBhcyBUU0VTVHJlZS5JZGVudGlmaWVyKS5uYW1lID09PSBrZXlOYW1lXG4gICkgYXMgVFNFU1RyZWUuUHJvcGVydHkgfCB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuICh2YWx1ZVByb3BlcnR5Py52YWx1ZSBhcyBUU0VTVHJlZS5Ob2RlIHwgdW5kZWZpbmVkKSA/PyBudWxsO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBgaW5wdXRgIGtleSBhIGRlc3RydWN0dXJlZCBjbG9zdXJlIHBhcmFtZXRlciBpcyBib3VuZCBmcm9tLlxuICpcbiAqIFRoZSBiaW5kaW5nIG1heSBiZSByZW5hbWVkIChgdGltZW91dEluTWlsbGlzZWNvbmRzOiB0aW1lb3V0YCksIHNvIHRoZSBLRVkgaXMgd2hhdCB0aGUgY2FsbCdzIGBpbnB1dGBcbiAqIGlzIGxvb2tlZCB1cCBieSwgbmV2ZXIgdGhlIGxvY2FsIG5hbWUuXG4gKlxuICogQHBhcmFtIGNsb3N1cmVOb2RlIC0gVGhlIGNsb3N1cmUgd2hvc2UgcGFyYW1ldGVycyB0byByZWFkLlxuICogQHBhcmFtIGxvY2FsTmFtZSAtIFRoZSBuYW1lIHRoZSBidWRnZXQgaXMgYm91bmQgdG8gaW5zaWRlIHRoZSBjbG9zdXJlLlxuICogQHJldHVybnMgVGhlIGBpbnB1dGAga2V5LCBvciBgbnVsbGAgd2hlbiB0aGUgbmFtZSBpcyBub3QgYm91bmQgYnkgYSBwbGFpbiBkZXN0cnVjdHVyZWQgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIHJlYWRQYXJhbWV0ZXJJbnB1dEtleShjbG9zdXJlTm9kZTogQ2xvc3VyZUZ1bmN0aW9uLCBsb2NhbE5hbWU6IHN0cmluZyk6IG51bGwgfCBzdHJpbmcge1xuICBmb3IgKGNvbnN0IHBhcmFtZXRlck5vZGUgb2YgY2xvc3VyZU5vZGUucGFyYW1zKSB7XG4gICAgaWYgKCFpc09iamVjdFBhdHRlcm4ocGFyYW1ldGVyTm9kZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcGFyYW1ldGVyTm9kZS5wcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAoIWlzUHJvcGVydHkocHJvcGVydHkpIHx8IHByb3BlcnR5LmNvbXB1dGVkIHx8ICFpc0lkZW50aWZpZXIocHJvcGVydHkua2V5KSB8fCAhaXNJZGVudGlmaWVyKHByb3BlcnR5LnZhbHVlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BlcnR5LnZhbHVlLm5hbWUgPT09IGxvY2FsTmFtZSkge1xuICAgICAgICByZXR1cm4gcHJvcGVydHkua2V5Lm5hbWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGV4cHJlc3Npb24gY2FycnlpbmcgYSB3YWl0IGNhbGwncyBkZWNsYXJlZCBidWRnZXQuXG4gKlxuICogQHBhcmFtIGNhbGxOb2RlIC0gVGhlIGNhbGwgZXhwcmVzc2lvbiB0byBpbnNwZWN0LlxuICogQHJldHVybnMgVGhlIGV4cHJlc3Npb24gdG8gcmVzb2x2ZTsgYG51bGxgIGZvciBhIGB3YWl0VW50aWxgIHRoYXQgb21pdHMgaXRzIHRpbWVvdXQsIHdoaWNoIHRha2VzIHRoZVxuICogaGVscGVyJ3MgZGVmYXVsdDsgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgY2FsbCBpcyBub3QgYSB3YWl0IGF0IGFsbC5cbiAqL1xuZnVuY3Rpb24gcmVhZFdhaXRCdWRnZXRFeHByZXNzaW9uKGNhbGxOb2RlOiBUU0VTVHJlZS5DYWxsRXhwcmVzc2lvbik6IG51bGwgfCBUU0VTVHJlZS5Ob2RlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFpc0lkZW50aWZpZXIoY2FsbE5vZGUuY2FsbGVlKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBjYWxsZWVOYW1lID0gY2FsbE5vZGUuY2FsbGVlLm5hbWU7XG5cbiAgaWYgKGNhbGxlZU5hbWUgPT09IFNMRUVQX0NBTExFRV9OQU1FKSB7XG4gICAgcmV0dXJuIChjYWxsTm9kZS5hcmd1bWVudHNbMF0pID8/IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChjYWxsZWVOYW1lICE9PSBXQUlUX1VOVElMX0NBTExFRV9OQU1FKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHBhcmFtc05vZGUgPSBjYWxsTm9kZS5hcmd1bWVudHNbMF0gYXMgVFNFU1RyZWUuTm9kZSB8IHVuZGVmaW5lZDtcbiAgaWYgKCFwYXJhbXNOb2RlIHx8ICFpc09iamVjdEV4cHJlc3Npb24ocGFyYW1zTm9kZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgdGltZW91dFByb3BlcnR5ID0gcGFyYW1zTm9kZS5wcm9wZXJ0aWVzLmZpbmQoKHByb3BlcnR5KSA9PlxuICAgIGlzUHJvcGVydHkocHJvcGVydHkgYXMgVFNFU1RyZWUuTm9kZSlcbiAgICAmJiBpc0lkZW50aWZpZXIoKHByb3BlcnR5IGFzIFRTRVNUcmVlLlByb3BlcnR5KS5rZXkgYXMgVFNFU1RyZWUuTm9kZSlcbiAgICAmJiAoKHByb3BlcnR5IGFzIFRTRVNUcmVlLlByb3BlcnR5KS5rZXkgYXMgVFNFU1RyZWUuSWRlbnRpZmllcikubmFtZSA9PT0gVElNRU9VVF9QUk9QRVJUWV9OQU1FXG4gICkgYXMgVFNFU1RyZWUuUHJvcGVydHkgfCB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuICh0aW1lb3V0UHJvcGVydHk/LnZhbHVlKSA/PyBudWxsO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGFuIGV4cHJlc3Npb24gdG8gYSBtaWxsaXNlY29uZCBjb3VudCwgdGhyb3VnaCBzY29wZS5cbiAqXG4gKiBIYW5kbGVzIGEgbnVtZXJpYyBsaXRlcmFsLCBhIGxpdGVyYWwtb25seSBwcm9kdWN0IChgNjAgKiAxMDAwYCksIGFuIGlkZW50aWZpZXIgYm91bmQgdG8gZWl0aGVyIGluIGFueVxuICogZW5jbG9zaW5nIHNjb3BlLCBhbmQgYSBkZXN0cnVjdHVyZWQgY2xvc3VyZSBwYXJhbWV0ZXIgZm9sbG93ZWQgYmFjayB0aHJvdWdoIHRoZSBjYWxsJ3Mgb3duIGBpbnB1dGAuXG4gKiBBbnl0aGluZyBlbHNlIGlzIHVucmVzb2x2YWJsZSBhbmQgYW5zd2VycyBgbnVsbGAsIHdoaWNoIHRoZSBjYWxsZXIgdHJlYXRzIGFzIGNvbnRyaWJ1dGluZyBub3RoaW5nLlxuICpcbiAqIEVhY2ggaWRlbnRpZmllciBpcyByZXNvbHZlZCBmcm9tIElUUyBPV04gc2NvcGUgcmF0aGVyIHRoYW4gZnJvbSB0aGUgd2FpdCdzLCBzbyBhIHZhbHVlIHN1cHBsaWVkIGJ5IHRoZVxuICogY2FsbCdzIGBpbnB1dGAgcmVzb2x2ZXMgYXQgdGhlIGNhbGwgc2l0ZSBcdTIwMTQgd2hlcmUgaXQgd2FzIHdyaXR0ZW4gXHUyMDE0IGFuZCBpcyBub3QgY2FwdHVyZWQgYnkgYSBzYW1lLW5hbWVkXG4gKiBiaW5kaW5nIHRoYXQgaGFwcGVucyB0byBleGlzdCBpbnNpZGUgdGhlIGNsb3N1cmUuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgZXhwcmVzc2lvbiB0byByZXNvbHZlLlxuICogQHBhcmFtIGNsb3N1cmUgLSBUaGUgY2xvc3VyZSB0aGUgZXhwcmVzc2lvbiB3YXMgd3JpdHRlbiBpbnNpZGUuXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBydWxlIGNvbnRleHQsIHVzZWQgdG8gcmVzb2x2ZSBpZGVudGlmaWVycyB0aHJvdWdoIHNjb3BlLlxuICogQHJldHVybnMgVGhlIG1pbGxpc2Vjb25kIGNvdW50LCBvciBgbnVsbGAgd2hlbiBpdCBjYW5ub3QgYmUgcmVzb2x2ZWQgc3RhdGljYWxseS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1pbGxpc2Vjb25kcyhub2RlOiBUU0VTVHJlZS5Ob2RlLCBjbG9zdXJlOiBFdmFsQ2xvc3VyZSwgY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCk6IG51bGwgfCBudW1iZXIge1xuICBjb25zdCB2aXNpdGVkTm9kZXMgPSBuZXcgU2V0PFRTRVNUcmVlLk5vZGU+KCk7XG4gIGxldCBjdXJyZW50Tm9kZSA9IG5vZGU7XG5cbiAgd2hpbGUgKCF2aXNpdGVkTm9kZXMuaGFzKGN1cnJlbnROb2RlKSkge1xuICAgIHZpc2l0ZWROb2Rlcy5hZGQoY3VycmVudE5vZGUpO1xuXG4gICAgaWYgKGlzTnVtZXJpY0xpdGVyYWwoY3VycmVudE5vZGUpKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGUudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKGlzQmluYXJ5RXhwcmVzc2lvbihjdXJyZW50Tm9kZSkgJiYgY3VycmVudE5vZGUub3BlcmF0b3IgPT09ICcqJykge1xuICAgICAgY29uc3QgbGVmdEluTWlsbGlzZWNvbmRzID0gcmVzb2x2ZU1pbGxpc2Vjb25kcyhjdXJyZW50Tm9kZS5sZWZ0LCBjbG9zdXJlLCBjb250ZXh0KTtcbiAgICAgIGNvbnN0IHJpZ2h0SW5NaWxsaXNlY29uZHMgPSByZXNvbHZlTWlsbGlzZWNvbmRzKGN1cnJlbnROb2RlLnJpZ2h0LCBjbG9zdXJlLCBjb250ZXh0KTtcblxuICAgICAgaWYgKGxlZnRJbk1pbGxpc2Vjb25kcyA9PT0gbnVsbCB8fCByaWdodEluTWlsbGlzZWNvbmRzID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGVmdEluTWlsbGlzZWNvbmRzICogcmlnaHRJbk1pbGxpc2Vjb25kcztcbiAgICB9XG5cbiAgICBpZiAoIWlzSWRlbnRpZmllcihjdXJyZW50Tm9kZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGJvdW5kTm9kZSA9IHJlYWRCb3VuZEV4cHJlc3Npb24oY3VycmVudE5vZGUsIGNsb3N1cmUsIGNvbnRleHQpO1xuICAgIGlmICghYm91bmROb2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjdXJyZW50Tm9kZSA9IGJvdW5kTm9kZTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1ETyxNQUFNLGFBQWE7QUFLMUIsTUFBTSw4QkFBOEI7QUFLcEMsTUFBTSw2Q0FBNkM7QUFFbkQsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSx3QkFBd0I7QUFDOUIsTUFBTSx5QkFBeUI7QUFPL0IsTUFBTSwrQkFBK0Isb0JBQUksSUFBK0I7QUFBQSxFQUN0RSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztBQUFBLEVBQy9CLENB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
@@ -46,6 +46,7 @@ import { manifestId } from "./manifest-id.mjs";
46
46
  import { manifestName } from "./manifest-name.mjs";
47
47
  import { manifestSchema } from "./manifest-schema.mjs";
48
48
  import { noAsyncCallbackToUnsafeReturn } from "./no-async-callback-to-unsafe-return.mjs";
49
+ import { noOverCapWaitInEvalInObsidian } from "./no-over-cap-wait-in-eval-in-obsidian.mjs";
49
50
  import { noUntrustedInputEvents } from "./no-untrusted-input-events.mjs";
50
51
  import { noUnusedParamsMembers } from "./no-unused-params-members.mjs";
51
52
  import { noUsedUnderscoreVariables } from "./no-used-underscore-variables.mjs";
@@ -62,6 +63,7 @@ const obsidianDevUtilsPlugin = {
62
63
  "manifest-name": manifestName,
63
64
  "manifest-schema": manifestSchema,
64
65
  "no-async-callback-to-unsafe-return": noAsyncCallbackToUnsafeReturn,
66
+ "no-over-cap-wait-in-eval-in-obsidian": noOverCapWaitInEvalInObsidian,
65
67
  "no-untrusted-input-events": noUntrustedInputEvents,
66
68
  "no-unused-params-members": noUnusedParamsMembers,
67
69
  "no-used-underscore-variables": noUsedUnderscoreVariables,
@@ -76,4 +78,4 @@ const obsidianDevUtilsPlugin = {
76
78
  export {
77
79
  obsidianDevUtilsPlugin
78
80
  };
79
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL2VzbGludC1ydWxlcy9vYnNpZGlhbi1kZXYtdXRpbHMtcGx1Z2luLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRVNMaW50IHBsdWdpbiBmb3IgT2JzaWRpYW4gZGV2ZWxvcG1lbnQgdXRpbGl0aWVzLlxuICovXG5pbXBvcnQgdHlwZSB7IEVTTGludCB9IGZyb20gJ2VzbGludCc7XG5cbmltcG9ydCB7IG1hbmlmZXN0RGVzY3JpcHRpb24gfSBmcm9tICcuL21hbmlmZXN0LWRlc2NyaXB0aW9uLnRzJztcbmltcG9ydCB7IG1hbmlmZXN0SWQgfSBmcm9tICcuL21hbmlmZXN0LWlkLnRzJztcbmltcG9ydCB7IG1hbmlmZXN0TmFtZSB9IGZyb20gJy4vbWFuaWZlc3QtbmFtZS50cyc7XG5pbXBvcnQgeyBtYW5pZmVzdFNjaGVtYSB9IGZyb20gJy4vbWFuaWZlc3Qtc2NoZW1hLnRzJztcbmltcG9ydCB7IG5vQXN5bmNDYWxsYmFja1RvVW5zYWZlUmV0dXJuIH0gZnJvbSAnLi9uby1hc3luYy1jYWxsYmFjay10by11bnNhZmUtcmV0dXJuLnRzJztcbmltcG9ydCB7IG5vVW50cnVzdGVkSW5wdXRFdmVudHMgfSBmcm9tICcuL25vLXVudHJ1c3RlZC1pbnB1dC1ldmVudHMudHMnO1xuaW1wb3J0IHsgbm9VbnVzZWRQYXJhbXNNZW1iZXJzIH0gZnJvbSAnLi9uby11bnVzZWQtcGFyYW1zLW1lbWJlcnMudHMnO1xuaW1wb3J0IHsgbm9Vc2VkVW5kZXJzY29yZVZhcmlhYmxlcyB9IGZyb20gJy4vbm8tdXNlZC11bmRlcnNjb3JlLXZhcmlhYmxlcy50cyc7XG5pbXBvcnQgeyBwYXJhbXNPcHRpb25zTmFtZU1hdGNoIH0gZnJvbSAnLi9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoLnRzJztcbmltcG9ydCB7IHByZWZlck5vb3BBc3luYyB9IGZyb20gJy4vcHJlZmVyLW5vb3AtYXN5bmMudHMnO1xuaW1wb3J0IHsgcmVhZG9ubHlQYXJhbXNPcHRpb25zUmVzdWx0TWVtYmVycyB9IGZyb20gJy4vcmVhZG9ubHktcGFyYW1zLW9wdGlvbnMtcmVzdWx0LW1lbWJlcnMudHMnO1xuaW1wb3J0IHsgcmVxdWlyZUNvbXBvbmVudFN1ZmZpeCB9IGZyb20gJy4vcmVxdWlyZS1jb21wb25lbnQtc3VmZml4LnRzJztcbmltcG9ydCB7IHJlcXVpcmVNZXRob2RUZW1wbGF0ZSB9IGZyb20gJy4vcmVxdWlyZS1tZXRob2QtdGVtcGxhdGUudHMnO1xuaW1wb3J0IHsgcmVxdWlyZVN1cGVyQ2FsbCB9IGZyb20gJy4vcmVxdWlyZS1zdXBlci1jYWxsLnRzJztcblxuLyoqXG4gKiBFU0xpbnQgcGx1Z2luIGJ1bmRsaW5nIGV2ZXJ5IGBvYnNpZGlhbi1kZXYtdXRpbHNgIGN1c3RvbSBydWxlLCByZWdpc3RlcmVkIHVuZGVyIHRoZSBgb2JzaWRpYW4tZGV2LXV0aWxzYCBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBvYnNpZGlhbkRldlV0aWxzUGx1Z2luOiBFU0xpbnQuUGx1Z2luID0ge1xuICBydWxlczoge1xuICAgICdtYW5pZmVzdC1kZXNjcmlwdGlvbic6IG1hbmlmZXN0RGVzY3JpcHRpb24sXG4gICAgJ21hbmlmZXN0LWlkJzogbWFuaWZlc3RJZCxcbiAgICAnbWFuaWZlc3QtbmFtZSc6IG1hbmlmZXN0TmFtZSxcbiAgICAnbWFuaWZlc3Qtc2NoZW1hJzogbWFuaWZlc3RTY2hlbWEsXG4gICAgJ25vLWFzeW5jLWNhbGxiYWNrLXRvLXVuc2FmZS1yZXR1cm4nOiBub0FzeW5jQ2FsbGJhY2tUb1Vuc2FmZVJldHVybixcbiAgICAnbm8tdW50cnVzdGVkLWlucHV0LWV2ZW50cyc6IG5vVW50cnVzdGVkSW5wdXRFdmVudHMsXG4gICAgJ25vLXVudXNlZC1wYXJhbXMtbWVtYmVycyc6IG5vVW51c2VkUGFyYW1zTWVtYmVycyxcbiAgICAnbm8tdXNlZC11bmRlcnNjb3JlLXZhcmlhYmxlcyc6IG5vVXNlZFVuZGVyc2NvcmVWYXJpYWJsZXMsXG4gICAgJ3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2gnOiBwYXJhbXNPcHRpb25zTmFtZU1hdGNoLFxuICAgICdwcmVmZXItbm9vcC1hc3luYyc6IHByZWZlck5vb3BBc3luYyxcbiAgICAncmVhZG9ubHktcGFyYW1zLW9wdGlvbnMtcmVzdWx0LW1lbWJlcnMnOiByZWFkb25seVBhcmFtc09wdGlvbnNSZXN1bHRNZW1iZXJzLFxuICAgICdyZXF1aXJlLWNvbXBvbmVudC1zdWZmaXgnOiByZXF1aXJlQ29tcG9uZW50U3VmZml4LFxuICAgICdyZXF1aXJlLW1ldGhvZC10ZW1wbGF0ZSc6IHJlcXVpcmVNZXRob2RUZW1wbGF0ZSxcbiAgICAncmVxdWlyZS1zdXBlci1jYWxsJzogcmVxdWlyZVN1cGVyQ2FsbFxuICB9XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU9BLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMscUNBQXFDO0FBQzlDLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsMENBQTBDO0FBQ25ELFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsd0JBQXdCO0FBSzFCLE1BQU0seUJBQXdDO0FBQUEsRUFDbkQsT0FBTztBQUFBLElBQ0wsd0JBQXdCO0FBQUEsSUFDeEIsZUFBZTtBQUFBLElBQ2YsaUJBQWlCO0FBQUEsSUFDakIsbUJBQW1CO0FBQUEsSUFDbkIsc0NBQXNDO0FBQUEsSUFDdEMsNkJBQTZCO0FBQUEsSUFDN0IsNEJBQTRCO0FBQUEsSUFDNUIsZ0NBQWdDO0FBQUEsSUFDaEMsNkJBQTZCO0FBQUEsSUFDN0IscUJBQXFCO0FBQUEsSUFDckIsMENBQTBDO0FBQUEsSUFDMUMsNEJBQTRCO0FBQUEsSUFDNUIsMkJBQTJCO0FBQUEsSUFDM0Isc0JBQXNCO0FBQUEsRUFDeEI7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
81
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL2VzbGludC1ydWxlcy9vYnNpZGlhbi1kZXYtdXRpbHMtcGx1Z2luLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRVNMaW50IHBsdWdpbiBmb3IgT2JzaWRpYW4gZGV2ZWxvcG1lbnQgdXRpbGl0aWVzLlxuICovXG5pbXBvcnQgdHlwZSB7IEVTTGludCB9IGZyb20gJ2VzbGludCc7XG5cbmltcG9ydCB7IG1hbmlmZXN0RGVzY3JpcHRpb24gfSBmcm9tICcuL21hbmlmZXN0LWRlc2NyaXB0aW9uLnRzJztcbmltcG9ydCB7IG1hbmlmZXN0SWQgfSBmcm9tICcuL21hbmlmZXN0LWlkLnRzJztcbmltcG9ydCB7IG1hbmlmZXN0TmFtZSB9IGZyb20gJy4vbWFuaWZlc3QtbmFtZS50cyc7XG5pbXBvcnQgeyBtYW5pZmVzdFNjaGVtYSB9IGZyb20gJy4vbWFuaWZlc3Qtc2NoZW1hLnRzJztcbmltcG9ydCB7IG5vQXN5bmNDYWxsYmFja1RvVW5zYWZlUmV0dXJuIH0gZnJvbSAnLi9uby1hc3luYy1jYWxsYmFjay10by11bnNhZmUtcmV0dXJuLnRzJztcbmltcG9ydCB7IG5vT3ZlckNhcFdhaXRJbkV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9uby1vdmVyLWNhcC13YWl0LWluLWV2YWwtaW4tb2JzaWRpYW4udHMnO1xuaW1wb3J0IHsgbm9VbnRydXN0ZWRJbnB1dEV2ZW50cyB9IGZyb20gJy4vbm8tdW50cnVzdGVkLWlucHV0LWV2ZW50cy50cyc7XG5pbXBvcnQgeyBub1VudXNlZFBhcmFtc01lbWJlcnMgfSBmcm9tICcuL25vLXVudXNlZC1wYXJhbXMtbWVtYmVycy50cyc7XG5pbXBvcnQgeyBub1VzZWRVbmRlcnNjb3JlVmFyaWFibGVzIH0gZnJvbSAnLi9uby11c2VkLXVuZGVyc2NvcmUtdmFyaWFibGVzLnRzJztcbmltcG9ydCB7IHBhcmFtc09wdGlvbnNOYW1lTWF0Y2ggfSBmcm9tICcuL3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2gudHMnO1xuaW1wb3J0IHsgcHJlZmVyTm9vcEFzeW5jIH0gZnJvbSAnLi9wcmVmZXItbm9vcC1hc3luYy50cyc7XG5pbXBvcnQgeyByZWFkb25seVBhcmFtc09wdGlvbnNSZXN1bHRNZW1iZXJzIH0gZnJvbSAnLi9yZWFkb25seS1wYXJhbXMtb3B0aW9ucy1yZXN1bHQtbWVtYmVycy50cyc7XG5pbXBvcnQgeyByZXF1aXJlQ29tcG9uZW50U3VmZml4IH0gZnJvbSAnLi9yZXF1aXJlLWNvbXBvbmVudC1zdWZmaXgudHMnO1xuaW1wb3J0IHsgcmVxdWlyZU1ldGhvZFRlbXBsYXRlIH0gZnJvbSAnLi9yZXF1aXJlLW1ldGhvZC10ZW1wbGF0ZS50cyc7XG5pbXBvcnQgeyByZXF1aXJlU3VwZXJDYWxsIH0gZnJvbSAnLi9yZXF1aXJlLXN1cGVyLWNhbGwudHMnO1xuXG4vKipcbiAqIEVTTGludCBwbHVnaW4gYnVuZGxpbmcgZXZlcnkgYG9ic2lkaWFuLWRldi11dGlsc2AgY3VzdG9tIHJ1bGUsIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHNgIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNvbnN0IG9ic2lkaWFuRGV2VXRpbHNQbHVnaW46IEVTTGludC5QbHVnaW4gPSB7XG4gIHJ1bGVzOiB7XG4gICAgJ21hbmlmZXN0LWRlc2NyaXB0aW9uJzogbWFuaWZlc3REZXNjcmlwdGlvbixcbiAgICAnbWFuaWZlc3QtaWQnOiBtYW5pZmVzdElkLFxuICAgICdtYW5pZmVzdC1uYW1lJzogbWFuaWZlc3ROYW1lLFxuICAgICdtYW5pZmVzdC1zY2hlbWEnOiBtYW5pZmVzdFNjaGVtYSxcbiAgICAnbm8tYXN5bmMtY2FsbGJhY2stdG8tdW5zYWZlLXJldHVybic6IG5vQXN5bmNDYWxsYmFja1RvVW5zYWZlUmV0dXJuLFxuICAgICduby1vdmVyLWNhcC13YWl0LWluLWV2YWwtaW4tb2JzaWRpYW4nOiBub092ZXJDYXBXYWl0SW5FdmFsSW5PYnNpZGlhbixcbiAgICAnbm8tdW50cnVzdGVkLWlucHV0LWV2ZW50cyc6IG5vVW50cnVzdGVkSW5wdXRFdmVudHMsXG4gICAgJ25vLXVudXNlZC1wYXJhbXMtbWVtYmVycyc6IG5vVW51c2VkUGFyYW1zTWVtYmVycyxcbiAgICAnbm8tdXNlZC11bmRlcnNjb3JlLXZhcmlhYmxlcyc6IG5vVXNlZFVuZGVyc2NvcmVWYXJpYWJsZXMsXG4gICAgJ3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2gnOiBwYXJhbXNPcHRpb25zTmFtZU1hdGNoLFxuICAgICdwcmVmZXItbm9vcC1hc3luYyc6IHByZWZlck5vb3BBc3luYyxcbiAgICAncmVhZG9ubHktcGFyYW1zLW9wdGlvbnMtcmVzdWx0LW1lbWJlcnMnOiByZWFkb25seVBhcmFtc09wdGlvbnNSZXN1bHRNZW1iZXJzLFxuICAgICdyZXF1aXJlLWNvbXBvbmVudC1zdWZmaXgnOiByZXF1aXJlQ29tcG9uZW50U3VmZml4LFxuICAgICdyZXF1aXJlLW1ldGhvZC10ZW1wbGF0ZSc6IHJlcXVpcmVNZXRob2RUZW1wbGF0ZSxcbiAgICAncmVxdWlyZS1zdXBlci1jYWxsJzogcmVxdWlyZVN1cGVyQ2FsbFxuICB9XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU9BLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMscUNBQXFDO0FBQzlDLFNBQVMscUNBQXFDO0FBQzlDLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsMENBQTBDO0FBQ25ELFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsd0JBQXdCO0FBSzFCLE1BQU0seUJBQXdDO0FBQUEsRUFDbkQsT0FBTztBQUFBLElBQ0wsd0JBQXdCO0FBQUEsSUFDeEIsZUFBZTtBQUFBLElBQ2YsaUJBQWlCO0FBQUEsSUFDakIsbUJBQW1CO0FBQUEsSUFDbkIsc0NBQXNDO0FBQUEsSUFDdEMsd0NBQXdDO0FBQUEsSUFDeEMsNkJBQTZCO0FBQUEsSUFDN0IsNEJBQTRCO0FBQUEsSUFDNUIsZ0NBQWdDO0FBQUEsSUFDaEMsNkJBQTZCO0FBQUEsSUFDN0IscUJBQXFCO0FBQUEsSUFDckIsMENBQTBDO0FBQUEsSUFDMUMsNEJBQTRCO0FBQUEsSUFDNUIsMkJBQTJCO0FBQUEsSUFDM0Isc0JBQXNCO0FBQUEsRUFDeEI7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-dev-utils",
3
- "version": "101.7.0",
3
+ "version": "102.0.0",
4
4
  "description": "This is the collection of useful functions that you can use for your Obsidian plugin development.",
5
5
  "keywords": [
6
6
  "obsidian"
@@ -680,7 +680,7 @@
680
680
  "eslint-plugin-import": "npm:eslint-plugin-import-x@^4.17.1",
681
681
  "eslint-plugin-json-schema-validator": "^6.3.1",
682
682
  "eslint-plugin-n": "$eslint-plugin-n",
683
- "fflate": "^0.8.3",
683
+ "fflate": "$fflate",
684
684
  "glob": "^13.0.6",
685
685
  "js-yaml": "4.3.1",
686
686
  "markdown-it": "^15.0.1",
@@ -711,7 +711,6 @@
711
711
  "@types/semver": "^7.8.0",
712
712
  "@typescript-eslint/eslint-plugin": "^8.70.0",
713
713
  "@typescript-eslint/parser": "^8.70.0",
714
- "adm-zip": "^0.6.0",
715
714
  "compare-versions": "^6.1.1",
716
715
  "cspell": "^10.3.0",
717
716
  "debug": "^4.4.3",
@@ -727,6 +726,7 @@
727
726
  "eslint-plugin-perfectionist": "^5.11.0",
728
727
  "eslint-plugin-tsdoc": "^0.5.2",
729
728
  "eslint-plugin-unicorn": "^74.0.0",
729
+ "fflate": "^0.8.3",
730
730
  "i18next": "^26.4.2",
731
731
  "jiti": "^2.7.0",
732
732
  "localforage": "^1.10.0",
@@ -760,7 +760,6 @@
760
760
  "@jest/globals": "^30.5.1",
761
761
  "@resvg/resvg-js": "^2.6.2",
762
762
  "@total-typescript/ts-reset": "^0.6.1",
763
- "@types/adm-zip": "^0.5.8",
764
763
  "@typescript-eslint/rule-tester": "^8.70.0",
765
764
  "@vitest/coverage-v8": "^5.0.0",
766
765
  "astro": "^7.3.2",
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../../../dist/lib/cjs/script-utils/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.cjs",
3
+ "module": "../../../../dist/lib/esm/script-utils/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.mjs",
4
+ "type": "module",
5
+ "types": "../../../../dist/lib/cjs/script-utils/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.d.cts"
6
+ }