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
|
@@ -91,45 +91,29 @@ import {
|
|
|
91
91
|
} from "./frontmatter-link-cache-with-offsets.mjs";
|
|
92
92
|
import { parseFrontmatter } from "./frontmatter.mjs";
|
|
93
93
|
import { t } from "./i18n/i18n.mjs";
|
|
94
|
+
import {
|
|
95
|
+
parseFrontmatterLinks,
|
|
96
|
+
parseLinks,
|
|
97
|
+
toParseLinkReference
|
|
98
|
+
} from "./parse-link.mjs";
|
|
94
99
|
import { sortReferences } from "./reference.mjs";
|
|
95
100
|
import {
|
|
96
101
|
readSafe,
|
|
97
102
|
saveNote
|
|
98
103
|
} from "./vault.mjs";
|
|
104
|
+
var CachedMetadataExFeature = /* @__PURE__ */ ((CachedMetadataExFeature2) => {
|
|
105
|
+
CachedMetadataExFeature2["ExternalLinks"] = "ExternalLinks";
|
|
106
|
+
CachedMetadataExFeature2["FrontmatterExternalLinks"] = "FrontmatterExternalLinks";
|
|
107
|
+
CachedMetadataExFeature2["MultiValueFrontmatterExternalLinks"] = "MultiValueFrontmatterExternalLinks";
|
|
108
|
+
CachedMetadataExFeature2["MultiValueFrontmatterLinks"] = "MultiValueFrontmatterLinks";
|
|
109
|
+
CachedMetadataExFeature2["Native"] = "Native";
|
|
110
|
+
return CachedMetadataExFeature2;
|
|
111
|
+
})(CachedMetadataExFeature || {});
|
|
99
112
|
async function ensureMetadataCacheReady(app) {
|
|
100
113
|
await new Promise((resolve) => {
|
|
101
114
|
app.metadataCache.onCleanCache(resolve);
|
|
102
115
|
});
|
|
103
116
|
}
|
|
104
|
-
function getAllLinks(cache) {
|
|
105
|
-
let links = [];
|
|
106
|
-
if (cache.links) {
|
|
107
|
-
links.push(...cache.links);
|
|
108
|
-
}
|
|
109
|
-
if (cache.embeds) {
|
|
110
|
-
links.push(...cache.embeds);
|
|
111
|
-
}
|
|
112
|
-
if (cache.frontmatterLinks) {
|
|
113
|
-
links.push(...cache.frontmatterLinks);
|
|
114
|
-
}
|
|
115
|
-
sortReferences(links);
|
|
116
|
-
links = links.filter((link, index) => {
|
|
117
|
-
if (index === 0) {
|
|
118
|
-
return true;
|
|
119
|
-
}
|
|
120
|
-
const previousLink = ensureNonNullable(links[index - 1]);
|
|
121
|
-
if (isReferenceCache(link) && isReferenceCache(previousLink)) {
|
|
122
|
-
return link.position.start.offset !== previousLink.position.start.offset;
|
|
123
|
-
}
|
|
124
|
-
if (isFrontmatterLinkCache(link) && isFrontmatterLinkCache(previousLink)) {
|
|
125
|
-
const linkStartOffset = isFrontmatterLinkCacheWithOffsets(link) ? link.startOffset : 0;
|
|
126
|
-
const previousLinkStartOffset = isFrontmatterLinkCacheWithOffsets(previousLink) ? previousLink.startOffset : 0;
|
|
127
|
-
return link.key !== previousLink.key || isFrontmatterLinkCacheWithOffsets(link) !== isFrontmatterLinkCacheWithOffsets(previousLink) || linkStartOffset !== previousLinkStartOffset;
|
|
128
|
-
}
|
|
129
|
-
return true;
|
|
130
|
-
});
|
|
131
|
-
return links;
|
|
132
|
-
}
|
|
133
117
|
function getBacklinksForFileOrPath(app, pathOrFile) {
|
|
134
118
|
var _stack = [];
|
|
135
119
|
try {
|
|
@@ -202,23 +186,30 @@ async function getBacklinksForFileSafe(params) {
|
|
|
202
186
|
});
|
|
203
187
|
return backlinks;
|
|
204
188
|
}
|
|
205
|
-
async function getCacheSafe(app, fileOrPath) {
|
|
189
|
+
async function getCacheSafe(app, fileOrPath, options = {}) {
|
|
206
190
|
const file = getFileOrNull({ app, pathOrFile: fileOrPath });
|
|
207
191
|
try {
|
|
208
192
|
if (!file) {
|
|
209
193
|
return null;
|
|
210
194
|
}
|
|
195
|
+
let cache;
|
|
211
196
|
if (file.deleted) {
|
|
212
|
-
|
|
197
|
+
cache = app.metadataCache.getFileCache(file);
|
|
198
|
+
} else {
|
|
199
|
+
await saveNote(app, file);
|
|
200
|
+
const fileCacheEntry = app.metadataCache.fileCache[file.path];
|
|
201
|
+
const isUpToDate = fileCacheEntry?.mtime === file.stat.mtime && fileCacheEntry.size === file.stat.size && app.metadataCache.metadataCache[fileCacheEntry.hash];
|
|
202
|
+
if (!isUpToDate) {
|
|
203
|
+
await app.metadataCache.computeFileMetadataAsync(file);
|
|
204
|
+
await ensureMetadataCacheReady(app);
|
|
205
|
+
}
|
|
206
|
+
cache = app.metadataCache.getFileCache(file);
|
|
213
207
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
const isUpToDate = fileCacheEntry?.mtime === file.stat.mtime && fileCacheEntry.size === file.stat.size && app.metadataCache.metadataCache[fileCacheEntry.hash];
|
|
217
|
-
if (!isUpToDate) {
|
|
218
|
-
await app.metadataCache.computeFileMetadataAsync(file);
|
|
219
|
-
await ensureMetadataCacheReady(app);
|
|
208
|
+
if (cache === null) {
|
|
209
|
+
return null;
|
|
220
210
|
}
|
|
221
|
-
|
|
211
|
+
const content = options.shouldParseExternalLinks ? await app.vault.cachedRead(file) : "";
|
|
212
|
+
return toParsedCachedMetadataEx({ cache, content, options });
|
|
222
213
|
} catch (error) {
|
|
223
214
|
if (!file || file.deleted) {
|
|
224
215
|
return null;
|
|
@@ -230,10 +221,88 @@ async function getFrontmatterSafe(app, pathOrFile) {
|
|
|
230
221
|
const cache = await getCacheSafe(app, pathOrFile);
|
|
231
222
|
return cache?.frontmatter ?? {};
|
|
232
223
|
}
|
|
233
|
-
|
|
224
|
+
function getLinks(params) {
|
|
225
|
+
const {
|
|
226
|
+
cache,
|
|
227
|
+
shouldIncludeEmbeds = true,
|
|
228
|
+
shouldIncludeExternalLinks = false,
|
|
229
|
+
shouldIncludeFrontmatterExternalLinks = false,
|
|
230
|
+
shouldIncludeFrontmatterLinks = true,
|
|
231
|
+
shouldIncludeMultiValueFrontmatterExternalLinks = false,
|
|
232
|
+
shouldIncludeMultiValueFrontmatterLinks = false,
|
|
233
|
+
shouldIncludeReferences = true
|
|
234
|
+
} = params;
|
|
235
|
+
let links = [];
|
|
236
|
+
if (shouldIncludeReferences && cache.links) {
|
|
237
|
+
links.push(...cache.links);
|
|
238
|
+
}
|
|
239
|
+
if (shouldIncludeEmbeds && cache.embeds) {
|
|
240
|
+
links.push(...cache.embeds);
|
|
241
|
+
}
|
|
242
|
+
if (shouldIncludeFrontmatterLinks && cache.frontmatterLinks) {
|
|
243
|
+
links.push(...cache.frontmatterLinks);
|
|
244
|
+
}
|
|
245
|
+
const featureLinkSelectors = [
|
|
246
|
+
{
|
|
247
|
+
description: "body external links",
|
|
248
|
+
feature: "ExternalLinks" /* ExternalLinks */,
|
|
249
|
+
select: (cacheEx) => cacheEx.externalLinks,
|
|
250
|
+
shouldInclude: shouldIncludeExternalLinks
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
description: "frontmatter external links",
|
|
254
|
+
feature: "FrontmatterExternalLinks" /* FrontmatterExternalLinks */,
|
|
255
|
+
select: (cacheEx) => cacheEx.frontmatterExternalLinks,
|
|
256
|
+
shouldInclude: shouldIncludeFrontmatterExternalLinks
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
description: "multi-value frontmatter external links",
|
|
260
|
+
feature: "MultiValueFrontmatterExternalLinks" /* MultiValueFrontmatterExternalLinks */,
|
|
261
|
+
select: (cacheEx) => cacheEx.multiValueFrontmatterExternalLinks,
|
|
262
|
+
shouldInclude: shouldIncludeMultiValueFrontmatterExternalLinks
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
description: "multi-value frontmatter links",
|
|
266
|
+
feature: "MultiValueFrontmatterLinks" /* MultiValueFrontmatterLinks */,
|
|
267
|
+
select: (cacheEx) => cacheEx.multiValueFrontmatterLinks,
|
|
268
|
+
shouldInclude: shouldIncludeMultiValueFrontmatterLinks
|
|
269
|
+
}
|
|
270
|
+
];
|
|
271
|
+
for (const featureLinkSelector of featureLinkSelectors) {
|
|
272
|
+
if (!featureLinkSelector.shouldInclude) {
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
if (!isCachedMetadataEx(cache) || !cache.features.includes(featureLinkSelector.feature)) {
|
|
276
|
+
throw new Error(`Cannot include ${featureLinkSelector.description}: the cache was not computed with the ${featureLinkSelector.feature} feature.`);
|
|
277
|
+
}
|
|
278
|
+
links.push(...ensureNonNullable(featureLinkSelector.select(cache)));
|
|
279
|
+
}
|
|
280
|
+
sortReferences(links);
|
|
281
|
+
links = links.filter((link, index) => {
|
|
282
|
+
if (index === 0) {
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
const previousLink = ensureNonNullable(links[index - 1]);
|
|
286
|
+
if (isReferenceCache(link) && isReferenceCache(previousLink)) {
|
|
287
|
+
return link.position.start.offset !== previousLink.position.start.offset;
|
|
288
|
+
}
|
|
289
|
+
if (isFrontmatterLinkCache(link) && isFrontmatterLinkCache(previousLink)) {
|
|
290
|
+
const linkStartOffset = isFrontmatterLinkCacheWithOffsets(link) ? link.startOffset : 0;
|
|
291
|
+
const previousLinkStartOffset = isFrontmatterLinkCacheWithOffsets(previousLink) ? previousLink.startOffset : 0;
|
|
292
|
+
return link.key !== previousLink.key || isFrontmatterLinkCacheWithOffsets(link) !== isFrontmatterLinkCacheWithOffsets(previousLink) || linkStartOffset !== previousLinkStartOffset;
|
|
293
|
+
}
|
|
294
|
+
return true;
|
|
295
|
+
});
|
|
296
|
+
return links;
|
|
297
|
+
}
|
|
298
|
+
function isCachedMetadataEx(cache) {
|
|
299
|
+
return "features" in cache;
|
|
300
|
+
}
|
|
301
|
+
async function parseMetadata(app, str, options = {}) {
|
|
234
302
|
const encoder = new TextEncoder();
|
|
235
303
|
const buffer = encoder.encode(str).buffer;
|
|
236
|
-
|
|
304
|
+
const cache = await app.metadataCache.computeMetadataAsync(buffer) ?? {};
|
|
305
|
+
return toParsedCachedMetadataEx({ cache, content: str, options });
|
|
237
306
|
}
|
|
238
307
|
function registerFileCacheForNonExistingFile(params) {
|
|
239
308
|
const { app, cache, pathOrFile } = params;
|
|
@@ -310,17 +379,48 @@ function unregisterFiles(app, files) {
|
|
|
310
379
|
function getRegisteredFilesCounts() {
|
|
311
380
|
return getObsidianDevUtilsState("registeredFilesCounts", /* @__PURE__ */ new Map()).value;
|
|
312
381
|
}
|
|
382
|
+
function parseExternalBodyLinks(content, cache) {
|
|
383
|
+
const frontmatterEndOffset = cache.frontmatterPosition?.end.offset ?? 0;
|
|
384
|
+
return parseLinks(content).filter((parseLinkResult) => parseLinkResult.isExternal && parseLinkResult.startOffset >= frontmatterEndOffset).map((parseLinkResult) => toParseLinkReference({ content, parseLinkResult }));
|
|
385
|
+
}
|
|
386
|
+
function toParsedCachedMetadataEx(params) {
|
|
387
|
+
const { cache, content, options } = params;
|
|
388
|
+
const features = ["Native" /* Native */];
|
|
389
|
+
const result = { ...cache, features };
|
|
390
|
+
if (options.shouldParseExternalLinks) {
|
|
391
|
+
result.externalLinks = parseExternalBodyLinks(content, cache);
|
|
392
|
+
features.push("ExternalLinks" /* ExternalLinks */);
|
|
393
|
+
}
|
|
394
|
+
if (options.shouldParseFrontmatterExternalLinks || options.shouldParseMultiValueFrontmatterExternalLinks || options.shouldParseMultiValueFrontmatterLinks) {
|
|
395
|
+
const frontmatterLinks = parseFrontmatterLinks(cache.frontmatter);
|
|
396
|
+
if (options.shouldParseFrontmatterExternalLinks) {
|
|
397
|
+
result.frontmatterExternalLinks = frontmatterLinks.frontmatterExternalLinks;
|
|
398
|
+
features.push("FrontmatterExternalLinks" /* FrontmatterExternalLinks */);
|
|
399
|
+
}
|
|
400
|
+
if (options.shouldParseMultiValueFrontmatterExternalLinks) {
|
|
401
|
+
result.multiValueFrontmatterExternalLinks = frontmatterLinks.multiValueFrontmatterExternalLinks;
|
|
402
|
+
features.push("MultiValueFrontmatterExternalLinks" /* MultiValueFrontmatterExternalLinks */);
|
|
403
|
+
}
|
|
404
|
+
if (options.shouldParseMultiValueFrontmatterLinks) {
|
|
405
|
+
result.multiValueFrontmatterLinks = frontmatterLinks.multiValueFrontmatterLinks;
|
|
406
|
+
features.push("MultiValueFrontmatterLinks" /* MultiValueFrontmatterLinks */);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
return result;
|
|
410
|
+
}
|
|
313
411
|
export {
|
|
412
|
+
CachedMetadataExFeature,
|
|
314
413
|
ensureMetadataCacheReady,
|
|
315
|
-
getAllLinks,
|
|
316
414
|
getBacklinksForFileOrPath,
|
|
317
415
|
getBacklinksForFileSafe,
|
|
318
416
|
getCacheSafe,
|
|
319
417
|
getFrontmatterSafe,
|
|
418
|
+
getLinks,
|
|
419
|
+
isCachedMetadataEx,
|
|
320
420
|
parseMetadata,
|
|
321
421
|
registerFileCacheForNonExistingFile,
|
|
322
422
|
registerFiles,
|
|
323
423
|
unregisterFileCacheForNonExistingFile,
|
|
324
424
|
unregisterFiles
|
|
325
425
|
};
|
|
326
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21ldGFkYXRhLWNhY2hlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgbWV0YWRhdGEgY2FjaGUgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDdXN0b21BcnJheURpY3QgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0JztcbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgUmVmZXJlbmNlLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgQ3VzdG9tQXJyYXlEaWN0SW1wbCxcbiAgaXNGcm9udG1hdHRlckxpbmtDYWNoZSxcbiAgaXNSZWZlcmVuY2VDYWNoZSxcbiAgcGFyZW50Rm9sZGVyUGF0aFxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB0eXBlIHsgUmV0cnlPcHRpb25zIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUgeyBQYXRoT3JGaWxlIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkRnJvbnRtYXR0ZXIgfSBmcm9tICcuL2Zyb250bWF0dGVyLnRzJztcblxuaW1wb3J0IHsgQ2FsbGJhY2tEaXNwb3NhYmxlIH0gZnJvbSAnLi4vZGlzcG9zYWJsZS50cyc7XG5pbXBvcnQgeyBnZXROZXN0ZWRQcm9wZXJ0eVZhbHVlIH0gZnJvbSAnLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQgeyBzdHJpY3RQcm94eSB9IGZyb20gJy4uL3N0cmljdC1wcm94eS50cyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IHJldHJ5V2l0aFRpbWVvdXROb3RpY2UgfSBmcm9tICcuL2FzeW5jLXdpdGgtbm90aWNlLnRzJztcbmltcG9ydCB7XG4gIGdldEZpbGUsXG4gIGdldEZpbGVPck51bGwsXG4gIGdldEZvbGRlcixcbiAgZ2V0UGF0aCxcbiAgaXNGaWxlXG59IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzLFxuICB0b0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHNcbn0gZnJvbSAnLi9mcm9udG1hdHRlci1saW5rLWNhY2hlLXdpdGgtb2Zmc2V0cy50cyc7XG5pbXBvcnQgeyBwYXJzZUZyb250bWF0dGVyIH0gZnJvbSAnLi9mcm9udG1hdHRlci50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgc29ydFJlZmVyZW5jZXMgfSBmcm9tICcuL3JlZmVyZW5jZS50cyc7XG5pbXBvcnQge1xuICByZWFkU2FmZSxcbiAgc2F2ZU5vdGVcbn0gZnJvbSAnLi92YXVsdC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRCYWNrbGlua3NGb3JGaWxlU2FmZU9wdGlvbnMgZXh0ZW5kcyBSZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IGEgdGltZW91dCBub3RpY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd1RpbWVvdXROb3RpY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVQYXJhbXMgZXh0ZW5kcyBHZXRCYWNrbGlua3NGb3JGaWxlU2FmZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBXcmFwcGVyIGZvciB0aGUgZ2V0QmFja2xpbmtzRm9yRmlsZSBtZXRob2QgdGhhdCBwcm92aWRlcyBhIHNhZmUgb3ZlcmxvYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVXcmFwcGVyIHtcbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgc2FmZWx5LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2JqZWN0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGRpY3Rpb25hcnkgb2YgYmFja2xpbmtzLlxuICAgKi9cbiAgc2FmZShwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogUHJvbWlzZTxDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPj47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIGNhY2hlIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIHJlZ2lzdGVyIHRoZSBmaWxlIGNhY2hlIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IHRoZSBtZXRhZGF0YSBjYWNoZSBpcyByZWFkeSBmb3IgYWxsIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBtZXRhZGF0YSBjYWNoZSBpcyByZWFkeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU1ldGFkYXRhQ2FjaGVSZWFkeShhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGFwcC5tZXRhZGF0YUNhY2hlLm9uQ2xlYW5DYWNoZShyZXNvbHZlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGFsbCBsaW5rcyBmcm9tIHRoZSBwcm92aWRlZCBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gY2FjaGUgLSBUaGUgY2FjaGVkIG1ldGFkYXRhLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgcmVmZXJlbmNlIGNhY2hlcyByZXByZXNlbnRpbmcgdGhlIGxpbmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsTGlua3MoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogUmVmZXJlbmNlW10ge1xuICBsZXQgbGlua3M6IFJlZmVyZW5jZVtdID0gW107XG5cbiAgaWYgKGNhY2hlLmxpbmtzKSB7XG4gICAgbGlua3MucHVzaCguLi5jYWNoZS5saW5rcyk7XG4gIH1cblxuICBpZiAoY2FjaGUuZW1iZWRzKSB7XG4gICAgbGlua3MucHVzaCguLi5jYWNoZS5lbWJlZHMpO1xuICB9XG5cbiAgaWYgKGNhY2hlLmZyb250bWF0dGVyTGlua3MpIHtcbiAgICBsaW5rcy5wdXNoKC4uLmNhY2hlLmZyb250bWF0dGVyTGlua3MpO1xuICB9XG5cbiAgc29ydFJlZmVyZW5jZXMobGlua3MpO1xuXG4gIC8vIEJVRzogaHR0cHM6Ly9mb3J1bS5vYnNpZGlhbi5tZC90L2J1Zy1kdXBsaWNhdGVkLWxpbmtzLWluLW1ldGFkYXRhY2FjaGUtaW5zaWRlLWZvb3Rub3Rlcy84NTU1MVxuICBsaW5rcyA9IGxpbmtzLmZpbHRlcigobGluaywgaW5kZXgpID0+IHtcbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZpb3VzTGluayA9IGVuc3VyZU5vbk51bGxhYmxlKGxpbmtzW2luZGV4IC0gMV0pO1xuXG4gICAgaWYgKGlzUmVmZXJlbmNlQ2FjaGUobGluaykgJiYgaXNSZWZlcmVuY2VDYWNoZShwcmV2aW91c0xpbmspKSB7XG4gICAgICByZXR1cm4gbGluay5wb3NpdGlvbi5zdGFydC5vZmZzZXQgIT09IHByZXZpb3VzTGluay5wb3NpdGlvbi5zdGFydC5vZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUobGluaykgJiYgaXNGcm9udG1hdHRlckxpbmtDYWNoZShwcmV2aW91c0xpbmspKSB7XG4gICAgICBjb25zdCBsaW5rU3RhcnRPZmZzZXQgPSBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMobGluaykgPyBsaW5rLnN0YXJ0T2Zmc2V0IDogMDtcbiAgICAgIGNvbnN0IHByZXZpb3VzTGlua1N0YXJ0T2Zmc2V0ID0gaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKHByZXZpb3VzTGluaykgPyBwcmV2aW91c0xpbmsuc3RhcnRPZmZzZXQgOiAwO1xuICAgICAgcmV0dXJuIGxpbmsua2V5ICE9PSBwcmV2aW91c0xpbmsua2V5IHx8IGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyhsaW5rKSAhPT0gaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKHByZXZpb3VzTGluaylcbiAgICAgICAgfHwgbGlua1N0YXJ0T2Zmc2V0ICE9PSBwcmV2aW91c0xpbmtTdGFydE9mZnNldDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGxpbmtzO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqIE5PVEU6IFRoZSBmaWxlIG1heSBiZSBub24tZXhpc3RlbnQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvYmplY3QuXG4gKiBAcmV0dXJucyBUaGUgYmFja2xpbmtzIGZvciB0aGUgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIHVzaW5nIF9yZWdpc3RyYXRpb24gPSByZWdpc3RlckZpbGVzKGFwcCwgW2ZpbGVdKTtcbiAgcmV0dXJuIGFwcC5tZXRhZGF0YUNhY2hlLmdldEJhY2tsaW5rc0ZvckZpbGUoZmlsZSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBzYWZlbHkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZXRyaWV2aW5nIHRoZSBiYWNrbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGRpY3Rpb25hcnkgb2YgYmFja2xpbmtzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUocGFyYW1zOiBHZXRCYWNrbGlua3NGb3JGaWxlU2FmZVBhcmFtcyk6IFByb21pc2U8Q3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4+IHtcbiAgY29uc3QgeyBhcHAsIHBhdGhPckZpbGUsIC4uLm9wdGlvbnMgfSA9IHBhcmFtcztcbiAgY29uc3Qgc2FmZU92ZXJsb2FkID0gKGFwcC5tZXRhZGF0YUNhY2hlLmdldEJhY2tsaW5rc0ZvckZpbGUgYXMgUGFydGlhbDxHZXRCYWNrbGlua3NGb3JGaWxlU2FmZVdyYXBwZXI+KS5zYWZlO1xuICBpZiAoc2FmZU92ZXJsb2FkKSB7XG4gICAgcmV0dXJuIHNhZmVPdmVybG9hZChwYXRoT3JGaWxlKTtcbiAgfVxuICBsZXQgYmFja2xpbmtzOiBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiA9IG5ldyBDdXN0b21BcnJheURpY3RJbXBsPFJlZmVyZW5jZT4oKTtcbiAgYXdhaXQgcmV0cnlXaXRoVGltZW91dE5vdGljZSh7XG4gICAgYXN5bmMgb3BlcmF0aW9uRm4oYWJvcnRTaWduYWwpIHtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSB9KTtcbiAgICAgIGF3YWl0IGVuc3VyZU1ldGFkYXRhQ2FjaGVSZWFkeShhcHApO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGJhY2tsaW5rcyA9IGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgoYXBwLCBmaWxlKTtcbiAgICAgIGZvciAoY29uc3Qgbm90ZVBhdGggb2YgYmFja2xpbmtzLmtleXMoKSkge1xuICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBjb25zdCBub3RlID0gZ2V0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogbm90ZVBhdGggfSk7XG4gICAgICAgIGlmICghbm90ZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNhdmVOb3RlKGFwcCwgbm90ZSk7XG4gICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRTYWZlKGFwcCwgbm90ZSk7XG4gICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcm9udG1hdHRlciA9IHBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCk7XG4gICAgICAgIGNvbnN0IGxpbmtzID0gYmFja2xpbmtzLmdldChub3RlUGF0aCk7XG4gICAgICAgIGlmICghbGlua3MpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcbiAgICAgICAgICBsZXQgYWN0dWFsTGluazogc3RyaW5nO1xuICAgICAgICAgIGlmIChpc1JlZmVyZW5jZUNhY2hlKGxpbmspKSB7XG4gICAgICAgICAgICBhY3R1YWxMaW5rID0gY29udGVudC5zbGljZShsaW5rLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCwgbGluay5wb3NpdGlvbi5lbmQub2Zmc2V0KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUobGluaykpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBnZXROZXN0ZWRQcm9wZXJ0eVZhbHVlKGZyb250bWF0dGVyLCBsaW5rLmtleSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnR5VmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGlua1dpdGhPZmZzZXRzID0gdG9Gcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKGxpbmspO1xuICAgICAgICAgICAgYWN0dWFsTGluayA9IHByb3BlcnR5VmFsdWUuc2xpY2UobGlua1dpdGhPZmZzZXRzLnN0YXJ0T2Zmc2V0LCBsaW5rV2l0aE9mZnNldHMuZW5kT2Zmc2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhY3R1YWxMaW5rICE9PSBsaW5rLm9yaWdpbmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLm1ldGFkYXRhQ2FjaGUuZ2V0QmFja2xpbmtzRm9yRmlsZVBhdGgsIHsgZmlsZVBhdGg6IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSB9KSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHN0cmljdFByb3h5PFBsdWdpbk5vdGljZUNvbXBvbmVudD4oe30pLFxuICAgIHJldHJ5T3B0aW9uczogb3B0aW9ucyxcbiAgICBzaG91bGRTaG93VGltZW91dE5vdGljZTogb3B0aW9ucy5zaG91bGRTaG93VGltZW91dE5vdGljZSA/PyB0cnVlXG4gIH0pO1xuXG4gIHJldHVybiBiYWNrbGlua3M7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBjYWNoZWQgbWV0YWRhdGEgZm9yIGEgZ2l2ZW4gZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGZpbGVPclBhdGggLSBUaGUgZmlsZSBvciBwYXRoIHRvIHJldHJpZXZlIHRoZSBtZXRhZGF0YSBmb3IuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG1ldGFkYXRhIGZvciB0aGUgZmlsZSwgb3IgYG51bGxgIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDYWNoZVNhZmUoYXBwOiBBcHAsIGZpbGVPclBhdGg6IFBhdGhPckZpbGUpOiBQcm9taXNlPENhY2hlZE1ldGFkYXRhIHwgbnVsbD4ge1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogZmlsZU9yUGF0aCB9KTtcblxuICB0cnkge1xuICAgIGlmICghZmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuZGVsZXRlZCkge1xuICAgICAgcmV0dXJuIGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcbiAgICB9XG5cbiAgICBhd2FpdCBzYXZlTm90ZShhcHAsIGZpbGUpO1xuXG4gICAgY29uc3QgZmlsZUNhY2hlRW50cnkgPSBhcHAubWV0YWRhdGFDYWNoZS5maWxlQ2FjaGVbZmlsZS5wYXRoXTtcbiAgICBjb25zdCBpc1VwVG9EYXRlID0gZmlsZUNhY2hlRW50cnk/Lm10aW1lID09PSBmaWxlLnN0YXQubXRpbWVcbiAgICAgICYmIGZpbGVDYWNoZUVudHJ5LnNpemUgPT09IGZpbGUuc3RhdC5zaXplXG4gICAgICAmJiBhcHAubWV0YWRhdGFDYWNoZS5tZXRhZGF0YUNhY2hlW2ZpbGVDYWNoZUVudHJ5Lmhhc2hdO1xuICAgIGlmICghaXNVcFRvRGF0ZSkge1xuICAgICAgYXdhaXQgYXBwLm1ldGFkYXRhQ2FjaGUuY29tcHV0ZUZpbGVNZXRhZGF0YUFzeW5jKGZpbGUpO1xuICAgICAgYXdhaXQgZW5zdXJlTWV0YWRhdGFDYWNoZVJlYWR5KGFwcCk7XG4gICAgfVxuICAgIHJldHVybiBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCFmaWxlIHx8IGZpbGUuZGVsZXRlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGZyb250IG1hdHRlciBmcm9tIHRoZSBtZXRhZGF0YSBjYWNoZSBzYWZlbHkuXG4gKlxuICogQHR5cGVQYXJhbSBDdXN0b21Gcm9udG1hdHRlciAtIFRoZSB0eXBlIG9mIGN1c3RvbSBmcm9udCBtYXR0ZXIuXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byByZXRyaWV2ZSB0aGUgZnJvbnQgbWF0dGVyIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgY29tYmluZWQgZnJvbnQgbWF0dGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RnJvbnRtYXR0ZXJTYWZlPEN1c3RvbUZyb250bWF0dGVyID0gdW5rbm93bj4oYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBQcm9taXNlPENvbWJpbmVkRnJvbnRtYXR0ZXI8Q3VzdG9tRnJvbnRtYXR0ZXI+PiB7XG4gIGNvbnN0IGNhY2hlID0gYXdhaXQgZ2V0Q2FjaGVTYWZlKGFwcCwgcGF0aE9yRmlsZSk7XG4gIHJldHVybiAoY2FjaGU/LmZyb250bWF0dGVyID8/IHt9KSBhcyBDb21iaW5lZEZyb250bWF0dGVyPEN1c3RvbUZyb250bWF0dGVyPjtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIG1ldGFkYXRhIGZvciBhIGdpdmVuIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBzdHIgLSBUaGUgc3RyaW5nIHRvIHBhcnNlIHRoZSBtZXRhZGF0YSBmb3IuXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIG1ldGFkYXRhLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VNZXRhZGF0YShhcHA6IEFwcCwgc3RyOiBzdHJpbmcpOiBQcm9taXNlPENhY2hlZE1ldGFkYXRhPiB7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgY29uc3QgYnVmZmVyID0gZW5jb2Rlci5lbmNvZGUoc3RyKS5idWZmZXI7XG4gIHJldHVybiBhd2FpdCBhcHAubWV0YWRhdGFDYWNoZS5jb21wdXRlTWV0YWRhdGFBc3luYyhidWZmZXIpID8/IHt9O1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgZmlsZSBjYWNoZSBmb3IgYSBub24tZXhpc3RpbmcgZmlsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJlZ2lzdGVyaW5nIHRoZSBmaWxlIGNhY2hlLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCB1bnJlZ2lzdGVycyB0aGUgZmlsZSBjYWNoZSB3aGVuIGRpc3Bvc2VkLCBmb3IgdXNlIHdpdGggYHVzaW5nYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlKHBhcmFtczogUmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGVQYXJhbXMpOiBEaXNwb3NhYmxlIHtcbiAgY29uc3QgeyBhcHAsIGNhY2hlLCBwYXRoT3JGaWxlIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIGlmICghZmlsZS5kZWxldGVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlIGlzIGV4aXN0aW5nJyk7XG4gIH1cblxuICBhcHAubWV0YWRhdGFDYWNoZS5maWxlQ2FjaGVbZmlsZS5wYXRoXSA9IHtcbiAgICBoYXNoOiBmaWxlLnBhdGgsXG4gICAgbXRpbWU6IDAsXG4gICAgc2l6ZTogMFxuICB9O1xuXG4gIGFwcC5tZXRhZGF0YUNhY2hlLm1ldGFkYXRhQ2FjaGVbZmlsZS5wYXRoXSA9IGNhY2hlO1xuXG4gIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgdW5yZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZShhcHAsIGZpbGUpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGZpbGVzIGluIHRoZSBPYnNpZGlhbiBhcHAuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZXMgLSBUaGUgZmlsZXMgdG8gcmVnaXN0ZXIuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHVucmVnaXN0ZXJzIHRoZSBmaWxlcyB3aGVuIGRpc3Bvc2VkLCBmb3IgdXNlIHdpdGggYHVzaW5nYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRmlsZXMoYXBwOiBBcHAsIGZpbGVzOiBUQWJzdHJhY3RGaWxlW10pOiBEaXNwb3NhYmxlIHtcbiAgY29uc3QgcmVnaXN0ZXJlZEZpbGVzQ291bnRzID0gZ2V0UmVnaXN0ZXJlZEZpbGVzQ291bnRzKCk7XG5cbiAgZm9yIChsZXQgZmlsZSBvZiBmaWxlcykge1xuICAgIHdoaWxlIChmaWxlLmRlbGV0ZWQpIHtcbiAgICAgIGxldCBjb3VudCA9IHJlZ2lzdGVyZWRGaWxlc0NvdW50cy5nZXQoZmlsZS5wYXRoKSA/PyAwO1xuICAgICAgY291bnQrKztcbiAgICAgIHJlZ2lzdGVyZWRGaWxlc0NvdW50cy5zZXQoZmlsZS5wYXRoLCBjb3VudCk7XG5cbiAgICAgIGFwcC52YXVsdC5maWxlTWFwW2ZpbGUucGF0aF0gPSBmaWxlO1xuXG4gICAgICBpZiAoaXNGaWxlKGZpbGUpKSB7XG4gICAgICAgIGFwcC5tZXRhZGF0YUNhY2hlLnVuaXF1ZUZpbGVMb29rdXAuYWRkKGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLCBmaWxlKTtcbiAgICAgIH1cblxuICAgICAgZmlsZSA9IGdldEZvbGRlcih7XG4gICAgICAgIGFwcCxcbiAgICAgICAgcGF0aE9yRm9sZGVyOiBwYXJlbnRGb2xkZXJQYXRoKGZpbGUucGF0aCksXG4gICAgICAgIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICB1bnJlZ2lzdGVyRmlsZXMoYXBwLCBmaWxlcyk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBVbnJlZ2lzdGVycyB0aGUgZmlsZSBjYWNoZSBmb3IgYSBub24tZXhpc3RpbmcgZmlsZS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byB1bnJlZ2lzdGVyIHRoZSBmaWxlIGNhY2hlIGZvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgY29uc3QgZmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgaWYgKCFmaWxlLmRlbGV0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpbGUgaXMgZXhpc3RpbmcnKTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIFdlIGhhdmUgbm8gb3RoZXIgd2F5IHRvIGRlbGV0ZSB0aGUgcHJvcGVydHkuXG4gIGRlbGV0ZSBhcHAubWV0YWRhdGFDYWNoZS5maWxlQ2FjaGVbZmlsZS5wYXRoXTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBXZSBoYXZlIG5vIG90aGVyIHdheSB0byBkZWxldGUgdGhlIHByb3BlcnR5LlxuICBkZWxldGUgYXBwLm1ldGFkYXRhQ2FjaGUubWV0YWRhdGFDYWNoZVtmaWxlLnBhdGhdO1xufVxuXG4vKipcbiAqIFVucmVnaXN0ZXJzIGZpbGVzIGZyb20gdGhlIE9ic2lkaWFuIGFwcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBmaWxlcyAtIFRoZSBmaWxlcyB0byB1bnJlZ2lzdGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5yZWdpc3RlckZpbGVzKGFwcDogQXBwLCBmaWxlczogVEFic3RyYWN0RmlsZVtdKTogdm9pZCB7XG4gIGNvbnN0IHJlZ2lzdGVyZWRGaWxlc0NvdW50cyA9IGdldFJlZ2lzdGVyZWRGaWxlc0NvdW50cygpO1xuXG4gIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICB3aGlsZSAoZmlsZS5kZWxldGVkKSB7XG4gICAgICBsZXQgY291bnQgPSByZWdpc3RlcmVkRmlsZXNDb3VudHMuZ2V0KGZpbGUucGF0aCkgPz8gMTtcbiAgICAgIGNvdW50LS07XG4gICAgICByZWdpc3RlcmVkRmlsZXNDb3VudHMuc2V0KGZpbGUucGF0aCwgY291bnQpO1xuICAgICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICAgIHJlZ2lzdGVyZWRGaWxlc0NvdW50cy5kZWxldGUoZmlsZS5wYXRoKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBXZSBoYXZlIG5vIG90aGVyIHdheSB0byBkZWxldGUgdGhlIHByb3BlcnR5LlxuICAgICAgICBkZWxldGUgYXBwLnZhdWx0LmZpbGVNYXBbZmlsZS5wYXRoXTtcblxuICAgICAgICBpZiAoaXNGaWxlKGZpbGUpKSB7XG4gICAgICAgICAgYXBwLm1ldGFkYXRhQ2FjaGUudW5pcXVlRmlsZUxvb2t1cC5yZW1vdmUoZmlsZS5uYW1lLnRvTG93ZXJDYXNlKCksIGZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZpbGUgPSBnZXRGb2xkZXIoe1xuICAgICAgICBhcHAsXG4gICAgICAgIHBhdGhPckZvbGRlcjogcGFyZW50Rm9sZGVyUGF0aChmaWxlLnBhdGgpLFxuICAgICAgICBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZWdpc3RlcmVkRmlsZXNDb3VudHMoKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoJ3JlZ2lzdGVyZWRGaWxlc0NvdW50cycsIG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCkpLnZhbHVlO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBT1AsU0FBUywwQkFBMEI7QUFDbkMsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyxnQ0FBZ0M7QUFDekMsU0FBUyxtQkFBbUI7QUFDNUIsU0FBUyx5QkFBeUI7QUFDbEMsU0FBUyw4QkFBOEI7QUFDdkM7QUFBQSxFQUNFO0FBQUEs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
|
|
426
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21ldGFkYXRhLWNhY2hlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgbWV0YWRhdGEgY2FjaGUgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDdXN0b21BcnJheURpY3QgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0JztcbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgUmVmZXJlbmNlLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgQ3VzdG9tQXJyYXlEaWN0SW1wbCxcbiAgaXNGcm9udG1hdHRlckxpbmtDYWNoZSxcbiAgaXNSZWZlcmVuY2VDYWNoZSxcbiAgcGFyZW50Rm9sZGVyUGF0aFxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB0eXBlIHsgUmV0cnlPcHRpb25zIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUgeyBQYXRoT3JGaWxlIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkRnJvbnRtYXR0ZXIgfSBmcm9tICcuL2Zyb250bWF0dGVyLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2UsXG4gIFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlV2l0aE9mZnNldHMsXG4gIFBhcnNlTGlua1JlZmVyZW5jZVxufSBmcm9tICcuL3BhcnNlLWxpbmsudHMnO1xuXG5pbXBvcnQgeyBDYWxsYmFja0Rpc3Bvc2FibGUgfSBmcm9tICcuLi9kaXNwb3NhYmxlLnRzJztcbmltcG9ydCB7IGdldE5lc3RlZFByb3BlcnR5VmFsdWUgfSBmcm9tICcuLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7IHN0cmljdFByb3h5IH0gZnJvbSAnLi4vc3RyaWN0LXByb3h5LnRzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHsgcmV0cnlXaXRoVGltZW91dE5vdGljZSB9IGZyb20gJy4vYXN5bmMtd2l0aC1ub3RpY2UudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0Rm9sZGVyLFxuICBnZXRQYXRoLFxuICBpc0ZpbGVcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMsXG4gIHRvRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0c1xufSBmcm9tICcuL2Zyb250bWF0dGVyLWxpbmstY2FjaGUtd2l0aC1vZmZzZXRzLnRzJztcbmltcG9ydCB7IHBhcnNlRnJvbnRtYXR0ZXIgfSBmcm9tICcuL2Zyb250bWF0dGVyLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQge1xuICBwYXJzZUZyb250bWF0dGVyTGlua3MsXG4gIHBhcnNlTGlua3MsXG4gIHRvUGFyc2VMaW5rUmVmZXJlbmNlXG59IGZyb20gJy4vcGFyc2UtbGluay50cyc7XG5pbXBvcnQgeyBzb3J0UmVmZXJlbmNlcyB9IGZyb20gJy4vcmVmZXJlbmNlLnRzJztcbmltcG9ydCB7XG4gIHJlYWRTYWZlLFxuICBzYXZlTm90ZVxufSBmcm9tICcuL3ZhdWx0LnRzJztcblxuLyoqXG4gKiBBIHBhcnNpbmcgZmVhdHVyZSB0aGF0IHdhcyBhcHBsaWVkIHdoZW4gY29tcHV0aW5nIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICovXG5leHBvcnQgZW51bSBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZSB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgY29udGVudCBib2R5LlxuICAgKi9cbiAgRXh0ZXJuYWxMaW5rcyA9ICdFeHRlcm5hbExpbmtzJyxcblxuICAvKipcbiAgICogVGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHNpbmdsZS1saW5rIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gJ0Zyb250bWF0dGVyRXh0ZXJuYWxMaW5rcycsXG5cbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9ICdNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzJyxcblxuICAvKipcbiAgICogVGhlIGludGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMsIHdoaWNoIE9ic2lkaWFuIGRvZXMgbm90IG5hdGl2ZWx5IGNhY2hlLlxuICAgKi9cbiAgTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MgPSAnTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MnLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIG5hdGl2ZSBtZXRhZGF0YSBwYXJzaW5nIChpbnRlcm5hbCBsaW5rcywgZW1iZWRzLCBmcm9udG1hdHRlciBsaW5rcykuXG4gICAqL1xuICBOYXRpdmUgPSAnTmF0aXZlJ1xufVxuXG4vKipcbiAqIEFuIGV4dGVuZGVkIHtAbGluayBDYWNoZWRNZXRhZGF0YX0gdGhhdCByZWNvcmRzIHdoaWNoIHBhcnNpbmcge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlfXMgd2VyZVxuICogYXBwbGllZCAodmlhIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4LmZlYXR1cmVzfSkgYW5kIGNhcnJpZXMgdGhlIHJlc3VsdGluZyBleHRlcm5hbCBsaW5rcy4gRWFjaCBsaW5rc1xuICogYXJyYXkgaXMgcG9wdWxhdGVkIG9ubHkgd2hlbiBpdHMgY29ycmVzcG9uZGluZyBmZWF0dXJlIGlzIHByZXNlbnQgaW4ge0BsaW5rIENhY2hlZE1ldGFkYXRhRXguZmVhdHVyZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlZE1ldGFkYXRhRXggZXh0ZW5kcyBDYWNoZWRNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgY29udGVudCBib2R5LiBQb3B1bGF0ZWQgb25seSB3aGVuXG4gICAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5FeHRlcm5hbExpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgZXh0ZXJuYWxMaW5rcz86IFBhcnNlTGlua1JlZmVyZW5jZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyc2luZyBmZWF0dXJlcyB0aGF0IHdlcmUgYXBwbGllZCB3aGVuIGNvbXB1dGluZyB0aGlzIGNhY2hlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZXM6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlW107XG5cbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBzaW5nbGUtbGluayAoc2luZ2xlLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcy4gUG9wdWxhdGVkIG9ubHlcbiAgICogd2hlbiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgZnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VbXTtcblxuICAvKipcbiAgICogVGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcy4gUG9wdWxhdGVkIG9ubHkgd2hlblxuICAgKiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc30gaXMgYXBwbGllZC5cbiAgICovXG4gIG11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW107XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuIFBvcHVsYXRlZCBvbmx5IHdoZW5cbiAgICoge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgbXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3M/OiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW107XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRCYWNrbGlua3NGb3JGaWxlU2FmZU9wdGlvbnMgZXh0ZW5kcyBSZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IGEgdGltZW91dCBub3RpY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd1RpbWVvdXROb3RpY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVQYXJhbXMgZXh0ZW5kcyBHZXRCYWNrbGlua3NGb3JGaWxlU2FmZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBXcmFwcGVyIGZvciB0aGUgZ2V0QmFja2xpbmtzRm9yRmlsZSBtZXRob2QgdGhhdCBwcm92aWRlcyBhIHNhZmUgb3ZlcmxvYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVXcmFwcGVyIHtcbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgc2FmZWx5LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2JqZWN0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGRpY3Rpb25hcnkgb2YgYmFja2xpbmtzLlxuICAgKi9cbiAgc2FmZShwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogUHJvbWlzZTxDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPj47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdldENhY2hlU2FmZX0uXG4gKi9cbmV4cG9ydCB0eXBlIEdldENhY2hlU2FmZU9wdGlvbnMgPSBQYXJzZUNhY2hlT3B0aW9ucztcblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZXRMaW5rc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0TGlua3NQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNhY2hlZCBtZXRhZGF0YSB0byByZXRyaWV2ZSB0aGUgbGlua3MgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlOiBDYWNoZWRNZXRhZGF0YTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBlbWJlZHMgKGBjYWNoZS5lbWJlZHNgKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRW1iZWRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSB0aGUgbm90ZSBib2R5LiBSZXF1aXJlcyB0aGUgY2FjaGUgdG8gYmUgYVxuICAgKiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBzaW5nbGUtbGluayAoc2luZ2xlLXZhbHVlKSBub3RlIGZyb250bWF0dGVyXG4gICAqIHZhbHVlcy4gUmVxdWlyZXMgdGhlIGNhY2hlIHRvIGJlIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBmcm9udG1hdHRlciBsaW5rcyAoYGNhY2hlLmZyb250bWF0dGVyTGlua3NgKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLFxuICAgKiBpLmUuIHRoZSBvZmZzZXQtY2FycnlpbmcgZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MgKG5hcnJvd2VkIHZpYVxuICAgKiB7QGxpbmsgaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzfSkuIFJlcXVpcmVzIHRoZSBjYWNoZSB0byBiZSBhIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4fS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcy5cbiAgICogUmVxdWlyZXMgdGhlIGNhY2hlIHRvIGJlIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHJlZmVyZW5jZSBsaW5rcyAoYGNhY2hlLmxpbmtzYCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZVJlZmVyZW5jZXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSBwYXJzaW5nIHBlcmZvcm1lZCBieSB7QGxpbmsgZ2V0Q2FjaGVTYWZlfSBhbmQge0BsaW5rIHBhcnNlTWV0YWRhdGF9IGJleW9uZCBPYnNpZGlhbidzXG4gKiBuYXRpdmUgbWV0YWRhdGEgcGFyc2luZy4gRWFjaCBvcHRpb24gaXMgb3B0LWluOyBlbmFibGluZyBpdCBhZGRzIHRoZSBjb3JyZXNwb25kaW5nXG4gKiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmV9IGFuZCBwb3B1bGF0ZXMgdGhlIG1hdGNoaW5nIGxpbmtzIGFycmF5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlQ2FjaGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcGFyc2UgdGhlIGV4dGVybmFsIGxpbmtzIGZyb20gdGhlIG5vdGUgY29udGVudCBib2R5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQYXJzZUV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHBhcnNlIHRoZSBleHRlcm5hbCBsaW5rcyBmcm9tIHNpbmdsZS1saW5rIChzaW5nbGUtdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQYXJzZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcGFyc2UgdGhlIGV4dGVybmFsIGxpbmtzIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHBhcnNlIHRoZSBpbnRlcm5hbCBsaW5rcyBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHBhcnNlTWV0YWRhdGF9LlxuICovXG5leHBvcnQgdHlwZSBQYXJzZU1ldGFkYXRhT3B0aW9ucyA9IFBhcnNlQ2FjaGVPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSBjYWNoZSB0byByZWdpc3Rlci5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlOiBDYWNoZWRNZXRhZGF0YTtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byByZWdpc3RlciB0aGUgZmlsZSBjYWNoZSBmb3IuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIEEgc2VsZWN0b3IgZm9yIGEgZmVhdHVyZS1nYXRlZCBsaW5rIGNhdGVnb3J5IGluIHtAbGluayBnZXRMaW5rc30uXG4gKi9cbmludGVyZmFjZSBGZWF0dXJlTGlua1NlbGVjdG9yIHtcbiAgLyoqXG4gICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGxpbmsgY2F0ZWdvcnksIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZmVhdHVyZSB0aGF0IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgY2FjaGUgZm9yIHRoaXMgY2F0ZWdvcnkgdG8gYmUgYXZhaWxhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZTogQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmU7XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgdGhlIGxpbmtzIGZvciB0aGlzIGNhdGVnb3J5IGZyb20gdGhlIGNhY2hlLlxuICAgKi9cbiAgc2VsZWN0KHRoaXM6IHZvaWQsIGNhY2hlOiBDYWNoZWRNZXRhZGF0YUV4KTogUmVmZXJlbmNlW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGlzIGNhdGVnb3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB0b1BhcnNlZENhY2hlZE1ldGFkYXRhRXh9LlxuICovXG5pbnRlcmZhY2UgVG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBwbGFpbiBjYWNoZWQgbWV0YWRhdGEgdG8gd3JhcC5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlOiBDYWNoZWRNZXRhZGF0YTtcblxuICAvKipcbiAgICogVGhlIG5vdGUgY29udGVudCB0aGUgb2Zmc2V0cyBpbmRleCBpbnRvLCB1c2VkIGZvciBib2R5IGV4dGVybmFsLWxpbmsgcGFyc2luZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhcnNlIG9wdGlvbnMgY29udHJvbGxpbmcgd2hpY2ggbGlua3MgdG8gcGFyc2UuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBQYXJzZUNhY2hlT3B0aW9ucztcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgdGhlIG1ldGFkYXRhIGNhY2hlIGlzIHJlYWR5IGZvciBhbGwgZmlsZXMuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG1ldGFkYXRhIGNhY2hlIGlzIHJlYWR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlTWV0YWRhdGFDYWNoZVJlYWR5KGFwcDogQXBwKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgYXBwLm1ldGFkYXRhQ2FjaGUub25DbGVhbkNhY2hlKHJlc29sdmUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGJhY2tsaW5rcyBmb3IgYSBmaWxlIG9yIHBhdGguXG4gKiBOT1RFOiBUaGUgZmlsZSBtYXkgYmUgbm9uLWV4aXN0ZW50LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2JqZWN0LlxuICogQHJldHVybnMgVGhlIGJhY2tsaW5rcyBmb3IgdGhlIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4ge1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICB1c2luZyBfcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJGaWxlcyhhcHAsIFtmaWxlXSk7XG4gIHJldHVybiBhcHAubWV0YWRhdGFDYWNoZS5nZXRCYWNrbGlua3NGb3JGaWxlKGZpbGUpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgc2FmZWx5LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgcmV0cmlldmluZyB0aGUgYmFja2xpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBkaWN0aW9uYXJ5IG9mIGJhY2tsaW5rcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHBhcmFtczogR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVQYXJhbXMpOiBQcm9taXNlPEN1c3RvbUFycmF5RGljdDxSZWZlcmVuY2U+PiB7XG4gIGNvbnN0IHsgYXBwLCBwYXRoT3JGaWxlLCAuLi5vcHRpb25zIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHNhZmVPdmVybG9hZCA9IChhcHAubWV0YWRhdGFDYWNoZS5nZXRCYWNrbGlua3NGb3JGaWxlIGFzIFBhcnRpYWw8R2V0QmFja2xpbmtzRm9yRmlsZVNhZmVXcmFwcGVyPikuc2FmZTtcbiAgaWYgKHNhZmVPdmVybG9hZCkge1xuICAgIHJldHVybiBzYWZlT3ZlcmxvYWQocGF0aE9yRmlsZSk7XG4gIH1cbiAgbGV0IGJhY2tsaW5rczogQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4gPSBuZXcgQ3VzdG9tQXJyYXlEaWN0SW1wbDxSZWZlcmVuY2U+KCk7XG4gIGF3YWl0IHJldHJ5V2l0aFRpbWVvdXROb3RpY2Uoe1xuICAgIGFzeW5jIG9wZXJhdGlvbkZuKGFib3J0U2lnbmFsKSB7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgZmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGUgfSk7XG4gICAgICBhd2FpdCBlbnN1cmVNZXRhZGF0YUNhY2hlUmVhZHkoYXBwKTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBiYWNrbGlua3MgPSBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKGFwcCwgZmlsZSk7XG4gICAgICBmb3IgKGNvbnN0IG5vdGVQYXRoIG9mIGJhY2tsaW5rcy5rZXlzKCkpIHtcbiAgICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgY29uc3Qgbm90ZSA9IGdldEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGU6IG5vdGVQYXRoIH0pO1xuICAgICAgICBpZiAoIW5vdGUpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBzYXZlTm90ZShhcHAsIG5vdGUpO1xuICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkU2FmZShhcHAsIG5vdGUpO1xuICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZnJvbnRtYXR0ZXIgPSBwYXJzZUZyb250bWF0dGVyKGNvbnRlbnQpO1xuICAgICAgICBjb25zdCBsaW5rcyA9IGJhY2tsaW5rcy5nZXQobm90ZVBhdGgpO1xuICAgICAgICBpZiAoIWxpbmtzKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICAgICAgbGV0IGFjdHVhbExpbms6IHN0cmluZztcbiAgICAgICAgICBpZiAoaXNSZWZlcmVuY2VDYWNoZShsaW5rKSkge1xuICAgICAgICAgICAgYWN0dWFsTGluayA9IGNvbnRlbnQuc2xpY2UobGluay5wb3NpdGlvbi5zdGFydC5vZmZzZXQsIGxpbmsucG9zaXRpb24uZW5kLm9mZnNldCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc0Zyb250bWF0dGVyTGlua0NhY2hlKGxpbmspKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0eVZhbHVlID0gZ2V0TmVzdGVkUHJvcGVydHlWYWx1ZShmcm9udG1hdHRlciwgbGluay5rZXkpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eVZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxpbmtXaXRoT2Zmc2V0cyA9IHRvRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyhsaW5rKTtcbiAgICAgICAgICAgIGFjdHVhbExpbmsgPSBwcm9wZXJ0eVZhbHVlLnNsaWNlKGxpbmtXaXRoT2Zmc2V0cy5zdGFydE9mZnNldCwgbGlua1dpdGhPZmZzZXRzLmVuZE9mZnNldCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYWN0dWFsTGluayAhPT0gbGluay5vcmlnaW5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5tZXRhZGF0YUNhY2hlLmdldEJhY2tsaW5rc0ZvckZpbGVQYXRoLCB7IGZpbGVQYXRoOiBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkgfSksXG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBzdHJpY3RQcm94eTxQbHVnaW5Ob3RpY2VDb21wb25lbnQ+KHt9KSxcbiAgICByZXRyeU9wdGlvbnM6IG9wdGlvbnMsXG4gICAgc2hvdWxkU2hvd1RpbWVvdXROb3RpY2U6IG9wdGlvbnMuc2hvdWxkU2hvd1RpbWVvdXROb3RpY2UgPz8gdHJ1ZVxuICB9KTtcblxuICByZXR1cm4gYmFja2xpbmtzO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY2FjaGVkIG1ldGFkYXRhIGZvciBhIGdpdmVuIGZpbGUgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBmaWxlT3JQYXRoIC0gVGhlIGZpbGUgb3IgcGF0aCB0byByZXRyaWV2ZSB0aGUgbWV0YWRhdGEgZm9yLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyc2Ugb3B0aW9ucyBjb250cm9sbGluZyB3aGljaCBhZGRpdGlvbmFsIGxpbmtzIHRvIHBhcnNlLlxuICogQHJldHVybnMgVGhlIGNhY2hlZCBtZXRhZGF0YSBmb3IgdGhlIGZpbGUsIG9yIGBudWxsYCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q2FjaGVTYWZlKGFwcDogQXBwLCBmaWxlT3JQYXRoOiBQYXRoT3JGaWxlLCBvcHRpb25zOiBHZXRDYWNoZVNhZmVPcHRpb25zID0ge30pOiBQcm9taXNlPENhY2hlZE1ldGFkYXRhRXggfCBudWxsPiB7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlT3JOdWxsKHsgYXBwLCBwYXRoT3JGaWxlOiBmaWxlT3JQYXRoIH0pO1xuXG4gIHRyeSB7XG4gICAgaWYgKCFmaWxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgY2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgICBpZiAoZmlsZS5kZWxldGVkKSB7XG4gICAgICBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgc2F2ZU5vdGUoYXBwLCBmaWxlKTtcblxuICAgICAgY29uc3QgZmlsZUNhY2hlRW50cnkgPSBhcHAubWV0YWRhdGFDYWNoZS5maWxlQ2FjaGVbZmlsZS5wYXRoXTtcbiAgICAgIGNvbnN0IGlzVXBUb0RhdGUgPSBmaWxlQ2FjaGVFbnRyeT8ubXRpbWUgPT09IGZpbGUuc3RhdC5tdGltZVxuICAgICAgICAmJiBmaWxlQ2FjaGVFbnRyeS5zaXplID09PSBmaWxlLnN0YXQuc2l6ZVxuICAgICAgICAmJiBhcHAubWV0YWRhdGFDYWNoZS5tZXRhZGF0YUNhY2hlW2ZpbGVDYWNoZUVudHJ5Lmhhc2hdO1xuICAgICAgaWYgKCFpc1VwVG9EYXRlKSB7XG4gICAgICAgIGF3YWl0IGFwcC5tZXRhZGF0YUNhY2hlLmNvbXB1dGVGaWxlTWV0YWRhdGFBc3luYyhmaWxlKTtcbiAgICAgICAgYXdhaXQgZW5zdXJlTWV0YWRhdGFDYWNoZVJlYWR5KGFwcCk7XG4gICAgICB9XG4gICAgICBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcbiAgICB9XG5cbiAgICBpZiAoY2FjaGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIE9ubHkgdGhlIGJvZHktZXh0ZXJuYWwgcGFyc2UgbmVlZHMgdGhlIGZpbGUgY29udGVudDsgZnJvbnRtYXR0ZXIgcGFyc2luZyB1c2VzIHRoZSBjYWNoZWRcbiAgICAvLyBGcm9udG1hdHRlciwgc28gYXZvaWQgcmVhZGluZyB0aGUgY29udGVudCB1bmxlc3MgaXQgaXMgYWN0dWFsbHkgbmVlZGVkLlxuICAgIGNvbnN0IGNvbnRlbnQgPSBvcHRpb25zLnNob3VsZFBhcnNlRXh0ZXJuYWxMaW5rcyA/IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpIDogJyc7XG4gICAgcmV0dXJuIHRvUGFyc2VkQ2FjaGVkTWV0YWRhdGFFeCh7IGNhY2hlLCBjb250ZW50LCBvcHRpb25zIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICghZmlsZSB8fCBmaWxlLmRlbGV0ZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmcm9udCBtYXR0ZXIgZnJvbSB0aGUgbWV0YWRhdGEgY2FjaGUgc2FmZWx5LlxuICpcbiAqIEB0eXBlUGFyYW0gQ3VzdG9tRnJvbnRtYXR0ZXIgLSBUaGUgdHlwZSBvZiBjdXN0b20gZnJvbnQgbWF0dGVyLlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gcmV0cmlldmUgdGhlIGZyb250IG1hdHRlciBmcm9tLlxuICogQHJldHVybnMgVGhlIGNvbWJpbmVkIGZyb250IG1hdHRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZyb250bWF0dGVyU2FmZTxDdXN0b21Gcm9udG1hdHRlciA9IHVua25vd24+KGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogUHJvbWlzZTxDb21iaW5lZEZyb250bWF0dGVyPEN1c3RvbUZyb250bWF0dGVyPj4ge1xuICBjb25zdCBjYWNoZSA9IGF3YWl0IGdldENhY2hlU2FmZShhcHAsIHBhdGhPckZpbGUpO1xuICByZXR1cm4gKGNhY2hlPy5mcm9udG1hdHRlciA/PyB7fSkgYXMgQ29tYmluZWRGcm9udG1hdHRlcjxDdXN0b21Gcm9udG1hdHRlcj47XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBzZWxlY3RlZCBsaW5rcyBmcm9tIHRoZSBwcm92aWRlZCBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJldHJpZXZpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgcmVmZXJlbmNlcyByZXByZXNlbnRpbmcgdGhlIHNlbGVjdGVkIGxpbmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlua3MocGFyYW1zOiBHZXRMaW5rc1BhcmFtcyk6IFJlZmVyZW5jZVtdIHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIHNob3VsZEluY2x1ZGVFbWJlZHMgPSB0cnVlLFxuICAgIHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckxpbmtzID0gdHJ1ZSxcbiAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVSZWZlcmVuY2VzID0gdHJ1ZVxuICB9ID0gcGFyYW1zO1xuXG4gIGxldCBsaW5rczogUmVmZXJlbmNlW10gPSBbXTtcblxuICBpZiAoc2hvdWxkSW5jbHVkZVJlZmVyZW5jZXMgJiYgY2FjaGUubGlua3MpIHtcbiAgICBsaW5rcy5wdXNoKC4uLmNhY2hlLmxpbmtzKTtcbiAgfVxuXG4gIGlmIChzaG91bGRJbmNsdWRlRW1iZWRzICYmIGNhY2hlLmVtYmVkcykge1xuICAgIGxpbmtzLnB1c2goLi4uY2FjaGUuZW1iZWRzKTtcbiAgfVxuXG4gIGlmIChzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJMaW5rcyAmJiBjYWNoZS5mcm9udG1hdHRlckxpbmtzKSB7XG4gICAgbGlua3MucHVzaCguLi5jYWNoZS5mcm9udG1hdHRlckxpbmtzKTtcbiAgfVxuXG4gIGNvbnN0IGZlYXR1cmVMaW5rU2VsZWN0b3JzOiBGZWF0dXJlTGlua1NlbGVjdG9yW10gPSBbXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246ICdib2R5IGV4dGVybmFsIGxpbmtzJyxcbiAgICAgIGZlYXR1cmU6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLkV4dGVybmFsTGlua3MsXG4gICAgICBzZWxlY3Q6IChjYWNoZUV4KSA9PiBjYWNoZUV4LmV4dGVybmFsTGlua3MsXG4gICAgICBzaG91bGRJbmNsdWRlOiBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rc1xuICAgIH0sXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246ICdmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcycsXG4gICAgICBmZWF0dXJlOiBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5Gcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICBzZWxlY3Q6IChjYWNoZUV4KSA9PiBjYWNoZUV4LmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnbXVsdGktdmFsdWUgZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MnLFxuICAgICAgZmVhdHVyZTogQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIHNlbGVjdDogKGNhY2hlRXgpID0+IGNhY2hlRXgubXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgfSxcbiAgICB7XG4gICAgICBkZXNjcmlwdGlvbjogJ211bHRpLXZhbHVlIGZyb250bWF0dGVyIGxpbmtzJyxcbiAgICAgIGZlYXR1cmU6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzLFxuICAgICAgc2VsZWN0OiAoY2FjaGVFeCkgPT4gY2FjaGVFeC5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rc1xuICAgIH1cbiAgXTtcblxuICBmb3IgKGNvbnN0IGZlYXR1cmVMaW5rU2VsZWN0b3Igb2YgZmVhdHVyZUxpbmtTZWxlY3RvcnMpIHtcbiAgICBpZiAoIWZlYXR1cmVMaW5rU2VsZWN0b3Iuc2hvdWxkSW5jbHVkZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NhY2hlZE1ldGFkYXRhRXgoY2FjaGUpIHx8ICFjYWNoZS5mZWF0dXJlcy5pbmNsdWRlcyhmZWF0dXJlTGlua1NlbGVjdG9yLmZlYXR1cmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbmNsdWRlICR7ZmVhdHVyZUxpbmtTZWxlY3Rvci5kZXNjcmlwdGlvbn06IHRoZSBjYWNoZSB3YXMgbm90IGNvbXB1dGVkIHdpdGggdGhlICR7ZmVhdHVyZUxpbmtTZWxlY3Rvci5mZWF0dXJlfSBmZWF0dXJlLmApO1xuICAgIH1cblxuICAgIGxpbmtzLnB1c2goLi4uZW5zdXJlTm9uTnVsbGFibGUoZmVhdHVyZUxpbmtTZWxlY3Rvci5zZWxlY3QoY2FjaGUpKSk7XG4gIH1cblxuICBzb3J0UmVmZXJlbmNlcyhsaW5rcyk7XG5cbiAgLy8gQlVHOiBodHRwczovL2ZvcnVtLm9ic2lkaWFuLm1kL3QvYnVnLWR1cGxpY2F0ZWQtbGlua3MtaW4tbWV0YWRhdGFjYWNoZS1pbnNpZGUtZm9vdG5vdGVzLzg1NTUxXG4gIGxpbmtzID0gbGlua3MuZmlsdGVyKChsaW5rLCBpbmRleCkgPT4ge1xuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNMaW5rID0gZW5zdXJlTm9uTnVsbGFibGUobGlua3NbaW5kZXggLSAxXSk7XG5cbiAgICBpZiAoaXNSZWZlcmVuY2VDYWNoZShsaW5rKSAmJiBpc1JlZmVyZW5jZUNhY2hlKHByZXZpb3VzTGluaykpIHtcbiAgICAgIHJldHVybiBsaW5rLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCAhPT0gcHJldmlvdXNMaW5rLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDtcbiAgICB9XG5cbiAgICBpZiAoaXNGcm9udG1hdHRlckxpbmtDYWNoZShsaW5rKSAmJiBpc0Zyb250bWF0dGVyTGlua0NhY2hlKHByZXZpb3VzTGluaykpIHtcbiAgICAgIGNvbnN0IGxpbmtTdGFydE9mZnNldCA9IGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyhsaW5rKSA/IGxpbmsuc3RhcnRPZmZzZXQgOiAwO1xuICAgICAgY29uc3QgcHJldmlvdXNMaW5rU3RhcnRPZmZzZXQgPSBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMocHJldmlvdXNMaW5rKSA/IHByZXZpb3VzTGluay5zdGFydE9mZnNldCA6IDA7XG4gICAgICByZXR1cm4gbGluay5rZXkgIT09IHByZXZpb3VzTGluay5rZXkgfHwgaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKGxpbmspICE9PSBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMocHJldmlvdXNMaW5rKVxuICAgICAgICB8fCBsaW5rU3RhcnRPZmZzZXQgIT09IHByZXZpb3VzTGlua1N0YXJ0T2Zmc2V0O1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gbGlua3M7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgY2FjaGUgaXMgYSB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0gKGkuZS4gaXQgd2FzIGNvbXB1dGVkIHdpdGggZXh0ZXJuYWwtbGlua1xuICogcGFyc2luZyBlbmFibGVkKS5cbiAqXG4gKiBAcGFyYW0gY2FjaGUgLSBUaGUgY2FjaGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGNhY2hlIGlzIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FjaGVkTWV0YWRhdGFFeChjYWNoZTogQ2FjaGVkTWV0YWRhdGEpOiBjYWNoZSBpcyBDYWNoZWRNZXRhZGF0YUV4IHtcbiAgcmV0dXJuICdmZWF0dXJlcycgaW4gY2FjaGU7XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBtZXRhZGF0YSBmb3IgYSBnaXZlbiBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gc3RyIC0gVGhlIHN0cmluZyB0byBwYXJzZSB0aGUgbWV0YWRhdGEgZm9yLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyc2Ugb3B0aW9ucyBjb250cm9sbGluZyB3aGljaCBhZGRpdGlvbmFsIGxpbmtzIHRvIHBhcnNlLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhcnNlTWV0YWRhdGEoYXBwOiBBcHAsIHN0cjogc3RyaW5nLCBvcHRpb25zOiBQYXJzZU1ldGFkYXRhT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxDYWNoZWRNZXRhZGF0YUV4PiB7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgY29uc3QgYnVmZmVyID0gZW5jb2Rlci5lbmNvZGUoc3RyKS5idWZmZXI7XG4gIGNvbnN0IGNhY2hlID0gYXdhaXQgYXBwLm1ldGFkYXRhQ2FjaGUuY29tcHV0ZU1ldGFkYXRhQXN5bmMoYnVmZmVyKSA/PyB7fTtcbiAgcmV0dXJuIHRvUGFyc2VkQ2FjaGVkTWV0YWRhdGFFeCh7IGNhY2hlLCBjb250ZW50OiBzdHIsIG9wdGlvbnMgfSk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSBmaWxlIGNhY2hlIGZvciBhIG5vbi1leGlzdGluZyBmaWxlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgcmVnaXN0ZXJpbmcgdGhlIGZpbGUgY2FjaGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHVucmVnaXN0ZXJzIHRoZSBmaWxlIGNhY2hlIHdoZW4gZGlzcG9zZWQsIGZvciB1c2Ugd2l0aCBgdXNpbmdgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUocGFyYW1zOiBSZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZVBhcmFtcyk6IERpc3Bvc2FibGUge1xuICBjb25zdCB7IGFwcCwgY2FjaGUsIHBhdGhPckZpbGUgfSA9IHBhcmFtcztcbiAgY29uc3QgZmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgaWYgKCFmaWxlLmRlbGV0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpbGUgaXMgZXhpc3RpbmcnKTtcbiAgfVxuXG4gIGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVDYWNoZVtmaWxlLnBhdGhdID0ge1xuICAgIGhhc2g6IGZpbGUucGF0aCxcbiAgICBtdGltZTogMCxcbiAgICBzaXplOiAwXG4gIH07XG5cbiAgYXBwLm1ldGFkYXRhQ2FjaGUubWV0YWRhdGFDYWNoZVtmaWxlLnBhdGhdID0gY2FjaGU7XG5cbiAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICB1bnJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlKGFwcCwgZmlsZSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgZmlsZXMgaW4gdGhlIE9ic2lkaWFuIGFwcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBmaWxlcyAtIFRoZSBmaWxlcyB0byByZWdpc3Rlci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgdW5yZWdpc3RlcnMgdGhlIGZpbGVzIHdoZW4gZGlzcG9zZWQsIGZvciB1c2Ugd2l0aCBgdXNpbmdgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGaWxlcyhhcHA6IEFwcCwgZmlsZXM6IFRBYnN0cmFjdEZpbGVbXSk6IERpc3Bvc2FibGUge1xuICBjb25zdCByZWdpc3RlcmVkRmlsZXNDb3VudHMgPSBnZXRSZWdpc3RlcmVkRmlsZXNDb3VudHMoKTtcblxuICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgd2hpbGUgKGZpbGUuZGVsZXRlZCkge1xuICAgICAgbGV0IGNvdW50ID0gcmVnaXN0ZXJlZEZpbGVzQ291bnRzLmdldChmaWxlLnBhdGgpID8/IDA7XG4gICAgICBjb3VudCsrO1xuICAgICAgcmVnaXN0ZXJlZEZpbGVzQ291bnRzLnNldChmaWxlLnBhdGgsIGNvdW50KTtcblxuICAgICAgYXBwLnZhdWx0LmZpbGVNYXBbZmlsZS5wYXRoXSA9IGZpbGU7XG5cbiAgICAgIGlmIChpc0ZpbGUoZmlsZSkpIHtcbiAgICAgICAgYXBwLm1ldGFkYXRhQ2FjaGUudW5pcXVlRmlsZUxvb2t1cC5hZGQoZmlsZS5uYW1lLnRvTG93ZXJDYXNlKCksIGZpbGUpO1xuICAgICAgfVxuXG4gICAgICBmaWxlID0gZ2V0Rm9sZGVyKHtcbiAgICAgICAgYXBwLFxuICAgICAgICBwYXRoT3JGb2xkZXI6IHBhcmVudEZvbGRlclBhdGgoZmlsZS5wYXRoKSxcbiAgICAgICAgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgIHVucmVnaXN0ZXJGaWxlcyhhcHAsIGZpbGVzKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFVucmVnaXN0ZXJzIHRoZSBmaWxlIGNhY2hlIGZvciBhIG5vbi1leGlzdGluZyBmaWxlLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIHVucmVnaXN0ZXIgdGhlIGZpbGUgY2FjaGUgZm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5yZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZShhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBpZiAoIWZpbGUuZGVsZXRlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBpcyBleGlzdGluZycpO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAgZGVsZXRlIGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVDYWNoZVtmaWxlLnBhdGhdO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIFdlIGhhdmUgbm8gb3RoZXIgd2F5IHRvIGRlbGV0ZSB0aGUgcHJvcGVydHkuXG4gIGRlbGV0ZSBhcHAubWV0YWRhdGFDYWNoZS5tZXRhZGF0YUNhY2hlW2ZpbGUucGF0aF07XG59XG5cbi8qKlxuICogVW5yZWdpc3RlcnMgZmlsZXMgZnJvbSB0aGUgT2JzaWRpYW4gYXBwLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGZpbGVzIC0gVGhlIGZpbGVzIHRvIHVucmVnaXN0ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnJlZ2lzdGVyRmlsZXMoYXBwOiBBcHAsIGZpbGVzOiBUQWJzdHJhY3RGaWxlW10pOiB2b2lkIHtcbiAgY29uc3QgcmVnaXN0ZXJlZEZpbGVzQ291bnRzID0gZ2V0UmVnaXN0ZXJlZEZpbGVzQ291bnRzKCk7XG5cbiAgZm9yIChsZXQgZmlsZSBvZiBmaWxlcykge1xuICAgIHdoaWxlIChmaWxlLmRlbGV0ZWQpIHtcbiAgICAgIGxldCBjb3VudCA9IHJlZ2lzdGVyZWRGaWxlc0NvdW50cy5nZXQoZmlsZS5wYXRoKSA/PyAxO1xuICAgICAgY291bnQtLTtcbiAgICAgIHJlZ2lzdGVyZWRGaWxlc0NvdW50cy5zZXQoZmlsZS5wYXRoLCBjb3VudCk7XG4gICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgcmVnaXN0ZXJlZEZpbGVzQ291bnRzLmRlbGV0ZShmaWxlLnBhdGgpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIFdlIGhhdmUgbm8gb3RoZXIgd2F5IHRvIGRlbGV0ZSB0aGUgcHJvcGVydHkuXG4gICAgICAgIGRlbGV0ZSBhcHAudmF1bHQuZmlsZU1hcFtmaWxlLnBhdGhdO1xuXG4gICAgICAgIGlmIChpc0ZpbGUoZmlsZSkpIHtcbiAgICAgICAgICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLnJlbW92ZShmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZmlsZSA9IGdldEZvbGRlcih7XG4gICAgICAgIGFwcCxcbiAgICAgICAgcGF0aE9yRm9sZGVyOiBwYXJlbnRGb2xkZXJQYXRoKGZpbGUucGF0aCksXG4gICAgICAgIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlZ2lzdGVyZWRGaWxlc0NvdW50cygpOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSgncmVnaXN0ZXJlZEZpbGVzQ291bnRzJywgbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKSkudmFsdWU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXh0ZXJuYWxCb2R5TGlua3MoY29udGVudDogc3RyaW5nLCBjYWNoZTogQ2FjaGVkTWV0YWRhdGEpOiBQYXJzZUxpbmtSZWZlcmVuY2VbXSB7XG4gIGNvbnN0IGZyb250bWF0dGVyRW5kT2Zmc2V0ID0gY2FjaGUuZnJvbnRtYXR0ZXJQb3NpdGlvbj8uZW5kLm9mZnNldCA/PyAwO1xuICByZXR1cm4gcGFyc2VMaW5rcyhjb250ZW50KVxuICAgIC5maWx0ZXIoKHBhcnNlTGlua1Jlc3VsdCkgPT4gcGFyc2VMaW5rUmVzdWx0LmlzRXh0ZXJuYWwgJiYgcGFyc2VMaW5rUmVzdWx0LnN0YXJ0T2Zmc2V0ID49IGZyb250bWF0dGVyRW5kT2Zmc2V0KVxuICAgIC5tYXAoKHBhcnNlTGlua1Jlc3VsdCkgPT4gdG9QYXJzZUxpbmtSZWZlcmVuY2UoeyBjb250ZW50LCBwYXJzZUxpbmtSZXN1bHQgfSkpO1xufVxuXG5mdW5jdGlvbiB0b1BhcnNlZENhY2hlZE1ldGFkYXRhRXgocGFyYW1zOiBUb1BhcnNlZENhY2hlZE1ldGFkYXRhRXhQYXJhbXMpOiBDYWNoZWRNZXRhZGF0YUV4IHtcbiAgY29uc3QgeyBjYWNoZSwgY29udGVudCwgb3B0aW9ucyB9ID0gcGFyYW1zO1xuICBjb25zdCBmZWF0dXJlczogQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmVbXSA9IFtDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5OYXRpdmVdO1xuICBjb25zdCByZXN1bHQ6IENhY2hlZE1ldGFkYXRhRXggPSB7IC4uLmNhY2hlLCBmZWF0dXJlcyB9O1xuXG4gIGlmIChvcHRpb25zLnNob3VsZFBhcnNlRXh0ZXJuYWxMaW5rcykge1xuICAgIHJlc3VsdC5leHRlcm5hbExpbmtzID0gcGFyc2VFeHRlcm5hbEJvZHlMaW5rcyhjb250ZW50LCBjYWNoZSk7XG4gICAgZmVhdHVyZXMucHVzaChDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5FeHRlcm5hbExpbmtzKTtcbiAgfVxuXG4gIGlmIChcbiAgICBvcHRpb25zLnNob3VsZFBhcnNlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgfHwgb3B0aW9ucy5zaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICB8fCBvcHRpb25zLnNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3NcbiAgKSB7XG4gICAgY29uc3QgZnJvbnRtYXR0ZXJMaW5rcyA9IHBhcnNlRnJvbnRtYXR0ZXJMaW5rcyhjYWNoZS5mcm9udG1hdHRlcik7XG5cbiAgICBpZiAob3B0aW9ucy5zaG91bGRQYXJzZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcykge1xuICAgICAgcmVzdWx0LmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZyb250bWF0dGVyTGlua3MuZnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzO1xuICAgICAgZmVhdHVyZXMucHVzaChDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5Gcm9udG1hdHRlckV4dGVybmFsTGlua3MpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcykge1xuICAgICAgcmVzdWx0Lm11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmcm9udG1hdHRlckxpbmtzLm11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M7XG4gICAgICBmZWF0dXJlcy5wdXNoKENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MpIHtcbiAgICAgIHJlc3VsdC5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyA9IGZyb250bWF0dGVyTGlua3MubXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3M7XG4gICAgICBmZWF0dXJlcy5wdXNoKENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIl0sCiAgIm1hcHBp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O0FBQ0EsNEJBQXNCLElBQUksS0FBSyxNQUFNLEtBQUs7QUFDMUMsVUFBSSxVQUFVLEdBQUc7QUFDZiw4QkFBc0IsT0FBTyxLQUFLLElBQUk7QUFFdEMsZUFBTyxJQUFJLE1BQU0sUUFBUSxLQUFLLElBQUk7QUFFbEMsWUFBSSxPQUFPLElBQUksR0FBRztBQUNoQixjQUFJLGNBQWMsaUJBQWlCLE9BQU8sS0FBSyxLQUFLLFlBQVksR0FBRyxJQUFJO0FBQUEsUUFDekU7QUFBQSxNQUNGO0FBRUEsYUFBTyxVQUFVO0FBQUEsUUFDZjtBQUFBLFFBQ0EsY0FBYyxpQkFBaUIsS0FBSyxJQUFJO0FBQUEsUUFDeEMsMEJBQTBCO0FBQUEsTUFDNUIsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLDJCQUFnRDtBQUN2RCxTQUFPLHlCQUF5Qix5QkFBeUIsb0JBQUksSUFBb0IsQ0FBQyxFQUFFO0FBQ3RGO0FBRUEsU0FBUyx1QkFBdUIsU0FBaUIsT0FBNkM7QUFDNUYsUUFBTSx1QkFBdUIsTUFBTSxxQkFBcUIsSUFBSSxVQUFVO0FBQ3RFLFNBQU8sV0FBVyxPQUFPLEVBQ3RCLE9BQU8sQ0FBQyxvQkFBb0IsZ0JBQWdCLGNBQWMsZ0JBQWdCLGVBQWUsb0JBQW9CLEVBQzdHLElBQUksQ0FBQyxvQkFBb0IscUJBQXFCLEVBQUUsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ2hGO0FBRUEsU0FBUyx5QkFBeUIsUUFBMEQ7QUFDMUYsUUFBTSxFQUFFLE9BQU8sU0FBUyxRQUFRLElBQUk7QUFDcEMsUUFBTSxXQUFzQyxDQUFDLHFCQUE4QjtBQUMzRSxRQUFNLFNBQTJCLEVBQUUsR0FBRyxPQUFPLFNBQVM7QUFFdEQsTUFBSSxRQUFRLDBCQUEwQjtBQUNwQyxXQUFPLGdCQUFnQix1QkFBdUIsU0FBUyxLQUFLO0FBQzVELGFBQVMsS0FBSyxtQ0FBcUM7QUFBQSxFQUNyRDtBQUVBLE1BQ0UsUUFBUSx1Q0FDTCxRQUFRLGlEQUNSLFFBQVEsdUNBQ1g7QUFDQSxVQUFNLG1CQUFtQixzQkFBc0IsTUFBTSxXQUFXO0FBRWhFLFFBQUksUUFBUSxxQ0FBcUM7QUFDL0MsYUFBTywyQkFBMkIsaUJBQWlCO0FBQ25ELGVBQVMsS0FBSyx5REFBZ0Q7QUFBQSxJQUNoRTtBQUVBLFFBQUksUUFBUSwrQ0FBK0M7QUFDekQsYUFBTyxxQ0FBcUMsaUJBQWlCO0FBQzdELGVBQVMsS0FBSyw2RUFBMEQ7QUFBQSxJQUMxRTtBQUVBLFFBQUksUUFBUSx1Q0FBdUM7QUFDakQsYUFBTyw2QkFBNkIsaUJBQWlCO0FBQ3JELGVBQVMsS0FBSyw2REFBa0Q7QUFBQSxJQUNsRTtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbIkNhY2hlZE1ldGFkYXRhRXhGZWF0dXJlIl0KfQo=
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
* the modal closes (even if it is closed while minimized).
|
|
43
43
|
*/
|
|
44
44
|
import { Modal } from 'obsidian';
|
|
45
|
+
import { MonkeyAroundComponent } from '../components/monkey-around-component.mjs';
|
|
45
46
|
/**
|
|
46
47
|
* Wraps a {@link Modal} instance to make it minimizable to a small floating bar and restorable. While
|
|
47
48
|
* minimized the app is put into a peek-only lock (keyboard, context menu, and opening other modals are
|
|
@@ -60,7 +61,13 @@ export declare class MinimizableModal<TModal extends Modal> {
|
|
|
60
61
|
* @returns `true` if the modal is currently minimized, `false` otherwise.
|
|
61
62
|
*/
|
|
62
63
|
get isMinimized(): boolean;
|
|
63
|
-
|
|
64
|
+
/**
|
|
65
|
+
* Patches the wrapped modal's `onClose` to run cleanup. Persists for the wrapper's whole life (a
|
|
66
|
+
* modal can be reopened, so the patch must survive each close), hence a dedicated component that is
|
|
67
|
+
* never unloaded — distinct from `peekLockComponent`, whose patches live only while minimized.
|
|
68
|
+
* Exposed to subclasses so they can register additional lifetime-scoped patches on the wrapper.
|
|
69
|
+
*/
|
|
70
|
+
protected readonly closePatchComponent: MonkeyAroundComponent;
|
|
64
71
|
private isMinimizedValue;
|
|
65
72
|
private readonly minimizeButtonEl;
|
|
66
73
|
private minimizedBarEl;
|
|
@@ -111,9 +111,12 @@ class MinimizableModal {
|
|
|
111
111
|
get isMinimized() {
|
|
112
112
|
return this.isMinimizedValue;
|
|
113
113
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
114
|
+
/**
|
|
115
|
+
* Patches the wrapped modal's `onClose` to run cleanup. Persists for the wrapper's whole life (a
|
|
116
|
+
* modal can be reopened, so the patch must survive each close), hence a dedicated component that is
|
|
117
|
+
* never unloaded — distinct from `peekLockComponent`, whose patches live only while minimized.
|
|
118
|
+
* Exposed to subclasses so they can register additional lifetime-scoped patches on the wrapper.
|
|
119
|
+
*/
|
|
117
120
|
closePatchComponent = new MonkeyAroundComponent();
|
|
118
121
|
isMinimizedValue = false;
|
|
119
122
|
minimizeButtonEl;
|
|
@@ -294,4 +297,4 @@ function suppressWhilePeekLocked(evt) {
|
|
|
294
297
|
export {
|
|
295
298
|
MinimizableModal
|
|
296
299
|
};
|
|
297
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9taW5pbWl6YWJsZS1tb2RhbC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgd3JhcHBlciB0aGF0IG1ha2VzIGFueSBPYnNpZGlhbiB7QGxpbmsgTW9kYWx9IG1pbmltaXphYmxlIHRvIGEgZmxvYXRpbmcgYmFyIFx1MjAxNCB3aXRob3V0IGJyZWFraW5nIHRoZVxuICogbW9kYWwncyBibG9ja2luZyBjb250cmFjdC5cbiAqXG4gKiBPYnNpZGlhbidzIHtAbGluayBNb2RhbH0gaXMgYmxvY2tpbmc6IHdoaWxlIGl0IGlzIG9wZW4gdGhlIHJlc3Qgb2YgdGhlIGFwcCBpcyBtZWFudCB0byBiZSBpbmVydCB1bnRpbFxuICogdGhlIG1vZGFsIGlzIGRpc21pc3NlZC4ge0BsaW5rIE1pbmltaXphYmxlTW9kYWx9IHdyYXBzIGFueSBtb2RhbCBpbnN0YW5jZSAocGxhaW4gYE1vZGFsYCxcbiAqIGBGdXp6eVN1Z2dlc3RNb2RhbGAsIHRoZSBsaWJyYXJ5J3MgYE1vZGFsQmFzZWAsIHlvdXIgb3duIHN1YmNsYXNzLCBcdTIwMjYgXHUyMDE0IGluY2x1ZGluZyBtb2RhbHMgeW91IGRvIG5vdFxuICogb3duKSBhbmQgYWRkcyBhIG1pbmltaXplIGJ1dHRvbi4gTWluaW1pemluZyBoaWRlcyB0aGUgbW9kYWwgYW5kIGl0cyBibG9ja2luZyBiYWNrZHJvcCBhbmQgc2hvd3MgYVxuICogc21hbGwgZmxvYXRpbmcgYmFyIHdpdGggYSByZXN0b3JlIGJ1dHRvbiwgc28gdGhlIHVzZXIgY2FuIHBlZWsgYXQgdGhlIG5vdGVzL2ZvbGRlcnMgdGhlIG9wZXJhdGlvblxuICogaW52b2x2ZXMgXHUyMDE0IGJ1dCB0aGUgbW9kYWwgaXMgTk9UIGRpc21pc3NlZCwgc28gaXRzIGJsb2NraW5nIGNvbnRyYWN0IG11c3QgYmUgcHJlc2VydmVkLlxuICpcbiAqIFRvIGtlZXAgdGhhdCBjb250cmFjdCB3aGlsZSBtaW5pbWl6ZWQsIHRoZSB3cmFwcGVyIHB1dHMgdGhlIGFwcCBpbnRvIGEgKipwZWVrLW9ubHkgbG9jayoqOiB0aGUgdXNlclxuICogbWF5IG1vdXNlLWNsaWNrIGFuZCBzY3JvbGwgdG8gaW5zcGVjdCBjb250ZW50LCBidXQgY2Fubm90IHN0YXJ0IGFueXRoaW5nIG5ldy4gV2hpbGUgYW55IG1vZGFsIGlzXG4gKiBtaW5pbWl6ZWQgdGhlIHdyYXBwZXI6XG4gKiAtIGJsb2NrcyB0aGUga2V5Ym9hcmQgKHR5cGluZywgaG90a2V5cywgdGhlIGNvbW1hbmQtcGFsZXR0ZSBzaG9ydGN1dCksXG4gKiAtIGJsb2NrcyB0aGUgcmlnaHQtY2xpY2sgY29udGV4dCBtZW51LCBhbmRcbiAqIC0gYmxvY2tzIG9wZW5pbmcgYW55IG90aGVyIG1vZGFsIChhIHJlLWZpcmVkIGNvbW1hbmQsIHRoZSBjb21tYW5kIHBhbGV0dGUsIHNldHRpbmdzLCBcdTIwMjYpLlxuICpcbiAqIEEgYmxvY2tlZCBhdHRlbXB0IGZsYXNoZXMgdGhlIGZsb2F0aW5nIGJhciBhbmQgYmVlcHMgc28gdGhlIHVzZXIgc2VlcyAoYW5kIGhlYXJzKSB3aHkgbm90aGluZ1xuICogaGFwcGVuZWQuIFJlc3RvcmluZyAob3IgdGhlIG1vZGFsIGNsb3NpbmcpIGxpZnRzIHRoZSBsb2NrLiBUaGlzIHByZXZlbnRzLCBmb3IgZXhhbXBsZSwgbWluaW1pemluZyBhXG4gKiBcIm1lcmdlIGZvbGRlclwiIHBpY2tlciBhbmQgdGhlbiBmaXJpbmcgdGhlIHNhbWUgY29tbWFuZCBhZ2FpbiB0byBzdGFjayBzZXZlcmFsIGNvbmN1cnJlbnQgbWVyZ2VzLlxuICpcbiAqIFRoZSB3cmFwcGVyIHJldXNlcyB0aGUgbW9kYWwncyBvd24gdGl0bGUgKGB0aXRsZUVsYCkgYXMgdGhlIG1pbmltaXplZCBiYXIgbGFiZWwsIHNvIHNldCB0aGUgdGl0bGVcbiAqIHRoZSB1c3VhbCB3YXkgKGBtb2RhbC5zZXRUaXRsZSguLi4pYCkuIFJlbmRlciBhcmJpdHJhcnkgY29udGVudCBpbnRvIHtAbGluayBNb2RhbC5jb250ZW50RWx9LFxuICogaW5jbHVkaW5nIGNsaWNrYWJsZSBub3RlIGxpbmtzIHByb2R1Y2VkIGJ5IGByZW5kZXJJbnRlcm5hbExpbmtgIGZyb21cbiAqIGBvYnNpZGlhbi1kZXYtdXRpbHMvb2JzaWRpYW4vbWFya2Rvd25gOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBtb2RhbCA9IG5ldyBNeU1vZGFsKGFwcCk7XG4gKiBtb2RhbC5zZXRUaXRsZSgnTWVyZ2luZyBub3RlcycpO1xuICogbW9kYWwuY29udGVudEVsLmFwcGVuZENoaWxkKGF3YWl0IHJlbmRlckludGVybmFsTGluayh7IGFwcCwgcGF0aE9yQWJzdHJhY3RGaWxlOiBmaWxlIH0pKTtcbiAqXG4gKiBjb25zdCBtaW5pbWl6YWJsZSA9IG5ldyBNaW5pbWl6YWJsZU1vZGFsKG1vZGFsKTtcbiAqIG1pbmltaXphYmxlLm1vZGFsLm9wZW4oKTtcbiAqIG1pbmltaXphYmxlLm1pbmltaXplKCk7IC8vIGEgZmxvYXRpbmcgYmFyIG9mZmVycyBcInJlc3RvcmVcIjsgdGhlIGFwcCBpcyBwZWVrLW9ubHkgdW50aWwgcmVzdG9yZWRcbiAqIGBgYFxuICpcbiAqIFRoZSB3cmFwcGVkIG1vZGFsIGNhbiBzdGlsbCBiZSBjbG9zZWQgbm9ybWFsbHk7IHRoZSBmbG9hdGluZyBiYXIgaXMgY2xlYW5lZCB1cCBhdXRvbWF0aWNhbGx5IHdoZW5cbiAqIHRoZSBtb2RhbCBjbG9zZXMgKGV2ZW4gaWYgaXQgaXMgY2xvc2VkIHdoaWxlIG1pbmltaXplZCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7XG4gIE1vZGFsLFxuICBzZXRJY29uXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgQmVlcGVyIH0gZnJvbSAnLi4vLi4vYmVlcGVyLnRzJztcbmltcG9ydCB7IEFsbFdpbmRvd3NFdmVudENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYWxsLXdpbmRvd3MtZXZlbnQtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IE1vbmtleUFyb3VuZENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuLi9jc3MtY2xhc3MudHMnO1xuaW1wb3J0IHsgYWRkUGx1Z2luQ3NzQ2xhc3NlcyB9IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tY29udGV4dC50cyc7XG5cbmNvbnN0IE1JTklNSVpFX0lDT05fSUQgPSAnbWludXMnO1xuY29uc3QgUkVTVE9SRV9JQ09OX0lEID0gJ21heGltaXplLTInO1xuXG4vLyBOYXZpZ2F0aW9uIGtleXMgcGFzcyB0aHJvdWdoIHdoaWxlIG1pbmltaXplZCBzbyB0aGUgdXNlciBjYW4gbW92ZSB0aGUgY3Vyc29yIGFuZCBzY3JvbGwgdG8gcmVhZC5cbi8vIE5vbmUgb2YgdGhlbSBtdXRhdGUgdGhlIGRvY3VtZW50IFx1MjAxNCB0ZXh0IGNoYW5nZXMgYXJlIGNhdWdodCBzZXBhcmF0ZWx5IGJ5IHRoZSBgYmVmb3JlaW5wdXRgIGd1YXJkLlxuLy8gU2hpZnQrbmF2aWdhdGlvbiBpcyBibG9ja2VkLCB0aG91Z2gsIHNpbmNlIGl0IGV4dGVuZHMgdGhlIHNlbGVjdGlvbiB0aGF0IGluc3BlY3Rpb24gZG9lcyBub3QgbmVlZC5cbmNvbnN0IE5BVklHQVRJT05fS0VZUyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gICdBcnJvd0Rvd24nLFxuICAnQXJyb3dMZWZ0JyxcbiAgJ0Fycm93UmlnaHQnLFxuICAnQXJyb3dVcCcsXG4gICdFbmQnLFxuICAnSG9tZScsXG4gICdQYWdlRG93bicsXG4gICdQYWdlVXAnXG5dKTtcblxuLy8gQSBiYXJlIG1vZGlmaWVyIHByZXNzIGRvZXMgbm90aGluZyBvbiBpdHMgb3duLCBzbyBpdCBwYXNzZXMgdGhyb3VnaCB0aGUgbG9jay5cbi8vIFRoaXMgYXZvaWRzIGEgc3B1cmlvdXMgZmxhc2gvYmVlcCB3aGlsZSBjb21wb3NpbmcgYSBzaG9ydGN1dDsgdGhlIHNob3J0Y3V0J3MgY29tbWFuZCBrZXkgaXMgYmxvY2tlZC5cbmNvbnN0IE1PRElGSUVSX0tFWVMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAnQWx0JyxcbiAgJ0NvbnRyb2wnLFxuICAnTWV0YScsXG4gICdTaGlmdCdcbl0pO1xuXG4vKipcbiAqIEEgcmVnaXN0ZXJlZCBlbnRyeSBmb3IgYSBjdXJyZW50bHktbWluaW1pemVkIG1vZGFsLiBUaGUgc2hhcmVkIHBlZWstb25seSBsb2NrIHVzZXMgaXQgdG8ga25vdyBhXG4gKiBtb2RhbCBpcyBtaW5pbWl6ZWQsIHRvIGxlYXZlIHRoYXQgbW9kYWwncyBvd24gcmUtb3BlbnMgYWxvbmUsIGFuZCB0byBmbGFzaCBpdHMgYmFyIG9uIGEgYmxvY2tlZFxuICogYXR0ZW1wdC5cbiAqL1xuaW50ZXJmYWNlIFBlZWtMb2NrRW50cnkge1xuICAvKipcbiAgICogVGhlIGZsb2F0aW5nIGJhciBlbGVtZW50LiBVc2VkIHRvIGRldGVjdCBhIHN0YWxlIGVudHJ5IChpdHMgYmFyIGhhcyBsZWZ0IHRoZSBET00pIHNvIGl0IGNhbiBiZVxuICAgKiBwcnVuZWQgYW5kIG5ldmVyIGtlZXAgdGhlIGFwcCBsb2NrZWQuXG4gICAqL1xuICByZWFkb25seSBiYXJFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIEZsYXNoZXMgdGhlIGZsb2F0aW5nIGJhciB0byBzaWduYWwgYSBibG9ja2VkIGF0dGVtcHQuXG4gICAqL1xuICBmbGFzaCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgd3JhcHBlZCBtb2RhbCBpbnN0YW5jZSwgc28gaXRzIG93biBgb3BlbigpYCBpcyBuZXZlciBibG9ja2VkIGJ5IHRoZSBsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5uZXJNb2RhbDogTW9kYWw7XG59XG5cbmNvbnN0IHBlZWtMb2NrRW50cmllcyA9IG5ldyBTZXQ8UGVla0xvY2tFbnRyeT4oKTtcbmNvbnN0IGJlZXBlciA9IG5ldyBCZWVwZXIoKTtcblxuLyoqXG4gKiBJbnN0YWxscyB0aGUgcGVlay1vbmx5IGxvY2sncyBgb3BlbmAgcGF0Y2hlcyB3aGlsZSBhdCBsZWFzdCBvbmUgbW9kYWwgaXMgbWluaW1pemVkLiBCZWluZyBhXG4gKiB7QGxpbmsgTW9ua2V5QXJvdW5kQ29tcG9uZW50fSwgYm90aCBwYXRjaGVzIGFyZSB0b3JuIGRvd24gYXV0b21hdGljYWxseSBvbiBgdW5sb2FkYCwgc28gdGhleSBleGlzdFxuICogb25seSB3aGlsZSB0aGUgbG9jayBpcyBhY3RpdmUuIEEgbWluaW1pemVkIG1vZGFsJ3Mgb3duIHJlLW9wZW4gaXMgYWx3YXlzIGFsbG93ZWQgKHNlZVxuICoge0BsaW5rIHNob3VsZEJsb2NrT3Blbn0pOyBldmVyeSBvdGhlciBtb2RhbCBvcGVuIGlzIGJsb2NrZWQgYW5kIHNpZ25hbHMgYSBmbGFzaCArIGJlZXAuXG4gKi9cbmNsYXNzIFBlZWtMb2NrQ29tcG9uZW50IGV4dGVuZHMgTW9ua2V5QXJvdW5kQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwIHdob3NlIHNldHRpbmdzIG1vZGFsIGlzIGd1YXJkZWQgYW5kIHdob3NlIHdpbmRvd3Mgc3VwcHJlc3MgaW5wdXQgd2hpbGUgbG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUgYG9wZW5gIHBhdGNoZXMgYW5kIHRoZSBpbnB1dCBzdXBwcmVzc29ycy5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG5cbiAgICAvLyBCbG9jayBvcGVuaW5nIGFueSBPVEhFUiBtb2RhbCB3aGlsZSBhIG1vZGFsIGlzIG1pbmltaXplZCAodGhlIGNvbW1hbmQgcGFsZXR0ZSwgYSByZS1maXJlZFxuICAgIC8vIENvbW1hbmQsIGFub3RoZXIgcGx1Z2luIG1vZGFsLCBcdTIwMjYpLlxuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxNb2RhbCwgJ29wZW4nPih7XG4gICAgICBtZXRob2ROYW1lOiAnb3BlbicsXG4gICAgICBvYmo6IE1vZGFsLnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsVGhpcyB9KTogdm9pZCA9PiB7XG4gICAgICAgIGJsb2NrT3JGYWxsYmFjayhvcmlnaW5hbFRoaXMsIGZhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE9ic2lkaWFuJ3MgU2V0dGluZ3MgaXMgYSAqcG9wb3V0KiBtb2RhbDogb24gZGVza3RvcCBpdHMgb3duIGBvcGVuKClgIGZpcnN0IGNyZWF0ZXMgYSBzZXBhcmF0ZSBPU1xuICAgIC8vIFdpbmRvdyAodmlhIGBzaG91bGRVc2VQb3BvdXQoKWAvYGdldFBvcG91dE9wdGlvbnMoKWApIGFuZCBvbmx5IFRIRU4gZGVsZWdhdGVzIHRvXG4gICAgLy8gYE1vZGFsLnByb3RvdHlwZS5vcGVuYCB0byByZW5kZXIgdGhlIGFjdGl2ZSB0YWIgaW50byBpdC4gR3VhcmRpbmcgb25seSBgTW9kYWwucHJvdG90eXBlLm9wZW5gXG4gICAgLy8gVGhlcmVmb3JlIGJsb2NrcyB0aGUgcmVuZGVyIGJ1dCBsZWF2ZXMgYW4gZW1wdHkgc2V0dGluZ3Mgd2luZG93IGJlaGluZCBcdTIwMTQgdGhlIHJlcG9ydGVkIGJhZCBVWC5cbiAgICAvLyBHdWFyZGluZyB0aGUgc2V0dGluZ3MgbW9kYWwncyBvd24gYG9wZW4oKWAgYmxvY2tzIGl0ICpiZWZvcmUqIHRoZSB3aW5kb3cgaXMgY3JlYXRlZC5cbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8QXBwWydzZXR0aW5nJ10sICdvcGVuJz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ29wZW4nLFxuICAgICAgb2JqOiB0aGlzLmFwcC5zZXR0aW5nLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pOiB2b2lkID0+IHtcbiAgICAgICAgYmxvY2tPckZhbGxiYWNrKG9yaWdpbmFsVGhpcywgZmFsbGJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU3VwcHJlc3MgdGhlIGtleWJvYXJkLCBlZGl0b3IgbXV0YXRpb24sIGFuZCB0aGUgY29udGV4dCBtZW51IGFjcm9zcyBBTEwgd2luZG93cyBcdTIwMTQgdGhlIG1haW4gd2luZG93XG4gICAgLy8gQW5kIGV2ZXJ5IGV4aXN0aW5nL2Z1dHVyZSBwb3BvdXQgXHUyMDE0IHNvIHRoZSBsb2NrIGhvbGRzIHdoZXJldmVyIHRoZSB1c2VyJ3MgZm9jdXMgaXMsIG5vdCBvbmx5IGluXG4gICAgLy8gVGhlIHdpbmRvdyB0aGF0IG93bnMgdGhlIG1pbmltaXplZCBtb2RhbC4gQ2FwdHVyZS1waGFzZSBsaXN0ZW5lcnMgcnVuIGJlZm9yZSBPYnNpZGlhbidzIG93blxuICAgIC8vIERvY3VtZW50L2VsZW1lbnQgaGFuZGxlcnMgKGluY2x1ZGluZyBDb2RlTWlycm9yJ3MpLCBzbyBgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClgIGluIHRoZVxuICAgIC8vIFN1cHByZXNzb3JzIGtlZXBzIGEgYmxvY2tlZCBldmVudCBmcm9tIGV2ZXIgcmVhY2hpbmcgdGhlbS4gYGtleWRvd25gIGxldHMgbmF2aWdhdGlvbiBrZXlzIHRocm91Z2hcbiAgICAvLyAoc2VlIGBpc1BlZWtBbGxvd2VkS2V5YCkgYnV0IGJsb2NrcyBjb21tYW5kIGhvdGtleXM7IGBiZWZvcmVpbnB1dGAgYmxvY2tzIGFsbCBlZGl0b3IgbXV0YXRpb247XG4gICAgLy8gYGNvbnRleHRtZW51YCBibG9ja3MgdGhlIHJpZ2h0LWNsaWNrIG1lbnUuXG4gICAgY29uc3QgYWxsV2luZG93c0V2ZW50Q29tcG9uZW50ID0gdGhpcy5hZGRDaGlsZChuZXcgQWxsV2luZG93c0V2ZW50Q29tcG9uZW50KHRoaXMuYXBwKSk7XG4gICAgYWxsV2luZG93c0V2ZW50Q29tcG9uZW50LnJlZ2lzdGVyQWxsV2luZG93c0RvbUV2ZW50KHtcbiAgICAgIGNhbGxiYWNrOiBzdXBwcmVzc0tleWRvd25XaGlsZVBlZWtMb2NrZWQsXG4gICAgICBvcHRpb25zOiB7IGNhcHR1cmU6IHRydWUgfSxcbiAgICAgIHR5cGU6ICdrZXlkb3duJ1xuICAgIH0pO1xuICAgIGFsbFdpbmRvd3NFdmVudENvbXBvbmVudC5yZWdpc3RlckFsbFdpbmRvd3NEb21FdmVudCh7XG4gICAgICBjYWxsYmFjazogc3VwcHJlc3NXaGlsZVBlZWtMb2NrZWQsXG4gICAgICBvcHRpb25zOiB7IGNhcHR1cmU6IHRydWUgfSxcbiAgICAgIHR5cGU6ICdiZWZvcmVpbnB1dCdcbiAgICB9KTtcbiAgICBhbGxXaW5kb3dzRXZlbnRDb21wb25lbnQucmVnaXN0ZXJBbGxXaW5kb3dzRG9tRXZlbnQoe1xuICAgICAgY2FsbGJhY2s6IHN1cHByZXNzV2hpbGVQZWVrTG9ja2VkLFxuICAgICAgb3B0aW9uczogeyBjYXB0dXJlOiB0cnVlIH0sXG4gICAgICB0eXBlOiAnY29udGV4dG1lbnUnXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwcyBhIHtAbGluayBNb2RhbH0gaW5zdGFuY2UgdG8gbWFrZSBpdCBtaW5pbWl6YWJsZSB0byBhIHNtYWxsIGZsb2F0aW5nIGJhciBhbmQgcmVzdG9yYWJsZS4gV2hpbGVcbiAqIG1pbmltaXplZCB0aGUgYXBwIGlzIHB1dCBpbnRvIGEgcGVlay1vbmx5IGxvY2sgKGtleWJvYXJkLCBjb250ZXh0IG1lbnUsIGFuZCBvcGVuaW5nIG90aGVyIG1vZGFscyBhcmVcbiAqIGJsb2NrZWQpIHNvIHRoZSBtb2RhbCdzIGJsb2NraW5nIGNvbnRyYWN0IGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRNb2RhbCAtIFRoZSB0eXBlIG9mIHRoZSB3cmFwcGVkIG1vZGFsLlxuICovXG5leHBvcnQgY2xhc3MgTWluaW1pemFibGVNb2RhbDxUTW9kYWwgZXh0ZW5kcyBNb2RhbD4ge1xuICAvKipcbiAgICogVGhlIHdyYXBwZWQgbW9kYWwuIE9wZW4sIGNsb3NlLCBhbmQgcG9wdWxhdGUgaXQgYXMgdXN1YWwgKGUuZy4gYG1pbmltaXphYmxlLm1vZGFsLm9wZW4oKWApLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1vZGFsOiBUTW9kYWw7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1vZGFsIGlzIGN1cnJlbnRseSBtaW5pbWl6ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbW9kYWwgaXMgY3VycmVudGx5IG1pbmltaXplZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTWluaW1pemVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTWluaW1pemVkVmFsdWU7XG4gIH1cblxuICAvLyBQYXRjaGVzIHRoZSB3cmFwcGVkIG1vZGFsJ3MgYG9uQ2xvc2VgIHRvIHJ1biBjbGVhbnVwLiBQZXJzaXN0cyBmb3IgdGhlIHdyYXBwZXIncyB3aG9sZSBsaWZlIChhXG4gIC8vIE1vZGFsIGNhbiBiZSByZW9wZW5lZCwgc28gdGhlIHBhdGNoIG11c3Qgc3Vydml2ZSBlYWNoIGNsb3NlKSwgaGVuY2UgYSBkZWRpY2F0ZWQgY29tcG9uZW50IHRoYXQgaXNcbiAgLy8gTmV2ZXIgdW5sb2FkZWQgXHUyMDE0IGRpc3RpbmN0IGZyb20gYHBlZWtMb2NrQ29tcG9uZW50YCwgd2hvc2UgcGF0Y2hlcyBsaXZlIG9ubHkgd2hpbGUgbWluaW1pemVkLlxuICBwcml2YXRlIHJlYWRvbmx5IGNsb3NlUGF0Y2hDb21wb25lbnQgPSBuZXcgTW9ua2V5QXJvdW5kQ29tcG9uZW50KCk7XG4gIHByaXZhdGUgaXNNaW5pbWl6ZWRWYWx1ZSA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG1pbmltaXplQnV0dG9uRWw6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIG1pbmltaXplZEJhckVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBlZWtMb2NrQ29tcG9uZW50OiBudWxsIHwgUGVla0xvY2tDb21wb25lbnQgPSBudWxsO1xuICBwcml2YXRlIHBlZWtMb2NrRW50cnk6IG51bGwgfCBQZWVrTG9ja0VudHJ5ID0gbnVsbDtcblxuICAvKipcbiAgICogV3JhcHMgdGhlIGdpdmVuIG1vZGFsLCBhZGRpbmcgYSBtaW5pbWl6ZSBidXR0b24gYW5kIHdpcmluZyB1cCBjbGVhbnVwIG9uIGNsb3NlLlxuICAgKlxuICAgKiBAcGFyYW0gbW9kYWwgLSBUaGUgbW9kYWwgaW5zdGFuY2UgdG8gbWFrZSBtaW5pbWl6YWJsZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihtb2RhbDogVE1vZGFsKSB7XG4gICAgdGhpcy5tb2RhbCA9IG1vZGFsO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMobW9kYWwuY29udGFpbmVyRWwsIFtDc3NDbGFzcy5NaW5pbWl6YWJsZU1vZGFsXSk7XG4gICAgdGhpcy5taW5pbWl6ZUJ1dHRvbkVsID0gdGhpcy5jcmVhdGVNaW5pbWl6ZUJ1dHRvbigpO1xuICAgIHRoaXMuY2xvc2VQYXRjaENvbXBvbmVudC5sb2FkKCk7XG4gICAgdGhpcy5wYXRjaE9uQ2xvc2UobW9kYWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pbmltaXplcyB0aGUgbW9kYWw6IGhpZGVzIHRoZSBtb2RhbCBhbmQgaXRzIGJhY2tkcm9wLCBzaG93cyBhIGZsb2F0aW5nIGJhciB3aXRoIGEgcmVzdG9yZSBidXR0b24sXG4gICAqIGFuZCBwdXRzIHRoZSBhcHAgaW50byB0aGUgcGVlay1vbmx5IGxvY2suIEEgbm8tb3AgaWYgdGhlIG1vZGFsIGlzIGFscmVhZHkgbWluaW1pemVkLlxuICAgKi9cbiAgcHVibGljIG1pbmltaXplKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTWluaW1pemVkVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSB0cnVlO1xuICAgIHRoaXMubWluaW1pemVCdXR0b25FbC5oaWRlKCk7XG4gICAgdGhpcy5tb2RhbC5jb250YWluZXJFbC5oaWRlKCk7XG4gICAgLy8gVGhlIG1vZGFsIHN0YXlzIG9wZW4gd2hpbGUgbWluaW1pemVkLCBzbyBpdHMga2V5bWFwIHNjb3BlIGlzIHBvcHBlZCB0byByZWxlYXNlIHRoZSBmb2N1cyB0cmFwLlxuICAgIC8vIFJlc3RvcmluZyByZS1wdXNoZXMgaXQuIEFuIGFjdGl2ZSB0cmFwIHdvdWxkIHN0ZWFsIGZvY3VzIGJhY2sgdG8gdGhlIGhpZGRlbiBtb2RhbCwgYmxvY2tpbmcgdGhlXG4gICAgLy8gTW91c2UtZHJpdmVuIGluc3BlY3Rpb24gKGNsaWNraW5nIG5vdGVzLCBzY3JvbGxpbmcpIHRoYXQgbWluaW1pemUgZXhpc3RzIHRvIGFsbG93LlxuICAgIC8vIEtleWJvYXJkIGlucHV0IHJlbWFpbnMgYmxvY2tlZCBieSB0aGUgcGVlay1vbmx5IGxvY2ssIHNvIHJlbGVhc2luZyB0aGUgdHJhcCBrZWVwcyB0aGUgYXBwIGluZXJ0LlxuICAgIHRoaXMubW9kYWwuYXBwLmtleW1hcC5wb3BTY29wZSh0aGlzLm1vZGFsLnNjb3BlKTtcbiAgICB0aGlzLm1pbmltaXplZEJhckVsID0gdGhpcy5jcmVhdGVNaW5pbWl6ZWRCYXIoKTtcbiAgICB0aGlzLmVuYWJsZVBlZWtMb2NrKHRoaXMubWluaW1pemVkQmFyRWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RvcmVzIHRoZSBtb2RhbCBmcm9tIHRoZSBtaW5pbWl6ZWQgc3RhdGUsIHJlbW92aW5nIHRoZSBmbG9hdGluZyBiYXIgYW5kIGxpZnRpbmcgdGhlIHBlZWstb25seVxuICAgKiBsb2NrLiBBIG5vLW9wIGlmIHRoZSBtb2RhbCBpcyBub3QgbWluaW1pemVkLlxuICAgKi9cbiAgcHVibGljIHJlc3RvcmUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTWluaW1pemVkVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSBmYWxzZTtcbiAgICB0aGlzLmRpc2FibGVQZWVrTG9jaygpO1xuICAgIHRoaXMucmVtb3ZlTWluaW1pemVkQmFyKCk7XG4gICAgLy8gUmUtcHVzaCB0aGUgc2NvcGUgcG9wcGVkIGluIG1pbmltaXplKCkgc28gdGhlIHJlc3RvcmVkIG1vZGFsIGJsb2NrcyB0aGUgYXBwIGFnYWluIChmb2N1cyB0cmFwXG4gICAgLy8gKyBFc2NhcGUgY2FwdHVyZSkuXG4gICAgdGhpcy5tb2RhbC5hcHAua2V5bWFwLnB1c2hTY29wZSh0aGlzLm1vZGFsLnNjb3BlKTtcbiAgICB0aGlzLm1vZGFsLmNvbnRhaW5lckVsLnNob3coKTtcbiAgICB0aGlzLm1pbmltaXplQnV0dG9uRWwuc2hvdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNaW5pbWl6ZUJ1dHRvbigpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgYnV0dG9uRWwgPSB0aGlzLm1vZGFsLm1vZGFsRWwuY3JlYXRlRWwoJ2J1dHRvbicsIHsgY2xzOiBDc3NDbGFzcy5NaW5pbWl6ZUJ1dHRvbiB9KTtcbiAgICBzZXRJY29uKGJ1dHRvbkVsLCBNSU5JTUlaRV9JQ09OX0lEKTtcbiAgICBidXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMubWluaW1pemUoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYnV0dG9uRWw7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1pbmltaXplZEJhcigpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgYmFyRWwgPSB0aGlzLm1vZGFsLmNvbnRhaW5lckVsLm93bmVyRG9jdW1lbnQuYm9keS5jcmVhdGVEaXYoKTtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGJhckVsLCBbQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJdKTtcbiAgICBiYXJFbC5jcmVhdGVTcGFuKHtcbiAgICAgIGNsczogQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJUaXRsZSxcbiAgICAgIHRleHQ6IHRoaXMubW9kYWwudGl0bGVFbC50ZXh0Q29udGVudFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3RvcmVCdXR0b25FbCA9IGJhckVsLmNyZWF0ZUVsKCdidXR0b24nLCB7IGNsczogQ3NzQ2xhc3MuUmVzdG9yZUJ1dHRvbiB9KTtcbiAgICBzZXRJY29uKHJlc3RvcmVCdXR0b25FbCwgUkVTVE9SRV9JQ09OX0lEKTtcbiAgICAvLyBUaGUgd2hvbGUgYmFyIHJlc3RvcmVzIG9uIGNsaWNrLCBub3QganVzdCB0aGUgcmVzdG9yZSBidXR0b24gXHUyMDE0IGEgbGFyZ2VyLCBlYXNpZXIgY2xpY2sgdGFyZ2V0LlxuICAgIC8vIGByZXN0b3JlKClgIGd1YXJkcyBhZ2FpbnN0IGEgZG91YmxlIGludm9jYXRpb24sIHNvIHRoZSByZXN0b3JlIGJ1dHRvbidzIG93biBjbGljayBidWJibGluZyB1cFxuICAgIC8vIEhlcmUgaXMgYSBuby1vcC4gVGhlIHJlc3RvcmUgYnV0dG9uIHN0YXlzIHB1cmVseSBhcyBhIHZpc3VhbCBhZmZvcmRhbmNlIGZvciB0aGUgY2xpY2sgdGFyZ2V0LlxuICAgIGJhckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgfSk7XG4gICAgLy8gRHJvcCB0aGUgb25lLXNob3QgYXR0ZW50aW9uIGZsYXNoIG9uY2UgaXQgZmluaXNoZXMgc28gdGhlIGJhciByZXR1cm5zIHRvIGl0cyBnZW50bGUgaWRsZSBwdWxzZS5cbiAgICAvLyBUaGUgaWRsZSBwdWxzZSBpcyBhbiBpbmZpbml0ZSBhbmltYXRpb24sIHdoaWNoIG5ldmVyIGZpcmVzIGBhbmltYXRpb25lbmRgLlxuICAgIGJhckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2FuaW1hdGlvbmVuZCcsICgpID0+IHtcbiAgICAgIGJhckVsLnJlbW92ZUNsYXNzKENzc0NsYXNzLk1pbmltaXplZE1vZGFsQmFyQXR0ZW50aW9uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYmFyRWw7XG4gIH1cblxuICBwcml2YXRlIGRpc2FibGVQZWVrTG9jaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGVla0xvY2tFbnRyeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHBlZWtMb2NrRW50cmllcy5kZWxldGUodGhpcy5wZWVrTG9ja0VudHJ5KTtcbiAgICB0aGlzLnBlZWtMb2NrRW50cnkgPSBudWxsO1xuICAgIC8vIFRlYXIgdGhlIGBvcGVuYCBwYXRjaGVzIGRvd24gd2l0aCB0aGUgY29tcG9uZW50LCBzbyB0aGV5IGV4aXN0IG9ubHkgd2hpbGUgdGhpcyBtb2RhbCBpcyBtaW5pbWl6ZWQuXG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudD8udW5sb2FkKCk7XG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZVBlZWtMb2NrKGJhckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMucGVla0xvY2tFbnRyeSA9IHtcbiAgICAgIGJhckVsLFxuICAgICAgZmxhc2g6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5mbGFzaEJhcihiYXJFbCk7XG4gICAgICB9LFxuICAgICAgaW5uZXJNb2RhbDogdGhpcy5tb2RhbFxuICAgIH07XG4gICAgcGVla0xvY2tFbnRyaWVzLmFkZCh0aGlzLnBlZWtMb2NrRW50cnkpO1xuICAgIC8vIEluc3RhbGwgdGhlIGBvcGVuYCBwYXRjaGVzIGFuZCBpbnB1dCBzdXBwcmVzc29ycyBmb3IgYXMgbG9uZyBhcyB0aGlzIG1vZGFsIGlzIG1pbmltaXplZC4gVGhlXG4gICAgLy8gQmxvY2sgTE9HSUMgaXRzZWxmIGtleXMgb2ZmIHRoZSBzaGFyZWQgYHBlZWtMb2NrRW50cmllc2AgKHNlZSBgc2hvdWxkQmxvY2tPcGVuYCksIHNvIHdpdGggc2V2ZXJhbFxuICAgIC8vIE1vZGFscyBtaW5pbWl6ZWQgZXZlcnkgb25lJ3MgcGF0Y2ggcmVhY2hlcyB0aGUgc2FtZSB2ZXJkaWN0OyB0aGUgbG9jayBsaWZ0cyBvbmx5IG9uY2UgdGhlIGxhc3RcbiAgICAvLyBNb2RhbCByZXN0b3Jlcy9jbG9zZXMuXG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudCA9IG5ldyBQZWVrTG9ja0NvbXBvbmVudCh0aGlzLm1vZGFsLmFwcCk7XG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudC5sb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIGZsYXNoQmFyKGJhckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGJhckVsLnJlbW92ZUNsYXNzKENzc0NsYXNzLk1pbmltaXplZE1vZGFsQmFyQXR0ZW50aW9uKTtcbiAgICAvLyBGb3JjZSBhIHJlZmxvdyBzbyByZS1hZGRpbmcgdGhlIGNsYXNzIHJlc3RhcnRzIHRoZSBvbmUtc2hvdCBmbGFzaCBvbiByYXBpZCByZXBlYXRlZCBibG9ja3MuXG4gICAgYmFyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgYmFyRWwuYWRkQ2xhc3MoQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJBdHRlbnRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVQZWVrTG9jaygpO1xuICAgIHRoaXMucmVtb3ZlTWluaW1pemVkQmFyKCk7XG4gICAgdGhpcy5pc01pbmltaXplZFZhbHVlID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHBhdGNoT25DbG9zZShtb2RhbDogTW9kYWwpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlUGF0Y2hDb21wb25lbnQucmVnaXN0ZXJNZXRob2RQYXRjaDxNb2RhbCwgJ29uQ2xvc2UnPih7XG4gICAgICBtZXRob2ROYW1lOiAnb25DbG9zZScsXG4gICAgICBvYmo6IG1vZGFsLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjayB9KTogdm9pZCA9PiB7XG4gICAgICAgIGZhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTWluaW1pemVkQmFyKCk6IHZvaWQge1xuICAgIHRoaXMubWluaW1pemVkQmFyRWw/LnJlbW92ZSgpO1xuICAgIHRoaXMubWluaW1pemVkQmFyRWwgPSBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJsb2NrRXZlbnQoZXZ0OiBFdmVudCk6IHZvaWQge1xuICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICBzaWduYWxCbG9ja2VkQXR0ZW1wdCgpO1xufVxuXG5mdW5jdGlvbiBibG9ja09yRmFsbGJhY2sobW9kYWw6IE1vZGFsLCBmYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICBpZiAoc2hvdWxkQmxvY2tPcGVuKG1vZGFsKSkge1xuICAgIHNpZ25hbEJsb2NrZWRBdHRlbXB0KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZmFsbGJhY2soKTtcbn1cblxuZnVuY3Rpb24gZmxhc2hNaW5pbWl6ZWRCYXJzKCk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlZWtMb2NrRW50cmllcykge1xuICAgIGVudHJ5LmZsYXNoKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNNaW5pbWl6ZWRJbm5lck1vZGFsKG1vZGFsOiBNb2RhbCk6IGJvb2xlYW4ge1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlZWtMb2NrRW50cmllcykge1xuICAgIGlmIChlbnRyeS5pbm5lck1vZGFsID09PSBtb2RhbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1BlZWtBbGxvd2VkS2V5KGV2dDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAvLyBOYXZpZ2F0aW9uIG1vdmVzIHRoZSBjdXJzb3Ivc2Nyb2xscyAoYWxsb3dlZCksIGJ1dCBTaGlmdCtuYXZpZ2F0aW9uIGV4dGVuZHMgdGhlIHNlbGVjdGlvbiAobm90XG4gIC8vIE5lZWRlZCBmb3IgaW5zcGVjdGlvbiksIHNvIGl0IGlzIGJsb2NrZWQuIEJhcmUgbW9kaWZpZXIgcHJlc3NlcyBwYXNzIHRocm91Z2ggb24gdGhlaXIgb3duLlxuICBpZiAoTkFWSUdBVElPTl9LRVlTLmhhcyhldnQua2V5KSkge1xuICAgIHJldHVybiAhZXZ0LnNoaWZ0S2V5O1xuICB9XG5cbiAgcmV0dXJuIE1PRElGSUVSX0tFWVMuaGFzKGV2dC5rZXkpO1xufVxuXG5mdW5jdGlvbiBpc1BlZWtMb2NrZWQoKTogYm9vbGVhbiB7XG4gIC8vIERyb3AgZW50cmllcyB3aG9zZSBiYXIgaGFzIGxlZnQgdGhlIERPTSB3aXRob3V0IGEgcmVzdG9yZSgpIG9yIGNsb3NlKCkuXG4gIC8vIEEgdGVzdCB0ZWFyZG93biB0aGF0IGVtcHRpZXMgdGhlIGJvZHkgaXMgdGhlIHR5cGljYWwgY2F1c2U7IHRoaXMga2VlcHMgYSBzdGFsZSBlbnRyeSBmcm9tIGxvY2tpbmcuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgcGVla0xvY2tFbnRyaWVzKSB7XG4gICAgaWYgKCFlbnRyeS5iYXJFbC5pc0Nvbm5lY3RlZCkge1xuICAgICAgcGVla0xvY2tFbnRyaWVzLmRlbGV0ZShlbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBlZWtMb2NrRW50cmllcy5zaXplID4gMDtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQmxvY2tPcGVuKG1vZGFsOiBNb2RhbCk6IGJvb2xlYW4ge1xuICAvLyBBIG1vZGFsJ3Mgb3duIHJlLW9wZW4gaXMgbmV2ZXIgYmxvY2tlZCBcdTIwMTQgb3RoZXJ3aXNlIGEgbWluaW1pemVkIG1vZGFsIGNvdWxkIG5vdCByZXN0b3JlL3JlLW9wZW5cbiAgLy8gSXRzZWxmLiBFdmVyeSBPVEhFUiBtb2RhbCBvcGVuIGlzIGJsb2NrZWQgd2hpbGUgYW55IG1vZGFsIGlzIG1pbmltaXplZCAodGhlIHBlZWstb25seSBsb2NrKS5cbiAgcmV0dXJuIGlzUGVla0xvY2tlZCgpICYmICFpc01pbmltaXplZElubmVyTW9kYWwobW9kYWwpO1xufVxuXG5mdW5jdGlvbiBzaWduYWxCbG9ja2VkQXR0ZW1wdCgpOiB2b2lkIHtcbiAgZmxhc2hNaW5pbWl6ZWRCYXJzKCk7XG4gIGJlZXBlci5iZWVwKCk7XG59XG5cbmZ1bmN0aW9uIHN1cHByZXNzS2V5ZG93bldoaWxlUGVla0xvY2tlZChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgaWYgKCFpc1BlZWtMb2NrZWQoKSB8fCBpc1BlZWtBbGxvd2VkS2V5KGV2dCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBibG9ja0V2ZW50KGV2dCk7XG59XG5cbmZ1bmN0aW9uIHN1cHByZXNzV2hpbGVQZWVrTG9ja2VkKGV2dDogRXZlbnQpOiB2b2lkIHtcbiAgaWYgKCFpc1BlZWtMb2NrZWQoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGJsb2NrRXZlbnQoZXZ0KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkNBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsZ0NBQWdDO0FBQ3pDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsMkJBQTJCO0FBRXBDLE1BQU0sbUJBQW1CO0FBQ3pCLE1BQU0sa0JBQWtCO0FBS3hCLE1BQU0sa0JBQWtCLG9CQUFJLElBQVk7QUFBQSxFQUN0QztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixDQUFDO0FBSUQsTUFBTSxnQkFBZ0Isb0JBQUksSUFBWTtBQUFBLEVBQ3BDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsQ0FBQztBQXlCRCxNQUFNLGtCQUFrQixvQkFBSSxJQUFtQjtBQUMvQyxNQUFNLFNBQVMs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
|
|
300
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9taW5pbWl6YWJsZS1tb2RhbC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgd3JhcHBlciB0aGF0IG1ha2VzIGFueSBPYnNpZGlhbiB7QGxpbmsgTW9kYWx9IG1pbmltaXphYmxlIHRvIGEgZmxvYXRpbmcgYmFyIFx1MjAxNCB3aXRob3V0IGJyZWFraW5nIHRoZVxuICogbW9kYWwncyBibG9ja2luZyBjb250cmFjdC5cbiAqXG4gKiBPYnNpZGlhbidzIHtAbGluayBNb2RhbH0gaXMgYmxvY2tpbmc6IHdoaWxlIGl0IGlzIG9wZW4gdGhlIHJlc3Qgb2YgdGhlIGFwcCBpcyBtZWFudCB0byBiZSBpbmVydCB1bnRpbFxuICogdGhlIG1vZGFsIGlzIGRpc21pc3NlZC4ge0BsaW5rIE1pbmltaXphYmxlTW9kYWx9IHdyYXBzIGFueSBtb2RhbCBpbnN0YW5jZSAocGxhaW4gYE1vZGFsYCxcbiAqIGBGdXp6eVN1Z2dlc3RNb2RhbGAsIHRoZSBsaWJyYXJ5J3MgYE1vZGFsQmFzZWAsIHlvdXIgb3duIHN1YmNsYXNzLCBcdTIwMjYgXHUyMDE0IGluY2x1ZGluZyBtb2RhbHMgeW91IGRvIG5vdFxuICogb3duKSBhbmQgYWRkcyBhIG1pbmltaXplIGJ1dHRvbi4gTWluaW1pemluZyBoaWRlcyB0aGUgbW9kYWwgYW5kIGl0cyBibG9ja2luZyBiYWNrZHJvcCBhbmQgc2hvd3MgYVxuICogc21hbGwgZmxvYXRpbmcgYmFyIHdpdGggYSByZXN0b3JlIGJ1dHRvbiwgc28gdGhlIHVzZXIgY2FuIHBlZWsgYXQgdGhlIG5vdGVzL2ZvbGRlcnMgdGhlIG9wZXJhdGlvblxuICogaW52b2x2ZXMgXHUyMDE0IGJ1dCB0aGUgbW9kYWwgaXMgTk9UIGRpc21pc3NlZCwgc28gaXRzIGJsb2NraW5nIGNvbnRyYWN0IG11c3QgYmUgcHJlc2VydmVkLlxuICpcbiAqIFRvIGtlZXAgdGhhdCBjb250cmFjdCB3aGlsZSBtaW5pbWl6ZWQsIHRoZSB3cmFwcGVyIHB1dHMgdGhlIGFwcCBpbnRvIGEgKipwZWVrLW9ubHkgbG9jayoqOiB0aGUgdXNlclxuICogbWF5IG1vdXNlLWNsaWNrIGFuZCBzY3JvbGwgdG8gaW5zcGVjdCBjb250ZW50LCBidXQgY2Fubm90IHN0YXJ0IGFueXRoaW5nIG5ldy4gV2hpbGUgYW55IG1vZGFsIGlzXG4gKiBtaW5pbWl6ZWQgdGhlIHdyYXBwZXI6XG4gKiAtIGJsb2NrcyB0aGUga2V5Ym9hcmQgKHR5cGluZywgaG90a2V5cywgdGhlIGNvbW1hbmQtcGFsZXR0ZSBzaG9ydGN1dCksXG4gKiAtIGJsb2NrcyB0aGUgcmlnaHQtY2xpY2sgY29udGV4dCBtZW51LCBhbmRcbiAqIC0gYmxvY2tzIG9wZW5pbmcgYW55IG90aGVyIG1vZGFsIChhIHJlLWZpcmVkIGNvbW1hbmQsIHRoZSBjb21tYW5kIHBhbGV0dGUsIHNldHRpbmdzLCBcdTIwMjYpLlxuICpcbiAqIEEgYmxvY2tlZCBhdHRlbXB0IGZsYXNoZXMgdGhlIGZsb2F0aW5nIGJhciBhbmQgYmVlcHMgc28gdGhlIHVzZXIgc2VlcyAoYW5kIGhlYXJzKSB3aHkgbm90aGluZ1xuICogaGFwcGVuZWQuIFJlc3RvcmluZyAob3IgdGhlIG1vZGFsIGNsb3NpbmcpIGxpZnRzIHRoZSBsb2NrLiBUaGlzIHByZXZlbnRzLCBmb3IgZXhhbXBsZSwgbWluaW1pemluZyBhXG4gKiBcIm1lcmdlIGZvbGRlclwiIHBpY2tlciBhbmQgdGhlbiBmaXJpbmcgdGhlIHNhbWUgY29tbWFuZCBhZ2FpbiB0byBzdGFjayBzZXZlcmFsIGNvbmN1cnJlbnQgbWVyZ2VzLlxuICpcbiAqIFRoZSB3cmFwcGVyIHJldXNlcyB0aGUgbW9kYWwncyBvd24gdGl0bGUgKGB0aXRsZUVsYCkgYXMgdGhlIG1pbmltaXplZCBiYXIgbGFiZWwsIHNvIHNldCB0aGUgdGl0bGVcbiAqIHRoZSB1c3VhbCB3YXkgKGBtb2RhbC5zZXRUaXRsZSguLi4pYCkuIFJlbmRlciBhcmJpdHJhcnkgY29udGVudCBpbnRvIHtAbGluayBNb2RhbC5jb250ZW50RWx9LFxuICogaW5jbHVkaW5nIGNsaWNrYWJsZSBub3RlIGxpbmtzIHByb2R1Y2VkIGJ5IGByZW5kZXJJbnRlcm5hbExpbmtgIGZyb21cbiAqIGBvYnNpZGlhbi1kZXYtdXRpbHMvb2JzaWRpYW4vbWFya2Rvd25gOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBtb2RhbCA9IG5ldyBNeU1vZGFsKGFwcCk7XG4gKiBtb2RhbC5zZXRUaXRsZSgnTWVyZ2luZyBub3RlcycpO1xuICogbW9kYWwuY29udGVudEVsLmFwcGVuZENoaWxkKGF3YWl0IHJlbmRlckludGVybmFsTGluayh7IGFwcCwgcGF0aE9yQWJzdHJhY3RGaWxlOiBmaWxlIH0pKTtcbiAqXG4gKiBjb25zdCBtaW5pbWl6YWJsZSA9IG5ldyBNaW5pbWl6YWJsZU1vZGFsKG1vZGFsKTtcbiAqIG1pbmltaXphYmxlLm1vZGFsLm9wZW4oKTtcbiAqIG1pbmltaXphYmxlLm1pbmltaXplKCk7IC8vIGEgZmxvYXRpbmcgYmFyIG9mZmVycyBcInJlc3RvcmVcIjsgdGhlIGFwcCBpcyBwZWVrLW9ubHkgdW50aWwgcmVzdG9yZWRcbiAqIGBgYFxuICpcbiAqIFRoZSB3cmFwcGVkIG1vZGFsIGNhbiBzdGlsbCBiZSBjbG9zZWQgbm9ybWFsbHk7IHRoZSBmbG9hdGluZyBiYXIgaXMgY2xlYW5lZCB1cCBhdXRvbWF0aWNhbGx5IHdoZW5cbiAqIHRoZSBtb2RhbCBjbG9zZXMgKGV2ZW4gaWYgaXQgaXMgY2xvc2VkIHdoaWxlIG1pbmltaXplZCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7XG4gIE1vZGFsLFxuICBzZXRJY29uXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgQmVlcGVyIH0gZnJvbSAnLi4vLi4vYmVlcGVyLnRzJztcbmltcG9ydCB7IEFsbFdpbmRvd3NFdmVudENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYWxsLXdpbmRvd3MtZXZlbnQtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IE1vbmtleUFyb3VuZENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuLi9jc3MtY2xhc3MudHMnO1xuaW1wb3J0IHsgYWRkUGx1Z2luQ3NzQ2xhc3NlcyB9IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tY29udGV4dC50cyc7XG5cbmNvbnN0IE1JTklNSVpFX0lDT05fSUQgPSAnbWludXMnO1xuY29uc3QgUkVTVE9SRV9JQ09OX0lEID0gJ21heGltaXplLTInO1xuXG4vLyBOYXZpZ2F0aW9uIGtleXMgcGFzcyB0aHJvdWdoIHdoaWxlIG1pbmltaXplZCBzbyB0aGUgdXNlciBjYW4gbW92ZSB0aGUgY3Vyc29yIGFuZCBzY3JvbGwgdG8gcmVhZC5cbi8vIE5vbmUgb2YgdGhlbSBtdXRhdGUgdGhlIGRvY3VtZW50IFx1MjAxNCB0ZXh0IGNoYW5nZXMgYXJlIGNhdWdodCBzZXBhcmF0ZWx5IGJ5IHRoZSBgYmVmb3JlaW5wdXRgIGd1YXJkLlxuLy8gU2hpZnQrbmF2aWdhdGlvbiBpcyBibG9ja2VkLCB0aG91Z2gsIHNpbmNlIGl0IGV4dGVuZHMgdGhlIHNlbGVjdGlvbiB0aGF0IGluc3BlY3Rpb24gZG9lcyBub3QgbmVlZC5cbmNvbnN0IE5BVklHQVRJT05fS0VZUyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gICdBcnJvd0Rvd24nLFxuICAnQXJyb3dMZWZ0JyxcbiAgJ0Fycm93UmlnaHQnLFxuICAnQXJyb3dVcCcsXG4gICdFbmQnLFxuICAnSG9tZScsXG4gICdQYWdlRG93bicsXG4gICdQYWdlVXAnXG5dKTtcblxuLy8gQSBiYXJlIG1vZGlmaWVyIHByZXNzIGRvZXMgbm90aGluZyBvbiBpdHMgb3duLCBzbyBpdCBwYXNzZXMgdGhyb3VnaCB0aGUgbG9jay5cbi8vIFRoaXMgYXZvaWRzIGEgc3B1cmlvdXMgZmxhc2gvYmVlcCB3aGlsZSBjb21wb3NpbmcgYSBzaG9ydGN1dDsgdGhlIHNob3J0Y3V0J3MgY29tbWFuZCBrZXkgaXMgYmxvY2tlZC5cbmNvbnN0IE1PRElGSUVSX0tFWVMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAnQWx0JyxcbiAgJ0NvbnRyb2wnLFxuICAnTWV0YScsXG4gICdTaGlmdCdcbl0pO1xuXG4vKipcbiAqIEEgcmVnaXN0ZXJlZCBlbnRyeSBmb3IgYSBjdXJyZW50bHktbWluaW1pemVkIG1vZGFsLiBUaGUgc2hhcmVkIHBlZWstb25seSBsb2NrIHVzZXMgaXQgdG8ga25vdyBhXG4gKiBtb2RhbCBpcyBtaW5pbWl6ZWQsIHRvIGxlYXZlIHRoYXQgbW9kYWwncyBvd24gcmUtb3BlbnMgYWxvbmUsIGFuZCB0byBmbGFzaCBpdHMgYmFyIG9uIGEgYmxvY2tlZFxuICogYXR0ZW1wdC5cbiAqL1xuaW50ZXJmYWNlIFBlZWtMb2NrRW50cnkge1xuICAvKipcbiAgICogVGhlIGZsb2F0aW5nIGJhciBlbGVtZW50LiBVc2VkIHRvIGRldGVjdCBhIHN0YWxlIGVudHJ5IChpdHMgYmFyIGhhcyBsZWZ0IHRoZSBET00pIHNvIGl0IGNhbiBiZVxuICAgKiBwcnVuZWQgYW5kIG5ldmVyIGtlZXAgdGhlIGFwcCBsb2NrZWQuXG4gICAqL1xuICByZWFkb25seSBiYXJFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIEZsYXNoZXMgdGhlIGZsb2F0aW5nIGJhciB0byBzaWduYWwgYSBibG9ja2VkIGF0dGVtcHQuXG4gICAqL1xuICBmbGFzaCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgd3JhcHBlZCBtb2RhbCBpbnN0YW5jZSwgc28gaXRzIG93biBgb3BlbigpYCBpcyBuZXZlciBibG9ja2VkIGJ5IHRoZSBsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5uZXJNb2RhbDogTW9kYWw7XG59XG5cbmNvbnN0IHBlZWtMb2NrRW50cmllcyA9IG5ldyBTZXQ8UGVla0xvY2tFbnRyeT4oKTtcbmNvbnN0IGJlZXBlciA9IG5ldyBCZWVwZXIoKTtcblxuLyoqXG4gKiBJbnN0YWxscyB0aGUgcGVlay1vbmx5IGxvY2sncyBgb3BlbmAgcGF0Y2hlcyB3aGlsZSBhdCBsZWFzdCBvbmUgbW9kYWwgaXMgbWluaW1pemVkLiBCZWluZyBhXG4gKiB7QGxpbmsgTW9ua2V5QXJvdW5kQ29tcG9uZW50fSwgYm90aCBwYXRjaGVzIGFyZSB0b3JuIGRvd24gYXV0b21hdGljYWxseSBvbiBgdW5sb2FkYCwgc28gdGhleSBleGlzdFxuICogb25seSB3aGlsZSB0aGUgbG9jayBpcyBhY3RpdmUuIEEgbWluaW1pemVkIG1vZGFsJ3Mgb3duIHJlLW9wZW4gaXMgYWx3YXlzIGFsbG93ZWQgKHNlZVxuICoge0BsaW5rIHNob3VsZEJsb2NrT3Blbn0pOyBldmVyeSBvdGhlciBtb2RhbCBvcGVuIGlzIGJsb2NrZWQgYW5kIHNpZ25hbHMgYSBmbGFzaCArIGJlZXAuXG4gKi9cbmNsYXNzIFBlZWtMb2NrQ29tcG9uZW50IGV4dGVuZHMgTW9ua2V5QXJvdW5kQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwIHdob3NlIHNldHRpbmdzIG1vZGFsIGlzIGd1YXJkZWQgYW5kIHdob3NlIHdpbmRvd3Mgc3VwcHJlc3MgaW5wdXQgd2hpbGUgbG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUgYG9wZW5gIHBhdGNoZXMgYW5kIHRoZSBpbnB1dCBzdXBwcmVzc29ycy5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG5cbiAgICAvLyBCbG9jayBvcGVuaW5nIGFueSBPVEhFUiBtb2RhbCB3aGlsZSBhIG1vZGFsIGlzIG1pbmltaXplZCAodGhlIGNvbW1hbmQgcGFsZXR0ZSwgYSByZS1maXJlZFxuICAgIC8vIENvbW1hbmQsIGFub3RoZXIgcGx1Z2luIG1vZGFsLCBcdTIwMjYpLlxuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxNb2RhbCwgJ29wZW4nPih7XG4gICAgICBtZXRob2ROYW1lOiAnb3BlbicsXG4gICAgICBvYmo6IE1vZGFsLnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsVGhpcyB9KTogdm9pZCA9PiB7XG4gICAgICAgIGJsb2NrT3JGYWxsYmFjayhvcmlnaW5hbFRoaXMsIGZhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE9ic2lkaWFuJ3MgU2V0dGluZ3MgaXMgYSAqcG9wb3V0KiBtb2RhbDogb24gZGVza3RvcCBpdHMgb3duIGBvcGVuKClgIGZpcnN0IGNyZWF0ZXMgYSBzZXBhcmF0ZSBPU1xuICAgIC8vIFdpbmRvdyAodmlhIGBzaG91bGRVc2VQb3BvdXQoKWAvYGdldFBvcG91dE9wdGlvbnMoKWApIGFuZCBvbmx5IFRIRU4gZGVsZWdhdGVzIHRvXG4gICAgLy8gYE1vZGFsLnByb3RvdHlwZS5vcGVuYCB0byByZW5kZXIgdGhlIGFjdGl2ZSB0YWIgaW50byBpdC4gR3VhcmRpbmcgb25seSBgTW9kYWwucHJvdG90eXBlLm9wZW5gXG4gICAgLy8gVGhlcmVmb3JlIGJsb2NrcyB0aGUgcmVuZGVyIGJ1dCBsZWF2ZXMgYW4gZW1wdHkgc2V0dGluZ3Mgd2luZG93IGJlaGluZCBcdTIwMTQgdGhlIHJlcG9ydGVkIGJhZCBVWC5cbiAgICAvLyBHdWFyZGluZyB0aGUgc2V0dGluZ3MgbW9kYWwncyBvd24gYG9wZW4oKWAgYmxvY2tzIGl0ICpiZWZvcmUqIHRoZSB3aW5kb3cgaXMgY3JlYXRlZC5cbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8QXBwWydzZXR0aW5nJ10sICdvcGVuJz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ29wZW4nLFxuICAgICAgb2JqOiB0aGlzLmFwcC5zZXR0aW5nLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pOiB2b2lkID0+IHtcbiAgICAgICAgYmxvY2tPckZhbGxiYWNrKG9yaWdpbmFsVGhpcywgZmFsbGJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU3VwcHJlc3MgdGhlIGtleWJvYXJkLCBlZGl0b3IgbXV0YXRpb24sIGFuZCB0aGUgY29udGV4dCBtZW51IGFjcm9zcyBBTEwgd2luZG93cyBcdTIwMTQgdGhlIG1haW4gd2luZG93XG4gICAgLy8gQW5kIGV2ZXJ5IGV4aXN0aW5nL2Z1dHVyZSBwb3BvdXQgXHUyMDE0IHNvIHRoZSBsb2NrIGhvbGRzIHdoZXJldmVyIHRoZSB1c2VyJ3MgZm9jdXMgaXMsIG5vdCBvbmx5IGluXG4gICAgLy8gVGhlIHdpbmRvdyB0aGF0IG93bnMgdGhlIG1pbmltaXplZCBtb2RhbC4gQ2FwdHVyZS1waGFzZSBsaXN0ZW5lcnMgcnVuIGJlZm9yZSBPYnNpZGlhbidzIG93blxuICAgIC8vIERvY3VtZW50L2VsZW1lbnQgaGFuZGxlcnMgKGluY2x1ZGluZyBDb2RlTWlycm9yJ3MpLCBzbyBgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClgIGluIHRoZVxuICAgIC8vIFN1cHByZXNzb3JzIGtlZXBzIGEgYmxvY2tlZCBldmVudCBmcm9tIGV2ZXIgcmVhY2hpbmcgdGhlbS4gYGtleWRvd25gIGxldHMgbmF2aWdhdGlvbiBrZXlzIHRocm91Z2hcbiAgICAvLyAoc2VlIGBpc1BlZWtBbGxvd2VkS2V5YCkgYnV0IGJsb2NrcyBjb21tYW5kIGhvdGtleXM7IGBiZWZvcmVpbnB1dGAgYmxvY2tzIGFsbCBlZGl0b3IgbXV0YXRpb247XG4gICAgLy8gYGNvbnRleHRtZW51YCBibG9ja3MgdGhlIHJpZ2h0LWNsaWNrIG1lbnUuXG4gICAgY29uc3QgYWxsV2luZG93c0V2ZW50Q29tcG9uZW50ID0gdGhpcy5hZGRDaGlsZChuZXcgQWxsV2luZG93c0V2ZW50Q29tcG9uZW50KHRoaXMuYXBwKSk7XG4gICAgYWxsV2luZG93c0V2ZW50Q29tcG9uZW50LnJlZ2lzdGVyQWxsV2luZG93c0RvbUV2ZW50KHtcbiAgICAgIGNhbGxiYWNrOiBzdXBwcmVzc0tleWRvd25XaGlsZVBlZWtMb2NrZWQsXG4gICAgICBvcHRpb25zOiB7IGNhcHR1cmU6IHRydWUgfSxcbiAgICAgIHR5cGU6ICdrZXlkb3duJ1xuICAgIH0pO1xuICAgIGFsbFdpbmRvd3NFdmVudENvbXBvbmVudC5yZWdpc3RlckFsbFdpbmRvd3NEb21FdmVudCh7XG4gICAgICBjYWxsYmFjazogc3VwcHJlc3NXaGlsZVBlZWtMb2NrZWQsXG4gICAgICBvcHRpb25zOiB7IGNhcHR1cmU6IHRydWUgfSxcbiAgICAgIHR5cGU6ICdiZWZvcmVpbnB1dCdcbiAgICB9KTtcbiAgICBhbGxXaW5kb3dzRXZlbnRDb21wb25lbnQucmVnaXN0ZXJBbGxXaW5kb3dzRG9tRXZlbnQoe1xuICAgICAgY2FsbGJhY2s6IHN1cHByZXNzV2hpbGVQZWVrTG9ja2VkLFxuICAgICAgb3B0aW9uczogeyBjYXB0dXJlOiB0cnVlIH0sXG4gICAgICB0eXBlOiAnY29udGV4dG1lbnUnXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwcyBhIHtAbGluayBNb2RhbH0gaW5zdGFuY2UgdG8gbWFrZSBpdCBtaW5pbWl6YWJsZSB0byBhIHNtYWxsIGZsb2F0aW5nIGJhciBhbmQgcmVzdG9yYWJsZS4gV2hpbGVcbiAqIG1pbmltaXplZCB0aGUgYXBwIGlzIHB1dCBpbnRvIGEgcGVlay1vbmx5IGxvY2sgKGtleWJvYXJkLCBjb250ZXh0IG1lbnUsIGFuZCBvcGVuaW5nIG90aGVyIG1vZGFscyBhcmVcbiAqIGJsb2NrZWQpIHNvIHRoZSBtb2RhbCdzIGJsb2NraW5nIGNvbnRyYWN0IGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRNb2RhbCAtIFRoZSB0eXBlIG9mIHRoZSB3cmFwcGVkIG1vZGFsLlxuICovXG5leHBvcnQgY2xhc3MgTWluaW1pemFibGVNb2RhbDxUTW9kYWwgZXh0ZW5kcyBNb2RhbD4ge1xuICAvKipcbiAgICogVGhlIHdyYXBwZWQgbW9kYWwuIE9wZW4sIGNsb3NlLCBhbmQgcG9wdWxhdGUgaXQgYXMgdXN1YWwgKGUuZy4gYG1pbmltaXphYmxlLm1vZGFsLm9wZW4oKWApLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1vZGFsOiBUTW9kYWw7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1vZGFsIGlzIGN1cnJlbnRseSBtaW5pbWl6ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbW9kYWwgaXMgY3VycmVudGx5IG1pbmltaXplZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTWluaW1pemVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTWluaW1pemVkVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2hlcyB0aGUgd3JhcHBlZCBtb2RhbCdzIGBvbkNsb3NlYCB0byBydW4gY2xlYW51cC4gUGVyc2lzdHMgZm9yIHRoZSB3cmFwcGVyJ3Mgd2hvbGUgbGlmZSAoYVxuICAgKiBtb2RhbCBjYW4gYmUgcmVvcGVuZWQsIHNvIHRoZSBwYXRjaCBtdXN0IHN1cnZpdmUgZWFjaCBjbG9zZSksIGhlbmNlIGEgZGVkaWNhdGVkIGNvbXBvbmVudCB0aGF0IGlzXG4gICAqIG5ldmVyIHVubG9hZGVkIFx1MjAxNCBkaXN0aW5jdCBmcm9tIGBwZWVrTG9ja0NvbXBvbmVudGAsIHdob3NlIHBhdGNoZXMgbGl2ZSBvbmx5IHdoaWxlIG1pbmltaXplZC5cbiAgICogRXhwb3NlZCB0byBzdWJjbGFzc2VzIHNvIHRoZXkgY2FuIHJlZ2lzdGVyIGFkZGl0aW9uYWwgbGlmZXRpbWUtc2NvcGVkIHBhdGNoZXMgb24gdGhlIHdyYXBwZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xvc2VQYXRjaENvbXBvbmVudCA9IG5ldyBNb25rZXlBcm91bmRDb21wb25lbnQoKTtcblxuICBwcml2YXRlIGlzTWluaW1pemVkVmFsdWUgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtaW5pbWl6ZUJ1dHRvbkVsOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBtaW5pbWl6ZWRCYXJFbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZWVrTG9ja0NvbXBvbmVudDogbnVsbCB8IFBlZWtMb2NrQ29tcG9uZW50ID0gbnVsbDtcbiAgcHJpdmF0ZSBwZWVrTG9ja0VudHJ5OiBudWxsIHwgUGVla0xvY2tFbnRyeSA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFdyYXBzIHRoZSBnaXZlbiBtb2RhbCwgYWRkaW5nIGEgbWluaW1pemUgYnV0dG9uIGFuZCB3aXJpbmcgdXAgY2xlYW51cCBvbiBjbG9zZS5cbiAgICpcbiAgICogQHBhcmFtIG1vZGFsIC0gVGhlIG1vZGFsIGluc3RhbmNlIHRvIG1ha2UgbWluaW1pemFibGUuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IobW9kYWw6IFRNb2RhbCkge1xuICAgIHRoaXMubW9kYWwgPSBtb2RhbDtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKG1vZGFsLmNvbnRhaW5lckVsLCBbQ3NzQ2xhc3MuTWluaW1pemFibGVNb2RhbF0pO1xuICAgIHRoaXMubWluaW1pemVCdXR0b25FbCA9IHRoaXMuY3JlYXRlTWluaW1pemVCdXR0b24oKTtcbiAgICB0aGlzLmNsb3NlUGF0Y2hDb21wb25lbnQubG9hZCgpO1xuICAgIHRoaXMucGF0Y2hPbkNsb3NlKG1vZGFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaW5pbWl6ZXMgdGhlIG1vZGFsOiBoaWRlcyB0aGUgbW9kYWwgYW5kIGl0cyBiYWNrZHJvcCwgc2hvd3MgYSBmbG9hdGluZyBiYXIgd2l0aCBhIHJlc3RvcmUgYnV0dG9uLFxuICAgKiBhbmQgcHV0cyB0aGUgYXBwIGludG8gdGhlIHBlZWstb25seSBsb2NrLiBBIG5vLW9wIGlmIHRoZSBtb2RhbCBpcyBhbHJlYWR5IG1pbmltaXplZC5cbiAgICovXG4gIHB1YmxpYyBtaW5pbWl6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc01pbmltaXplZFZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc01pbmltaXplZFZhbHVlID0gdHJ1ZTtcbiAgICB0aGlzLm1pbmltaXplQnV0dG9uRWwuaGlkZSgpO1xuICAgIHRoaXMubW9kYWwuY29udGFpbmVyRWwuaGlkZSgpO1xuICAgIC8vIFRoZSBtb2RhbCBzdGF5cyBvcGVuIHdoaWxlIG1pbmltaXplZCwgc28gaXRzIGtleW1hcCBzY29wZSBpcyBwb3BwZWQgdG8gcmVsZWFzZSB0aGUgZm9jdXMgdHJhcC5cbiAgICAvLyBSZXN0b3JpbmcgcmUtcHVzaGVzIGl0LiBBbiBhY3RpdmUgdHJhcCB3b3VsZCBzdGVhbCBmb2N1cyBiYWNrIHRvIHRoZSBoaWRkZW4gbW9kYWwsIGJsb2NraW5nIHRoZVxuICAgIC8vIE1vdXNlLWRyaXZlbiBpbnNwZWN0aW9uIChjbGlja2luZyBub3Rlcywgc2Nyb2xsaW5nKSB0aGF0IG1pbmltaXplIGV4aXN0cyB0byBhbGxvdy5cbiAgICAvLyBLZXlib2FyZCBpbnB1dCByZW1haW5zIGJsb2NrZWQgYnkgdGhlIHBlZWstb25seSBsb2NrLCBzbyByZWxlYXNpbmcgdGhlIHRyYXAga2VlcHMgdGhlIGFwcCBpbmVydC5cbiAgICB0aGlzLm1vZGFsLmFwcC5rZXltYXAucG9wU2NvcGUodGhpcy5tb2RhbC5zY29wZSk7XG4gICAgdGhpcy5taW5pbWl6ZWRCYXJFbCA9IHRoaXMuY3JlYXRlTWluaW1pemVkQmFyKCk7XG4gICAgdGhpcy5lbmFibGVQZWVrTG9jayh0aGlzLm1pbmltaXplZEJhckVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlcyB0aGUgbW9kYWwgZnJvbSB0aGUgbWluaW1pemVkIHN0YXRlLCByZW1vdmluZyB0aGUgZmxvYXRpbmcgYmFyIGFuZCBsaWZ0aW5nIHRoZSBwZWVrLW9ubHlcbiAgICogbG9jay4gQSBuby1vcCBpZiB0aGUgbW9kYWwgaXMgbm90IG1pbmltaXplZC5cbiAgICovXG4gIHB1YmxpYyByZXN0b3JlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc01pbmltaXplZFZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc01pbmltaXplZFZhbHVlID0gZmFsc2U7XG4gICAgdGhpcy5kaXNhYmxlUGVla0xvY2soKTtcbiAgICB0aGlzLnJlbW92ZU1pbmltaXplZEJhcigpO1xuICAgIC8vIFJlLXB1c2ggdGhlIHNjb3BlIHBvcHBlZCBpbiBtaW5pbWl6ZSgpIHNvIHRoZSByZXN0b3JlZCBtb2RhbCBibG9ja3MgdGhlIGFwcCBhZ2FpbiAoZm9jdXMgdHJhcFxuICAgIC8vICsgRXNjYXBlIGNhcHR1cmUpLlxuICAgIHRoaXMubW9kYWwuYXBwLmtleW1hcC5wdXNoU2NvcGUodGhpcy5tb2RhbC5zY29wZSk7XG4gICAgdGhpcy5tb2RhbC5jb250YWluZXJFbC5zaG93KCk7XG4gICAgdGhpcy5taW5pbWl6ZUJ1dHRvbkVsLnNob3coKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWluaW1pemVCdXR0b24oKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGJ1dHRvbkVsID0gdGhpcy5tb2RhbC5tb2RhbEVsLmNyZWF0ZUVsKCdidXR0b24nLCB7IGNsczogQ3NzQ2xhc3MuTWluaW1pemVCdXR0b24gfSk7XG4gICAgc2V0SWNvbihidXR0b25FbCwgTUlOSU1JWkVfSUNPTl9JRCk7XG4gICAgYnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICB0aGlzLm1pbmltaXplKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGJ1dHRvbkVsO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNaW5pbWl6ZWRCYXIoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGJhckVsID0gdGhpcy5tb2RhbC5jb250YWluZXJFbC5vd25lckRvY3VtZW50LmJvZHkuY3JlYXRlRGl2KCk7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3NlcyhiYXJFbCwgW0Nzc0NsYXNzLk1pbmltaXplZE1vZGFsQmFyXSk7XG4gICAgYmFyRWwuY3JlYXRlU3Bhbih7XG4gICAgICBjbHM6IENzc0NsYXNzLk1pbmltaXplZE1vZGFsQmFyVGl0bGUsXG4gICAgICB0ZXh0OiB0aGlzLm1vZGFsLnRpdGxlRWwudGV4dENvbnRlbnRcbiAgICB9KTtcbiAgICBjb25zdCByZXN0b3JlQnV0dG9uRWwgPSBiYXJFbC5jcmVhdGVFbCgnYnV0dG9uJywgeyBjbHM6IENzc0NsYXNzLlJlc3RvcmVCdXR0b24gfSk7XG4gICAgc2V0SWNvbihyZXN0b3JlQnV0dG9uRWwsIFJFU1RPUkVfSUNPTl9JRCk7XG4gICAgLy8gVGhlIHdob2xlIGJhciByZXN0b3JlcyBvbiBjbGljaywgbm90IGp1c3QgdGhlIHJlc3RvcmUgYnV0dG9uIFx1MjAxNCBhIGxhcmdlciwgZWFzaWVyIGNsaWNrIHRhcmdldC5cbiAgICAvLyBgcmVzdG9yZSgpYCBndWFyZHMgYWdhaW5zdCBhIGRvdWJsZSBpbnZvY2F0aW9uLCBzbyB0aGUgcmVzdG9yZSBidXR0b24ncyBvd24gY2xpY2sgYnViYmxpbmcgdXBcbiAgICAvLyBIZXJlIGlzIGEgbm8tb3AuIFRoZSByZXN0b3JlIGJ1dHRvbiBzdGF5cyBwdXJlbHkgYXMgYSB2aXN1YWwgYWZmb3JkYW5jZSBmb3IgdGhlIGNsaWNrIHRhcmdldC5cbiAgICBiYXJFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgIH0pO1xuICAgIC8vIERyb3AgdGhlIG9uZS1zaG90IGF0dGVudGlvbiBmbGFzaCBvbmNlIGl0IGZpbmlzaGVzIHNvIHRoZSBiYXIgcmV0dXJucyB0byBpdHMgZ2VudGxlIGlkbGUgcHVsc2UuXG4gICAgLy8gVGhlIGlkbGUgcHVsc2UgaXMgYW4gaW5maW5pdGUgYW5pbWF0aW9uLCB3aGljaCBuZXZlciBmaXJlcyBgYW5pbWF0aW9uZW5kYC5cbiAgICBiYXJFbC5hZGRFdmVudExpc3RlbmVyKCdhbmltYXRpb25lbmQnLCAoKSA9PiB7XG4gICAgICBiYXJFbC5yZW1vdmVDbGFzcyhDc3NDbGFzcy5NaW5pbWl6ZWRNb2RhbEJhckF0dGVudGlvbik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGJhckVsO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlUGVla0xvY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBlZWtMb2NrRW50cnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwZWVrTG9ja0VudHJpZXMuZGVsZXRlKHRoaXMucGVla0xvY2tFbnRyeSk7XG4gICAgdGhpcy5wZWVrTG9ja0VudHJ5ID0gbnVsbDtcbiAgICAvLyBUZWFyIHRoZSBgb3BlbmAgcGF0Y2hlcyBkb3duIHdpdGggdGhlIGNvbXBvbmVudCwgc28gdGhleSBleGlzdCBvbmx5IHdoaWxlIHRoaXMgbW9kYWwgaXMgbWluaW1pemVkLlxuICAgIHRoaXMucGVla0xvY2tDb21wb25lbnQ/LnVubG9hZCgpO1xuICAgIHRoaXMucGVla0xvY2tDb21wb25lbnQgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVQZWVrTG9jayhiYXJFbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnBlZWtMb2NrRW50cnkgPSB7XG4gICAgICBiYXJFbCxcbiAgICAgIGZsYXNoOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuZmxhc2hCYXIoYmFyRWwpO1xuICAgICAgfSxcbiAgICAgIGlubmVyTW9kYWw6IHRoaXMubW9kYWxcbiAgICB9O1xuICAgIHBlZWtMb2NrRW50cmllcy5hZGQodGhpcy5wZWVrTG9ja0VudHJ5KTtcbiAgICAvLyBJbnN0YWxsIHRoZSBgb3BlbmAgcGF0Y2hlcyBhbmQgaW5wdXQgc3VwcHJlc3NvcnMgZm9yIGFzIGxvbmcgYXMgdGhpcyBtb2RhbCBpcyBtaW5pbWl6ZWQuIFRoZVxuICAgIC8vIEJsb2NrIExPR0lDIGl0c2VsZiBrZXlzIG9mZiB0aGUgc2hhcmVkIGBwZWVrTG9ja0VudHJpZXNgIChzZWUgYHNob3VsZEJsb2NrT3BlbmApLCBzbyB3aXRoIHNldmVyYWxcbiAgICAvLyBNb2RhbHMgbWluaW1pemVkIGV2ZXJ5IG9uZSdzIHBhdGNoIHJlYWNoZXMgdGhlIHNhbWUgdmVyZGljdDsgdGhlIGxvY2sgbGlmdHMgb25seSBvbmNlIHRoZSBsYXN0XG4gICAgLy8gTW9kYWwgcmVzdG9yZXMvY2xvc2VzLlxuICAgIHRoaXMucGVla0xvY2tDb21wb25lbnQgPSBuZXcgUGVla0xvY2tDb21wb25lbnQodGhpcy5tb2RhbC5hcHApO1xuICAgIHRoaXMucGVla0xvY2tDb21wb25lbnQubG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGFzaEJhcihiYXJFbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBiYXJFbC5yZW1vdmVDbGFzcyhDc3NDbGFzcy5NaW5pbWl6ZWRNb2RhbEJhckF0dGVudGlvbik7XG4gICAgLy8gRm9yY2UgYSByZWZsb3cgc28gcmUtYWRkaW5nIHRoZSBjbGFzcyByZXN0YXJ0cyB0aGUgb25lLXNob3QgZmxhc2ggb24gcmFwaWQgcmVwZWF0ZWQgYmxvY2tzLlxuICAgIGJhckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGJhckVsLmFkZENsYXNzKENzc0NsYXNzLk1pbmltaXplZE1vZGFsQmFyQXR0ZW50aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlUGVla0xvY2soKTtcbiAgICB0aGlzLnJlbW92ZU1pbmltaXplZEJhcigpO1xuICAgIHRoaXMuaXNNaW5pbWl6ZWRWYWx1ZSA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXRjaE9uQ2xvc2UobW9kYWw6IE1vZGFsKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZVBhdGNoQ29tcG9uZW50LnJlZ2lzdGVyTWV0aG9kUGF0Y2g8TW9kYWwsICdvbkNsb3NlJz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ29uQ2xvc2UnLFxuICAgICAgb2JqOiBtb2RhbCxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2sgfSk6IHZvaWQgPT4ge1xuICAgICAgICBmYWxsYmFjaygpO1xuICAgICAgICB0aGlzLmhhbmRsZUNsb3NlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZU1pbmltaXplZEJhcigpOiB2b2lkIHtcbiAgICB0aGlzLm1pbmltaXplZEJhckVsPy5yZW1vdmUoKTtcbiAgICB0aGlzLm1pbmltaXplZEJhckVsID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBibG9ja0V2ZW50KGV2dDogRXZlbnQpOiB2b2lkIHtcbiAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgc2lnbmFsQmxvY2tlZEF0dGVtcHQoKTtcbn1cblxuZnVuY3Rpb24gYmxvY2tPckZhbGxiYWNrKG1vZGFsOiBNb2RhbCwgZmFsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgaWYgKHNob3VsZEJsb2NrT3Blbihtb2RhbCkpIHtcbiAgICBzaWduYWxCbG9ja2VkQXR0ZW1wdCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZhbGxiYWNrKCk7XG59XG5cbmZ1bmN0aW9uIGZsYXNoTWluaW1pemVkQmFycygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBwZWVrTG9ja0VudHJpZXMpIHtcbiAgICBlbnRyeS5mbGFzaCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTWluaW1pemVkSW5uZXJNb2RhbChtb2RhbDogTW9kYWwpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBwZWVrTG9ja0VudHJpZXMpIHtcbiAgICBpZiAoZW50cnkuaW5uZXJNb2RhbCA9PT0gbW9kYWwpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNQZWVrQWxsb3dlZEtleShldnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgLy8gTmF2aWdhdGlvbiBtb3ZlcyB0aGUgY3Vyc29yL3Njcm9sbHMgKGFsbG93ZWQpLCBidXQgU2hpZnQrbmF2aWdhdGlvbiBleHRlbmRzIHRoZSBzZWxlY3Rpb24gKG5vdFxuICAvLyBOZWVkZWQgZm9yIGluc3BlY3Rpb24pLCBzbyBpdCBpcyBibG9ja2VkLiBCYXJlIG1vZGlmaWVyIHByZXNzZXMgcGFzcyB0aHJvdWdoIG9uIHRoZWlyIG93bi5cbiAgaWYgKE5BVklHQVRJT05fS0VZUy5oYXMoZXZ0LmtleSkpIHtcbiAgICByZXR1cm4gIWV2dC5zaGlmdEtleTtcbiAgfVxuXG4gIHJldHVybiBNT0RJRklFUl9LRVlTLmhhcyhldnQua2V5KTtcbn1cblxuZnVuY3Rpb24gaXNQZWVrTG9ja2VkKCk6IGJvb2xlYW4ge1xuICAvLyBEcm9wIGVudHJpZXMgd2hvc2UgYmFyIGhhcyBsZWZ0IHRoZSBET00gd2l0aG91dCBhIHJlc3RvcmUoKSBvciBjbG9zZSgpLlxuICAvLyBBIHRlc3QgdGVhcmRvd24gdGhhdCBlbXB0aWVzIHRoZSBib2R5IGlzIHRoZSB0eXBpY2FsIGNhdXNlOyB0aGlzIGtlZXBzIGEgc3RhbGUgZW50cnkgZnJvbSBsb2NraW5nLlxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlZWtMb2NrRW50cmllcykge1xuICAgIGlmICghZW50cnkuYmFyRWwuaXNDb25uZWN0ZWQpIHtcbiAgICAgIHBlZWtMb2NrRW50cmllcy5kZWxldGUoZW50cnkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwZWVrTG9ja0VudHJpZXMuc2l6ZSA+IDA7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEJsb2NrT3Blbihtb2RhbDogTW9kYWwpOiBib29sZWFuIHtcbiAgLy8gQSBtb2RhbCdzIG93biByZS1vcGVuIGlzIG5ldmVyIGJsb2NrZWQgXHUyMDE0IG90aGVyd2lzZSBhIG1pbmltaXplZCBtb2RhbCBjb3VsZCBub3QgcmVzdG9yZS9yZS1vcGVuXG4gIC8vIEl0c2VsZi4gRXZlcnkgT1RIRVIgbW9kYWwgb3BlbiBpcyBibG9ja2VkIHdoaWxlIGFueSBtb2RhbCBpcyBtaW5pbWl6ZWQgKHRoZSBwZWVrLW9ubHkgbG9jaykuXG4gIHJldHVybiBpc1BlZWtMb2NrZWQoKSAmJiAhaXNNaW5pbWl6ZWRJbm5lck1vZGFsKG1vZGFsKTtcbn1cblxuZnVuY3Rpb24gc2lnbmFsQmxvY2tlZEF0dGVtcHQoKTogdm9pZCB7XG4gIGZsYXNoTWluaW1pemVkQmFycygpO1xuICBiZWVwZXIuYmVlcCgpO1xufVxuXG5mdW5jdGlvbiBzdXBwcmVzc0tleWRvd25XaGlsZVBlZWtMb2NrZWQoZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gIGlmICghaXNQZWVrTG9ja2VkKCkgfHwgaXNQZWVrQWxsb3dlZEtleShldnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYmxvY2tFdmVudChldnQpO1xufVxuXG5mdW5jdGlvbiBzdXBwcmVzc1doaWxlUGVla0xvY2tlZChldnQ6IEV2ZW50KTogdm9pZCB7XG4gIGlmICghaXNQZWVrTG9ja2VkKCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBibG9ja0V2ZW50KGV2dCk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZDQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsY0FBYztBQUN2QixTQUFTLGdDQUFnQztBQUN6QyxTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLDJCQUEyQjtBQUVwQyxNQUFNLG1CQUFtQjtBQUN6QixNQUFNLGtCQUFrQjtBQUt4QixNQUFNLGtCQUFrQixvQkFBSSxJQUFZO0FBQUEsRUFDdEM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsQ0FBQztBQUlELE1B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
|
|
@@ -35,7 +35,10 @@ type PluginObsidianProtocolHandlerRegistrarRegisterObsidianProtocolHandlerParams
|
|
|
35
35
|
* Obsidian protocol handler registrar in an Obsidian plugin.
|
|
36
36
|
*/
|
|
37
37
|
export declare class PluginObsidianProtocolHandlerRegistrar implements ObsidianProtocolHandlerRegistrar {
|
|
38
|
-
|
|
38
|
+
/**
|
|
39
|
+
* The Obsidian plugin instance the protocol handlers are registered with.
|
|
40
|
+
*/
|
|
41
|
+
protected readonly plugin: Plugin;
|
|
39
42
|
/**
|
|
40
43
|
* Creates a new instance of the {@link PluginObsidianProtocolHandlerRegistrar} class.
|
|
41
44
|
*
|
|
@@ -23,6 +23,9 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
23
23
|
|
|
24
24
|
import { normalizePromisable } from "../async.mjs";
|
|
25
25
|
class PluginObsidianProtocolHandlerRegistrar {
|
|
26
|
+
/**
|
|
27
|
+
* The Obsidian plugin instance the protocol handlers are registered with.
|
|
28
|
+
*/
|
|
26
29
|
plugin;
|
|
27
30
|
/**
|
|
28
31
|
* Creates a new instance of the {@link PluginObsidianProtocolHandlerRegistrar} class.
|
|
@@ -44,4 +47,4 @@ class PluginObsidianProtocolHandlerRegistrar {
|
|
|
44
47
|
export {
|
|
45
48
|
PluginObsidianProtocolHandlerRegistrar
|
|
46
49
|
};
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL29ic2lkaWFuLXByb3RvY29sLWhhbmRsZXItcmVnaXN0cmFyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogT2JzaWRpYW4gcHJvdG9jb2wgaGFuZGxlciByZWdpc3RyYXJzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5Qcm90b2NvbERhdGEsXG4gIFBsdWdpblxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVQcm9taXNhYmxlIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuXG4vKipcbiAqIEEgcmVnaXN0cmFyIGZvciBPYnNpZGlhbiBwcm90b2NvbCBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhblByb3RvY29sSGFuZGxlclJlZ2lzdHJhciB7XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYW4gT2JzaWRpYW4gcHJvdG9jb2wgaGFuZGxlci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgT2JzaWRpYW4gcHJvdG9jb2wgaGFuZGxlciByZWdpc3RyYXRpb24uXG4gICAqL1xuICByZWdpc3Rlck9ic2lkaWFuUHJvdG9jb2xIYW5kbGVyKHBhcmFtczogT2JzaWRpYW5Qcm90b2NvbEhhbmRsZXJSZWdpc3RyYXJSZWdpc3Rlck9ic2lkaWFuUHJvdG9jb2xIYW5kbGVyUGFyYW1zKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIE9ic2lkaWFuUHJvdG9jb2xIYW5kbGVyUmVnaXN0cmFyUmVnaXN0ZXJPYnNpZGlhblByb3RvY29sSGFuZGxlclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWN0aW9uIHRvIHJlZ2lzdGVyIHRoZSBoYW5kbGVyIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaGFuZGxlciB0byByZWdpc3Rlci5cbiAgICpcbiAgICogQHBhcmFtIG9ic2lkaWFuUHJvdG9jb2xEYXRhIC0gVGhlIGRhdGEgcGFzc2VkIHRvIHRoZSBoYW5kbGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBoYW5kbGVyLlxuICAgKi9cbiAgaGFuZGxlcih0aGlzOiB2b2lkLCBvYnNpZGlhblByb3RvY29sRGF0YTogT2JzaWRpYW5Qcm90b2NvbERhdGEpOiBQcm9taXNhYmxlPHZvaWQ+
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL29ic2lkaWFuLXByb3RvY29sLWhhbmRsZXItcmVnaXN0cmFyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogT2JzaWRpYW4gcHJvdG9jb2wgaGFuZGxlciByZWdpc3RyYXJzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5Qcm90b2NvbERhdGEsXG4gIFBsdWdpblxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVQcm9taXNhYmxlIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuXG4vKipcbiAqIEEgcmVnaXN0cmFyIGZvciBPYnNpZGlhbiBwcm90b2NvbCBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhblByb3RvY29sSGFuZGxlclJlZ2lzdHJhciB7XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYW4gT2JzaWRpYW4gcHJvdG9jb2wgaGFuZGxlci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgT2JzaWRpYW4gcHJvdG9jb2wgaGFuZGxlciByZWdpc3RyYXRpb24uXG4gICAqL1xuICByZWdpc3Rlck9ic2lkaWFuUHJvdG9jb2xIYW5kbGVyKHBhcmFtczogT2JzaWRpYW5Qcm90b2NvbEhhbmRsZXJSZWdpc3RyYXJSZWdpc3Rlck9ic2lkaWFuUHJvdG9jb2xIYW5kbGVyUGFyYW1zKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIE9ic2lkaWFuUHJvdG9jb2xIYW5kbGVyUmVnaXN0cmFyUmVnaXN0ZXJPYnNpZGlhblByb3RvY29sSGFuZGxlclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWN0aW9uIHRvIHJlZ2lzdGVyIHRoZSBoYW5kbGVyIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaGFuZGxlciB0byByZWdpc3Rlci5cbiAgICpcbiAgICogQHBhcmFtIG9ic2lkaWFuUHJvdG9jb2xEYXRhIC0gVGhlIGRhdGEgcGFzc2VkIHRvIHRoZSBoYW5kbGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBoYW5kbGVyLlxuICAgKi9cbiAgaGFuZGxlcih0aGlzOiB2b2lkLCBvYnNpZGlhblByb3RvY29sRGF0YTogT2JzaWRpYW5Qcm90b2NvbERhdGEpOiBQcm9taXNhYmxlPHZvaWQ+O1xufVxuXG50eXBlIFBsdWdpbk9ic2lkaWFuUHJvdG9jb2xIYW5kbGVyUmVnaXN0cmFyUmVnaXN0ZXJPYnNpZGlhblByb3RvY29sSGFuZGxlclBhcmFtcyA9IE9ic2lkaWFuUHJvdG9jb2xIYW5kbGVyUmVnaXN0cmFyUmVnaXN0ZXJPYnNpZGlhblByb3RvY29sSGFuZGxlclBhcmFtcztcblxuLyoqXG4gKiBPYnNpZGlhbiBwcm90b2NvbCBoYW5kbGVyIHJlZ2lzdHJhciBpbiBhbiBPYnNpZGlhbiBwbHVnaW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5PYnNpZGlhblByb3RvY29sSGFuZGxlclJlZ2lzdHJhciBpbXBsZW1lbnRzIE9ic2lkaWFuUHJvdG9jb2xIYW5kbGVyUmVnaXN0cmFyIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBwbHVnaW4gaW5zdGFuY2UgdGhlIHByb3RvY29sIGhhbmRsZXJzIGFyZSByZWdpc3RlcmVkIHdpdGguXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHtAbGluayBQbHVnaW5PYnNpZGlhblByb3RvY29sSGFuZGxlclJlZ2lzdHJhcn0gY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIHRvIHJlZ2lzdGVyIHRoZSBwcm90b2NvbCBoYW5kbGVyIHdpdGguXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGx1Z2luOiBQbHVnaW4pIHtcbiAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYW4gT2JzaWRpYW4gcHJvdG9jb2wgaGFuZGxlci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgT2JzaWRpYW4gcHJvdG9jb2wgaGFuZGxlciByZWdpc3RyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPYnNpZGlhblByb3RvY29sSGFuZGxlcihwYXJhbXM6IFBsdWdpbk9ic2lkaWFuUHJvdG9jb2xIYW5kbGVyUmVnaXN0cmFyUmVnaXN0ZXJPYnNpZGlhblByb3RvY29sSGFuZGxlclBhcmFtcyk6IHZvaWQge1xuICAgIHRoaXMucGx1Z2luLnJlZ2lzdGVyT2JzaWRpYW5Qcm90b2NvbEhhbmRsZXIocGFyYW1zLmFjdGlvbiwgKG9ic2lkaWFuUHJvdG9jb2xEYXRhKSA9PiBub3JtYWxpemVQcm9taXNhYmxlKHBhcmFtcy5oYW5kbGVyKG9ic2lkaWFuUHJvdG9jb2xEYXRhKSkpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVlBLFNBQVMsMkJBQTJCO0FBa0M3QixNQUFNLHVDQUFtRjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSTNFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1osWUFBWSxRQUFnQjtBQUNqQyxTQUFLLFNBQVM7QUFBQSxFQUNoQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLGdDQUFnQyxRQUEyRjtBQUNoSSxTQUFLLE9BQU8sZ0NBQWdDLE9BQU8sUUFBUSxDQUFDLHlCQUF5QixvQkFBb0IsT0FBTyxRQUFRLG9CQUFvQixDQUFDLENBQUM7QUFBQSxFQUNoSjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|