obsidian-dev-utils 34.0.1 → 34.0.2-beta.2

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.
@@ -6,73 +6,86 @@ if you want to view the source, please visit the github repository of this plugi
6
6
  (function initEsm(){if(globalThis.process){return}const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};globalThis.process=browserProcess})();
7
7
 
8
8
  import { getFrontMatterInfo } from "obsidian";
9
- import { abortSignalNever } from "../AbortController.mjs";
9
+ import { abortSignalAny } from "../AbortController.mjs";
10
10
  import {
11
11
  hasSingleOccurrence,
12
12
  indent,
13
- replaceAll,
14
13
  unindent
15
14
  } from "../String.mjs";
16
15
  import { resolveValue } from "../ValueProvider.mjs";
17
16
  import { process } from "./Vault.mjs";
18
- async function getCodeBlockSectionInfo(options) {
17
+ async function getCodeBlockMarkdownInfo(options) {
19
18
  const { app, ctx, el, source } = options;
20
- const approximateSectionInfo = ctx.getSectionInfo(el) ?? await createApproximateSectionInfo(app, ctx);
19
+ const sourceFile = app.vault.getFileByPath(ctx.sourcePath);
20
+ if (!sourceFile) {
21
+ throw new Error(`Source file ${ctx.sourcePath} not found.`);
22
+ }
23
+ const content = options.noteContent ?? await app.vault.cachedRead(sourceFile);
24
+ const approximateSectionInfo = ctx.getSectionInfo(el) ?? createApproximateSectionInfo(app, sourceFile, content);
25
+ if (!hasSingleOccurrence(content, approximateSectionInfo.text)) {
26
+ return null;
27
+ }
28
+ const sectionOffset = content.indexOf(approximateSectionInfo.text);
29
+ const linesBeforeSectionCount = content.slice(0, sectionOffset).split("\n").length - 1;
21
30
  const isInCallout = !!el.parentElement?.classList.contains("callout-content");
22
31
  const language = getLanguageFromElement(el);
23
32
  const sourceLines = source.split("\n");
24
33
  const textLines = approximateSectionInfo.text.split("\n");
34
+ const textLineOffsets = /* @__PURE__ */ new Map();
35
+ textLineOffsets.set(linesBeforeSectionCount, sectionOffset);
36
+ let lastTextLineOffset = sectionOffset;
37
+ for (let i = 0; i < textLines.length; i++) {
38
+ const textLine = textLines[i];
39
+ const line = textLine ?? "";
40
+ const lineOffset = lastTextLineOffset + line.length + 1;
41
+ textLineOffsets.set(linesBeforeSectionCount + i + 1, lineOffset);
42
+ lastTextLineOffset = lineOffset;
43
+ }
25
44
  const potentialCodeBlockTextLines = textLines.map(
26
45
  (line, index) => approximateSectionInfo.lineStart <= index && index <= approximateSectionInfo.lineEnd ? line : ""
27
46
  );
28
47
  const potentialCodeBlockText = potentialCodeBlockTextLines.join("\n");
29
- const REG_EXP = /(?<=^|\n)(?<LinePrefix> {0,3}(?:> {1,3})*)(?<CodeBlockStartDelimiter>(?<CodeBlockStartDelimiterChar>[`~])(?:\k<CodeBlockStartDelimiterChar>{2,}))(?<CodeBlockLanguage>\S*)(?:[ \t]+(?<CodeBlockArgs>.*?)[ \t]+)?(?:\n(?<CodeBlockContent>(?:\n?\k<LinePrefix>.*)+?))?\n\k<LinePrefix>(?<CodeBlockEndDelimiter>\k<CodeBlockStartDelimiter>\k<CodeBlockStartDelimiterChar>*)[ \t]*(?:\n|$)/g;
30
- let sectionInfo = null;
48
+ const REG_EXP = /(?<=^|\n)(?<LinePrefix> {0,3}(?:> {1,3})*)(?<CodeBlockStartDelimiter>(?<CodeBlockStartDelimiterChar>[`~])(?:\k<CodeBlockStartDelimiterChar>{2,}))(?<CodeBlockLanguage>\S*)(?:[ \t](?<CodeBlockArgs>.*?))?(?:\n(?<CodeBlockContent>(?:\n?\k<LinePrefix>.*)+?))?\n\k<LinePrefix>(?<CodeBlockEndDelimiter>\k<CodeBlockStartDelimiter>\k<CodeBlockStartDelimiterChar>*)[ \t]*(?=\n|$)/g;
49
+ let markdownInfo = null;
31
50
  for (const match of potentialCodeBlockText.matchAll(REG_EXP)) {
32
51
  if (!isSuitableCodeBlock(match, language, source, isInCallout)) {
33
52
  continue;
34
53
  }
35
- if (sectionInfo) {
54
+ if (markdownInfo) {
36
55
  return null;
37
56
  }
38
- sectionInfo = createSectionInfoFromMatch(potentialCodeBlockText, match, approximateSectionInfo, sourceLines);
57
+ markdownInfo = createMarkdownInfoFromMatch(potentialCodeBlockText, match, approximateSectionInfo, sourceLines, textLineOffsets, linesBeforeSectionCount);
39
58
  }
40
- if (!sectionInfo) {
59
+ if (!markdownInfo) {
41
60
  return null;
42
61
  }
43
- return sectionInfo;
62
+ return markdownInfo;
44
63
  }
45
64
  async function insertAfterCodeBlock(options) {
46
65
  const { app, ctx, lineOffset = 0, text } = options;
47
- const sectionInfo = await getCodeBlockSectionInfo(options);
48
- if (!sectionInfo) {
49
- throw new Error("Could not uniquely identify the code block.");
50
- }
51
- await process(app, ctx.sourcePath, (_abortSignal, content) => {
52
- if (!hasSingleOccurrence(content, sectionInfo.text)) {
53
- throw new Error("Multiple suitable code blocks found.");
66
+ await process(app, ctx.sourcePath, async (_abortSignal, content) => {
67
+ const markdownInfo = await getCodeBlockMarkdownInfo({
68
+ ...options,
69
+ noteContent: content
70
+ });
71
+ if (!markdownInfo) {
72
+ throw new Error("Could not uniquely identify the code block.");
54
73
  }
55
- const index = content.indexOf(sectionInfo.text);
56
- const textBeforeSection = content.slice(0, index);
57
- const linesBeforeSection = textBeforeSection.split("\n");
58
- const insertLineIndex = linesBeforeSection.length + sectionInfo.lineEnd + lineOffset;
74
+ const insertLineIndex = markdownInfo.notePos.end.line + lineOffset + 1;
59
75
  return insertText(content, insertLineIndex, text, options.shouldPreserveLinePrefix);
60
76
  });
61
77
  }
62
78
  async function insertBeforeCodeBlock(options) {
63
79
  const { app, ctx, lineOffset = 0, text } = options;
64
- const sectionInfo = await getCodeBlockSectionInfo(options);
65
- if (!sectionInfo) {
66
- throw new Error("Could not uniquely identify the code block.");
67
- }
68
- await process(app, ctx.sourcePath, (_abortSignal, content) => {
69
- if (!hasSingleOccurrence(content, sectionInfo.text)) {
70
- throw new Error("Multiple suitable code blocks found.");
80
+ await process(app, ctx.sourcePath, async (_abortSignal, content) => {
81
+ const markdownInfo = await getCodeBlockMarkdownInfo({
82
+ ...options,
83
+ noteContent: content
84
+ });
85
+ if (!markdownInfo) {
86
+ throw new Error("Could not uniquely identify the code block.");
71
87
  }
72
- const index = content.indexOf(sectionInfo.text);
73
- const textBeforeSection = content.slice(0, index);
74
- const linesBeforeSection = textBeforeSection.split("\n");
75
- const insertLineIndex = linesBeforeSection.length + sectionInfo.lineStart - lineOffset - 1;
88
+ const insertLineIndex = markdownInfo.notePos.start.line - lineOffset;
76
89
  return insertText(content, insertLineIndex, text, options.shouldPreserveLinePrefix);
77
90
  });
78
91
  }
@@ -84,44 +97,37 @@ async function removeCodeBlock(options) {
84
97
  }
85
98
  async function replaceCodeBlock(options) {
86
99
  const { app, codeBlockProvider, ctx } = options;
87
- const abortSignal = options.abortSignal ?? abortSignalNever();
88
- abortSignal.throwIfAborted();
89
- const sectionInfo = await getCodeBlockSectionInfo(options);
90
- if (!sectionInfo) {
91
- throw new Error("Could not uniquely identify the code block.");
92
- }
93
- const lines = sectionInfo.text.split("\n");
94
- const textBeforeCodeBlock = lines.slice(0, sectionInfo.lineStart).join("\n");
95
- let oldCodeBlock = lines.slice(sectionInfo.lineStart, sectionInfo.lineEnd + 1).join("\n");
96
- if (options.shouldPreserveLinePrefix) {
97
- oldCodeBlock = unindent(oldCodeBlock, sectionInfo.prefix);
98
- }
99
- const textAfterCodeBlock = lines.slice(sectionInfo.lineEnd + 1).join("\n");
100
- let newCodeBlock = await resolveValue(codeBlockProvider, abortSignal, oldCodeBlock);
101
- abortSignal.throwIfAborted();
102
- if (newCodeBlock && options.shouldPreserveLinePrefix) {
103
- newCodeBlock = indent(newCodeBlock, sectionInfo.prefix);
104
- }
105
- const newSectionText = `${appendNewLine(textBeforeCodeBlock)}${appendNewLine(newCodeBlock)}${textAfterCodeBlock}`;
106
- await process(app, ctx.sourcePath, (_abortSignal, content) => {
107
- if (!hasSingleOccurrence(content, sectionInfo.text)) {
108
- throw new Error("Multiple suitable code blocks found.");
100
+ options.abortSignal?.throwIfAborted();
101
+ await process(app, ctx.sourcePath, async (abortSignal, content) => {
102
+ abortSignal = abortSignalAny(abortSignal, options.abortSignal);
103
+ abortSignal.throwIfAborted();
104
+ const markdownInfo = await getCodeBlockMarkdownInfo({
105
+ ...options,
106
+ noteContent: content
107
+ });
108
+ if (!markdownInfo) {
109
+ throw new Error("Could not uniquely identify the code block.");
110
+ }
111
+ let oldCodeBlock = content.slice(markdownInfo.notePos.start.offset, markdownInfo.notePos.end.offset);
112
+ if (options.shouldPreserveLinePrefix) {
113
+ oldCodeBlock = unindent(oldCodeBlock, markdownInfo.linePrefix);
114
+ }
115
+ let newCodeBlock = await resolveValue(codeBlockProvider, abortSignal, oldCodeBlock);
116
+ if (newCodeBlock && options.shouldPreserveLinePrefix) {
117
+ newCodeBlock = indent(newCodeBlock, markdownInfo.linePrefix);
109
118
  }
110
- return replaceAll(content, sectionInfo.text, newSectionText);
119
+ const textBeforeCodeBlock = content.slice(0, markdownInfo.notePos.start.offset);
120
+ const textAfterCodeBlock = content.slice(markdownInfo.notePos.end.offset);
121
+ return `${appendNewLine(textBeforeCodeBlock)}${appendNewLine(newCodeBlock)}${textAfterCodeBlock}`;
111
122
  });
112
123
  }
113
124
  function appendNewLine(text) {
114
125
  return text === "" ? "" : `${text}
115
126
  `;
116
127
  }
117
- async function createApproximateSectionInfo(app, ctx) {
118
- const sourceFile = app.vault.getFileByPath(ctx.sourcePath);
119
- if (!sourceFile) {
120
- throw new Error(`Source file ${ctx.sourcePath} not found.`);
121
- }
128
+ function createApproximateSectionInfo(app, sourceFile, content) {
122
129
  const cache = app.metadataCache.getFileCache(sourceFile);
123
130
  const frontmatterEndOffset = cache?.frontmatterPosition?.end.offset;
124
- const content = await app.vault.cachedRead(sourceFile);
125
131
  const contentStartOffset = frontmatterEndOffset === void 0 ? getFrontMatterInfo(content).contentStart : frontmatterEndOffset + 1;
126
132
  const text = content.slice(contentStartOffset);
127
133
  return {
@@ -130,23 +136,40 @@ async function createApproximateSectionInfo(app, ctx) {
130
136
  text
131
137
  };
132
138
  }
133
- function createSectionInfoFromMatch(potentialCodeBlockText, match, approximateSectionInfo, sourceLines) {
139
+ function createMarkdownInfoFromMatch(potentialCodeBlockText, match, approximateSectionInfo, sourceLines, textLineOffsets, linesBeforeSectionCount) {
134
140
  const linePrefix = match.groups?.["LinePrefix"] ?? "";
135
141
  const codeBlockStartDelimiter = match.groups?.["CodeBlockStartDelimiter"] ?? "";
136
142
  const codeBlockEndDelimiter = match.groups?.["CodeBlockEndDelimiter"] ?? "";
137
- const codeBlockArgs = match.groups?.["CodeBlockArgs"] ?? "";
143
+ const codeBlockArgsStr = match.groups?.["CodeBlockArgs"] ?? "";
138
144
  const language = match.groups?.["CodeBlockLanguage"] ?? "";
139
145
  const previousText = potentialCodeBlockText.slice(0, match.index);
140
- const previousTextLines = previousText.split("\n");
146
+ const previousTextLinesCount = previousText.split("\n").length - 1;
147
+ const startLine = linesBeforeSectionCount + previousTextLinesCount;
148
+ const endLine = startLine + sourceLines.length + 1;
141
149
  return {
142
- args: codeBlockArgs,
150
+ args: codeBlockArgsStr.split(/\s+/).filter(Boolean),
143
151
  endDelimiter: codeBlockEndDelimiter,
144
152
  language,
145
- lineEnd: previousTextLines.length + sourceLines.length,
146
- lineStart: previousTextLines.length - 1,
147
- prefix: linePrefix,
148
- startDelimiter: codeBlockStartDelimiter,
149
- text: approximateSectionInfo.text
153
+ linePrefix,
154
+ notePos: {
155
+ end: {
156
+ col: (textLineOffsets.get(endLine + 1) ?? 0) - (textLineOffsets.get(endLine) ?? 0) - 1,
157
+ line: endLine,
158
+ offset: (textLineOffsets.get(endLine + 1) ?? 0) - 1
159
+ },
160
+ start: {
161
+ col: 0,
162
+ line: startLine,
163
+ offset: textLineOffsets.get(startLine) ?? 0
164
+ }
165
+ },
166
+ rawArgsStr: codeBlockArgsStr,
167
+ sectionInfo: {
168
+ lineEnd: previousTextLinesCount + sourceLines.length + 1,
169
+ lineStart: previousTextLinesCount,
170
+ text: approximateSectionInfo.text
171
+ },
172
+ startDelimiter: codeBlockStartDelimiter
150
173
  };
151
174
  }
152
175
  function getLanguageFromElement(el) {
@@ -183,10 +206,10 @@ function isSuitableCodeBlock(match, language, source, isInCallout) {
183
206
  return cleanCodeBlockContent === source;
184
207
  }
185
208
  export {
186
- getCodeBlockSectionInfo,
209
+ getCodeBlockMarkdownInfo,
187
210
  insertAfterCodeBlock,
188
211
  insertBeforeCodeBlock,
189
212
  removeCodeBlock,
190
213
  replaceCodeBlock
191
214
  };
192
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL01hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIGNvZGUgYmxvY2tzIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LFxuICBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvblxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldEZyb250TWF0dGVySW5mbyB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBWYWx1ZVByb3ZpZGVyIH0gZnJvbSAnLi4vVmFsdWVQcm92aWRlci50cyc7XG5cbmltcG9ydCB7IGFib3J0U2lnbmFsTmV2ZXIgfSBmcm9tICcuLi9BYm9ydENvbnRyb2xsZXIudHMnO1xuaW1wb3J0IHtcbiAgaGFzU2luZ2xlT2NjdXJyZW5jZSxcbiAgaW5kZW50LFxuICByZXBsYWNlQWxsLFxuICB1bmluZGVudFxufSBmcm9tICcuLi9TdHJpbmcudHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVZhbHVlIH0gZnJvbSAnLi4vVmFsdWVQcm92aWRlci50cyc7XG5pbXBvcnQgeyBwcm9jZXNzIH0gZnJvbSAnLi9WYXVsdC50cyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYSBjb2RlIGJsb2NrIGluIGEgTWFya2Rvd24gc2VjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlQmxvY2tNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbiBleHRlbmRzIE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBhcmd1bWVudHMgb2YgdGhlIGNvZGUgYmxvY2suXG4gICAqL1xuICBhcmdzOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbmQgZGVsaW1pdGVyIG9mIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgZW5kRGVsaW1pdGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSBvZiB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIGxhbmd1YWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmVmaXggb2YgdGhlIGNvZGUgYmxvY2suXG4gICAqL1xuICBwcmVmaXg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN0YXJ0IGRlbGltaXRlciBvZiB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIHN0YXJ0RGVsaW1pdGVyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgb3B0aW9ucyBmb3IgZ2V0dGluZyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYSBjb2RlIGJsb2NrIGluIGEgTWFya2Rvd24gc2VjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRDb2RlQmxvY2tTZWN0aW9uSW5mb09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIEFwcCBvYmplY3QuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQgb2JqZWN0LlxuICAgKi9cbiAgY3R4OiBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBUaGUgSFRNTEVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgZWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIG9mIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgc291cmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgb3B0aW9ucyBmb3IgaW5zZXJ0aW5nIHRleHQgYWZ0ZXIgYSBjb2RlIGJsb2NrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydENvZGVCbG9ja09wdGlvbnMgZXh0ZW5kcyBHZXRDb2RlQmxvY2tTZWN0aW9uSW5mb09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBsaW5lcyB0byBvZmZzZXQgdGhlIGluc2VydGlvbiBieS4gRGVmYXVsdCBpcyBgMGAuXG4gICAqL1xuICBsaW5lT2Zmc2V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXNlcnZlIHRoZSBsaW5lIHByZWZpeCBvZiB0aGUgY29kZSBibG9jay4gRGVmYXVsdCBpcyBgZmFsc2VgLlxuICAgKi9cbiAgc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHRleHQgdG8gaW5zZXJ0IGFmdGVyIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIG9wdGlvbnMgZm9yIHJlcGxhY2luZyBhIGNvZGUgYmxvY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwbGFjZUNvZGVCbG9ja09wdGlvbnMgZXh0ZW5kcyBHZXRDb2RlQmxvY2tTZWN0aW9uSW5mb09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogVGhlIHByb3ZpZGVyIHRoYXQgcHJvdmlkZXMgdGhlIG5ldyBjb2RlIGJsb2NrLlxuICAgKi9cbiAgY29kZUJsb2NrUHJvdmlkZXI6IFZhbHVlUHJvdmlkZXI8c3RyaW5nLCBbc3RyaW5nXT47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJlc2VydmUgdGhlIGxpbmUgcHJlZml4IG9mIHRoZSBjb2RlIGJsb2NrLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAqL1xuICBzaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXg/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgY29kZSBibG9jayBpbiBhIE1hcmtkb3duIHNlY3Rpb24uXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgVGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlIGJsb2NrIGluIHRoZSBNYXJrZG93biBzZWN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29kZUJsb2NrU2VjdGlvbkluZm8ob3B0aW9uczogR2V0Q29kZUJsb2NrU2VjdGlvbkluZm9PcHRpb25zKTogUHJvbWlzZTxDb2RlQmxvY2tNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbiB8IG51bGw+IHtcbiAgY29uc3QgeyBhcHAsIGN0eCwgZWwsIHNvdXJjZSB9ID0gb3B0aW9ucztcblxuICBjb25zdCBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvID0gY3R4LmdldFNlY3Rpb25JbmZvKGVsKSA/PyBhd2FpdCBjcmVhdGVBcHByb3hpbWF0ZVNlY3Rpb25JbmZvKGFwcCwgY3R4KTtcbiAgY29uc3QgaXNJbkNhbGxvdXQgPSAhIWVsLnBhcmVudEVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucygnY2FsbG91dC1jb250ZW50Jyk7XG5cbiAgY29uc3QgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZUZyb21FbGVtZW50KGVsKTtcbiAgY29uc3Qgc291cmNlTGluZXMgPSBzb3VyY2Uuc3BsaXQoJ1xcbicpO1xuXG4gIGNvbnN0IHRleHRMaW5lcyA9IGFwcHJveGltYXRlU2VjdGlvbkluZm8udGV4dC5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IHBvdGVudGlhbENvZGVCbG9ja1RleHRMaW5lcyA9IHRleHRMaW5lcy5tYXAoKGxpbmUsIGluZGV4KSA9PlxuICAgIGFwcHJveGltYXRlU2VjdGlvbkluZm8ubGluZVN0YXJ0IDw9IGluZGV4ICYmIGluZGV4IDw9IGFwcHJveGltYXRlU2VjdGlvbkluZm8ubGluZUVuZCA/IGxpbmUgOiAnJ1xuICApO1xuICBjb25zdCBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0ID0gcG90ZW50aWFsQ29kZUJsb2NrVGV4dExpbmVzLmpvaW4oJ1xcbicpO1xuXG4gIGNvbnN0IFJFR19FWFAgPVxuICAgIC8oPzw9XnxcXG4pKD88TGluZVByZWZpeD4gezAsM30oPzo+IHsxLDN9KSopKD88Q29kZUJsb2NrU3RhcnREZWxpbWl0ZXI+KD88Q29kZUJsb2NrU3RhcnREZWxpbWl0ZXJDaGFyPltgfl0pKD86XFxrPENvZGVCbG9ja1N0YXJ0RGVsaW1pdGVyQ2hhcj57Mix9KSkoPzxDb2RlQmxvY2tMYW5ndWFnZT5cXFMqKSg/OlsgXFx0XSsoPzxDb2RlQmxvY2tBcmdzPi4qPylbIFxcdF0rKT8oPzpcXG4oPzxDb2RlQmxvY2tDb250ZW50Pig/Olxcbj9cXGs8TGluZVByZWZpeD4uKikrPykpP1xcblxcazxMaW5lUHJlZml4Pig/PENvZGVCbG9ja0VuZERlbGltaXRlcj5cXGs8Q29kZUJsb2NrU3RhcnREZWxpbWl0ZXI+XFxrPENvZGVCbG9ja1N0YXJ0RGVsaW1pdGVyQ2hhcj4qKVsgXFx0XSooPzpcXG58JCkvZztcblxuICBsZXQgc2VjdGlvbkluZm86IENvZGVCbG9ja01hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgZm9yIChjb25zdCBtYXRjaCBvZiBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0Lm1hdGNoQWxsKFJFR19FWFApKSB7XG4gICAgaWYgKCFpc1N1aXRhYmxlQ29kZUJsb2NrKG1hdGNoLCBsYW5ndWFnZSwgc291cmNlLCBpc0luQ2FsbG91dCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChzZWN0aW9uSW5mbykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc2VjdGlvbkluZm8gPSBjcmVhdGVTZWN0aW9uSW5mb0Zyb21NYXRjaChwb3RlbnRpYWxDb2RlQmxvY2tUZXh0LCBtYXRjaCwgYXBwcm94aW1hdGVTZWN0aW9uSW5mbywgc291cmNlTGluZXMpO1xuICB9XG5cbiAgaWYgKCFzZWN0aW9uSW5mbykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHNlY3Rpb25JbmZvO1xufVxuXG4vKipcbiAqIEluc2VydHMgdGV4dCBhZnRlciB0aGUgY29kZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnNlcnRBZnRlckNvZGVCbG9jayhvcHRpb25zOiBJbnNlcnRDb2RlQmxvY2tPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgYXBwLCBjdHgsIGxpbmVPZmZzZXQgPSAwLCB0ZXh0IH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHNlY3Rpb25JbmZvID0gYXdhaXQgZ2V0Q29kZUJsb2NrU2VjdGlvbkluZm8ob3B0aW9ucyk7XG4gIGlmICghc2VjdGlvbkluZm8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCB1bmlxdWVseSBpZGVudGlmeSB0aGUgY29kZSBibG9jay4nKTtcbiAgfVxuXG4gIGF3YWl0IHByb2Nlc3MoYXBwLCBjdHguc291cmNlUGF0aCwgKF9hYm9ydFNpZ25hbCwgY29udGVudCkgPT4ge1xuICAgIGlmICghaGFzU2luZ2xlT2NjdXJyZW5jZShjb250ZW50LCBzZWN0aW9uSW5mby50ZXh0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdWx0aXBsZSBzdWl0YWJsZSBjb2RlIGJsb2NrcyBmb3VuZC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZihzZWN0aW9uSW5mby50ZXh0KTtcbiAgICBjb25zdCB0ZXh0QmVmb3JlU2VjdGlvbiA9IGNvbnRlbnQuc2xpY2UoMCwgaW5kZXgpO1xuICAgIGNvbnN0IGxpbmVzQmVmb3JlU2VjdGlvbiA9IHRleHRCZWZvcmVTZWN0aW9uLnNwbGl0KCdcXG4nKTtcbiAgICBjb25zdCBpbnNlcnRMaW5lSW5kZXggPSBsaW5lc0JlZm9yZVNlY3Rpb24ubGVuZ3RoICsgc2VjdGlvbkluZm8ubGluZUVuZCArIGxpbmVPZmZzZXQ7XG4gICAgcmV0dXJuIGluc2VydFRleHQoY29udGVudCwgaW5zZXJ0TGluZUluZGV4LCB0ZXh0LCBvcHRpb25zLnNob3VsZFByZXNlcnZlTGluZVByZWZpeCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEluc2VydHMgdGV4dCBiZWZvcmUgdGhlIGNvZGUgYmxvY2suXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zZXJ0QmVmb3JlQ29kZUJsb2NrKG9wdGlvbnM6IEluc2VydENvZGVCbG9ja09wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhcHAsIGN0eCwgbGluZU9mZnNldCA9IDAsIHRleHQgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3Qgc2VjdGlvbkluZm8gPSBhd2FpdCBnZXRDb2RlQmxvY2tTZWN0aW9uSW5mbyhvcHRpb25zKTtcbiAgaWYgKCFzZWN0aW9uSW5mbykge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBjb2RlIGJsb2NrLicpO1xuICB9XG5cbiAgYXdhaXQgcHJvY2VzcyhhcHAsIGN0eC5zb3VyY2VQYXRoLCAoX2Fib3J0U2lnbmFsLCBjb250ZW50KSA9PiB7XG4gICAgaWYgKCFoYXNTaW5nbGVPY2N1cnJlbmNlKGNvbnRlbnQsIHNlY3Rpb25JbmZvLnRleHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ011bHRpcGxlIHN1aXRhYmxlIGNvZGUgYmxvY2tzIGZvdW5kLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHNlY3Rpb25JbmZvLnRleHQpO1xuICAgIGNvbnN0IHRleHRCZWZvcmVTZWN0aW9uID0gY29udGVudC5zbGljZSgwLCBpbmRleCk7XG4gICAgY29uc3QgbGluZXNCZWZvcmVTZWN0aW9uID0gdGV4dEJlZm9yZVNlY3Rpb24uc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IGluc2VydExpbmVJbmRleCA9IGxpbmVzQmVmb3JlU2VjdGlvbi5sZW5ndGggKyBzZWN0aW9uSW5mby5saW5lU3RhcnQgLSBsaW5lT2Zmc2V0IC0gMTtcbiAgICByZXR1cm4gaW5zZXJ0VGV4dChjb250ZW50LCBpbnNlcnRMaW5lSW5kZXgsIHRleHQsIG9wdGlvbnMuc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4KTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgY29kZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVDb2RlQmxvY2sob3B0aW9uczogR2V0Q29kZUJsb2NrU2VjdGlvbkluZm9PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlcGxhY2VDb2RlQmxvY2soe1xuICAgIC4uLm9wdGlvbnMsXG4gICAgY29kZUJsb2NrUHJvdmlkZXI6ICcnXG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2VzIHRoZSBjb2RlIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VDb2RlQmxvY2sob3B0aW9uczogUmVwbGFjZUNvZGVCbG9ja09wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhcHAsIGNvZGVCbG9ja1Byb3ZpZGVyLCBjdHggfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgYWJvcnRTaWduYWwgPSBvcHRpb25zLmFib3J0U2lnbmFsID8/IGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBjb25zdCBzZWN0aW9uSW5mbyA9IGF3YWl0IGdldENvZGVCbG9ja1NlY3Rpb25JbmZvKG9wdGlvbnMpO1xuICBpZiAoIXNlY3Rpb25JbmZvKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGNvZGUgYmxvY2suJyk7XG4gIH1cblxuICBjb25zdCBsaW5lcyA9IHNlY3Rpb25JbmZvLnRleHQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCB0ZXh0QmVmb3JlQ29kZUJsb2NrID0gbGluZXMuc2xpY2UoMCwgc2VjdGlvbkluZm8ubGluZVN0YXJ0KS5qb2luKCdcXG4nKTtcbiAgbGV0IG9sZENvZGVCbG9jayA9IGxpbmVzLnNsaWNlKHNlY3Rpb25JbmZvLmxpbmVTdGFydCwgc2VjdGlvbkluZm8ubGluZUVuZCArIDEpLmpvaW4oJ1xcbicpO1xuICBpZiAob3B0aW9ucy5zaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXgpIHtcbiAgICBvbGRDb2RlQmxvY2sgPSB1bmluZGVudChvbGRDb2RlQmxvY2ssIHNlY3Rpb25JbmZvLnByZWZpeCk7XG4gIH1cbiAgY29uc3QgdGV4dEFmdGVyQ29kZUJsb2NrID0gbGluZXMuc2xpY2Uoc2VjdGlvbkluZm8ubGluZUVuZCArIDEpLmpvaW4oJ1xcbicpO1xuICBsZXQgbmV3Q29kZUJsb2NrID0gYXdhaXQgcmVzb2x2ZVZhbHVlKGNvZGVCbG9ja1Byb3ZpZGVyLCBhYm9ydFNpZ25hbCwgb2xkQ29kZUJsb2NrKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBpZiAobmV3Q29kZUJsb2NrICYmIG9wdGlvbnMuc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4KSB7XG4gICAgbmV3Q29kZUJsb2NrID0gaW5kZW50KG5ld0NvZGVCbG9jaywgc2VjdGlvbkluZm8ucHJlZml4KTtcbiAgfVxuXG4gIGNvbnN0IG5ld1NlY3Rpb25UZXh0ID0gYCR7YXBwZW5kTmV3TGluZSh0ZXh0QmVmb3JlQ29kZUJsb2NrKX0ke2FwcGVuZE5ld0xpbmUobmV3Q29kZUJsb2NrKX0ke3RleHRBZnRlckNvZGVCbG9ja31gO1xuICBhd2FpdCBwcm9jZXNzKGFwcCwgY3R4LnNvdXJjZVBhdGgsIChfYWJvcnRTaWduYWwsIGNvbnRlbnQpID0+IHtcbiAgICBpZiAoIWhhc1NpbmdsZU9jY3VycmVuY2UoY29udGVudCwgc2VjdGlvbkluZm8udGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVsdGlwbGUgc3VpdGFibGUgY29kZSBibG9ja3MgZm91bmQuJyk7XG4gICAgfVxuICAgIHJldHVybiByZXBsYWNlQWxsKGNvbnRlbnQsIHNlY3Rpb25JbmZvLnRleHQsIG5ld1NlY3Rpb25UZXh0KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZE5ld0xpbmUodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQgPT09ICcnID8gJycgOiBgJHt0ZXh0fVxcbmA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFwcHJveGltYXRlU2VjdGlvbkluZm8oYXBwOiBBcHAsIGN0eDogTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCk6IFByb21pc2U8TWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb24+IHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IGFwcC52YXVsdC5nZXRGaWxlQnlQYXRoKGN0eC5zb3VyY2VQYXRoKTtcbiAgaWYgKCFzb3VyY2VGaWxlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTb3VyY2UgZmlsZSAke2N0eC5zb3VyY2VQYXRofSBub3QgZm91bmQuYCk7XG4gIH1cbiAgY29uc3QgY2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoc291cmNlRmlsZSk7XG4gIGNvbnN0IGZyb250bWF0dGVyRW5kT2Zmc2V0ID0gY2FjaGU/LmZyb250bWF0dGVyUG9zaXRpb24/LmVuZC5vZmZzZXQ7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQuY2FjaGVkUmVhZChzb3VyY2VGaWxlKTtcbiAgY29uc3QgY29udGVudFN0YXJ0T2Zmc2V0ID0gZnJvbnRtYXR0ZXJFbmRPZmZzZXQgPT09IHVuZGVmaW5lZCA/IGdldEZyb250TWF0dGVySW5mbyhjb250ZW50KS5jb250ZW50U3RhcnQgOiBmcm9udG1hdHRlckVuZE9mZnNldCArIDE7XG4gIGNvbnN0IHRleHQgPSBjb250ZW50LnNsaWNlKGNvbnRlbnRTdGFydE9mZnNldCk7XG4gIHJldHVybiB7XG4gICAgbGluZUVuZDogdGV4dC5zcGxpdCgnXFxuJykubGVuZ3RoIC0gMSxcbiAgICBsaW5lU3RhcnQ6IDAsXG4gICAgdGV4dFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTZWN0aW9uSW5mb0Zyb21NYXRjaChcbiAgcG90ZW50aWFsQ29kZUJsb2NrVGV4dDogc3RyaW5nLFxuICBtYXRjaDogUmVnRXhwTWF0Y2hBcnJheSxcbiAgYXBwcm94aW1hdGVTZWN0aW9uSW5mbzogTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb24sXG4gIHNvdXJjZUxpbmVzOiBzdHJpbmdbXVxuKTogQ29kZUJsb2NrTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb24ge1xuICBjb25zdCBsaW5lUHJlZml4ID0gbWF0Y2guZ3JvdXBzPy5bJ0xpbmVQcmVmaXgnXSA/PyAnJztcbiAgY29uc3QgY29kZUJsb2NrU3RhcnREZWxpbWl0ZXIgPSBtYXRjaC5ncm91cHM/LlsnQ29kZUJsb2NrU3RhcnREZWxpbWl0ZXInXSA/PyAnJztcbiAgY29uc3QgY29kZUJsb2NrRW5kRGVsaW1pdGVyID0gbWF0Y2guZ3JvdXBzPy5bJ0NvZGVCbG9ja0VuZERlbGltaXRlciddID8/ICcnO1xuICBjb25zdCBjb2RlQmxvY2tBcmdzID0gbWF0Y2guZ3JvdXBzPy5bJ0NvZGVCbG9ja0FyZ3MnXSA/PyAnJztcbiAgY29uc3QgbGFuZ3VhZ2UgPSBtYXRjaC5ncm91cHM/LlsnQ29kZUJsb2NrTGFuZ3VhZ2UnXSA/PyAnJztcblxuICBjb25zdCBwcmV2aW91c1RleHQgPSBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0LnNsaWNlKDAsIG1hdGNoLmluZGV4KTtcbiAgY29uc3QgcHJldmlvdXNUZXh0TGluZXMgPSBwcmV2aW91c1RleHQuc3BsaXQoJ1xcbicpO1xuXG4gIHJldHVybiB7XG4gICAgYXJnczogY29kZUJsb2NrQXJncyxcbiAgICBlbmREZWxpbWl0ZXI6IGNvZGVCbG9ja0VuZERlbGltaXRlcixcbiAgICBsYW5ndWFnZSxcbiAgICBsaW5lRW5kOiBwcmV2aW91c1RleHRMaW5lcy5sZW5ndGggKyBzb3VyY2VMaW5lcy5sZW5ndGgsXG4gICAgbGluZVN0YXJ0OiBwcmV2aW91c1RleHRMaW5lcy5sZW5ndGggLSAxLFxuICAgIHByZWZpeDogbGluZVByZWZpeCxcbiAgICBzdGFydERlbGltaXRlcjogY29kZUJsb2NrU3RhcnREZWxpbWl0ZXIsXG4gICAgdGV4dDogYXBwcm94aW1hdGVTZWN0aW9uSW5mby50ZXh0XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldExhbmd1YWdlRnJvbUVsZW1lbnQoZWw6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgY29uc3QgQkxPQ0tfTEFOR1VBR0VfUFJFRklYID0gJ2Jsb2NrLWxhbmd1YWdlLSc7XG4gIHJldHVybiBBcnJheS5mcm9tKGVsLmNsYXNzTGlzdCkuZmluZCgoY2xzKSA9PiBjbHMuc3RhcnRzV2l0aChCTE9DS19MQU5HVUFHRV9QUkVGSVgpKT8uc2xpY2UoQkxPQ0tfTEFOR1VBR0VfUFJFRklYLmxlbmd0aCkgPz8gJyc7XG59XG5cbmZ1bmN0aW9uIGluc2VydFRleHQoY29udGVudDogc3RyaW5nLCBpbnNlcnRMaW5lSW5kZXg6IG51bWJlciwgdGV4dDogc3RyaW5nLCBzaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXg/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgbmV3TGluZXMgPSBsaW5lcy5zbGljZSgpO1xuICBjb25zdCB0ZXh0TGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcblxuICBpZiAoaW5zZXJ0TGluZUluZGV4IDwgMCkge1xuICAgIGluc2VydExpbmVJbmRleCA9IDA7XG4gIH1cbiAgaWYgKGluc2VydExpbmVJbmRleCA+IGxpbmVzLmxlbmd0aCkge1xuICAgIGluc2VydExpbmVJbmRleCA9IGxpbmVzLmxlbmd0aDtcbiAgfVxuXG4gIGNvbnN0IFBSRUZJWF9MSU5FX1JFR19FWFAgPSAvXiB7MCwzfSg/Oj4gezEsM30pKi9nO1xuICBjb25zdCBtYXRjaCA9IChsaW5lc1tpbnNlcnRMaW5lSW5kZXhdID8/ICcnKS5tYXRjaChQUkVGSVhfTElORV9SRUdfRVhQKTtcbiAgY29uc3QgbGluZVByZWZpeCA9IG1hdGNoPy5bMF0gPz8gJyc7XG4gIG5ld0xpbmVzLnNwbGljZShpbnNlcnRMaW5lSW5kZXgsIDAsIC4uLihzaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXggPyB0ZXh0TGluZXMubWFwKChsaW5lKSA9PiBpbmRlbnQobGluZSwgbGluZVByZWZpeCkpIDogdGV4dExpbmVzKSk7XG4gIHJldHVybiBuZXdMaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gaXNTdWl0YWJsZUNvZGVCbG9jayhcbiAgbWF0Y2g6IFJlZ0V4cE1hdGNoQXJyYXksXG4gIGxhbmd1YWdlOiBzdHJpbmcsXG4gIHNvdXJjZTogc3RyaW5nLFxuICBpc0luQ2FsbG91dDogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvZGVCbG9ja0xhbmd1YWdlID0gbWF0Y2guZ3JvdXBzPy5bJ0NvZGVCbG9ja0xhbmd1YWdlJ10gPz8gJyc7XG4gIGlmIChjb2RlQmxvY2tMYW5ndWFnZSAhPT0gbGFuZ3VhZ2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBsaW5lUHJlZml4ID0gbWF0Y2guZ3JvdXBzPy5bJ0xpbmVQcmVmaXgnXSA/PyAnJztcblxuICBpZiAoaXNJbkNhbGxvdXQgJiYgIWxpbmVQcmVmaXguaW5jbHVkZXMoJz4gJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjb2RlQmxvY2tDb250ZW50ID0gbWF0Y2guZ3JvdXBzPy5bJ0NvZGVCbG9ja0NvbnRlbnQnXSA/PyAnJztcbiAgY29uc3QgY2xlYW5Db2RlQmxvY2tDb250ZW50ID0gY29kZUJsb2NrQ29udGVudC5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiBsaW5lLnNsaWNlKGxpbmVQcmVmaXgubGVuZ3RoKSkuam9pbignXFxuJyk7XG5cbiAgcmV0dXJuIGNsZWFuQ29kZUJsb2NrQ29udGVudCA9PT0gc291cmNlO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQVlBLFNBQVMsMEJBQTBCO0FBSW5DLFNBQVMsd0JBQXdCO0FBQ2pDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLG9CQUFvQjtBQUM3QixTQUFTLGVBQWU7QUF1R3hCLGVBQXNCLHdCQUF3QixTQUE4RjtBQUMxSSxRQUFNLEVBQUUsS0FBSyxLQUFLLElBQUksT0FBTyxJQUFJO0FBRWpDLFFBQU0seUJBQXlCLElBQUksZUFBZSxFQUFFLEtBQUssTUFBTSw2QkFBNkIsS0FBSyxHQUFHO0FBQ3BHLFFBQU0sY0FBYyxDQUFDLENBQUMsR0FBRyxlQUFlLFVBQVUsU0FBUyxpQkFBaUI7QUFFNUUsUUFBTSxXQUFXLHVCQUF1QixFQUFFO0FBQzFDLFFBQU0sY0FBYyxPQUFPLE1BQU0sSUFBSTtBQUVyQyxRQUFNLFlBQVksdUJBQXVCLEtBQUssTUFBTSxJQUFJO0FBQ3hELFFBQU0sOEJBQThCLFVBQVU7QUFBQSxJQUFJLENBQUMsTUFBTSxVQUN2RCx1QkFBdUIsYUFBYSxTQUFTLFNBQVMsdUJBQXVCLFVBQVUsT0FBTztBQUFBLEVBQ2hHO0FBQ0EsUUFBTSx5QkFBeUIsNEJBQTRCLEtBQUssSUFBSTtBQUVwRSxRQUFNLFVBQ0o7QUFFRixNQUFJLGNBQTBEO0FBRTlELGFBQVcs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
215
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL01hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIGNvZGUgYmxvY2tzIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LFxuICBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbixcbiAgUG9zLFxuICBURmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldEZyb250TWF0dGVySW5mbyB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBWYWx1ZVByb3ZpZGVyIH0gZnJvbSAnLi4vVmFsdWVQcm92aWRlci50cyc7XG5cbmltcG9ydCB7IGFib3J0U2lnbmFsQW55IH0gZnJvbSAnLi4vQWJvcnRDb250cm9sbGVyLnRzJztcbmltcG9ydCB7XG4gIGhhc1NpbmdsZU9jY3VycmVuY2UsXG4gIGluZGVudCxcbiAgdW5pbmRlbnRcbn0gZnJvbSAnLi4vU3RyaW5nLnRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJy4uL1ZhbHVlUHJvdmlkZXIudHMnO1xuaW1wb3J0IHsgcHJvY2VzcyB9IGZyb20gJy4vVmF1bHQudHMnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgY29kZSBibG9jayBpbiBhIE1hcmtkb3duIHNlY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUJsb2NrTWFya2Rvd25JbmZvcm1hdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgYXJndW1lbnRzIG9mIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgYXJnczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBlbmQgZGVsaW1pdGVyIG9mIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgZW5kRGVsaW1pdGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSBvZiB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIGxhbmd1YWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIHByZWZpeCBvZiBlYWNoIGxpbmUgb2YgdGhlIGNvZGUgYmxvY2suXG4gICAqL1xuICBsaW5lUHJlZml4OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgY29kZSBibG9jayBpbiB0aGUgbm90ZS5cbiAgICovXG4gIG5vdGVQb3M6IFBvcztcblxuICAvKipcbiAgICogVGhlIHJhdyBhcmd1bWVudHMgc3RyaW5nIG9mIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgcmF3QXJnc1N0cjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VjdGlvbiBpbmZvcm1hdGlvbiBvZiB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIHNlY3Rpb25JbmZvOiBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbjtcblxuICAvKipcbiAgICogVGhlIHN0YXJ0IGRlbGltaXRlciBvZiB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIHN0YXJ0RGVsaW1pdGVyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgb3B0aW9ucyBmb3IgZ2V0dGluZyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYSBjb2RlIGJsb2NrIGluIGEgTWFya2Rvd24gc2VjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRDb2RlQmxvY2tTZWN0aW9uSW5mb09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIEFwcCBvYmplY3QuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQgb2JqZWN0LlxuICAgKi9cbiAgY3R4OiBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBUaGUgSFRNTEVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgZWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgbm90ZS5cbiAgICovXG4gIG5vdGVDb250ZW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIG9mIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgc291cmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgb3B0aW9ucyBmb3IgaW5zZXJ0aW5nIHRleHQgYWZ0ZXIgYSBjb2RlIGJsb2NrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydENvZGVCbG9ja09wdGlvbnMgZXh0ZW5kcyBHZXRDb2RlQmxvY2tTZWN0aW9uSW5mb09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBsaW5lcyB0byBvZmZzZXQgdGhlIGluc2VydGlvbiBieS4gRGVmYXVsdCBpcyBgMGAuXG4gICAqL1xuICBsaW5lT2Zmc2V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXNlcnZlIHRoZSBsaW5lIHByZWZpeCBvZiB0aGUgY29kZSBibG9jay4gRGVmYXVsdCBpcyBgZmFsc2VgLlxuICAgKi9cbiAgc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHRleHQgdG8gaW5zZXJ0IGFmdGVyIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIG9wdGlvbnMgZm9yIHJlcGxhY2luZyBhIGNvZGUgYmxvY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwbGFjZUNvZGVCbG9ja09wdGlvbnMgZXh0ZW5kcyBHZXRDb2RlQmxvY2tTZWN0aW9uSW5mb09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogVGhlIHByb3ZpZGVyIHRoYXQgcHJvdmlkZXMgdGhlIG5ldyBjb2RlIGJsb2NrLlxuICAgKi9cbiAgY29kZUJsb2NrUHJvdmlkZXI6IFZhbHVlUHJvdmlkZXI8c3RyaW5nLCBbc3RyaW5nXT47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJlc2VydmUgdGhlIGxpbmUgcHJlZml4IG9mIHRoZSBjb2RlIGJsb2NrLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAqL1xuICBzaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXg/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgY29kZSBibG9jayBpbiBhIE1hcmtkb3duIHNlY3Rpb24uXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgVGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlIGJsb2NrIGluIHRoZSBNYXJrZG93biBzZWN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvKG9wdGlvbnM6IEdldENvZGVCbG9ja1NlY3Rpb25JbmZvT3B0aW9ucyk6IFByb21pc2U8Q29kZUJsb2NrTWFya2Rvd25JbmZvcm1hdGlvbiB8IG51bGw+IHtcbiAgY29uc3QgeyBhcHAsIGN0eCwgZWwsIHNvdXJjZSB9ID0gb3B0aW9ucztcblxuICBjb25zdCBzb3VyY2VGaWxlID0gYXBwLnZhdWx0LmdldEZpbGVCeVBhdGgoY3R4LnNvdXJjZVBhdGgpO1xuICBpZiAoIXNvdXJjZUZpbGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBmaWxlICR7Y3R4LnNvdXJjZVBhdGh9IG5vdCBmb3VuZC5gKTtcbiAgfVxuICBjb25zdCBjb250ZW50ID0gb3B0aW9ucy5ub3RlQ29udGVudCA/PyBhd2FpdCBhcHAudmF1bHQuY2FjaGVkUmVhZChzb3VyY2VGaWxlKTtcblxuICBjb25zdCBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvID0gY3R4LmdldFNlY3Rpb25JbmZvKGVsKSA/PyBjcmVhdGVBcHByb3hpbWF0ZVNlY3Rpb25JbmZvKGFwcCwgc291cmNlRmlsZSwgY29udGVudCk7XG5cbiAgaWYgKCFoYXNTaW5nbGVPY2N1cnJlbmNlKGNvbnRlbnQsIGFwcHJveGltYXRlU2VjdGlvbkluZm8udGV4dCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHNlY3Rpb25PZmZzZXQgPSBjb250ZW50LmluZGV4T2YoYXBwcm94aW1hdGVTZWN0aW9uSW5mby50ZXh0KTtcbiAgY29uc3QgbGluZXNCZWZvcmVTZWN0aW9uQ291bnQgPSBjb250ZW50LnNsaWNlKDAsIHNlY3Rpb25PZmZzZXQpLnNwbGl0KCdcXG4nKS5sZW5ndGggLSAxO1xuXG4gIGNvbnN0IGlzSW5DYWxsb3V0ID0gISFlbC5wYXJlbnRFbGVtZW50Py5jbGFzc0xpc3QuY29udGFpbnMoJ2NhbGxvdXQtY29udGVudCcpO1xuXG4gIGNvbnN0IGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2VGcm9tRWxlbWVudChlbCk7XG4gIGNvbnN0IHNvdXJjZUxpbmVzID0gc291cmNlLnNwbGl0KCdcXG4nKTtcblxuICBjb25zdCB0ZXh0TGluZXMgPSBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLnRleHQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCB0ZXh0TGluZU9mZnNldHMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICB0ZXh0TGluZU9mZnNldHMuc2V0KGxpbmVzQmVmb3JlU2VjdGlvbkNvdW50LCBzZWN0aW9uT2Zmc2V0KTtcblxuICBsZXQgbGFzdFRleHRMaW5lT2Zmc2V0ID0gc2VjdGlvbk9mZnNldDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0TGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0ZXh0TGluZSA9IHRleHRMaW5lc1tpXTtcbiAgICBjb25zdCBsaW5lID0gdGV4dExpbmUgPz8gJyc7XG4gICAgY29uc3QgbGluZU9mZnNldCA9IGxhc3RUZXh0TGluZU9mZnNldCArIGxpbmUubGVuZ3RoICsgMTtcbiAgICB0ZXh0TGluZU9mZnNldHMuc2V0KGxpbmVzQmVmb3JlU2VjdGlvbkNvdW50ICsgaSArIDEsIGxpbmVPZmZzZXQpO1xuICAgIGxhc3RUZXh0TGluZU9mZnNldCA9IGxpbmVPZmZzZXQ7XG4gIH1cblxuICBjb25zdCBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0TGluZXMgPSB0ZXh0TGluZXMubWFwKChsaW5lLCBpbmRleCkgPT5cbiAgICBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLmxpbmVTdGFydCA8PSBpbmRleCAmJiBpbmRleCA8PSBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLmxpbmVFbmQgPyBsaW5lIDogJydcbiAgKTtcbiAgY29uc3QgcG90ZW50aWFsQ29kZUJsb2NrVGV4dCA9IHBvdGVudGlhbENvZGVCbG9ja1RleHRMaW5lcy5qb2luKCdcXG4nKTtcblxuICBjb25zdCBSRUdfRVhQID1cbiAgICAvKD88PV58XFxuKSg/PExpbmVQcmVmaXg+IHswLDN9KD86PiB7MSwzfSkqKSg/PENvZGVCbG9ja1N0YXJ0RGVsaW1pdGVyPig/PENvZGVCbG9ja1N0YXJ0RGVsaW1pdGVyQ2hhcj5bYH5dKSg/OlxcazxDb2RlQmxvY2tTdGFydERlbGltaXRlckNoYXI+ezIsfSkpKD88Q29kZUJsb2NrTGFuZ3VhZ2U+XFxTKikoPzpbIFxcdF0oPzxDb2RlQmxvY2tBcmdzPi4qPykpPyg/Olxcbig/PENvZGVCbG9ja0NvbnRlbnQ+KD86XFxuP1xcazxMaW5lUHJlZml4Pi4qKSs/KSk/XFxuXFxrPExpbmVQcmVmaXg+KD88Q29kZUJsb2NrRW5kRGVsaW1pdGVyPlxcazxDb2RlQmxvY2tTdGFydERlbGltaXRlcj5cXGs8Q29kZUJsb2NrU3RhcnREZWxpbWl0ZXJDaGFyPiopWyBcXHRdKig/PVxcbnwkKS9nO1xuXG4gIGxldCBtYXJrZG93bkluZm86IENvZGVCbG9ja01hcmtkb3duSW5mb3JtYXRpb24gfCBudWxsID0gbnVsbDtcblxuICBmb3IgKGNvbnN0IG1hdGNoIG9mIHBvdGVudGlhbENvZGVCbG9ja1RleHQubWF0Y2hBbGwoUkVHX0VYUCkpIHtcbiAgICBpZiAoIWlzU3VpdGFibGVDb2RlQmxvY2sobWF0Y2gsIGxhbmd1YWdlLCBzb3VyY2UsIGlzSW5DYWxsb3V0KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duSW5mbykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbWFya2Rvd25JbmZvID0gY3JlYXRlTWFya2Rvd25JbmZvRnJvbU1hdGNoKHBvdGVudGlhbENvZGVCbG9ja1RleHQsIG1hdGNoLCBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvLCBzb3VyY2VMaW5lcywgdGV4dExpbmVPZmZzZXRzLCBsaW5lc0JlZm9yZVNlY3Rpb25Db3VudCk7XG4gIH1cblxuICBpZiAoIW1hcmtkb3duSW5mbykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIG1hcmtkb3duSW5mbztcbn1cblxuLyoqXG4gKiBJbnNlcnRzIHRleHQgYWZ0ZXIgdGhlIGNvZGUgYmxvY2suXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zZXJ0QWZ0ZXJDb2RlQmxvY2sob3B0aW9uczogSW5zZXJ0Q29kZUJsb2NrT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFwcCwgY3R4LCBsaW5lT2Zmc2V0ID0gMCwgdGV4dCB9ID0gb3B0aW9ucztcblxuICBhd2FpdCBwcm9jZXNzKGFwcCwgY3R4LnNvdXJjZVBhdGgsIGFzeW5jIChfYWJvcnRTaWduYWwsIGNvbnRlbnQpID0+IHtcbiAgICBjb25zdCBtYXJrZG93bkluZm8gPSBhd2FpdCBnZXRDb2RlQmxvY2tNYXJrZG93bkluZm8oe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG5vdGVDb250ZW50OiBjb250ZW50XG4gICAgfSk7XG4gICAgaWYgKCFtYXJrZG93bkluZm8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBjb2RlIGJsb2NrLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGluc2VydExpbmVJbmRleCA9IG1hcmtkb3duSW5mby5ub3RlUG9zLmVuZC5saW5lICsgbGluZU9mZnNldCArIDE7XG4gICAgcmV0dXJuIGluc2VydFRleHQoY29udGVudCwgaW5zZXJ0TGluZUluZGV4LCB0ZXh0LCBvcHRpb25zLnNob3VsZFByZXNlcnZlTGluZVByZWZpeCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEluc2VydHMgdGV4dCBiZWZvcmUgdGhlIGNvZGUgYmxvY2suXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zZXJ0QmVmb3JlQ29kZUJsb2NrKG9wdGlvbnM6IEluc2VydENvZGVCbG9ja09wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhcHAsIGN0eCwgbGluZU9mZnNldCA9IDAsIHRleHQgfSA9IG9wdGlvbnM7XG5cbiAgYXdhaXQgcHJvY2VzcyhhcHAsIGN0eC5zb3VyY2VQYXRoLCBhc3luYyAoX2Fib3J0U2lnbmFsLCBjb250ZW50KSA9PiB7XG4gICAgY29uc3QgbWFya2Rvd25JbmZvID0gYXdhaXQgZ2V0Q29kZUJsb2NrTWFya2Rvd25JbmZvKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBub3RlQ29udGVudDogY29udGVudFxuICAgIH0pO1xuICAgIGlmICghbWFya2Rvd25JbmZvKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCB1bmlxdWVseSBpZGVudGlmeSB0aGUgY29kZSBibG9jay4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnNlcnRMaW5lSW5kZXggPSBtYXJrZG93bkluZm8ubm90ZVBvcy5zdGFydC5saW5lIC0gbGluZU9mZnNldDtcbiAgICByZXR1cm4gaW5zZXJ0VGV4dChjb250ZW50LCBpbnNlcnRMaW5lSW5kZXgsIHRleHQsIG9wdGlvbnMuc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4KTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgY29kZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVDb2RlQmxvY2sob3B0aW9uczogR2V0Q29kZUJsb2NrU2VjdGlvbkluZm9PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlcGxhY2VDb2RlQmxvY2soe1xuICAgIC4uLm9wdGlvbnMsXG4gICAgY29kZUJsb2NrUHJvdmlkZXI6ICcnXG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2VzIHRoZSBjb2RlIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VDb2RlQmxvY2sob3B0aW9uczogUmVwbGFjZUNvZGVCbG9ja09wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhcHAsIGNvZGVCbG9ja1Byb3ZpZGVyLCBjdHggfSA9IG9wdGlvbnM7XG4gIG9wdGlvbnMuYWJvcnRTaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG5cbiAgYXdhaXQgcHJvY2VzcyhhcHAsIGN0eC5zb3VyY2VQYXRoLCBhc3luYyAoYWJvcnRTaWduYWwsIGNvbnRlbnQpID0+IHtcbiAgICBhYm9ydFNpZ25hbCA9IGFib3J0U2lnbmFsQW55KGFib3J0U2lnbmFsLCBvcHRpb25zLmFib3J0U2lnbmFsKTtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGNvbnN0IG1hcmtkb3duSW5mbyA9IGF3YWl0IGdldENvZGVCbG9ja01hcmtkb3duSW5mbyh7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbm90ZUNvbnRlbnQ6IGNvbnRlbnRcbiAgICB9KTtcbiAgICBpZiAoIW1hcmtkb3duSW5mbykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGNvZGUgYmxvY2suJyk7XG4gICAgfVxuXG4gICAgbGV0IG9sZENvZGVCbG9jayA9IGNvbnRlbnQuc2xpY2UobWFya2Rvd25JbmZvLm5vdGVQb3Muc3RhcnQub2Zmc2V0LCBtYXJrZG93bkluZm8ubm90ZVBvcy5lbmQub2Zmc2V0KTtcbiAgICBpZiAob3B0aW9ucy5zaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXgpIHtcbiAgICAgIG9sZENvZGVCbG9jayA9IHVuaW5kZW50KG9sZENvZGVCbG9jaywgbWFya2Rvd25JbmZvLmxpbmVQcmVmaXgpO1xuICAgIH1cblxuICAgIGxldCBuZXdDb2RlQmxvY2sgPSBhd2FpdCByZXNvbHZlVmFsdWUoY29kZUJsb2NrUHJvdmlkZXIsIGFib3J0U2lnbmFsLCBvbGRDb2RlQmxvY2spO1xuICAgIGlmIChuZXdDb2RlQmxvY2sgJiYgb3B0aW9ucy5zaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXgpIHtcbiAgICAgIG5ld0NvZGVCbG9jayA9IGluZGVudChuZXdDb2RlQmxvY2ssIG1hcmtkb3duSW5mby5saW5lUHJlZml4KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0QmVmb3JlQ29kZUJsb2NrID0gY29udGVudC5zbGljZSgwLCBtYXJrZG93bkluZm8ubm90ZVBvcy5zdGFydC5vZmZzZXQpO1xuICAgIGNvbnN0IHRleHRBZnRlckNvZGVCbG9jayA9IGNvbnRlbnQuc2xpY2UobWFya2Rvd25JbmZvLm5vdGVQb3MuZW5kLm9mZnNldCk7XG5cbiAgICByZXR1cm4gYCR7YXBwZW5kTmV3TGluZSh0ZXh0QmVmb3JlQ29kZUJsb2NrKX0ke2FwcGVuZE5ld0xpbmUobmV3Q29kZUJsb2NrKX0ke3RleHRBZnRlckNvZGVCbG9ja31gO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kTmV3TGluZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dCA9PT0gJycgPyAnJyA6IGAke3RleHR9XFxuYDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQXBwcm94aW1hdGVTZWN0aW9uSW5mbyhhcHA6IEFwcCwgc291cmNlRmlsZTogVEZpbGUsIGNvbnRlbnQ6IHN0cmluZyk6IE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uIHtcbiAgY29uc3QgY2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoc291cmNlRmlsZSk7XG4gIGNvbnN0IGZyb250bWF0dGVyRW5kT2Zmc2V0ID0gY2FjaGU/LmZyb250bWF0dGVyUG9zaXRpb24/LmVuZC5vZmZzZXQ7XG4gIGNvbnN0IGNvbnRlbnRTdGFydE9mZnNldCA9IGZyb250bWF0dGVyRW5kT2Zmc2V0ID09PSB1bmRlZmluZWQgPyBnZXRGcm9udE1hdHRlckluZm8oY29udGVudCkuY29udGVudFN0YXJ0IDogZnJvbnRtYXR0ZXJFbmRPZmZzZXQgKyAxO1xuICBjb25zdCB0ZXh0ID0gY29udGVudC5zbGljZShjb250ZW50U3RhcnRPZmZzZXQpO1xuICByZXR1cm4ge1xuICAgIGxpbmVFbmQ6IHRleHQuc3BsaXQoJ1xcbicpLmxlbmd0aCAtIDEsXG4gICAgbGluZVN0YXJ0OiAwLFxuICAgIHRleHRcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFya2Rvd25JbmZvRnJvbU1hdGNoKFxuICBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0OiBzdHJpbmcsXG4gIG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5LFxuICBhcHByb3hpbWF0ZVNlY3Rpb25JbmZvOiBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbixcbiAgc291cmNlTGluZXM6IHN0cmluZ1tdLFxuICB0ZXh0TGluZU9mZnNldHM6IE1hcDxudW1iZXIsIG51bWJlcj4sXG4gIGxpbmVzQmVmb3JlU2VjdGlvbkNvdW50OiBudW1iZXJcbik6IENvZGVCbG9ja01hcmtkb3duSW5mb3JtYXRpb24ge1xuICBjb25zdCBsaW5lUHJlZml4ID0gbWF0Y2guZ3JvdXBzPy5bJ0xpbmVQcmVmaXgnXSA/PyAnJztcbiAgY29uc3QgY29kZUJsb2NrU3RhcnREZWxpbWl0ZXIgPSBtYXRjaC5ncm91cHM/LlsnQ29kZUJsb2NrU3RhcnREZWxpbWl0ZXInXSA/PyAnJztcbiAgY29uc3QgY29kZUJsb2NrRW5kRGVsaW1pdGVyID0gbWF0Y2guZ3JvdXBzPy5bJ0NvZGVCbG9ja0VuZERlbGltaXRlciddID8/ICcnO1xuICBjb25zdCBjb2RlQmxvY2tBcmdzU3RyID0gbWF0Y2guZ3JvdXBzPy5bJ0NvZGVCbG9ja0FyZ3MnXSA/PyAnJztcbiAgY29uc3QgbGFuZ3VhZ2UgPSBtYXRjaC5ncm91cHM/LlsnQ29kZUJsb2NrTGFuZ3VhZ2UnXSA/PyAnJztcblxuICBjb25zdCBwcmV2aW91c1RleHQgPSBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0LnNsaWNlKDAsIG1hdGNoLmluZGV4KTtcbiAgY29uc3QgcHJldmlvdXNUZXh0TGluZXNDb3VudCA9IHByZXZpb3VzVGV4dC5zcGxpdCgnXFxuJykubGVuZ3RoIC0gMTtcblxuICBjb25zdCBzdGFydExpbmUgPSBsaW5lc0JlZm9yZVNlY3Rpb25Db3VudCArIHByZXZpb3VzVGV4dExpbmVzQ291bnQ7XG4gIGNvbnN0IGVuZExpbmUgPSBzdGFydExpbmUgKyBzb3VyY2VMaW5lcy5sZW5ndGggKyAxO1xuXG4gIHJldHVybiB7XG4gICAgYXJnczogY29kZUJsb2NrQXJnc1N0ci5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKSxcbiAgICBlbmREZWxpbWl0ZXI6IGNvZGVCbG9ja0VuZERlbGltaXRlcixcbiAgICBsYW5ndWFnZSxcbiAgICBsaW5lUHJlZml4LFxuICAgIG5vdGVQb3M6IHtcbiAgICAgIGVuZDoge1xuICAgICAgICBjb2w6ICh0ZXh0TGluZU9mZnNldHMuZ2V0KGVuZExpbmUgKyAxKSA/PyAwKSAtICh0ZXh0TGluZU9mZnNldHMuZ2V0KGVuZExpbmUpID8/IDApIC0gMSxcbiAgICAgICAgbGluZTogZW5kTGluZSxcbiAgICAgICAgb2Zmc2V0OiAodGV4dExpbmVPZmZzZXRzLmdldChlbmRMaW5lICsgMSkgPz8gMCkgLSAxXG4gICAgICB9LFxuICAgICAgc3RhcnQ6IHtcbiAgICAgICAgY29sOiAwLFxuICAgICAgICBsaW5lOiBzdGFydExpbmUsXG4gICAgICAgIG9mZnNldDogdGV4dExpbmVPZmZzZXRzLmdldChzdGFydExpbmUpID8/IDBcbiAgICAgIH1cbiAgICB9LFxuICAgIHJhd0FyZ3NTdHI6IGNvZGVCbG9ja0FyZ3NTdHIsXG4gICAgc2VjdGlvbkluZm86IHtcbiAgICAgIGxpbmVFbmQ6IHByZXZpb3VzVGV4dExpbmVzQ291bnQgKyBzb3VyY2VMaW5lcy5sZW5ndGggKyAxLFxuICAgICAgbGluZVN0YXJ0OiBwcmV2aW91c1RleHRMaW5lc0NvdW50LFxuICAgICAgdGV4dDogYXBwcm94aW1hdGVTZWN0aW9uSW5mby50ZXh0XG4gICAgfSxcbiAgICBzdGFydERlbGltaXRlcjogY29kZUJsb2NrU3RhcnREZWxpbWl0ZXJcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0TGFuZ3VhZ2VGcm9tRWxlbWVudChlbDogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xuICBjb25zdCBCTE9DS19MQU5HVUFHRV9QUkVGSVggPSAnYmxvY2stbGFuZ3VhZ2UtJztcbiAgcmV0dXJuIEFycmF5LmZyb20oZWwuY2xhc3NMaXN0KS5maW5kKChjbHMpID0+IGNscy5zdGFydHNXaXRoKEJMT0NLX0xBTkdVQUdFX1BSRUZJWCkpPy5zbGljZShCTE9DS19MQU5HVUFHRV9QUkVGSVgubGVuZ3RoKSA/PyAnJztcbn1cblxuZnVuY3Rpb24gaW5zZXJ0VGV4dChjb250ZW50OiBzdHJpbmcsIGluc2VydExpbmVJbmRleDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIHNob3VsZFByZXNlcnZlTGluZVByZWZpeD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBuZXdMaW5lcyA9IGxpbmVzLnNsaWNlKCk7XG4gIGNvbnN0IHRleHRMaW5lcyA9IHRleHQuc3BsaXQoJ1xcbicpO1xuXG4gIGlmIChpbnNlcnRMaW5lSW5kZXggPCAwKSB7XG4gICAgaW5zZXJ0TGluZUluZGV4ID0gMDtcbiAgfVxuICBpZiAoaW5zZXJ0TGluZUluZGV4ID4gbGluZXMubGVuZ3RoKSB7XG4gICAgaW5zZXJ0TGluZUluZGV4ID0gbGluZXMubGVuZ3RoO1xuICB9XG5cbiAgY29uc3QgUFJFRklYX0xJTkVfUkVHX0VYUCA9IC9eIHswLDN9KD86PiB7MSwzfSkqL2c7XG4gIGNvbnN0IG1hdGNoID0gKGxpbmVzW2luc2VydExpbmVJbmRleF0gPz8gJycpLm1hdGNoKFBSRUZJWF9MSU5FX1JFR19FWFApO1xuICBjb25zdCBsaW5lUHJlZml4ID0gbWF0Y2g/LlswXSA/PyAnJztcbiAgbmV3TGluZXMuc3BsaWNlKGluc2VydExpbmVJbmRleCwgMCwgLi4uKHNob3VsZFByZXNlcnZlTGluZVByZWZpeCA/IHRleHRMaW5lcy5tYXAoKGxpbmUpID0+IGluZGVudChsaW5lLCBsaW5lUHJlZml4KSkgOiB0ZXh0TGluZXMpKTtcbiAgcmV0dXJuIG5ld0xpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBpc1N1aXRhYmxlQ29kZUJsb2NrKFxuICBtYXRjaDogUmVnRXhwTWF0Y2hBcnJheSxcbiAgbGFuZ3VhZ2U6IHN0cmluZyxcbiAgc291cmNlOiBzdHJpbmcsXG4gIGlzSW5DYWxsb3V0OiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgY29uc3QgY29kZUJsb2NrTGFuZ3VhZ2UgPSBtYXRjaC5ncm91cHM/LlsnQ29kZUJsb2NrTGFuZ3VhZ2UnXSA/PyAnJztcbiAgaWYgKGNvZGVCbG9ja0xhbmd1YWdlICE9PSBsYW5ndWFnZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVQcmVmaXggPSBtYXRjaC5ncm91cHM/LlsnTGluZVByZWZpeCddID8/ICcnO1xuXG4gIGlmIChpc0luQ2FsbG91dCAmJiAhbGluZVByZWZpeC5pbmNsdWRlcygnPiAnKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNvZGVCbG9ja0NvbnRlbnQgPSBtYXRjaC5ncm91cHM/LlsnQ29kZUJsb2NrQ29udGVudCddID8/ICcnO1xuICBjb25zdCBjbGVhbkNvZGVCbG9ja0NvbnRlbnQgPSBjb2RlQmxvY2tDb250ZW50LnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUpID0+IGxpbmUuc2xpY2UobGluZVByZWZpeC5sZW5ndGgpKS5qb2luKCdcXG4nKTtcblxuICByZXR1cm4gY2xlYW5Db2RlQmxvY2tDb250ZW50ID09PSBzb3VyY2U7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBY0EsU0FBUywwQkFBMEI7QUFJbkMsU0FBUyxzQkFBc0I7QUFDL0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxvQkFBb0I7QUFDN0IsU0FBUyxlQUFlO0FBMkh4QixlQUFzQix5QkFBeUIsU0FBdUY7QUFDcEksUUFBTSxFQUFFLEtBQUssS0FBSyxJQUFJLE9BQU8sSUFBSTtBQUVqQyxRQUFNLGFBQWEsSUFBSSxNQUFNLGNBQWMsSUFBSSxVQUFVO0FBQ3pELE1BQUksQ0FBQyxZQUFZO0FBQ2YsVUFBTSxJQUFJLE1BQU0sZUFBZSxJQUFJLFVBQVUsYUFBYTtBQUFBLEVBQzVEO0FBQ0EsUUFBTSxVQUFVLFFBQVEsZUFBZSxNQUFNLElBQUksTUFBTSxXQUFXLFVBQVU7QUFFNUUsUUFBTSx5QkFBeUIsSUFBSSxlQUFlLEVBQUUs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
@@ -47,7 +47,7 @@ async function processNextQueueItem(app) {
47
47
  }
48
48
  await addErrorHandler(() => runWithTimeout(
49
49
  item.timeoutInMilliseconds,
50
- (abortSignal) => invokeAsyncAndLog(processNextQueueItem.name, item.fn, abortSignalAny([abortSignal, item.abortSignal]), item.stackTrace),
50
+ (abortSignal) => invokeAsyncAndLog(processNextQueueItem.name, item.fn, abortSignalAny(abortSignal, item.abortSignal), item.stackTrace),
51
51
  { queuedFn: item.fn }
52
52
  ), item.stackTrace);
53
53
  queue.items.shift();
@@ -57,4 +57,4 @@ export {
57
57
  addToQueueAndWait,
58
58
  flushQueue
59
59
  };
60
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1F1ZXVlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBlbnF1ZXVpbmcgYW5kIHByb2Nlc3NpbmcgZnVuY3Rpb25zIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBWYWx1ZVdyYXBwZXIgfSBmcm9tICcuL0FwcC50cyc7XG5cbmltcG9ydCB7XG4gIGFib3J0U2lnbmFsQW55LFxuICBhYm9ydFNpZ25hbE5ldmVyXG59IGZyb20gJy4uL0Fib3J0Q29udHJvbGxlci50cyc7XG5pbXBvcnQge1xuICBhZGRFcnJvckhhbmRsZXIsXG4gIGludm9rZUFzeW5jU2FmZWx5LFxuICBydW5XaXRoVGltZW91dFxufSBmcm9tICcuLi9Bc3luYy50cyc7XG5pbXBvcnQgeyBnZXRTdGFja1RyYWNlIH0gZnJvbSAnLi4vRXJyb3IudHMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4uL0Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4vQXBwLnRzJztcbmltcG9ydCB7IGludm9rZUFzeW5jQW5kTG9nIH0gZnJvbSAnLi9Mb2dnZXIudHMnO1xuXG5pbnRlcmZhY2UgUXVldWUge1xuICBpdGVtczogUXVldWVJdGVtW107XG4gIHByb21pc2U6IFByb21pc2U8dm9pZD47XG59XG5cbmludGVyZmFjZSBRdWV1ZUl0ZW0ge1xuICBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIGZuKHRoaXM6IHZvaWQsIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2FibGU8dm9pZD47XG4gIHN0YWNrVHJhY2U6IHN0cmluZztcbiAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQWRkcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHByZXZpb3VzIGZ1bmN0aW9uIGNvbXBsZXRlcy5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGFkZC5cbiAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIE9wdGlvbmFsIGFib3J0IHNpZ25hbC5cbiAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBUaGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIE9wdGlvbmFsIHN0YWNrIHRyYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkVG9RdWV1ZShcbiAgYXBwOiBBcHAsXG4gIGZuOiAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsLFxuICB0aW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXIsXG4gIHN0YWNrVHJhY2U/OiBzdHJpbmdcbik6IHZvaWQge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiBhZGRUb1F1ZXVlQW5kV2FpdChhcHAsIGZuLCBhYm9ydFNpZ25hbCwgdGltZW91dEluTWlsbGlzZWNvbmRzLCBzdGFja1RyYWNlKSwgc3RhY2tUcmFjZSk7XG59XG5cbi8qKlxuICogQWRkcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHByZXZpb3VzIGZ1bmN0aW9uIGNvbXBsZXRlcyBhbmQgcmV0dXJucyBhIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZ1bmN0aW9uIGNvbXBsZXRlcy5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGFkZC5cbiAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIE9wdGlvbmFsIGFib3J0IHNpZ25hbC5cbiAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBUaGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIE9wdGlvbmFsIHN0YWNrIHRyYWNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkVG9RdWV1ZUFuZFdhaXQoXG4gIGFwcDogQXBwLFxuICBmbjogKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyLFxuICBzdGFja1RyYWNlPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYWJvcnRTaWduYWwgPz89IGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBjb25zdCBERUZBVUxUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG4gIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/Pz0gREVGQVVMVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgc3RhY2tUcmFjZSA/Pz0gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZShhcHApLnZhbHVlO1xuICBxdWV1ZS5pdGVtcy5wdXNoKHsgYWJvcnRTaWduYWwsIGZuLCBzdGFja1RyYWNlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHMgfSk7XG4gIHF1ZXVlLnByb21pc2UgPSBxdWV1ZS5wcm9taXNlLnRoZW4oKCkgPT4gcHJvY2Vzc05leHRRdWV1ZUl0ZW0oYXBwKSk7XG4gIGF3YWl0IHF1ZXVlLnByb21pc2U7XG59XG5cbi8qKlxuICogRmx1c2hlcyB0aGUgcXVldWU7XG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZsdXNoUXVldWUoYXBwOiBBcHApOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYWRkVG9RdWV1ZUFuZFdhaXQoYXBwLCBub29wKTtcbn1cblxuZnVuY3Rpb24gZ2V0UXVldWUoYXBwOiBBcHApOiBWYWx1ZVdyYXBwZXI8UXVldWU+IHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZShhcHAsICdxdWV1ZScsIHsgaXRlbXM6IFtdLCBwcm9taXNlOiBQcm9taXNlLnJlc29sdmUoKSB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc05leHRRdWV1ZUl0ZW0oYXBwOiBBcHApOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZShhcHApLnZhbHVlO1xuICBjb25zdCBpdGVtID0gcXVldWUuaXRlbXNbMF07XG4gIGlmICghaXRlbSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGFkZEVycm9ySGFuZGxlcigoKSA9PlxuICAgIHJ1bldpdGhUaW1lb3V0KFxuICAgICAgaXRlbS50aW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgICAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKSA9PiBpbnZva2VBc3luY0FuZExvZyhwcm9jZXNzTmV4dFF1ZXVlSXRlbS5uYW1lLCBpdGVtLmZuLCBhYm9ydFNpZ25hbEFueShbYWJvcnRTaWduYWwsIGl0ZW0uYWJvcnRTaWduYWxdKSwgaXRlbS5zdGFja1RyYWNlKSxcbiAgICAgIHsgcXVldWVkRm46IGl0ZW0uZm4gfVxuICAgICksIGl0ZW0uc3RhY2tUcmFjZSk7XG4gIHF1ZXVlLml0ZW1zLnNoaWZ0KCk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBV0E7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLFlBQVk7QUFDckIsU0FBUyxnQ0FBZ0M7QUFDekMsU0FBUyx5QkFBeUI7QUF1QjNCLFNBQVMsV0FDZCxLQUNBLElBQ0EsYUFDQSx1QkFDQSxZQUNNO0FBQ04saUJBQWUsY0FBYyxDQUFDO0FBQzlCLG9CQUFrQixNQUFNLGtCQUFrQixLQUFLLElBQUksYUFBYSx1QkFBdUIsVUFBVSxHQUFHLFVBQVU7QUFDaEg7QUFXQSxlQUFzQixrQkFDcEIsS0FDQSxJQUNBLGFBQ0EsdUJBQ0EsWUFDZTtBQUNmLGtCQUFnQixpQkFBaUI7QUFDakMsY0FBWSxlQUFlO0FBRTNCLFFBQU0sa0NBQWtDO0FBQ3hDLDRCQUEwQjtBQUMxQixpQkFBZSxjQUFjLENBQUM7QUFDOUIsUUFBTSxRQUFRLFNBQVMsR0FBRyxFQUFFO0FBQzVCLFFBQU0sTUFBTSxLQUFLLEVBQUUsYUFBYSxJQUFJLFlBQVksc0JBQXNCLENBQUM7QUFDdkUsUUFBTSxVQUFVLE1BQU0sUUFBUSxLQUFLLE1BQU0scUJBQXFCLEdBQUcsQ0FBQztBQUNsRSxRQUFNLE1BQU07QUFDZDtBQU9BLGVBQXNCLFdBQVcsS0FBeUI7QUFDeEQsUUFBTSxrQkFBa0IsS0FBSyxJQUFJO0FBQ25DO0FBRUEsU0FBUyxTQUFTLEtBQStCO0FBQy9DLFNBQU8seUJBQXlCLEtBQUssU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLFNBQVMsUUFBUSxRQUFRLEVBQUUsQ0FBQztBQUN6RjtBQUVBLGVBQWUscUJBQXFCLEtBQXlCO0FBQzNELFFBQU0sUUFBUSxTQUFTLEdBQUcsRUFBRTtBQUM1QixRQUFNLE9BQU8sTUFBTSxNQUFNLENBQUM7QUFDMUIsTUFBSSxDQUFDLE1BQU07QUFDVDtBQUFBLEVBQ0Y7QUFFQSxRQUFNLGdCQUFnQixNQUNwQjtBQUFBLElBQ0UsS0FBSztBQUFBLElBQ0wsQ0FBQyxnQkFBNkIsa0JBQWtCLHFCQUFxQixNQUFNLEtBQUssSUFBSSxlQUFlLENBQUMsYUFBYSxLQUFLLFdBQVcsQ0FBQyxHQUFHLEtBQUssVUFBVTtBQUFBLElBQ3BKLEVBQUUsVUFBVSxLQUFLLEdBQUc7QUFBQSxFQUN0QixHQUFHLEtBQUssVUFBVTtBQUNwQixRQUFNLE1BQU0sTUFBTTtBQUNwQjsiLAogICJuYW1lcyI6IFtdCn0K
60
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1F1ZXVlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBlbnF1ZXVpbmcgYW5kIHByb2Nlc3NpbmcgZnVuY3Rpb25zIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBWYWx1ZVdyYXBwZXIgfSBmcm9tICcuL0FwcC50cyc7XG5cbmltcG9ydCB7XG4gIGFib3J0U2lnbmFsQW55LFxuICBhYm9ydFNpZ25hbE5ldmVyXG59IGZyb20gJy4uL0Fib3J0Q29udHJvbGxlci50cyc7XG5pbXBvcnQge1xuICBhZGRFcnJvckhhbmRsZXIsXG4gIGludm9rZUFzeW5jU2FmZWx5LFxuICBydW5XaXRoVGltZW91dFxufSBmcm9tICcuLi9Bc3luYy50cyc7XG5pbXBvcnQgeyBnZXRTdGFja1RyYWNlIH0gZnJvbSAnLi4vRXJyb3IudHMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4uL0Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4vQXBwLnRzJztcbmltcG9ydCB7IGludm9rZUFzeW5jQW5kTG9nIH0gZnJvbSAnLi9Mb2dnZXIudHMnO1xuXG5pbnRlcmZhY2UgUXVldWUge1xuICBpdGVtczogUXVldWVJdGVtW107XG4gIHByb21pc2U6IFByb21pc2U8dm9pZD47XG59XG5cbmludGVyZmFjZSBRdWV1ZUl0ZW0ge1xuICBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIGZuKHRoaXM6IHZvaWQsIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2FibGU8dm9pZD47XG4gIHN0YWNrVHJhY2U6IHN0cmluZztcbiAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQWRkcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHByZXZpb3VzIGZ1bmN0aW9uIGNvbXBsZXRlcy5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGFkZC5cbiAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIE9wdGlvbmFsIGFib3J0IHNpZ25hbC5cbiAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBUaGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIE9wdGlvbmFsIHN0YWNrIHRyYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkVG9RdWV1ZShcbiAgYXBwOiBBcHAsXG4gIGZuOiAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsLFxuICB0aW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXIsXG4gIHN0YWNrVHJhY2U/OiBzdHJpbmdcbik6IHZvaWQge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiBhZGRUb1F1ZXVlQW5kV2FpdChhcHAsIGZuLCBhYm9ydFNpZ25hbCwgdGltZW91dEluTWlsbGlzZWNvbmRzLCBzdGFja1RyYWNlKSwgc3RhY2tUcmFjZSk7XG59XG5cbi8qKlxuICogQWRkcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHByZXZpb3VzIGZ1bmN0aW9uIGNvbXBsZXRlcyBhbmQgcmV0dXJucyBhIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZ1bmN0aW9uIGNvbXBsZXRlcy5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGFkZC5cbiAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIE9wdGlvbmFsIGFib3J0IHNpZ25hbC5cbiAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBUaGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIE9wdGlvbmFsIHN0YWNrIHRyYWNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkVG9RdWV1ZUFuZFdhaXQoXG4gIGFwcDogQXBwLFxuICBmbjogKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyLFxuICBzdGFja1RyYWNlPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYWJvcnRTaWduYWwgPz89IGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBjb25zdCBERUZBVUxUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG4gIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/Pz0gREVGQVVMVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgc3RhY2tUcmFjZSA/Pz0gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZShhcHApLnZhbHVlO1xuICBxdWV1ZS5pdGVtcy5wdXNoKHsgYWJvcnRTaWduYWwsIGZuLCBzdGFja1RyYWNlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHMgfSk7XG4gIHF1ZXVlLnByb21pc2UgPSBxdWV1ZS5wcm9taXNlLnRoZW4oKCkgPT4gcHJvY2Vzc05leHRRdWV1ZUl0ZW0oYXBwKSk7XG4gIGF3YWl0IHF1ZXVlLnByb21pc2U7XG59XG5cbi8qKlxuICogRmx1c2hlcyB0aGUgcXVldWU7XG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZsdXNoUXVldWUoYXBwOiBBcHApOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYWRkVG9RdWV1ZUFuZFdhaXQoYXBwLCBub29wKTtcbn1cblxuZnVuY3Rpb24gZ2V0UXVldWUoYXBwOiBBcHApOiBWYWx1ZVdyYXBwZXI8UXVldWU+IHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZShhcHAsICdxdWV1ZScsIHsgaXRlbXM6IFtdLCBwcm9taXNlOiBQcm9taXNlLnJlc29sdmUoKSB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc05leHRRdWV1ZUl0ZW0oYXBwOiBBcHApOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZShhcHApLnZhbHVlO1xuICBjb25zdCBpdGVtID0gcXVldWUuaXRlbXNbMF07XG4gIGlmICghaXRlbSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGFkZEVycm9ySGFuZGxlcigoKSA9PlxuICAgIHJ1bldpdGhUaW1lb3V0KFxuICAgICAgaXRlbS50aW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgICAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKSA9PiBpbnZva2VBc3luY0FuZExvZyhwcm9jZXNzTmV4dFF1ZXVlSXRlbS5uYW1lLCBpdGVtLmZuLCBhYm9ydFNpZ25hbEFueShhYm9ydFNpZ25hbCwgaXRlbS5hYm9ydFNpZ25hbCksIGl0ZW0uc3RhY2tUcmFjZSksXG4gICAgICB7IHF1ZXVlZEZuOiBpdGVtLmZuIH1cbiAgICApLCBpdGVtLnN0YWNrVHJhY2UpO1xuICBxdWV1ZS5pdGVtcy5zaGlmdCgpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQVdBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxxQkFBcUI7QUFDOUIsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsZ0NBQWdDO0FBQ3pDLFNBQVMseUJBQXlCO0FBdUIzQixTQUFTLFdBQ2QsS0FDQSxJQUNBLGFBQ0EsdUJBQ0EsWUFDTTtBQUNOLGlCQUFlLGNBQWMsQ0FBQztBQUM5QixvQkFBa0IsTUFBTSxrQkFBa0IsS0FBSyxJQUFJLGFBQWEsdUJBQXVCLFVBQVUsR0FBRyxVQUFVO0FBQ2hIO0FBV0EsZUFBc0Isa0JBQ3BCLEtBQ0EsSUFDQSxhQUNBLHVCQUNBLFlBQ2U7QUFDZixrQkFBZ0IsaUJBQWlCO0FBQ2pDLGNBQVksZUFBZTtBQUUzQixRQUFNLGtDQUFrQztBQUN4Qyw0QkFBMEI7QUFDMUIsaUJBQWUsY0FBYyxDQUFDO0FBQzlCLFFBQU0sUUFBUSxTQUFTLEdBQUcsRUFBRTtBQUM1QixRQUFNLE1BQU0sS0FBSyxFQUFFLGFBQWEsSUFBSSxZQUFZLHNCQUFzQixDQUFDO0FBQ3ZFLFFBQU0sVUFBVSxNQUFNLFFBQVEsS0FBSyxNQUFNLHFCQUFxQixHQUFHLENBQUM7QUFDbEUsUUFBTSxNQUFNO0FBQ2Q7QUFPQSxlQUFzQixXQUFXLEtBQXlCO0FBQ3hELFFBQU0sa0JBQWtCLEtBQUssSUFBSTtBQUNuQztBQUVBLFNBQVMsU0FBUyxLQUErQjtBQUMvQyxTQUFPLHlCQUF5QixLQUFLLFNBQVMsRUFBRSxPQUFPLENBQUMsR0FBRyxTQUFTLFFBQVEsUUFBUSxFQUFFLENBQUM7QUFDekY7QUFFQSxlQUFlLHFCQUFxQixLQUF5QjtBQUMzRCxRQUFNLFFBQVEsU0FBUyxHQUFHLEVBQUU7QUFDNUIsUUFBTSxPQUFPLE1BQU0sTUFBTSxDQUFDO0FBQzFCLE1BQUksQ0FBQyxNQUFNO0FBQ1Q7QUFBQSxFQUNGO0FBRUEsUUFBTSxnQkFBZ0IsTUFDcEI7QUFBQSxJQUNFLEtBQUs7QUFBQSxJQUNMLENBQUMsZ0JBQTZCLGtCQUFrQixxQkFBcUIsTUFBTSxLQUFLLElBQUksZUFBZSxhQUFhLEtBQUssV0FBVyxHQUFHLEtBQUssVUFBVTtBQUFBLElBQ2xKLEVBQUUsVUFBVSxLQUFLLEdBQUc7QUFBQSxFQUN0QixHQUFHLEtBQUssVUFBVTtBQUNwQixRQUFNLE1BQU0sTUFBTTtBQUNwQjsiLAogICJuYW1lcyI6IFtdCn0K
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-dev-utils",
3
- "version": "34.0.1",
3
+ "version": "34.0.2-beta.2",
4
4
  "description": "This is the collection of useful functions that you can use for your Obsidian plugin development",
5
5
  "keywords": [
6
6
  "obsidian"