@mnaoumov/obsidian-lib 10.5.0 → 10.6.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/README.md +6 -0
- package/codemirror/inline-token-widgets/package.json +6 -0
- package/codemirror/settings-facet/package.json +6 -0
- package/components/settings-facet-component/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +104 -1
- package/dist/lib/cjs/__merged.d.cts +20 -3
- package/dist/lib/cjs/anchored-suggest.cjs +232 -0
- package/dist/lib/cjs/anchored-suggest.d.cts +116 -0
- package/dist/lib/cjs/backlink-index.cjs +44 -8
- package/dist/lib/cjs/backlink-index.d.cts +23 -0
- package/dist/lib/cjs/bug-report.cjs +4 -2
- package/dist/lib/cjs/bug-report.d.cts +1 -1
- package/dist/lib/cjs/bulk-operation-progress.cjs +16 -1
- package/dist/lib/cjs/bulk-operation-progress.d.cts +22 -0
- package/dist/lib/cjs/case-insensitive-file-index.cjs +9 -1
- package/dist/lib/cjs/code-block-render-handoff.cjs +272 -0
- package/dist/lib/cjs/code-block-render-handoff.d.cts +131 -0
- package/dist/lib/cjs/codemirror/index.cjs +7 -1
- package/dist/lib/cjs/codemirror/index.d.cts +2 -0
- package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +250 -0
- package/dist/lib/cjs/codemirror/inline-token-widgets.d.cts +109 -0
- package/dist/lib/cjs/codemirror/settings-facet.cjs +132 -0
- package/dist/lib/cjs/codemirror/settings-facet.d.cts +19 -0
- package/dist/lib/cjs/community-plugins.cjs +19 -2
- package/dist/lib/cjs/community-plugins.d.cts +14 -0
- package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +5 -2
- package/dist/lib/cjs/components/index.cjs +4 -1
- package/dist/lib/cjs/components/index.d.cts +1 -0
- package/dist/lib/cjs/components/rename-delete-handler-component.cjs +105 -2
- package/dist/lib/cjs/components/settings-facet-component.cjs +136 -0
- package/dist/lib/cjs/components/settings-facet-component.d.cts +68 -0
- package/dist/lib/cjs/css-class.cjs +8 -1
- package/dist/lib/cjs/css-class.d.cts +28 -0
- package/dist/lib/cjs/desktop-bulk-operation-git.cjs +38 -13
- package/dist/lib/cjs/desktop-bulk-operation-git.d.cts +21 -1
- package/dist/lib/cjs/desktop-request-url-stream.cjs +258 -0
- package/dist/lib/cjs/desktop-request-url-stream.d.cts +22 -0
- package/dist/lib/cjs/editor-suggest-registrar.cjs +8 -2
- package/dist/lib/cjs/editor-suggest-registrar.d.cts +14 -2
- package/dist/lib/cjs/editor-suggest.cjs +198 -0
- package/dist/lib/cjs/editor-suggest.d.cts +103 -0
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/hotkey.cjs +185 -0
- package/dist/lib/cjs/hotkey.d.cts +59 -0
- package/dist/lib/cjs/i18n/locales/en.cjs +14 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +13 -0
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +13 -0
- package/dist/lib/cjs/index.cjs +31 -1
- package/dist/lib/cjs/index.d.cts +10 -0
- package/dist/lib/cjs/inline-token-renderer.cjs +145 -0
- package/dist/lib/cjs/inline-token-renderer.d.cts +88 -0
- package/dist/lib/cjs/link-and-tag-input-suggest.cjs +325 -0
- package/dist/lib/cjs/link-and-tag-input-suggest.d.cts +229 -0
- package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -1
- package/dist/lib/cjs/markdown-code-block-processor.d.cts +18 -0
- package/dist/lib/cjs/markdown.cjs +6 -1
- package/dist/lib/cjs/markdown.d.cts +10 -1
- package/dist/lib/cjs/modals/modal.cjs +8 -5
- package/dist/lib/cjs/modals/modal.d.cts +4 -0
- package/dist/lib/cjs/plugin/plugin.cjs +5 -2
- package/dist/lib/cjs/plugin/plugin.d.cts +2 -0
- package/dist/lib/cjs/rendered-markdown.cjs +306 -0
- package/dist/lib/cjs/rendered-markdown.d.cts +77 -0
- package/dist/lib/cjs/request-url.cjs +523 -0
- package/dist/lib/cjs/request-url.d.cts +233 -0
- package/dist/lib/cjs/setting-components/folder-list-component.cjs +216 -0
- package/dist/lib/cjs/setting-components/folder-list-component.d.cts +73 -0
- package/dist/lib/cjs/setting-components/hotkey-component.cjs +260 -0
- package/dist/lib/cjs/setting-components/hotkey-component.d.cts +85 -0
- package/dist/lib/cjs/setting-components/index.cjs +13 -1
- package/dist/lib/cjs/setting-components/index.d.cts +4 -0
- package/dist/lib/cjs/setting-components/list-component.cjs +291 -0
- package/dist/lib/cjs/setting-components/list-component.d.cts +106 -0
- package/dist/lib/cjs/setting-components/tag-list-component.cjs +220 -0
- package/dist/lib/cjs/setting-components/tag-list-component.d.cts +82 -0
- package/dist/lib/cjs/setting-ex.cjs +51 -1
- package/dist/lib/cjs/setting-ex.d.cts +35 -1
- package/dist/lib/cjs/settings-tabs.cjs +258 -0
- package/dist/lib/cjs/settings-tabs.d.cts +101 -0
- package/dist/lib/esm/__merged.d.mts +20 -3
- package/dist/lib/esm/__merged.mjs +110 -2
- package/dist/lib/esm/anchored-suggest.d.mts +116 -0
- package/dist/lib/esm/anchored-suggest.mjs +144 -0
- package/dist/lib/esm/backlink-index.d.mts +23 -0
- package/dist/lib/esm/backlink-index.mjs +42 -7
- package/dist/lib/esm/bug-report.d.mts +1 -1
- package/dist/lib/esm/bug-report.mjs +4 -2
- package/dist/lib/esm/bulk-operation-progress.d.mts +22 -0
- package/dist/lib/esm/bulk-operation-progress.mjs +14 -1
- package/dist/lib/esm/case-insensitive-file-index.mjs +9 -1
- package/dist/lib/esm/code-block-render-handoff.d.mts +131 -0
- package/dist/lib/esm/code-block-render-handoff.mjs +183 -0
- package/dist/lib/esm/codemirror/index.d.mts +2 -0
- package/dist/lib/esm/codemirror/index.mjs +5 -1
- package/dist/lib/esm/codemirror/inline-token-widgets.d.mts +109 -0
- package/dist/lib/esm/codemirror/inline-token-widgets.mjs +167 -0
- package/dist/lib/esm/codemirror/settings-facet.d.mts +19 -0
- package/dist/lib/esm/codemirror/settings-facet.mjs +44 -0
- package/dist/lib/esm/community-plugins.d.mts +14 -0
- package/dist/lib/esm/community-plugins.mjs +18 -2
- package/dist/lib/esm/components/bulk-operation-commit-component.mjs +5 -2
- package/dist/lib/esm/components/index.d.mts +1 -0
- package/dist/lib/esm/components/index.mjs +3 -1
- package/dist/lib/esm/components/rename-delete-handler-component.mjs +105 -2
- package/dist/lib/esm/components/settings-facet-component.d.mts +68 -0
- package/dist/lib/esm/components/settings-facet-component.mjs +48 -0
- package/dist/lib/esm/css-class.d.mts +28 -0
- package/dist/lib/esm/css-class.mjs +8 -1
- package/dist/lib/esm/desktop-bulk-operation-git.d.mts +21 -1
- package/dist/lib/esm/desktop-bulk-operation-git.mjs +38 -13
- package/dist/lib/esm/desktop-request-url-stream.d.mts +22 -0
- package/dist/lib/esm/desktop-request-url-stream.mjs +170 -0
- package/dist/lib/esm/editor-suggest-registrar.d.mts +14 -2
- package/dist/lib/esm/editor-suggest-registrar.mjs +8 -2
- package/dist/lib/esm/editor-suggest.d.mts +103 -0
- package/dist/lib/esm/editor-suggest.mjs +109 -0
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/hotkey.d.mts +59 -0
- package/dist/lib/esm/hotkey.mjs +95 -0
- package/dist/lib/esm/i18n/locales/en.d.mts +13 -0
- package/dist/lib/esm/i18n/locales/en.mjs +14 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +13 -0
- package/dist/lib/esm/index.d.mts +10 -0
- package/dist/lib/esm/index.mjs +21 -1
- package/dist/lib/esm/inline-token-renderer.d.mts +88 -0
- package/dist/lib/esm/inline-token-renderer.mjs +59 -0
- package/dist/lib/esm/link-and-tag-input-suggest.d.mts +229 -0
- package/dist/lib/esm/link-and-tag-input-suggest.mjs +239 -0
- package/dist/lib/esm/markdown-code-block-processor.d.mts +18 -0
- package/dist/lib/esm/markdown-code-block-processor.mjs +16 -1
- package/dist/lib/esm/markdown.d.mts +10 -1
- package/dist/lib/esm/markdown.mjs +9 -1
- package/dist/lib/esm/modals/modal.d.mts +4 -0
- package/dist/lib/esm/modals/modal.mjs +8 -5
- package/dist/lib/esm/plugin/plugin.d.mts +2 -0
- package/dist/lib/esm/plugin/plugin.mjs +5 -2
- package/dist/lib/esm/rendered-markdown.d.mts +77 -0
- package/dist/lib/esm/rendered-markdown.mjs +219 -0
- package/dist/lib/esm/request-url.d.mts +233 -0
- package/dist/lib/esm/request-url.mjs +428 -0
- package/dist/lib/esm/setting-components/folder-list-component.d.mts +73 -0
- package/dist/lib/esm/setting-components/folder-list-component.mjs +131 -0
- package/dist/lib/esm/setting-components/hotkey-component.d.mts +85 -0
- package/dist/lib/esm/setting-components/hotkey-component.mjs +178 -0
- package/dist/lib/esm/setting-components/index.d.mts +4 -0
- package/dist/lib/esm/setting-components/index.mjs +9 -1
- package/dist/lib/esm/setting-components/list-component.d.mts +106 -0
- package/dist/lib/esm/setting-components/list-component.mjs +206 -0
- package/dist/lib/esm/setting-components/tag-list-component.d.mts +82 -0
- package/dist/lib/esm/setting-components/tag-list-component.mjs +131 -0
- package/dist/lib/esm/setting-ex.d.mts +35 -1
- package/dist/lib/esm/setting-ex.mjs +51 -1
- package/dist/lib/esm/settings-tabs.d.mts +101 -0
- package/dist/lib/esm/settings-tabs.mjs +170 -0
- package/dist/styles.css +83 -1
- package/package.json +3 -3
- package/setting-components/folder-list-component/package.json +6 -0
- package/setting-components/hotkey-component/package.json +6 -0
- package/setting-components/list-component/package.json +6 -0
- package/setting-components/tag-list-component/package.json +6 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
(function () {
|
|
6
|
+
function ensureBrowserProcess() {
|
|
7
|
+
const browserProcess = {
|
|
8
|
+
browser: true,
|
|
9
|
+
cwd() {
|
|
10
|
+
return "/";
|
|
11
|
+
},
|
|
12
|
+
env: {},
|
|
13
|
+
platform: "android"
|
|
14
|
+
};
|
|
15
|
+
const existingProcess = globalThis.process;
|
|
16
|
+
if (!existingProcess) {
|
|
17
|
+
globalThis.process = browserProcess;
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (existingProcess.versions?.node) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const existingProcessRecord = existingProcess;
|
|
24
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
25
|
+
existingProcessRecord[key] ??= value;
|
|
26
|
+
}
|
|
27
|
+
existingProcessRecord["browser"] = true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
ensureBrowserProcess();
|
|
31
|
+
})();
|
|
32
|
+
|
|
33
|
+
import { castTo } from "@mnaoumov/typescript-lib/object-utils";
|
|
34
|
+
import {
|
|
35
|
+
AbstractInputSuggest,
|
|
36
|
+
getAllTags,
|
|
37
|
+
prepareFuzzySearch,
|
|
38
|
+
sortSearchResults
|
|
39
|
+
} from "obsidian";
|
|
40
|
+
var LinkAndTagCompletionKind = /* @__PURE__ */ ((LinkAndTagCompletionKind2) => {
|
|
41
|
+
LinkAndTagCompletionKind2["Link"] = "link";
|
|
42
|
+
LinkAndTagCompletionKind2["Tag"] = "tag";
|
|
43
|
+
return LinkAndTagCompletionKind2;
|
|
44
|
+
})(LinkAndTagCompletionKind || {});
|
|
45
|
+
const LINK_OPEN = "[[";
|
|
46
|
+
const LINK_CLOSE = "]]";
|
|
47
|
+
const TAG_PREFIX = "#";
|
|
48
|
+
const TAG_BEFORE_CARET_REG_EXP = /(?:^|\s)#[\p{L}\p{N}_/-]*$/u;
|
|
49
|
+
class LinkAndTagInputSuggest extends AbstractInputSuggest {
|
|
50
|
+
/**
|
|
51
|
+
* The element the suggest completes in.
|
|
52
|
+
*/
|
|
53
|
+
inputEl;
|
|
54
|
+
/**
|
|
55
|
+
* Whether `[[` completes links.
|
|
56
|
+
*/
|
|
57
|
+
shouldSuggestLinks;
|
|
58
|
+
/**
|
|
59
|
+
* Whether `#` completes tags.
|
|
60
|
+
*/
|
|
61
|
+
shouldSuggestTags;
|
|
62
|
+
/**
|
|
63
|
+
* The path that inserted links are relative to.
|
|
64
|
+
*/
|
|
65
|
+
sourcePath;
|
|
66
|
+
/**
|
|
67
|
+
* Creates the suggest and attaches it to the element.
|
|
68
|
+
*
|
|
69
|
+
* @param params - The parameters.
|
|
70
|
+
*/
|
|
71
|
+
constructor(params) {
|
|
72
|
+
super(params.app, castTo(params.inputEl));
|
|
73
|
+
this.inputEl = params.inputEl;
|
|
74
|
+
this.shouldSuggestLinks = params.shouldSuggestLinks ?? true;
|
|
75
|
+
this.shouldSuggestTags = params.shouldSuggestTags ?? true;
|
|
76
|
+
this.sourcePath = params.sourcePath ?? "";
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Gets the value of the element.
|
|
80
|
+
*
|
|
81
|
+
* @returns The value.
|
|
82
|
+
*/
|
|
83
|
+
getValue() {
|
|
84
|
+
return this.inputEl.value;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Renders a suggestion.
|
|
88
|
+
*
|
|
89
|
+
* @param suggestion - The suggestion.
|
|
90
|
+
* @param el - The element to render into.
|
|
91
|
+
*/
|
|
92
|
+
renderSuggestion(suggestion, el) {
|
|
93
|
+
if (suggestion.kind === "link" /* Link */) {
|
|
94
|
+
el.createDiv({ cls: "suggestion-title", text: suggestion.linktext });
|
|
95
|
+
if (suggestion.linktext !== suggestion.file.path) {
|
|
96
|
+
el.createDiv({ cls: "suggestion-note", text: suggestion.file.path });
|
|
97
|
+
}
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
el.addClass("mod-complex");
|
|
101
|
+
el.createDiv({ cls: "suggestion-content", text: `${TAG_PREFIX}${suggestion.tag}` });
|
|
102
|
+
el.createDiv({ cls: "suggestion-aux", text: String(suggestion.count) });
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Inserts the suggestion in place of the trigger, moves the caret after it and dispatches an `input` event, so a
|
|
106
|
+
* component listening on the element sees the change.
|
|
107
|
+
*
|
|
108
|
+
* @param suggestion - The suggestion.
|
|
109
|
+
* @param $event - The event that selected it.
|
|
110
|
+
*/
|
|
111
|
+
selectSuggestion(suggestion, $event) {
|
|
112
|
+
const trigger = this.getTrigger();
|
|
113
|
+
if (trigger) {
|
|
114
|
+
const value = this.getValue();
|
|
115
|
+
let after = value.slice(trigger.end);
|
|
116
|
+
let insertion;
|
|
117
|
+
if (suggestion.kind === "link" /* Link */) {
|
|
118
|
+
insertion = `${LINK_OPEN}${suggestion.linktext}${LINK_CLOSE}`;
|
|
119
|
+
if (after.startsWith(LINK_CLOSE)) {
|
|
120
|
+
after = after.slice(LINK_CLOSE.length);
|
|
121
|
+
}
|
|
122
|
+
} else {
|
|
123
|
+
insertion = `${TAG_PREFIX}${suggestion.tag} `;
|
|
124
|
+
}
|
|
125
|
+
this.setValue(value.slice(0, trigger.start) + insertion + after);
|
|
126
|
+
const caret = trigger.start + insertion.length;
|
|
127
|
+
this.inputEl.setSelectionRange(caret, caret);
|
|
128
|
+
this.inputEl.dispatchEvent(new Event("input", { bubbles: true }));
|
|
129
|
+
}
|
|
130
|
+
super.selectSuggestion(suggestion, $event);
|
|
131
|
+
this.close();
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Sets the value of the element.
|
|
135
|
+
*
|
|
136
|
+
* @param value - The value.
|
|
137
|
+
*/
|
|
138
|
+
setValue(value) {
|
|
139
|
+
this.inputEl.value = value;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Gets the link suggestions for a query.
|
|
143
|
+
*
|
|
144
|
+
* @param query - The text typed after `[[`.
|
|
145
|
+
* @returns The suggestions, best match first.
|
|
146
|
+
*/
|
|
147
|
+
getLinkSuggestions(query) {
|
|
148
|
+
const fuzzySearch = prepareFuzzySearch(query);
|
|
149
|
+
const results = [];
|
|
150
|
+
for (const file of this.app.vault.getFiles()) {
|
|
151
|
+
const linktext = this.app.metadataCache.fileToLinktext(file, this.sourcePath, true);
|
|
152
|
+
const match = fuzzySearch(linktext) ?? fuzzySearch(file.path);
|
|
153
|
+
if (match) {
|
|
154
|
+
results.push({ match, suggestion: { file, kind: "link" /* Link */, linktext } });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
sortSearchResults(results);
|
|
158
|
+
return results.map((result) => result.suggestion);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Gets the suggestions for the trigger before the caret. The query Obsidian passes is the whole value, so it is
|
|
162
|
+
* ignored.
|
|
163
|
+
*
|
|
164
|
+
* @returns The suggestions.
|
|
165
|
+
*/
|
|
166
|
+
getSuggestions() {
|
|
167
|
+
const trigger = this.getTrigger();
|
|
168
|
+
if (trigger?.kind === "link" /* Link */) {
|
|
169
|
+
return this.getLinkSuggestions(trigger.query);
|
|
170
|
+
}
|
|
171
|
+
return trigger?.kind === "tag" /* Tag */ ? this.getTagSuggestions(trigger.query) : [];
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Gets the tag suggestions for a query, from the tags of every note.
|
|
175
|
+
*
|
|
176
|
+
* @param query - The text typed after `#`.
|
|
177
|
+
* @returns The suggestions, best match first, then the most used.
|
|
178
|
+
*/
|
|
179
|
+
getTagSuggestions(query) {
|
|
180
|
+
return getVaultTagSuggestions({ app: this.app, query });
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Gets the enabled trigger before the caret.
|
|
184
|
+
*
|
|
185
|
+
* @returns The trigger, or `null`.
|
|
186
|
+
*/
|
|
187
|
+
getTrigger() {
|
|
188
|
+
const value = this.getValue();
|
|
189
|
+
const trigger = getLinkAndTagCompletionTrigger(value, this.inputEl.selectionStart ?? value.length);
|
|
190
|
+
if (trigger?.kind === "link" /* Link */ && !this.shouldSuggestLinks) {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
return trigger?.kind === "tag" /* Tag */ && !this.shouldSuggestTags ? null : trigger;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function getLinkAndTagCompletionTrigger(text, caret) {
|
|
197
|
+
const beforeCaret = text.slice(0, caret);
|
|
198
|
+
const linkStart = beforeCaret.lastIndexOf(LINK_OPEN);
|
|
199
|
+
if (linkStart !== -1) {
|
|
200
|
+
const query = beforeCaret.slice(linkStart + LINK_OPEN.length);
|
|
201
|
+
if (!query.includes(LINK_CLOSE) && !query.includes("\n") && !query.includes("|")) {
|
|
202
|
+
return { end: caret, kind: "link" /* Link */, query, start: linkStart };
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (TAG_BEFORE_CARET_REG_EXP.test(beforeCaret)) {
|
|
206
|
+
const start = beforeCaret.lastIndexOf(TAG_PREFIX);
|
|
207
|
+
return { end: caret, kind: "tag" /* Tag */, query: beforeCaret.slice(start + TAG_PREFIX.length), start };
|
|
208
|
+
}
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
function getVaultTagSuggestions(params) {
|
|
212
|
+
const { app, query } = params;
|
|
213
|
+
const counts = /* @__PURE__ */ new Map();
|
|
214
|
+
for (const file of app.vault.getMarkdownFiles()) {
|
|
215
|
+
const cache = app.metadataCache.getFileCache(file);
|
|
216
|
+
for (const tag of (cache ? getAllTags(cache) : null) ?? []) {
|
|
217
|
+
const name = tag.slice(TAG_PREFIX.length);
|
|
218
|
+
counts.set(name, (counts.get(name) ?? 0) + 1);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const fuzzySearch = prepareFuzzySearch(query);
|
|
222
|
+
const results = [];
|
|
223
|
+
const sortedCounts = [...counts].sort(([tag1, count1], [tag2, count2]) => count2 - count1 || tag1.localeCompare(tag2));
|
|
224
|
+
for (const [tag, count] of sortedCounts) {
|
|
225
|
+
const match = fuzzySearch(tag);
|
|
226
|
+
if (match) {
|
|
227
|
+
results.push({ match, suggestion: { count, kind: "tag" /* Tag */, tag } });
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
sortSearchResults(results);
|
|
231
|
+
return results.map((result) => result.suggestion);
|
|
232
|
+
}
|
|
233
|
+
export {
|
|
234
|
+
LinkAndTagCompletionKind,
|
|
235
|
+
LinkAndTagInputSuggest,
|
|
236
|
+
getLinkAndTagCompletionTrigger,
|
|
237
|
+
getVaultTagSuggestions
|
|
238
|
+
};
|
|
239
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saW5rLWFuZC10YWctaW5wdXQtc3VnZ2VzdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29tcGxldGVzIGBbW2AgbGlua3MgYW5kIGAjYCB0YWdzIGF0IHRoZSBjYXJldCBvZiBhbnkgYDxpbnB1dD5gIG9yIGA8dGV4dGFyZWE+YCwgdGhlIHdheSB0aGUgZWRpdG9yIGRvZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIFNlYXJjaFJlc3VsdCxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBjYXN0VG8gfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7XG4gIEFic3RyYWN0SW5wdXRTdWdnZXN0LFxuICBnZXRBbGxUYWdzLFxuICBwcmVwYXJlRnV6enlTZWFyY2gsXG4gIHNvcnRTZWFyY2hSZXN1bHRzXG59IGZyb20gJ29ic2lkaWFuJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAtLSBXZSBuZWVkIHRvIGltcG9ydCBgVGFnTGlzdENvbXBvbmVudGAgdG8gdXNlIGl0IGluIHRoZSB0c2RvY3MuXG5pbXBvcnQgdHlwZSB7IFRhZ0xpc3RDb21wb25lbnQgfSBmcm9tICcuL3NldHRpbmctY29tcG9uZW50cy90YWctbGlzdC1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIFdoYXQgYSBjb21wbGV0aW9uIHRyaWdnZXIgY29tcGxldGVzLlxuICovXG5leHBvcnQgZW51bSBMaW5rQW5kVGFnQ29tcGxldGlvbktpbmQge1xuICAvKipcbiAgICogQSBgW1tgIHdpa2lsaW5rIHRvIGEgdmF1bHQgZmlsZS5cbiAgICovXG4gIExpbmsgPSAnbGluaycsXG5cbiAgLyoqXG4gICAqIEEgYCNgIHRhZy5cbiAgICovXG4gIFRhZyA9ICd0YWcnXG59XG5cbi8qKlxuICogQSBjb21wbGV0aW9uIHRyaWdnZXIgZm91bmQgYmVmb3JlIHRoZSBjYXJldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rQW5kVGFnQ29tcGxldGlvblRyaWdnZXIge1xuICAvKipcbiAgICogVGhlIG9mZnNldCBvZiB0aGUgY2FyZXQsIHdoZXJlIHRoZSBxdWVyeSBlbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhlIHRyaWdnZXIgY29tcGxldGVzLlxuICAgKi9cbiAgcmVhZG9ubHkga2luZDogTGlua0FuZFRhZ0NvbXBsZXRpb25LaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0eXBlZCBhZnRlciB0aGUgdHJpZ2dlciBjaGFyYWN0ZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgcXVlcnk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9mZnNldCBvZiB0aGUgdHJpZ2dlciBjaGFyYWN0ZXJzOiB0aGUgZmlyc3QgYFtgIG9mIGBbW2AsIG9yIHRoZSBgI2AuXG4gICAqL1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgb2Yge0BsaW5rIExpbmtBbmRUYWdJbnB1dFN1Z2dlc3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtBbmRUYWdJbnB1dFN1Z2dlc3RDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRvIGNvbXBsZXRlIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRFbDogSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYFtbYCBjb21wbGV0ZXMgbGlua3MuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFN1Z2dlc3RMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYCNgIGNvbXBsZXRlcyB0YWdzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTdWdnZXN0VGFncz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRoYXQgaW5zZXJ0ZWQgbGlua3MgYXJlIHJlbGF0aXZlIHRvLiBEZWZhdWx0cyB0byB0aGUgdmF1bHQgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzdWdnZXN0aW9uIG9mIHtAbGluayBMaW5rQW5kVGFnSW5wdXRTdWdnZXN0fS5cbiAqL1xuZXhwb3J0IHR5cGUgTGlua0FuZFRhZ1N1Z2dlc3Rpb24gPSBMaW5rU3VnZ2VzdGlvbiB8IFRhZ1N1Z2dlc3Rpb247XG5cbi8qKlxuICogQSBzdWdnZXN0ZWQgbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU3VnZ2VzdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0aGUgbGluayBwb2ludHMgdG8uXG4gICAqL1xuICByZWFkb25seSBmaWxlOiBURmlsZTtcblxuICAvKipcbiAgICogVGhlIGtpbmQgb2YgdGhlIHN1Z2dlc3Rpb24uXG4gICAqL1xuICByZWFkb25seSBraW5kOiBMaW5rQW5kVGFnQ29tcGxldGlvbktpbmQuTGluaztcblxuICAvKipcbiAgICogVGhlIGxpbmsgdGV4dCBpbnNlcnRlZCBiZXR3ZWVuIGBbW2AgYW5kIGBdXWAuXG4gICAqL1xuICByZWFkb25seSBsaW5rdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc3VnZ2VzdGVkIHRhZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWdTdWdnZXN0aW9uIHtcbiAgLyoqXG4gICAqIEhvdyBtYW55IHRhZyBvY2N1cnJlbmNlcyB0aGUgdmF1bHQgaG9sZHMuXG4gICAqL1xuICByZWFkb25seSBjb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUga2luZCBvZiB0aGUgc3VnZ2VzdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IExpbmtBbmRUYWdDb21wbGV0aW9uS2luZC5UYWc7XG5cbiAgLyoqXG4gICAqIFRoZSB0YWcsIHdpdGhvdXQgaXRzIGAjYC5cbiAgICovXG4gIHJlYWRvbmx5IHRhZzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU3VnZ2VzdGlvblNlYXJjaFJlc3VsdDxUPiB7XG4gIHJlYWRvbmx5IG1hdGNoOiBTZWFyY2hSZXN1bHQ7XG4gIHJlYWRvbmx5IHN1Z2dlc3Rpb246IFQ7XG59XG5cbmNvbnN0IExJTktfT1BFTiA9ICdbWyc7XG5jb25zdCBMSU5LX0NMT1NFID0gJ11dJztcbmNvbnN0IFRBR19QUkVGSVggPSAnIyc7XG5jb25zdCBUQUdfQkVGT1JFX0NBUkVUX1JFR19FWFAgPSAvKD86XnxcXHMpI1tcXHB7TH1cXHB7Tn1fLy1dKiQvdTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0VmF1bHRUYWdTdWdnZXN0aW9uc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VmF1bHRUYWdTdWdnZXN0aW9uc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHR5cGVkLCB3aXRob3V0IHRoZSBgI2AuXG4gICAqL1xuICByZWFkb25seSBxdWVyeTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbXBsZXRlcyBgW1tgIGxpbmtzIGFuZCBgI2AgdGFncyBpbnNpZGUgYW55IGA8aW5wdXQ+YCBvciBgPHRleHRhcmVhPmAuXG4gKlxuICogT2JzaWRpYW4ncyB7QGxpbmsgQWJzdHJhY3RJbnB1dFN1Z2dlc3R9IHRyZWF0cyB0aGUgd2hvbGUgdmFsdWUgYXMgdGhlIHF1ZXJ5IGFuZCByZXBsYWNlcyBpdCBvbiBzZWxlY3Rpb24uIFRoaXMgb25lXG4gKiByZWFkcyB0aGUgdHJpZ2dlciBiZWZvcmUgdGhlIGNhcmV0IGFuZCByZXBsYWNlcyBvbmx5IHRoYXQsIHNvIGl0IHdvcmtzIGluc2lkZSBmcmVlIHRleHQgc3VjaCBhcyBhIHRlbXBsYXRlIG9yIGFcbiAqIGRlc2NyaXB0aW9uIHNldHRpbmcsIGFuZCBpdCBhY2NlcHRzIGEgYDx0ZXh0YXJlYT5gIHRvby5cbiAqXG4gKiBgYGB0c1xuICogbmV3IFNldHRpbmcoY29udGFpbmVyRWwpLmFkZFRleHRBcmVhKCh0ZXh0QXJlYSkgPT4ge1xuICogICBuZXcgTGlua0FuZFRhZ0lucHV0U3VnZ2VzdCh7IGFwcDogdGhpcy5hcHAsIGlucHV0RWw6IHRleHRBcmVhLmlucHV0RWwgfSk7XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTGlua0FuZFRhZ0lucHV0U3VnZ2VzdCBleHRlbmRzIEFic3RyYWN0SW5wdXRTdWdnZXN0PExpbmtBbmRUYWdTdWdnZXN0aW9uPiB7XG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCB0aGUgc3VnZ2VzdCBjb21wbGV0ZXMgaW4uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW5wdXRFbDogSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYFtbYCBjb21wbGV0ZXMgbGlua3MuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkU3VnZ2VzdExpbmtzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGAjYCBjb21wbGV0ZXMgdGFncy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzaG91bGRTdWdnZXN0VGFnczogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBhdGggdGhhdCBpbnNlcnRlZCBsaW5rcyBhcmUgcmVsYXRpdmUgdG8uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBzdWdnZXN0IGFuZCBhdHRhY2hlcyBpdCB0byB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogTGlua0FuZFRhZ0lucHV0U3VnZ2VzdENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgLy8gT2JzaWRpYW4ncyBzdWdnZXN0IHJlYWRzIHRoZSB2YWx1ZSBvbmx5IHRocm91Z2ggYGdldFZhbHVlYCBhbmQgYHNldFZhbHVlYCwgYm90aCBvdmVycmlkZGVuIGhlcmUsIHNvIGEgdGV4dGFyZWEgd29ya3MgdG9vLlxuICAgIHN1cGVyKHBhcmFtcy5hcHAsIGNhc3RUbzxIVE1MSW5wdXRFbGVtZW50PihwYXJhbXMuaW5wdXRFbCkpO1xuICAgIHRoaXMuaW5wdXRFbCA9IHBhcmFtcy5pbnB1dEVsO1xuICAgIHRoaXMuc2hvdWxkU3VnZ2VzdExpbmtzID0gcGFyYW1zLnNob3VsZFN1Z2dlc3RMaW5rcyA/PyB0cnVlO1xuICAgIHRoaXMuc2hvdWxkU3VnZ2VzdFRhZ3MgPSBwYXJhbXMuc2hvdWxkU3VnZ2VzdFRhZ3MgPz8gdHJ1ZTtcbiAgICB0aGlzLnNvdXJjZVBhdGggPSBwYXJhbXMuc291cmNlUGF0aCA/PyAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGdldFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRFbC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgc3VnZ2VzdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHN1Z2dlc3Rpb24gLSBUaGUgc3VnZ2VzdGlvbi5cbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyU3VnZ2VzdGlvbihzdWdnZXN0aW9uOiBMaW5rQW5kVGFnU3VnZ2VzdGlvbiwgZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKHN1Z2dlc3Rpb24ua2luZCA9PT0gTGlua0FuZFRhZ0NvbXBsZXRpb25LaW5kLkxpbmspIHtcbiAgICAgIGVsLmNyZWF0ZURpdih7IGNsczogJ3N1Z2dlc3Rpb24tdGl0bGUnLCB0ZXh0OiBzdWdnZXN0aW9uLmxpbmt0ZXh0IH0pO1xuICAgICAgaWYgKHN1Z2dlc3Rpb24ubGlua3RleHQgIT09IHN1Z2dlc3Rpb24uZmlsZS5wYXRoKSB7XG4gICAgICAgIGVsLmNyZWF0ZURpdih7IGNsczogJ3N1Z2dlc3Rpb24tbm90ZScsIHRleHQ6IHN1Z2dlc3Rpb24uZmlsZS5wYXRoIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVsLmFkZENsYXNzKCdtb2QtY29tcGxleCcpO1xuICAgIGVsLmNyZWF0ZURpdih7IGNsczogJ3N1Z2dlc3Rpb24tY29udGVudCcsIHRleHQ6IGAke1RBR19QUkVGSVh9JHtzdWdnZXN0aW9uLnRhZ31gIH0pO1xuICAgIGVsLmNyZWF0ZURpdih7IGNsczogJ3N1Z2dlc3Rpb24tYXV4JywgdGV4dDogU3RyaW5nKHN1Z2dlc3Rpb24uY291bnQpIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydHMgdGhlIHN1Z2dlc3Rpb24gaW4gcGxhY2Ugb2YgdGhlIHRyaWdnZXIsIG1vdmVzIHRoZSBjYXJldCBhZnRlciBpdCBhbmQgZGlzcGF0Y2hlcyBhbiBgaW5wdXRgIGV2ZW50LCBzbyBhXG4gICAqIGNvbXBvbmVudCBsaXN0ZW5pbmcgb24gdGhlIGVsZW1lbnQgc2VlcyB0aGUgY2hhbmdlLlxuICAgKlxuICAgKiBAcGFyYW0gc3VnZ2VzdGlvbiAtIFRoZSBzdWdnZXN0aW9uLlxuICAgKiBAcGFyYW0gJGV2ZW50IC0gVGhlIGV2ZW50IHRoYXQgc2VsZWN0ZWQgaXQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgc2VsZWN0U3VnZ2VzdGlvbihzdWdnZXN0aW9uOiBMaW5rQW5kVGFnU3VnZ2VzdGlvbiwgJGV2ZW50OiBLZXlib2FyZEV2ZW50IHwgTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRyaWdnZXIgPSB0aGlzLmdldFRyaWdnZXIoKTtcbiAgICBpZiAodHJpZ2dlcikge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICBsZXQgYWZ0ZXIgPSB2YWx1ZS5zbGljZSh0cmlnZ2VyLmVuZCk7XG4gICAgICBsZXQgaW5zZXJ0aW9uOiBzdHJpbmc7XG4gICAgICBpZiAoc3VnZ2VzdGlvbi5raW5kID09PSBMaW5rQW5kVGFnQ29tcGxldGlvbktpbmQuTGluaykge1xuICAgICAgICBpbnNlcnRpb24gPSBgJHtMSU5LX09QRU59JHtzdWdnZXN0aW9uLmxpbmt0ZXh0fSR7TElOS19DTE9TRX1gO1xuICAgICAgICBpZiAoYWZ0ZXIuc3RhcnRzV2l0aChMSU5LX0NMT1NFKSkge1xuICAgICAgICAgIGFmdGVyID0gYWZ0ZXIuc2xpY2UoTElOS19DTE9TRS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnNlcnRpb24gPSBgJHtUQUdfUFJFRklYfSR7c3VnZ2VzdGlvbi50YWd9IGA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0VmFsdWUodmFsdWUuc2xpY2UoMCwgdHJpZ2dlci5zdGFydCkgKyBpbnNlcnRpb24gKyBhZnRlcik7XG4gICAgICBjb25zdCBjYXJldCA9IHRyaWdnZXIuc3RhcnQgKyBpbnNlcnRpb24ubGVuZ3RoO1xuICAgICAgdGhpcy5pbnB1dEVsLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XG4gICAgICB0aGlzLmlucHV0RWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICB9XG5cbiAgICBzdXBlci5zZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb24sICRldmVudCk7XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgc2V0VmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXRFbC52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpbmsgc3VnZ2VzdGlvbnMgZm9yIGEgcXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSBxdWVyeSAtIFRoZSB0ZXh0IHR5cGVkIGFmdGVyIGBbW2AuXG4gICAqIEByZXR1cm5zIFRoZSBzdWdnZXN0aW9ucywgYmVzdCBtYXRjaCBmaXJzdC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRMaW5rU3VnZ2VzdGlvbnMocXVlcnk6IHN0cmluZyk6IExpbmtTdWdnZXN0aW9uW10ge1xuICAgIGNvbnN0IGZ1enp5U2VhcmNoID0gcHJlcGFyZUZ1enp5U2VhcmNoKHF1ZXJ5KTtcbiAgICBjb25zdCByZXN1bHRzOiBTdWdnZXN0aW9uU2VhcmNoUmVzdWx0PExpbmtTdWdnZXN0aW9uPltdID0gW107XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRoaXMuYXBwLnZhdWx0LmdldEZpbGVzKCkpIHtcbiAgICAgIGNvbnN0IGxpbmt0ZXh0ID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5maWxlVG9MaW5rdGV4dChmaWxlLCB0aGlzLnNvdXJjZVBhdGgsIHRydWUpO1xuICAgICAgY29uc3QgbWF0Y2ggPSBmdXp6eVNlYXJjaChsaW5rdGV4dCkgPz8gZnV6enlTZWFyY2goZmlsZS5wYXRoKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXN1bHRzLnB1c2goeyBtYXRjaCwgc3VnZ2VzdGlvbjogeyBmaWxlLCBraW5kOiBMaW5rQW5kVGFnQ29tcGxldGlvbktpbmQuTGluaywgbGlua3RleHQgfSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgc29ydFNlYXJjaFJlc3VsdHMocmVzdWx0cyk7XG4gICAgcmV0dXJuIHJlc3VsdHMubWFwKChyZXN1bHQpID0+IHJlc3VsdC5zdWdnZXN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzdWdnZXN0aW9ucyBmb3IgdGhlIHRyaWdnZXIgYmVmb3JlIHRoZSBjYXJldC4gVGhlIHF1ZXJ5IE9ic2lkaWFuIHBhc3NlcyBpcyB0aGUgd2hvbGUgdmFsdWUsIHNvIGl0IGlzXG4gICAqIGlnbm9yZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBzdWdnZXN0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRTdWdnZXN0aW9ucygpOiBMaW5rQW5kVGFnU3VnZ2VzdGlvbltdIHtcbiAgICBjb25zdCB0cmlnZ2VyID0gdGhpcy5nZXRUcmlnZ2VyKCk7XG4gICAgaWYgKHRyaWdnZXI/LmtpbmQgPT09IExpbmtBbmRUYWdDb21wbGV0aW9uS2luZC5MaW5rKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRMaW5rU3VnZ2VzdGlvbnModHJpZ2dlci5xdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyPy5raW5kID09PSBMaW5rQW5kVGFnQ29tcGxldGlvbktpbmQuVGFnID8gdGhpcy5nZXRUYWdTdWdnZXN0aW9ucyh0cmlnZ2VyLnF1ZXJ5KSA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRhZyBzdWdnZXN0aW9ucyBmb3IgYSBxdWVyeSwgZnJvbSB0aGUgdGFncyBvZiBldmVyeSBub3RlLlxuICAgKlxuICAgKiBAcGFyYW0gcXVlcnkgLSBUaGUgdGV4dCB0eXBlZCBhZnRlciBgI2AuXG4gICAqIEByZXR1cm5zIFRoZSBzdWdnZXN0aW9ucywgYmVzdCBtYXRjaCBmaXJzdCwgdGhlbiB0aGUgbW9zdCB1c2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFRhZ1N1Z2dlc3Rpb25zKHF1ZXJ5OiBzdHJpbmcpOiBUYWdTdWdnZXN0aW9uW10ge1xuICAgIHJldHVybiBnZXRWYXVsdFRhZ1N1Z2dlc3Rpb25zKHsgYXBwOiB0aGlzLmFwcCwgcXVlcnkgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZW5hYmxlZCB0cmlnZ2VyIGJlZm9yZSB0aGUgY2FyZXQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB0cmlnZ2VyLCBvciBgbnVsbGAuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0VHJpZ2dlcigpOiBMaW5rQW5kVGFnQ29tcGxldGlvblRyaWdnZXIgfCBudWxsIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCB0cmlnZ2VyID0gZ2V0TGlua0FuZFRhZ0NvbXBsZXRpb25UcmlnZ2VyKHZhbHVlLCB0aGlzLmlucHV0RWwuc2VsZWN0aW9uU3RhcnQgPz8gdmFsdWUubGVuZ3RoKTtcbiAgICBpZiAodHJpZ2dlcj8ua2luZCA9PT0gTGlua0FuZFRhZ0NvbXBsZXRpb25LaW5kLkxpbmsgJiYgIXRoaXMuc2hvdWxkU3VnZ2VzdExpbmtzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXI/LmtpbmQgPT09IExpbmtBbmRUYWdDb21wbGV0aW9uS2luZC5UYWcgJiYgIXRoaXMuc2hvdWxkU3VnZ2VzdFRhZ3MgPyBudWxsIDogdHJpZ2dlcjtcbiAgfVxufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBgW1tgIGxpbmsgb3IgYCNgIHRhZyBiZWluZyB0eXBlZCBiZWZvcmUgdGhlIGNhcmV0LlxuICpcbiAqIEEgbGluayB0cmlnZ2VyIGlzIGFuIHVuY2xvc2VkIGBbW2Agb24gdGhlIGNhcmV0J3MgbGluZSB3aXRoIG5vIGB8YCBhZnRlciBpdCwgc28gYW4gYWxpYXMgYmVpbmcgdHlwZWQgaXMgbGVmdCBhbG9uZS4gQVxuICogdGFnIHRyaWdnZXIgaXMgYSBgI2AgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IG9yIGFmdGVyIHdoaXRlc3BhY2UsIGZvbGxvd2VkIG9ubHkgYnkgdGFnIGNoYXJhY3RlcnMuXG4gKlxuICogQHBhcmFtIHRleHQgLSBUaGUgdGV4dCBvZiB0aGUgZWxlbWVudC5cbiAqIEBwYXJhbSBjYXJldCAtIFRoZSBvZmZzZXQgb2YgdGhlIGNhcmV0LlxuICogQHJldHVybnMgVGhlIHRyaWdnZXIsIG9yIGBudWxsYCB3aGVuIHRoZSBjYXJldCBpcyBub3QgaW4gb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlua0FuZFRhZ0NvbXBsZXRpb25UcmlnZ2VyKHRleHQ6IHN0cmluZywgY2FyZXQ6IG51bWJlcik6IExpbmtBbmRUYWdDb21wbGV0aW9uVHJpZ2dlciB8IG51bGwge1xuICBjb25zdCBiZWZvcmVDYXJldCA9IHRleHQuc2xpY2UoMCwgY2FyZXQpO1xuICBjb25zdCBsaW5rU3RhcnQgPSBiZWZvcmVDYXJldC5sYXN0SW5kZXhPZihMSU5LX09QRU4pO1xuICBpZiAobGlua1N0YXJ0ICE9PSAtMSkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gYmVmb3JlQ2FyZXQuc2xpY2UobGlua1N0YXJ0ICsgTElOS19PUEVOLmxlbmd0aCk7XG4gICAgaWYgKCFxdWVyeS5pbmNsdWRlcyhMSU5LX0NMT1NFKSAmJiAhcXVlcnkuaW5jbHVkZXMoJ1xcbicpICYmICFxdWVyeS5pbmNsdWRlcygnfCcpKSB7XG4gICAgICByZXR1cm4geyBlbmQ6IGNhcmV0LCBraW5kOiBMaW5rQW5kVGFnQ29tcGxldGlvbktpbmQuTGluaywgcXVlcnksIHN0YXJ0OiBsaW5rU3RhcnQgfTtcbiAgICB9XG4gIH1cblxuICBpZiAoVEFHX0JFRk9SRV9DQVJFVF9SRUdfRVhQLnRlc3QoYmVmb3JlQ2FyZXQpKSB7XG4gICAgLy8gVGhlIHF1ZXJ5IGhvbGRzIG5vICMsIHNvIHRoZSBsYXN0IG9uZSBpcyB0aGUgdHJpZ2dlci5cbiAgICBjb25zdCBzdGFydCA9IGJlZm9yZUNhcmV0Lmxhc3RJbmRleE9mKFRBR19QUkVGSVgpO1xuICAgIHJldHVybiB7IGVuZDogY2FyZXQsIGtpbmQ6IExpbmtBbmRUYWdDb21wbGV0aW9uS2luZC5UYWcsIHF1ZXJ5OiBiZWZvcmVDYXJldC5zbGljZShzdGFydCArIFRBR19QUkVGSVgubGVuZ3RoKSwgc3RhcnQgfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHRhZ3Mgb2YgZXZlcnkgbm90ZSBtYXRjaGluZyBhIHF1ZXJ5LCBhcyB7QGxpbmsgTGlua0FuZFRhZ0lucHV0U3VnZ2VzdH0gYW5kIHtAbGluayBUYWdMaXN0Q29tcG9uZW50fVxuICogc3VnZ2VzdCB0aGVtLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBzdWdnZXN0aW9ucywgYmVzdCBtYXRjaCBmaXJzdCwgdGhlbiB0aGUgbW9zdCB1c2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmF1bHRUYWdTdWdnZXN0aW9ucyhwYXJhbXM6IEdldFZhdWx0VGFnU3VnZ2VzdGlvbnNQYXJhbXMpOiBUYWdTdWdnZXN0aW9uW10ge1xuICBjb25zdCB7IGFwcCwgcXVlcnkgfSA9IHBhcmFtcztcbiAgY29uc3QgY291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGFwcC52YXVsdC5nZXRNYXJrZG93bkZpbGVzKCkpIHtcbiAgICBjb25zdCBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiAoY2FjaGUgPyBnZXRBbGxUYWdzKGNhY2hlKSA6IG51bGwpID8/IFtdKSB7XG4gICAgICBjb25zdCBuYW1lID0gdGFnLnNsaWNlKFRBR19QUkVGSVgubGVuZ3RoKTtcbiAgICAgIGNvdW50cy5zZXQobmFtZSwgKGNvdW50cy5nZXQobmFtZSkgPz8gMCkgKyAxKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBmdXp6eVNlYXJjaCA9IHByZXBhcmVGdXp6eVNlYXJjaChxdWVyeSk7XG4gIGNvbnN0IHJlc3VsdHM6IFN1Z2dlc3Rpb25TZWFyY2hSZXN1bHQ8VGFnU3VnZ2VzdGlvbj5bXSA9IFtdO1xuICBjb25zdCBzb3J0ZWRDb3VudHMgPSBbLi4uY291bnRzXS5zb3J0KChbdGFnMSwgY291bnQxXSwgW3RhZzIsIGNvdW50Ml0pID0+IGNvdW50MiAtIGNvdW50MSB8fCB0YWcxLmxvY2FsZUNvbXBhcmUodGFnMikpO1xuICBmb3IgKGNvbnN0IFt0YWcsIGNvdW50XSBvZiBzb3J0ZWRDb3VudHMpIHtcbiAgICBjb25zdCBtYXRjaCA9IGZ1enp5U2VhcmNoKHRhZyk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXN1bHRzLnB1c2goeyBtYXRjaCwgc3VnZ2VzdGlvbjogeyBjb3VudCwga2luZDogTGlua0FuZFRhZ0NvbXBsZXRpb25LaW5kLlRhZywgdGFnIH0gfSk7XG4gICAgfVxuICB9XG4gIHNvcnRTZWFyY2hSZXN1bHRzKHJlc3VsdHMpO1xuICByZXR1cm4gcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gcmVzdWx0LnN1Z2dlc3Rpb24pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVlBLFNBQVMsY0FBYztBQUN2QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBUUEsSUFBSywyQkFBTCxrQkFBS0EsOEJBQUw7QUFJTCxFQUFBQSwwQkFBQSxVQUFPO0FBS1AsRUFBQUEsMEJBQUEsU0FBTTtBQVRJLFNBQUFBO0FBQUEsR0FBQTtBQXFIWixNQUFNLFlBQVk7QUFDbEIsTUFBTSxhQUFhO0FBQ25CLE1BQU0sYUFBYTtBQUNuQixNQUFNLDJCQUEyQjtBQThCMUIsTUFBTSwrQkFBK0IscUJBQTJDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPWixZ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
|
|
@@ -83,10 +83,23 @@ export interface ReplaceCodeBlockParams extends GetCodeBlockMarkdownInfoParams {
|
|
|
83
83
|
* Provides a new code block.
|
|
84
84
|
*/
|
|
85
85
|
readonly codeBlockProvider: ValueProvider<string, ContentArguments>;
|
|
86
|
+
/**
|
|
87
|
+
* A state passed to the next render of the code block, which gets it from {@link claimCodeBlockRenderHandoff}.
|
|
88
|
+
*
|
|
89
|
+
* @default `undefined`
|
|
90
|
+
*/
|
|
91
|
+
readonly nextRenderState?: unknown;
|
|
86
92
|
/**
|
|
87
93
|
* The resource-lock component used to lock the note while it is being modified.
|
|
88
94
|
*/
|
|
89
95
|
readonly resourceLockComponent: null | ResourceLockComponent;
|
|
96
|
+
/**
|
|
97
|
+
* Whether the next render of the code block may put the focus back where it is now inside {@link el}, through
|
|
98
|
+
* {@link claimCodeBlockRenderHandoff}.
|
|
99
|
+
*
|
|
100
|
+
* @default `false`
|
|
101
|
+
*/
|
|
102
|
+
readonly shouldCarryFocusToNextRender?: boolean;
|
|
90
103
|
/**
|
|
91
104
|
* Whether to keep the gap when the new code block is empty.
|
|
92
105
|
*
|
|
@@ -133,6 +146,11 @@ export declare function removeCodeBlock(params: RemoveCodeBlockParams): Promise<
|
|
|
133
146
|
/**
|
|
134
147
|
* Replaces the code block.
|
|
135
148
|
*
|
|
149
|
+
* Obsidian renders the block again from its new source. To keep the focus or plugin state across that render, pass
|
|
150
|
+
* {@link ReplaceCodeBlockParams.shouldCarryFocusToNextRender} or {@link ReplaceCodeBlockParams.nextRenderState}, and
|
|
151
|
+
* call {@link claimCodeBlockRenderHandoff} from the processor. When the note is open in an editor, Obsidian applies
|
|
152
|
+
* the write as one change the user can undo.
|
|
153
|
+
*
|
|
136
154
|
* @param params - The parameters for the function.
|
|
137
155
|
*/
|
|
138
156
|
export declare function replaceCodeBlock(params: ReplaceCodeBlockParams): Promise<void>;
|
|
@@ -49,6 +49,10 @@ import { resolveValue } from "@mnaoumov/typescript-lib/value-provider";
|
|
|
49
49
|
import { ViewType } from "@obsidian-typings/obsidian-public-latest/implementations";
|
|
50
50
|
import { MarkdownView } from "obsidian";
|
|
51
51
|
import { createCodeBlockRegExp } from "./code-block-reg-exp.mjs";
|
|
52
|
+
import {
|
|
53
|
+
captureCodeBlockFocus,
|
|
54
|
+
recordCodeBlockRenderHandoff
|
|
55
|
+
} from "./code-block-render-handoff.mjs";
|
|
52
56
|
import { getFileOrNull } from "./file-system.mjs";
|
|
53
57
|
import {
|
|
54
58
|
invokeWithFileSystemLock,
|
|
@@ -121,6 +125,9 @@ async function removeCodeBlock(params) {
|
|
|
121
125
|
async function replaceCodeBlock(params) {
|
|
122
126
|
const { app, codeBlockProvider, context } = params;
|
|
123
127
|
params.abortSignal?.throwIfAborted();
|
|
128
|
+
const shouldRecordHandoff = params.shouldCarryFocusToNextRender === true || params.nextRenderState !== void 0;
|
|
129
|
+
const focus = params.shouldCarryFocusToNextRender ? captureCodeBlockFocus(params.el) : null;
|
|
130
|
+
let isHandoffRecorded = false;
|
|
124
131
|
await process({
|
|
125
132
|
app,
|
|
126
133
|
async newContentProvider({ abortSignal, content }) {
|
|
@@ -150,6 +157,14 @@ async function replaceCodeBlock(params) {
|
|
|
150
157
|
}
|
|
151
158
|
const textBeforeCodeBlock = content.slice(0, markdownInfo.positionInNote.start.offset);
|
|
152
159
|
const textAfterCodeBlock = content.slice(markdownInfo.positionInNote.end.offset);
|
|
160
|
+
if (shouldRecordHandoff && !isHandoffRecorded && newCodeBlock) {
|
|
161
|
+
isHandoffRecorded = recordCodeBlockRenderHandoff({
|
|
162
|
+
focus,
|
|
163
|
+
newCodeBlock,
|
|
164
|
+
sourcePath: context.sourcePath,
|
|
165
|
+
state: params.nextRenderState
|
|
166
|
+
});
|
|
167
|
+
}
|
|
153
168
|
if (newCodeBlock || params.shouldKeepGapWhenEmpty) {
|
|
154
169
|
return `${textBeforeCodeBlock}${newCodeBlock}${textAfterCodeBlock}`;
|
|
155
170
|
}
|
|
@@ -344,4 +359,4 @@ export {
|
|
|
344
359
|
removeCodeBlock,
|
|
345
360
|
replaceCodeBlock
|
|
346
361
|
};
|
|
347
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYXJrZG93bi1jb2RlLWJsb2NrLXByb2Nlc3Nvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgY29kZSBibG9ja3MgaW4gT2JzaWRpYW4uXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cblxuaW1wb3J0IHR5cGUgeyBWYWx1ZVByb3ZpZGVyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3ZhbHVlLXByb3ZpZGVyJztcbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LFxuICBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbixcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBhYm9ydFNpZ25hbEFueSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hYm9ydC1jb250cm9sbGVyJztcbmltcG9ydCB7IHJlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHtcbiAgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCxcbiAgZ2V0T3B0aW9uYWxOYW1lZEdyb3VwXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7XG4gIGVuc3VyZUxmRW5kaW5ncyxcbiAgZ2V0TGZOb3JtYWxpemVkT2Zmc2V0VG9PcmlnaW5hbE9mZnNldE1hcHBlcixcbiAgaGFzU2luZ2xlT2NjdXJyZW5jZSxcbiAgaW5kZW50LFxuICB1bmluZGVudFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RyaW5nJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi92YWx1ZS1wcm92aWRlcic7XG5pbXBvcnQgeyBWaWV3VHlwZSB9IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7IE1hcmtkb3duVmlldyB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBDb2RlQmxvY2tNYXJrZG93bkluZm9ybWF0aW9uIH0gZnJvbSAnLi9jb2RlLWJsb2NrLW1hcmtkb3duLWluZm9ybWF0aW9uLnRzJztcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VMb2NrQ29tcG9uZW50IH0gZnJvbSAnLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB0eXBlIHsgQ29udGVudEFyZ3VtZW50cyB9IGZyb20gJy4vdmF1bHQudHMnO1xuXG5pbXBvcnQgeyBjcmVhdGVDb2RlQmxvY2tSZWdFeHAgfSBmcm9tICcuL2NvZGUtYmxvY2stcmVnLWV4cC50cyc7XG5pbXBvcnQgeyBnZXRGaWxlT3JOdWxsIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBpbnZva2VXaXRoRmlsZVN5c3RlbUxvY2ssXG4gIHByb2Nlc3MsXG4gIHNhdmVOb3RlXG59IGZyb20gJy4vdmF1bHQudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZXRDb2RlQmxvY2tNYXJrZG93bkluZm99LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldENvZGVCbG9ja01hcmtkb3duSW5mb1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSB7QGxpbmsgTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dH0gb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dDogTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dDtcblxuICAvKipcbiAgICogQSB7QGxpbmsgSFRNTEVsZW1lbnR9IHJlcHJlc2VudGluZyB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIHJlYWRvbmx5IGVsOiBIVE1MRWxlbWVudDtcblxuICAvKipcbiAgICogQSBzb3VyY2Ugb2YgdGhlIGNvZGUgYmxvY2suXG4gICAqL1xuICByZWFkb25seSBzb3VyY2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgaW5zZXJ0QWZ0ZXJDb2RlQmxvY2t9IC8ge0BsaW5rIGluc2VydEJlZm9yZUNvZGVCbG9ja30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0Q29kZUJsb2NrUGFyYW1zIGV4dGVuZHMgR2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgbnVtYmVyIG9mIGxpbmVzIHRvIG9mZnNldCB0aGUgaW5zZXJ0aW9uIGJ5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMGBcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVPZmZzZXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZS1sb2NrIGNvbXBvbmVudCB1c2VkIHRvIGxvY2sgdGhlIG5vdGUgd2hpbGUgaXQgaXMgYmVpbmcgbW9kaWZpZWQuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJlc2VydmUgdGhlIGxpbmUgcHJlZml4IG9mIHRoZSBjb2RlIGJsb2NrLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXg/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHRleHQgdG8gaW5zZXJ0IGFmdGVyIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayByZW1vdmVDb2RlQmxvY2t9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZUNvZGVCbG9ja1BhcmFtcyBleHRlbmRzIEdldENvZGVCbG9ja01hcmtkb3duSW5mb1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UtbG9jayBjb21wb25lbnQgdXNlZCB0byBsb2NrIHRoZSBub3RlIHdoaWxlIGl0IGlzIGJlaW5nIG1vZGlmaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGtlZXAgdGhlIGdhcCBhZnRlciByZW1vdmluZyB0aGUgY29kZSBibG9jay5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkS2VlcEdhcD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJlcGxhY2VDb2RlQmxvY2t9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcGxhY2VDb2RlQmxvY2tQYXJhbXMgZXh0ZW5kcyBHZXRDb2RlQmxvY2tNYXJrZG93bkluZm9QYXJhbXMge1xuICAvKipcbiAgICogQW4gYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhIG5ldyBjb2RlIGJsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgY29kZUJsb2NrUHJvdmlkZXI6IFZhbHVlUHJvdmlkZXI8c3RyaW5nLCBDb250ZW50QXJndW1lbnRzPjtcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlLWxvY2sgY29tcG9uZW50IHVzZWQgdG8gbG9jayB0aGUgbm90ZSB3aGlsZSBpdCBpcyBiZWluZyBtb2RpZmllZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBrZWVwIHRoZSBnYXAgd2hlbiB0aGUgbmV3IGNvZGUgYmxvY2sgaXMgZW1wdHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEtlZXBHYXBXaGVuRW1wdHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXNlcnZlIHRoZSBsaW5lIHByZWZpeCBvZiB0aGUgY29kZSBibG9jay5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4PzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIENyZWF0ZU1hcmtkb3duSW5mb0Zyb21NYXRjaFBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcHJveGltYXRlU2VjdGlvbkluZm86IE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uO1xuICByZWFkb25seSBsaW5lc0JlZm9yZVNlY3Rpb25Db3VudDogbnVtYmVyO1xuICByZWFkb25seSBtYXRjaDogUmVnRXhwTWF0Y2hBcnJheTtcbiAgcmVhZG9ubHkgbm90ZUNvbnRlbnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcG90ZW50aWFsQ29kZUJsb2NrVGV4dDogc3RyaW5nO1xuICByZWFkb25seSBzb3VyY2VMaW5lc0NvdW50OiBudW1iZXI7XG4gIHJlYWRvbmx5IHRleHRMaW5lT2Zmc2V0czogUmVhZG9ubHlNYXA8bnVtYmVyLCBudW1iZXI+O1xufVxuXG5pbnRlcmZhY2UgRmluZENvZGVCbG9ja01hcmtkb3duSW5mb1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCB0aGUgY29kZSBibG9jayB3YXMgcmVuZGVyZWQgaW50by5cbiAgICovXG4gIHJlYWRvbmx5IGVsOiBIVE1MRWxlbWVudDtcblxuICAvKipcbiAgICogVGhlIG5vdGUgdGV4dCB0byBsb2NhdGUgdGhlIGNvZGUgYmxvY2sgaW4uXG4gICAqL1xuICByZWFkb25seSBub3RlQ29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIG9mIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJbnNlcnRUZXh0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IHRvIGluc2VydCB0aGUgdGV4dCBpbnRvLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSBpbmRleCB0byBpbnNlcnQgdGhlIHRleHQgYXQuXG4gICAqL1xuICByZWFkb25seSBpbnNlcnRMaW5lSW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwcmVzZXJ2ZSB0aGUgbGluZSBwcmVmaXggb2YgdGhlIGxpbmUgYXQgdGhlIGluc2VydGlvbiBwb2ludC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHRleHQgdG8gaW5zZXJ0LlxuICAgKi9cbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSXNTdWl0YWJsZUNvZGVCbG9ja1BhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjb2RlIGJsb2NrIGlzIGluc2lkZSBhIGNhbGxvdXQuXG4gICAqL1xuICByZWFkb25seSBpc0luQ2FsbG91dDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGxhbmd1YWdlIHRoZSBjb2RlIGJsb2NrIGlzIGV4cGVjdGVkIHRvIGhhdmUuXG4gICAqL1xuICByZWFkb25seSBsYW5ndWFnZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVndWxhciBleHByZXNzaW9uIG1hdGNoIG9mIHRoZSBjb2RlIGJsb2NrIGNhbmRpZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5O1xuXG4gIC8qKlxuICAgKiBUaGUgTEYtbm9ybWFsaXplZCBzb3VyY2Ugb2YgdGhlIGNvZGUgYmxvY2suXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VMZjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgY29kZSBibG9jayBpbiBhIE1hcmtkb3duIHNlY3Rpb24uXG4gKlxuICogVGhpcyBpcyBhIHB1cmUgcmVhZCwgc2FmZSB0byBjYWxsIHdoaWxlIGEgY29kZSBibG9jayByZW5kZXJzLiBJdCBsb2NhdGVzIHRoZSBibG9jayBpbiB0aGUgdGV4dCB0aGVcbiAqIHVzZXIgc2VlczogdGhlIHZpZXcgZGF0YSBvZiBhbiBvcGVuIG1hcmtkb3duIHZpZXcgb2YgdGhlIHNvdXJjZSBub3RlIHdoZW4gdGhlcmUgaXMgb25lLCBiZWNhdXNlXG4gKiBhbiB1bnNhdmVkIGVkaXQgdGhlcmUgaXMgd2hhdCB0aGUgYmxvY2sgd2FzIHJlbmRlcmVkIGZyb20sIGFuZCB0aGUgZmlsZSdzIGNvbnRlbnQgb3RoZXJ3aXNlLiBJdFxuICogbmV2ZXIgc2F2ZXMgdGhlIG5vdGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvZGUgYmxvY2sgaW4gdGhlIE1hcmtkb3duIHNlY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDb2RlQmxvY2tNYXJrZG93bkluZm8ocGFyYW1zOiBHZXRDb2RlQmxvY2tNYXJrZG93bkluZm9QYXJhbXMpOiBQcm9taXNlPENvZGVCbG9ja01hcmtkb3duSW5mb3JtYXRpb24gfCBudWxsPiB7XG4gIGNvbnN0IHsgYXBwLCBjb250ZXh0LCBlbCwgc291cmNlIH0gPSBwYXJhbXM7XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGU6IGNvbnRleHQuc291cmNlUGF0aCB9KTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUoc291cmNlRmlsZSwgYFNvdXJjZSBmaWxlICR7Y29udGV4dC5zb3VyY2VQYXRofSBub3QgZm91bmQuYCk7XG5cbiAgYXdhaXQgcmVxdWVzdEFuaW1hdGlvbkZyYW1lQXN5bmMoKTtcblxuICBjb25zdCBub3RlQ29udGVudCA9IGdldE9wZW5NYXJrZG93blZpZXdEYXRhKGFwcCwgc291cmNlRmlsZSkgPz8gYXdhaXQgYXBwLnZhdWx0LnJlYWQoc291cmNlRmlsZSk7XG4gIHJldHVybiBmaW5kQ29kZUJsb2NrTWFya2Rvd25JbmZvKHsgZWwsIG5vdGVDb250ZW50LCBzb3VyY2UgfSk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyB0ZXh0IGFmdGVyIHRoZSBjb2RlIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoIC0tIEludGVudGlvbmFsbHkgc2hhcmVzIEluc2VydENvZGVCbG9ja1BhcmFtcyB3aXRoIGluc2VydEJlZm9yZUNvZGVCbG9jay5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnNlcnRBZnRlckNvZGVCbG9jayhwYXJhbXM6IEluc2VydENvZGVCbG9ja1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFwcCwgY29udGV4dCwgbGluZU9mZnNldCA9IDAsIHRleHQgfSA9IHBhcmFtcztcblxuICBhd2FpdCBwcm9jZXNzKHtcbiAgICBhcHAsXG4gICAgYXN5bmMgbmV3Q29udGVudFByb3ZpZGVyKHsgY29udGVudCB9KSB7XG4gICAgICBjb25zdCBtYXJrZG93bkluZm8gPSBhd2FpdCBnZXRDb2RlQmxvY2tNYXJrZG93bkluZm9BZnRlclNhdmUocGFyYW1zKTtcbiAgICAgIGFzc2VydE5vbk51bGxhYmxlKG1hcmtkb3duSW5mbywgJ0NvdWxkIG5vdCB1bmlxdWVseSBpZGVudGlmeSB0aGUgY29kZSBibG9jay4nKTtcblxuICAgICAgaWYgKGNvbnRlbnQgIT09IG1hcmtkb3duSW5mby5ub3RlQ29udGVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5zZXJ0TGluZUluZGV4ID0gbWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLmVuZC5saW5lICsgbGluZU9mZnNldCArIDE7XG4gICAgICByZXR1cm4gaW5zZXJ0VGV4dChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8SW5zZXJ0VGV4dFBhcmFtcz4oe1xuICAgICAgICBjb250ZW50LFxuICAgICAgICBpbnNlcnRMaW5lSW5kZXgsXG4gICAgICAgIHNob3VsZFByZXNlcnZlTGluZVByZWZpeDogcGFyYW1zLnNob3VsZFByZXNlcnZlTGluZVByZWZpeCxcbiAgICAgICAgdGV4dFxuICAgICAgfSkpO1xuICAgIH0sXG4gICAgcGF0aE9yRmlsZTogY29udGV4dC5zb3VyY2VQYXRoLFxuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogbnVsbCxcbiAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHBhcmFtcy5yZXNvdXJjZUxvY2tDb21wb25lbnRcbiAgfSk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyB0ZXh0IGJlZm9yZSB0aGUgY29kZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBJbnRlbnRpb25hbGx5IHNoYXJlcyBJbnNlcnRDb2RlQmxvY2tQYXJhbXMgd2l0aCBpbnNlcnRBZnRlckNvZGVCbG9jay5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnNlcnRCZWZvcmVDb2RlQmxvY2socGFyYW1zOiBJbnNlcnRDb2RlQmxvY2tQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhcHAsIGNvbnRleHQsIGxpbmVPZmZzZXQgPSAwLCB0ZXh0IH0gPSBwYXJhbXM7XG5cbiAgYXdhaXQgcHJvY2Vzcyh7XG4gICAgYXBwLFxuICAgIGFzeW5jIG5ld0NvbnRlbnRQcm92aWRlcih7IGNvbnRlbnQgfSkge1xuICAgICAgY29uc3QgbWFya2Rvd25JbmZvID0gYXdhaXQgZ2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvQWZ0ZXJTYXZlKHBhcmFtcyk7XG4gICAgICBpZiAoIW1hcmtkb3duSW5mbykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCB1bmlxdWVseSBpZGVudGlmeSB0aGUgY29kZSBibG9jay4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRlbnQgIT09IG1hcmtkb3duSW5mby5ub3RlQ29udGVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5zZXJ0TGluZUluZGV4ID0gbWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLnN0YXJ0LmxpbmUgLSBsaW5lT2Zmc2V0O1xuICAgICAgcmV0dXJuIGluc2VydFRleHQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEluc2VydFRleHRQYXJhbXM+KHtcbiAgICAgICAgY29udGVudCxcbiAgICAgICAgaW5zZXJ0TGluZUluZGV4LFxuICAgICAgICBzaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXg6IHBhcmFtcy5zaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXgsXG4gICAgICAgIHRleHRcbiAgICAgIH0pKTtcbiAgICB9LFxuICAgIHBhdGhPckZpbGU6IGNvbnRleHQuc291cmNlUGF0aCxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IG51bGwsXG4gICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBwYXJhbXMucmVzb3VyY2VMb2NrQ29tcG9uZW50XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGNvZGUgYmxvY2suXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVDb2RlQmxvY2socGFyYW1zOiBSZW1vdmVDb2RlQmxvY2tQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVwbGFjZUNvZGVCbG9jayh7XG4gICAgLi4ucGFyYW1zLFxuICAgIGNvZGVCbG9ja1Byb3ZpZGVyOiAnJyxcbiAgICBzaG91bGRLZWVwR2FwV2hlbkVtcHR5OiBwYXJhbXMuc2hvdWxkS2VlcEdhcCA/PyBmYWxzZVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyB0aGUgY29kZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VDb2RlQmxvY2socGFyYW1zOiBSZXBsYWNlQ29kZUJsb2NrUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgYXBwLCBjb2RlQmxvY2tQcm92aWRlciwgY29udGV4dCB9ID0gcGFyYW1zO1xuICBwYXJhbXMuYWJvcnRTaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG5cbiAgYXdhaXQgcHJvY2Vzcyh7XG4gICAgYXBwLFxuICAgIGFzeW5jIG5ld0NvbnRlbnRQcm92aWRlcih7IGFib3J0U2lnbmFsLCBjb250ZW50IH0pIHtcbiAgICAgIGFib3J0U2lnbmFsID0gYWJvcnRTaWduYWxBbnkoYWJvcnRTaWduYWwsIHBhcmFtcy5hYm9ydFNpZ25hbCk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgbWFya2Rvd25JbmZvID0gYXdhaXQgZ2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvQWZ0ZXJTYXZlKHBhcmFtcyk7XG4gICAgICBpZiAoIW1hcmtkb3duSW5mbykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCB1bmlxdWVseSBpZGVudGlmeSB0aGUgY29kZSBibG9jay4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRlbnQgIT09IG1hcmtkb3duSW5mby5ub3RlQ29udGVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbGV0IG9sZENvZGVCbG9jayA9IGNvbnRlbnQuc2xpY2UobWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLnN0YXJ0Lm9mZnNldCwgbWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLmVuZC5vZmZzZXQpO1xuICAgICAgaWYgKHBhcmFtcy5zaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXgpIHtcbiAgICAgICAgb2xkQ29kZUJsb2NrID0gdW5pbmRlbnQoe1xuICAgICAgICAgIHByZWZpeDogbWFya2Rvd25JbmZvLmxpbmVQcmVmaXgsXG4gICAgICAgICAgdGV4dDogb2xkQ29kZUJsb2NrXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBsZXQgbmV3Q29kZUJsb2NrID0gYXdhaXQgcmVzb2x2ZVZhbHVlKGNvZGVCbG9ja1Byb3ZpZGVyLCB7IGFib3J0U2lnbmFsLCBjb250ZW50OiBvbGRDb2RlQmxvY2sgfSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgaWYgKChuZXdDb2RlQmxvY2sgfHwgcGFyYW1zLnNob3VsZEtlZXBHYXBXaGVuRW1wdHkpICYmIHBhcmFtcy5zaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXgpIHtcbiAgICAgICAgbmV3Q29kZUJsb2NrID0gaW5kZW50KHtcbiAgICAgICAgICBwcmVmaXg6IG1hcmtkb3duSW5mby5saW5lUHJlZml4LFxuICAgICAgICAgIHRleHQ6IG5ld0NvZGVCbG9ja1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGV4dEJlZm9yZUNvZGVCbG9jayA9IGNvbnRlbnQuc2xpY2UoMCwgbWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLnN0YXJ0Lm9mZnNldCk7XG4gICAgICBjb25zdCB0ZXh0QWZ0ZXJDb2RlQmxvY2sgPSBjb250ZW50LnNsaWNlKG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5lbmQub2Zmc2V0KTtcblxuICAgICAgaWYgKG5ld0NvZGVCbG9jayB8fCBwYXJhbXMuc2hvdWxkS2VlcEdhcFdoZW5FbXB0eSkge1xuICAgICAgICByZXR1cm4gYCR7dGV4dEJlZm9yZUNvZGVCbG9ja30ke25ld0NvZGVCbG9ja30ke3RleHRBZnRlckNvZGVCbG9ja31gO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRleHRCZWZvcmVDb2RlQmxvY2sgJiYgIXRleHRBZnRlckNvZGVCbG9jaykge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ZXh0QmVmb3JlQ29kZUJsb2NrID8gYCR7dGV4dEJlZm9yZUNvZGVCbG9jay5zbGljZSgwLCAtMSl9JHt0ZXh0QWZ0ZXJDb2RlQmxvY2t9YCA6IGAke3RleHRCZWZvcmVDb2RlQmxvY2t9JHt0ZXh0QWZ0ZXJDb2RlQmxvY2suc2xpY2UoMSl9YDtcbiAgICB9LFxuICAgIHBhdGhPckZpbGU6IGNvbnRleHQuc291cmNlUGF0aCxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IG51bGwsXG4gICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBwYXJhbXMucmVzb3VyY2VMb2NrQ29tcG9uZW50XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVNYXJrZG93bkluZm9Gcm9tTWF0Y2gocGFyYW1zOiBDcmVhdGVNYXJrZG93bkluZm9Gcm9tTWF0Y2hQYXJhbXMpOiBDb2RlQmxvY2tNYXJrZG93bkluZm9ybWF0aW9uIHtcbiAgY29uc3Qge1xuICAgIGFwcHJveGltYXRlU2VjdGlvbkluZm8sXG4gICAgbGluZXNCZWZvcmVTZWN0aW9uQ291bnQsXG4gICAgbWF0Y2gsXG4gICAgbm90ZUNvbnRlbnQsXG4gICAgcG90ZW50aWFsQ29kZUJsb2NrVGV4dCxcbiAgICBzb3VyY2VMaW5lc0NvdW50LFxuICAgIHRleHRMaW5lT2Zmc2V0c1xuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGxpbmVQcmVmaXggPSBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnTGluZVByZWZpeCcpO1xuICBjb25zdCBjb2RlQmxvY2tTdGFydERlbGltaXRlciA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdDb2RlQmxvY2tTdGFydERlbGltaXRlcicpO1xuICBjb25zdCBjb2RlQmxvY2tFbmREZWxpbWl0ZXIgPSBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnQ29kZUJsb2NrRW5kRGVsaW1pdGVyJyk7XG4gIGNvbnN0IGNvZGVCbG9ja0FyZ3VtZW50c1N0cmluZyA9IGdldE9wdGlvbmFsTmFtZWRHcm91cChtYXRjaCwgJ0NvZGVCbG9ja0FyZ3MnKSA/PyAnJztcbiAgY29uc3QgbGFuZ3VhZ2UgPSBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnQ29kZUJsb2NrTGFuZ3VhZ2UnKTtcblxuICBjb25zdCBwcmV2aW91c1RleHQgPSBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0LnNsaWNlKDAsIG1hdGNoLmluZGV4KTtcbiAgY29uc3QgcHJldmlvdXNUZXh0TGluZXNDb3VudCA9IHByZXZpb3VzVGV4dC5zcGxpdCgnXFxuJykubGVuZ3RoIC0gMTtcblxuICBjb25zdCBzdGFydExpbmUgPSBsaW5lc0JlZm9yZVNlY3Rpb25Db3VudCArIHByZXZpb3VzVGV4dExpbmVzQ291bnQ7XG4gIGNvbnN0IGVuZExpbmUgPSBzdGFydExpbmUgKyBzb3VyY2VMaW5lc0NvdW50ICsgMTtcblxuICByZXR1cm4ge1xuICAgICRhcmd1bWVudHM6IGNvZGVCbG9ja0FyZ3VtZW50c1N0cmluZy5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKSxcbiAgICBlbmREZWxpbWl0ZXI6IGNvZGVCbG9ja0VuZERlbGltaXRlcixcbiAgICBsYW5ndWFnZSxcbiAgICBsaW5lUHJlZml4LFxuICAgIG5vdGVDb250ZW50LFxuICAgIHBvc2l0aW9uSW5Ob3RlOiB7XG4gICAgICBlbmQ6IHtcbiAgICAgICAgY29sOiAodGV4dExpbmVPZmZzZXRzLmdldChlbmRMaW5lICsgMSkgPz8gMCkgLSAodGV4dExpbmVPZmZzZXRzLmdldChlbmRMaW5lKSA/PyAwKSAtIDEsXG4gICAgICAgIGxpbmU6IGVuZExpbmUsXG4gICAgICAgIG9mZnNldDogKHRleHRMaW5lT2Zmc2V0cy5nZXQoZW5kTGluZSArIDEpID8/IDApIC0gMVxuICAgICAgfSxcbiAgICAgIHN0YXJ0OiB7XG4gICAgICAgIGNvbDogMCxcbiAgICAgICAgbGluZTogc3RhcnRMaW5lLFxuICAgICAgICBvZmZzZXQ6IHRleHRMaW5lT2Zmc2V0cy5nZXQoc3RhcnRMaW5lKSA/PyAwXG4gICAgICB9XG4gICAgfSxcbiAgICByYXdBcmd1bWVudHNTdHJpbmc6IGNvZGVCbG9ja0FyZ3VtZW50c1N0cmluZyxcbiAgICBzZWN0aW9uSW5mbzoge1xuICAgICAgbGluZUVuZDogcHJldmlvdXNUZXh0TGluZXNDb3VudCArIHNvdXJjZUxpbmVzQ291bnQgKyAxLFxuICAgICAgbGluZVN0YXJ0OiBwcmV2aW91c1RleHRMaW5lc0NvdW50LFxuICAgICAgdGV4dDogYXBwcm94aW1hdGVTZWN0aW9uSW5mby50ZXh0XG4gICAgfSxcbiAgICBzdGFydERlbGltaXRlcjogY29kZUJsb2NrU3RhcnREZWxpbWl0ZXJcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZENvZGVCbG9ja01hcmtkb3duSW5mbyhwYXJhbXM6IEZpbmRDb2RlQmxvY2tNYXJrZG93bkluZm9QYXJhbXMpOiBDb2RlQmxvY2tNYXJrZG93bkluZm9ybWF0aW9uIHwgbnVsbCB7XG4gIGNvbnN0IHsgZWwsIG5vdGVDb250ZW50LCBzb3VyY2UgfSA9IHBhcmFtcztcbiAgY29uc3Qgbm90ZUNvbnRlbnRMZiA9IGVuc3VyZUxmRW5kaW5ncyhub3RlQ29udGVudCk7XG5cbiAgY29uc3QgYXBwcm94aW1hdGVTZWN0aW9uSW5mbzogTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb24gPSB7XG4gICAgbGluZUVuZDogbm90ZUNvbnRlbnRMZi5zcGxpdCgnXFxuJykubGVuZ3RoIC0gMSxcbiAgICBsaW5lU3RhcnQ6IDAsXG4gICAgdGV4dDogbm90ZUNvbnRlbnRMZlxuICB9O1xuXG4gIGFwcHJveGltYXRlU2VjdGlvbkluZm8udGV4dCA9IGVuc3VyZUxmRW5kaW5ncyhhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLnRleHQpO1xuXG4gIGlmIChcbiAgICAhaGFzU2luZ2xlT2NjdXJyZW5jZSh7XG4gICAgICAkc3RyaW5nOiBub3RlQ29udGVudExmLFxuICAgICAgc2VhcmNoVmFsdWU6IGFwcHJveGltYXRlU2VjdGlvbkluZm8udGV4dFxuICAgIH0pXG4gICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgc291cmNlTGYgPSBlbnN1cmVMZkVuZGluZ3Moc291cmNlKTtcblxuICBjb25zdCBzZWN0aW9uT2Zmc2V0ID0gbm90ZUNvbnRlbnRMZi5pbmRleE9mKGFwcHJveGltYXRlU2VjdGlvbkluZm8udGV4dCk7XG4gIGNvbnN0IGxpbmVzQmVmb3JlU2VjdGlvbkNvdW50ID0gbm90ZUNvbnRlbnRMZi5zbGljZSgwLCBzZWN0aW9uT2Zmc2V0KS5zcGxpdCgnXFxuJykubGVuZ3RoIC0gMTtcblxuICBjb25zdCBpc0luQ2FsbG91dCA9ICEhZWwucGFyZW50RWxlbWVudD8uY2xhc3NMaXN0LmNvbnRhaW5zKCdjYWxsb3V0LWNvbnRlbnQnKTtcblxuICBjb25zdCBsYW5ndWFnZSA9IGdldExhbmd1YWdlRnJvbUVsZW1lbnQoZWwpO1xuICBjb25zdCBzb3VyY2VMaW5lcyA9IHNvdXJjZUxmLnNwbGl0KCdcXG4nKTtcblxuICBjb25zdCB0ZXh0TGluZXMgPSBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLnRleHQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCB0ZXh0TGluZU9mZnNldHMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPihbW2xpbmVzQmVmb3JlU2VjdGlvbkNvdW50LCBzZWN0aW9uT2Zmc2V0XV0pO1xuXG4gIGxldCBsYXN0VGV4dExpbmVPZmZzZXQgPSBzZWN0aW9uT2Zmc2V0O1xuICBmb3IgKGNvbnN0IFtpbmRleCwgdGV4dExpbmVfXSBvZiB0ZXh0TGluZXMuZW50cmllcygpKSB7XG4gICAgY29uc3QgdGV4dExpbmUgPSB0ZXh0TGluZV87XG4gICAgY29uc3QgbGluZU9mZnNldCA9IGxhc3RUZXh0TGluZU9mZnNldCArIHRleHRMaW5lLmxlbmd0aCArIDE7XG4gICAgdGV4dExpbmVPZmZzZXRzLnNldChsaW5lc0JlZm9yZVNlY3Rpb25Db3VudCArIGluZGV4ICsgMSwgbGluZU9mZnNldCk7XG4gICAgbGFzdFRleHRMaW5lT2Zmc2V0ID0gbGluZU9mZnNldDtcbiAgfVxuXG4gIGNvbnN0IHBvdGVudGlhbENvZGVCbG9ja1RleHRMaW5lcyA9IHRleHRMaW5lcy5tYXAoKGxpbmUsIGluZGV4KSA9PiBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLmxpbmVTdGFydCA8PSBpbmRleCAmJiBpbmRleCA8PSBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLmxpbmVFbmQgPyBsaW5lIDogJycpO1xuICBjb25zdCBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0ID0gcG90ZW50aWFsQ29kZUJsb2NrVGV4dExpbmVzLmpvaW4oJ1xcbicpO1xuXG4gIGNvbnN0IFJFR19FWFAgPSBjcmVhdGVDb2RlQmxvY2tSZWdFeHAoKTtcblxuICBsZXQgbWFya2Rvd25JbmZvOiBDb2RlQmxvY2tNYXJrZG93bkluZm9ybWF0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgZm9yIChjb25zdCBtYXRjaCBvZiBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0Lm1hdGNoQWxsKFJFR19FWFApKSB7XG4gICAgaWYgKCFpc1N1aXRhYmxlQ29kZUJsb2NrKHsgaXNJbkNhbGxvdXQsIGxhbmd1YWdlLCBtYXRjaCwgc291cmNlTGYgfSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChtYXJrZG93bkluZm8pIHtcbiAgICAgIC8vIEEgc2Vjb25kIGlkZW50aWNhbCBibG9jazogdGhlIGVsZW1lbnQgY2Fubm90IHNheSB3aGljaCBvbmUgaXQgd2FzIHJlbmRlcmVkIGZyb20uXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBtYXJrZG93bkluZm8gPSBjcmVhdGVNYXJrZG93bkluZm9Gcm9tTWF0Y2goe1xuICAgICAgYXBwcm94aW1hdGVTZWN0aW9uSW5mbyxcbiAgICAgIGxpbmVzQmVmb3JlU2VjdGlvbkNvdW50LFxuICAgICAgbWF0Y2gsXG4gICAgICBub3RlQ29udGVudCxcbiAgICAgIHBvdGVudGlhbENvZGVCbG9ja1RleHQsXG4gICAgICBzb3VyY2VMaW5lc0NvdW50OiBzb3VyY2VMaW5lcy5sZW5ndGgsXG4gICAgICB0ZXh0TGluZU9mZnNldHNcbiAgICB9KTtcbiAgfVxuXG4gIGlmICghbWFya2Rvd25JbmZvIHx8IChub3RlQ29udGVudExmID09PSBub3RlQ29udGVudCkpIHtcbiAgICByZXR1cm4gbWFya2Rvd25JbmZvO1xuICB9XG5cbiAgY29uc3QgbGZPZmZzZXRNYXBwZXIgPSBnZXRMZk5vcm1hbGl6ZWRPZmZzZXRUb09yaWdpbmFsT2Zmc2V0TWFwcGVyKG5vdGVDb250ZW50KTtcbiAgbWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLnN0YXJ0Lm9mZnNldCA9IGxmT2Zmc2V0TWFwcGVyKG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5zdGFydC5vZmZzZXQpO1xuICBtYXJrZG93bkluZm8ucG9zaXRpb25Jbk5vdGUuZW5kLm9mZnNldCA9IGxmT2Zmc2V0TWFwcGVyKG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5lbmQub2Zmc2V0KTtcbiAgcmV0dXJuIG1hcmtkb3duSW5mbztcbn1cblxuLyoqXG4gKiBUaGUgZmx1c2hpbmcgY291bnRlcnBhcnQgb2Yge0BsaW5rIGdldENvZGVCbG9ja01hcmtkb3duSW5mb30sIGZvciB0aGUgd3JpdGUgaGVscGVycyBvbmx5LlxuICpcbiAqIEl0IHNhdmVzIHRoZSBub3RlIGZpcnN0IGFuZCByZWFkcyB0aGUgZmlsZSwgYmVjYXVzZSBhIHdyaXRlIGhlbHBlciBjb21wYXJlcyB0aGUgcmV0dXJuZWRcbiAqIGBub3RlQ29udGVudGAgYWdhaW5zdCB0aGUgZmlsZSBjb250ZW50IHtAbGluayBwcm9jZXNzfSBoYW5kcyBpdDogdGV4dCB0YWtlbiBmcm9tIGEgZGlydHkgZWRpdG9yXG4gKiB3b3VsZCBuZXZlciBtYXRjaCwgYW5kIHRoZSBwcm92aWRlciB3b3VsZCBhc2sgZm9yIGEgcmV0cnkgZm9yZXZlci4gQSB3cml0ZSBpcyBhYm91dCB0byBoYXBwZW5cbiAqIGFueXdheSwgc28gdGhlIHNhdmUgaXMgbm90IGEgd3JpdGUgb24gYW4gYXV0b21hdGljIHRyaWdnZXIuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvZGUgYmxvY2ssIGxvY2F0ZWQgaW4gdGhlIHNhdmVkIGZpbGUgY29udGVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvQWZ0ZXJTYXZlKHBhcmFtczogR2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvUGFyYW1zKTogUHJvbWlzZTxDb2RlQmxvY2tNYXJrZG93bkluZm9ybWF0aW9uIHwgbnVsbD4ge1xuICBjb25zdCB7IGFwcCwgY29udGV4dCwgZWwsIHNvdXJjZSB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBnZXRGaWxlT3JOdWxsKHsgYXBwLCBwYXRoT3JGaWxlOiBjb250ZXh0LnNvdXJjZVBhdGggfSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKHNvdXJjZUZpbGUsIGBTb3VyY2UgZmlsZSAke2NvbnRleHQuc291cmNlUGF0aH0gbm90IGZvdW5kLmApO1xuXG4gIGF3YWl0IHJlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jKCk7XG4gIGF3YWl0IHNhdmVOb3RlKGFwcCwgc291cmNlRmlsZSk7XG5cbiAgbGV0IG1hcmtkb3duSW5mbzogQ29kZUJsb2NrTWFya2Rvd25JbmZvcm1hdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGF3YWl0IGludm9rZVdpdGhGaWxlU3lzdGVtTG9jayh7XG4gICAgJGZ1bmN0aW9uKG5vdGVDb250ZW50KSB7XG4gICAgICBtYXJrZG93bkluZm8gPSBmaW5kQ29kZUJsb2NrTWFya2Rvd25JbmZvKHsgZWwsIG5vdGVDb250ZW50LCBzb3VyY2UgfSk7XG4gICAgfSxcbiAgICBhcHAsXG4gICAgcGF0aE9yRmlsZTogc291cmNlRmlsZVxuICB9KTtcblxuICByZXR1cm4gbWFya2Rvd25JbmZvO1xufVxuXG5mdW5jdGlvbiBnZXRMYW5ndWFnZUZyb21FbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgY29uc3QgQkxPQ0tfTEFOR1VBR0VfUFJFRklYID0gJ2Jsb2NrLWxhbmd1YWdlLSc7XG4gIHJldHVybiBbLi4uZWxlbWVudC5jbGFzc0xpc3RdLmZpbmQoKGNscykgPT4gY2xzLnN0YXJ0c1dpdGgoQkxPQ0tfTEFOR1VBR0VfUFJFRklYKSk/LnNsaWNlKEJMT0NLX0xBTkdVQUdFX1BSRUZJWC5sZW5ndGgpID8/ICcnO1xufVxuXG5mdW5jdGlvbiBnZXRPcGVuTWFya2Rvd25WaWV3RGF0YShhcHA6IEFwcCwgZmlsZTogVEZpbGUpOiBudWxsIHwgc3RyaW5nIHtcbiAgZm9yIChjb25zdCBsZWFmIG9mIGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFZpZXdUeXBlLk1hcmtkb3duKSkge1xuICAgIGlmIChsZWFmLnZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcgJiYgbGVhZi52aWV3LmZpbGU/LnBhdGggPT09IGZpbGUucGF0aCkge1xuICAgICAgcmV0dXJuIGxlYWYudmlldy5nZXRWaWV3RGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRUZXh0KHBhcmFtczogSW5zZXJ0VGV4dFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgY29udGVudCwgc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4ID0gZmFsc2UsIHRleHQgfSA9IHBhcmFtcztcbiAgbGV0IHsgaW5zZXJ0TGluZUluZGV4IH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgbmV3TGluZXMgPSBbLi4ubGluZXNdO1xuICBjb25zdCB0ZXh0TGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcblxuICBpZiAoaW5zZXJ0TGluZUluZGV4IDwgMCkge1xuICAgIGluc2VydExpbmVJbmRleCA9IDA7XG4gIH1cbiAgaWYgKGluc2VydExpbmVJbmRleCA+IGxpbmVzLmxlbmd0aCkge1xuICAgIGluc2VydExpbmVJbmRleCA9IGxpbmVzLmxlbmd0aDtcbiAgfVxuXG4gIGNvbnN0IFBSRUZJWF9MSU5FX1JFR19FWFAgPSAvXiB7MCwzfSg/Oj4gezEsM30pKi9nO1xuICBjb25zdCBtYXRjaCA9IChsaW5lc1tpbnNlcnRMaW5lSW5kZXhdID8/ICcnKS5tYXRjaChQUkVGSVhfTElORV9SRUdfRVhQKTtcbiAgY29uc3QgbGluZVByZWZpeCA9IG1hdGNoPy5bMF0gPz8gJyc7XG4gIG5ld0xpbmVzLnNwbGljZShcbiAgICBpbnNlcnRMaW5lSW5kZXgsXG4gICAgMCxcbiAgICAuLi4oc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4XG4gICAgICA/IHRleHRMaW5lcy5tYXAoKGxpbmUpID0+XG4gICAgICAgIGluZGVudCh7XG4gICAgICAgICAgcHJlZml4OiBsaW5lUHJlZml4LFxuICAgICAgICAgIHRleHQ6IGxpbmVcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIDogdGV4dExpbmVzKVxuICApO1xuICByZXR1cm4gbmV3TGluZXMuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGlzU3VpdGFibGVDb2RlQmxvY2socGFyYW1zOiBJc1N1aXRhYmxlQ29kZUJsb2NrUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgaXNJbkNhbGxvdXQsIGxhbmd1YWdlLCBtYXRjaCwgc291cmNlTGYgfSA9IHBhcmFtcztcblxuICBjb25zdCBjb2RlQmxvY2tMYW5ndWFnZSA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdDb2RlQmxvY2tMYW5ndWFnZScpO1xuICBpZiAoY29kZUJsb2NrTGFuZ3VhZ2UgIT09IGxhbmd1YWdlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbGluZVByZWZpeCA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdMaW5lUHJlZml4Jyk7XG5cbiAgaWYgKGlzSW5DYWxsb3V0ICYmICFsaW5lUHJlZml4LmluY2x1ZGVzKCc+ICcpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY29kZUJsb2NrQ29udGVudCA9IGdldE9wdGlvbmFsTmFtZWRHcm91cChtYXRjaCwgJ0NvZGVCbG9ja0NvbnRlbnQnKSA/PyAnJztcbiAgY29uc3QgY2xlYW5Db2RlQmxvY2tDb250ZW50ID0gY29kZUJsb2NrQ29udGVudC5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiBsaW5lLnNsaWNlKGxpbmVQcmVmaXgubGVuZ3RoKSkuam9pbignXFxuJyk7XG5cbiAgcmV0dXJuIGNsZWFuQ29kZUJsb2NrQ29udGVudCA9PT0gc291cmNlTGY7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsa0NBQWtDO0FBQzNDLFNBQVMsbUNBQW1DO0FBQzVDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLG9CQUFvQjtBQUM3QixTQUFTLGdCQUFnQjtBQUN6QixTQUFTLG9CQUFvQjtBQU03QixTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLHFCQUFxQjtBQUM5QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUErTFAsZUFBc0IseUJBQXlCLFFBQXNGO0FBQ25JLFFBQU0sRUFBRSxLQUFLLFNBQVMsSUFBSSxPQUFPLElBQUk7QUFFckMsUUFBTSxhQUFhLGNBQWMsRUFBRSxLQUFLLFlBQVksUUFBUSxXQUFXLENBQUM7QUFDeEUsb0JBQWtCLFlBQVksZUFBZSxRQUFRLFVBQVUsYUFBYTtBQUU1RSxRQUFNLDJCQUEyQjtBQUVqQyxRQUFNLGNBQWMsd0JBQXdCLEtBQUssVUFBVSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssVUFBVTtBQUMvRixTQUFPLDBCQUEwQixFQUFFLElBQUksYUFBYSxPQUFPLENBQUM7QUFDOUQ7QUFRQSxlQUFzQixxQkFBcUIsUUFBOEM7QUFDdkYsUUFBTSxFQUFFLEtBQUssU0FBUyxhQUFhLEdBQUcsS0FBSyxJQUFJO0FBRS9DLFFBQU0sUUFBUTtBQUFBLElBQ1o7QUFBQSxJQUNBLE1BQU0sbUJBQW1CLEVBQUUsUUFBUSxHQUFHO0FBQ3BDLFlBQU0sZUFBZSxNQUFNLGtDQUFrQyxNQUFNO0FBQ25F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
|
|
362
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYXJrZG93bi1jb2RlLWJsb2NrLXByb2Nlc3Nvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgY29kZSBibG9ja3MgaW4gT2JzaWRpYW4uXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cblxuaW1wb3J0IHR5cGUgeyBWYWx1ZVByb3ZpZGVyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3ZhbHVlLXByb3ZpZGVyJztcbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LFxuICBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbixcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBhYm9ydFNpZ25hbEFueSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hYm9ydC1jb250cm9sbGVyJztcbmltcG9ydCB7IHJlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHtcbiAgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCxcbiAgZ2V0T3B0aW9uYWxOYW1lZEdyb3VwXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7XG4gIGVuc3VyZUxmRW5kaW5ncyxcbiAgZ2V0TGZOb3JtYWxpemVkT2Zmc2V0VG9PcmlnaW5hbE9mZnNldE1hcHBlcixcbiAgaGFzU2luZ2xlT2NjdXJyZW5jZSxcbiAgaW5kZW50LFxuICB1bmluZGVudFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RyaW5nJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi92YWx1ZS1wcm92aWRlcic7XG5pbXBvcnQgeyBWaWV3VHlwZSB9IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7IE1hcmtkb3duVmlldyB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBDb2RlQmxvY2tNYXJrZG93bkluZm9ybWF0aW9uIH0gZnJvbSAnLi9jb2RlLWJsb2NrLW1hcmtkb3duLWluZm9ybWF0aW9uLnRzJztcbmltcG9ydCB0eXBlIHsgQ29kZUJsb2NrRm9jdXNTbmFwc2hvdCB9IGZyb20gJy4vY29kZS1ibG9jay1yZW5kZXItaGFuZG9mZi50cyc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlTG9ja0NvbXBvbmVudCB9IGZyb20gJy4vcmVzb3VyY2UtbG9jay50cyc7XG5pbXBvcnQgdHlwZSB7IENvbnRlbnRBcmd1bWVudHMgfSBmcm9tICcuL3ZhdWx0LnRzJztcblxuaW1wb3J0IHsgY3JlYXRlQ29kZUJsb2NrUmVnRXhwIH0gZnJvbSAnLi9jb2RlLWJsb2NrLXJlZy1leHAudHMnO1xuaW1wb3J0IHtcbiAgY2FwdHVyZUNvZGVCbG9ja0ZvY3VzLFxuICByZWNvcmRDb2RlQmxvY2tSZW5kZXJIYW5kb2ZmXG59IGZyb20gJy4vY29kZS1ibG9jay1yZW5kZXItaGFuZG9mZi50cyc7XG5pbXBvcnQgeyBnZXRGaWxlT3JOdWxsIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBpbnZva2VXaXRoRmlsZVN5c3RlbUxvY2ssXG4gIHByb2Nlc3MsXG4gIHNhdmVOb3RlXG59IGZyb20gJy4vdmF1bHQudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZXRDb2RlQmxvY2tNYXJrZG93bkluZm99LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldENvZGVCbG9ja01hcmtkb3duSW5mb1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSB7QGxpbmsgTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dH0gb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dDogTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dDtcblxuICAvKipcbiAgICogQSB7QGxpbmsgSFRNTEVsZW1lbnR9IHJlcHJlc2VudGluZyB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIHJlYWRvbmx5IGVsOiBIVE1MRWxlbWVudDtcblxuICAvKipcbiAgICogQSBzb3VyY2Ugb2YgdGhlIGNvZGUgYmxvY2suXG4gICAqL1xuICByZWFkb25seSBzb3VyY2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgaW5zZXJ0QWZ0ZXJDb2RlQmxvY2t9IC8ge0BsaW5rIGluc2VydEJlZm9yZUNvZGVCbG9ja30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0Q29kZUJsb2NrUGFyYW1zIGV4dGVuZHMgR2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgbnVtYmVyIG9mIGxpbmVzIHRvIG9mZnNldCB0aGUgaW5zZXJ0aW9uIGJ5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMGBcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVPZmZzZXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZS1sb2NrIGNvbXBvbmVudCB1c2VkIHRvIGxvY2sgdGhlIG5vdGUgd2hpbGUgaXQgaXMgYmVpbmcgbW9kaWZpZWQuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJlc2VydmUgdGhlIGxpbmUgcHJlZml4IG9mIHRoZSBjb2RlIGJsb2NrLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXg/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHRleHQgdG8gaW5zZXJ0IGFmdGVyIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayByZW1vdmVDb2RlQmxvY2t9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZUNvZGVCbG9ja1BhcmFtcyBleHRlbmRzIEdldENvZGVCbG9ja01hcmtkb3duSW5mb1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UtbG9jayBjb21wb25lbnQgdXNlZCB0byBsb2NrIHRoZSBub3RlIHdoaWxlIGl0IGlzIGJlaW5nIG1vZGlmaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGtlZXAgdGhlIGdhcCBhZnRlciByZW1vdmluZyB0aGUgY29kZSBibG9jay5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkS2VlcEdhcD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJlcGxhY2VDb2RlQmxvY2t9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcGxhY2VDb2RlQmxvY2tQYXJhbXMgZXh0ZW5kcyBHZXRDb2RlQmxvY2tNYXJrZG93bkluZm9QYXJhbXMge1xuICAvKipcbiAgICogQW4gYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhIG5ldyBjb2RlIGJsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgY29kZUJsb2NrUHJvdmlkZXI6IFZhbHVlUHJvdmlkZXI8c3RyaW5nLCBDb250ZW50QXJndW1lbnRzPjtcblxuICAvKipcbiAgICogQSBzdGF0ZSBwYXNzZWQgdG8gdGhlIG5leHQgcmVuZGVyIG9mIHRoZSBjb2RlIGJsb2NrLCB3aGljaCBnZXRzIGl0IGZyb20ge0BsaW5rIGNsYWltQ29kZUJsb2NrUmVuZGVySGFuZG9mZn0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBuZXh0UmVuZGVyU3RhdGU/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UtbG9jayBjb21wb25lbnQgdXNlZCB0byBsb2NrIHRoZSBub3RlIHdoaWxlIGl0IGlzIGJlaW5nIG1vZGlmaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBuZXh0IHJlbmRlciBvZiB0aGUgY29kZSBibG9jayBtYXkgcHV0IHRoZSBmb2N1cyBiYWNrIHdoZXJlIGl0IGlzIG5vdyBpbnNpZGUge0BsaW5rIGVsfSwgdGhyb3VnaFxuICAgKiB7QGxpbmsgY2xhaW1Db2RlQmxvY2tSZW5kZXJIYW5kb2ZmfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQ2FycnlGb2N1c1RvTmV4dFJlbmRlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8ga2VlcCB0aGUgZ2FwIHdoZW4gdGhlIG5ldyBjb2RlIGJsb2NrIGlzIGVtcHR5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRLZWVwR2FwV2hlbkVtcHR5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwcmVzZXJ2ZSB0aGUgbGluZSBwcmVmaXggb2YgdGhlIGNvZGUgYmxvY2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFByZXNlcnZlTGluZVByZWZpeD86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBDcmVhdGVNYXJrZG93bkluZm9Gcm9tTWF0Y2hQYXJhbXMge1xuICByZWFkb25seSBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvOiBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbjtcbiAgcmVhZG9ubHkgbGluZXNCZWZvcmVTZWN0aW9uQ291bnQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgbWF0Y2g6IFJlZ0V4cE1hdGNoQXJyYXk7XG4gIHJlYWRvbmx5IG5vdGVDb250ZW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBvdGVudGlhbENvZGVCbG9ja1RleHQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc291cmNlTGluZXNDb3VudDogbnVtYmVyO1xuICByZWFkb25seSB0ZXh0TGluZU9mZnNldHM6IFJlYWRvbmx5TWFwPG51bWJlciwgbnVtYmVyPjtcbn1cblxuaW50ZXJmYWNlIEZpbmRDb2RlQmxvY2tNYXJrZG93bkluZm9QYXJhbXMge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdGhlIGNvZGUgYmxvY2sgd2FzIHJlbmRlcmVkIGludG8uXG4gICAqL1xuICByZWFkb25seSBlbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RlIHRleHQgdG8gbG9jYXRlIHRoZSBjb2RlIGJsb2NrIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgbm90ZUNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBvZiB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSW5zZXJ0VGV4dFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29udGVudCB0byBpbnNlcnQgdGhlIHRleHQgaW50by5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxpbmUgaW5kZXggdG8gaW5zZXJ0IHRoZSB0ZXh0IGF0LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5zZXJ0TGluZUluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJlc2VydmUgdGhlIGxpbmUgcHJlZml4IG9mIHRoZSBsaW5lIGF0IHRoZSBpbnNlcnRpb24gcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFByZXNlcnZlTGluZVByZWZpeD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHRvIGluc2VydC5cbiAgICovXG4gIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIElzU3VpdGFibGVDb2RlQmxvY2tQYXJhbXMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY29kZSBibG9jayBpcyBpbnNpZGUgYSBjYWxsb3V0LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNJbkNhbGxvdXQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSB0aGUgY29kZSBibG9jayBpcyBleHBlY3RlZCB0byBoYXZlLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCBvZiB0aGUgY29kZSBibG9jayBjYW5kaWRhdGUuXG4gICAqL1xuICByZWFkb25seSBtYXRjaDogUmVnRXhwTWF0Y2hBcnJheTtcblxuICAvKipcbiAgICogVGhlIExGLW5vcm1hbGl6ZWQgc291cmNlIG9mIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlTGY6IHN0cmluZztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIGNvZGUgYmxvY2sgaW4gYSBNYXJrZG93biBzZWN0aW9uLlxuICpcbiAqIFRoaXMgaXMgYSBwdXJlIHJlYWQsIHNhZmUgdG8gY2FsbCB3aGlsZSBhIGNvZGUgYmxvY2sgcmVuZGVycy4gSXQgbG9jYXRlcyB0aGUgYmxvY2sgaW4gdGhlIHRleHQgdGhlXG4gKiB1c2VyIHNlZXM6IHRoZSB2aWV3IGRhdGEgb2YgYW4gb3BlbiBtYXJrZG93biB2aWV3IG9mIHRoZSBzb3VyY2Ugbm90ZSB3aGVuIHRoZXJlIGlzIG9uZSwgYmVjYXVzZVxuICogYW4gdW5zYXZlZCBlZGl0IHRoZXJlIGlzIHdoYXQgdGhlIGJsb2NrIHdhcyByZW5kZXJlZCBmcm9tLCBhbmQgdGhlIGZpbGUncyBjb250ZW50IG90aGVyd2lzZS4gSXRcbiAqIG5ldmVyIHNhdmVzIHRoZSBub3RlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgVGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlIGJsb2NrIGluIHRoZSBNYXJrZG93biBzZWN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvKHBhcmFtczogR2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvUGFyYW1zKTogUHJvbWlzZTxDb2RlQmxvY2tNYXJrZG93bkluZm9ybWF0aW9uIHwgbnVsbD4ge1xuICBjb25zdCB7IGFwcCwgY29udGV4dCwgZWwsIHNvdXJjZSB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBnZXRGaWxlT3JOdWxsKHsgYXBwLCBwYXRoT3JGaWxlOiBjb250ZXh0LnNvdXJjZVBhdGggfSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKHNvdXJjZUZpbGUsIGBTb3VyY2UgZmlsZSAke2NvbnRleHQuc291cmNlUGF0aH0gbm90IGZvdW5kLmApO1xuXG4gIGF3YWl0IHJlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jKCk7XG5cbiAgY29uc3Qgbm90ZUNvbnRlbnQgPSBnZXRPcGVuTWFya2Rvd25WaWV3RGF0YShhcHAsIHNvdXJjZUZpbGUpID8/IGF3YWl0IGFwcC52YXVsdC5yZWFkKHNvdXJjZUZpbGUpO1xuICByZXR1cm4gZmluZENvZGVCbG9ja01hcmtkb3duSW5mbyh7IGVsLCBub3RlQ29udGVudCwgc291cmNlIH0pO1xufVxuXG4vKipcbiAqIEluc2VydHMgdGV4dCBhZnRlciB0aGUgY29kZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBJbnRlbnRpb25hbGx5IHNoYXJlcyBJbnNlcnRDb2RlQmxvY2tQYXJhbXMgd2l0aCBpbnNlcnRCZWZvcmVDb2RlQmxvY2suXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zZXJ0QWZ0ZXJDb2RlQmxvY2socGFyYW1zOiBJbnNlcnRDb2RlQmxvY2tQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhcHAsIGNvbnRleHQsIGxpbmVPZmZzZXQgPSAwLCB0ZXh0IH0gPSBwYXJhbXM7XG5cbiAgYXdhaXQgcHJvY2Vzcyh7XG4gICAgYXBwLFxuICAgIGFzeW5jIG5ld0NvbnRlbnRQcm92aWRlcih7IGNvbnRlbnQgfSkge1xuICAgICAgY29uc3QgbWFya2Rvd25JbmZvID0gYXdhaXQgZ2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvQWZ0ZXJTYXZlKHBhcmFtcyk7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShtYXJrZG93bkluZm8sICdDb3VsZCBub3QgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGNvZGUgYmxvY2suJyk7XG5cbiAgICAgIGlmIChjb250ZW50ICE9PSBtYXJrZG93bkluZm8ubm90ZUNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluc2VydExpbmVJbmRleCA9IG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5lbmQubGluZSArIGxpbmVPZmZzZXQgKyAxO1xuICAgICAgcmV0dXJuIGluc2VydFRleHQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEluc2VydFRleHRQYXJhbXM+KHtcbiAgICAgICAgY29udGVudCxcbiAgICAgICAgaW5zZXJ0TGluZUluZGV4LFxuICAgICAgICBzaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXg6IHBhcmFtcy5zaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXgsXG4gICAgICAgIHRleHRcbiAgICAgIH0pKTtcbiAgICB9LFxuICAgIHBhdGhPckZpbGU6IGNvbnRleHQuc291cmNlUGF0aCxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IG51bGwsXG4gICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBwYXJhbXMucmVzb3VyY2VMb2NrQ29tcG9uZW50XG4gIH0pO1xufVxuXG4vKipcbiAqIEluc2VydHMgdGV4dCBiZWZvcmUgdGhlIGNvZGUgYmxvY2suXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0LWRldi10b29sa2l0L3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2ggLS0gSW50ZW50aW9uYWxseSBzaGFyZXMgSW5zZXJ0Q29kZUJsb2NrUGFyYW1zIHdpdGggaW5zZXJ0QWZ0ZXJDb2RlQmxvY2suXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zZXJ0QmVmb3JlQ29kZUJsb2NrKHBhcmFtczogSW5zZXJ0Q29kZUJsb2NrUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgYXBwLCBjb250ZXh0LCBsaW5lT2Zmc2V0ID0gMCwgdGV4dCB9ID0gcGFyYW1zO1xuXG4gIGF3YWl0IHByb2Nlc3Moe1xuICAgIGFwcCxcbiAgICBhc3luYyBuZXdDb250ZW50UHJvdmlkZXIoeyBjb250ZW50IH0pIHtcbiAgICAgIGNvbnN0IG1hcmtkb3duSW5mbyA9IGF3YWl0IGdldENvZGVCbG9ja01hcmtkb3duSW5mb0FmdGVyU2F2ZShwYXJhbXMpO1xuICAgICAgaWYgKCFtYXJrZG93bkluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGNvZGUgYmxvY2suJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb250ZW50ICE9PSBtYXJrZG93bkluZm8ubm90ZUNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluc2VydExpbmVJbmRleCA9IG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5zdGFydC5saW5lIC0gbGluZU9mZnNldDtcbiAgICAgIHJldHVybiBpbnNlcnRUZXh0KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxJbnNlcnRUZXh0UGFyYW1zPih7XG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIGluc2VydExpbmVJbmRleCxcbiAgICAgICAgc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4OiBwYXJhbXMuc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4LFxuICAgICAgICB0ZXh0XG4gICAgICB9KSk7XG4gICAgfSxcbiAgICBwYXRoT3JGaWxlOiBjb250ZXh0LnNvdXJjZVBhdGgsXG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBudWxsLFxuICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogcGFyYW1zLnJlc291cmNlTG9ja0NvbXBvbmVudFxuICB9KTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBjb2RlIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlQ29kZUJsb2NrKHBhcmFtczogUmVtb3ZlQ29kZUJsb2NrUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlcGxhY2VDb2RlQmxvY2soe1xuICAgIC4uLnBhcmFtcyxcbiAgICBjb2RlQmxvY2tQcm92aWRlcjogJycsXG4gICAgc2hvdWxkS2VlcEdhcFdoZW5FbXB0eTogcGFyYW1zLnNob3VsZEtlZXBHYXAgPz8gZmFsc2VcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwbGFjZXMgdGhlIGNvZGUgYmxvY2suXG4gKlxuICogT2JzaWRpYW4gcmVuZGVycyB0aGUgYmxvY2sgYWdhaW4gZnJvbSBpdHMgbmV3IHNvdXJjZS4gVG8ga2VlcCB0aGUgZm9jdXMgb3IgcGx1Z2luIHN0YXRlIGFjcm9zcyB0aGF0IHJlbmRlciwgcGFzc1xuICoge0BsaW5rIFJlcGxhY2VDb2RlQmxvY2tQYXJhbXMuc2hvdWxkQ2FycnlGb2N1c1RvTmV4dFJlbmRlcn0gb3Ige0BsaW5rIFJlcGxhY2VDb2RlQmxvY2tQYXJhbXMubmV4dFJlbmRlclN0YXRlfSwgYW5kXG4gKiBjYWxsIHtAbGluayBjbGFpbUNvZGVCbG9ja1JlbmRlckhhbmRvZmZ9IGZyb20gdGhlIHByb2Nlc3Nvci4gV2hlbiB0aGUgbm90ZSBpcyBvcGVuIGluIGFuIGVkaXRvciwgT2JzaWRpYW4gYXBwbGllc1xuICogdGhlIHdyaXRlIGFzIG9uZSBjaGFuZ2UgdGhlIHVzZXIgY2FuIHVuZG8uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXBsYWNlQ29kZUJsb2NrKHBhcmFtczogUmVwbGFjZUNvZGVCbG9ja1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFwcCwgY29kZUJsb2NrUHJvdmlkZXIsIGNvbnRleHQgfSA9IHBhcmFtcztcbiAgcGFyYW1zLmFib3J0U2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICBjb25zdCBzaG91bGRSZWNvcmRIYW5kb2ZmID0gcGFyYW1zLnNob3VsZENhcnJ5Rm9jdXNUb05leHRSZW5kZXIgPT09IHRydWUgfHwgcGFyYW1zLm5leHRSZW5kZXJTdGF0ZSAhPT0gdW5kZWZpbmVkO1xuICBjb25zdCBmb2N1czogQ29kZUJsb2NrRm9jdXNTbmFwc2hvdCB8IG51bGwgPSBwYXJhbXMuc2hvdWxkQ2FycnlGb2N1c1RvTmV4dFJlbmRlciA/IGNhcHR1cmVDb2RlQmxvY2tGb2N1cyhwYXJhbXMuZWwpIDogbnVsbDtcbiAgbGV0IGlzSGFuZG9mZlJlY29yZGVkID0gZmFsc2U7XG5cbiAgYXdhaXQgcHJvY2Vzcyh7XG4gICAgYXBwLFxuICAgIGFzeW5jIG5ld0NvbnRlbnRQcm92aWRlcih7IGFib3J0U2lnbmFsLCBjb250ZW50IH0pIHtcbiAgICAgIGFib3J0U2lnbmFsID0gYWJvcnRTaWduYWxBbnkoYWJvcnRTaWduYWwsIHBhcmFtcy5hYm9ydFNpZ25hbCk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgbWFya2Rvd25JbmZvID0gYXdhaXQgZ2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvQWZ0ZXJTYXZlKHBhcmFtcyk7XG4gICAgICBpZiAoIW1hcmtkb3duSW5mbykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCB1bmlxdWVseSBpZGVudGlmeSB0aGUgY29kZSBibG9jay4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRlbnQgIT09IG1hcmtkb3duSW5mby5ub3RlQ29udGVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbGV0IG9sZENvZGVCbG9jayA9IGNvbnRlbnQuc2xpY2UobWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLnN0YXJ0Lm9mZnNldCwgbWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLmVuZC5vZmZzZXQpO1xuICAgICAgaWYgKHBhcmFtcy5zaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXgpIHtcbiAgICAgICAgb2xkQ29kZUJsb2NrID0gdW5pbmRlbnQoe1xuICAgICAgICAgIHByZWZpeDogbWFya2Rvd25JbmZvLmxpbmVQcmVmaXgsXG4gICAgICAgICAgdGV4dDogb2xkQ29kZUJsb2NrXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBsZXQgbmV3Q29kZUJsb2NrID0gYXdhaXQgcmVzb2x2ZVZhbHVlKGNvZGVCbG9ja1Byb3ZpZGVyLCB7IGFib3J0U2lnbmFsLCBjb250ZW50OiBvbGRDb2RlQmxvY2sgfSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgaWYgKChuZXdDb2RlQmxvY2sgfHwgcGFyYW1zLnNob3VsZEtlZXBHYXBXaGVuRW1wdHkpICYmIHBhcmFtcy5zaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXgpIHtcbiAgICAgICAgbmV3Q29kZUJsb2NrID0gaW5kZW50KHtcbiAgICAgICAgICBwcmVmaXg6IG1hcmtkb3duSW5mby5saW5lUHJlZml4LFxuICAgICAgICAgIHRleHQ6IG5ld0NvZGVCbG9ja1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGV4dEJlZm9yZUNvZGVCbG9jayA9IGNvbnRlbnQuc2xpY2UoMCwgbWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLnN0YXJ0Lm9mZnNldCk7XG4gICAgICBjb25zdCB0ZXh0QWZ0ZXJDb2RlQmxvY2sgPSBjb250ZW50LnNsaWNlKG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5lbmQub2Zmc2V0KTtcblxuICAgICAgaWYgKHNob3VsZFJlY29yZEhhbmRvZmYgJiYgIWlzSGFuZG9mZlJlY29yZGVkICYmIG5ld0NvZGVCbG9jaykge1xuICAgICAgICAvLyBSZWNvcmRlZCBiZWZvcmUgdGhlIHdyaXRlLCBiZWNhdXNlIGFuIG9wZW4gZWRpdG9yIGNhbiByZW5kZXIgdGhlIG5ldyBzb3VyY2UgYmVmb3JlIHRoZSB3cml0ZSBzZXR0bGVzLlxuICAgICAgICBpc0hhbmRvZmZSZWNvcmRlZCA9IHJlY29yZENvZGVCbG9ja1JlbmRlckhhbmRvZmYoe1xuICAgICAgICAgIGZvY3VzLFxuICAgICAgICAgIG5ld0NvZGVCbG9jayxcbiAgICAgICAgICBzb3VyY2VQYXRoOiBjb250ZXh0LnNvdXJjZVBhdGgsXG4gICAgICAgICAgc3RhdGU6IHBhcmFtcy5uZXh0UmVuZGVyU3RhdGVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdDb2RlQmxvY2sgfHwgcGFyYW1zLnNob3VsZEtlZXBHYXBXaGVuRW1wdHkpIHtcbiAgICAgICAgcmV0dXJuIGAke3RleHRCZWZvcmVDb2RlQmxvY2t9JHtuZXdDb2RlQmxvY2t9JHt0ZXh0QWZ0ZXJDb2RlQmxvY2t9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0ZXh0QmVmb3JlQ29kZUJsb2NrICYmICF0ZXh0QWZ0ZXJDb2RlQmxvY2spIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGV4dEJlZm9yZUNvZGVCbG9jayA/IGAke3RleHRCZWZvcmVDb2RlQmxvY2suc2xpY2UoMCwgLTEpfSR7dGV4dEFmdGVyQ29kZUJsb2NrfWAgOiBgJHt0ZXh0QmVmb3JlQ29kZUJsb2NrfSR7dGV4dEFmdGVyQ29kZUJsb2NrLnNsaWNlKDEpfWA7XG4gICAgfSxcbiAgICBwYXRoT3JGaWxlOiBjb250ZXh0LnNvdXJjZVBhdGgsXG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBudWxsLFxuICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogcGFyYW1zLnJlc291cmNlTG9ja0NvbXBvbmVudFxuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFya2Rvd25JbmZvRnJvbU1hdGNoKHBhcmFtczogQ3JlYXRlTWFya2Rvd25JbmZvRnJvbU1hdGNoUGFyYW1zKTogQ29kZUJsb2NrTWFya2Rvd25JbmZvcm1hdGlvbiB7XG4gIGNvbnN0IHtcbiAgICBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLFxuICAgIGxpbmVzQmVmb3JlU2VjdGlvbkNvdW50LFxuICAgIG1hdGNoLFxuICAgIG5vdGVDb250ZW50LFxuICAgIHBvdGVudGlhbENvZGVCbG9ja1RleHQsXG4gICAgc291cmNlTGluZXNDb3VudCxcbiAgICB0ZXh0TGluZU9mZnNldHNcbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBsaW5lUHJlZml4ID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ0xpbmVQcmVmaXgnKTtcbiAgY29uc3QgY29kZUJsb2NrU3RhcnREZWxpbWl0ZXIgPSBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnQ29kZUJsb2NrU3RhcnREZWxpbWl0ZXInKTtcbiAgY29uc3QgY29kZUJsb2NrRW5kRGVsaW1pdGVyID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ0NvZGVCbG9ja0VuZERlbGltaXRlcicpO1xuICBjb25zdCBjb2RlQmxvY2tBcmd1bWVudHNTdHJpbmcgPSBnZXRPcHRpb25hbE5hbWVkR3JvdXAobWF0Y2gsICdDb2RlQmxvY2tBcmdzJykgPz8gJyc7XG4gIGNvbnN0IGxhbmd1YWdlID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ0NvZGVCbG9ja0xhbmd1YWdlJyk7XG5cbiAgY29uc3QgcHJldmlvdXNUZXh0ID0gcG90ZW50aWFsQ29kZUJsb2NrVGV4dC5zbGljZSgwLCBtYXRjaC5pbmRleCk7XG4gIGNvbnN0IHByZXZpb3VzVGV4dExpbmVzQ291bnQgPSBwcmV2aW91c1RleHQuc3BsaXQoJ1xcbicpLmxlbmd0aCAtIDE7XG5cbiAgY29uc3Qgc3RhcnRMaW5lID0gbGluZXNCZWZvcmVTZWN0aW9uQ291bnQgKyBwcmV2aW91c1RleHRMaW5lc0NvdW50O1xuICBjb25zdCBlbmRMaW5lID0gc3RhcnRMaW5lICsgc291cmNlTGluZXNDb3VudCArIDE7XG5cbiAgcmV0dXJuIHtcbiAgICAkYXJndW1lbnRzOiBjb2RlQmxvY2tBcmd1bWVudHNTdHJpbmcuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbiksXG4gICAgZW5kRGVsaW1pdGVyOiBjb2RlQmxvY2tFbmREZWxpbWl0ZXIsXG4gICAgbGFuZ3VhZ2UsXG4gICAgbGluZVByZWZpeCxcbiAgICBub3RlQ29udGVudCxcbiAgICBwb3NpdGlvbkluTm90ZToge1xuICAgICAgZW5kOiB7XG4gICAgICAgIGNvbDogKHRleHRMaW5lT2Zmc2V0cy5nZXQoZW5kTGluZSArIDEpID8/IDApIC0gKHRleHRMaW5lT2Zmc2V0cy5nZXQoZW5kTGluZSkgPz8gMCkgLSAxLFxuICAgICAgICBsaW5lOiBlbmRMaW5lLFxuICAgICAgICBvZmZzZXQ6ICh0ZXh0TGluZU9mZnNldHMuZ2V0KGVuZExpbmUgKyAxKSA/PyAwKSAtIDFcbiAgICAgIH0sXG4gICAgICBzdGFydDoge1xuICAgICAgICBjb2w6IDAsXG4gICAgICAgIGxpbmU6IHN0YXJ0TGluZSxcbiAgICAgICAgb2Zmc2V0OiB0ZXh0TGluZU9mZnNldHMuZ2V0KHN0YXJ0TGluZSkgPz8gMFxuICAgICAgfVxuICAgIH0sXG4gICAgcmF3QXJndW1lbnRzU3RyaW5nOiBjb2RlQmxvY2tBcmd1bWVudHNTdHJpbmcsXG4gICAgc2VjdGlvbkluZm86IHtcbiAgICAgIGxpbmVFbmQ6IHByZXZpb3VzVGV4dExpbmVzQ291bnQgKyBzb3VyY2VMaW5lc0NvdW50ICsgMSxcbiAgICAgIGxpbmVTdGFydDogcHJldmlvdXNUZXh0TGluZXNDb3VudCxcbiAgICAgIHRleHQ6IGFwcHJveGltYXRlU2VjdGlvbkluZm8udGV4dFxuICAgIH0sXG4gICAgc3RhcnREZWxpbWl0ZXI6IGNvZGVCbG9ja1N0YXJ0RGVsaW1pdGVyXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRDb2RlQmxvY2tNYXJrZG93bkluZm8ocGFyYW1zOiBGaW5kQ29kZUJsb2NrTWFya2Rvd25JbmZvUGFyYW1zKTogQ29kZUJsb2NrTWFya2Rvd25JbmZvcm1hdGlvbiB8IG51bGwge1xuICBjb25zdCB7IGVsLCBub3RlQ29udGVudCwgc291cmNlIH0gPSBwYXJhbXM7XG4gIGNvbnN0IG5vdGVDb250ZW50TGYgPSBlbnN1cmVMZkVuZGluZ3Mobm90ZUNvbnRlbnQpO1xuXG4gIGNvbnN0IGFwcHJveGltYXRlU2VjdGlvbkluZm86IE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uID0ge1xuICAgIGxpbmVFbmQ6IG5vdGVDb250ZW50TGYuc3BsaXQoJ1xcbicpLmxlbmd0aCAtIDEsXG4gICAgbGluZVN0YXJ0OiAwLFxuICAgIHRleHQ6IG5vdGVDb250ZW50TGZcbiAgfTtcblxuICBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLnRleHQgPSBlbnN1cmVMZkVuZGluZ3MoYXBwcm94aW1hdGVTZWN0aW9uSW5mby50ZXh0KTtcblxuICBpZiAoXG4gICAgIWhhc1NpbmdsZU9jY3VycmVuY2Uoe1xuICAgICAgJHN0cmluZzogbm90ZUNvbnRlbnRMZixcbiAgICAgIHNlYXJjaFZhbHVlOiBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLnRleHRcbiAgICB9KVxuICApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZUxmID0gZW5zdXJlTGZFbmRpbmdzKHNvdXJjZSk7XG5cbiAgY29uc3Qgc2VjdGlvbk9mZnNldCA9IG5vdGVDb250ZW50TGYuaW5kZXhPZihhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLnRleHQpO1xuICBjb25zdCBsaW5lc0JlZm9yZVNlY3Rpb25Db3VudCA9IG5vdGVDb250ZW50TGYuc2xpY2UoMCwgc2VjdGlvbk9mZnNldCkuc3BsaXQoJ1xcbicpLmxlbmd0aCAtIDE7XG5cbiAgY29uc3QgaXNJbkNhbGxvdXQgPSAhIWVsLnBhcmVudEVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucygnY2FsbG91dC1jb250ZW50Jyk7XG5cbiAgY29uc3QgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZUZyb21FbGVtZW50KGVsKTtcbiAgY29uc3Qgc291cmNlTGluZXMgPSBzb3VyY2VMZi5zcGxpdCgnXFxuJyk7XG5cbiAgY29uc3QgdGV4dExpbmVzID0gYXBwcm94aW1hdGVTZWN0aW9uSW5mby50ZXh0LnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgdGV4dExpbmVPZmZzZXRzID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oW1tsaW5lc0JlZm9yZVNlY3Rpb25Db3VudCwgc2VjdGlvbk9mZnNldF1dKTtcblxuICBsZXQgbGFzdFRleHRMaW5lT2Zmc2V0ID0gc2VjdGlvbk9mZnNldDtcbiAgZm9yIChjb25zdCBbaW5kZXgsIHRleHRMaW5lX10gb2YgdGV4dExpbmVzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IHRleHRMaW5lID0gdGV4dExpbmVfO1xuICAgIGNvbnN0IGxpbmVPZmZzZXQgPSBsYXN0VGV4dExpbmVPZmZzZXQgKyB0ZXh0TGluZS5sZW5ndGggKyAxO1xuICAgIHRleHRMaW5lT2Zmc2V0cy5zZXQobGluZXNCZWZvcmVTZWN0aW9uQ291bnQgKyBpbmRleCArIDEsIGxpbmVPZmZzZXQpO1xuICAgIGxhc3RUZXh0TGluZU9mZnNldCA9IGxpbmVPZmZzZXQ7XG4gIH1cblxuICBjb25zdCBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0TGluZXMgPSB0ZXh0TGluZXMubWFwKChsaW5lLCBpbmRleCkgPT4gYXBwcm94aW1hdGVTZWN0aW9uSW5mby5saW5lU3RhcnQgPD0gaW5kZXggJiYgaW5kZXggPD0gYXBwcm94aW1hdGVTZWN0aW9uSW5mby5saW5lRW5kID8gbGluZSA6ICcnKTtcbiAgY29uc3QgcG90ZW50aWFsQ29kZUJsb2NrVGV4dCA9IHBvdGVudGlhbENvZGVCbG9ja1RleHRMaW5lcy5qb2luKCdcXG4nKTtcblxuICBjb25zdCBSRUdfRVhQID0gY3JlYXRlQ29kZUJsb2NrUmVnRXhwKCk7XG5cbiAgbGV0IG1hcmtkb3duSW5mbzogQ29kZUJsb2NrTWFya2Rvd25JbmZvcm1hdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGZvciAoY29uc3QgbWF0Y2ggb2YgcG90ZW50aWFsQ29kZUJsb2NrVGV4dC5tYXRjaEFsbChSRUdfRVhQKSkge1xuICAgIGlmICghaXNTdWl0YWJsZUNvZGVCbG9jayh7IGlzSW5DYWxsb3V0LCBsYW5ndWFnZSwgbWF0Y2gsIHNvdXJjZUxmIH0pKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobWFya2Rvd25JbmZvKSB7XG4gICAgICAvLyBBIHNlY29uZCBpZGVudGljYWwgYmxvY2s6IHRoZSBlbGVtZW50IGNhbm5vdCBzYXkgd2hpY2ggb25lIGl0IHdhcyByZW5kZXJlZCBmcm9tLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbWFya2Rvd25JbmZvID0gY3JlYXRlTWFya2Rvd25JbmZvRnJvbU1hdGNoKHtcbiAgICAgIGFwcHJveGltYXRlU2VjdGlvbkluZm8sXG4gICAgICBsaW5lc0JlZm9yZVNlY3Rpb25Db3VudCxcbiAgICAgIG1hdGNoLFxuICAgICAgbm90ZUNvbnRlbnQsXG4gICAgICBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0LFxuICAgICAgc291cmNlTGluZXNDb3VudDogc291cmNlTGluZXMubGVuZ3RoLFxuICAgICAgdGV4dExpbmVPZmZzZXRzXG4gICAgfSk7XG4gIH1cblxuICBpZiAoIW1hcmtkb3duSW5mbyB8fCAobm90ZUNvbnRlbnRMZiA9PT0gbm90ZUNvbnRlbnQpKSB7XG4gICAgcmV0dXJuIG1hcmtkb3duSW5mbztcbiAgfVxuXG4gIGNvbnN0IGxmT2Zmc2V0TWFwcGVyID0gZ2V0TGZOb3JtYWxpemVkT2Zmc2V0VG9PcmlnaW5hbE9mZnNldE1hcHBlcihub3RlQ29udGVudCk7XG4gIG1hcmtkb3duSW5mby5wb3NpdGlvbkluTm90ZS5zdGFydC5vZmZzZXQgPSBsZk9mZnNldE1hcHBlcihtYXJrZG93bkluZm8ucG9zaXRpb25Jbk5vdGUuc3RhcnQub2Zmc2V0KTtcbiAgbWFya2Rvd25JbmZvLnBvc2l0aW9uSW5Ob3RlLmVuZC5vZmZzZXQgPSBsZk9mZnNldE1hcHBlcihtYXJrZG93bkluZm8ucG9zaXRpb25Jbk5vdGUuZW5kLm9mZnNldCk7XG4gIHJldHVybiBtYXJrZG93bkluZm87XG59XG5cbi8qKlxuICogVGhlIGZsdXNoaW5nIGNvdW50ZXJwYXJ0IG9mIHtAbGluayBnZXRDb2RlQmxvY2tNYXJrZG93bkluZm99LCBmb3IgdGhlIHdyaXRlIGhlbHBlcnMgb25seS5cbiAqXG4gKiBJdCBzYXZlcyB0aGUgbm90ZSBmaXJzdCBhbmQgcmVhZHMgdGhlIGZpbGUsIGJlY2F1c2UgYSB3cml0ZSBoZWxwZXIgY29tcGFyZXMgdGhlIHJldHVybmVkXG4gKiBgbm90ZUNvbnRlbnRgIGFnYWluc3QgdGhlIGZpbGUgY29udGVudCB7QGxpbmsgcHJvY2Vzc30gaGFuZHMgaXQ6IHRleHQgdGFrZW4gZnJvbSBhIGRpcnR5IGVkaXRvclxuICogd291bGQgbmV2ZXIgbWF0Y2gsIGFuZCB0aGUgcHJvdmlkZXIgd291bGQgYXNrIGZvciBhIHJldHJ5IGZvcmV2ZXIuIEEgd3JpdGUgaXMgYWJvdXQgdG8gaGFwcGVuXG4gKiBhbnl3YXksIHNvIHRoZSBzYXZlIGlzIG5vdCBhIHdyaXRlIG9uIGFuIGF1dG9tYXRpYyB0cmlnZ2VyLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgVGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlIGJsb2NrLCBsb2NhdGVkIGluIHRoZSBzYXZlZCBmaWxlIGNvbnRlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENvZGVCbG9ja01hcmtkb3duSW5mb0FmdGVyU2F2ZShwYXJhbXM6IEdldENvZGVCbG9ja01hcmtkb3duSW5mb1BhcmFtcyk6IFByb21pc2U8Q29kZUJsb2NrTWFya2Rvd25JbmZvcm1hdGlvbiB8IG51bGw+IHtcbiAgY29uc3QgeyBhcHAsIGNvbnRleHQsIGVsLCBzb3VyY2UgfSA9IHBhcmFtcztcblxuICBjb25zdCBzb3VyY2VGaWxlID0gZ2V0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogY29udGV4dC5zb3VyY2VQYXRoIH0pO1xuICBhc3NlcnROb25OdWxsYWJsZShzb3VyY2VGaWxlLCBgU291cmNlIGZpbGUgJHtjb250ZXh0LnNvdXJjZVBhdGh9IG5vdCBmb3VuZC5gKTtcblxuICBhd2FpdCByZXF1ZXN0QW5pbWF0aW9uRnJhbWVBc3luYygpO1xuICBhd2FpdCBzYXZlTm90ZShhcHAsIHNvdXJjZUZpbGUpO1xuXG4gIGxldCBtYXJrZG93bkluZm86IENvZGVCbG9ja01hcmtkb3duSW5mb3JtYXRpb24gfCBudWxsID0gbnVsbDtcblxuICBhd2FpdCBpbnZva2VXaXRoRmlsZVN5c3RlbUxvY2soe1xuICAgICRmdW5jdGlvbihub3RlQ29udGVudCkge1xuICAgICAgbWFya2Rvd25JbmZvID0gZmluZENvZGVCbG9ja01hcmtkb3duSW5mbyh7IGVsLCBub3RlQ29udGVudCwgc291cmNlIH0pO1xuICAgIH0sXG4gICAgYXBwLFxuICAgIHBhdGhPckZpbGU6IHNvdXJjZUZpbGVcbiAgfSk7XG5cbiAgcmV0dXJuIG1hcmtkb3duSW5mbztcbn1cblxuZnVuY3Rpb24gZ2V0TGFuZ3VhZ2VGcm9tRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XG4gIGNvbnN0IEJMT0NLX0xBTkdVQUdFX1BSRUZJWCA9ICdibG9jay1sYW5ndWFnZS0nO1xuICByZXR1cm4gWy4uLmVsZW1lbnQuY2xhc3NMaXN0XS5maW5kKChjbHMpID0+IGNscy5zdGFydHNXaXRoKEJMT0NLX0xBTkdVQUdFX1BSRUZJWCkpPy5zbGljZShCTE9DS19MQU5HVUFHRV9QUkVGSVgubGVuZ3RoKSA/PyAnJztcbn1cblxuZnVuY3Rpb24gZ2V0T3Blbk1hcmtkb3duVmlld0RhdGEoYXBwOiBBcHAsIGZpbGU6IFRGaWxlKTogbnVsbCB8IHN0cmluZyB7XG4gIGZvciAoY29uc3QgbGVhZiBvZiBhcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShWaWV3VHlwZS5NYXJrZG93bikpIHtcbiAgICBpZiAobGVhZi52aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3ICYmIGxlYWYudmlldy5maWxlPy5wYXRoID09PSBmaWxlLnBhdGgpIHtcbiAgICAgIHJldHVybiBsZWFmLnZpZXcuZ2V0Vmlld0RhdGEoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaW5zZXJ0VGV4dChwYXJhbXM6IEluc2VydFRleHRQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGNvbnRlbnQsIHNob3VsZFByZXNlcnZlTGluZVByZWZpeCA9IGZhbHNlLCB0ZXh0IH0gPSBwYXJhbXM7XG4gIGxldCB7IGluc2VydExpbmVJbmRleCB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IG5ld0xpbmVzID0gWy4uLmxpbmVzXTtcbiAgY29uc3QgdGV4dExpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG5cbiAgaWYgKGluc2VydExpbmVJbmRleCA8IDApIHtcbiAgICBpbnNlcnRMaW5lSW5kZXggPSAwO1xuICB9XG4gIGlmIChpbnNlcnRMaW5lSW5kZXggPiBsaW5lcy5sZW5ndGgpIHtcbiAgICBpbnNlcnRMaW5lSW5kZXggPSBsaW5lcy5sZW5ndGg7XG4gIH1cblxuICBjb25zdCBQUkVGSVhfTElORV9SRUdfRVhQID0gL14gezAsM30oPzo+IHsxLDN9KSovZztcbiAgY29uc3QgbWF0Y2ggPSAobGluZXNbaW5zZXJ0TGluZUluZGV4XSA/PyAnJykubWF0Y2goUFJFRklYX0xJTkVfUkVHX0VYUCk7XG4gIGNvbnN0IGxpbmVQcmVmaXggPSBtYXRjaD8uWzBdID8/ICcnO1xuICBuZXdMaW5lcy5zcGxpY2UoXG4gICAgaW5zZXJ0TGluZUluZGV4LFxuICAgIDAsXG4gICAgLi4uKHNob3VsZFByZXNlcnZlTGluZVByZWZpeFxuICAgICAgPyB0ZXh0TGluZXMubWFwKChsaW5lKSA9PlxuICAgICAgICBpbmRlbnQoe1xuICAgICAgICAgIHByZWZpeDogbGluZVByZWZpeCxcbiAgICAgICAgICB0ZXh0OiBsaW5lXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICA6IHRleHRMaW5lcylcbiAgKTtcbiAgcmV0dXJuIG5ld0xpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBpc1N1aXRhYmxlQ29kZUJsb2NrKHBhcmFtczogSXNTdWl0YWJsZUNvZGVCbG9ja1BhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7IGlzSW5DYWxsb3V0LCBsYW5ndWFnZSwgbWF0Y2gsIHNvdXJjZUxmIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgY29kZUJsb2NrTGFuZ3VhZ2UgPSBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnQ29kZUJsb2NrTGFuZ3VhZ2UnKTtcbiAgaWYgKGNvZGVCbG9ja0xhbmd1YWdlICE9PSBsYW5ndWFnZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVQcmVmaXggPSBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnTGluZVByZWZpeCcpO1xuXG4gIGlmIChpc0luQ2FsbG91dCAmJiAhbGluZVByZWZpeC5pbmNsdWRlcygnPiAnKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNvZGVCbG9ja0NvbnRlbnQgPSBnZXRPcHRpb25hbE5hbWVkR3JvdXAobWF0Y2gsICdDb2RlQmxvY2tDb250ZW50JykgPz8gJyc7XG4gIGNvbnN0IGNsZWFuQ29kZUJsb2NrQ29udGVudCA9IGNvZGVCbG9ja0NvbnRlbnQuc3BsaXQoJ1xcbicpLm1hcCgobGluZSkgPT4gbGluZS5zbGljZShsaW5lUHJlZml4Lmxlbmd0aCkpLmpvaW4oJ1xcbicpO1xuXG4gIHJldHVybiBjbGVhbkNvZGVCbG9ja0NvbnRlbnQgPT09IHNvdXJjZUxmO1xufVxuXG4vKiB2OCBp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
|
|
@@ -29,6 +29,13 @@ export interface FullRenderParams {
|
|
|
29
29
|
* The Markdown string to render.
|
|
30
30
|
*/
|
|
31
31
|
readonly markdown: string;
|
|
32
|
+
/**
|
|
33
|
+
* Whether to make the rendered headings and nested lists foldable, as in a Reading view. See
|
|
34
|
+
* {@link registerFoldHandlers}.
|
|
35
|
+
*
|
|
36
|
+
* @default `false`
|
|
37
|
+
*/
|
|
38
|
+
readonly shouldRegisterFoldHandlers?: boolean;
|
|
32
39
|
/**
|
|
33
40
|
* Whether to register link handlers for the rendered element.
|
|
34
41
|
*
|
|
@@ -192,7 +199,9 @@ export declare function fullRender(params: FullRenderParams): Promise<void>;
|
|
|
192
199
|
*/
|
|
193
200
|
export declare function markdownToHtml(params: MarkdownToHtmlParams): Promise<string>;
|
|
194
201
|
/**
|
|
195
|
-
* Registers link handlers for the given element
|
|
202
|
+
* Registers link handlers for the given element, so its links act as they do in a Reading view: click,
|
|
203
|
+
* mod-click, middle-click, drag, hover preview, the context menu, tags, and footnote links, which scroll
|
|
204
|
+
* to their footnote and back.
|
|
196
205
|
*
|
|
197
206
|
* @param params - The parameters for registering link handlers.
|
|
198
207
|
*/
|