obsidian-dev-utils 84.6.1 → 85.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/dev/main.js +32702 -0
- package/dist/dev/manifest.json +9 -0
- package/dist/lib/cjs/async-events.cjs +4 -1
- package/dist/lib/cjs/async-events.d.cts +4 -1
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/obsidian/active-file-provider.cjs +1 -1
- package/dist/lib/cjs/obsidian/active-file-provider.d.cts +1 -1
- package/dist/lib/cjs/obsidian/bases-view-registrar.cjs +1 -1
- package/dist/lib/cjs/obsidian/bases-view-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/case-insensitive-file-index.cjs +1 -1
- package/dist/lib/cjs/obsidian/case-insensitive-file-index.d.cts +1 -1
- package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.cjs +16 -1
- package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.d.cts +20 -5
- package/dist/lib/cjs/obsidian/command-handlers/index.cjs +6 -3
- package/dist/lib/cjs/obsidian/command-handlers/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/command-handlers/open-settings-command-handler.cjs +7 -1
- package/dist/lib/cjs/obsidian/command-handlers/open-settings-command-handler.d.cts +8 -2
- package/dist/lib/cjs/obsidian/command-handlers/unlock-active-note-command-handler.cjs +183 -0
- package/dist/lib/cjs/obsidian/command-handlers/unlock-active-note-command-handler.d.cts +54 -0
- package/dist/lib/cjs/obsidian/command-registrar.cjs +1 -1
- package/dist/lib/cjs/obsidian/command-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/components/abort-signal-component.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/abort-signal-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/components/all-windows-event-component.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/all-windows-event-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/components/async-error-handler-component.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/async-error-handler-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/components/case-insensitive-file-index-component.cjs +7 -1
- package/dist/lib/cjs/obsidian/components/case-insensitive-file-index-component.d.cts +9 -2
- package/dist/lib/cjs/obsidian/components/console-debug-component.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/console-debug-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/components/embed-extensions-component.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/embed-extensions-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/components/generate-markdown-link-default-params-component.cjs +4 -1
- package/dist/lib/cjs/obsidian/components/generate-markdown-link-default-params-component.d.cts +4 -1
- package/dist/lib/cjs/obsidian/components/layout-ready-component.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/layout-ready-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/components/plugin-context-component.cjs +7 -1
- package/dist/lib/cjs/obsidian/components/plugin-context-component.d.cts +8 -2
- package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/plugin-notice-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +13 -4
- package/dist/lib/cjs/obsidian/components/plugin-settings-component.d.cts +12 -3
- package/dist/lib/cjs/obsidian/components/plugin-settings-tab-component.cjs +7 -1
- package/dist/lib/cjs/obsidian/components/plugin-settings-tab-component.d.cts +8 -2
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +29 -8
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +34 -7
- package/dist/lib/cjs/obsidian/data-handler.cjs +1 -1
- package/dist/lib/cjs/obsidian/data-handler.d.cts +1 -1
- package/dist/lib/cjs/obsidian/editor-extension-registrar.cjs +1 -1
- package/dist/lib/cjs/obsidian/editor-extension-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/editor-suggest-registrar.cjs +1 -1
- package/dist/lib/cjs/obsidian/editor-suggest-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/extensions-registrar.cjs +1 -1
- package/dist/lib/cjs/obsidian/extensions-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/hover-link-source-registrar.cjs +1 -1
- package/dist/lib/cjs/obsidian/hover-link-source-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/index.cjs +4 -1
- package/dist/lib/cjs/obsidian/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/link.cjs +93 -244
- package/dist/lib/cjs/obsidian/link.d.cts +98 -148
- package/dist/lib/cjs/obsidian/loop.cjs +2 -2
- package/dist/lib/cjs/obsidian/loop.d.cts +17 -3
- package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.cjs +4 -1
- package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.d.cts +4 -1
- package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.cjs +1 -1
- package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/metadata-cache.cjs +141 -43
- package/dist/lib/cjs/obsidian/metadata-cache.d.cts +171 -9
- package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +7 -4
- package/dist/lib/cjs/obsidian/modals/minimizable-modal.d.cts +8 -1
- package/dist/lib/cjs/obsidian/obsidian-protocol-handler-registrar.cjs +4 -1
- package/dist/lib/cjs/obsidian/obsidian-protocol-handler-registrar.d.cts +4 -1
- package/dist/lib/cjs/obsidian/parse-link.cjs +476 -0
- package/dist/lib/cjs/obsidian/parse-link.d.cts +268 -0
- package/dist/lib/cjs/obsidian/plugin/plugin-event-source.cjs +1 -1
- package/dist/lib/cjs/obsidian/plugin/plugin-event-source.d.cts +1 -1
- package/dist/lib/cjs/obsidian/plugin-cli-handler-registrar.cjs +1 -1
- package/dist/lib/cjs/obsidian/plugin-cli-handler-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/resource-lock.cjs +155 -20
- package/dist/lib/cjs/obsidian/resource-lock.d.cts +93 -22
- package/dist/lib/cjs/obsidian/ribbon-icon-registrar.cjs +1 -1
- package/dist/lib/cjs/obsidian/ribbon-icon-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.cjs +28 -16
- package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.d.cts +17 -5
- package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.cjs +4 -1
- package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.d.cts +5 -2
- package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.cjs +11 -2
- package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.d.cts +12 -3
- package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.cjs +8 -2
- package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.d.cts +9 -3
- package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.cjs +8 -2
- package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.d.cts +9 -2
- package/dist/lib/cjs/obsidian/status-bar-item-registrar.cjs +1 -1
- package/dist/lib/cjs/obsidian/status-bar-item-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/vault-transaction.cjs +4 -1
- package/dist/lib/cjs/obsidian/vault-transaction.d.cts +4 -1
- package/dist/lib/cjs/obsidian/vault.cjs +2 -2
- package/dist/lib/cjs/obsidian/view-registrar.cjs +1 -1
- package/dist/lib/cjs/obsidian/view-registrar.d.cts +1 -1
- package/dist/lib/cjs/script-utils/linters/markdownlint-cli2-config.cjs +4 -2
- package/dist/lib/cjs/transformers/group-transformer.cjs +1 -1
- package/dist/lib/cjs/transformers/group-transformer.d.cts +1 -1
- package/dist/lib/cjs/url.cjs +14 -3
- package/dist/lib/cjs/url.d.cts +15 -0
- package/dist/lib/esm/async-events.d.mts +4 -1
- package/dist/lib/esm/async-events.mjs +4 -1
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/obsidian/active-file-provider.d.mts +1 -1
- package/dist/lib/esm/obsidian/active-file-provider.mjs +1 -1
- package/dist/lib/esm/obsidian/bases-view-registrar.d.mts +1 -1
- package/dist/lib/esm/obsidian/bases-view-registrar.mjs +1 -1
- package/dist/lib/esm/obsidian/case-insensitive-file-index.d.mts +1 -1
- package/dist/lib/esm/obsidian/case-insensitive-file-index.mjs +1 -1
- package/dist/lib/esm/obsidian/command-handlers/command-handler-component.d.mts +20 -5
- package/dist/lib/esm/obsidian/command-handlers/command-handler-component.mjs +16 -1
- package/dist/lib/esm/obsidian/command-handlers/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/command-handlers/index.mjs +4 -2
- package/dist/lib/esm/obsidian/command-handlers/open-settings-command-handler.d.mts +8 -2
- package/dist/lib/esm/obsidian/command-handlers/open-settings-command-handler.mjs +7 -1
- package/dist/lib/esm/obsidian/command-handlers/unlock-active-note-command-handler.d.mts +54 -0
- package/dist/lib/esm/obsidian/command-handlers/unlock-active-note-command-handler.mjs +75 -0
- package/dist/lib/esm/obsidian/command-registrar.d.mts +1 -1
- package/dist/lib/esm/obsidian/command-registrar.mjs +1 -1
- package/dist/lib/esm/obsidian/components/abort-signal-component.d.mts +1 -1
- package/dist/lib/esm/obsidian/components/abort-signal-component.mjs +1 -1
- package/dist/lib/esm/obsidian/components/all-windows-event-component.d.mts +1 -1
- package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +1 -1
- package/dist/lib/esm/obsidian/components/async-error-handler-component.d.mts +1 -1
- package/dist/lib/esm/obsidian/components/async-error-handler-component.mjs +1 -1
- package/dist/lib/esm/obsidian/components/case-insensitive-file-index-component.d.mts +9 -2
- package/dist/lib/esm/obsidian/components/case-insensitive-file-index-component.mjs +7 -1
- package/dist/lib/esm/obsidian/components/console-debug-component.d.mts +1 -1
- package/dist/lib/esm/obsidian/components/console-debug-component.mjs +1 -1
- package/dist/lib/esm/obsidian/components/embed-extensions-component.d.mts +1 -1
- package/dist/lib/esm/obsidian/components/embed-extensions-component.mjs +1 -1
- package/dist/lib/esm/obsidian/components/generate-markdown-link-default-params-component.d.mts +4 -1
- package/dist/lib/esm/obsidian/components/generate-markdown-link-default-params-component.mjs +4 -1
- package/dist/lib/esm/obsidian/components/layout-ready-component.d.mts +1 -1
- package/dist/lib/esm/obsidian/components/layout-ready-component.mjs +1 -1
- package/dist/lib/esm/obsidian/components/menu-event-registrar-component.d.mts +1 -1
- package/dist/lib/esm/obsidian/components/menu-event-registrar-component.mjs +1 -1
- package/dist/lib/esm/obsidian/components/plugin-context-component.d.mts +8 -2
- package/dist/lib/esm/obsidian/components/plugin-context-component.mjs +7 -1
- package/dist/lib/esm/obsidian/components/plugin-notice-component.d.mts +1 -1
- package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +1 -1
- package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +12 -3
- package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +13 -4
- package/dist/lib/esm/obsidian/components/plugin-settings-tab-component.d.mts +8 -2
- package/dist/lib/esm/obsidian/components/plugin-settings-tab-component.mjs +7 -1
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +34 -7
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +30 -9
- package/dist/lib/esm/obsidian/data-handler.d.mts +1 -1
- package/dist/lib/esm/obsidian/data-handler.mjs +1 -1
- package/dist/lib/esm/obsidian/editor-extension-registrar.d.mts +1 -1
- package/dist/lib/esm/obsidian/editor-extension-registrar.mjs +1 -1
- package/dist/lib/esm/obsidian/editor-suggest-registrar.d.mts +1 -1
- package/dist/lib/esm/obsidian/editor-suggest-registrar.mjs +1 -1
- package/dist/lib/esm/obsidian/extensions-registrar.d.mts +1 -1
- package/dist/lib/esm/obsidian/extensions-registrar.mjs +1 -1
- package/dist/lib/esm/obsidian/hover-link-source-registrar.d.mts +1 -1
- package/dist/lib/esm/obsidian/hover-link-source-registrar.mjs +1 -1
- package/dist/lib/esm/obsidian/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/index.mjs +3 -1
- package/dist/lib/esm/obsidian/link.d.mts +98 -148
- package/dist/lib/esm/obsidian/link.mjs +90 -222
- package/dist/lib/esm/obsidian/loop.d.mts +17 -3
- package/dist/lib/esm/obsidian/loop.mjs +2 -2
- package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.d.mts +4 -1
- package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.mjs +4 -1
- package/dist/lib/esm/obsidian/markdown-post-processor-registrar.d.mts +1 -1
- package/dist/lib/esm/obsidian/markdown-post-processor-registrar.mjs +1 -1
- package/dist/lib/esm/obsidian/metadata-cache.d.mts +171 -9
- package/dist/lib/esm/obsidian/metadata-cache.mjs +142 -42
- package/dist/lib/esm/obsidian/modals/minimizable-modal.d.mts +8 -1
- package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +7 -4
- package/dist/lib/esm/obsidian/obsidian-protocol-handler-registrar.d.mts +4 -1
- package/dist/lib/esm/obsidian/obsidian-protocol-handler-registrar.mjs +4 -1
- package/dist/lib/esm/obsidian/parse-link.d.mts +268 -0
- package/dist/lib/esm/obsidian/parse-link.mjs +353 -0
- package/dist/lib/esm/obsidian/plugin/plugin-event-source.d.mts +1 -1
- package/dist/lib/esm/obsidian/plugin/plugin-event-source.mjs +1 -1
- package/dist/lib/esm/obsidian/plugin-cli-handler-registrar.d.mts +1 -1
- package/dist/lib/esm/obsidian/plugin-cli-handler-registrar.mjs +1 -1
- package/dist/lib/esm/obsidian/resource-lock.d.mts +93 -22
- package/dist/lib/esm/obsidian/resource-lock.mjs +155 -20
- package/dist/lib/esm/obsidian/ribbon-icon-registrar.d.mts +1 -1
- package/dist/lib/esm/obsidian/ribbon-icon-registrar.mjs +1 -1
- package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.d.mts +17 -5
- package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.mjs +28 -16
- package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.d.mts +5 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.mjs +4 -1
- package/dist/lib/esm/obsidian/setting-components/multiple-text-component.d.mts +12 -3
- package/dist/lib/esm/obsidian/setting-components/multiple-text-component.mjs +11 -2
- package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.d.mts +9 -3
- package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.mjs +8 -2
- package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.d.mts +9 -2
- package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.mjs +8 -2
- package/dist/lib/esm/obsidian/status-bar-item-registrar.d.mts +1 -1
- package/dist/lib/esm/obsidian/status-bar-item-registrar.mjs +1 -1
- package/dist/lib/esm/obsidian/vault-transaction.d.mts +4 -1
- package/dist/lib/esm/obsidian/vault-transaction.mjs +4 -1
- package/dist/lib/esm/obsidian/vault.mjs +2 -2
- package/dist/lib/esm/obsidian/view-registrar.d.mts +1 -1
- package/dist/lib/esm/obsidian/view-registrar.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/markdownlint-cli2-config.mjs +4 -2
- package/dist/lib/esm/transformers/group-transformer.d.mts +1 -1
- package/dist/lib/esm/transformers/group-transformer.mjs +1 -1
- package/dist/lib/esm/url.d.mts +15 -0
- package/dist/lib/esm/url.mjs +11 -2
- package/obsidian/command-handlers/unlock-active-note-command-handler/package.json +6 -0
- package/obsidian/parse-link/package.json +6 -0
- package/package.json +7 -7
|
@@ -0,0 +1,353 @@
|
|
|
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 initEsm() {
|
|
7
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
8
|
+
if (globalThis.process) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const browserProcess = {
|
|
13
|
+
browser: true,
|
|
14
|
+
cwd() {
|
|
15
|
+
return '/';
|
|
16
|
+
},
|
|
17
|
+
env: {},
|
|
18
|
+
platform: 'android'
|
|
19
|
+
};
|
|
20
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
21
|
+
globalThis.process = browserProcess;
|
|
22
|
+
})();
|
|
23
|
+
|
|
24
|
+
import { isFrontmatterLinkCache } from "@obsidian-typings/obsidian-public-latest/implementations";
|
|
25
|
+
import { remark } from "remark";
|
|
26
|
+
import remarkParse from "remark-parse";
|
|
27
|
+
import { wikiLinkPlugin } from "remark-wiki-link";
|
|
28
|
+
import { visit } from "unist-util-visit";
|
|
29
|
+
import { normalizeOptionalProperties } from "../object-utils.mjs";
|
|
30
|
+
import { replaceAll } from "../string.mjs";
|
|
31
|
+
import { ensureNonNullable } from "../type-guards.mjs";
|
|
32
|
+
import {
|
|
33
|
+
isFileUrl,
|
|
34
|
+
isUrl
|
|
35
|
+
} from "../url.mjs";
|
|
36
|
+
const SPECIAL_LINK_SYMBOLS_REGEXP = /[\\\x00\x08\x0B\x0C\x0E-\x1F ]/g;
|
|
37
|
+
const SPECIAL_MARKDOWN_LINK_SYMBOLS_REGEX = /[\\[\]<>_*~=`$]/g;
|
|
38
|
+
const WIKILINK_DIVIDER = "|";
|
|
39
|
+
class FrontmatterLinksParser {
|
|
40
|
+
frontmatterExternalLinks = [];
|
|
41
|
+
multiValueFrontmatterExternalLinks = [];
|
|
42
|
+
multiValueFrontmatterLinks = [];
|
|
43
|
+
parse(frontmatter) {
|
|
44
|
+
this.parseValue(frontmatter, "");
|
|
45
|
+
return {
|
|
46
|
+
frontmatterExternalLinks: this.frontmatterExternalLinks,
|
|
47
|
+
multiValueFrontmatterExternalLinks: this.multiValueFrontmatterExternalLinks,
|
|
48
|
+
multiValueFrontmatterLinks: this.multiValueFrontmatterLinks
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
categorize(params) {
|
|
52
|
+
const { isSingleLink, key, parseLinkResult, value } = params;
|
|
53
|
+
if (!parseLinkResult.isExternal && isSingleLink) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const reference = {
|
|
57
|
+
displayText: parseLinkResult.alias ?? parseLinkResult.url,
|
|
58
|
+
key,
|
|
59
|
+
link: parseLinkResult.url,
|
|
60
|
+
original: value,
|
|
61
|
+
parseLinkResult
|
|
62
|
+
};
|
|
63
|
+
if (isSingleLink) {
|
|
64
|
+
this.frontmatterExternalLinks.push(reference);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const referenceWithOffsets = {
|
|
68
|
+
...reference,
|
|
69
|
+
endOffset: parseLinkResult.endOffset,
|
|
70
|
+
startOffset: parseLinkResult.startOffset
|
|
71
|
+
};
|
|
72
|
+
if (parseLinkResult.isExternal) {
|
|
73
|
+
this.multiValueFrontmatterExternalLinks.push(referenceWithOffsets);
|
|
74
|
+
} else {
|
|
75
|
+
this.multiValueFrontmatterLinks.push(referenceWithOffsets);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
parseValue(value, key) {
|
|
79
|
+
if (typeof value === "string") {
|
|
80
|
+
const parseLinkResults = parseLinks(value);
|
|
81
|
+
const isSingleLink = parseLinkResults[0]?.raw === value;
|
|
82
|
+
for (const parseLinkResult of parseLinkResults) {
|
|
83
|
+
this.categorize({ isSingleLink, key, parseLinkResult, value });
|
|
84
|
+
}
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (typeof value !== "object" || value === null) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
for (const [childKey, childValue] of Object.entries(value)) {
|
|
91
|
+
this.parseValue(childValue, key ? `${key}.${childKey}` : childKey);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function encodeUrl(url) {
|
|
96
|
+
return replaceAll({
|
|
97
|
+
replacer: ({ substring: specialLinkSymbol }) => encodeURIComponent(specialLinkSymbol),
|
|
98
|
+
searchValue: SPECIAL_LINK_SYMBOLS_REGEXP,
|
|
99
|
+
str: url
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
function escapeAlias(alias) {
|
|
103
|
+
return replaceAll({
|
|
104
|
+
replacer: "\\$&",
|
|
105
|
+
searchValue: SPECIAL_MARKDOWN_LINK_SYMBOLS_REGEX,
|
|
106
|
+
str: alias
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function isParseLinkFrontmatterReference(reference) {
|
|
110
|
+
return isFrontmatterLinkCache(reference) && "parseLinkResult" in reference;
|
|
111
|
+
}
|
|
112
|
+
function isParseLinkReference(reference) {
|
|
113
|
+
return "parseLinkResult" in reference;
|
|
114
|
+
}
|
|
115
|
+
function parseFrontmatterLinks(frontmatter) {
|
|
116
|
+
return new FrontmatterLinksParser().parse(frontmatter);
|
|
117
|
+
}
|
|
118
|
+
function parseLink(str) {
|
|
119
|
+
const links = parseLinks(str);
|
|
120
|
+
return links[0]?.raw === str ? links[0] : null;
|
|
121
|
+
}
|
|
122
|
+
function parseLinks(str) {
|
|
123
|
+
const embedSymbolOffsets = /* @__PURE__ */ new Set();
|
|
124
|
+
const EMBED_LINK_PREFIX = "![";
|
|
125
|
+
const NO_EMBED_LINK_PREFIX = "@[";
|
|
126
|
+
const DUMMY_CHARACTER = "@";
|
|
127
|
+
const EMBED_INSIDE_LINK_REG_EXP = /\[(?<LinkAlias>!\[.*?\]\(.+?\))\]\((?<Link>.+?)\)/g;
|
|
128
|
+
const noInsideEmbedsLinksStr = replaceAll({
|
|
129
|
+
replacer: ({ capturedGroupArgs: [linkAlias = "", link = ""] }) => {
|
|
130
|
+
const dummyAlias = DUMMY_CHARACTER.repeat(linkAlias.length);
|
|
131
|
+
return `[${dummyAlias}](${link})`;
|
|
132
|
+
},
|
|
133
|
+
searchValue: EMBED_INSIDE_LINK_REG_EXP,
|
|
134
|
+
str
|
|
135
|
+
});
|
|
136
|
+
const noEmbedStr = replaceAll({
|
|
137
|
+
replacer: (args) => {
|
|
138
|
+
embedSymbolOffsets.add(args.offset);
|
|
139
|
+
return NO_EMBED_LINK_PREFIX;
|
|
140
|
+
},
|
|
141
|
+
searchValue: EMBED_LINK_PREFIX,
|
|
142
|
+
str: noInsideEmbedsLinksStr
|
|
143
|
+
});
|
|
144
|
+
const processor = remark().use(remarkParse).use(wikiLinkPlugin, { aliasDivider: WIKILINK_DIVIDER });
|
|
145
|
+
const root = processor.parse(noEmbedStr);
|
|
146
|
+
const links = [];
|
|
147
|
+
const textLinks = [];
|
|
148
|
+
visit(root, (node) => {
|
|
149
|
+
let link;
|
|
150
|
+
switch (node.type) {
|
|
151
|
+
case "link":
|
|
152
|
+
link = parseLinkNode(node, str);
|
|
153
|
+
break;
|
|
154
|
+
case "wikiLink":
|
|
155
|
+
link = parseWikilinkNode(node, str);
|
|
156
|
+
break;
|
|
157
|
+
default:
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (embedSymbolOffsets.has(link.startOffset - 1)) {
|
|
161
|
+
link = {
|
|
162
|
+
...link,
|
|
163
|
+
isEmbed: true,
|
|
164
|
+
raw: `!${link.raw}`,
|
|
165
|
+
startOffset: link.startOffset - 1
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
links.push(link);
|
|
169
|
+
});
|
|
170
|
+
links.sort((a, b) => a.startOffset - b.startOffset);
|
|
171
|
+
let textStartOffset = 0;
|
|
172
|
+
for (const link of links) {
|
|
173
|
+
extractTextLinks({
|
|
174
|
+
endOffset: link.startOffset - 1,
|
|
175
|
+
startOffset: textStartOffset,
|
|
176
|
+
str,
|
|
177
|
+
textLinks
|
|
178
|
+
});
|
|
179
|
+
textStartOffset = link.endOffset + 1;
|
|
180
|
+
}
|
|
181
|
+
extractTextLinks({
|
|
182
|
+
endOffset: str.length - 1,
|
|
183
|
+
startOffset: textStartOffset,
|
|
184
|
+
str,
|
|
185
|
+
textLinks
|
|
186
|
+
});
|
|
187
|
+
links.push(...textLinks);
|
|
188
|
+
links.sort((a, b) => a.startOffset - b.startOffset);
|
|
189
|
+
return links;
|
|
190
|
+
}
|
|
191
|
+
function toParseLinkReference(params) {
|
|
192
|
+
const { content, parseLinkResult } = params;
|
|
193
|
+
const reference = {
|
|
194
|
+
link: parseLinkResult.url,
|
|
195
|
+
original: parseLinkResult.raw,
|
|
196
|
+
parseLinkResult,
|
|
197
|
+
position: {
|
|
198
|
+
end: offsetToLoc(content, parseLinkResult.endOffset),
|
|
199
|
+
start: offsetToLoc(content, parseLinkResult.startOffset)
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
if (parseLinkResult.alias !== void 0) {
|
|
203
|
+
reference.displayText = parseLinkResult.alias;
|
|
204
|
+
}
|
|
205
|
+
return reference;
|
|
206
|
+
}
|
|
207
|
+
function unescapeAlias(escapedAlias) {
|
|
208
|
+
return replaceAll({
|
|
209
|
+
replacer: ({ capturedGroupArgs: [backslashes = "", specialChar = ""] }) => {
|
|
210
|
+
const ESCAPED_BACKSLASH_LENGTH = 2;
|
|
211
|
+
const backslashCount = backslashes.length;
|
|
212
|
+
const keepCount = Math.floor(backslashCount / ESCAPED_BACKSLASH_LENGTH);
|
|
213
|
+
return "\\".repeat(keepCount) + specialChar;
|
|
214
|
+
},
|
|
215
|
+
searchValue: /(?<Backslashes>\\+)(?<SpecialCharacter>[!"#$%&'()*+,-./:;<=>?@[\\\]^_`{|}~])/g,
|
|
216
|
+
str: escapedAlias
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
function decodeUrlSafely(params) {
|
|
220
|
+
const { hasAngleBrackets, isExternal, url } = params;
|
|
221
|
+
if ((isExternal || hasAngleBrackets) && !isFileUrl(url)) {
|
|
222
|
+
return url;
|
|
223
|
+
}
|
|
224
|
+
try {
|
|
225
|
+
return decodeURIComponent(url);
|
|
226
|
+
} catch (error) {
|
|
227
|
+
console.error(`Failed to decode URL ${url}`, error);
|
|
228
|
+
return url;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function extractAlias(params) {
|
|
232
|
+
const { aliasEndOffset, aliasStartOffset, str } = params;
|
|
233
|
+
return aliasStartOffset < aliasEndOffset ? str.slice(aliasStartOffset, aliasEndOffset) : void 0;
|
|
234
|
+
}
|
|
235
|
+
function extractTextLinks(params) {
|
|
236
|
+
const { endOffset, startOffset, str, textLinks } = params;
|
|
237
|
+
if (startOffset > endOffset) {
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
const textPart = str.slice(startOffset, endOffset + 1);
|
|
241
|
+
replaceAll({
|
|
242
|
+
replacer: ({ capturedGroupArgs: [rawUrl = ""], offset }) => {
|
|
243
|
+
if (!isUrl(rawUrl)) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
const url = decodeUrlSafely({
|
|
247
|
+
hasAngleBrackets: false,
|
|
248
|
+
isExternal: true,
|
|
249
|
+
url: rawUrl
|
|
250
|
+
});
|
|
251
|
+
textLinks.push({
|
|
252
|
+
encodedUrl: encodeUrl(url),
|
|
253
|
+
endOffset: startOffset + offset + rawUrl.length,
|
|
254
|
+
hasAngleBrackets: false,
|
|
255
|
+
isEmbed: false,
|
|
256
|
+
isExternal: true,
|
|
257
|
+
isFileUrl: isFileUrl(url),
|
|
258
|
+
isWikilink: false,
|
|
259
|
+
raw: rawUrl,
|
|
260
|
+
startOffset: startOffset + offset,
|
|
261
|
+
url
|
|
262
|
+
});
|
|
263
|
+
},
|
|
264
|
+
searchValue: /(?<Url>\S+)/g,
|
|
265
|
+
str: textPart
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
function getRawLink(node, str) {
|
|
269
|
+
const pos = ensureNonNullable(node.position);
|
|
270
|
+
return str.slice(pos.start.offset, pos.end.offset);
|
|
271
|
+
}
|
|
272
|
+
function hasAngleBracketsInLink(params) {
|
|
273
|
+
const { raw, rawUrl } = params;
|
|
274
|
+
const OPEN_ANGLE_BRACKET = "<";
|
|
275
|
+
return raw.startsWith(OPEN_ANGLE_BRACKET) || rawUrl.startsWith(OPEN_ANGLE_BRACKET);
|
|
276
|
+
}
|
|
277
|
+
function offsetToLoc(content, offset) {
|
|
278
|
+
const precedingContent = content.slice(0, offset);
|
|
279
|
+
const line = (precedingContent.match(/\n/g) ?? []).length;
|
|
280
|
+
const lastNewlineOffset = precedingContent.lastIndexOf("\n");
|
|
281
|
+
return {
|
|
282
|
+
col: offset - (lastNewlineOffset + 1),
|
|
283
|
+
line,
|
|
284
|
+
offset
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
function parseLinkNode(node, str) {
|
|
288
|
+
const LINK_ALIAS_SUFFIX = "](";
|
|
289
|
+
const LINK_SUFFIX = ")";
|
|
290
|
+
const raw = getRawLink(node, str);
|
|
291
|
+
const aliasNodeStartOffset = node.children[0]?.position?.start.offset ?? 1;
|
|
292
|
+
const aliasNodeEndOffset = node.children.at(-1)?.position?.end.offset ?? 1;
|
|
293
|
+
const position = ensureNonNullable(node.position);
|
|
294
|
+
const nodeEndOffset = ensureNonNullable(position.end.offset);
|
|
295
|
+
const nodeStartOffset = ensureNonNullable(position.start.offset);
|
|
296
|
+
const rawUrl = str.slice(aliasNodeEndOffset + LINK_ALIAS_SUFFIX.length, nodeEndOffset - LINK_SUFFIX.length);
|
|
297
|
+
const hasAngleBrackets = hasAngleBracketsInLink({
|
|
298
|
+
raw,
|
|
299
|
+
rawUrl
|
|
300
|
+
});
|
|
301
|
+
const isExternal = isUrl(node.url);
|
|
302
|
+
const url = decodeUrlSafely({
|
|
303
|
+
hasAngleBrackets,
|
|
304
|
+
isExternal,
|
|
305
|
+
url: node.url
|
|
306
|
+
});
|
|
307
|
+
const alias = extractAlias({
|
|
308
|
+
aliasEndOffset: aliasNodeEndOffset,
|
|
309
|
+
aliasStartOffset: aliasNodeStartOffset,
|
|
310
|
+
str
|
|
311
|
+
});
|
|
312
|
+
return normalizeOptionalProperties({
|
|
313
|
+
alias,
|
|
314
|
+
encodedUrl: isExternal ? encodeUrl(url) : void 0,
|
|
315
|
+
endOffset: nodeEndOffset,
|
|
316
|
+
hasAngleBrackets,
|
|
317
|
+
isEmbed: false,
|
|
318
|
+
isExternal,
|
|
319
|
+
isFileUrl: isFileUrl(url),
|
|
320
|
+
isWikilink: false,
|
|
321
|
+
raw,
|
|
322
|
+
startOffset: nodeStartOffset,
|
|
323
|
+
title: node.title ?? void 0,
|
|
324
|
+
unescapedAlias: alias === void 0 ? void 0 : unescapeAlias(alias),
|
|
325
|
+
url
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
function parseWikilinkNode(node, str) {
|
|
329
|
+
const position = ensureNonNullable(node.position);
|
|
330
|
+
return normalizeOptionalProperties({
|
|
331
|
+
alias: str.includes(WIKILINK_DIVIDER) ? node.data.alias : void 0,
|
|
332
|
+
endOffset: ensureNonNullable(position.end.offset),
|
|
333
|
+
isEmbed: false,
|
|
334
|
+
isExternal: false,
|
|
335
|
+
isFileUrl: false,
|
|
336
|
+
isWikilink: true,
|
|
337
|
+
raw: getRawLink(node, str),
|
|
338
|
+
startOffset: ensureNonNullable(position.start.offset),
|
|
339
|
+
url: node.value
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
export {
|
|
343
|
+
encodeUrl,
|
|
344
|
+
escapeAlias,
|
|
345
|
+
isParseLinkFrontmatterReference,
|
|
346
|
+
isParseLinkReference,
|
|
347
|
+
parseFrontmatterLinks,
|
|
348
|
+
parseLink,
|
|
349
|
+
parseLinks,
|
|
350
|
+
toParseLinkReference,
|
|
351
|
+
unescapeAlias
|
|
352
|
+
};
|
|
353
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BhcnNlLWxpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIHBhcnNpbmcgbWFya2Rvd24gYW5kIHdpa2kgbGlua3MgaW50byBzdHJ1Y3R1cmVkIGRhdGEsIGFuZCBmb3JcbiAqIGVzY2FwaW5nLCB1bmVzY2FwaW5nLCBhbmQgZW5jb2RpbmcgbGluayBjb21wb25lbnRzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgTGluayB9IGZyb20gJ21kYXN0JztcbmltcG9ydCB0eXBlIHtcbiAgRnJvbnRtYXR0ZXJMaW5rQ2FjaGUsXG4gIExvYyxcbiAgUmVmZXJlbmNlLFxuICBSZWZlcmVuY2VDYWNoZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IE5vZGUgfSBmcm9tICd1bmlzdCc7XG5cbmltcG9ydCB7IGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyByZW1hcmsgfSBmcm9tICdyZW1hcmsnO1xuaW1wb3J0IHJlbWFya1BhcnNlIGZyb20gJ3JlbWFyay1wYXJzZSc7XG5pbXBvcnQgeyB3aWtpTGlua1BsdWdpbiB9IGZyb20gJ3JlbWFyay13aWtpLWxpbmsnO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tICd1bmlzdC11dGlsLXZpc2l0JztcblxuaW1wb3J0IHR5cGUgeyBHZW5lcmljT2JqZWN0IH0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJy4uL3N0cmluZy50cyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7XG4gIGlzRmlsZVVybCxcbiAgaXNVcmxcbn0gZnJvbSAnLi4vdXJsLnRzJztcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNwZWNpYWwgbGluayBzeW1ib2xzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBUaGUgcmVndWxhciBleHByZXNzaW9uIGlzIHdyaXR0ZW4gdG8gY2FwdHVyZSBjb250cm9sIGNoYXJhY3RlcnMuXG5jb25zdCBTUEVDSUFMX0xJTktfU1lNQk9MU19SRUdFWFAgPSAvW1xcXFxcXHgwMFxceDA4XFx4MEJcXHgwQ1xceDBFLVxceDFGIF0vZztcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNwZWNpYWwgbWFya2Rvd24gbGluayBzeW1ib2xzLlxuICovXG5jb25zdCBTUEVDSUFMX01BUktET1dOX0xJTktfU1lNQk9MU19SRUdFWCA9IC9bXFxcXFtcXF08Pl8qfj1gJF0vZztcblxuY29uc3QgV0lLSUxJTktfRElWSURFUiA9ICd8JztcblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGxpbmtzIGZyb20gYSBub3RlJ3MgZnJvbnRtYXR0ZXIgdmlhIHtAbGluayBwYXJzZUZyb250bWF0dGVyTGlua3N9LiBJbnRlcm5hbFxuICogc2luZ2xlLWxpbmsgZnJvbnRtYXR0ZXIgdmFsdWVzIGFyZSBvbWl0dGVkLCBhcyBPYnNpZGlhbiBuYXRpdmVseSBjYWNoZXMgdGhlbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZUZyb250bWF0dGVyTGlua3NSZXN1bHQge1xuICAvKipcbiAgICogVGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHNpbmdsZS1saW5rIChzaW5nbGUtdmFsdWUpIGZyb250bWF0dGVyIHZhbHVlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VbXTtcblxuICAvKipcbiAgICogVGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqL1xuICByZWFkb25seSBtdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW107XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3M6IFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlV2l0aE9mZnNldHNbXTtcbn1cblxuLyoqXG4gKiBBIHtAbGluayBGcm9udG1hdHRlckxpbmtDYWNoZX0gZm9yIGEgbGluayBwYXJzZWQgZnJvbSBhIHNpbmdsZS1saW5rIGZyb250bWF0dGVyIHZhbHVlIHZpYVxuICoge0BsaW5rIHBhcnNlTGlua3N9LiBJdCBjYXJyaWVzIHRoZSBmdWxsIHtAbGluayBQYXJzZUxpbmtSZXN1bHR9IHNvIGNvbnN1bWVycyBjYW4gaW5zcGVjdCB0aGUgcGFyc2VcbiAqIGRldGFpbHMgd2l0aG91dCByZS1wYXJzaW5nIHRoZSBsaW5rLiBVc2UgdGhpcyB3aGVuIHRoZSB3aG9sZSBmcm9udG1hdHRlciB2YWx1ZSBpcyBhIHNpbmdsZSBsaW5rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlIGV4dGVuZHMgRnJvbnRtYXR0ZXJMaW5rQ2FjaGUge1xuICAvKipcbiAgICogVGhlIHJlc3VsdCBvZiBwYXJzaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyc2VMaW5rUmVzdWx0OiBQYXJzZUxpbmtSZXN1bHQ7XG59XG5cbi8qKlxuICogQSB7QGxpbmsgUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2V9IGZvciBhIGxpbmsgcGFyc2VkIGZyb20gYSBtdWx0aS1saW5rIGZyb250bWF0dGVyIHZhbHVlIHZpYVxuICoge0BsaW5rIHBhcnNlTGlua3N9LCBhZGRpdGlvbmFsbHkgY2FycnlpbmcgdGhlIG9mZnNldHMgb2YgdGhlIGxpbmsgd2l0aGluIHRoZSBmcm9udG1hdHRlciB2YWx1ZS4gVXNlXG4gKiB0aGlzIHdoZW4gdGhlIGZyb250bWF0dGVyIHZhbHVlIGhvbGRzIG11bHRpcGxlIGxpbmtzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlV2l0aE9mZnNldHMgZXh0ZW5kcyBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZSB7XG4gIC8qKlxuICAgKiBBbiBlbmQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBmcm9udG1hdHRlciB2YWx1ZS5cbiAgICovXG4gIGVuZE9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHN0YXJ0IG9mZnNldCBvZiB0aGUgbGluayBpbiB0aGUgZnJvbnRtYXR0ZXIgdmFsdWUuXG4gICAqL1xuICBzdGFydE9mZnNldDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEge0BsaW5rIFJlZmVyZW5jZUNhY2hlfSBmb3IgYSBsaW5rIHBhcnNlZCBmcm9tIGNvbnRlbnQgdmlhIHtAbGluayBwYXJzZUxpbmtzfS4gSXQgY2FycmllcyB0aGUgZnVsbFxuICoge0BsaW5rIFBhcnNlTGlua1Jlc3VsdH0gc28gY29uc3VtZXJzIGNhbiBpbnNwZWN0IHRoZSBwYXJzZSBkZXRhaWxzIHdpdGhvdXQgcmUtcGFyc2luZyB0aGUgbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZUxpbmtSZWZlcmVuY2UgZXh0ZW5kcyBSZWZlcmVuY2VDYWNoZSB7XG4gIC8qKlxuICAgKiBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBwYXJzZUxpbmtSZXN1bHQ6IFBhcnNlTGlua1Jlc3VsdDtcbn1cblxuLyoqXG4gKiBBIHJlc3VsdCBvZiBwYXJzaW5nIGEgbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZUxpbmtSZXN1bHQge1xuICAvKipcbiAgICogQW4gYWxpYXMgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbXFwqYWxpYXNcXCpdKGxpbmsubWQpIC0+IFxcKmFsaWFzXFwqXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGVuY29kZWQgVVJMIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXSg8bGluayB3aXRoIHNwYWNlLm1kPikgLT4gbGluayUyMHdpdGglMjBzcGFjZS5tZFxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGVuY29kZWRVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGVuZCBvZmZzZXQgb2YgdGhlIGxpbmsgaW4gdGhlIG9yaWdpbmFsIHRleHQuXG4gICAqL1xuICByZWFkb25seSBlbmRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGhhcyBhbmdsZSBicmFja2V0cy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oPGxpbmsubWQ+KSAtPiB0cnVlXG4gICAqIFthbGlhc10obGluay5tZCkgLT4gZmFsc2VcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBoYXNBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGFuIGVtYmVkIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiAhW1thbGlhc11dIC0+IHRydWVcbiAgICogW1thbGlhc11dIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbWJlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGV4dGVybmFsLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXShodHRwczovL2V4YW1wbGUuY29tKSAtPiB0cnVlXG4gICAqIFthbGlhc10oZmlsZS5tZCkgLT4gZmFsc2VcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBpc0V4dGVybmFsOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYSBgZmlsZTovL2AgVVJMLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXShmaWxlOi8vL0M6L3gudHh0KSAtPiB0cnVlXG4gICAqIFthbGlhc10oaHR0cHM6Ly9leGFtcGxlLmNvbSkgLT4gZmFsc2VcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBpc0ZpbGVVcmw6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhIHdpa2lsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW1thbGlhc11dIC0+IHRydWVcbiAgICogW2FsaWFzXShsaW5rLm1kKSAtPiBmYWxzZVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGlzV2lraWxpbms6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgcmF3IGxpbmsgdGV4dC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10obGluay5tZCkgLT4gW2FsaWFzXShsaW5rLm1kKVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IHJhdzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN0YXJ0IG9mZnNldCBvZiB0aGUgbGluayBpbiB0aGUgb3JpZ2luYWwgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0T2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgdGl0bGUgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKGxpbmsubWQgXCJ0aXRsZVwiKSAtPiB0aXRsZVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiB1bmVzY2FwZWQgYWxpYXMgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbXFwqYWxpYXNcXCpdKGxpbmsubWQpIC0+ICphbGlhcypcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSB1bmVzY2FwZWRBbGlhcz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gVVJMIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXShsaW5rJTIwd2l0aCUyMHNwYWNlLm1kKSAtPiBsaW5rIHdpdGggc3BhY2UubWRcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB0b1BhcnNlTGlua1JlZmVyZW5jZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9QYXJzZUxpbmtSZWZlcmVuY2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbnRlbnQgdGhlIHBhcnNlZCBsaW5rJ3Mgb2Zmc2V0cyBpbmRleCBpbnRvLiBVc2VkIHRvIGNvbXB1dGUgdGhlIGxpbmUgYW5kIGNvbHVtbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhcnNlZCBsaW5rIHRvIHdyYXAuXG4gICAqL1xuICByZWFkb25seSBwYXJzZUxpbmtSZXN1bHQ6IFBhcnNlTGlua1Jlc3VsdDtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBGcm9udG1hdHRlckxpbmtzUGFyc2VyLmNhdGVnb3JpemV9LlxuICovXG5pbnRlcmZhY2UgQ2F0ZWdvcml6ZUZyb250bWF0dGVyTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB3aG9sZSBmcm9udG1hdHRlciB2YWx1ZSBpcyBhIHNpbmdsZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNTaW5nbGVMaW5rOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUga2V5IHBhdGggb2YgdGhlIGZyb250bWF0dGVyIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJzZWQgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHBhcnNlTGlua1Jlc3VsdDogUGFyc2VMaW5rUmVzdWx0O1xuXG4gIC8qKlxuICAgKiBUaGUgZnJvbnRtYXR0ZXIgdmFsdWUgdGhlIGxpbmsgd2FzIHBhcnNlZCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBkZWNvZGVVcmxTYWZlbHl9LlxuICovXG5pbnRlcmZhY2UgRGVjb2RlVXJsU2FmZWx5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0cy5cbiAgICovXG4gIHJlYWRvbmx5IGhhc0FuZ2xlQnJhY2tldHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgaXMgZXh0ZXJuYWwuXG4gICAqL1xuICByZWFkb25seSBpc0V4dGVybmFsOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIFVSTCB0byBkZWNvZGUuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBleHRyYWN0QWxpYXN9LlxuICovXG5pbnRlcmZhY2UgRXh0cmFjdEFsaWFzUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGVuZCBvZmZzZXQgb2YgdGhlIGFsaWFzIGluIHRoZSBzdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBhbGlhc0VuZE9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHN0YXJ0IG9mZnNldCBvZiB0aGUgYWxpYXMgaW4gdGhlIHN0cmluZy5cbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzU3RhcnRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQSBzdHJpbmcgdG8gZXh0cmFjdCB0aGUgYWxpYXMgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IHN0cjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGV4dHJhY3RUZXh0TGlua3N9LlxuICovXG5pbnRlcmZhY2UgRXh0cmFjdFRleHRMaW5rc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBlbmQgb2Zmc2V0IG9mIHRoZSB0ZXh0IHBhcnQgaW4gdGhlIHN0cmluZy5cbiAgICovXG4gIHJlYWRvbmx5IGVuZE9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHN0YXJ0IG9mZnNldCBvZiB0aGUgdGV4dCBwYXJ0IGluIHRoZSBzdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBzdGFydE9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHN0cmluZyB0byBleHRyYWN0IHRoZSB0ZXh0IGxpbmtzIGZyb20uXG4gICAqL1xuICByZWFkb25seSBzdHI6IHN0cmluZztcblxuICAvKipcbiAgICogQSBsaXN0IG9mIHBhcnNlZCBsaW5rcyB0byBhcHBlbmQgdGhlIGV4dHJhY3RlZCB0ZXh0IGxpbmtzIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgdGV4dExpbmtzOiBQYXJzZUxpbmtSZXN1bHRbXTtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBoYXNBbmdsZUJyYWNrZXRzSW5MaW5rfS5cbiAqL1xuaW50ZXJmYWNlIEhhc0FuZ2xlQnJhY2tldHNJbkxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQSByYXcgbGluayB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgcmF3IFVSTCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHJhd1VybDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgV2lraUxpbmtOb2RlIGV4dGVuZHMgTm9kZSB7XG4gIGRhdGE6IFdpa2lMaW5rTm9kZURhdGE7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBXaWtpTGlua05vZGVEYXRhIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBhbGlhczogc3RyaW5nO1xufVxuXG5jbGFzcyBGcm9udG1hdHRlckxpbmtzUGFyc2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBmcm9udG1hdHRlckV4dGVybmFsTGlua3M6IFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBtdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBtdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rczogUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VXaXRoT2Zmc2V0c1tdID0gW107XG5cbiAgcHVibGljIHBhcnNlKGZyb250bWF0dGVyOiB1bmtub3duKTogUGFyc2VGcm9udG1hdHRlckxpbmtzUmVzdWx0IHtcbiAgICB0aGlzLnBhcnNlVmFsdWUoZnJvbnRtYXR0ZXIsICcnKTtcbiAgICByZXR1cm4ge1xuICAgICAgZnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0aGlzLmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIG11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHRoaXMubXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIG11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzOiB0aGlzLm11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2F0ZWdvcml6ZShwYXJhbXM6IENhdGVnb3JpemVGcm9udG1hdHRlckxpbmtQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IGlzU2luZ2xlTGluaywga2V5LCBwYXJzZUxpbmtSZXN1bHQsIHZhbHVlIH0gPSBwYXJhbXM7XG4gICAgaWYgKCFwYXJzZUxpbmtSZXN1bHQuaXNFeHRlcm5hbCAmJiBpc1NpbmdsZUxpbmspIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWZlcmVuY2U6IFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlID0ge1xuICAgICAgZGlzcGxheVRleHQ6IHBhcnNlTGlua1Jlc3VsdC5hbGlhcyA/PyBwYXJzZUxpbmtSZXN1bHQudXJsLFxuICAgICAga2V5LFxuICAgICAgbGluazogcGFyc2VMaW5rUmVzdWx0LnVybCxcbiAgICAgIG9yaWdpbmFsOiB2YWx1ZSxcbiAgICAgIHBhcnNlTGlua1Jlc3VsdFxuICAgIH07XG5cbiAgICBpZiAoaXNTaW5nbGVMaW5rKSB7XG4gICAgICB0aGlzLmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcy5wdXNoKHJlZmVyZW5jZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVmZXJlbmNlV2l0aE9mZnNldHM6IFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlV2l0aE9mZnNldHMgPSB7XG4gICAgICAuLi5yZWZlcmVuY2UsXG4gICAgICBlbmRPZmZzZXQ6IHBhcnNlTGlua1Jlc3VsdC5lbmRPZmZzZXQsXG4gICAgICBzdGFydE9mZnNldDogcGFyc2VMaW5rUmVzdWx0LnN0YXJ0T2Zmc2V0XG4gICAgfTtcblxuICAgIGlmIChwYXJzZUxpbmtSZXN1bHQuaXNFeHRlcm5hbCkge1xuICAgICAgdGhpcy5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLnB1c2gocmVmZXJlbmNlV2l0aE9mZnNldHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzLnB1c2gocmVmZXJlbmNlV2l0aE9mZnNldHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VWYWx1ZSh2YWx1ZTogdW5rbm93biwga2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgcGFyc2VMaW5rUmVzdWx0cyA9IHBhcnNlTGlua3ModmFsdWUpO1xuICAgICAgY29uc3QgaXNTaW5nbGVMaW5rID0gcGFyc2VMaW5rUmVzdWx0c1swXT8ucmF3ID09PSB2YWx1ZTtcbiAgICAgIGZvciAoY29uc3QgcGFyc2VMaW5rUmVzdWx0IG9mIHBhcnNlTGlua1Jlc3VsdHMpIHtcbiAgICAgICAgdGhpcy5jYXRlZ29yaXplKHsgaXNTaW5nbGVMaW5rLCBrZXksIHBhcnNlTGlua1Jlc3VsdCwgdmFsdWUgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtjaGlsZEtleSwgY2hpbGRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUgYXMgR2VuZXJpY09iamVjdCkpIHtcbiAgICAgIHRoaXMucGFyc2VWYWx1ZShjaGlsZFZhbHVlLCBrZXkgPyBgJHtrZXl9LiR7Y2hpbGRLZXl9YCA6IGNoaWxkS2V5KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBFbmNvZGVzIGEgVVJMLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIHRvIGVuY29kZS5cbiAqIEByZXR1cm5zIFRoZSBlbmNvZGVkIFVSTC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiByZXBsYWNlQWxsKHtcbiAgICByZXBsYWNlcjogKHsgc3Vic3RyaW5nOiBzcGVjaWFsTGlua1N5bWJvbCB9KSA9PiBlbmNvZGVVUklDb21wb25lbnQoc3BlY2lhbExpbmtTeW1ib2wpLFxuICAgIHNlYXJjaFZhbHVlOiBTUEVDSUFMX0xJTktfU1lNQk9MU19SRUdFWFAsXG4gICAgc3RyOiB1cmxcbiAgfSk7XG59XG5cbi8qKlxuICogRXNjYXBlcyB0aGUgYWxpYXMgb2YgYSBtYXJrZG93biBsaW5rLlxuICpcbiAqIEBwYXJhbSBhbGlhcyAtIEFuIGFsaWFzIG9mIGEgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIEFuIGVzY2FwZWQgYWxpYXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBlc2NhcGVBbGlhcygnKiphbGlhcyoqJykgLy8gJ1xcXFwqXFxcXCphbGlhc1xcXFwqXFxcXConXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUFsaWFzKGFsaWFzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgcmVwbGFjZXI6ICdcXFxcJCYnLFxuICAgIHNlYXJjaFZhbHVlOiBTUEVDSUFMX01BUktET1dOX0xJTktfU1lNQk9MU19SRUdFWCxcbiAgICBzdHI6IGFsaWFzXG4gIH0pO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHJlZmVyZW5jZSBpcyBhIHtAbGluayBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZX0uXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZSAtIFRoZSByZWZlcmVuY2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHJlZmVyZW5jZSBpcyBhIHtAbGluayBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZX0sIG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZShyZWZlcmVuY2U6IFJlZmVyZW5jZSk6IHJlZmVyZW5jZSBpcyBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZSB7XG4gIHJldHVybiBpc0Zyb250bWF0dGVyTGlua0NhY2hlKHJlZmVyZW5jZSkgJiYgJ3BhcnNlTGlua1Jlc3VsdCcgaW4gcmVmZXJlbmNlO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHJlZmVyZW5jZSBpcyBhIHtAbGluayBQYXJzZUxpbmtSZWZlcmVuY2V9LlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSByZWZlcmVuY2UgaXMgYSB7QGxpbmsgUGFyc2VMaW5rUmVmZXJlbmNlfSwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BhcnNlTGlua1JlZmVyZW5jZShyZWZlcmVuY2U6IFJlZmVyZW5jZSk6IHJlZmVyZW5jZSBpcyBQYXJzZUxpbmtSZWZlcmVuY2Uge1xuICByZXR1cm4gJ3BhcnNlTGlua1Jlc3VsdCcgaW4gcmVmZXJlbmNlO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgbGlua3MgZnJvbSBhIG5vdGUncyBmcm9udG1hdHRlci4gRWFjaCBzdHJpbmcgdmFsdWUgaXMgcGFyc2VkIHZpYSB7QGxpbmsgcGFyc2VMaW5rc306IGEgdmFsdWVcbiAqIHRoYXQgaXMgYSBzaW5nbGUgbGluayB5aWVsZHMgYW4gZW50cnkgd2l0aG91dCBvZmZzZXRzLCBhbmQgYSB2YWx1ZSB0aGF0IGhvbGRzIG11bHRpcGxlIGxpbmtzIHlpZWxkc1xuICogb2Zmc2V0LWNhcnJ5aW5nIGVudHJpZXMuIEludGVybmFsIHNpbmdsZS1saW5rIHZhbHVlcyBhcmUgb21pdHRlZCwgYXMgT2JzaWRpYW4gbmF0aXZlbHkgY2FjaGVzIHRoZW0uXG4gKlxuICogQHBhcmFtIGZyb250bWF0dGVyIC0gVGhlIGZyb250bWF0dGVyIHRvIHBhcnNlIChhIHZhbHVlLCBvYmplY3QsIG9yIGFycmF5KS5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgZnJvbnRtYXR0ZXIgbGlua3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZyb250bWF0dGVyTGlua3MoZnJvbnRtYXR0ZXI6IHVua25vd24pOiBQYXJzZUZyb250bWF0dGVyTGlua3NSZXN1bHQge1xuICByZXR1cm4gbmV3IEZyb250bWF0dGVyTGlua3NQYXJzZXIoKS5wYXJzZShmcm9udG1hdHRlcik7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgbGluayBpbnRvIGl0cyBjb21wb25lbnRzLlxuICpcbiAqIEBwYXJhbSBzdHIgLSBUaGUgbGluayB0byBwYXJzZS5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGluayhzdHI6IHN0cmluZyk6IG51bGwgfCBQYXJzZUxpbmtSZXN1bHQge1xuICBjb25zdCBsaW5rcyA9IHBhcnNlTGlua3Moc3RyKTtcbiAgcmV0dXJuIGxpbmtzWzBdPy5yYXcgPT09IHN0ciA/IGxpbmtzWzBdIDogbnVsbDtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYWxsIGxpbmtzIGluIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBzdHIgLSBUaGUgc3RyaW5nIHRvIHBhcnNlIHRoZSBsaW5rcyBpbi5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgbGlua3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpbmtzKHN0cjogc3RyaW5nKTogUGFyc2VMaW5rUmVzdWx0W10ge1xuICBjb25zdCBlbWJlZFN5bWJvbE9mZnNldHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICBjb25zdCBFTUJFRF9MSU5LX1BSRUZJWCA9ICchWyc7XG4gIGNvbnN0IE5PX0VNQkVEX0xJTktfUFJFRklYID0gJ0BbJztcbiAgY29uc3QgRFVNTVlfQ0hBUkFDVEVSID0gJ0AnO1xuXG4gIGNvbnN0IEVNQkVEX0lOU0lERV9MSU5LX1JFR19FWFAgPSAvXFxbKD88TGlua0FsaWFzPiFcXFsuKj9cXF1cXCguKz9cXCkpXFxdXFwoKD88TGluaz4uKz8pXFwpL2c7XG4gIGNvbnN0IG5vSW5zaWRlRW1iZWRzTGlua3NTdHIgPSByZXBsYWNlQWxsKHtcbiAgICByZXBsYWNlcjogKHsgY2FwdHVyZWRHcm91cEFyZ3M6IFtsaW5rQWxpYXMgPSAnJywgbGluayA9ICcnXSB9KSA9PiB7XG4gICAgICBjb25zdCBkdW1teUFsaWFzID0gRFVNTVlfQ0hBUkFDVEVSLnJlcGVhdChsaW5rQWxpYXMubGVuZ3RoKTtcbiAgICAgIHJldHVybiBgWyR7ZHVtbXlBbGlhc31dKCR7bGlua30pYDtcbiAgICB9LFxuICAgIHNlYXJjaFZhbHVlOiBFTUJFRF9JTlNJREVfTElOS19SRUdfRVhQLFxuICAgIHN0clxuICB9KTtcblxuICBjb25zdCBub0VtYmVkU3RyID0gcmVwbGFjZUFsbCh7XG4gICAgcmVwbGFjZXI6IChhcmdzKSA9PiB7XG4gICAgICBlbWJlZFN5bWJvbE9mZnNldHMuYWRkKGFyZ3Mub2Zmc2V0KTtcbiAgICAgIHJldHVybiBOT19FTUJFRF9MSU5LX1BSRUZJWDtcbiAgICB9LFxuICAgIHNlYXJjaFZhbHVlOiBFTUJFRF9MSU5LX1BSRUZJWCxcbiAgICBzdHI6IG5vSW5zaWRlRW1iZWRzTGlua3NTdHJcbiAgfSk7XG5cbiAgY29uc3QgcHJvY2Vzc29yID0gcmVtYXJrKCkudXNlKHJlbWFya1BhcnNlKS51c2Uod2lraUxpbmtQbHVnaW4sIHsgYWxpYXNEaXZpZGVyOiBXSUtJTElOS19ESVZJREVSIH0pO1xuICBjb25zdCByb290ID0gcHJvY2Vzc29yLnBhcnNlKG5vRW1iZWRTdHIpO1xuXG4gIGNvbnN0IGxpbmtzOiBQYXJzZUxpbmtSZXN1bHRbXSA9IFtdO1xuICBjb25zdCB0ZXh0TGlua3M6IFBhcnNlTGlua1Jlc3VsdFtdID0gW107XG5cbiAgdmlzaXQocm9vdCwgKG5vZGU6IE5vZGUpID0+IHtcbiAgICBsZXQgbGluazogUGFyc2VMaW5rUmVzdWx0O1xuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlICdsaW5rJzpcbiAgICAgICAgbGluayA9IHBhcnNlTGlua05vZGUobm9kZSBhcyBMaW5rLCBzdHIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3dpa2lMaW5rJzpcbiAgICAgICAgbGluayA9IHBhcnNlV2lraWxpbmtOb2RlKG5vZGUgYXMgV2lraUxpbmtOb2RlLCBzdHIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZW1iZWRTeW1ib2xPZmZzZXRzLmhhcyhsaW5rLnN0YXJ0T2Zmc2V0IC0gMSkpIHtcbiAgICAgIGxpbmsgPSB7XG4gICAgICAgIC4uLmxpbmssXG4gICAgICAgIGlzRW1iZWQ6IHRydWUsXG4gICAgICAgIHJhdzogYCEke2xpbmsucmF3fWAsXG4gICAgICAgIHN0YXJ0T2Zmc2V0OiBsaW5rLnN0YXJ0T2Zmc2V0IC0gMVxuICAgICAgfTtcbiAgICB9XG4gICAgbGlua3MucHVzaChsaW5rKTtcbiAgfSk7XG5cbiAgbGlua3Muc29ydCgoYSwgYikgPT4gYS5zdGFydE9mZnNldCAtIGIuc3RhcnRPZmZzZXQpO1xuXG4gIGxldCB0ZXh0U3RhcnRPZmZzZXQgPSAwO1xuXG4gIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgIGV4dHJhY3RUZXh0TGlua3Moe1xuICAgICAgZW5kT2Zmc2V0OiBsaW5rLnN0YXJ0T2Zmc2V0IC0gMSxcbiAgICAgIHN0YXJ0T2Zmc2V0OiB0ZXh0U3RhcnRPZmZzZXQsXG4gICAgICBzdHIsXG4gICAgICB0ZXh0TGlua3NcbiAgICB9KTtcbiAgICB0ZXh0U3RhcnRPZmZzZXQgPSBsaW5rLmVuZE9mZnNldCArIDE7XG4gIH1cblxuICBleHRyYWN0VGV4dExpbmtzKHtcbiAgICBlbmRPZmZzZXQ6IHN0ci5sZW5ndGggLSAxLFxuICAgIHN0YXJ0T2Zmc2V0OiB0ZXh0U3RhcnRPZmZzZXQsXG4gICAgc3RyLFxuICAgIHRleHRMaW5rc1xuICB9KTtcblxuICBsaW5rcy5wdXNoKC4uLnRleHRMaW5rcyk7XG4gIGxpbmtzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnRPZmZzZXQgLSBiLnN0YXJ0T2Zmc2V0KTtcblxuICByZXR1cm4gbGlua3M7XG59XG5cbi8qKlxuICogV3JhcHMgYSB7QGxpbmsgUGFyc2VMaW5rUmVzdWx0fSBpbnRvIGEge0BsaW5rIFBhcnNlTGlua1JlZmVyZW5jZX0gc28gaXQgY2FuIGZsb3cgdGhyb3VnaCB0aGVcbiAqIHJlZmVyZW5jZS1iYXNlZCBmaWxlLWNoYW5nZSBwaXBlbGluZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHdyYXBwaW5nIHRoZSBwYXJzZWQgbGluay5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGFyc2VMaW5rUmVmZXJlbmNlfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUGFyc2VMaW5rUmVmZXJlbmNlKHBhcmFtczogVG9QYXJzZUxpbmtSZWZlcmVuY2VQYXJhbXMpOiBQYXJzZUxpbmtSZWZlcmVuY2Uge1xuICBjb25zdCB7IGNvbnRlbnQsIHBhcnNlTGlua1Jlc3VsdCB9ID0gcGFyYW1zO1xuICBjb25zdCByZWZlcmVuY2U6IFBhcnNlTGlua1JlZmVyZW5jZSA9IHtcbiAgICBsaW5rOiBwYXJzZUxpbmtSZXN1bHQudXJsLFxuICAgIG9yaWdpbmFsOiBwYXJzZUxpbmtSZXN1bHQucmF3LFxuICAgIHBhcnNlTGlua1Jlc3VsdCxcbiAgICBwb3NpdGlvbjoge1xuICAgICAgZW5kOiBvZmZzZXRUb0xvYyhjb250ZW50LCBwYXJzZUxpbmtSZXN1bHQuZW5kT2Zmc2V0KSxcbiAgICAgIHN0YXJ0OiBvZmZzZXRUb0xvYyhjb250ZW50LCBwYXJzZUxpbmtSZXN1bHQuc3RhcnRPZmZzZXQpXG4gICAgfVxuICB9O1xuXG4gIGlmIChwYXJzZUxpbmtSZXN1bHQuYWxpYXMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJlZmVyZW5jZS5kaXNwbGF5VGV4dCA9IHBhcnNlTGlua1Jlc3VsdC5hbGlhcztcbiAgfVxuXG4gIHJldHVybiByZWZlcmVuY2U7XG59XG5cbi8qKlxuICogVW5lc2NhcGVzIHRoZSBhbGlhcyBvZiBhIG1hcmtkb3duIGxpbmsuXG4gKlxuICogQHBhcmFtIGVzY2FwZWRBbGlhcyAtIEFuIGVzY2FwZWQgYWxpYXMuXG4gKiBAcmV0dXJucyBBbiB1bmVzY2FwZWQgYWxpYXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiB1bmVzY2FwZUFsaWFzKCdcXFxcKlxcXFwqYWxpYXNcXFxcKlxcXFwqJykgLy8gJyoqYWxpYXMqKidcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5lc2NhcGVBbGlhcyhlc2NhcGVkQWxpYXM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiByZXBsYWNlQWxsKHtcbiAgICByZXBsYWNlcjogKHsgY2FwdHVyZWRHcm91cEFyZ3M6IFtiYWNrc2xhc2hlcyA9ICcnLCBzcGVjaWFsQ2hhciA9ICcnXSB9KSA9PiB7XG4gICAgICBjb25zdCBFU0NBUEVEX0JBQ0tTTEFTSF9MRU5HVEggPSAyO1xuICAgICAgY29uc3QgYmFja3NsYXNoQ291bnQgPSBiYWNrc2xhc2hlcy5sZW5ndGg7XG4gICAgICBjb25zdCBrZWVwQ291bnQgPSBNYXRoLmZsb29yKGJhY2tzbGFzaENvdW50IC8gRVNDQVBFRF9CQUNLU0xBU0hfTEVOR1RIKTtcbiAgICAgIHJldHVybiAnXFxcXCcucmVwZWF0KGtlZXBDb3VudCkgKyBzcGVjaWFsQ2hhcjtcbiAgICB9LFxuICAgIHNlYXJjaFZhbHVlOiAvKD88QmFja3NsYXNoZXM+XFxcXCspKD88U3BlY2lhbENoYXJhY3Rlcj5bIVwiIyQlJicoKSorLC0uLzo7PD0+P0BbXFxcXFxcXV5fYHt8fX5dKS9nLFxuICAgIHN0cjogZXNjYXBlZEFsaWFzXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVVcmxTYWZlbHkocGFyYW1zOiBEZWNvZGVVcmxTYWZlbHlQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGhhc0FuZ2xlQnJhY2tldHMsIGlzRXh0ZXJuYWwsIHVybCB9ID0gcGFyYW1zO1xuICAvLyBgZmlsZTovL2AgVVJMcyBhcmUgZXh0ZXJuYWwsIGJ1dCB0aGVpciBwZXJjZW50LWVuY29kaW5nIGlzIHB1cmVseSBjb3NtZXRpYywgc28gZGVjb2RlIHRoZW0gbGlrZVxuICAvLyBJbnRlcm5hbCBsaW5rcy4gRXZlcnkgb3RoZXIgZXh0ZXJuYWwgVVJMIGlzIGxlZnQgdW50b3VjaGVkIChpdHMgZW5jb2RpbmcgbWF5IGJlIHNpZ25pZmljYW50KS5cbiAgaWYgKChpc0V4dGVybmFsIHx8IGhhc0FuZ2xlQnJhY2tldHMpICYmICFpc0ZpbGVVcmwodXJsKSkge1xuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodXJsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZGVjb2RlIFVSTCAke3VybH1gLCBlcnJvcik7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0QWxpYXMocGFyYW1zOiBFeHRyYWN0QWxpYXNQYXJhbXMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IGFsaWFzRW5kT2Zmc2V0LCBhbGlhc1N0YXJ0T2Zmc2V0LCBzdHIgfSA9IHBhcmFtcztcbiAgcmV0dXJuIGFsaWFzU3RhcnRPZmZzZXQgPCBhbGlhc0VuZE9mZnNldFxuICAgID8gc3RyLnNsaWNlKGFsaWFzU3RhcnRPZmZzZXQsIGFsaWFzRW5kT2Zmc2V0KVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0VGV4dExpbmtzKHBhcmFtczogRXh0cmFjdFRleHRMaW5rc1BhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7IGVuZE9mZnNldCwgc3RhcnRPZmZzZXQsIHN0ciwgdGV4dExpbmtzIH0gPSBwYXJhbXM7XG4gIGlmIChzdGFydE9mZnNldCA+IGVuZE9mZnNldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHRleHRQYXJ0ID0gc3RyLnNsaWNlKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgKyAxKTtcbiAgcmVwbGFjZUFsbCh7XG4gICAgcmVwbGFjZXI6ICh7IGNhcHR1cmVkR3JvdXBBcmdzOiBbcmF3VXJsID0gJyddLCBvZmZzZXQgfSkgPT4ge1xuICAgICAgaWYgKCFpc1VybChyYXdVcmwpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRGVjb2RlIGJhcmUgYGZpbGU6Ly9gIFVSTHMgbGlrZSB0aGUgYnJhY2tldGVkIHBhdGggKGBwYXJzZUxpbmtOb2RlYCkgZG9lcy5cbiAgICAgIC8vIE9mZnNldHMgYW5kIGByYXdgIHN0YXkgYmFzZWQgb24gdGhlIG9yaWdpbmFsIChwb3NzaWJseSBwZXJjZW50LWVuY29kZWQpIHRleHQuXG4gICAgICBjb25zdCB1cmwgPSBkZWNvZGVVcmxTYWZlbHkoe1xuICAgICAgICBoYXNBbmdsZUJyYWNrZXRzOiBmYWxzZSxcbiAgICAgICAgaXNFeHRlcm5hbDogdHJ1ZSxcbiAgICAgICAgdXJsOiByYXdVcmxcbiAgICAgIH0pO1xuICAgICAgdGV4dExpbmtzLnB1c2goe1xuICAgICAgICBlbmNvZGVkVXJsOiBlbmNvZGVVcmwodXJsKSxcbiAgICAgICAgZW5kT2Zmc2V0OiBzdGFydE9mZnNldCArIG9mZnNldCArIHJhd1VybC5sZW5ndGgsXG4gICAgICAgIGhhc0FuZ2xlQnJhY2tldHM6IGZhbHNlLFxuICAgICAgICBpc0VtYmVkOiBmYWxzZSxcbiAgICAgICAgaXNFeHRlcm5hbDogdHJ1ZSxcbiAgICAgICAgaXNGaWxlVXJsOiBpc0ZpbGVVcmwodXJsKSxcbiAgICAgICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgICAgIHJhdzogcmF3VXJsLFxuICAgICAgICBzdGFydE9mZnNldDogc3RhcnRPZmZzZXQgKyBvZmZzZXQsXG4gICAgICAgIHVybFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBzZWFyY2hWYWx1ZTogLyg/PFVybD5cXFMrKS9nLFxuICAgIHN0cjogdGV4dFBhcnRcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJhd0xpbmsobm9kZTogTm9kZSwgc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwb3MgPSBlbnN1cmVOb25OdWxsYWJsZShub2RlLnBvc2l0aW9uKTtcbiAgcmV0dXJuIHN0ci5zbGljZShwb3Muc3RhcnQub2Zmc2V0LCBwb3MuZW5kLm9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIGhhc0FuZ2xlQnJhY2tldHNJbkxpbmsocGFyYW1zOiBIYXNBbmdsZUJyYWNrZXRzSW5MaW5rUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgcmF3LCByYXdVcmwgfSA9IHBhcmFtcztcbiAgY29uc3QgT1BFTl9BTkdMRV9CUkFDS0VUID0gJzwnO1xuICByZXR1cm4gcmF3LnN0YXJ0c1dpdGgoT1BFTl9BTkdMRV9CUkFDS0VUKSB8fCByYXdVcmwuc3RhcnRzV2l0aChPUEVOX0FOR0xFX0JSQUNLRVQpO1xufVxuXG5mdW5jdGlvbiBvZmZzZXRUb0xvYyhjb250ZW50OiBzdHJpbmcsIG9mZnNldDogbnVtYmVyKTogTG9jIHtcbiAgY29uc3QgcHJlY2VkaW5nQ29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgb2Zmc2V0KTtcbiAgY29uc3QgbGluZSA9IChwcmVjZWRpbmdDb250ZW50Lm1hdGNoKC9cXG4vZykgPz8gW10pLmxlbmd0aDtcbiAgY29uc3QgbGFzdE5ld2xpbmVPZmZzZXQgPSBwcmVjZWRpbmdDb250ZW50Lmxhc3RJbmRleE9mKCdcXG4nKTtcbiAgcmV0dXJuIHtcbiAgICBjb2w6IG9mZnNldCAtIChsYXN0TmV3bGluZU9mZnNldCArIDEpLFxuICAgIGxpbmUsXG4gICAgb2Zmc2V0XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlTGlua05vZGUobm9kZTogTGluaywgc3RyOiBzdHJpbmcpOiBQYXJzZUxpbmtSZXN1bHQge1xuICBjb25zdCBMSU5LX0FMSUFTX1NVRkZJWCA9ICddKCc7XG4gIGNvbnN0IExJTktfU1VGRklYID0gJyknO1xuICBjb25zdCByYXcgPSBnZXRSYXdMaW5rKG5vZGUsIHN0cik7XG4gIGNvbnN0IGFsaWFzTm9kZVN0YXJ0T2Zmc2V0ID0gbm9kZS5jaGlsZHJlblswXT8ucG9zaXRpb24/LnN0YXJ0Lm9mZnNldCA/PyAxO1xuICBjb25zdCBhbGlhc05vZGVFbmRPZmZzZXQgPSBub2RlLmNoaWxkcmVuLmF0KC0xKT8ucG9zaXRpb24/LmVuZC5vZmZzZXQgPz8gMTtcbiAgY29uc3QgcG9zaXRpb24gPSBlbnN1cmVOb25OdWxsYWJsZShub2RlLnBvc2l0aW9uKTtcbiAgY29uc3Qgbm9kZUVuZE9mZnNldCA9IGVuc3VyZU5vbk51bGxhYmxlKHBvc2l0aW9uLmVuZC5vZmZzZXQpO1xuICBjb25zdCBub2RlU3RhcnRPZmZzZXQgPSBlbnN1cmVOb25OdWxsYWJsZShwb3NpdGlvbi5zdGFydC5vZmZzZXQpO1xuICBjb25zdCByYXdVcmwgPSBzdHIuc2xpY2UoYWxpYXNOb2RlRW5kT2Zmc2V0ICsgTElOS19BTElBU19TVUZGSVgubGVuZ3RoLCBub2RlRW5kT2Zmc2V0IC0gTElOS19TVUZGSVgubGVuZ3RoKTtcbiAgY29uc3QgaGFzQW5nbGVCcmFja2V0cyA9IGhhc0FuZ2xlQnJhY2tldHNJbkxpbmsoe1xuICAgIHJhdyxcbiAgICByYXdVcmxcbiAgfSk7XG4gIGNvbnN0IGlzRXh0ZXJuYWwgPSBpc1VybChub2RlLnVybCk7XG4gIGNvbnN0IHVybCA9IGRlY29kZVVybFNhZmVseSh7XG4gICAgaGFzQW5nbGVCcmFja2V0cyxcbiAgICBpc0V4dGVybmFsLFxuICAgIHVybDogbm9kZS51cmxcbiAgfSk7XG4gIGNvbnN0IGFsaWFzID0gZXh0cmFjdEFsaWFzKHtcbiAgICBhbGlhc0VuZE9mZnNldDogYWxpYXNOb2RlRW5kT2Zmc2V0LFxuICAgIGFsaWFzU3RhcnRPZmZzZXQ6IGFsaWFzTm9kZVN0YXJ0T2Zmc2V0LFxuICAgIHN0clxuICB9KTtcbiAgcmV0dXJuIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQYXJzZUxpbmtSZXN1bHQ+KHtcbiAgICBhbGlhcyxcbiAgICBlbmNvZGVkVXJsOiBpc0V4dGVybmFsID8gZW5jb2RlVXJsKHVybCkgOiB1bmRlZmluZWQsXG4gICAgZW5kT2Zmc2V0OiBub2RlRW5kT2Zmc2V0LFxuICAgIGhhc0FuZ2xlQnJhY2tldHMsXG4gICAgaXNFbWJlZDogZmFsc2UsXG4gICAgaXNFeHRlcm5hbCxcbiAgICBpc0ZpbGVVcmw6IGlzRmlsZVVybCh1cmwpLFxuICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgIHJhdyxcbiAgICBzdGFydE9mZnNldDogbm9kZVN0YXJ0T2Zmc2V0LFxuICAgIHRpdGxlOiBub2RlLnRpdGxlID8/IHVuZGVmaW5lZCxcbiAgICB1bmVzY2FwZWRBbGlhczogYWxpYXMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHVuZXNjYXBlQWxpYXMoYWxpYXMpLFxuICAgIHVybFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VXaWtpbGlua05vZGUobm9kZTogV2lraUxpbmtOb2RlLCBzdHI6IHN0cmluZyk6IFBhcnNlTGlua1Jlc3VsdCB7XG4gIGNvbnN0IHBvc2l0aW9uID0gZW5zdXJlTm9uTnVsbGFibGUobm9kZS5wb3NpdGlvbik7XG4gIHJldHVybiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGFyc2VMaW5rUmVzdWx0Pih7XG4gICAgYWxpYXM6IHN0ci5pbmNsdWRlcyhXSUtJTElOS19ESVZJREVSKSA/IG5vZGUuZGF0YS5hbGlhcyA6IHVuZGVmaW5lZCxcbiAgICBlbmRPZmZzZXQ6IGVuc3VyZU5vbk51bGxhYmxlKHBvc2l0aW9uLmVuZC5vZmZzZXQpLFxuICAgIGlzRW1iZWQ6IGZhbHNlLFxuICAgIGlzRXh0ZXJuYWw6IGZhbHNlLFxuICAgIGlzRmlsZVVybDogZmFsc2UsXG4gICAgaXNXaWtpbGluazogdHJ1ZSxcbiAgICByYXc6IGdldFJhd0xpbmsobm9kZSwgc3RyKSxcbiAgICBzdGFydE9mZnNldDogZW5zdXJlTm9uTnVsbGFibGUocG9zaXRpb24uc3RhcnQub2Zmc2V0KSxcbiAgICB1cmw6IG5vZGUudmFsdWVcbiAgfSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQSxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLGNBQWM7QUFDdkIsT0FBTyxpQkFBaUI7QUFDeEIsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxhQUFhO0FBSXRCLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMseUJBQXlCO0FBQ2xDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBTVAsTUFBTSw4QkFBOEI7QUFLcEMsTUFBTSxzQ0FBc0M7QUFFNUMsTUFBTSxtQkFBbUI7QUFrVXpCLE1BQU0sdUJBQXVCO0FBQUEsRUFDViwyQkFBNEQsQ0FBQztBQUFBLEVBQzdELHFDQUFpRixDQUFDO0FBQUEsRUFDbEYsNkJBQXlFLENBQUM7QUFBQSxFQUVwRixNQUFNLGFBQW1EO0FBQzlELFNBQUssV0FBVyxhQUFhLEVBQUU7QUFDL0IsV0FBTztBQUFBLE1BQ0wsMEJBQTBCLEtBQUs7QUFBQSxNQUMvQixvQ0FBb0MsS0FBSztBQUFBLE1BQ3pDLDRCQUE0QixLQUFLO0FBQUEsSUFDbkM7QUFBQSxFQUNGO0FBQUEsRUFFUSxXQUFXLFFBQStDO0FBQ2hFLFVBQU0sRUFBRSxjQUFjLEtBQUssaUJBQWlCLE1BQU0sSUFBSTtBQUN0RCxRQUFJLENBQUMsZ0JBQWdCLGNBQWMsY0FBYztBQUMvQztBQUFBLElBQ0Y7QUFFQSxVQUFNLFlBQTJDO0FBQUEsTUFDL0MsYUFBYSxnQkFBZ0IsU0FBUyxnQkFBZ0I7QUFBQSxNQUN0RDtBQUFBLE1BQ0EsTUFBTSxnQkFBZ0I7QUFBQSxNQUN0QixVQUFVO0FBQUEsTUFDVjtBQUFBLElBQ0Y7QUFFQSxRQUFJLGNBQWM7QUFDaEIsV0FBSyx5QkFBeUIsS0FBSyxTQUFTO0FBQzVDO0FBQUEsSUFDRjtBQUVBLFVBQU0sdUJBQWlFO0FBQUEsTUFDckUsR0FBRztBQUFBLE1B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
|
|
@@ -23,7 +23,7 @@ export type PluginEventSource = AsyncEventSource<PluginEventMap>;
|
|
|
23
23
|
* Plugin event source implementation.
|
|
24
24
|
*/
|
|
25
25
|
export declare class PluginEventSourceImpl implements PluginEventSource {
|
|
26
|
-
|
|
26
|
+
protected readonly plugin: PluginBase;
|
|
27
27
|
/**
|
|
28
28
|
* Creates a new plugin event source.
|
|
29
29
|
*
|
|
@@ -108,4 +108,4 @@ class PluginEventSourceImpl {
|
|
|
108
108
|
export {
|
|
109
109
|
PluginEventSourceImpl
|
|
110
110
|
};
|
|
111
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9wbHVnaW4tZXZlbnQtc291cmNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwbHVnaW4gZXZlbnQgc291cmNlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgQXN5bmNFdmVudFJlZixcbiAgQXN5bmNFdmVudFNvdXJjZVxufSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHR5cGUgeyBTdHJpbmdLZXlzIH0gZnJvbSAnLi4vLi4vdHlwZS50cyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbkJhc2UgfSBmcm9tICcuL3BsdWdpbi50cyc7XG5cbi8qKlxuICogRXZlbnQgbWFwIGZvciBwbHVnaW4gZXZlbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkV2ZW50TWFwIHtcbiAgLyoqIEZpcmVkIHdoZW4gcGx1Z2luIHNldHRpbmdzIGFyZSBjaGFuZ2VkIGV4dGVybmFsbHkgKGUuZy4gc3luYywgbWFudWFsIGZpbGUgZWRpdCkuICovXG4gIGV4dGVybmFsU2V0dGluZ3NDaGFuZ2U6IFtdO1xufVxuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBmb3IgcGx1Z2luIGV2ZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgUGx1Z2luRXZlbnRTb3VyY2UgPSBBc3luY0V2ZW50U291cmNlPFBsdWdpbkV2ZW50TWFwPjtcblxuLyoqXG4gKiBQbHVnaW4gZXZlbnQgc291cmNlIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luRXZlbnRTb3VyY2VJbXBsIGltcGxlbWVudHMgUGx1Z2luRXZlbnRTb3VyY2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gZXZlbnQgc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHBsdWdpbiB0byBjcmVhdGUgdGhlIGV2ZW50IHNvdXJjZSBmb3IuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luQmFzZSkge31cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmdzIC0gVGhlIGFyZ3VtZW50cyBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gcmVtb3ZlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub2ZmKCdteS1ldmVudCcsIG15TGlzdGVuZXIpO1xuICAgKiBgYGBcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICBwdWJsaWMgb2ZmPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luRXZlbnRNYXA+LCBBcmdzIGV4dGVuZHMgRXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5FdmVudE1hcD4gPyBQbHVnaW5FdmVudE1hcFtFdmVudE5hbWVdIDogdW5rbm93bltdPihcbiAgICBuYW1lOiBFdmVudE5hbWUsXG4gICAgY2FsbGJhY2s6ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+XG4gICk6IHZvaWQge1xuICAgIHRoaXMucGx1Z2luLm9mZihuYW1lLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGJ5IHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIHJlZmVyZW5jZSB0byByZW1vdmUuXG4gICAqL1xuICBwdWJsaWMgb2ZmcmVmKGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmKTogdm9pZCB7XG4gICAgdGhpcy5wbHVnaW4ub2ZmcmVmKGV2ZW50UmVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3MgLSBUaGUgYXJndW1lbnRzIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICogQHBhcmFtIHRoaXNBcmcgLSBUaGUgY29udGV4dCBwYXNzZWQgYXMgYHRoaXNgIHRvIHRoZSBgY2FsbGJhY2tgLlxuICAgKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEByZW1hcmtzIE5vdCByZWZhY3RvcmVkIHRvIHBhcmFtZXRlci1vYmplY3QgcGF0dGVybiwgdG8ga2VlcCB0aGUgcGFyaXR5IHdpdGgge0BsaW5rIG9ic2lkaWFuI0V2ZW50cyNvbn0gKG9yIG9uY2UsIGNvcnJlc3BvbmRpbmdseSkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vbignbXktZXZlbnQnLCBhc3luYyAoYXJnMSwgYXJnMikgPT4ge1xuICAgKiAgICAgYXdhaXQgc2xlZXAoMTAwKTtcbiAgICogICAgIGNvbnNvbGUubG9nKGFyZzEsIGFyZzIpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHVibGljIG9uPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luRXZlbnRNYXA+LCBBcmdzIGV4dGVuZHMgRXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5FdmVudE1hcD4gPyBQbHVnaW5FdmVudE1hcFtFdmVudE5hbWVdIDogdW5rbm93bltdPihcbiAgICBuYW1lOiBFdmVudE5hbWUsXG4gICAgY2FsbGJhY2s6ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICAgIHRoaXNBcmc/OiB1bmtub3duXG4gICk6IEFzeW5jRXZlbnRSZWYge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbi5vbihuYW1lLCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgb25seSBvbmNlLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmdzIC0gVGhlIGFyZ3VtZW50cyBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAqIEBwYXJhbSB0aGlzQXJnIC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIHtAbGluayBvYnNpZGlhbiNFdmVudHMjb259IChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub25jZSgnbXktZXZlbnQnLCBhc3luYyAoYXJnMSwgYXJnMikgPT4ge1xuICAgKiAgICAgYXdhaXQgc2xlZXAoMTAwKTtcbiAgICogICAgIGNvbnNvbGUubG9nKGFyZzEsIGFyZzIpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHVibGljIG9uY2U8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5FdmVudE1hcD4sIEFyZ3MgZXh0ZW5kcyBFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpbkV2ZW50TWFwPiA/IFBsdWdpbkV2ZW50TWFwW0V2ZW50TmFtZV0gOiB1bmtub3duW10+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgdGhpc0FyZz86IHVua25vd25cbiAgKTogQXN5bmNFdmVudFJlZiB7XG4gICAgcmV0dXJuIHRoaXMucGx1Z2luLm9uY2UobmFtZSwgY2FsbGJhY2ssIHRoaXNBcmcpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQStCTyxNQUFNLHNCQUFtRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU12RCxZQUErQixRQUFvQjtBQUFwQjtBQUFBLEVBQXFCO0FBQUEsRUFBckI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFnQi9CLElBQ0wsTUFDQSxVQUNNO0FBQ04sU0FBSyxPQUFPLElBQUksTUFBTSxRQUFRO0FBQUEsRUFDaEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxPQUFPLFVBQStCO0FBQzNDLFNBQUssT0FBTyxPQUFPLFFBQVE7QUFBQSxFQUM3QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBdUJPLEdBQ0wsTUFDQSxVQUNBLFNBQ2U7QUFDZixXQUFPLEtBQUssT0FBTyxHQUFHLE1BQU0sVUFBVSxPQUFPO0FBQUEsRUFDL0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXVCTyxLQUNMLE1BQ0EsVUFDQSxTQUNlO0FBQ2YsV0FBTyxLQUFLLE9BQU8sS0FBSyxNQUFNLFVBQVUsT0FBTztBQUFBLEVBQ2pEO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -47,7 +47,7 @@ type PluginCliHandlerRegistrarRegisterCliHandlerParams = CliHandlerRegistrarRegi
|
|
|
47
47
|
* CLI handler registrar in an Obsidian plugin.
|
|
48
48
|
*/
|
|
49
49
|
export declare class PluginCliHandlerRegistrar implements CliHandlerRegistrar {
|
|
50
|
-
|
|
50
|
+
protected readonly plugin: Plugin;
|
|
51
51
|
/**
|
|
52
52
|
* Creates a new instance of the {@link PluginCliHandlerRegistrar} class.
|
|
53
53
|
*
|
|
@@ -45,4 +45,4 @@ class PluginCliHandlerRegistrar {
|
|
|
45
45
|
export {
|
|
46
46
|
PluginCliHandlerRegistrar
|
|
47
47
|
};
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi1jbGktaGFuZGxlci1yZWdpc3RyYXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDTEkgaGFuZGxlciByZWdpc3RyYXJzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ2xpRGF0YSxcbiAgQ2xpRmxhZ3Ncbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBub3JtYWxpemVQcm9taXNhYmxlIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuXG4vKipcbiAqIFJlZ2lzdGVycyBDTEkgaGFuZGxlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpSGFuZGxlclJlZ2lzdHJhciB7XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBDTEkgaGFuZGxlci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgQ0xJIGhhbmRsZXIgcmVnaXN0cmF0aW9uLlxuICAgKi9cbiAgcmVnaXN0ZXJDbGlIYW5kbGVyKHBhcmFtczogQ2xpSGFuZGxlclJlZ2lzdHJhclJlZ2lzdGVyQ2xpSGFuZGxlclBhcmFtcyk6IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgcmVnaXN0ZXJpbmcgYSBDTEkgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGlIYW5kbGVyUmVnaXN0cmFyUmVnaXN0ZXJDbGlIYW5kbGVyUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21tYW5kIHRvIHJlZ2lzdGVyIHRoZSBoYW5kbGVyIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZsYWdzIGZvciB0aGUgY29tbWFuZC5cbiAgICovXG4gIHJlYWRvbmx5IGZsYWdzOiBDbGlGbGFncyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBoYW5kbGVyIHRvIHJlZ2lzdGVyLlxuICAgKlxuICAgKiBAcGFyYW0gY2xpRGF0YSAtIFRoZSBkYXRhIHBhc3NlZCB0byB0aGUgaGFuZGxlci5cbiAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgaGFuZGxlci5cbiAgICovXG4gIGhhbmRsZXIoY2xpRGF0YTogQ2xpRGF0YSk6IFByb21pc2FibGU8c3RyaW5nPjtcbn1cblxudHlwZSBQbHVnaW5DbGlIYW5kbGVyUmVnaXN0cmFyUmVnaXN0ZXJDbGlIYW5kbGVyUGFyYW1zID0gQ2xpSGFuZGxlclJlZ2lzdHJhclJlZ2lzdGVyQ2xpSGFuZGxlclBhcmFtcztcblxuLyoqXG4gKiBDTEkgaGFuZGxlciByZWdpc3RyYXIgaW4gYW4gT2JzaWRpYW4gcGx1Z2luLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luQ2xpSGFuZGxlclJlZ2lzdHJhciBpbXBsZW1lbnRzIENsaUhhbmRsZXJSZWdpc3RyYXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUge0BsaW5rIFBsdWdpbkNsaUhhbmRsZXJSZWdpc3RyYXJ9IGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luIC0gVGhlIE9ic2lkaWFuIHBsdWdpbiBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW4pIHt9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIENMSSBoYW5kbGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBDTEkgaGFuZGxlciByZWdpc3RyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJDbGlIYW5kbGVyKHBhcmFtczogUGx1Z2luQ2xpSGFuZGxlclJlZ2lzdHJhclJlZ2lzdGVyQ2xpSGFuZGxlclBhcmFtcyk6IHZvaWQge1xuICAgIHRoaXMucGx1Z2luLnJlZ2lzdGVyQ2xpSGFuZGxlcihwYXJhbXMuY29tbWFuZCwgcGFyYW1zLmRlc2NyaXB0aW9uLCBwYXJhbXMuZmxhZ3MsIChjbGlEYXRhKSA9PiBub3JtYWxpemVQcm9taXNhYmxlKHBhcmFtcy5oYW5kbGVyKGNsaURhdGEpKSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBWUEsU0FBUyxjQUFjO0FBRXZCLFNBQVMsMkJBQTJCO0FBK0M3QixNQUFNLDBCQUF5RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU03RCxZQUErQixRQUFnQjtBQUFoQjtBQUFBLEVBQWlCO0FBQUEsRUFBakI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPL0IsbUJBQW1CLFFBQWlFO0FBQ3pGLFNBQUssT0FBTyxtQkFBbUIsT0FBTyxTQUFTLE9BQU8sYUFBYSxPQUFPLE9BQU8sQ0FBQyxZQUFZLG9CQUFvQixPQUFPLFFBQVEsT0FBTyxDQUFDLENBQUM7QUFBQSxFQUM1STtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|