obsidian-dev-utils 88.6.0 → 88.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/integration-test-plugin/main.js +309 -190
  3. package/dist/lib/cjs/__merged.cjs +4 -1
  4. package/dist/lib/cjs/__merged.d.cts +1 -0
  5. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  6. package/dist/lib/cjs/obsidian/components/index.cjs +6 -3
  7. package/dist/lib/cjs/obsidian/components/index.d.cts +1 -0
  8. package/dist/lib/cjs/obsidian/components/syntax-highlighting-component.cjs +244 -0
  9. package/dist/lib/cjs/obsidian/components/syntax-highlighting-component.d.cts +149 -0
  10. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +1 -1
  11. package/dist/lib/cjs/script-utils/cli-utils.cjs +9 -1
  12. package/dist/lib/cjs/script-utils/cli-utils.d.cts +6 -0
  13. package/dist/lib/cjs/script-utils/env-toggle.cjs +180 -0
  14. package/dist/lib/cjs/script-utils/env-toggle.d.cts +42 -0
  15. package/dist/lib/cjs/script-utils/git.cjs +156 -0
  16. package/dist/lib/cjs/script-utils/git.d.cts +37 -0
  17. package/dist/lib/cjs/script-utils/index.cjs +7 -1
  18. package/dist/lib/cjs/script-utils/index.d.cts +2 -0
  19. package/dist/lib/cjs/script-utils/linters/cspell.cjs +11 -2
  20. package/dist/lib/cjs/script-utils/linters/cspell.d.cts +7 -0
  21. package/dist/lib/cjs/script-utils/linters/markdownlint-cli2-config.cjs +7 -4
  22. package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +17 -8
  23. package/dist/lib/cjs/script-utils/nano-staged-config.cjs +7 -11
  24. package/dist/lib/cjs/script-utils/nano-staged-config.d.cts +7 -5
  25. package/dist/lib/esm/__merged.d.mts +1 -0
  26. package/dist/lib/esm/__merged.mjs +3 -1
  27. package/dist/lib/esm/generated-during-build.mjs +1 -1
  28. package/dist/lib/esm/obsidian/components/index.d.mts +1 -0
  29. package/dist/lib/esm/obsidian/components/index.mjs +4 -2
  30. package/dist/lib/esm/obsidian/components/syntax-highlighting-component.d.mts +149 -0
  31. package/dist/lib/esm/obsidian/components/syntax-highlighting-component.mjs +136 -0
  32. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +1 -1
  33. package/dist/lib/esm/script-utils/cli-utils.d.mts +6 -0
  34. package/dist/lib/esm/script-utils/cli-utils.mjs +9 -1
  35. package/dist/lib/esm/script-utils/env-toggle.d.mts +42 -0
  36. package/dist/lib/esm/script-utils/env-toggle.mjs +60 -0
  37. package/dist/lib/esm/script-utils/git.d.mts +37 -0
  38. package/dist/lib/esm/script-utils/git.mjs +48 -0
  39. package/dist/lib/esm/script-utils/index.d.mts +2 -0
  40. package/dist/lib/esm/script-utils/index.mjs +5 -1
  41. package/dist/lib/esm/script-utils/linters/cspell.d.mts +7 -0
  42. package/dist/lib/esm/script-utils/linters/cspell.mjs +15 -3
  43. package/dist/lib/esm/script-utils/linters/markdownlint-cli2-config.mjs +7 -4
  44. package/dist/lib/esm/script-utils/linters/markdownlint.mjs +17 -8
  45. package/dist/lib/esm/script-utils/nano-staged-config.d.mts +7 -5
  46. package/dist/lib/esm/script-utils/nano-staged-config.mjs +10 -11
  47. package/dist/templates/dprint.json +2 -2
  48. package/obsidian/components/syntax-highlighting-component/package.json +6 -0
  49. package/package.json +2 -2
  50. package/script-utils/env-toggle/package.json +6 -0
  51. package/script-utils/git/package.json +6 -0
  52. package/@types/obsidian/package.json +0 -4
  53. package/dist/lib/cjs/@types/obsidian.d.cts +0 -28
  54. package/dist/lib/esm/@types/obsidian.d.mts +0 -28
@@ -0,0 +1,149 @@
1
+ /// <reference path="../../library.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Contains class {@link SyntaxHighlightingComponent} that registers syntax highlighting languages.
6
+ *
7
+ * Obsidian highlights code in two independent places, through two separate registries, and a plugin adding
8
+ * its own language usually has to touch both:
9
+ *
10
+ * - **Prism** (`prism.languages[language]`) highlights code in reading view and in every `<pre><code>` the
11
+ * library renders — including the {@link CodeHighlighterComponent} settings field.
12
+ * - **The CodeMirror 5 mode registry** (`window.CodeMirror.modes[language]`) highlights a fenced code block
13
+ * inside the editor.
14
+ *
15
+ * The CodeMirror 5 half looks like legacy that should be migrated to CodeMirror 6. **It is not** — verified
16
+ * against the Obsidian 1.13.4 runtime:
17
+ *
18
+ * - Obsidian's own CodeMirror 6 editor language is a bridged CodeMirror 5 mode:
19
+ * `StreamLanguage.define(CodeMirror.getMode({}, { name: 'hypermd' }))`.
20
+ * - Obsidian registers that `hypermd` mode through `window.CodeMirror.defineMode` with
21
+ * `fencedCodeBlockHighlighting: true`, and that option resolves each fence's language through the
22
+ * **CodeMirror 5 mode registry**.
23
+ * - There is no public or internal CodeMirror 6 language-registration API for fences.
24
+ *
25
+ * So `window.CodeMirror.defineMode` is the sanctioned extension point, not legacy debt. Do not reopen this
26
+ * as a migration.
27
+ *
28
+ * Teardown REMOVES the mode rather than redefining it to `null`. Plugins predating this component redefined
29
+ * the mode to `null` on unload, because it was unclear whether CodeMirror's `getMode` needs the entry to
30
+ * stay present. It does not — verified against a live Obsidian 1.13.4 by
31
+ * `syntax-highlighting-component.obsidian.integration.test.ts`: after the entry is deleted, the fence
32
+ * renders its text with no error and drops back to the exact token count it had before the language was
33
+ * ever registered.
34
+ */
35
+ import type { Grammar, PrismModule } from '@obsidian-typings/obsidian-public-latest';
36
+ import { ComponentEx } from './component-ex.mjs';
37
+ /**
38
+ * The loaded Prism module, handed to a grammar factory.
39
+ */
40
+ export interface SyntaxHighlightingComponentGrammarFactoryParams {
41
+ /**
42
+ * The loaded Prism module.
43
+ */
44
+ readonly prism: PrismModule;
45
+ /**
46
+ * Returns the grammar of an already registered Prism language, for nesting into the built grammar.
47
+ *
48
+ * @param language - The language to look up.
49
+ * @returns The grammar of the language.
50
+ * @throws An {@link Error} if the language is not registered.
51
+ */
52
+ requirePrismLanguage(language: string): Grammar;
53
+ }
54
+ /**
55
+ * A grammar, the name of an already registered language to alias, or a factory that builds the grammar from
56
+ * the loaded Prism module.
57
+ */
58
+ export type SyntaxHighlightingComponentGrammarSource = ((params: SyntaxHighlightingComponentGrammarFactoryParams) => Grammar) | Grammar | string;
59
+ /**
60
+ * Parameters for {@link SyntaxHighlightingComponent.registerCodeBlockLanguageAsync}.
61
+ */
62
+ export interface SyntaxHighlightingComponentRegisterCodeBlockLanguageAsyncParams {
63
+ /**
64
+ * The CodeMirror 5 mode name or MIME type the editor highlights the fence as, e.g. `text/typescript`.
65
+ */
66
+ readonly editorMode: string;
67
+ /**
68
+ * The fence language, e.g. the `foo` in a ` ```foo ` code block.
69
+ */
70
+ readonly language: string;
71
+ /**
72
+ * The grammar highlighting the fence in reading view. Omit when the fence is replaced in reading view —
73
+ * e.g. a fence rendered as a button.
74
+ */
75
+ readonly prismGrammar?: SyntaxHighlightingComponentGrammarSource | undefined;
76
+ }
77
+ /**
78
+ * Parameters for {@link SyntaxHighlightingComponent.registerPrismLanguageAsync}.
79
+ */
80
+ export interface SyntaxHighlightingComponentRegisterPrismLanguageAsyncParams {
81
+ /**
82
+ * The grammar to register.
83
+ */
84
+ readonly grammar: SyntaxHighlightingComponentGrammarSource;
85
+ /**
86
+ * The language to register the grammar as.
87
+ */
88
+ readonly language: string;
89
+ }
90
+ /**
91
+ * A component that registers and unregisters syntax highlighting languages.
92
+ *
93
+ * @remarks
94
+ * Every registration is undone when the component is unloaded: the previous entry is restored if the
95
+ * language was already registered, otherwise the entry is removed.
96
+ */
97
+ export declare class SyntaxHighlightingComponent extends ComponentEx {
98
+ /**
99
+ * Registers a fenced code block language, highlighting it in the editor and, optionally, in reading view.
100
+ *
101
+ * @param params - The parameters for registering the language.
102
+ * @returns A {@link Promise} that resolves when the language is registered.
103
+ *
104
+ * @example
105
+ * ```ts
106
+ * await component.registerCodeBlockLanguageAsync({
107
+ * editorMode: 'text/typescript',
108
+ * language: 'my-language',
109
+ * prismGrammar: 'typescript'
110
+ * });
111
+ * ```
112
+ */
113
+ registerCodeBlockLanguageAsync(params: SyntaxHighlightingComponentRegisterCodeBlockLanguageAsyncParams): Promise<void>;
114
+ /**
115
+ * Registers a Prism language, highlighting it everywhere Prism renders code — reading view and the
116
+ * {@link CodeHighlighterComponent} settings field.
117
+ *
118
+ * @param params - The parameters for registering the language.
119
+ * @returns A {@link Promise} that resolves when the language is registered.
120
+ *
121
+ * @example
122
+ * ```ts
123
+ * await component.registerPrismLanguageAsync({
124
+ * grammar: {
125
+ * keyword: /\bfoo\b/
126
+ * },
127
+ * language: 'my-language'
128
+ * });
129
+ * ```
130
+ */
131
+ registerPrismLanguageAsync(params: SyntaxHighlightingComponentRegisterPrismLanguageAsyncParams): Promise<void>;
132
+ /**
133
+ * Returns the grammar of an already registered Prism language.
134
+ *
135
+ * @param prism - The loaded Prism module.
136
+ * @param language - The language to look up.
137
+ * @returns The grammar of the language.
138
+ * @throws An {@link Error} if the language is not registered.
139
+ */
140
+ private requirePrismLanguage;
141
+ /**
142
+ * Resolves a grammar source into the grammar to register.
143
+ *
144
+ * @param prism - The loaded Prism module.
145
+ * @param grammarSource - The grammar source to resolve.
146
+ * @returns The resolved grammar.
147
+ */
148
+ private resolveGrammar;
149
+ }
@@ -0,0 +1,136 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function initEsm() {
7
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
8
+ if (globalThis.process) {
9
+ return;
10
+ }
11
+
12
+ const browserProcess = {
13
+ browser: true,
14
+ cwd() {
15
+ return '/';
16
+ },
17
+ env: {},
18
+ platform: 'android'
19
+ };
20
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
21
+ globalThis.process = browserProcess;
22
+ })();
23
+
24
+ import { loadPrism } from "@obsidian-typings/obsidian-public-latest/implementations";
25
+ import { throwExpression } from "../../error.mjs";
26
+ import { ComponentEx } from "./component-ex.mjs";
27
+ class SyntaxHighlightingComponent extends ComponentEx {
28
+ /**
29
+ * Registers a fenced code block language, highlighting it in the editor and, optionally, in reading view.
30
+ *
31
+ * @param params - The parameters for registering the language.
32
+ * @returns A {@link Promise} that resolves when the language is registered.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * await component.registerCodeBlockLanguageAsync({
37
+ * editorMode: 'text/typescript',
38
+ * language: 'my-language',
39
+ * prismGrammar: 'typescript'
40
+ * });
41
+ * ```
42
+ */
43
+ async registerCodeBlockLanguageAsync(params) {
44
+ const {
45
+ editorMode,
46
+ language,
47
+ prismGrammar
48
+ } = params;
49
+ this.ensureLoaded();
50
+ if (prismGrammar !== void 0) {
51
+ await this.registerPrismLanguageAsync({
52
+ grammar: prismGrammar,
53
+ language
54
+ });
55
+ }
56
+ this.ensureLoaded();
57
+ const previousModeFactory = window.CodeMirror.modes[language];
58
+ window.CodeMirror.defineMode(language, (config) => window.CodeMirror.getMode(config, editorMode));
59
+ this.register(() => {
60
+ if (previousModeFactory !== void 0) {
61
+ window.CodeMirror.modes[language] = previousModeFactory;
62
+ return;
63
+ }
64
+ delete window.CodeMirror.modes[language];
65
+ });
66
+ }
67
+ /**
68
+ * Registers a Prism language, highlighting it everywhere Prism renders code — reading view and the
69
+ * {@link CodeHighlighterComponent} settings field.
70
+ *
71
+ * @param params - The parameters for registering the language.
72
+ * @returns A {@link Promise} that resolves when the language is registered.
73
+ *
74
+ * @example
75
+ * ```ts
76
+ * await component.registerPrismLanguageAsync({
77
+ * grammar: {
78
+ * keyword: /\bfoo\b/
79
+ * },
80
+ * language: 'my-language'
81
+ * });
82
+ * ```
83
+ */
84
+ async registerPrismLanguageAsync(params) {
85
+ const {
86
+ grammar,
87
+ language
88
+ } = params;
89
+ this.ensureLoaded();
90
+ const prism = await loadPrism();
91
+ this.ensureLoaded();
92
+ const previousGrammar = prism.languages[language];
93
+ prism.languages[language] = this.resolveGrammar(prism, grammar);
94
+ this.register(() => {
95
+ if (previousGrammar !== void 0) {
96
+ prism.languages[language] = previousGrammar;
97
+ return;
98
+ }
99
+ delete prism.languages[language];
100
+ });
101
+ }
102
+ /**
103
+ * Returns the grammar of an already registered Prism language.
104
+ *
105
+ * @param prism - The loaded Prism module.
106
+ * @param language - The language to look up.
107
+ * @returns The grammar of the language.
108
+ * @throws An {@link Error} if the language is not registered.
109
+ */
110
+ requirePrismLanguage(prism, language) {
111
+ return prism.languages[language] ?? throwExpression(new Error(`Prism language "${language}" is not registered.`));
112
+ }
113
+ /**
114
+ * Resolves a grammar source into the grammar to register.
115
+ *
116
+ * @param prism - The loaded Prism module.
117
+ * @param grammarSource - The grammar source to resolve.
118
+ * @returns The resolved grammar.
119
+ */
120
+ resolveGrammar(prism, grammarSource) {
121
+ if (typeof grammarSource === "string") {
122
+ return this.requirePrismLanguage(prism, grammarSource);
123
+ }
124
+ if (typeof grammarSource === "function") {
125
+ return grammarSource({
126
+ prism,
127
+ requirePrismLanguage: (language) => this.requirePrismLanguage(prism, language)
128
+ });
129
+ }
130
+ return grammarSource;
131
+ }
132
+ }
133
+ export {
134
+ SyntaxHighlightingComponent
135
+ };
136
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvc3ludGF4LWhpZ2hsaWdodGluZy1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb250YWlucyBjbGFzcyB7QGxpbmsgU3ludGF4SGlnaGxpZ2h0aW5nQ29tcG9uZW50fSB0aGF0IHJlZ2lzdGVycyBzeW50YXggaGlnaGxpZ2h0aW5nIGxhbmd1YWdlcy5cbiAqXG4gKiBPYnNpZGlhbiBoaWdobGlnaHRzIGNvZGUgaW4gdHdvIGluZGVwZW5kZW50IHBsYWNlcywgdGhyb3VnaCB0d28gc2VwYXJhdGUgcmVnaXN0cmllcywgYW5kIGEgcGx1Z2luIGFkZGluZ1xuICogaXRzIG93biBsYW5ndWFnZSB1c3VhbGx5IGhhcyB0byB0b3VjaCBib3RoOlxuICpcbiAqIC0gKipQcmlzbSoqIChgcHJpc20ubGFuZ3VhZ2VzW2xhbmd1YWdlXWApIGhpZ2hsaWdodHMgY29kZSBpbiByZWFkaW5nIHZpZXcgYW5kIGluIGV2ZXJ5IGA8cHJlPjxjb2RlPmAgdGhlXG4gKiAgIGxpYnJhcnkgcmVuZGVycyBcdTIwMTQgaW5jbHVkaW5nIHRoZSB7QGxpbmsgQ29kZUhpZ2hsaWdodGVyQ29tcG9uZW50fSBzZXR0aW5ncyBmaWVsZC5cbiAqIC0gKipUaGUgQ29kZU1pcnJvciA1IG1vZGUgcmVnaXN0cnkqKiAoYHdpbmRvdy5Db2RlTWlycm9yLm1vZGVzW2xhbmd1YWdlXWApIGhpZ2hsaWdodHMgYSBmZW5jZWQgY29kZSBibG9ja1xuICogICBpbnNpZGUgdGhlIGVkaXRvci5cbiAqXG4gKiBUaGUgQ29kZU1pcnJvciA1IGhhbGYgbG9va3MgbGlrZSBsZWdhY3kgdGhhdCBzaG91bGQgYmUgbWlncmF0ZWQgdG8gQ29kZU1pcnJvciA2LiAqKkl0IGlzIG5vdCoqIFx1MjAxNCB2ZXJpZmllZFxuICogYWdhaW5zdCB0aGUgT2JzaWRpYW4gMS4xMy40IHJ1bnRpbWU6XG4gKlxuICogLSBPYnNpZGlhbidzIG93biBDb2RlTWlycm9yIDYgZWRpdG9yIGxhbmd1YWdlIGlzIGEgYnJpZGdlZCBDb2RlTWlycm9yIDUgbW9kZTpcbiAqICAgYFN0cmVhbUxhbmd1YWdlLmRlZmluZShDb2RlTWlycm9yLmdldE1vZGUoe30sIHsgbmFtZTogJ2h5cGVybWQnIH0pKWAuXG4gKiAtIE9ic2lkaWFuIHJlZ2lzdGVycyB0aGF0IGBoeXBlcm1kYCBtb2RlIHRocm91Z2ggYHdpbmRvdy5Db2RlTWlycm9yLmRlZmluZU1vZGVgIHdpdGhcbiAqICAgYGZlbmNlZENvZGVCbG9ja0hpZ2hsaWdodGluZzogdHJ1ZWAsIGFuZCB0aGF0IG9wdGlvbiByZXNvbHZlcyBlYWNoIGZlbmNlJ3MgbGFuZ3VhZ2UgdGhyb3VnaCB0aGVcbiAqICAgKipDb2RlTWlycm9yIDUgbW9kZSByZWdpc3RyeSoqLlxuICogLSBUaGVyZSBpcyBubyBwdWJsaWMgb3IgaW50ZXJuYWwgQ29kZU1pcnJvciA2IGxhbmd1YWdlLXJlZ2lzdHJhdGlvbiBBUEkgZm9yIGZlbmNlcy5cbiAqXG4gKiBTbyBgd2luZG93LkNvZGVNaXJyb3IuZGVmaW5lTW9kZWAgaXMgdGhlIHNhbmN0aW9uZWQgZXh0ZW5zaW9uIHBvaW50LCBub3QgbGVnYWN5IGRlYnQuIERvIG5vdCByZW9wZW4gdGhpc1xuICogYXMgYSBtaWdyYXRpb24uXG4gKlxuICogVGVhcmRvd24gUkVNT1ZFUyB0aGUgbW9kZSByYXRoZXIgdGhhbiByZWRlZmluaW5nIGl0IHRvIGBudWxsYC4gUGx1Z2lucyBwcmVkYXRpbmcgdGhpcyBjb21wb25lbnQgcmVkZWZpbmVkXG4gKiB0aGUgbW9kZSB0byBgbnVsbGAgb24gdW5sb2FkLCBiZWNhdXNlIGl0IHdhcyB1bmNsZWFyIHdoZXRoZXIgQ29kZU1pcnJvcidzIGBnZXRNb2RlYCBuZWVkcyB0aGUgZW50cnkgdG9cbiAqIHN0YXkgcHJlc2VudC4gSXQgZG9lcyBub3QgXHUyMDE0IHZlcmlmaWVkIGFnYWluc3QgYSBsaXZlIE9ic2lkaWFuIDEuMTMuNCBieVxuICogYHN5bnRheC1oaWdobGlnaHRpbmctY29tcG9uZW50Lm9ic2lkaWFuLmludGVncmF0aW9uLnRlc3QudHNgOiBhZnRlciB0aGUgZW50cnkgaXMgZGVsZXRlZCwgdGhlIGZlbmNlXG4gKiByZW5kZXJzIGl0cyB0ZXh0IHdpdGggbm8gZXJyb3IgYW5kIGRyb3BzIGJhY2sgdG8gdGhlIGV4YWN0IHRva2VuIGNvdW50IGl0IGhhZCBiZWZvcmUgdGhlIGxhbmd1YWdlIHdhc1xuICogZXZlciByZWdpc3RlcmVkLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgR3JhbW1hcixcbiAgUHJpc21Nb2R1bGVcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5cbmltcG9ydCB7IGxvYWRQcmlzbSB9IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAtLSBXZSBuZWVkIHRvIGltcG9ydCBgQ29kZUhpZ2hsaWdodGVyQ29tcG9uZW50YCB0byB1c2UgaXQgaW4gdGhlIHRzZG9jcy5cbmltcG9ydCB0eXBlIHsgQ29kZUhpZ2hsaWdodGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vc2V0dGluZy1jb21wb25lbnRzL2NvZGUtaGlnaGxpZ2h0ZXItY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgdGhyb3dFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vZXJyb3IudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5cbi8qKlxuICogVGhlIGxvYWRlZCBQcmlzbSBtb2R1bGUsIGhhbmRlZCB0byBhIGdyYW1tYXIgZmFjdG9yeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTeW50YXhIaWdobGlnaHRpbmdDb21wb25lbnRHcmFtbWFyRmFjdG9yeVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbG9hZGVkIFByaXNtIG1vZHVsZS5cbiAgICovXG4gIHJlYWRvbmx5IHByaXNtOiBQcmlzbU1vZHVsZTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZ3JhbW1hciBvZiBhbiBhbHJlYWR5IHJlZ2lzdGVyZWQgUHJpc20gbGFuZ3VhZ2UsIGZvciBuZXN0aW5nIGludG8gdGhlIGJ1aWx0IGdyYW1tYXIuXG4gICAqXG4gICAqIEBwYXJhbSBsYW5ndWFnZSAtIFRoZSBsYW5ndWFnZSB0byBsb29rIHVwLlxuICAgKiBAcmV0dXJucyBUaGUgZ3JhbW1hciBvZiB0aGUgbGFuZ3VhZ2UuXG4gICAqIEB0aHJvd3MgQW4ge0BsaW5rIEVycm9yfSBpZiB0aGUgbGFuZ3VhZ2UgaXMgbm90IHJlZ2lzdGVyZWQuXG4gICAqL1xuICByZXF1aXJlUHJpc21MYW5ndWFnZShsYW5ndWFnZTogc3RyaW5nKTogR3JhbW1hcjtcbn1cblxuLyoqXG4gKiBBIGdyYW1tYXIsIHRoZSBuYW1lIG9mIGFuIGFscmVhZHkgcmVnaXN0ZXJlZCBsYW5ndWFnZSB0byBhbGlhcywgb3IgYSBmYWN0b3J5IHRoYXQgYnVpbGRzIHRoZSBncmFtbWFyIGZyb21cbiAqIHRoZSBsb2FkZWQgUHJpc20gbW9kdWxlLlxuICovXG5leHBvcnQgdHlwZSBTeW50YXhIaWdobGlnaHRpbmdDb21wb25lbnRHcmFtbWFyU291cmNlID0gKChwYXJhbXM6IFN5bnRheEhpZ2hsaWdodGluZ0NvbXBvbmVudEdyYW1tYXJGYWN0b3J5UGFyYW1zKSA9PiBHcmFtbWFyKSB8IEdyYW1tYXIgfCBzdHJpbmc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIFN5bnRheEhpZ2hsaWdodGluZ0NvbXBvbmVudC5yZWdpc3RlckNvZGVCbG9ja0xhbmd1YWdlQXN5bmN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN5bnRheEhpZ2hsaWdodGluZ0NvbXBvbmVudFJlZ2lzdGVyQ29kZUJsb2NrTGFuZ3VhZ2VBc3luY1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgQ29kZU1pcnJvciA1IG1vZGUgbmFtZSBvciBNSU1FIHR5cGUgdGhlIGVkaXRvciBoaWdobGlnaHRzIHRoZSBmZW5jZSBhcywgZS5nLiBgdGV4dC90eXBlc2NyaXB0YC5cbiAgICovXG4gIHJlYWRvbmx5IGVkaXRvck1vZGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZlbmNlIGxhbmd1YWdlLCBlLmcuIHRoZSBgZm9vYCBpbiBhIGAgYGBgZm9vIGAgY29kZSBibG9jay5cbiAgICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBncmFtbWFyIGhpZ2hsaWdodGluZyB0aGUgZmVuY2UgaW4gcmVhZGluZyB2aWV3LiBPbWl0IHdoZW4gdGhlIGZlbmNlIGlzIHJlcGxhY2VkIGluIHJlYWRpbmcgdmlldyBcdTIwMTRcbiAgICogZS5nLiBhIGZlbmNlIHJlbmRlcmVkIGFzIGEgYnV0dG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJpc21HcmFtbWFyPzogU3ludGF4SGlnaGxpZ2h0aW5nQ29tcG9uZW50R3JhbW1hclNvdXJjZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgU3ludGF4SGlnaGxpZ2h0aW5nQ29tcG9uZW50LnJlZ2lzdGVyUHJpc21MYW5ndWFnZUFzeW5jfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTeW50YXhIaWdobGlnaHRpbmdDb21wb25lbnRSZWdpc3RlclByaXNtTGFuZ3VhZ2VBc3luY1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZ3JhbW1hciB0byByZWdpc3Rlci5cbiAgICovXG4gIHJlYWRvbmx5IGdyYW1tYXI6IFN5bnRheEhpZ2hsaWdodGluZ0NvbXBvbmVudEdyYW1tYXJTb3VyY2U7XG5cbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSB0byByZWdpc3RlciB0aGUgZ3JhbW1hciBhcy5cbiAgICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBjb21wb25lbnQgdGhhdCByZWdpc3RlcnMgYW5kIHVucmVnaXN0ZXJzIHN5bnRheCBoaWdobGlnaHRpbmcgbGFuZ3VhZ2VzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBFdmVyeSByZWdpc3RyYXRpb24gaXMgdW5kb25lIHdoZW4gdGhlIGNvbXBvbmVudCBpcyB1bmxvYWRlZDogdGhlIHByZXZpb3VzIGVudHJ5IGlzIHJlc3RvcmVkIGlmIHRoZVxuICogbGFuZ3VhZ2Ugd2FzIGFscmVhZHkgcmVnaXN0ZXJlZCwgb3RoZXJ3aXNlIHRoZSBlbnRyeSBpcyByZW1vdmVkLlxuICovXG5leHBvcnQgY2xhc3MgU3ludGF4SGlnaGxpZ2h0aW5nQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgZmVuY2VkIGNvZGUgYmxvY2sgbGFuZ3VhZ2UsIGhpZ2hsaWdodGluZyBpdCBpbiB0aGUgZWRpdG9yIGFuZCwgb3B0aW9uYWxseSwgaW4gcmVhZGluZyB2aWV3LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJlZ2lzdGVyaW5nIHRoZSBsYW5ndWFnZS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBsYW5ndWFnZSBpcyByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBhd2FpdCBjb21wb25lbnQucmVnaXN0ZXJDb2RlQmxvY2tMYW5ndWFnZUFzeW5jKHtcbiAgICogICBlZGl0b3JNb2RlOiAndGV4dC90eXBlc2NyaXB0JyxcbiAgICogICBsYW5ndWFnZTogJ215LWxhbmd1YWdlJyxcbiAgICogICBwcmlzbUdyYW1tYXI6ICd0eXBlc2NyaXB0J1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJDb2RlQmxvY2tMYW5ndWFnZUFzeW5jKHBhcmFtczogU3ludGF4SGlnaGxpZ2h0aW5nQ29tcG9uZW50UmVnaXN0ZXJDb2RlQmxvY2tMYW5ndWFnZUFzeW5jUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge1xuICAgICAgZWRpdG9yTW9kZSxcbiAgICAgIGxhbmd1YWdlLFxuICAgICAgcHJpc21HcmFtbWFyXG4gICAgfSA9IHBhcmFtcztcblxuICAgIHRoaXMuZW5zdXJlTG9hZGVkKCk7XG5cbiAgICBpZiAocHJpc21HcmFtbWFyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJQcmlzbUxhbmd1YWdlQXN5bmMoe1xuICAgICAgICBncmFtbWFyOiBwcmlzbUdyYW1tYXIsXG4gICAgICAgIGxhbmd1YWdlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmVuc3VyZUxvYWRlZCgpO1xuXG4gICAgY29uc3QgcHJldmlvdXNNb2RlRmFjdG9yeSA9IHdpbmRvdy5Db2RlTWlycm9yLm1vZGVzW2xhbmd1YWdlXTtcbiAgICB3aW5kb3cuQ29kZU1pcnJvci5kZWZpbmVNb2RlKGxhbmd1YWdlLCAoY29uZmlnKSA9PiB3aW5kb3cuQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgZWRpdG9yTW9kZSkpO1xuXG4gICAgdGhpcy5yZWdpc3RlcigoKSA9PiB7XG4gICAgICBpZiAocHJldmlvdXNNb2RlRmFjdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdpbmRvdy5Db2RlTWlycm9yLm1vZGVzW2xhbmd1YWdlXSA9IHByZXZpb3VzTW9kZUZhY3Rvcnk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBUaGUgbGFuZ3VhZ2UgaXMgb25seSBrbm93biBhdCBydW50aW1lLlxuICAgICAgZGVsZXRlIHdpbmRvdy5Db2RlTWlycm9yLm1vZGVzW2xhbmd1YWdlXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBQcmlzbSBsYW5ndWFnZSwgaGlnaGxpZ2h0aW5nIGl0IGV2ZXJ5d2hlcmUgUHJpc20gcmVuZGVycyBjb2RlIFx1MjAxNCByZWFkaW5nIHZpZXcgYW5kIHRoZVxuICAgKiB7QGxpbmsgQ29kZUhpZ2hsaWdodGVyQ29tcG9uZW50fSBzZXR0aW5ncyBmaWVsZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZWdpc3RlcmluZyB0aGUgbGFuZ3VhZ2UuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbGFuZ3VhZ2UgaXMgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogYXdhaXQgY29tcG9uZW50LnJlZ2lzdGVyUHJpc21MYW5ndWFnZUFzeW5jKHtcbiAgICogICBncmFtbWFyOiB7XG4gICAqICAgICBrZXl3b3JkOiAvXFxiZm9vXFxiL1xuICAgKiAgIH0sXG4gICAqICAgbGFuZ3VhZ2U6ICdteS1sYW5ndWFnZSdcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyUHJpc21MYW5ndWFnZUFzeW5jKHBhcmFtczogU3ludGF4SGlnaGxpZ2h0aW5nQ29tcG9uZW50UmVnaXN0ZXJQcmlzbUxhbmd1YWdlQXN5bmNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7XG4gICAgICBncmFtbWFyLFxuICAgICAgbGFuZ3VhZ2VcbiAgICB9ID0gcGFyYW1zO1xuXG4gICAgdGhpcy5lbnN1cmVMb2FkZWQoKTtcblxuICAgIGNvbnN0IHByaXNtID0gYXdhaXQgbG9hZFByaXNtKCk7XG5cbiAgICAvLyBUaGUgY29tcG9uZW50IG1pZ2h0IGhhdmUgYmVlbiB1bmxvYWRlZCB3aGlsZSBQcmlzbSB3YXMgbG9hZGluZy5cbiAgICB0aGlzLmVuc3VyZUxvYWRlZCgpO1xuXG4gICAgY29uc3QgcHJldmlvdXNHcmFtbWFyID0gcHJpc20ubGFuZ3VhZ2VzW2xhbmd1YWdlXTtcbiAgICBwcmlzbS5sYW5ndWFnZXNbbGFuZ3VhZ2VdID0gdGhpcy5yZXNvbHZlR3JhbW1hcihwcmlzbSwgZ3JhbW1hcik7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIGlmIChwcmV2aW91c0dyYW1tYXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcmlzbS5sYW5ndWFnZXNbbGFuZ3VhZ2VdID0gcHJldmlvdXNHcmFtbWFyO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gVGhlIGxhbmd1YWdlIGlzIG9ubHkga25vd24gYXQgcnVudGltZS5cbiAgICAgIGRlbGV0ZSBwcmlzbS5sYW5ndWFnZXNbbGFuZ3VhZ2VdO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGdyYW1tYXIgb2YgYW4gYWxyZWFkeSByZWdpc3RlcmVkIFByaXNtIGxhbmd1YWdlLlxuICAgKlxuICAgKiBAcGFyYW0gcHJpc20gLSBUaGUgbG9hZGVkIFByaXNtIG1vZHVsZS5cbiAgICogQHBhcmFtIGxhbmd1YWdlIC0gVGhlIGxhbmd1YWdlIHRvIGxvb2sgdXAuXG4gICAqIEByZXR1cm5zIFRoZSBncmFtbWFyIG9mIHRoZSBsYW5ndWFnZS5cbiAgICogQHRocm93cyBBbiB7QGxpbmsgRXJyb3J9IGlmIHRoZSBsYW5ndWFnZSBpcyBub3QgcmVnaXN0ZXJlZC5cbiAgICovXG4gIHByaXZhdGUgcmVxdWlyZVByaXNtTGFuZ3VhZ2UocHJpc206IFByaXNtTW9kdWxlLCBsYW5ndWFnZTogc3RyaW5nKTogR3JhbW1hciB7XG4gICAgcmV0dXJuIHByaXNtLmxhbmd1YWdlc1tsYW5ndWFnZV0gPz8gdGhyb3dFeHByZXNzaW9uKG5ldyBFcnJvcihgUHJpc20gbGFuZ3VhZ2UgXCIke2xhbmd1YWdlfVwiIGlzIG5vdCByZWdpc3RlcmVkLmApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIGdyYW1tYXIgc291cmNlIGludG8gdGhlIGdyYW1tYXIgdG8gcmVnaXN0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwcmlzbSAtIFRoZSBsb2FkZWQgUHJpc20gbW9kdWxlLlxuICAgKiBAcGFyYW0gZ3JhbW1hclNvdXJjZSAtIFRoZSBncmFtbWFyIHNvdXJjZSB0byByZXNvbHZlLlxuICAgKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgZ3JhbW1hci5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUdyYW1tYXIocHJpc206IFByaXNtTW9kdWxlLCBncmFtbWFyU291cmNlOiBTeW50YXhIaWdobGlnaHRpbmdDb21wb25lbnRHcmFtbWFyU291cmNlKTogR3JhbW1hciB7XG4gICAgaWYgKHR5cGVvZiBncmFtbWFyU291cmNlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMucmVxdWlyZVByaXNtTGFuZ3VhZ2UocHJpc20sIGdyYW1tYXJTb3VyY2UpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZ3JhbW1hclNvdXJjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGdyYW1tYXJTb3VyY2Uoe1xuICAgICAgICBwcmlzbSxcbiAgICAgICAgcmVxdWlyZVByaXNtTGFuZ3VhZ2U6IChsYW5ndWFnZSkgPT4gdGhpcy5yZXF1aXJlUHJpc21MYW5ndWFnZShwcmlzbSwgbGFuZ3VhZ2UpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JhbW1hclNvdXJjZTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1Q0EsU0FBUyxpQkFBaUI7QUFLMUIsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxtQkFBbUI7QUFzRXJCLE1BQU0sb0NBQW9DLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWdCM0QsTUFBYSwrQkFBK0IsUUFBd0Y7QUFDbEksVUFBTTtBQUFBLE1BQ0o7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0YsSUFBSTtBQUVKLFNBQUssYUFBYTtBQUVsQixRQUFJLGlCQUFpQixRQUFXO0FBQzlCLFlBQU0sS0FBSywyQkFBMkI7QUFBQSxRQUNwQyxTQUFTO0FBQUEsUUFDVDtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFFQSxTQUFLLGFBQWE7QUFFbEIsVUFBTSxzQkFBc0IsT0FBTyxXQUFXLE1BQU0sUUFBUTtBQUM1RCxXQUFPLFdBQVcsV0FBVyxVQUFVLENBQUMsV0FBVyxPQUFPLFdBQVcsUUFBUSxRQUFRLFVBQVUsQ0FBQztBQUVoRyxTQUFLLFNBQVMsTUFBTTtBQUNsQixVQUFJLHdCQUF3QixRQUFXO0FBQ3JDLGVBQU8sV0FBVyxNQUFNLFFBQVEsSUFBSTtBQUNwQztBQUFBLE1BQ0Y7QUFHQSxhQUFPLE9BQU8sV0FBVyxNQUFNLFFBQVE7QUFBQSxJQUN6QyxDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQW1CQSxNQUFhLDJCQUEyQixRQUFvRjtBQUMxSCxVQUFNO0FBQUEsTUFDSjtBQUFBLE1BQ0E7QUFBQSxJQUNGLElBQUk7QUFFSixTQUFLLGFBQWE7QUFFbEIsVUFBTSxRQUFRLE1BQU0sVUFBVTtBQUc5QixTQUFLLGFBQWE7QUFFbEIsVUFBTSxrQkFBa0IsTUFBTSxVQUFVLFFBQVE7QUFDaEQsVUFBTSxVQUFVLFFBQVEsSUFBSSxLQUFLLGVBQWUsT0FBTyxPQUFPO0FBRTlELFNBQUssU0FBUyxNQUFNO0FBQ2xCLFVBQUksb0JBQW9CLFFBQVc7QUFDakMsY0FBTSxVQUFVLFFBQVEsSUFBSTtBQUM1QjtBQUFBLE1BQ0Y7QUFHQSxhQUFPLE1BQU0sVUFBVSxRQUFRO0FBQUEsSUFDakMsQ0FBQztBQUFBLEVBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVUSxxQkFBcUIsT0FBb0IsVUFBMkI7QUFDMUUsV0FBTyxNQUFNLFVBQVUsUUFBUSxLQUFLLGdCQUFnQixJQUFJLE1BQU0sbUJBQW1CLFFBQVEsc0JBQXNCLENBQUM7QUFBQSxFQUNsSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTUSxlQUFlLE9BQW9CLGVBQWtFO0FBQzNHLFFBQUksT0FBTyxrQkFBa0IsVUFBVTtBQUNyQyxhQUFPLEtBQUsscUJBQXFCLE9BQU8sYUFBYTtBQUFBLElBQ3ZEO0FBRUEsUUFBSSxPQUFPLGtCQUFrQixZQUFZO0FBQ3ZDLGFBQU8sY0FBYztBQUFBLFFBQ25CO0FBQUEsUUFDQSxzQkFBc0IsQ0FBQyxhQUFhLEtBQUsscUJBQXFCLE9BQU8sUUFBUTtBQUFBLE1BQy9FLENBQUM7QUFBQSxJQUNIO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -506,4 +506,4 @@ export {
506
506
  PluginSettingsTabBase,
507
507
  SAVE_TO_FILE_CONTEXT
508
508
  };
509
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9wbHVnaW4tc2V0dGluZ3MtdGFiLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5nIHRhYnMgaW4gT2JzaWRpYW4uXG4gKiBJdCBwcm92aWRlcyBhIHV0aWxpdHkgbWV0aG9kIHRvIGJpbmQgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsZSBjaGFuZ2VzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRGVib3VuY2VyLFxuICBQbHVnaW4sXG4gIFNldHRpbmcsXG4gIFNldHRpbmdEZWZpbml0aW9uR3JvdXAsXG4gIFNldHRpbmdEZWZpbml0aW9uSXRlbSxcbiAgU2V0dGluZ0RlZmluaXRpb25SZW5kZXIsXG4gIFNldHRpbmdHcm91cFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7XG4gIENvbmRpdGlvbmFsS2V5cyxcbiAgRXhjZXB0LFxuICBQcm9taXNhYmxlLFxuICBSZWFkb25seURlZXBcbn0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHtcbiAgZGVib3VuY2UsXG4gIFBsdWdpblNldHRpbmdUYWIsXG4gIHNldFRvb2x0aXBcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFN0cmluZ0tleXMgfSBmcm9tICcuLi8uLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlLFxuICBSZWFkb25seVBsdWdpblNldHRpbmdzLFxuICBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGVcbn0gZnJvbSAnLi4vY29tcG9uZW50cy9wbHVnaW4tc2V0dGluZ3MtY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmcgfSBmcm9tICcuLi9zZXR0aW5nLWNvbXBvbmVudHMvdmFsdWUtY29tcG9uZW50LXdpdGgtY2hhbmdlLXRyYWNraW5nLnRzJztcbmltcG9ydCB0eXBlIHsgU2V0dGluZ0V4IH0gZnJvbSAnLi4vc2V0dGluZy1leC50cyc7XG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRpb25NZXNzYWdlSG9sZGVyIH0gZnJvbSAnLi4vdmFsaWRhdGlvbi50cyc7XG5cbmltcG9ydCB7IG1peGluQXN5bmNFdmVudHMgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHtcbiAgY29udmVydEFzeW5jVG9TeW5jLFxuICBpbnZva2VBc3luY1NhZmVseVxufSBmcm9tICcuLi8uLi9hc3luYy50cyc7XG5pbXBvcnQge1xuICBub29wLFxuICBub29wQXN5bmNcbn0gZnJvbSAnLi4vLi4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHtcbiAgY2FzdFRvLFxuICBkZWVwRXF1YWwsXG4gIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllc1xufSBmcm9tICcuLi8uLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbGFibGUgfSBmcm9tICcuLi8uLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyByZWdpc3RlckFzeW5jRXZlbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2FzeW5jLWV2ZW50cy1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuLi9jb21wb25lbnRzL2NvbXBvbmVudC1leC50cyc7XG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyBlbnN1cmVXcmFwcGVkIH0gZnJvbSAnLi4vc2V0dGluZy1jb21wb25lbnRzL3NldHRpbmctY29tcG9uZW50LXdyYXBwZXIudHMnO1xuaW1wb3J0IHsgZ2V0VGV4dEJhc2VkQ29tcG9uZW50VmFsdWUgfSBmcm9tICcuLi9zZXR0aW5nLWNvbXBvbmVudHMvdGV4dC1iYXNlZC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgZ2V0VmFsaWRhdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vc2V0dGluZy1jb21wb25lbnRzL3ZhbGlkYXRvci1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgYWRvcHRTZXR0aW5nRXggfSBmcm9tICcuLi9zZXR0aW5nLWV4LnRzJztcbmltcG9ydCB7IGlzVmFsaWRhdGlvbk1lc3NhZ2VIb2xkZXIgfSBmcm9tICcuLi92YWxpZGF0aW9uLnRzJztcbmltcG9ydCB7IGFkZFBsdWdpbkNzc0NsYXNzZXMgfSBmcm9tICcuL3BsdWdpbi1jb250ZXh0LnRzJztcblxuLyoqXG4gKiBBIGNvbnRleHQgcGFzc2VkIHRvIHRoZSB7QGxpbmsgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlLnNhdmVUb0ZpbGV9IG1ldGhvZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNBVkVfVE9fRklMRV9DT05URVhUID0gJ1BsdWdpblNldHRpbmdzVGFiJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBgUGx1Z2luU2V0dGluZ3NUYWJCYXNlLmJpbmRgLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBzZXR0aW5ncyBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5kT3B0aW9uczxUPiB7XG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQgY2hhbmdlcy5cbiAgICovXG4gIG9uQ2hhbmdlZD8obmV3VmFsdWU6IFJlYWRvbmx5RGVlcDxUPiwgb2xkVmFsdWU6IFJlYWRvbmx5RGVlcDxUPik6IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVzZXQgdGhlIHNldHRpbmcgd2hlbiB0aGUgY29tcG9uZW50IHZhbHVlIGlzIGVtcHR5LlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgdG8gdGV4dC1iYXNlZCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJlc2V0U2V0dGluZ1doZW5Db21wb25lbnRJc0VtcHR5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IHRoZSBwbGFjZWhvbGRlciBmb3IgZGVmYXVsdCB2YWx1ZXMuXG4gICAqIEFwcGxpY2FibGUgb25seSB0byB0ZXh0LWJhc2VkIGNvbXBvbmVudHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd1BsYWNlaG9sZGVyRm9yRGVmYXVsdFZhbHVlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIHdoZW4gdGhlIGNvbXBvbmVudCB2YWx1ZSBpcyBpbnZhbGlkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dWYWxpZGF0aW9uTWVzc2FnZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRXh0ZW5kZWQgb3B0aW9ucyBmb3IgYFBsdWdpblNldHRpbmdzVGFiQmFzZS5iaW5kYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0eXBlLlxuICogQHR5cGVQYXJhbSBVSVZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIFVJIGNvbXBvbmVudCdzIHZhbHVlLlxuICogQHR5cGVQYXJhbSBQcm9wZXJ0eU5hbWUgLSBUaGUgc2V0dGluZ3MgcHJvcGVydHkgbmFtZSBiZWluZyBib3VuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5kT3B0aW9uc0V4dGVuZGVkPFxuICBQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdCxcbiAgVUlWYWx1ZSxcbiAgUHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5cbj4gZXh0ZW5kcyBCaW5kT3B0aW9uczxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPiB7XG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgVUkgY29tcG9uZW50J3MgdmFsdWUgYmFjayB0byB0aGUgcGx1Z2luIHNldHRpbmdzIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0gdWlWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgdG8gc2V0IG9uIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gICAqL1xuICBjb21wb25lbnRUb1BsdWdpblNldHRpbmdzVmFsdWVDb252ZXJ0ZXIodWlWYWx1ZTogVUlWYWx1ZSk6IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0gfCBWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcjtcblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIHBsdWdpbiBzZXR0aW5ncyB2YWx1ZSB0byB0aGUgdmFsdWUgdXNlZCBieSB0aGUgVUkgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luU2V0dGluZ3NWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIHRvIHNldCBvbiB0aGUgVUkgY29tcG9uZW50LlxuICAgKi9cbiAgcGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyKHBsdWdpblNldHRpbmdzVmFsdWU6IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPik6IFVJVmFsdWU7XG59XG5cbi8qKlxuICogRXh0ZW5kZWQgcGFyYW1zIGZvciB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJCYXNlLmJpbmR9IHdpdGggdmFsdWUgY29udmVydGVycy5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0eXBlLlxuICogQHR5cGVQYXJhbSBVSVZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIFVJIGNvbXBvbmVudCdzIHZhbHVlLlxuICogQHR5cGVQYXJhbSBUVmFsdWVDb21wb25lbnQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgY29tcG9uZW50LlxuICogQHR5cGVQYXJhbSBQcm9wZXJ0eU5hbWUgLSBUaGUgc2V0dGluZ3MgcHJvcGVydHkgbmFtZSBiZWluZyBib3VuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1RhYkJhc2VCaW5kRXh0ZW5kZWRQYXJhbXM8XG4gIFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0LFxuICBVSVZhbHVlLFxuICBUVmFsdWVDb21wb25lbnQsXG4gIFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+XG4+IGV4dGVuZHMgQmluZE9wdGlvbnNFeHRlbmRlZDxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgUHJvcGVydHlOYW1lPiB7XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqL1xuICByZWFkb25seSBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZTtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIGNvbXBvbmVudCB0byBiaW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVDb21wb25lbnQ6IFRWYWx1ZUNvbXBvbmVudCAmIFZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nPFVJVmFsdWU+O1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZS5iaW5kfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0eXBlLlxuICogQHR5cGVQYXJhbSBVSVZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIFVJIGNvbXBvbmVudCdzIHZhbHVlLlxuICogQHR5cGVQYXJhbSBUVmFsdWVDb21wb25lbnQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzVGFiQmFzZUJpbmRQYXJhbXM8XG4gIFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0LFxuICBVSVZhbHVlLFxuICBUVmFsdWVDb21wb25lbnRcbj4gZXh0ZW5kcyBCaW5kT3B0aW9uczxVSVZhbHVlPiB7XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvcGVydHlOYW1lOiBDb25kaXRpb25hbEtleXM8UGx1Z2luU2V0dGluZ3MsIFVJVmFsdWU+O1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgY29tcG9uZW50IHRvIGJpbmQuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50ICYgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciBjcmVhdGluZyBhIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgcGx1Z2luIHNldHRpbmdzIHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3NUYWJCYXNlQ29uc3RydWN0b3JQYXJhbXM8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaW5zdGFuY2UgKG5lZWRlZCBieSBPYnNpZGlhbidzIFBsdWdpblNldHRpbmdUYWIpLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5ncyBjb21wb25lbnQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudDogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPFBsdWdpblNldHRpbmdzPjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2Uuc2V0dGluZ0V4fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nRXhQYXJhbXMge1xuICAvKipcbiAgICogQWRkaXRpb25hbCBzZWFyY2ggdGVybXMgZm9yIHRoZSBzZXR0aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHNldHRpbmcuIFVzZWQgZm9yIHJlbmRlcmluZzsgdGhlIHRleHQgY29udGVudCBvZiBhIGZyYWdtZW50IGlzIHVzZWQgZm9yIHNlYXJjaC5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2M/OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzZXR0aW5nIHJvdyBpcyBkaXNhYmxlZC5cbiAgICpcbiAgICogQSBmdW5jdGlvbiBmb3JtIGlzIHJlLWV2YWx1YXRlZCBvbiBldmVyeSByZW5kZXIgQU5EIG9uIGV2ZXJ5IHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2UucmVmcmVzaERvbVN0YXRlfVxuICAgKiBjYWxsLCBzbyBpdCBjYW4gcmVmbGVjdCBydW50aW1lIHN0YXRlLiBPYnNpZGlhbiBhcHBsaWVzIGl0IHdpdGggYFNldHRpbmcuc2V0RGlzYWJsZWRgLCB3aGljaCBkaXNhYmxlcyB0aGVcbiAgICogcm93IGFuZCBldmVyeSBjb21wb25lbnQgcmVnaXN0ZXJlZCBvbiBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGRpc2FibGVkPzogKCgpID0+IGJvb2xlYW4pIHwgYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgc2V0dGluZy4gVXNlZCBmb3IgcmVuZGVyaW5nIGFuZCBzZWFyY2guXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHNldHRpbmcgcm93IGltcGVyYXRpdmVseSwgdHlwaWNhbGx5IHZpYSB0aGUge0BsaW5rIFNldHRpbmdFeH0gYWRkZXJzIGFuZFxuICAgKiB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJCYXNlLmJpbmR9LlxuICAgKlxuICAgKiBUaGUgc2V0dGluZyBPYnNpZGlhbiBjcmVhdGVzIGZvciB0aGUgcm93IGlzIGFkb3B0ZWQgaW50byBhIHtAbGluayBTZXR0aW5nRXh9IGJlZm9yZSBpdCBpcyBoYW5kZWQgb3Zlciwgc29cbiAgICogYW4gaW1wZXJhdGl2ZSByb3cgYm9keSBjYXJyaWVzIG92ZXIgdW5jaGFuZ2VkLiBNYXkgcmV0dXJuIGEgY2xlYW51cCBmdW5jdGlvbiwgaW52b2tlZCBiZWZvcmUgdGhlIHJvdyBpc1xuICAgKiB0b3JuIGRvd24gb3IgcmUtcmVuZGVyZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5nIC0gVGhlIHNldHRpbmcgdG8gcmVuZGVyIGludG8uXG4gICAqIEBwYXJhbSBncm91cCAtIFRoZSBncm91cCB0aGUgc2V0dGluZyBiZWxvbmdzIHRvLlxuICAgKiBAcmV0dXJucyBBbiBvcHRpb25hbCBjbGVhbnVwIGZ1bmN0aW9uLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbnZhbGlkLXZvaWQtdHlwZSAtLSBNaXJyb3JzIE9ic2lkaWFuJ3MgYFNldHRpbmdEZWZpbml0aW9uUmVuZGVyLnJlbmRlcmAsIHdob3NlIGNsZWFudXAgZnVuY3Rpb24gaXMgb3B0aW9uYWwuXG4gIHJlbmRlcihzZXR0aW5nOiBTZXR0aW5nRXgsIGdyb3VwOiBTZXR0aW5nR3JvdXApOiAoKCkgPT4gdm9pZCkgfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBzZXR0aW5nIGlzIGluY2x1ZGVkIGluIHRoZSBzZXR0aW5ncyBzZWFyY2guIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNlYXJjaGFibGU/OiAoKCkgPT4gYm9vbGVhbikgfCBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBzZXR0aW5nIHJvdyBpcyByZW5kZXJlZC4gQSBmdW5jdGlvbiBmb3JtIGlzIHJlLWV2YWx1YXRlZCBvbiBldmVyeSByZW5kZXIgYW5kIG9uXG4gICAqIGV2ZXJ5IHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2UucmVmcmVzaERvbVN0YXRlfSBjYWxsLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSB2aXNpYmxlPzogKCgpID0+IGJvb2xlYW4pIHwgYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2Uuc2V0dGluZ0dyb3VwRXh9LlxuICpcbiAqIEV2ZXJ5IG1lbWJlciBvZiB7QGxpbmsgU2V0dGluZ0RlZmluaXRpb25Hcm91cH0gZXhjZXB0IGl0cyBkaXNjcmltaW5hdG9yLCB3aGljaFxuICoge0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZS5zZXR0aW5nR3JvdXBFeH0gc2V0cy5cbiAqL1xuZXhwb3J0IHR5cGUgUGx1Z2luU2V0dGluZ3NUYWJCYXNlU2V0dGluZ0dyb3VwRXhQYXJhbXMgPSBFeGNlcHQ8U2V0dGluZ0RlZmluaXRpb25Hcm91cCwgJ3R5cGUnPjtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBwYXJhbXMgZm9yIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2UuYmluZH0uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSBwbHVnaW4gc2V0dGluZ3MgdHlwZS5cbiAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSBVSSBjb21wb25lbnQncyB2YWx1ZS5cbiAqIEB0eXBlUGFyYW0gVFZhbHVlQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIHNldHRpbmdzIHByb3BlcnR5IG5hbWUgYmVpbmcgYm91bmQuXG4gKi9cbmludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1RhYkJhc2VCaW5kSW1wbFBhcmFtczxcbiAgUGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3QsXG4gIFVJVmFsdWUsXG4gIFRWYWx1ZUNvbXBvbmVudCxcbiAgUHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5cbj4gZXh0ZW5kcyBCaW5kT3B0aW9uczxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPiB7XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqL1xuICByZWFkb25seSBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZTtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIGNvbXBvbmVudCB0byBiaW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVDb21wb25lbnQ6IFRWYWx1ZUNvbXBvbmVudCAmIFZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nPFVJVmFsdWU+O1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3NUYWJCYXNlRXZlbnRNYXAge1xuICB2YWxpZGF0aW9uTWVzc2FnZUNoYW5nZWQ6IFtwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZ107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZS5vblNhdmVTZXR0aW5nc30uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gKi9cbmludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1RhYkJhc2VPblNhdmVTZXR0aW5nc1BhcmFtczxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogVGhlIHNhdmUgY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ6IHVua25vd247XG5cbiAgLyoqXG4gICAqIFRoZSBuZXcgc2V0dGluZ3Mgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSBuZXdTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPjtcblxuICAvKipcbiAgICogVGhlIG9sZCBzZXR0aW5ncyBzdGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+O1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZS5yZW5kZXJTZXR0aW5nRXh9LlxuICovXG5pbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3NUYWJCYXNlUmVuZGVyU2V0dGluZ0V4UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBncm91cCB0aGUgcm93IGJlbG9uZ3MgdG8uXG4gICAqL1xuICByZWFkb25seSBncm91cDogU2V0dGluZ0dyb3VwO1xuXG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZyBPYnNpZGlhbiBjcmVhdGVkIGZvciB0aGUgcm93LlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0dGluZzogU2V0dGluZztcblxuICAvKipcbiAgICogVGhlIHBhcmFtcyB0aGUgcm93IHdhcyBkZWNsYXJlZCB3aXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0dGluZ0V4UGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nRXhQYXJhbXM7XG59XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1zIGZvciB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJFdmVudHNDb21wb25lbnR9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgcGx1Z2luIHNldHRpbmdzIHR5cGUuXG4gKi9cbmludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1RhYkV2ZW50c0NvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIHNldHRpbmdzIGFyZSBsb2FkZWQuXG4gICAqL1xuICBvbkxvYWRTZXR0aW5ncyhsb2FkZWRTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPiwgaXNJbml0aWFsTG9hZDogYm9vbGVhbik6IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gc2V0dGluZ3MgYXJlIHNhdmVkLlxuICAgKi9cbiAgb25TYXZlU2V0dGluZ3MoXG4gICAgbmV3U3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgb2xkU3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgY29udGV4dDogdW5rbm93blxuICApOiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZ3MgY29tcG9uZW50IHRvIHN1YnNjcmliZSB0by5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ29tcG9uZW50OiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2U8UGx1Z2luU2V0dGluZ3M+O1xufVxuXG4vKipcbiAqIE93bnMgdGhlIHRhYidzIHN1YnNjcmlwdGlvbnMgdG8gdGhlIHNldHRpbmdzIGNvbXBvbmVudC5cbiAqXG4gKiBUaGUgc3Vic2NyaXB0aW9ucyBsaXZlIGluIHtAbGluayBvbmxvYWR9IHJhdGhlciB0aGFuIGF0IGVhY2ggcmVuZGVyLCBzbyB0aGF0IGEgbG9hZC91bmxvYWQgcGFpciByZWdpc3RlcnNcbiAqIHRoZW0gZXhhY3RseSBvbmNlLiBSZWdpc3RlcmluZyB0aGVtIHBlciByZW5kZXIgaW5zdGVhZCB3b3VsZCBhY2N1bXVsYXRlIGEgZnJlc2ggcGFpciBvbiBldmVyeSByZW5kZXIgY3ljbGUsXG4gKiBiZWNhdXNlIHtAbGluayBDb21wb25lbnRFeC5sb2FkfSBlYXJseS1yZXR1cm5zIG9uY2UgdGhlIGNvbXBvbmVudCBpcyBsb2FkZWQgYW5kIG5vdGhpbmcgcmVzZXRzIGluIGJldHdlZW4uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSBwbHVnaW4gc2V0dGluZ3MgdHlwZS5cbiAqL1xuY2xhc3MgUGx1Z2luU2V0dGluZ3NUYWJFdmVudHNDb21wb25lbnQ8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmFtczogUGx1Z2luU2V0dGluZ3NUYWJFdmVudHNDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtczxQbHVnaW5TZXR0aW5ncz47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtcy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpblNldHRpbmdzVGFiRXZlbnRzQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXM8UGx1Z2luU2V0dGluZ3M+KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIHRvIHRoZSBzZXR0aW5ncyBjb21wb25lbnQncyBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIGNvbnN0IHsgcGx1Z2luU2V0dGluZ3NDb21wb25lbnQgfSA9IHRoaXMucGFyYW1zO1xuICAgIHJlZ2lzdGVyQXN5bmNFdmVudCh0aGlzLCBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5vbignbG9hZFNldHRpbmdzJywgKGxvYWRlZFN0YXRlLCBpc0luaXRpYWxMb2FkKSA9PiB0aGlzLnBhcmFtcy5vbkxvYWRTZXR0aW5ncyhsb2FkZWRTdGF0ZSwgaXNJbml0aWFsTG9hZCkpKTtcbiAgICByZWdpc3RlckFzeW5jRXZlbnQodGhpcywgcGx1Z2luU2V0dGluZ3NDb21wb25lbnQub24oJ3NhdmVTZXR0aW5ncycsIChuZXdTdGF0ZSwgb2xkU3RhdGUsIGNvbnRleHQpID0+IHRoaXMucGFyYW1zLm9uU2F2ZVNldHRpbmdzKG5ld1N0YXRlLCBvbGRTdGF0ZSwgY29udGV4dCkpKTtcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5ncyB0YWJzIGluIE9ic2lkaWFuLlxuICogUHJvdmlkZXMgYSBtZXRob2QgZm9yIGJpbmRpbmcgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsaW5nIGNoYW5nZXMuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSBwbHVnaW4gc2V0dGluZ3MgdHlwZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpblNldHRpbmdzVGFiQmFzZTxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBtaXhpbkFzeW5jRXZlbnRzPFBsdWdpblNldHRpbmdzVGFiQmFzZUV2ZW50TWFwPigpKFBsdWdpblNldHRpbmdUYWIpIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsdWdpbiBzZXR0aW5ncyB0YWIgaXMgb3Blbi5cbiAgICpcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgcGx1Z2luIHNldHRpbmdzIHRhYiBpcyBvcGVuLlxuICAgKi9cbiAgcHVibGljIGdldCBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzT3BlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZ3MgbWFuYWdlci5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudDogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPFBsdWdpblNldHRpbmdzPjtcblxuICAvKipcbiAgICogQSBkZWJvdW5jZSB0aW1lb3V0IGZvciBzYXZpbmcgc2V0dGluZ3MuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBkZWJvdW5jZSB0aW1lb3V0IGZvciBzYXZpbmcgc2V0dGluZ3MuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHNhdmVTZXR0aW5nc0RlYm91bmNlVGltZW91dEluTWlsbGlzZWNvbmRzKCk6IG51bWJlciB7XG4gICAgY29uc3QgREVGQVVMVCA9IDJfMDAwO1xuICAgIHJldHVybiBERUZBVUxUO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNPcGVuID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50OiBQbHVnaW5TZXR0aW5nc1RhYkV2ZW50c0NvbXBvbmVudDxQbHVnaW5TZXR0aW5ncz47XG4gIHByaXZhdGUgY3VycmVudFJlbmRlckNvbXBvbmVudDogQ29tcG9uZW50RXggfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBzYXZlU2V0dGluZ3NEZWJvdW5jZWQ6IERlYm91bmNlcjxbXSwgdm9pZD47XG5cbiAgcHJpdmF0ZSBnZXQgcGx1Z2luU2V0dGluZ3MoKTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nczxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIHJldHVybiB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50LnNldHRpbmdzU3RhdGUuaW5wdXRWYWx1ZXM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gc2V0dGluZ3MgdGFiLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtcy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpblNldHRpbmdzVGFiQmFzZUNvbnN0cnVjdG9yUGFyYW1zPFBsdWdpblNldHRpbmdzPikge1xuICAgIHN1cGVyKHBhcmFtcy5wbHVnaW4uYXBwLCBwYXJhbXMucGx1Z2luKTtcbiAgICB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpblNldHRpbmdzQ29tcG9uZW50O1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXModGhpcy5jb250YWluZXJFbCwgQ3NzQ2xhc3MuUGx1Z2luU2V0dGluZ3NUYWIpO1xuICAgIHRoaXMuc2F2ZVNldHRpbmdzRGVib3VuY2VkID0gZGVib3VuY2UoXG4gICAgICBjb252ZXJ0QXN5bmNUb1N5bmMoKCkgPT4gdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5zYXZlVG9GaWxlKFNBVkVfVE9fRklMRV9DT05URVhUKSksXG4gICAgICB0aGlzLnNhdmVTZXR0aW5nc0RlYm91bmNlVGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgKTtcbiAgICB0aGlzLmNvbXBvbmVudCA9IG5ldyBQbHVnaW5TZXR0aW5nc1RhYkV2ZW50c0NvbXBvbmVudDxQbHVnaW5TZXR0aW5ncz4oe1xuICAgICAgb25Mb2FkU2V0dGluZ3M6IChsb2FkZWRTdGF0ZSwgaXNJbml0aWFsTG9hZCk6IFByb21pc2FibGU8dm9pZD4gPT4gdGhpcy5vbkxvYWRTZXR0aW5ncyhsb2FkZWRTdGF0ZSwgaXNJbml0aWFsTG9hZCksXG4gICAgICBvblNhdmVTZXR0aW5nczogKG5ld1N0YXRlLCBvbGRTdGF0ZSwgY29udGV4dCk6IFByb21pc2FibGU8dm9pZD4gPT4gdGhpcy5vblNhdmVTZXR0aW5ncyh7IGNvbnRleHQsIG5ld1N0YXRlLCBvbGRTdGF0ZSB9KSxcbiAgICAgIHBsdWdpblNldHRpbmdzQ29tcG9uZW50OiB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgYSB2YWx1ZSBjb21wb25lbnQgdG8gYSBwbHVnaW4gc2V0dGluZy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBVSVZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIG9mIHRoZSBVSSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gVFZhbHVlQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbXMgZm9yIGJpbmRpbmcgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBiaW5kPFxuICAgIFVJVmFsdWUsXG4gICAgVFZhbHVlQ29tcG9uZW50XG4gID4oXG4gICAgcGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VCaW5kUGFyYW1zPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlLCBUVmFsdWVDb21wb25lbnQ+XG4gICk6IFRWYWx1ZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtcyBmb3IgYmluZGluZyB0aGUgdmFsdWUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGJpbmQ8XG4gICAgVUlWYWx1ZSxcbiAgICBUVmFsdWVDb21wb25lbnQsXG4gICAgUHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5cbiAgPihcbiAgICBwYXJhbXM6IFBsdWdpblNldHRpbmdzVGFiQmFzZUJpbmRFeHRlbmRlZFBhcmFtczxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgVFZhbHVlQ29tcG9uZW50LCBQcm9wZXJ0eU5hbWU+XG4gICk6IFRWYWx1ZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtcyBmb3IgYmluZGluZyB0aGUgdmFsdWUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGJpbmQ8XG4gICAgVUlWYWx1ZSxcbiAgICBUVmFsdWVDb21wb25lbnQsXG4gICAgUHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5cbiAgPihcbiAgICBwYXJhbXM6IFBsdWdpblNldHRpbmdzVGFiQmFzZUJpbmRJbXBsUGFyYW1zPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlLCBUVmFsdWVDb21wb25lbnQsIFByb3BlcnR5TmFtZT4gLy8gZXNsaW50LWRpc2FibGUtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBiaW5kIG92ZXJsb2FkIHNoYXJlcyB0aGUgQmluZCogcGFyYW0gZmFtaWx5LlxuICApOiBUVmFsdWVDb21wb25lbnQge1xuICAgIGNvbnN0IHtcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIHZhbHVlQ29tcG9uZW50LFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0gPSBwYXJhbXM7XG4gICAgdHlwZSBQcm9wZXJ0eVR5cGUgPSBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdO1xuICAgIGNvbnN0IERFRkFVTFRfT1BUSU9OUzogUmVxdWlyZWQ8QmluZE9wdGlvbnNFeHRlbmRlZDxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgUHJvcGVydHlOYW1lPj4gPSB7XG4gICAgICBjb21wb25lbnRUb1BsdWdpblNldHRpbmdzVmFsdWVDb252ZXJ0ZXI6ICh2YWx1ZTogVUlWYWx1ZSk6IFByb3BlcnR5VHlwZSA9PiB2YWx1ZSBhcyBQcm9wZXJ0eVR5cGUsXG4gICAgICBvbkNoYW5nZWQ6IG5vb3AsXG4gICAgICBwbHVnaW5TZXR0aW5nc1RvQ29tcG9uZW50VmFsdWVDb252ZXJ0ZXI6ICh2YWx1ZTogUmVhZG9ubHlEZWVwPFByb3BlcnR5VHlwZT4pOiBVSVZhbHVlID0+IHZhbHVlIGFzIFVJVmFsdWUsXG4gICAgICBzaG91bGRSZXNldFNldHRpbmdXaGVuQ29tcG9uZW50SXNFbXB0eTogdHJ1ZSxcbiAgICAgIHNob3VsZFNob3dQbGFjZWhvbGRlckZvckRlZmF1bHRWYWx1ZXM6IHRydWUsXG4gICAgICBzaG91bGRTaG93VmFsaWRhdGlvbk1lc3NhZ2U6IHRydWVcbiAgICB9O1xuXG4gICAgY29uc3Qgb3B0aW9uc0V4dDogUmVxdWlyZWQ8QmluZE9wdGlvbnNFeHRlbmRlZDxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgUHJvcGVydHlOYW1lPj4gPSB7IC4uLkRFRkFVTFRfT1BUSU9OUywgLi4ub3B0aW9ucyB9O1xuXG4gICAgY29uc3QgdmFsaWRhdG9yRWwgPSBnZXRWYWxpZGF0b3JDb21wb25lbnQodmFsdWVDb21wb25lbnQpPy52YWxpZGF0b3JFbDtcblxuICAgIGNvbnN0IHRleHRCYXNlZENvbXBvbmVudCA9IGdldFRleHRCYXNlZENvbXBvbmVudFZhbHVlKHZhbHVlQ29tcG9uZW50KTtcblxuICAgIGNvbnN0IHJlYWRvbmx5VmFsdWUgPSB0aGlzLmdldFBsdWdpblNldHRpbmdzUHJvcGVydHkocHJvcGVydHlOYW1lKTtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMucGx1Z2luU2V0dGluZ3NDb21wb25lbnQuZGVmYXVsdFNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRzW3Byb3BlcnR5TmFtZV07XG4gICAgY29uc3QgZGVmYXVsdENvbXBvbmVudFZhbHVlID0gb3B0aW9uc0V4dC5wbHVnaW5TZXR0aW5nc1RvQ29tcG9uZW50VmFsdWVDb252ZXJ0ZXIoZGVmYXVsdFZhbHVlIGFzIFJlYWRvbmx5RGVlcDxQcm9wZXJ0eVR5cGU+KTtcbiAgICB0ZXh0QmFzZWRDb21wb25lbnQ/LnNldFBsYWNlaG9sZGVyVmFsdWUoZGVmYXVsdENvbXBvbmVudFZhbHVlKTtcblxuICAgIGxldCB2YWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nO1xuICAgIGxldCB0b29sdGlwRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHRvb2x0aXBDb250ZW50RWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKHZhbGlkYXRvckVsKSB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gZW5zdXJlV3JhcHBlZCh2YWxpZGF0b3JFbCk7XG4gICAgICB0b29sdGlwRWwgPSB3cmFwcGVyLmNyZWF0ZURpdigpO1xuICAgICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyh0b29sdGlwRWwsIFtDc3NDbGFzcy5Ub29sdGlwLCBDc3NDbGFzcy5Ub29sdGlwVmFsaWRhdG9yXSk7XG4gICAgICB0b29sdGlwQ29udGVudEVsID0gdG9vbHRpcEVsLmNyZWF0ZVNwYW4oKTtcbiAgICAgIGNvbnN0IHRvb2x0aXBBcnJvd0VsID0gdG9vbHRpcEVsLmNyZWF0ZURpdigpO1xuICAgICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyh0b29sdGlwQXJyb3dFbCwgQ3NzQ2xhc3MuVG9vbHRpcEFycm93KTtcbiAgICAgIHRvb2x0aXBFbC5oaWRlKCk7XG4gICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKHRvb2x0aXBFbCk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJBc3luY0V2ZW50KFxuICAgICAgdGhpcy5nZXRSZW5kZXJDb21wb25lbnQoKSxcbiAgICAgIHRoaXMub24oJ3ZhbGlkYXRpb25NZXNzYWdlQ2hhbmdlZCcsIChhbm90aGVyUHJvcGVydHlOYW1lLCBhbm90aGVyVmFsaWRhdGlvbk1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKHByb3BlcnR5TmFtZSAhPT0gYW5vdGhlclByb3BlcnR5TmFtZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbGlkYXRpb25NZXNzYWdlID0gYW5vdGhlclZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgICB1cGRhdGVWYWxpZGF0b3JFbERlYm91bmNlZCgpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgbGV0IHNob3VsZEVtcHR5T25CbHVyID0gZmFsc2U7XG4gICAgbGV0IHNob3VsZFJldmVydFRvRGVmYXVsdFZhbHVlT25CbHVyID0gZmFsc2U7XG5cbiAgICBpZiAodGV4dEJhc2VkQ29tcG9uZW50ICYmIG9wdGlvbnNFeHQuc2hvdWxkU2hvd1BsYWNlaG9sZGVyRm9yRGVmYXVsdFZhbHVlcyAmJiBkZWVwRXF1YWwocmVhZG9ubHlWYWx1ZSwgZGVmYXVsdFZhbHVlKSkge1xuICAgICAgdGV4dEJhc2VkQ29tcG9uZW50LmVtcHR5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlQ29tcG9uZW50LnNldFZhbHVlKG9wdGlvbnNFeHQucGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyKHJlYWRvbmx5VmFsdWUpKTtcbiAgICB9XG5cbiAgICBsZXQgc2hvdWxkU2tpcE9uQ2hhbmdlID0gZmFsc2U7XG4gICAgY29uc3QgVVBEQVRFX1ZBTElEQVRPUl9FTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwMDtcbiAgICBjb25zdCB1cGRhdGVWYWxpZGF0b3JFbERlYm91bmNlZCA9IGRlYm91bmNlKCgpID0+IHtcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB1cGRhdGVWYWxpZGF0b3JFbCgpO1xuICAgICAgfSk7XG4gICAgfSwgVVBEQVRFX1ZBTElEQVRPUl9FTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICB2YWx1ZUNvbXBvbmVudC5vbkNoYW5nZShjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKHVpVmFsdWUpID0+IHtcbiAgICAgIGlmIChzaG91bGRTa2lwT25DaGFuZ2UpIHtcbiAgICAgICAgc2hvdWxkU2tpcE9uQ2hhbmdlID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2hvdWxkRW1wdHlPbkJsdXIgPSBmYWxzZTtcblxuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLmdldFBsdWdpblNldHRpbmdzUHJvcGVydHkocHJvcGVydHlOYW1lKTtcbiAgICAgIGxldCBuZXdWYWx1ZTogUHJvcGVydHlUeXBlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgbGV0IHNob3VsZFNldFByb3BlcnR5ID0gdHJ1ZTtcbiAgICAgIHNob3VsZFJldmVydFRvRGVmYXVsdFZhbHVlT25CbHVyID0gISF0ZXh0QmFzZWRDb21wb25lbnQ/LmlzRW1wdHkoKSAmJiBvcHRpb25zRXh0LnNob3VsZFJlc2V0U2V0dGluZ1doZW5Db21wb25lbnRJc0VtcHR5O1xuICAgICAgaWYgKHNob3VsZFJldmVydFRvRGVmYXVsdFZhbHVlT25CbHVyKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29udmVydGVkVmFsdWUgPSBvcHRpb25zRXh0LmNvbXBvbmVudFRvUGx1Z2luU2V0dGluZ3NWYWx1ZUNvbnZlcnRlcih1aVZhbHVlKTtcbiAgICAgICAgaWYgKGlzVmFsaWRhdGlvbk1lc3NhZ2VIb2xkZXIoY29udmVydGVkVmFsdWUpKSB7XG4gICAgICAgICAgdmFsaWRhdGlvbk1lc3NhZ2UgPSBjb252ZXJ0ZWRWYWx1ZS52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgICAgICBzaG91bGRTZXRQcm9wZXJ0eSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1ZhbHVlID0gY29udmVydGVkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFNldFByb3BlcnR5KSB7XG4gICAgICAgIHZhbGlkYXRpb25NZXNzYWdlID0gYXdhaXQgdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlIGFzIFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0pO1xuICAgICAgICBpZiAodGV4dEJhc2VkQ29tcG9uZW50ICYmIG9wdGlvbnNFeHQuc2hvdWxkU2hvd1BsYWNlaG9sZGVyRm9yRGVmYXVsdFZhbHVlcyAmJiAhdGV4dEJhc2VkQ29tcG9uZW50LmlzRW1wdHkoKSAmJiBkZWVwRXF1YWwobmV3VmFsdWUsIGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgICBzaG91bGRFbXB0eU9uQmx1ciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlVmFsaWRhdG9yRWxEZWJvdW5jZWQoKTtcbiAgICAgIGlmIChzaG91bGRTZXRQcm9wZXJ0eSkge1xuICAgICAgICBhd2FpdCBvcHRpb25zRXh0Lm9uQ2hhbmdlZChuZXdWYWx1ZSBhcyBSZWFkb25seURlZXA8UHJvcGVydHlUeXBlPiwgb2xkVmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5zYXZlU2V0dGluZ3NEZWJvdW5jZWQoKTtcbiAgICB9KSk7XG5cbiAgICB2YWxpZGF0b3JFbD8uYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiB7XG4gICAgICB1cGRhdGVWYWxpZGF0b3JFbERlYm91bmNlZCgpO1xuICAgIH0pO1xuICAgIHZhbGlkYXRvckVsPy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xuICAgICAgdXBkYXRlVmFsaWRhdG9yRWxEZWJvdW5jZWQoKTtcbiAgICB9KTtcbiAgICB2YWxpZGF0b3JFbD8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdXBkYXRlVmFsaWRhdG9yRWxEZWJvdW5jZWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdmFsaWRhdGlvbk1lc3NhZ2VzID0gdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5zZXR0aW5nc1N0YXRlLnZhbGlkYXRpb25NZXNzYWdlcyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHZhbGlkYXRpb25NZXNzYWdlID0gdmFsaWRhdGlvbk1lc3NhZ2VzW3Byb3BlcnR5TmFtZV0gPz8gJyc7XG4gICAgdXBkYXRlVmFsaWRhdG9yRWxEZWJvdW5jZWQoKTtcblxuICAgIHJldHVybiB2YWx1ZUNvbXBvbmVudDtcblxuICAgIGZ1bmN0aW9uIHVwZGF0ZVZhbGlkYXRvckVsKCk6IHZvaWQge1xuICAgICAgaWYgKCF2YWxpZGF0b3JFbD8uaXNBY3RpdmVFbGVtZW50KCkpIHtcbiAgICAgICAgaWYgKHNob3VsZEVtcHR5T25CbHVyKSB7XG4gICAgICAgICAgc2hvdWxkRW1wdHlPbkJsdXIgPSBmYWxzZTtcblxuICAgICAgICAgIGlmICghdGV4dEJhc2VkQ29tcG9uZW50Py5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHNob3VsZFNraXBPbkNoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICB0ZXh0QmFzZWRDb21wb25lbnQ/LmVtcHR5KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNob3VsZFJldmVydFRvRGVmYXVsdFZhbHVlT25CbHVyKSB7XG4gICAgICAgICAgc2hvdWxkUmV2ZXJ0VG9EZWZhdWx0VmFsdWVPbkJsdXIgPSBmYWxzZTtcblxuICAgICAgICAgIGlmICh0ZXh0QmFzZWRDb21wb25lbnQ/LmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgc2hvdWxkU2tpcE9uQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhbHVlQ29tcG9uZW50LnNldFZhbHVlKGRlZmF1bHRDb21wb25lbnRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdmFsaWRhdG9yRWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhc3NlcnROb25OdWxsYWJsZSh0b29sdGlwQ29udGVudEVsKTtcblxuICAgICAgaWYgKHZhbGlkYXRpb25NZXNzYWdlID09PSAnJykge1xuICAgICAgICB2YWxpZGF0b3JFbC5zZXRDdXN0b21WYWxpZGl0eSgnJyk7XG4gICAgICAgIHZhbGlkYXRvckVsLmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgICAgdmFsaWRhdGlvbk1lc3NhZ2UgPSB2YWxpZGF0b3JFbC52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgIH1cblxuICAgICAgdmFsaWRhdG9yRWwuc2V0Q3VzdG9tVmFsaWRpdHkodmFsaWRhdGlvbk1lc3NhZ2UpO1xuICAgICAgaWYgKG9wdGlvbnNFeHQuc2hvdWxkU2hvd1ZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICAgIHRvb2x0aXBDb250ZW50RWwudGV4dENvbnRlbnQgPSB2YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgICAgdG9vbHRpcEVsPy50b2dnbGUoISF2YWxpZGF0aW9uTWVzc2FnZSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICAgIHNldFRvb2x0aXAodmFsaWRhdG9yRWwsIHZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgcGx1Z2luIHNldHRpbmdzIHRhYi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBkaXNwbGF5KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheUxlZ2FjeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExlZ2FjeSB3YXkgdG8gcmVuZGVyIHRoZSBwbHVnaW4gc2V0dGluZ3MgdGFiIGltcGVyYXRpdmVseS5cbiAgICpcbiAgICogVGhlIHByZS1kZWNsYXJhdGl2ZSBmYWxsYmFjazogT2JzaWRpYW4gb25seSBjYWxscyBpdCB3aGVuIHtAbGluayBnZXRTZXR0aW5nRGVmaW5pdGlvbnN9IHJldHVybnMgYW4gZW1wdHlcbiAgICogYXJyYXksIGkuZS4gd2hlbiB0aGUgY29uc3VtZXIgaGFzIG5vdCBvdmVycmlkZGVuIHtAbGluayBnZXRTZXR0aW5nRGVmaW5pdGlvbkl0ZW1zfS4gU3VjaCBhIGNvbnN1bWVyXG4gICAqIG92ZXJyaWRlcyB0aGlzIG1ldGhvZCBhbmQgYnVpbGRzIHRoZSBVSSB3aXRoIHtAbGluayBTZXR0aW5nRXh9IGFuZCB7QGxpbmsgYmluZH0uXG4gICAqL1xuICBwdWJsaWMgZGlzcGxheUxlZ2FjeSgpOiB2b2lkIHtcbiAgICB0aGlzLmJlZ2luUmVuZGVyQ3ljbGUoKTtcbiAgICB0aGlzLmNvbnRhaW5lckVsLmVtcHR5KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIHZhbHVlIGJhY2tpbmcgYSBuYXRpdmUgYGNvbnRyb2xgIHNldHRpbmcgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogT2JzaWRpYW4gY2FsbHMgaXQgb24gZXZlcnkgcmVuZGVyIG9mIGEgYGNvbnRyb2xgLXR5cGUgZGVmaW5pdGlvbi4gVGhlIGluaGVyaXRlZCBpbXBsZW1lbnRhdGlvbiByZWFkc1xuICAgKiBgcGx1Z2luLnNldHRpbmdzYCwgd2hpY2ggYSBwbHVnaW4gYnVpbHQgb24ge0BsaW5rIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZX0gbmV2ZXIgcG9wdWxhdGVzLCBzbyBpdCBpc1xuICAgKiByb3V0ZWQgdG8gdGhlIHNldHRpbmdzIGNvbXBvbmVudCBpbnN0ZWFkLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIHNldHRpbmdzIHByb3BlcnR5IG5hbWUuXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGdldENvbnRyb2xWYWx1ZShrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLmdldFBsdWdpblNldHRpbmdzUHJvcGVydHkoY2FzdFRvPFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+PihrZXkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkZWNsYXJhdGl2ZSBzZXR0aW5nIGRlZmluaXRpb25zIHJlbmRlcmVkIGJ5IE9ic2lkaWFuIDEuMTMrLlxuICAgKlxuICAgKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIGdldFNldHRpbmdEZWZpbml0aW9uSXRlbXN9LiBXaGVuIGEgY29uc3VtZXIgaGFzIG5vdCBvdmVycmlkZGVuIHRoYXQgaG9vayBpdCByZXR1cm5zXG4gICAqIGFuIGVtcHR5IGFycmF5LCBhbmQgT2JzaWRpYW4gZmFsbHMgYmFjayB0byB0aGUgaW1wZXJhdGl2ZSB7QGxpbmsgZGlzcGxheUxlZ2FjeX0gcGF0aC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0U2V0dGluZ0RlZmluaXRpb25zKCk6IFNldHRpbmdEZWZpbml0aW9uSXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTZXR0aW5nRGVmaW5pdGlvbkl0ZW1zKCk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgdGhlIHBsdWdpbiBzZXR0aW5ncyB0YWIuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgaGlkZSgpOiB2b2lkIHtcbiAgICBzdXBlci5oaWRlKCk7XG4gICAgdGhpcy5zYXZlU2V0dGluZ3NEZWJvdW5jZWQuY2FuY2VsKCk7XG4gICAgdGhpcy5faXNPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5lbmRSZW5kZXJDeWNsZSgpO1xuICAgIHRoaXMuY29tcG9uZW50LnVubG9hZCgpO1xuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IHRoaXMuaGlkZUFzeW5jKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jIGFjdGlvbnMgdG8gcGVyZm9ybSB3aGVuIHRoZSBzZXR0aW5ncyB0YWIgaXMgYmVpbmcgaGlkZGVuLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIHRhYiBpcyBoaWRkZW4uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGlkZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucGx1Z2luU2V0dGluZ3NDb21wb25lbnQuc2F2ZVRvRmlsZShTQVZFX1RPX0ZJTEVfQ09OVEVYVCk7XG4gIH1cblxuICAvKipcbiAgICogUmUtcmVuZGVycyB0aGUgc2V0dGluZ3MgdGFiIGFmdGVyIHRoZSB1bmRlcmx5aW5nIHN0YXRlIGNoYW5nZWQuXG4gICAqXG4gICAqIFJlYnVpbGRzIHRoZSBkZWZpbml0aW9ucyBhbmQgcmUtcmVuZGVycywgd2hpY2ggY292ZXJzIGJvdGggcGF0aHM6IE9ic2lkaWFuIHJlbmRlcnMgdGhlIGRlY2xhcmF0aXZlXG4gICAqIGRlZmluaXRpb25zIHdoZW4ge0BsaW5rIGdldFNldHRpbmdEZWZpbml0aW9uSXRlbXN9IHByb3ZpZGVzIHRoZW0sIGFuZCBmYWxscyBiYWNrIHRvXG4gICAqIHtAbGluayBkaXNwbGF5TGVnYWN5fSB3aGVuIGl0IGRvZXMgbm90LiBOb3RoaW5nIGlzIHJlbmRlcmVkIHdoaWxlIHRoZSB0YWIgaXMgbm90IHRoZSBvbmUgb24gc2NyZWVuLlxuICAgKlxuICAgKiBVc2UgaXQgb25seSBmb3IgY2hhbmdlcyB0aGF0IGFsdGVyIHRoZSBTVFJVQ1RVUkUgb2YgdGhlIHRhYiBcdTIwMTQgcm93cyBhZGRlZCBvciByZW1vdmVkLiBXaGVuIG9ubHkgYVxuICAgKiB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJCYXNlU2V0dGluZ0V4UGFyYW1zLmRpc2FibGVkfSAvIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nRXhQYXJhbXMudmlzaWJsZX1cbiAgICogcHJlZGljYXRlIGhhcyB0byBiZSByZS1ldmFsdWF0ZWQsIGNhbGwgdGhlIG11Y2ggY2hlYXBlciB7QGxpbmsgcmVmcmVzaERvbVN0YXRlfSBpbnN0ZWFkLCB3aGljaCB0b2dnbGVzIHRoZVxuICAgKiByZW5kZXJlZCBET00gaW4gcGxhY2UuXG4gICAqL1xuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcnNpc3RzIHRoZSB2YWx1ZSBvZiBhIG5hdGl2ZSBgY29udHJvbGAgc2V0dGluZyBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBUaGUgY291bnRlcnBhcnQgb2Yge0BsaW5rIGdldENvbnRyb2xWYWx1ZX06IGl0IHJvdXRlcyB0aGUgd3JpdGUgdG8gdGhlIHNldHRpbmdzIGNvbXBvbmVudCBpbnN0ZWFkIG9mIHRoZVxuICAgKiBpbmhlcml0ZWQgYHBsdWdpbi5zYXZlRGF0YWAgcGF0aCwgc28gdmFsaWRhdGlvbiwgdHJhbnNmb3JtZXJzIGFuZCB0aGUgZGVib3VuY2VkIHNhdmUgYWxsIGFwcGx5IGFzIHRoZXkgZG9cbiAgICogZm9yIGEge0BsaW5rIGJpbmR9LWVkIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBzZXR0aW5ncyBwcm9wZXJ0eSBuYW1lLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gcGVyc2lzdC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB2YWx1ZSBpcyBzZXQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgc2V0Q29udHJvbFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIHR5cGUgUHJvcGVydHlOYW1lID0gU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz47XG4gICAgYXdhaXQgdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5zZXRQcm9wZXJ0eShjYXN0VG88UHJvcGVydHlOYW1lPihrZXkpLCBjYXN0VG88UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT4odmFsdWUpKTtcbiAgICB0aGlzLnNhdmVTZXR0aW5nc0RlYm91bmNlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIHRoZSBwbHVnaW4gc2V0dGluZ3MgdGFiLlxuICAgKi9cbiAgcHVibGljIHNob3coKTogdm9pZCB7XG4gICAgdGhpcy5hcHAuc2V0dGluZy5vcGVuVGFiKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkZWNsYXJhdGl2ZSBzZXR0aW5nIGRlZmluaXRpb25zIGZvciB0aGUgdGFiIChPYnNpZGlhbiAxLjEzKykuXG4gICAqXG4gICAqIENvbnN1bWVycyBvdmVycmlkZSB0aGlzLCB0eXBpY2FsbHkgYnVpbGRpbmcgZWFjaCByb3cgd2l0aCB7QGxpbmsgc2V0dGluZ0V4fSBhbmQge0BsaW5rIGJpbmR9IGFuZCBncm91cGluZ1xuICAgKiB0aGVtIHdpdGggYHNldHRpbmdHcm91cEV4YC4gUmV0dXJuaW5nIGFuIGVtcHR5IGFycmF5IFx1MjAxNCB0aGUgZGVmYXVsdCBcdTIwMTQgbWFrZXMgT2JzaWRpYW4gZmFsbCBiYWNrIHRvIHRoZVxuICAgKiBpbXBlcmF0aXZlIHtAbGluayBkaXNwbGF5TGVnYWN5fSBwYXRoLlxuICAgKlxuICAgKiBNVVNUIGJlIGEgcHVyZSBidWlsZGVyLiBPYnNpZGlhbiBjYWxscyBpdCB3aGVuIHRoZSB0YWIgaXMgcmVnaXN0ZXJlZCAoYGFkZFNldHRpbmdUYWJgKSwgbG9uZyBiZWZvcmUgdGhlXG4gICAqIHRhYiBpcyBldmVyIG9wZW5lZCwgaW4gb3JkZXIgdG8gaW5kZXggdGhlIHNldHRpbmdzIGZvciBzZWFyY2guIEFueXRoaW5nIHdpdGggYSBzaWRlIGVmZmVjdCBiZWxvbmdzIGluc2lkZVxuICAgKiBhIHJvdydzIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nRXhQYXJhbXMucmVuZGVyfSBjYWxsYmFjaywgd2hpY2ggcnVucyBvbmx5IHdoZW4gdGhlIHJvdyBpc1xuICAgKiBhY3R1YWxseSByZW5kZXJlZC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0U2V0dGluZ0RlZmluaXRpb25JdGVtcygpOiBTZXR0aW5nRGVmaW5pdGlvbkl0ZW1bXSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gc2V0dGluZ3MgYXJlIGxvYWRlZC5cbiAgICpcbiAgICogQHBhcmFtIF9sb2FkZWRTdGF0ZSAtIFRoZSBsb2FkZWQgc2V0dGluZ3Mgc3RhdGUuXG4gICAqIEBwYXJhbSBfaXNJbml0aWFsTG9hZCAtIFdoZXRoZXIgdGhlIHNldHRpbmdzIGFyZSBiZWluZyBsb2FkZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSBsb2FkZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25Mb2FkU2V0dGluZ3MoX2xvYWRlZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LCBfaXNJbml0aWFsTG9hZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIGF3YWl0IG5vb3BBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmFsaWRhdGVzIHRoZSBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgcmV2YWxpZGF0ZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcmV2YWxpZGF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2YWxpZGF0aW9uTWVzc2FnZXMgPSBhd2FpdCB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50LnJldmFsaWRhdGUoKTtcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZVZhbGlkYXRpb25zKHZhbGlkYXRpb25NZXNzYWdlcyk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc2VhcmNoLWluZGV4YWJsZSBkZWNsYXJhdGl2ZSByb3cgdGhhdCBpcyByZW5kZXJlZCBpbXBlcmF0aXZlbHkuXG4gICAqXG4gICAqIFRoZSBicmlkZ2UgYmV0d2VlbiB0aGUgZGVjbGFyYXRpdmUgQVBJIGFuZCBPRFUncyBpbXBlcmF0aXZlIGJ1aWxkaW5nIGJsb2NrczogT2JzaWRpYW4gb3ducyB0aGUgcm93IChzbyBpdFxuICAgKiBpbmRleGVzIGl0IGZvciBzZWFyY2ggYW5kIGV2YWx1YXRlcyBpdHMge0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZVNldHRpbmdFeFBhcmFtcy52aXNpYmxlfSAvXG4gICAqIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nRXhQYXJhbXMuZGlzYWJsZWR9IHByZWRpY2F0ZXMgb24gZXZlcnlcbiAgICoge0BsaW5rIHJlZnJlc2hEb21TdGF0ZX0pLCB3aGlsZSB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJCYXNlU2V0dGluZ0V4UGFyYW1zLnJlbmRlcn0gZmlsbHMgaXQgaW4gd2l0aFxuICAgKiB7QGxpbmsgU2V0dGluZ0V4fSBhZGRlcnMgYW5kIHtAbGluayBiaW5kfSBleGFjdGx5IGFzIGFuIGltcGVyYXRpdmUgdGFiIHdvdWxkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHJvdyBwYXJhbXMuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGRlZmluaXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0dGluZ0V4KHBhcmFtczogUGx1Z2luU2V0dGluZ3NUYWJCYXNlU2V0dGluZ0V4UGFyYW1zKTogU2V0dGluZ0RlZmluaXRpb25SZW5kZXIge1xuICAgIC8vIFRPRE8oVDI3MCk6IHRoZSBgZGlzYWJsZWRgIG1lbWJlciBiZWxvdyBjb21lcyBmcm9tIHRoZSBsb2NhbCBhdWdtZW50YXRpb24gaW4gYHNyYy9AdHlwZXMvb2JzaWRpYW4uZC50c2AuXG4gICAgLy8gRHJvcCB0aGF0IGZpbGUgb25jZSBUMjY5IGFkZHMgdGhlIG1lbWJlciB0byBAb2JzaWRpYW4tdHlwaW5nczogT2JzaWRpYW4gMS4xMyBob25vdXJzIHRoZSBwcmVkaWNhdGUgb24gYVxuICAgIC8vIFJlbmRlciByb3cgYXQgcnVudGltZSwgYnV0IGl0cyBvd24gdHlwaW5ncyBkZWNsYXJlIGl0IG9ubHkgb24gY29udHJvbCBhbmQgYWN0aW9uIGRlZmluaXRpb25zLlxuICAgIHJldHVybiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2V0dGluZ0RlZmluaXRpb25SZW5kZXI+KHtcbiAgICAgIGFsaWFzZXM6IHBhcmFtcy5hbGlhc2VzLFxuICAgICAgZGVzYzogcGFyYW1zLmRlc2MsXG4gICAgICBkaXNhYmxlZDogcGFyYW1zLmRpc2FibGVkLFxuICAgICAgbmFtZTogcGFyYW1zLm5hbWUsXG4gICAgICByZW5kZXI6IChzZXR0aW5nOiBTZXR0aW5nLCBncm91cDogU2V0dGluZ0dyb3VwKSA9PiB0aGlzLnJlbmRlclNldHRpbmdFeCh7IGdyb3VwLCBzZXR0aW5nLCBzZXR0aW5nRXhQYXJhbXM6IHBhcmFtcyB9KSxcbiAgICAgIHNlYXJjaGFibGU6IHBhcmFtcy5zZWFyY2hhYmxlLFxuICAgICAgdmlzaWJsZTogcGFyYW1zLnZpc2libGVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBkZWNsYXJhdGl2ZSBoZWFkaW5nIGdyb3VwLlxuICAgKlxuICAgKiBUaGUgZGVjbGFyYXRpdmUgY291bnRlcnBhcnQgb2YgYFNldHRpbmdHcm91cEV4YDogd2hlcmUgdGhhdCBjbGFzcyBhcHBlbmRzIGEgZ3JvdXAgdG8gYSBjb250YWluZXJcbiAgICogaW1wZXJhdGl2ZWx5LCB0aGlzIHJldHVybnMgdGhlIGRlZmluaXRpb24gT2JzaWRpYW4gcmVuZGVycywgc28gYSBncm91cC1zdHJ1Y3R1cmVkIHRhYiBrZWVwcyBpdHMgc2hhcGVcbiAgICogYWZ0ZXIgdGhlIG1pZ3JhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBncm91cCBwYXJhbXMuXG4gICAqIEByZXR1cm5zIFRoZSBncm91cCBkZWZpbml0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldHRpbmdHcm91cEV4KHBhcmFtczogUGx1Z2luU2V0dGluZ3NUYWJCYXNlU2V0dGluZ0dyb3VwRXhQYXJhbXMpOiBTZXR0aW5nRGVmaW5pdGlvbkdyb3VwIHtcbiAgICByZXR1cm4gbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNldHRpbmdEZWZpbml0aW9uR3JvdXA+KHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHR5cGU6ICdncm91cCdcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYmVnaW5SZW5kZXJDeWNsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmVuZFJlbmRlckN5Y2xlKCk7XG4gICAgdGhpcy5jdXJyZW50UmVuZGVyQ29tcG9uZW50ID0gdGhpcy5jcmVhdGVSZW5kZXJDb21wb25lbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUmVuZGVyQ29tcG9uZW50KCk6IENvbXBvbmVudEV4IHtcbiAgICB0aGlzLl9pc09wZW4gPSB0cnVlO1xuICAgIHRoaXMuY29tcG9uZW50LmxvYWQoKTtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQuYWRkQ2hpbGQobmV3IENvbXBvbmVudEV4KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmRSZW5kZXJDeWNsZSgpOiB2b2lkIHtcbiAgICBjb25zdCByZW5kZXJDb21wb25lbnQgPSB0aGlzLmN1cnJlbnRSZW5kZXJDb21wb25lbnQ7XG4gICAgaWYgKCFyZW5kZXJDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRSZW5kZXJDb21wb25lbnQgPSBudWxsO1xuICAgIHRoaXMuY29tcG9uZW50LnJlbW92ZUNoaWxkKHJlbmRlckNvbXBvbmVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldFBsdWdpblNldHRpbmdzUHJvcGVydHk8UHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lXG4gICk6IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPiB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnBsdWdpblNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuICAgIHJldHVybiBzZXR0aW5nc1twcm9wZXJ0eU5hbWVdIGFzIFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVuZGVyQ29tcG9uZW50KCk6IENvbXBvbmVudEV4IHtcbiAgICB0aGlzLmN1cnJlbnRSZW5kZXJDb21wb25lbnQgPz89IHRoaXMuY3JlYXRlUmVuZGVyQ29tcG9uZW50KCk7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFJlbmRlckNvbXBvbmVudDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgb25TYXZlU2V0dGluZ3MocGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VPblNhdmVTZXR0aW5nc1BhcmFtczxQbHVnaW5TZXR0aW5ncz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7XG4gICAgICBjb250ZXh0LFxuICAgICAgbmV3U3RhdGUsXG4gICAgICBvbGRTdGF0ZTogX29sZFN0YXRlXG4gICAgfSA9IHBhcmFtcztcbiAgICBpZiAoY29udGV4dCA9PT0gU0FWRV9UT19GSUxFX0NPTlRFWFQpIHtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlVmFsaWRhdGlvbnMobmV3U3RhdGUudmFsaWRhdGlvbk1lc3NhZ2VzIGFzIFJlY29yZDxTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPiwgc3RyaW5nPik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWludmFsaWQtdm9pZC10eXBlIC0tIE1pcnJvcnMgT2JzaWRpYW4ncyBgU2V0dGluZ0RlZmluaXRpb25SZW5kZXIucmVuZGVyYCwgd2hvc2UgY2xlYW51cCBmdW5jdGlvbiBpcyBvcHRpb25hbC5cbiAgcHJpdmF0ZSByZW5kZXJTZXR0aW5nRXgocGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VSZW5kZXJTZXR0aW5nRXhQYXJhbXMpOiAoKCkgPT4gdm9pZCkgfCB2b2lkIHtcbiAgICBjb25zdCByb3dDb21wb25lbnQgPSB0aGlzLmNyZWF0ZVJlbmRlckNvbXBvbmVudCgpO1xuICAgIGNvbnN0IHByZXZpb3VzUmVuZGVyQ29tcG9uZW50ID0gdGhpcy5jdXJyZW50UmVuZGVyQ29tcG9uZW50O1xuICAgIHRoaXMuY3VycmVudFJlbmRlckNvbXBvbmVudCA9IHJvd0NvbXBvbmVudDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjbGVhbnVwID0gcGFyYW1zLnNldHRpbmdFeFBhcmFtcy5yZW5kZXIoYWRvcHRTZXR0aW5nRXgocGFyYW1zLnNldHRpbmcpLCBwYXJhbXMuZ3JvdXApO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhbnVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnQucmVtb3ZlQ2hpbGQocm93Q29tcG9uZW50KTtcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY3VycmVudFJlbmRlckNvbXBvbmVudCA9IHByZXZpb3VzUmVuZGVyQ29tcG9uZW50O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlVmFsaWRhdGlvbnModmFsaWRhdGlvbk1lc3NhZ2VzOiBSZWNvcmQ8U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4sIHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eU5hbWUsIHZhbGlkYXRpb25NZXNzYWdlXSBvZiBPYmplY3QuZW50cmllcyh2YWxpZGF0aW9uTWVzc2FnZXMpKSB7XG4gICAgICBhd2FpdCB0aGlzLnRyaWdnZXJBc3luYygndmFsaWRhdGlvbk1lc3NhZ2VDaGFuZ2VkJywgcHJvcGVydHlOYW1lLCB2YWxpZGF0aW9uTWVzc2FnZSBhcyBzdHJpbmcpO1xuICAgIH1cbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBWVAsU0FBUyx3QkFBd0I7QUFDakM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsa0NBQWtDO0FBQzNDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsMkJBQTJCO0FBSzdCLE1BQU0sdUJBQXVCO0FBNFNwQyxNQUFNLHlDQUF3RSxZQUFZO0FBQUEs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
509
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9wbHVnaW4tc2V0dGluZ3MtdGFiLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5nIHRhYnMgaW4gT2JzaWRpYW4uXG4gKiBJdCBwcm92aWRlcyBhIHV0aWxpdHkgbWV0aG9kIHRvIGJpbmQgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsZSBjaGFuZ2VzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRGVib3VuY2VyLFxuICBQbHVnaW4sXG4gIFNldHRpbmcsXG4gIFNldHRpbmdEZWZpbml0aW9uR3JvdXAsXG4gIFNldHRpbmdEZWZpbml0aW9uSXRlbSxcbiAgU2V0dGluZ0RlZmluaXRpb25SZW5kZXIsXG4gIFNldHRpbmdHcm91cFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7XG4gIENvbmRpdGlvbmFsS2V5cyxcbiAgRXhjZXB0LFxuICBQcm9taXNhYmxlLFxuICBSZWFkb25seURlZXBcbn0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHtcbiAgZGVib3VuY2UsXG4gIFBsdWdpblNldHRpbmdUYWIsXG4gIHNldFRvb2x0aXBcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFN0cmluZ0tleXMgfSBmcm9tICcuLi8uLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlLFxuICBSZWFkb25seVBsdWdpblNldHRpbmdzLFxuICBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGVcbn0gZnJvbSAnLi4vY29tcG9uZW50cy9wbHVnaW4tc2V0dGluZ3MtY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmcgfSBmcm9tICcuLi9zZXR0aW5nLWNvbXBvbmVudHMvdmFsdWUtY29tcG9uZW50LXdpdGgtY2hhbmdlLXRyYWNraW5nLnRzJztcbmltcG9ydCB0eXBlIHsgU2V0dGluZ0V4IH0gZnJvbSAnLi4vc2V0dGluZy1leC50cyc7XG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRpb25NZXNzYWdlSG9sZGVyIH0gZnJvbSAnLi4vdmFsaWRhdGlvbi50cyc7XG5cbmltcG9ydCB7IG1peGluQXN5bmNFdmVudHMgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHtcbiAgY29udmVydEFzeW5jVG9TeW5jLFxuICBpbnZva2VBc3luY1NhZmVseVxufSBmcm9tICcuLi8uLi9hc3luYy50cyc7XG5pbXBvcnQge1xuICBub29wLFxuICBub29wQXN5bmNcbn0gZnJvbSAnLi4vLi4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHtcbiAgY2FzdFRvLFxuICBkZWVwRXF1YWwsXG4gIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllc1xufSBmcm9tICcuLi8uLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbGFibGUgfSBmcm9tICcuLi8uLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyByZWdpc3RlckFzeW5jRXZlbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2FzeW5jLWV2ZW50cy1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuLi9jb21wb25lbnRzL2NvbXBvbmVudC1leC50cyc7XG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyBlbnN1cmVXcmFwcGVkIH0gZnJvbSAnLi4vc2V0dGluZy1jb21wb25lbnRzL3NldHRpbmctY29tcG9uZW50LXdyYXBwZXIudHMnO1xuaW1wb3J0IHsgZ2V0VGV4dEJhc2VkQ29tcG9uZW50VmFsdWUgfSBmcm9tICcuLi9zZXR0aW5nLWNvbXBvbmVudHMvdGV4dC1iYXNlZC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgZ2V0VmFsaWRhdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vc2V0dGluZy1jb21wb25lbnRzL3ZhbGlkYXRvci1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgYWRvcHRTZXR0aW5nRXggfSBmcm9tICcuLi9zZXR0aW5nLWV4LnRzJztcbmltcG9ydCB7IGlzVmFsaWRhdGlvbk1lc3NhZ2VIb2xkZXIgfSBmcm9tICcuLi92YWxpZGF0aW9uLnRzJztcbmltcG9ydCB7IGFkZFBsdWdpbkNzc0NsYXNzZXMgfSBmcm9tICcuL3BsdWdpbi1jb250ZXh0LnRzJztcblxuLyoqXG4gKiBBIGNvbnRleHQgcGFzc2VkIHRvIHRoZSB7QGxpbmsgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlLnNhdmVUb0ZpbGV9IG1ldGhvZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNBVkVfVE9fRklMRV9DT05URVhUID0gJ1BsdWdpblNldHRpbmdzVGFiJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBgUGx1Z2luU2V0dGluZ3NUYWJCYXNlLmJpbmRgLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBzZXR0aW5ncyBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5kT3B0aW9uczxUPiB7XG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQgY2hhbmdlcy5cbiAgICovXG4gIG9uQ2hhbmdlZD8obmV3VmFsdWU6IFJlYWRvbmx5RGVlcDxUPiwgb2xkVmFsdWU6IFJlYWRvbmx5RGVlcDxUPik6IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVzZXQgdGhlIHNldHRpbmcgd2hlbiB0aGUgY29tcG9uZW50IHZhbHVlIGlzIGVtcHR5LlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgdG8gdGV4dC1iYXNlZCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJlc2V0U2V0dGluZ1doZW5Db21wb25lbnRJc0VtcHR5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IHRoZSBwbGFjZWhvbGRlciBmb3IgZGVmYXVsdCB2YWx1ZXMuXG4gICAqIEFwcGxpY2FibGUgb25seSB0byB0ZXh0LWJhc2VkIGNvbXBvbmVudHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd1BsYWNlaG9sZGVyRm9yRGVmYXVsdFZhbHVlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIHdoZW4gdGhlIGNvbXBvbmVudCB2YWx1ZSBpcyBpbnZhbGlkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dWYWxpZGF0aW9uTWVzc2FnZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRXh0ZW5kZWQgb3B0aW9ucyBmb3IgYFBsdWdpblNldHRpbmdzVGFiQmFzZS5iaW5kYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0eXBlLlxuICogQHR5cGVQYXJhbSBVSVZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIFVJIGNvbXBvbmVudCdzIHZhbHVlLlxuICogQHR5cGVQYXJhbSBQcm9wZXJ0eU5hbWUgLSBUaGUgc2V0dGluZ3MgcHJvcGVydHkgbmFtZSBiZWluZyBib3VuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5kT3B0aW9uc0V4dGVuZGVkPFxuICBQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdCxcbiAgVUlWYWx1ZSxcbiAgUHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5cbj4gZXh0ZW5kcyBCaW5kT3B0aW9uczxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPiB7XG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgVUkgY29tcG9uZW50J3MgdmFsdWUgYmFjayB0byB0aGUgcGx1Z2luIHNldHRpbmdzIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0gdWlWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgdG8gc2V0IG9uIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gICAqL1xuICBjb21wb25lbnRUb1BsdWdpblNldHRpbmdzVmFsdWVDb252ZXJ0ZXIodWlWYWx1ZTogVUlWYWx1ZSk6IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0gfCBWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcjtcblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIHBsdWdpbiBzZXR0aW5ncyB2YWx1ZSB0byB0aGUgdmFsdWUgdXNlZCBieSB0aGUgVUkgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luU2V0dGluZ3NWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIHRvIHNldCBvbiB0aGUgVUkgY29tcG9uZW50LlxuICAgKi9cbiAgcGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyKHBsdWdpblNldHRpbmdzVmFsdWU6IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPik6IFVJVmFsdWU7XG59XG5cbi8qKlxuICogRXh0ZW5kZWQgcGFyYW1zIGZvciB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJCYXNlLmJpbmR9IHdpdGggdmFsdWUgY29udmVydGVycy5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0eXBlLlxuICogQHR5cGVQYXJhbSBVSVZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIFVJIGNvbXBvbmVudCdzIHZhbHVlLlxuICogQHR5cGVQYXJhbSBUVmFsdWVDb21wb25lbnQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgY29tcG9uZW50LlxuICogQHR5cGVQYXJhbSBQcm9wZXJ0eU5hbWUgLSBUaGUgc2V0dGluZ3MgcHJvcGVydHkgbmFtZSBiZWluZyBib3VuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1RhYkJhc2VCaW5kRXh0ZW5kZWRQYXJhbXM8XG4gIFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0LFxuICBVSVZhbHVlLFxuICBUVmFsdWVDb21wb25lbnQsXG4gIFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+XG4+IGV4dGVuZHMgQmluZE9wdGlvbnNFeHRlbmRlZDxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgUHJvcGVydHlOYW1lPiB7XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqL1xuICByZWFkb25seSBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZTtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIGNvbXBvbmVudCB0byBiaW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVDb21wb25lbnQ6IFRWYWx1ZUNvbXBvbmVudCAmIFZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nPFVJVmFsdWU+O1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZS5iaW5kfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0eXBlLlxuICogQHR5cGVQYXJhbSBVSVZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIFVJIGNvbXBvbmVudCdzIHZhbHVlLlxuICogQHR5cGVQYXJhbSBUVmFsdWVDb21wb25lbnQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzVGFiQmFzZUJpbmRQYXJhbXM8XG4gIFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0LFxuICBVSVZhbHVlLFxuICBUVmFsdWVDb21wb25lbnRcbj4gZXh0ZW5kcyBCaW5kT3B0aW9uczxVSVZhbHVlPiB7XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvcGVydHlOYW1lOiBDb25kaXRpb25hbEtleXM8UGx1Z2luU2V0dGluZ3MsIFVJVmFsdWU+O1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgY29tcG9uZW50IHRvIGJpbmQuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50ICYgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciBjcmVhdGluZyBhIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgcGx1Z2luIHNldHRpbmdzIHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3NUYWJCYXNlQ29uc3RydWN0b3JQYXJhbXM8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaW5zdGFuY2UgKG5lZWRlZCBieSBPYnNpZGlhbidzIFBsdWdpblNldHRpbmdUYWIpLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5ncyBjb21wb25lbnQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudDogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPFBsdWdpblNldHRpbmdzPjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2Uuc2V0dGluZ0V4fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nRXhQYXJhbXMge1xuICAvKipcbiAgICogQWRkaXRpb25hbCBzZWFyY2ggdGVybXMgZm9yIHRoZSBzZXR0aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHNldHRpbmcuIFVzZWQgZm9yIHJlbmRlcmluZzsgdGhlIHRleHQgY29udGVudCBvZiBhIGZyYWdtZW50IGlzIHVzZWQgZm9yIHNlYXJjaC5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2M/OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzZXR0aW5nIHJvdyBpcyBkaXNhYmxlZC5cbiAgICpcbiAgICogQSBmdW5jdGlvbiBmb3JtIGlzIHJlLWV2YWx1YXRlZCBvbiBldmVyeSByZW5kZXIgQU5EIG9uIGV2ZXJ5IHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2UucmVmcmVzaERvbVN0YXRlfVxuICAgKiBjYWxsLCBzbyBpdCBjYW4gcmVmbGVjdCBydW50aW1lIHN0YXRlLiBPYnNpZGlhbiBhcHBsaWVzIGl0IHdpdGggYFNldHRpbmcuc2V0RGlzYWJsZWRgLCB3aGljaCBkaXNhYmxlcyB0aGVcbiAgICogcm93IGFuZCBldmVyeSBjb21wb25lbnQgcmVnaXN0ZXJlZCBvbiBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGRpc2FibGVkPzogKCgpID0+IGJvb2xlYW4pIHwgYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgc2V0dGluZy4gVXNlZCBmb3IgcmVuZGVyaW5nIGFuZCBzZWFyY2guXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHNldHRpbmcgcm93IGltcGVyYXRpdmVseSwgdHlwaWNhbGx5IHZpYSB0aGUge0BsaW5rIFNldHRpbmdFeH0gYWRkZXJzIGFuZFxuICAgKiB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJCYXNlLmJpbmR9LlxuICAgKlxuICAgKiBUaGUgc2V0dGluZyBPYnNpZGlhbiBjcmVhdGVzIGZvciB0aGUgcm93IGlzIGFkb3B0ZWQgaW50byBhIHtAbGluayBTZXR0aW5nRXh9IGJlZm9yZSBpdCBpcyBoYW5kZWQgb3Zlciwgc29cbiAgICogYW4gaW1wZXJhdGl2ZSByb3cgYm9keSBjYXJyaWVzIG92ZXIgdW5jaGFuZ2VkLiBNYXkgcmV0dXJuIGEgY2xlYW51cCBmdW5jdGlvbiwgaW52b2tlZCBiZWZvcmUgdGhlIHJvdyBpc1xuICAgKiB0b3JuIGRvd24gb3IgcmUtcmVuZGVyZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5nIC0gVGhlIHNldHRpbmcgdG8gcmVuZGVyIGludG8uXG4gICAqIEBwYXJhbSBncm91cCAtIFRoZSBncm91cCB0aGUgc2V0dGluZyBiZWxvbmdzIHRvLlxuICAgKiBAcmV0dXJucyBBbiBvcHRpb25hbCBjbGVhbnVwIGZ1bmN0aW9uLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbnZhbGlkLXZvaWQtdHlwZSAtLSBNaXJyb3JzIE9ic2lkaWFuJ3MgYFNldHRpbmdEZWZpbml0aW9uUmVuZGVyLnJlbmRlcmAsIHdob3NlIGNsZWFudXAgZnVuY3Rpb24gaXMgb3B0aW9uYWwuXG4gIHJlbmRlcihzZXR0aW5nOiBTZXR0aW5nRXgsIGdyb3VwOiBTZXR0aW5nR3JvdXApOiAoKCkgPT4gdm9pZCkgfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBzZXR0aW5nIGlzIGluY2x1ZGVkIGluIHRoZSBzZXR0aW5ncyBzZWFyY2guIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNlYXJjaGFibGU/OiAoKCkgPT4gYm9vbGVhbikgfCBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBzZXR0aW5nIHJvdyBpcyByZW5kZXJlZC4gQSBmdW5jdGlvbiBmb3JtIGlzIHJlLWV2YWx1YXRlZCBvbiBldmVyeSByZW5kZXIgYW5kIG9uXG4gICAqIGV2ZXJ5IHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2UucmVmcmVzaERvbVN0YXRlfSBjYWxsLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSB2aXNpYmxlPzogKCgpID0+IGJvb2xlYW4pIHwgYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2Uuc2V0dGluZ0dyb3VwRXh9LlxuICpcbiAqIEV2ZXJ5IG1lbWJlciBvZiB7QGxpbmsgU2V0dGluZ0RlZmluaXRpb25Hcm91cH0gZXhjZXB0IGl0cyBkaXNjcmltaW5hdG9yLCB3aGljaFxuICoge0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZS5zZXR0aW5nR3JvdXBFeH0gc2V0cy5cbiAqL1xuZXhwb3J0IHR5cGUgUGx1Z2luU2V0dGluZ3NUYWJCYXNlU2V0dGluZ0dyb3VwRXhQYXJhbXMgPSBFeGNlcHQ8U2V0dGluZ0RlZmluaXRpb25Hcm91cCwgJ3R5cGUnPjtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBwYXJhbXMgZm9yIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2UuYmluZH0uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSBwbHVnaW4gc2V0dGluZ3MgdHlwZS5cbiAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSBVSSBjb21wb25lbnQncyB2YWx1ZS5cbiAqIEB0eXBlUGFyYW0gVFZhbHVlQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIHNldHRpbmdzIHByb3BlcnR5IG5hbWUgYmVpbmcgYm91bmQuXG4gKi9cbmludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1RhYkJhc2VCaW5kSW1wbFBhcmFtczxcbiAgUGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3QsXG4gIFVJVmFsdWUsXG4gIFRWYWx1ZUNvbXBvbmVudCxcbiAgUHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5cbj4gZXh0ZW5kcyBCaW5kT3B0aW9uczxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPiB7XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqL1xuICByZWFkb25seSBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZTtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIGNvbXBvbmVudCB0byBiaW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVDb21wb25lbnQ6IFRWYWx1ZUNvbXBvbmVudCAmIFZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nPFVJVmFsdWU+O1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3NUYWJCYXNlRXZlbnRNYXAge1xuICB2YWxpZGF0aW9uTWVzc2FnZUNoYW5nZWQ6IFtwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZ107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZS5vblNhdmVTZXR0aW5nc30uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gKi9cbmludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1RhYkJhc2VPblNhdmVTZXR0aW5nc1BhcmFtczxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogVGhlIHNhdmUgY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ6IHVua25vd247XG5cbiAgLyoqXG4gICAqIFRoZSBuZXcgc2V0dGluZ3Mgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSBuZXdTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPjtcblxuICAvKipcbiAgICogVGhlIG9sZCBzZXR0aW5ncyBzdGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+O1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZS5yZW5kZXJTZXR0aW5nRXh9LlxuICovXG5pbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3NUYWJCYXNlUmVuZGVyU2V0dGluZ0V4UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBncm91cCB0aGUgcm93IGJlbG9uZ3MgdG8uXG4gICAqL1xuICByZWFkb25seSBncm91cDogU2V0dGluZ0dyb3VwO1xuXG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZyBPYnNpZGlhbiBjcmVhdGVkIGZvciB0aGUgcm93LlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0dGluZzogU2V0dGluZztcblxuICAvKipcbiAgICogVGhlIHBhcmFtcyB0aGUgcm93IHdhcyBkZWNsYXJlZCB3aXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0dGluZ0V4UGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nRXhQYXJhbXM7XG59XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1zIGZvciB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJFdmVudHNDb21wb25lbnR9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgcGx1Z2luIHNldHRpbmdzIHR5cGUuXG4gKi9cbmludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1RhYkV2ZW50c0NvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIHNldHRpbmdzIGFyZSBsb2FkZWQuXG4gICAqL1xuICBvbkxvYWRTZXR0aW5ncyhsb2FkZWRTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPiwgaXNJbml0aWFsTG9hZDogYm9vbGVhbik6IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gc2V0dGluZ3MgYXJlIHNhdmVkLlxuICAgKi9cbiAgb25TYXZlU2V0dGluZ3MoXG4gICAgbmV3U3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgb2xkU3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgY29udGV4dDogdW5rbm93blxuICApOiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZ3MgY29tcG9uZW50IHRvIHN1YnNjcmliZSB0by5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ29tcG9uZW50OiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2U8UGx1Z2luU2V0dGluZ3M+O1xufVxuXG4vKipcbiAqIE93bnMgdGhlIHRhYidzIHN1YnNjcmlwdGlvbnMgdG8gdGhlIHNldHRpbmdzIGNvbXBvbmVudC5cbiAqXG4gKiBUaGUgc3Vic2NyaXB0aW9ucyBsaXZlIGluIHtAbGluayBvbmxvYWR9IHJhdGhlciB0aGFuIGF0IGVhY2ggcmVuZGVyLCBzbyB0aGF0IGEgbG9hZC91bmxvYWQgcGFpciByZWdpc3RlcnNcbiAqIHRoZW0gZXhhY3RseSBvbmNlLiBSZWdpc3RlcmluZyB0aGVtIHBlciByZW5kZXIgaW5zdGVhZCB3b3VsZCBhY2N1bXVsYXRlIGEgZnJlc2ggcGFpciBvbiBldmVyeSByZW5kZXIgY3ljbGUsXG4gKiBiZWNhdXNlIHtAbGluayBDb21wb25lbnRFeC5sb2FkfSBlYXJseS1yZXR1cm5zIG9uY2UgdGhlIGNvbXBvbmVudCBpcyBsb2FkZWQgYW5kIG5vdGhpbmcgcmVzZXRzIGluIGJldHdlZW4uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSBwbHVnaW4gc2V0dGluZ3MgdHlwZS5cbiAqL1xuY2xhc3MgUGx1Z2luU2V0dGluZ3NUYWJFdmVudHNDb21wb25lbnQ8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmFtczogUGx1Z2luU2V0dGluZ3NUYWJFdmVudHNDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtczxQbHVnaW5TZXR0aW5ncz47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtcy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpblNldHRpbmdzVGFiRXZlbnRzQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXM8UGx1Z2luU2V0dGluZ3M+KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIHRvIHRoZSBzZXR0aW5ncyBjb21wb25lbnQncyBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIGNvbnN0IHsgcGx1Z2luU2V0dGluZ3NDb21wb25lbnQgfSA9IHRoaXMucGFyYW1zO1xuICAgIHJlZ2lzdGVyQXN5bmNFdmVudCh0aGlzLCBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5vbignbG9hZFNldHRpbmdzJywgKGxvYWRlZFN0YXRlLCBpc0luaXRpYWxMb2FkKSA9PiB0aGlzLnBhcmFtcy5vbkxvYWRTZXR0aW5ncyhsb2FkZWRTdGF0ZSwgaXNJbml0aWFsTG9hZCkpKTtcbiAgICByZWdpc3RlckFzeW5jRXZlbnQodGhpcywgcGx1Z2luU2V0dGluZ3NDb21wb25lbnQub24oJ3NhdmVTZXR0aW5ncycsIChuZXdTdGF0ZSwgb2xkU3RhdGUsIGNvbnRleHQpID0+IHRoaXMucGFyYW1zLm9uU2F2ZVNldHRpbmdzKG5ld1N0YXRlLCBvbGRTdGF0ZSwgY29udGV4dCkpKTtcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5ncyB0YWJzIGluIE9ic2lkaWFuLlxuICogUHJvdmlkZXMgYSBtZXRob2QgZm9yIGJpbmRpbmcgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsaW5nIGNoYW5nZXMuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSBwbHVnaW4gc2V0dGluZ3MgdHlwZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpblNldHRpbmdzVGFiQmFzZTxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBtaXhpbkFzeW5jRXZlbnRzPFBsdWdpblNldHRpbmdzVGFiQmFzZUV2ZW50TWFwPigpKFBsdWdpblNldHRpbmdUYWIpIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsdWdpbiBzZXR0aW5ncyB0YWIgaXMgb3Blbi5cbiAgICpcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgcGx1Z2luIHNldHRpbmdzIHRhYiBpcyBvcGVuLlxuICAgKi9cbiAgcHVibGljIGdldCBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzT3BlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZ3MgbWFuYWdlci5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudDogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPFBsdWdpblNldHRpbmdzPjtcblxuICAvKipcbiAgICogQSBkZWJvdW5jZSB0aW1lb3V0IGZvciBzYXZpbmcgc2V0dGluZ3MuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBkZWJvdW5jZSB0aW1lb3V0IGZvciBzYXZpbmcgc2V0dGluZ3MuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHNhdmVTZXR0aW5nc0RlYm91bmNlVGltZW91dEluTWlsbGlzZWNvbmRzKCk6IG51bWJlciB7XG4gICAgY29uc3QgREVGQVVMVCA9IDJfMDAwO1xuICAgIHJldHVybiBERUZBVUxUO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNPcGVuID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50OiBQbHVnaW5TZXR0aW5nc1RhYkV2ZW50c0NvbXBvbmVudDxQbHVnaW5TZXR0aW5ncz47XG4gIHByaXZhdGUgY3VycmVudFJlbmRlckNvbXBvbmVudDogQ29tcG9uZW50RXggfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBzYXZlU2V0dGluZ3NEZWJvdW5jZWQ6IERlYm91bmNlcjxbXSwgdm9pZD47XG5cbiAgcHJpdmF0ZSBnZXQgcGx1Z2luU2V0dGluZ3MoKTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nczxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIHJldHVybiB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50LnNldHRpbmdzU3RhdGUuaW5wdXRWYWx1ZXM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gc2V0dGluZ3MgdGFiLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtcy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpblNldHRpbmdzVGFiQmFzZUNvbnN0cnVjdG9yUGFyYW1zPFBsdWdpblNldHRpbmdzPikge1xuICAgIHN1cGVyKHBhcmFtcy5wbHVnaW4uYXBwLCBwYXJhbXMucGx1Z2luKTtcbiAgICB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpblNldHRpbmdzQ29tcG9uZW50O1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXModGhpcy5jb250YWluZXJFbCwgQ3NzQ2xhc3MuUGx1Z2luU2V0dGluZ3NUYWIpO1xuICAgIHRoaXMuc2F2ZVNldHRpbmdzRGVib3VuY2VkID0gZGVib3VuY2UoXG4gICAgICBjb252ZXJ0QXN5bmNUb1N5bmMoKCkgPT4gdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5zYXZlVG9GaWxlKFNBVkVfVE9fRklMRV9DT05URVhUKSksXG4gICAgICB0aGlzLnNhdmVTZXR0aW5nc0RlYm91bmNlVGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgKTtcbiAgICB0aGlzLmNvbXBvbmVudCA9IG5ldyBQbHVnaW5TZXR0aW5nc1RhYkV2ZW50c0NvbXBvbmVudDxQbHVnaW5TZXR0aW5ncz4oe1xuICAgICAgb25Mb2FkU2V0dGluZ3M6IChsb2FkZWRTdGF0ZSwgaXNJbml0aWFsTG9hZCk6IFByb21pc2FibGU8dm9pZD4gPT4gdGhpcy5vbkxvYWRTZXR0aW5ncyhsb2FkZWRTdGF0ZSwgaXNJbml0aWFsTG9hZCksXG4gICAgICBvblNhdmVTZXR0aW5nczogKG5ld1N0YXRlLCBvbGRTdGF0ZSwgY29udGV4dCk6IFByb21pc2FibGU8dm9pZD4gPT4gdGhpcy5vblNhdmVTZXR0aW5ncyh7IGNvbnRleHQsIG5ld1N0YXRlLCBvbGRTdGF0ZSB9KSxcbiAgICAgIHBsdWdpblNldHRpbmdzQ29tcG9uZW50OiB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgYSB2YWx1ZSBjb21wb25lbnQgdG8gYSBwbHVnaW4gc2V0dGluZy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBVSVZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIG9mIHRoZSBVSSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gVFZhbHVlQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbXMgZm9yIGJpbmRpbmcgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBiaW5kPFxuICAgIFVJVmFsdWUsXG4gICAgVFZhbHVlQ29tcG9uZW50XG4gID4oXG4gICAgcGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VCaW5kUGFyYW1zPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlLCBUVmFsdWVDb21wb25lbnQ+XG4gICk6IFRWYWx1ZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtcyBmb3IgYmluZGluZyB0aGUgdmFsdWUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGJpbmQ8XG4gICAgVUlWYWx1ZSxcbiAgICBUVmFsdWVDb21wb25lbnQsXG4gICAgUHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5cbiAgPihcbiAgICBwYXJhbXM6IFBsdWdpblNldHRpbmdzVGFiQmFzZUJpbmRFeHRlbmRlZFBhcmFtczxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgVFZhbHVlQ29tcG9uZW50LCBQcm9wZXJ0eU5hbWU+XG4gICk6IFRWYWx1ZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtcyBmb3IgYmluZGluZyB0aGUgdmFsdWUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGJpbmQ8XG4gICAgVUlWYWx1ZSxcbiAgICBUVmFsdWVDb21wb25lbnQsXG4gICAgUHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5cbiAgPihcbiAgICBwYXJhbXM6IFBsdWdpblNldHRpbmdzVGFiQmFzZUJpbmRJbXBsUGFyYW1zPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlLCBUVmFsdWVDb21wb25lbnQsIFByb3BlcnR5TmFtZT4gLy8gZXNsaW50LWRpc2FibGUtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBiaW5kIG92ZXJsb2FkIHNoYXJlcyB0aGUgQmluZCogcGFyYW0gZmFtaWx5LlxuICApOiBUVmFsdWVDb21wb25lbnQge1xuICAgIGNvbnN0IHtcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIHZhbHVlQ29tcG9uZW50LFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0gPSBwYXJhbXM7XG4gICAgdHlwZSBQcm9wZXJ0eVR5cGUgPSBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdO1xuICAgIGNvbnN0IERFRkFVTFRfT1BUSU9OUzogUmVxdWlyZWQ8QmluZE9wdGlvbnNFeHRlbmRlZDxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgUHJvcGVydHlOYW1lPj4gPSB7XG4gICAgICBjb21wb25lbnRUb1BsdWdpblNldHRpbmdzVmFsdWVDb252ZXJ0ZXI6ICh2YWx1ZTogVUlWYWx1ZSk6IFByb3BlcnR5VHlwZSA9PiB2YWx1ZSBhcyBQcm9wZXJ0eVR5cGUsXG4gICAgICBvbkNoYW5nZWQ6IG5vb3AsXG4gICAgICBwbHVnaW5TZXR0aW5nc1RvQ29tcG9uZW50VmFsdWVDb252ZXJ0ZXI6ICh2YWx1ZTogUmVhZG9ubHlEZWVwPFByb3BlcnR5VHlwZT4pOiBVSVZhbHVlID0+IHZhbHVlIGFzIFVJVmFsdWUsXG4gICAgICBzaG91bGRSZXNldFNldHRpbmdXaGVuQ29tcG9uZW50SXNFbXB0eTogdHJ1ZSxcbiAgICAgIHNob3VsZFNob3dQbGFjZWhvbGRlckZvckRlZmF1bHRWYWx1ZXM6IHRydWUsXG4gICAgICBzaG91bGRTaG93VmFsaWRhdGlvbk1lc3NhZ2U6IHRydWVcbiAgICB9O1xuXG4gICAgY29uc3Qgb3B0aW9uc0V4dDogUmVxdWlyZWQ8QmluZE9wdGlvbnNFeHRlbmRlZDxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgUHJvcGVydHlOYW1lPj4gPSB7IC4uLkRFRkFVTFRfT1BUSU9OUywgLi4ub3B0aW9ucyB9O1xuXG4gICAgY29uc3QgdmFsaWRhdG9yRWwgPSBnZXRWYWxpZGF0b3JDb21wb25lbnQodmFsdWVDb21wb25lbnQpPy52YWxpZGF0b3JFbDtcblxuICAgIGNvbnN0IHRleHRCYXNlZENvbXBvbmVudCA9IGdldFRleHRCYXNlZENvbXBvbmVudFZhbHVlKHZhbHVlQ29tcG9uZW50KTtcblxuICAgIGNvbnN0IHJlYWRvbmx5VmFsdWUgPSB0aGlzLmdldFBsdWdpblNldHRpbmdzUHJvcGVydHkocHJvcGVydHlOYW1lKTtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMucGx1Z2luU2V0dGluZ3NDb21wb25lbnQuZGVmYXVsdFNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRzW3Byb3BlcnR5TmFtZV07XG4gICAgY29uc3QgZGVmYXVsdENvbXBvbmVudFZhbHVlID0gb3B0aW9uc0V4dC5wbHVnaW5TZXR0aW5nc1RvQ29tcG9uZW50VmFsdWVDb252ZXJ0ZXIoZGVmYXVsdFZhbHVlIGFzIFJlYWRvbmx5RGVlcDxQcm9wZXJ0eVR5cGU+KTtcbiAgICB0ZXh0QmFzZWRDb21wb25lbnQ/LnNldFBsYWNlaG9sZGVyVmFsdWUoZGVmYXVsdENvbXBvbmVudFZhbHVlKTtcblxuICAgIGxldCB2YWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nO1xuICAgIGxldCB0b29sdGlwRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHRvb2x0aXBDb250ZW50RWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKHZhbGlkYXRvckVsKSB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gZW5zdXJlV3JhcHBlZCh2YWxpZGF0b3JFbCk7XG4gICAgICB0b29sdGlwRWwgPSB3cmFwcGVyLmNyZWF0ZURpdigpO1xuICAgICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyh0b29sdGlwRWwsIFtDc3NDbGFzcy5Ub29sdGlwLCBDc3NDbGFzcy5Ub29sdGlwVmFsaWRhdG9yXSk7XG4gICAgICB0b29sdGlwQ29udGVudEVsID0gdG9vbHRpcEVsLmNyZWF0ZVNwYW4oKTtcbiAgICAgIGNvbnN0IHRvb2x0aXBBcnJvd0VsID0gdG9vbHRpcEVsLmNyZWF0ZURpdigpO1xuICAgICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyh0b29sdGlwQXJyb3dFbCwgQ3NzQ2xhc3MuVG9vbHRpcEFycm93KTtcbiAgICAgIHRvb2x0aXBFbC5oaWRlKCk7XG4gICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKHRvb2x0aXBFbCk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJBc3luY0V2ZW50KFxuICAgICAgdGhpcy5nZXRSZW5kZXJDb21wb25lbnQoKSxcbiAgICAgIHRoaXMub24oJ3ZhbGlkYXRpb25NZXNzYWdlQ2hhbmdlZCcsIChhbm90aGVyUHJvcGVydHlOYW1lLCBhbm90aGVyVmFsaWRhdGlvbk1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKHByb3BlcnR5TmFtZSAhPT0gYW5vdGhlclByb3BlcnR5TmFtZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbGlkYXRpb25NZXNzYWdlID0gYW5vdGhlclZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgICB1cGRhdGVWYWxpZGF0b3JFbERlYm91bmNlZCgpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgbGV0IHNob3VsZEVtcHR5T25CbHVyID0gZmFsc2U7XG4gICAgbGV0IHNob3VsZFJldmVydFRvRGVmYXVsdFZhbHVlT25CbHVyID0gZmFsc2U7XG5cbiAgICBpZiAodGV4dEJhc2VkQ29tcG9uZW50ICYmIG9wdGlvbnNFeHQuc2hvdWxkU2hvd1BsYWNlaG9sZGVyRm9yRGVmYXVsdFZhbHVlcyAmJiBkZWVwRXF1YWwocmVhZG9ubHlWYWx1ZSwgZGVmYXVsdFZhbHVlKSkge1xuICAgICAgdGV4dEJhc2VkQ29tcG9uZW50LmVtcHR5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlQ29tcG9uZW50LnNldFZhbHVlKG9wdGlvbnNFeHQucGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyKHJlYWRvbmx5VmFsdWUpKTtcbiAgICB9XG5cbiAgICBsZXQgc2hvdWxkU2tpcE9uQ2hhbmdlID0gZmFsc2U7XG4gICAgY29uc3QgVVBEQVRFX1ZBTElEQVRPUl9FTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwMDtcbiAgICBjb25zdCB1cGRhdGVWYWxpZGF0b3JFbERlYm91bmNlZCA9IGRlYm91bmNlKCgpID0+IHtcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB1cGRhdGVWYWxpZGF0b3JFbCgpO1xuICAgICAgfSk7XG4gICAgfSwgVVBEQVRFX1ZBTElEQVRPUl9FTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICB2YWx1ZUNvbXBvbmVudC5vbkNoYW5nZShjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKHVpVmFsdWUpID0+IHtcbiAgICAgIGlmIChzaG91bGRTa2lwT25DaGFuZ2UpIHtcbiAgICAgICAgc2hvdWxkU2tpcE9uQ2hhbmdlID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2hvdWxkRW1wdHlPbkJsdXIgPSBmYWxzZTtcblxuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLmdldFBsdWdpblNldHRpbmdzUHJvcGVydHkocHJvcGVydHlOYW1lKTtcbiAgICAgIGxldCBuZXdWYWx1ZTogUHJvcGVydHlUeXBlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgbGV0IHNob3VsZFNldFByb3BlcnR5ID0gdHJ1ZTtcbiAgICAgIHNob3VsZFJldmVydFRvRGVmYXVsdFZhbHVlT25CbHVyID0gISF0ZXh0QmFzZWRDb21wb25lbnQ/LmlzRW1wdHkoKSAmJiBvcHRpb25zRXh0LnNob3VsZFJlc2V0U2V0dGluZ1doZW5Db21wb25lbnRJc0VtcHR5O1xuICAgICAgaWYgKHNob3VsZFJldmVydFRvRGVmYXVsdFZhbHVlT25CbHVyKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29udmVydGVkVmFsdWUgPSBvcHRpb25zRXh0LmNvbXBvbmVudFRvUGx1Z2luU2V0dGluZ3NWYWx1ZUNvbnZlcnRlcih1aVZhbHVlKTtcbiAgICAgICAgaWYgKGlzVmFsaWRhdGlvbk1lc3NhZ2VIb2xkZXIoY29udmVydGVkVmFsdWUpKSB7XG4gICAgICAgICAgdmFsaWRhdGlvbk1lc3NhZ2UgPSBjb252ZXJ0ZWRWYWx1ZS52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgICAgICBzaG91bGRTZXRQcm9wZXJ0eSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1ZhbHVlID0gY29udmVydGVkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFNldFByb3BlcnR5KSB7XG4gICAgICAgIHZhbGlkYXRpb25NZXNzYWdlID0gYXdhaXQgdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlIGFzIFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0pO1xuICAgICAgICBpZiAodGV4dEJhc2VkQ29tcG9uZW50ICYmIG9wdGlvbnNFeHQuc2hvdWxkU2hvd1BsYWNlaG9sZGVyRm9yRGVmYXVsdFZhbHVlcyAmJiAhdGV4dEJhc2VkQ29tcG9uZW50LmlzRW1wdHkoKSAmJiBkZWVwRXF1YWwobmV3VmFsdWUsIGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgICBzaG91bGRFbXB0eU9uQmx1ciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlVmFsaWRhdG9yRWxEZWJvdW5jZWQoKTtcbiAgICAgIGlmIChzaG91bGRTZXRQcm9wZXJ0eSkge1xuICAgICAgICBhd2FpdCBvcHRpb25zRXh0Lm9uQ2hhbmdlZChuZXdWYWx1ZSBhcyBSZWFkb25seURlZXA8UHJvcGVydHlUeXBlPiwgb2xkVmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5zYXZlU2V0dGluZ3NEZWJvdW5jZWQoKTtcbiAgICB9KSk7XG5cbiAgICB2YWxpZGF0b3JFbD8uYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiB7XG4gICAgICB1cGRhdGVWYWxpZGF0b3JFbERlYm91bmNlZCgpO1xuICAgIH0pO1xuICAgIHZhbGlkYXRvckVsPy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xuICAgICAgdXBkYXRlVmFsaWRhdG9yRWxEZWJvdW5jZWQoKTtcbiAgICB9KTtcbiAgICB2YWxpZGF0b3JFbD8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdXBkYXRlVmFsaWRhdG9yRWxEZWJvdW5jZWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdmFsaWRhdGlvbk1lc3NhZ2VzID0gdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5zZXR0aW5nc1N0YXRlLnZhbGlkYXRpb25NZXNzYWdlcyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHZhbGlkYXRpb25NZXNzYWdlID0gdmFsaWRhdGlvbk1lc3NhZ2VzW3Byb3BlcnR5TmFtZV0gPz8gJyc7XG4gICAgdXBkYXRlVmFsaWRhdG9yRWxEZWJvdW5jZWQoKTtcblxuICAgIHJldHVybiB2YWx1ZUNvbXBvbmVudDtcblxuICAgIGZ1bmN0aW9uIHVwZGF0ZVZhbGlkYXRvckVsKCk6IHZvaWQge1xuICAgICAgaWYgKCF2YWxpZGF0b3JFbD8uaXNBY3RpdmVFbGVtZW50KCkpIHtcbiAgICAgICAgaWYgKHNob3VsZEVtcHR5T25CbHVyKSB7XG4gICAgICAgICAgc2hvdWxkRW1wdHlPbkJsdXIgPSBmYWxzZTtcblxuICAgICAgICAgIGlmICghdGV4dEJhc2VkQ29tcG9uZW50Py5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHNob3VsZFNraXBPbkNoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICB0ZXh0QmFzZWRDb21wb25lbnQ/LmVtcHR5KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNob3VsZFJldmVydFRvRGVmYXVsdFZhbHVlT25CbHVyKSB7XG4gICAgICAgICAgc2hvdWxkUmV2ZXJ0VG9EZWZhdWx0VmFsdWVPbkJsdXIgPSBmYWxzZTtcblxuICAgICAgICAgIGlmICh0ZXh0QmFzZWRDb21wb25lbnQ/LmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgc2hvdWxkU2tpcE9uQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhbHVlQ29tcG9uZW50LnNldFZhbHVlKGRlZmF1bHRDb21wb25lbnRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdmFsaWRhdG9yRWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhc3NlcnROb25OdWxsYWJsZSh0b29sdGlwQ29udGVudEVsKTtcblxuICAgICAgaWYgKHZhbGlkYXRpb25NZXNzYWdlID09PSAnJykge1xuICAgICAgICB2YWxpZGF0b3JFbC5zZXRDdXN0b21WYWxpZGl0eSgnJyk7XG4gICAgICAgIHZhbGlkYXRvckVsLmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgICAgdmFsaWRhdGlvbk1lc3NhZ2UgPSB2YWxpZGF0b3JFbC52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgIH1cblxuICAgICAgdmFsaWRhdG9yRWwuc2V0Q3VzdG9tVmFsaWRpdHkodmFsaWRhdGlvbk1lc3NhZ2UpO1xuICAgICAgaWYgKG9wdGlvbnNFeHQuc2hvdWxkU2hvd1ZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICAgIHRvb2x0aXBDb250ZW50RWwudGV4dENvbnRlbnQgPSB2YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgICAgdG9vbHRpcEVsPy50b2dnbGUoISF2YWxpZGF0aW9uTWVzc2FnZSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICAgIHNldFRvb2x0aXAodmFsaWRhdG9yRWwsIHZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgcGx1Z2luIHNldHRpbmdzIHRhYi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBkaXNwbGF5KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheUxlZ2FjeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExlZ2FjeSB3YXkgdG8gcmVuZGVyIHRoZSBwbHVnaW4gc2V0dGluZ3MgdGFiIGltcGVyYXRpdmVseS5cbiAgICpcbiAgICogVGhlIHByZS1kZWNsYXJhdGl2ZSBmYWxsYmFjazogT2JzaWRpYW4gb25seSBjYWxscyBpdCB3aGVuIHtAbGluayBnZXRTZXR0aW5nRGVmaW5pdGlvbnN9IHJldHVybnMgYW4gZW1wdHlcbiAgICogYXJyYXksIGkuZS4gd2hlbiB0aGUgY29uc3VtZXIgaGFzIG5vdCBvdmVycmlkZGVuIHtAbGluayBnZXRTZXR0aW5nRGVmaW5pdGlvbkl0ZW1zfS4gU3VjaCBhIGNvbnN1bWVyXG4gICAqIG92ZXJyaWRlcyB0aGlzIG1ldGhvZCBhbmQgYnVpbGRzIHRoZSBVSSB3aXRoIHtAbGluayBTZXR0aW5nRXh9IGFuZCB7QGxpbmsgYmluZH0uXG4gICAqL1xuICBwdWJsaWMgZGlzcGxheUxlZ2FjeSgpOiB2b2lkIHtcbiAgICB0aGlzLmJlZ2luUmVuZGVyQ3ljbGUoKTtcbiAgICB0aGlzLmNvbnRhaW5lckVsLmVtcHR5KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIHZhbHVlIGJhY2tpbmcgYSBuYXRpdmUgYGNvbnRyb2xgIHNldHRpbmcgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogT2JzaWRpYW4gY2FsbHMgaXQgb24gZXZlcnkgcmVuZGVyIG9mIGEgYGNvbnRyb2xgLXR5cGUgZGVmaW5pdGlvbi4gVGhlIGluaGVyaXRlZCBpbXBsZW1lbnRhdGlvbiByZWFkc1xuICAgKiBgcGx1Z2luLnNldHRpbmdzYCwgd2hpY2ggYSBwbHVnaW4gYnVpbHQgb24ge0BsaW5rIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZX0gbmV2ZXIgcG9wdWxhdGVzLCBzbyBpdCBpc1xuICAgKiByb3V0ZWQgdG8gdGhlIHNldHRpbmdzIGNvbXBvbmVudCBpbnN0ZWFkLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIHNldHRpbmdzIHByb3BlcnR5IG5hbWUuXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGdldENvbnRyb2xWYWx1ZShrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLmdldFBsdWdpblNldHRpbmdzUHJvcGVydHkoY2FzdFRvPFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+PihrZXkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkZWNsYXJhdGl2ZSBzZXR0aW5nIGRlZmluaXRpb25zIHJlbmRlcmVkIGJ5IE9ic2lkaWFuIDEuMTMrLlxuICAgKlxuICAgKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIGdldFNldHRpbmdEZWZpbml0aW9uSXRlbXN9LiBXaGVuIGEgY29uc3VtZXIgaGFzIG5vdCBvdmVycmlkZGVuIHRoYXQgaG9vayBpdCByZXR1cm5zXG4gICAqIGFuIGVtcHR5IGFycmF5LCBhbmQgT2JzaWRpYW4gZmFsbHMgYmFjayB0byB0aGUgaW1wZXJhdGl2ZSB7QGxpbmsgZGlzcGxheUxlZ2FjeX0gcGF0aC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0U2V0dGluZ0RlZmluaXRpb25zKCk6IFNldHRpbmdEZWZpbml0aW9uSXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTZXR0aW5nRGVmaW5pdGlvbkl0ZW1zKCk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgdGhlIHBsdWdpbiBzZXR0aW5ncyB0YWIuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgaGlkZSgpOiB2b2lkIHtcbiAgICBzdXBlci5oaWRlKCk7XG4gICAgdGhpcy5zYXZlU2V0dGluZ3NEZWJvdW5jZWQuY2FuY2VsKCk7XG4gICAgdGhpcy5faXNPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5lbmRSZW5kZXJDeWNsZSgpO1xuICAgIHRoaXMuY29tcG9uZW50LnVubG9hZCgpO1xuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IHRoaXMuaGlkZUFzeW5jKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jIGFjdGlvbnMgdG8gcGVyZm9ybSB3aGVuIHRoZSBzZXR0aW5ncyB0YWIgaXMgYmVpbmcgaGlkZGVuLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIHRhYiBpcyBoaWRkZW4uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGlkZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucGx1Z2luU2V0dGluZ3NDb21wb25lbnQuc2F2ZVRvRmlsZShTQVZFX1RPX0ZJTEVfQ09OVEVYVCk7XG4gIH1cblxuICAvKipcbiAgICogUmUtcmVuZGVycyB0aGUgc2V0dGluZ3MgdGFiIGFmdGVyIHRoZSB1bmRlcmx5aW5nIHN0YXRlIGNoYW5nZWQuXG4gICAqXG4gICAqIFJlYnVpbGRzIHRoZSBkZWZpbml0aW9ucyBhbmQgcmUtcmVuZGVycywgd2hpY2ggY292ZXJzIGJvdGggcGF0aHM6IE9ic2lkaWFuIHJlbmRlcnMgdGhlIGRlY2xhcmF0aXZlXG4gICAqIGRlZmluaXRpb25zIHdoZW4ge0BsaW5rIGdldFNldHRpbmdEZWZpbml0aW9uSXRlbXN9IHByb3ZpZGVzIHRoZW0sIGFuZCBmYWxscyBiYWNrIHRvXG4gICAqIHtAbGluayBkaXNwbGF5TGVnYWN5fSB3aGVuIGl0IGRvZXMgbm90LiBOb3RoaW5nIGlzIHJlbmRlcmVkIHdoaWxlIHRoZSB0YWIgaXMgbm90IHRoZSBvbmUgb24gc2NyZWVuLlxuICAgKlxuICAgKiBVc2UgaXQgb25seSBmb3IgY2hhbmdlcyB0aGF0IGFsdGVyIHRoZSBTVFJVQ1RVUkUgb2YgdGhlIHRhYiBcdTIwMTQgcm93cyBhZGRlZCBvciByZW1vdmVkLiBXaGVuIG9ubHkgYVxuICAgKiB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJCYXNlU2V0dGluZ0V4UGFyYW1zLmRpc2FibGVkfSAvIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nRXhQYXJhbXMudmlzaWJsZX1cbiAgICogcHJlZGljYXRlIGhhcyB0byBiZSByZS1ldmFsdWF0ZWQsIGNhbGwgdGhlIG11Y2ggY2hlYXBlciB7QGxpbmsgcmVmcmVzaERvbVN0YXRlfSBpbnN0ZWFkLCB3aGljaCB0b2dnbGVzIHRoZVxuICAgKiByZW5kZXJlZCBET00gaW4gcGxhY2UuXG4gICAqL1xuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcnNpc3RzIHRoZSB2YWx1ZSBvZiBhIG5hdGl2ZSBgY29udHJvbGAgc2V0dGluZyBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBUaGUgY291bnRlcnBhcnQgb2Yge0BsaW5rIGdldENvbnRyb2xWYWx1ZX06IGl0IHJvdXRlcyB0aGUgd3JpdGUgdG8gdGhlIHNldHRpbmdzIGNvbXBvbmVudCBpbnN0ZWFkIG9mIHRoZVxuICAgKiBpbmhlcml0ZWQgYHBsdWdpbi5zYXZlRGF0YWAgcGF0aCwgc28gdmFsaWRhdGlvbiwgdHJhbnNmb3JtZXJzIGFuZCB0aGUgZGVib3VuY2VkIHNhdmUgYWxsIGFwcGx5IGFzIHRoZXkgZG9cbiAgICogZm9yIGEge0BsaW5rIGJpbmR9LWVkIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBzZXR0aW5ncyBwcm9wZXJ0eSBuYW1lLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gcGVyc2lzdC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB2YWx1ZSBpcyBzZXQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgc2V0Q29udHJvbFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIHR5cGUgUHJvcGVydHlOYW1lID0gU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz47XG4gICAgYXdhaXQgdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5zZXRQcm9wZXJ0eShjYXN0VG88UHJvcGVydHlOYW1lPihrZXkpLCBjYXN0VG88UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT4odmFsdWUpKTtcbiAgICB0aGlzLnNhdmVTZXR0aW5nc0RlYm91bmNlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIHRoZSBwbHVnaW4gc2V0dGluZ3MgdGFiLlxuICAgKi9cbiAgcHVibGljIHNob3coKTogdm9pZCB7XG4gICAgdGhpcy5hcHAuc2V0dGluZy5vcGVuVGFiKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkZWNsYXJhdGl2ZSBzZXR0aW5nIGRlZmluaXRpb25zIGZvciB0aGUgdGFiIChPYnNpZGlhbiAxLjEzKykuXG4gICAqXG4gICAqIENvbnN1bWVycyBvdmVycmlkZSB0aGlzLCB0eXBpY2FsbHkgYnVpbGRpbmcgZWFjaCByb3cgd2l0aCB7QGxpbmsgc2V0dGluZ0V4fSBhbmQge0BsaW5rIGJpbmR9IGFuZCBncm91cGluZ1xuICAgKiB0aGVtIHdpdGggYHNldHRpbmdHcm91cEV4YC4gUmV0dXJuaW5nIGFuIGVtcHR5IGFycmF5IFx1MjAxNCB0aGUgZGVmYXVsdCBcdTIwMTQgbWFrZXMgT2JzaWRpYW4gZmFsbCBiYWNrIHRvIHRoZVxuICAgKiBpbXBlcmF0aXZlIHtAbGluayBkaXNwbGF5TGVnYWN5fSBwYXRoLlxuICAgKlxuICAgKiBNVVNUIGJlIGEgcHVyZSBidWlsZGVyLiBPYnNpZGlhbiBjYWxscyBpdCB3aGVuIHRoZSB0YWIgaXMgcmVnaXN0ZXJlZCAoYGFkZFNldHRpbmdUYWJgKSwgbG9uZyBiZWZvcmUgdGhlXG4gICAqIHRhYiBpcyBldmVyIG9wZW5lZCwgaW4gb3JkZXIgdG8gaW5kZXggdGhlIHNldHRpbmdzIGZvciBzZWFyY2guIEFueXRoaW5nIHdpdGggYSBzaWRlIGVmZmVjdCBiZWxvbmdzIGluc2lkZVxuICAgKiBhIHJvdydzIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nRXhQYXJhbXMucmVuZGVyfSBjYWxsYmFjaywgd2hpY2ggcnVucyBvbmx5IHdoZW4gdGhlIHJvdyBpc1xuICAgKiBhY3R1YWxseSByZW5kZXJlZC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0U2V0dGluZ0RlZmluaXRpb25JdGVtcygpOiBTZXR0aW5nRGVmaW5pdGlvbkl0ZW1bXSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gc2V0dGluZ3MgYXJlIGxvYWRlZC5cbiAgICpcbiAgICogQHBhcmFtIF9sb2FkZWRTdGF0ZSAtIFRoZSBsb2FkZWQgc2V0dGluZ3Mgc3RhdGUuXG4gICAqIEBwYXJhbSBfaXNJbml0aWFsTG9hZCAtIFdoZXRoZXIgdGhlIHNldHRpbmdzIGFyZSBiZWluZyBsb2FkZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSBsb2FkZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25Mb2FkU2V0dGluZ3MoX2xvYWRlZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LCBfaXNJbml0aWFsTG9hZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIGF3YWl0IG5vb3BBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmFsaWRhdGVzIHRoZSBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgcmV2YWxpZGF0ZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcmV2YWxpZGF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2YWxpZGF0aW9uTWVzc2FnZXMgPSBhd2FpdCB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50LnJldmFsaWRhdGUoKTtcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZVZhbGlkYXRpb25zKHZhbGlkYXRpb25NZXNzYWdlcyk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc2VhcmNoLWluZGV4YWJsZSBkZWNsYXJhdGl2ZSByb3cgdGhhdCBpcyByZW5kZXJlZCBpbXBlcmF0aXZlbHkuXG4gICAqXG4gICAqIFRoZSBicmlkZ2UgYmV0d2VlbiB0aGUgZGVjbGFyYXRpdmUgQVBJIGFuZCBPRFUncyBpbXBlcmF0aXZlIGJ1aWxkaW5nIGJsb2NrczogT2JzaWRpYW4gb3ducyB0aGUgcm93IChzbyBpdFxuICAgKiBpbmRleGVzIGl0IGZvciBzZWFyY2ggYW5kIGV2YWx1YXRlcyBpdHMge0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZVNldHRpbmdFeFBhcmFtcy52aXNpYmxlfSAvXG4gICAqIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nRXhQYXJhbXMuZGlzYWJsZWR9IHByZWRpY2F0ZXMgb24gZXZlcnlcbiAgICoge0BsaW5rIHJlZnJlc2hEb21TdGF0ZX0pLCB3aGlsZSB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJCYXNlU2V0dGluZ0V4UGFyYW1zLnJlbmRlcn0gZmlsbHMgaXQgaW4gd2l0aFxuICAgKiB7QGxpbmsgU2V0dGluZ0V4fSBhZGRlcnMgYW5kIHtAbGluayBiaW5kfSBleGFjdGx5IGFzIGFuIGltcGVyYXRpdmUgdGFiIHdvdWxkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHJvdyBwYXJhbXMuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGRlZmluaXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0dGluZ0V4KHBhcmFtczogUGx1Z2luU2V0dGluZ3NUYWJCYXNlU2V0dGluZ0V4UGFyYW1zKTogU2V0dGluZ0RlZmluaXRpb25SZW5kZXIge1xuICAgIHJldHVybiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2V0dGluZ0RlZmluaXRpb25SZW5kZXI+KHtcbiAgICAgIGFsaWFzZXM6IHBhcmFtcy5hbGlhc2VzLFxuICAgICAgZGVzYzogcGFyYW1zLmRlc2MsXG4gICAgICBkaXNhYmxlZDogcGFyYW1zLmRpc2FibGVkLFxuICAgICAgbmFtZTogcGFyYW1zLm5hbWUsXG4gICAgICByZW5kZXI6IChzZXR0aW5nOiBTZXR0aW5nLCBncm91cDogU2V0dGluZ0dyb3VwKSA9PiB0aGlzLnJlbmRlclNldHRpbmdFeCh7IGdyb3VwLCBzZXR0aW5nLCBzZXR0aW5nRXhQYXJhbXM6IHBhcmFtcyB9KSxcbiAgICAgIHNlYXJjaGFibGU6IHBhcmFtcy5zZWFyY2hhYmxlLFxuICAgICAgdmlzaWJsZTogcGFyYW1zLnZpc2libGVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBkZWNsYXJhdGl2ZSBoZWFkaW5nIGdyb3VwLlxuICAgKlxuICAgKiBUaGUgZGVjbGFyYXRpdmUgY291bnRlcnBhcnQgb2YgYFNldHRpbmdHcm91cEV4YDogd2hlcmUgdGhhdCBjbGFzcyBhcHBlbmRzIGEgZ3JvdXAgdG8gYSBjb250YWluZXJcbiAgICogaW1wZXJhdGl2ZWx5LCB0aGlzIHJldHVybnMgdGhlIGRlZmluaXRpb24gT2JzaWRpYW4gcmVuZGVycywgc28gYSBncm91cC1zdHJ1Y3R1cmVkIHRhYiBrZWVwcyBpdHMgc2hhcGVcbiAgICogYWZ0ZXIgdGhlIG1pZ3JhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBncm91cCBwYXJhbXMuXG4gICAqIEByZXR1cm5zIFRoZSBncm91cCBkZWZpbml0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldHRpbmdHcm91cEV4KHBhcmFtczogUGx1Z2luU2V0dGluZ3NUYWJCYXNlU2V0dGluZ0dyb3VwRXhQYXJhbXMpOiBTZXR0aW5nRGVmaW5pdGlvbkdyb3VwIHtcbiAgICByZXR1cm4gbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNldHRpbmdEZWZpbml0aW9uR3JvdXA+KHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHR5cGU6ICdncm91cCdcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYmVnaW5SZW5kZXJDeWNsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmVuZFJlbmRlckN5Y2xlKCk7XG4gICAgdGhpcy5jdXJyZW50UmVuZGVyQ29tcG9uZW50ID0gdGhpcy5jcmVhdGVSZW5kZXJDb21wb25lbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUmVuZGVyQ29tcG9uZW50KCk6IENvbXBvbmVudEV4IHtcbiAgICB0aGlzLl9pc09wZW4gPSB0cnVlO1xuICAgIHRoaXMuY29tcG9uZW50LmxvYWQoKTtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQuYWRkQ2hpbGQobmV3IENvbXBvbmVudEV4KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmRSZW5kZXJDeWNsZSgpOiB2b2lkIHtcbiAgICBjb25zdCByZW5kZXJDb21wb25lbnQgPSB0aGlzLmN1cnJlbnRSZW5kZXJDb21wb25lbnQ7XG4gICAgaWYgKCFyZW5kZXJDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRSZW5kZXJDb21wb25lbnQgPSBudWxsO1xuICAgIHRoaXMuY29tcG9uZW50LnJlbW92ZUNoaWxkKHJlbmRlckNvbXBvbmVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldFBsdWdpblNldHRpbmdzUHJvcGVydHk8UHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lXG4gICk6IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPiB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnBsdWdpblNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuICAgIHJldHVybiBzZXR0aW5nc1twcm9wZXJ0eU5hbWVdIGFzIFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVuZGVyQ29tcG9uZW50KCk6IENvbXBvbmVudEV4IHtcbiAgICB0aGlzLmN1cnJlbnRSZW5kZXJDb21wb25lbnQgPz89IHRoaXMuY3JlYXRlUmVuZGVyQ29tcG9uZW50KCk7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFJlbmRlckNvbXBvbmVudDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgb25TYXZlU2V0dGluZ3MocGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VPblNhdmVTZXR0aW5nc1BhcmFtczxQbHVnaW5TZXR0aW5ncz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7XG4gICAgICBjb250ZXh0LFxuICAgICAgbmV3U3RhdGUsXG4gICAgICBvbGRTdGF0ZTogX29sZFN0YXRlXG4gICAgfSA9IHBhcmFtcztcbiAgICBpZiAoY29udGV4dCA9PT0gU0FWRV9UT19GSUxFX0NPTlRFWFQpIHtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlVmFsaWRhdGlvbnMobmV3U3RhdGUudmFsaWRhdGlvbk1lc3NhZ2VzIGFzIFJlY29yZDxTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPiwgc3RyaW5nPik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWludmFsaWQtdm9pZC10eXBlIC0tIE1pcnJvcnMgT2JzaWRpYW4ncyBgU2V0dGluZ0RlZmluaXRpb25SZW5kZXIucmVuZGVyYCwgd2hvc2UgY2xlYW51cCBmdW5jdGlvbiBpcyBvcHRpb25hbC5cbiAgcHJpdmF0ZSByZW5kZXJTZXR0aW5nRXgocGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VSZW5kZXJTZXR0aW5nRXhQYXJhbXMpOiAoKCkgPT4gdm9pZCkgfCB2b2lkIHtcbiAgICBjb25zdCByb3dDb21wb25lbnQgPSB0aGlzLmNyZWF0ZVJlbmRlckNvbXBvbmVudCgpO1xuICAgIGNvbnN0IHByZXZpb3VzUmVuZGVyQ29tcG9uZW50ID0gdGhpcy5jdXJyZW50UmVuZGVyQ29tcG9uZW50O1xuICAgIHRoaXMuY3VycmVudFJlbmRlckNvbXBvbmVudCA9IHJvd0NvbXBvbmVudDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjbGVhbnVwID0gcGFyYW1zLnNldHRpbmdFeFBhcmFtcy5yZW5kZXIoYWRvcHRTZXR0aW5nRXgocGFyYW1zLnNldHRpbmcpLCBwYXJhbXMuZ3JvdXApO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhbnVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnQucmVtb3ZlQ2hpbGQocm93Q29tcG9uZW50KTtcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY3VycmVudFJlbmRlckNvbXBvbmVudCA9IHByZXZpb3VzUmVuZGVyQ29tcG9uZW50O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlVmFsaWRhdGlvbnModmFsaWRhdGlvbk1lc3NhZ2VzOiBSZWNvcmQ8U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4sIHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eU5hbWUsIHZhbGlkYXRpb25NZXNzYWdlXSBvZiBPYmplY3QuZW50cmllcyh2YWxpZGF0aW9uTWVzc2FnZXMpKSB7XG4gICAgICBhd2FpdCB0aGlzLnRyaWdnZXJBc3luYygndmFsaWRhdGlvbk1lc3NhZ2VDaGFuZ2VkJywgcHJvcGVydHlOYW1lLCB2YWxpZGF0aW9uTWVzc2FnZSBhcyBzdHJpbmcpO1xuICAgIH1cbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBWVAsU0FBUyx3QkFBd0I7QUFDakM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsa0NBQWtDO0FBQzNDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsMkJBQTJCO0FBSzdCLE1BQU0sdUJBQXVCO0FBNFNwQyxNQUFNLHlDQUF3RSxZQUFZO0FBQUEsRUFDdkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVixZQUFZLFFBQTJFO0FBQzVGLFVBQU07QUFDTixTQUFLLFNBQVM7QUFBQSxFQUNoQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS2dCLFNBQWU7QUFDN0IsVUFBTSxPQUFPO0FBQ2IsVUFBTSxFQUFFLHdCQUF3QixJQUFJLEtBQUs7QUFDekMsdUJBQW1CLE1BQU0sd0JBQXdCLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxrQkFBa0IsS0FBSyxPQUFPLGVBQWUsYUFBYSxhQUFhLENBQUMsQ0FBQztBQUMzSix1QkFBbUIsTUFBTSx3QkFBd0IsR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLFVBQVUsWUFBWSxLQUFLLE9BQU8sZUFB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
@@ -111,6 +111,12 @@ export declare function cmdEscapeCommandLine(commandLine: string): string;
111
111
  /**
112
112
  * Wraps a CLI task function to ensure it runs safely and handles its {@link CliTaskResult}.
113
113
  *
114
+ * Honors the per-script off switch first: when the npm script currently running has been switched off —
115
+ * `LINT_MD=0 npm run lint:md`, see {@link getDisabledScriptEnvVariableName} — the task is not executed and
116
+ * the process exits successfully. Because every `scripts/*.ts` entry point already funnels through here, no
117
+ * script has to opt in, and each `npm run` sub-step of a composite script (e.g. `build`) carries its own
118
+ * switch.
119
+ *
114
120
  * @param taskFn - The task function to execute, which may return a {@link CliTaskResult} or `void`.
115
121
  * @returns A {@link Promise} that resolves when the task is completed and exits with the appropriate status.
116
122
  */