obsidian-integration-testing 12.1.2 → 12.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -5
- package/dist/lib/cjs/app-config.cjs +137 -0
- package/dist/lib/cjs/app-config.d.cts +190 -0
- package/dist/lib/cjs/appium-session-config.cjs +7 -1
- package/dist/lib/cjs/appium-session-config.d.cts +20 -0
- package/dist/lib/cjs/cdp-command-timeout-error.cjs +50 -0
- package/dist/lib/cjs/cdp-command-timeout-error.d.cts +48 -0
- package/dist/lib/cjs/connect-to-cdp.cjs +1 -1
- package/dist/lib/cjs/connect-to-cdp.d.cts +5 -0
- package/dist/lib/cjs/emulator-arguments.cjs +19 -3
- package/dist/lib/cjs/emulator-arguments.d.cts +44 -0
- package/dist/lib/cjs/emulator-device-id.cjs +1 -1
- package/dist/lib/cjs/emulator-device-id.d.cts +7 -6
- package/dist/lib/cjs/emulator-marker.cjs +169 -0
- package/dist/lib/cjs/emulator-marker.d.cts +224 -0
- package/dist/lib/cjs/emulator-reaper.cjs +248 -0
- package/dist/lib/cjs/emulator-reaper.d.cts +225 -0
- package/dist/lib/cjs/emulator-reclaim.cjs +312 -0
- package/dist/lib/cjs/emulator-reclaim.d.cts +179 -0
- package/dist/lib/cjs/eval-cap-exceeded-error.cjs +61 -0
- package/dist/lib/cjs/eval-cap-exceeded-error.d.cts +92 -0
- package/dist/lib/cjs/eval-cap.cjs +29 -0
- package/dist/lib/cjs/eval-cap.d.cts +43 -0
- package/dist/lib/cjs/global-setup-core.cjs +2 -3
- package/dist/lib/cjs/index.cjs +21 -1
- package/dist/lib/cjs/index.d.cts +7 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/poll-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/poll-in-obsidian.d.cts +7 -2
- package/dist/lib/cjs/setup-lock.cjs +56 -8
- package/dist/lib/cjs/setup-lock.d.cts +53 -0
- package/dist/lib/cjs/soft-keyboard-geometry.cjs +17 -8
- package/dist/lib/cjs/soft-keyboard-geometry.d.cts +46 -9
- package/dist/lib/cjs/soft-keyboard.cjs +7 -4
- package/dist/lib/cjs/soft-keyboard.d.cts +16 -2
- package/dist/lib/cjs/transport-appium.cjs +70 -5
- package/dist/lib/cjs/transport-appium.d.cts +35 -0
- package/dist/lib/cjs/transport-desktop-cdp.cjs +98 -19
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +44 -1
- package/dist/lib/cjs/transport-factory.cjs +297 -190
- package/dist/lib/cjs/transport-factory.d.cts +15 -0
- package/dist/lib/cjs/transport-options.cjs +1 -1
- package/dist/lib/cjs/transport-options.d.cts +38 -1
- package/dist/lib/cjs/webview-cdp.cjs +45 -14
- package/dist/lib/cjs/webview-cdp.d.cts +17 -0
- package/dist/lib/esm/app-config.d.mts +190 -0
- package/dist/lib/esm/app-config.mjs +110 -0
- package/dist/lib/esm/appium-session-config.d.mts +20 -0
- package/dist/lib/esm/appium-session-config.mjs +6 -1
- package/dist/lib/esm/cdp-command-timeout-error.d.mts +48 -0
- package/dist/lib/esm/cdp-command-timeout-error.mjs +26 -0
- package/dist/lib/esm/connect-to-cdp.d.mts +5 -0
- package/dist/lib/esm/connect-to-cdp.mjs +1 -1
- package/dist/lib/esm/emulator-arguments.d.mts +44 -0
- package/dist/lib/esm/emulator-arguments.mjs +16 -2
- package/dist/lib/esm/emulator-device-id.d.mts +7 -6
- package/dist/lib/esm/emulator-device-id.mjs +1 -1
- package/dist/lib/esm/emulator-marker.d.mts +224 -0
- package/dist/lib/esm/emulator-marker.mjs +134 -0
- package/dist/lib/esm/emulator-reaper.d.mts +225 -0
- package/dist/lib/esm/emulator-reaper.mjs +211 -0
- package/dist/lib/esm/emulator-reclaim.d.mts +179 -0
- package/dist/lib/esm/emulator-reclaim.mjs +291 -0
- package/dist/lib/esm/eval-cap-exceeded-error.d.mts +92 -0
- package/dist/lib/esm/eval-cap-exceeded-error.mjs +36 -0
- package/dist/lib/esm/eval-cap.d.mts +43 -0
- package/dist/lib/esm/eval-cap.mjs +5 -0
- package/dist/lib/esm/global-setup-core.mjs +6 -4
- package/dist/lib/esm/index.d.mts +7 -0
- package/dist/lib/esm/index.mjs +21 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/poll-in-obsidian.d.mts +7 -2
- package/dist/lib/esm/poll-in-obsidian.mjs +1 -1
- package/dist/lib/esm/setup-lock.d.mts +53 -0
- package/dist/lib/esm/setup-lock.mjs +52 -7
- package/dist/lib/esm/soft-keyboard-geometry.d.mts +46 -9
- package/dist/lib/esm/soft-keyboard-geometry.mjs +17 -8
- package/dist/lib/esm/soft-keyboard.d.mts +16 -2
- package/dist/lib/esm/soft-keyboard.mjs +7 -4
- package/dist/lib/esm/transport-appium.d.mts +35 -0
- package/dist/lib/esm/transport-appium.mjs +73 -5
- package/dist/lib/esm/transport-desktop-cdp.d.mts +44 -1
- package/dist/lib/esm/transport-desktop-cdp.mjs +98 -19
- package/dist/lib/esm/transport-factory.d.mts +15 -0
- package/dist/lib/esm/transport-factory.mjs +305 -184
- package/dist/lib/esm/transport-options.d.mts +38 -1
- package/dist/lib/esm/transport-options.mjs +1 -1
- package/dist/lib/esm/webview-cdp.d.mts +17 -0
- package/dist/lib/esm/webview-cdp.mjs +45 -14
- package/package.json +4 -4
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Node-side read/write/restore seam for one of Obsidian's **vault config** keys,
|
|
5
|
+
* for the few tests that need a different value than the harness's headless
|
|
6
|
+
* default.
|
|
7
|
+
*
|
|
8
|
+
* `ensureHeadlessVaultConfig` writes `alwaysUpdateLinks: true` and
|
|
9
|
+
* `settingsPopoutWindow: false` into every vault the harness provisions, before
|
|
10
|
+
* that vault is ever opened, and neither is a knob a consumer configures — see
|
|
11
|
+
* the project `AGENTS.md` (**L48**). That is right for almost every test, and
|
|
12
|
+
* wrong for the few whose **subject is** the second Electron window the popout
|
|
13
|
+
* creates: a test that waits on `activeWindow !== window`, or reads
|
|
14
|
+
* `app.setting.popout`, never observes the thing it asserts and simply times out.
|
|
15
|
+
*
|
|
16
|
+
* Those tests opt back in through here rather than by hand, which buys three
|
|
17
|
+
* things over an inline `setConfig` inside an `evalInObsidian` closure:
|
|
18
|
+
*
|
|
19
|
+
* - **The value is restored**, including deleting a key that had never been
|
|
20
|
+
* written. An inline setter writes into a vault shared with the rest of the
|
|
21
|
+
* run, so every later test in that instance inherits the change — the
|
|
22
|
+
* cross-test contamination the unconditional default exists to end.
|
|
23
|
+
* - **The cast lives in one place.** `obsidian-typings`' `ConfigItem` union omits
|
|
24
|
+
* `settingsPopoutWindow`, so the key cannot be passed to `getConfig` /
|
|
25
|
+
* `setConfig` without widening them; every consumer that wrote the setter
|
|
26
|
+
* inline repeated that cast.
|
|
27
|
+
* - **Per-test granularity.** A parameter on the provisioning write would be
|
|
28
|
+
* per-vault, and a project whose tests share one vault — the usual shape —
|
|
29
|
+
* cannot have it both ways.
|
|
30
|
+
*
|
|
31
|
+
* Everything here runs on the **Node** side. An `evalInObsidian` callback is
|
|
32
|
+
* serialized into the driven Obsidian and can import nothing, so a helper
|
|
33
|
+
* callable from inside one is not expressible; each function below is its own
|
|
34
|
+
* short eval instead.
|
|
35
|
+
*
|
|
36
|
+
* ### Why presence is read off `app.vault.config`, not from `getConfig`
|
|
37
|
+
*
|
|
38
|
+
* Both facts were verified in the shipped 1.14.1 bundle rather than assumed:
|
|
39
|
+
*
|
|
40
|
+
* - `Vault.setConfig(key, value)` **deletes** the key when `value` is
|
|
41
|
+
* `undefined`, and does nothing at all when the value is unchanged (no save,
|
|
42
|
+
* no `config-changed` event). So an exact restore of a key that was never
|
|
43
|
+
* written is expressible.
|
|
44
|
+
* - `Vault.getConfig(key)` falls back to Obsidian's defaults table when the key
|
|
45
|
+
* is absent, so it cannot tell *unset* from *set to the shipped default* —
|
|
46
|
+
* restoring from it would leave the key written where it had not been.
|
|
47
|
+
* `app.vault.config` holds only the keys changed from their default, so
|
|
48
|
+
* `Object.hasOwn` on it is the signal a restore needs.
|
|
49
|
+
*/
|
|
50
|
+
import type { ObsidianTransport } from './transport.mjs';
|
|
51
|
+
/**
|
|
52
|
+
* Parameters for {@link getAppConfig}, and the shared shape of the writers below.
|
|
53
|
+
*/
|
|
54
|
+
export interface AppConfigParams {
|
|
55
|
+
/**
|
|
56
|
+
* The vault config key, e.g. `settingsPopoutWindow`. Not narrowed to
|
|
57
|
+
* `obsidian-typings`' `ConfigItem`: that union omits keys Obsidian really
|
|
58
|
+
* reads, `settingsPopoutWindow` among them, which is the whole reason a
|
|
59
|
+
* consumer had to widen the setter by hand.
|
|
60
|
+
*/
|
|
61
|
+
readonly configKey: string;
|
|
62
|
+
/**
|
|
63
|
+
* Override the transport. When omitted, the transport the current test
|
|
64
|
+
* context is driving is used.
|
|
65
|
+
*/
|
|
66
|
+
readonly transport?: ObsidianTransport;
|
|
67
|
+
/**
|
|
68
|
+
* The vault whose Obsidian instance to read or write. When omitted, the
|
|
69
|
+
* current test context's vault is used.
|
|
70
|
+
*/
|
|
71
|
+
readonly vaultPath?: string;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* What {@link setAppConfig} captured before it wrote, and all
|
|
75
|
+
* {@link restoreAppConfig} needs to put the key back exactly as it was —
|
|
76
|
+
* including putting it back to *absent*.
|
|
77
|
+
*/
|
|
78
|
+
export interface AppConfigRestore {
|
|
79
|
+
/**
|
|
80
|
+
* The key that was written.
|
|
81
|
+
*/
|
|
82
|
+
readonly configKey: string;
|
|
83
|
+
/**
|
|
84
|
+
* Whether the vault's config carried the key at all before the write. `false`
|
|
85
|
+
* means the vault was running on Obsidian's own default, and restoring is a
|
|
86
|
+
* delete rather than a write.
|
|
87
|
+
*/
|
|
88
|
+
readonly isPresent: boolean;
|
|
89
|
+
/**
|
|
90
|
+
* The transport the capture was made against, so the restore lands in the
|
|
91
|
+
* same instance.
|
|
92
|
+
*/
|
|
93
|
+
readonly transport?: ObsidianTransport;
|
|
94
|
+
/**
|
|
95
|
+
* The value the key held, or `undefined` when {@link isPresent} is `false`.
|
|
96
|
+
*/
|
|
97
|
+
readonly value: unknown;
|
|
98
|
+
/**
|
|
99
|
+
* The vault the capture was made against, so the restore lands in the same
|
|
100
|
+
* instance.
|
|
101
|
+
*/
|
|
102
|
+
readonly vaultPath?: string;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Parameters for {@link setAppConfig}.
|
|
106
|
+
*/
|
|
107
|
+
export interface SetAppConfigParams extends AppConfigParams {
|
|
108
|
+
/**
|
|
109
|
+
* The value to write. `undefined` deletes the key, leaving Obsidian's own
|
|
110
|
+
* default in force.
|
|
111
|
+
*/
|
|
112
|
+
readonly value: unknown;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Parameters for {@link withAppConfig}.
|
|
116
|
+
*
|
|
117
|
+
* @typeParam T - What the wrapped work returns.
|
|
118
|
+
*/
|
|
119
|
+
export interface WithAppConfigParams<T> extends SetAppConfigParams {
|
|
120
|
+
/**
|
|
121
|
+
* The work to run while the key holds {@link SetAppConfigParams.value}.
|
|
122
|
+
*/
|
|
123
|
+
readonly callback: (this: void) => Promise<T>;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Reads a vault config key, resolving the transport and vault from the current
|
|
127
|
+
* test context.
|
|
128
|
+
*
|
|
129
|
+
* This is Obsidian's own `Vault.getConfig`, so an absent key reads back as
|
|
130
|
+
* Obsidian's **default** for it rather than as `undefined` — see this file's
|
|
131
|
+
* header. Use {@link setAppConfig}'s {@link AppConfigRestore.isPresent} when the
|
|
132
|
+
* difference matters.
|
|
133
|
+
*
|
|
134
|
+
* @param params - The key to read, and transport / vault overrides.
|
|
135
|
+
* @returns A {@link Promise} resolving to the key's effective value.
|
|
136
|
+
*/
|
|
137
|
+
export declare function getAppConfig(params: AppConfigParams): Promise<unknown>;
|
|
138
|
+
/**
|
|
139
|
+
* Puts a key back exactly as {@link setAppConfig} found it — writing the captured
|
|
140
|
+
* value back, or **deleting** the key when the vault had never carried it.
|
|
141
|
+
*
|
|
142
|
+
* The `beforeAll` / `afterAll` half of the seam. A test that scopes the change
|
|
143
|
+
* to one callback wants {@link withAppConfig} instead, which cannot forget the
|
|
144
|
+
* restore.
|
|
145
|
+
*
|
|
146
|
+
* @param restore - The token {@link setAppConfig} returned.
|
|
147
|
+
* @returns A {@link Promise} that resolves once the key is back as it was.
|
|
148
|
+
*/
|
|
149
|
+
export declare function restoreAppConfig(restore: AppConfigRestore): Promise<void>;
|
|
150
|
+
/**
|
|
151
|
+
* Writes a vault config key, capturing what it held first so the write can be
|
|
152
|
+
* undone exactly.
|
|
153
|
+
*
|
|
154
|
+
* Obsidian persists the change (`requestSaveConfig`) and fires its
|
|
155
|
+
* `config-changed` event, both of which the app's own settings UI does too — so
|
|
156
|
+
* anything listening reacts as it would to a user flipping the toggle. A write
|
|
157
|
+
* of the value the key already holds is a no-op in Obsidian itself, and the
|
|
158
|
+
* returned token still describes the state that preceded it.
|
|
159
|
+
*
|
|
160
|
+
* @param params - The key, the value, and transport / vault overrides.
|
|
161
|
+
* @returns A {@link Promise} resolving to the {@link AppConfigRestore} token to
|
|
162
|
+
* hand {@link restoreAppConfig}.
|
|
163
|
+
*/
|
|
164
|
+
export declare function setAppConfig(params: SetAppConfigParams): Promise<AppConfigRestore>;
|
|
165
|
+
/**
|
|
166
|
+
* Runs work with a vault config key temporarily set, and puts the key back
|
|
167
|
+
* afterwards — on a throw as much as on a return.
|
|
168
|
+
*
|
|
169
|
+
* The shape a popout-subject test wants:
|
|
170
|
+
*
|
|
171
|
+
* ```ts
|
|
172
|
+
* await withAppConfig({
|
|
173
|
+
* async callback() {
|
|
174
|
+
* await evalInObsidian({ ... }); // the settings window is a popout in here
|
|
175
|
+
* },
|
|
176
|
+
* configKey: 'settingsPopoutWindow',
|
|
177
|
+
* value: true,
|
|
178
|
+
* vaultPath
|
|
179
|
+
* });
|
|
180
|
+
* ```
|
|
181
|
+
*
|
|
182
|
+
* The callback runs on the **Node** side, so it is free to make several evals,
|
|
183
|
+
* take a screenshot, or assert between them.
|
|
184
|
+
*
|
|
185
|
+
* @typeParam T - What the wrapped work returns.
|
|
186
|
+
* @param params - The key, the value to hold it at, the work, and transport /
|
|
187
|
+
* vault overrides.
|
|
188
|
+
* @returns A {@link Promise} resolving to whatever the callback returned.
|
|
189
|
+
*/
|
|
190
|
+
export declare function withAppConfig<T>(params: WithAppConfigParams<T>): Promise<T>;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { evalInObsidian } from "./eval-in-obsidian.mjs";
|
|
2
|
+
import { normalizeOptionalProperties } from "./normalize-optional-properties.mjs";
|
|
3
|
+
async function getAppConfig(params) {
|
|
4
|
+
const {
|
|
5
|
+
configKey,
|
|
6
|
+
transport,
|
|
7
|
+
vaultPath
|
|
8
|
+
} = params;
|
|
9
|
+
return await evalInObsidian(normalizeOptionalProperties({
|
|
10
|
+
callback({ app, configKey: key }) {
|
|
11
|
+
const getConfig = app.vault.getConfig.bind(app.vault);
|
|
12
|
+
return getConfig(key);
|
|
13
|
+
},
|
|
14
|
+
input: { configKey },
|
|
15
|
+
transport,
|
|
16
|
+
vaultPath
|
|
17
|
+
}));
|
|
18
|
+
}
|
|
19
|
+
async function restoreAppConfig(restore) {
|
|
20
|
+
const {
|
|
21
|
+
configKey,
|
|
22
|
+
isPresent,
|
|
23
|
+
transport,
|
|
24
|
+
value,
|
|
25
|
+
vaultPath
|
|
26
|
+
} = restore;
|
|
27
|
+
await evalInObsidian(normalizeOptionalProperties({
|
|
28
|
+
callback({
|
|
29
|
+
app,
|
|
30
|
+
configKey: key,
|
|
31
|
+
isPresent: wasPresent,
|
|
32
|
+
value: previousValue
|
|
33
|
+
}) {
|
|
34
|
+
const setConfig = app.vault.setConfig.bind(app.vault);
|
|
35
|
+
setConfig(key, wasPresent ? previousValue : void 0);
|
|
36
|
+
},
|
|
37
|
+
input: {
|
|
38
|
+
configKey,
|
|
39
|
+
isPresent,
|
|
40
|
+
value
|
|
41
|
+
},
|
|
42
|
+
transport,
|
|
43
|
+
vaultPath
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
async function setAppConfig(params) {
|
|
47
|
+
const {
|
|
48
|
+
configKey,
|
|
49
|
+
transport,
|
|
50
|
+
value,
|
|
51
|
+
vaultPath
|
|
52
|
+
} = params;
|
|
53
|
+
const captured = await evalInObsidian(normalizeOptionalProperties({
|
|
54
|
+
callback({
|
|
55
|
+
app,
|
|
56
|
+
configKey: key,
|
|
57
|
+
value: newValue
|
|
58
|
+
}) {
|
|
59
|
+
const isPresent = Object.hasOwn(app.vault.config, key);
|
|
60
|
+
const getConfig = app.vault.getConfig.bind(app.vault);
|
|
61
|
+
const previousValue = isPresent ? getConfig(key) : void 0;
|
|
62
|
+
const setConfig = app.vault.setConfig.bind(app.vault);
|
|
63
|
+
setConfig(key, newValue);
|
|
64
|
+
return {
|
|
65
|
+
isPresent,
|
|
66
|
+
value: previousValue
|
|
67
|
+
};
|
|
68
|
+
},
|
|
69
|
+
input: {
|
|
70
|
+
configKey,
|
|
71
|
+
value
|
|
72
|
+
},
|
|
73
|
+
transport,
|
|
74
|
+
vaultPath
|
|
75
|
+
}));
|
|
76
|
+
return normalizeOptionalProperties({
|
|
77
|
+
configKey,
|
|
78
|
+
isPresent: captured.isPresent,
|
|
79
|
+
transport,
|
|
80
|
+
value: captured.value,
|
|
81
|
+
vaultPath
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
async function withAppConfig(params) {
|
|
85
|
+
const {
|
|
86
|
+
callback,
|
|
87
|
+
configKey,
|
|
88
|
+
transport,
|
|
89
|
+
value,
|
|
90
|
+
vaultPath
|
|
91
|
+
} = params;
|
|
92
|
+
const restore = await setAppConfig(normalizeOptionalProperties({
|
|
93
|
+
configKey,
|
|
94
|
+
transport,
|
|
95
|
+
value,
|
|
96
|
+
vaultPath
|
|
97
|
+
}));
|
|
98
|
+
try {
|
|
99
|
+
return await callback();
|
|
100
|
+
} finally {
|
|
101
|
+
await restoreAppConfig(restore);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export {
|
|
105
|
+
getAppConfig,
|
|
106
|
+
restoreAppConfig,
|
|
107
|
+
setAppConfig,
|
|
108
|
+
withAppConfig
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FwcC1jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBOb2RlLXNpZGUgcmVhZC93cml0ZS9yZXN0b3JlIHNlYW0gZm9yIG9uZSBvZiBPYnNpZGlhbidzICoqdmF1bHQgY29uZmlnKioga2V5cyxcbiAqIGZvciB0aGUgZmV3IHRlc3RzIHRoYXQgbmVlZCBhIGRpZmZlcmVudCB2YWx1ZSB0aGFuIHRoZSBoYXJuZXNzJ3MgaGVhZGxlc3NcbiAqIGRlZmF1bHQuXG4gKlxuICogYGVuc3VyZUhlYWRsZXNzVmF1bHRDb25maWdgIHdyaXRlcyBgYWx3YXlzVXBkYXRlTGlua3M6IHRydWVgIGFuZFxuICogYHNldHRpbmdzUG9wb3V0V2luZG93OiBmYWxzZWAgaW50byBldmVyeSB2YXVsdCB0aGUgaGFybmVzcyBwcm92aXNpb25zLCBiZWZvcmVcbiAqIHRoYXQgdmF1bHQgaXMgZXZlciBvcGVuZWQsIGFuZCBuZWl0aGVyIGlzIGEga25vYiBhIGNvbnN1bWVyIGNvbmZpZ3VyZXMgXHUyMDE0IHNlZVxuICogdGhlIHByb2plY3QgYEFHRU5UUy5tZGAgKCoqTDQ4KiopLiBUaGF0IGlzIHJpZ2h0IGZvciBhbG1vc3QgZXZlcnkgdGVzdCwgYW5kXG4gKiB3cm9uZyBmb3IgdGhlIGZldyB3aG9zZSAqKnN1YmplY3QgaXMqKiB0aGUgc2Vjb25kIEVsZWN0cm9uIHdpbmRvdyB0aGUgcG9wb3V0XG4gKiBjcmVhdGVzOiBhIHRlc3QgdGhhdCB3YWl0cyBvbiBgYWN0aXZlV2luZG93ICE9PSB3aW5kb3dgLCBvciByZWFkc1xuICogYGFwcC5zZXR0aW5nLnBvcG91dGAsIG5ldmVyIG9ic2VydmVzIHRoZSB0aGluZyBpdCBhc3NlcnRzIGFuZCBzaW1wbHkgdGltZXMgb3V0LlxuICpcbiAqIFRob3NlIHRlc3RzIG9wdCBiYWNrIGluIHRocm91Z2ggaGVyZSByYXRoZXIgdGhhbiBieSBoYW5kLCB3aGljaCBidXlzIHRocmVlXG4gKiB0aGluZ3Mgb3ZlciBhbiBpbmxpbmUgYHNldENvbmZpZ2AgaW5zaWRlIGFuIGBldmFsSW5PYnNpZGlhbmAgY2xvc3VyZTpcbiAqXG4gKiAtICoqVGhlIHZhbHVlIGlzIHJlc3RvcmVkKiosIGluY2x1ZGluZyBkZWxldGluZyBhIGtleSB0aGF0IGhhZCBuZXZlciBiZWVuXG4gKiAgIHdyaXR0ZW4uIEFuIGlubGluZSBzZXR0ZXIgd3JpdGVzIGludG8gYSB2YXVsdCBzaGFyZWQgd2l0aCB0aGUgcmVzdCBvZiB0aGVcbiAqICAgcnVuLCBzbyBldmVyeSBsYXRlciB0ZXN0IGluIHRoYXQgaW5zdGFuY2UgaW5oZXJpdHMgdGhlIGNoYW5nZSBcdTIwMTQgdGhlXG4gKiAgIGNyb3NzLXRlc3QgY29udGFtaW5hdGlvbiB0aGUgdW5jb25kaXRpb25hbCBkZWZhdWx0IGV4aXN0cyB0byBlbmQuXG4gKiAtICoqVGhlIGNhc3QgbGl2ZXMgaW4gb25lIHBsYWNlLioqIGBvYnNpZGlhbi10eXBpbmdzYCcgYENvbmZpZ0l0ZW1gIHVuaW9uIG9taXRzXG4gKiAgIGBzZXR0aW5nc1BvcG91dFdpbmRvd2AsIHNvIHRoZSBrZXkgY2Fubm90IGJlIHBhc3NlZCB0byBgZ2V0Q29uZmlnYCAvXG4gKiAgIGBzZXRDb25maWdgIHdpdGhvdXQgd2lkZW5pbmcgdGhlbTsgZXZlcnkgY29uc3VtZXIgdGhhdCB3cm90ZSB0aGUgc2V0dGVyXG4gKiAgIGlubGluZSByZXBlYXRlZCB0aGF0IGNhc3QuXG4gKiAtICoqUGVyLXRlc3QgZ3JhbnVsYXJpdHkuKiogQSBwYXJhbWV0ZXIgb24gdGhlIHByb3Zpc2lvbmluZyB3cml0ZSB3b3VsZCBiZVxuICogICBwZXItdmF1bHQsIGFuZCBhIHByb2plY3Qgd2hvc2UgdGVzdHMgc2hhcmUgb25lIHZhdWx0IFx1MjAxNCB0aGUgdXN1YWwgc2hhcGUgXHUyMDE0XG4gKiAgIGNhbm5vdCBoYXZlIGl0IGJvdGggd2F5cy5cbiAqXG4gKiBFdmVyeXRoaW5nIGhlcmUgcnVucyBvbiB0aGUgKipOb2RlKiogc2lkZS4gQW4gYGV2YWxJbk9ic2lkaWFuYCBjYWxsYmFjayBpc1xuICogc2VyaWFsaXplZCBpbnRvIHRoZSBkcml2ZW4gT2JzaWRpYW4gYW5kIGNhbiBpbXBvcnQgbm90aGluZywgc28gYSBoZWxwZXJcbiAqIGNhbGxhYmxlIGZyb20gaW5zaWRlIG9uZSBpcyBub3QgZXhwcmVzc2libGU7IGVhY2ggZnVuY3Rpb24gYmVsb3cgaXMgaXRzIG93blxuICogc2hvcnQgZXZhbCBpbnN0ZWFkLlxuICpcbiAqICMjIyBXaHkgcHJlc2VuY2UgaXMgcmVhZCBvZmYgYGFwcC52YXVsdC5jb25maWdgLCBub3QgZnJvbSBgZ2V0Q29uZmlnYFxuICpcbiAqIEJvdGggZmFjdHMgd2VyZSB2ZXJpZmllZCBpbiB0aGUgc2hpcHBlZCAxLjE0LjEgYnVuZGxlIHJhdGhlciB0aGFuIGFzc3VtZWQ6XG4gKlxuICogLSBgVmF1bHQuc2V0Q29uZmlnKGtleSwgdmFsdWUpYCAqKmRlbGV0ZXMqKiB0aGUga2V5IHdoZW4gYHZhbHVlYCBpc1xuICogICBgdW5kZWZpbmVkYCwgYW5kIGRvZXMgbm90aGluZyBhdCBhbGwgd2hlbiB0aGUgdmFsdWUgaXMgdW5jaGFuZ2VkIChubyBzYXZlLFxuICogICBubyBgY29uZmlnLWNoYW5nZWRgIGV2ZW50KS4gU28gYW4gZXhhY3QgcmVzdG9yZSBvZiBhIGtleSB0aGF0IHdhcyBuZXZlclxuICogICB3cml0dGVuIGlzIGV4cHJlc3NpYmxlLlxuICogLSBgVmF1bHQuZ2V0Q29uZmlnKGtleSlgIGZhbGxzIGJhY2sgdG8gT2JzaWRpYW4ncyBkZWZhdWx0cyB0YWJsZSB3aGVuIHRoZSBrZXlcbiAqICAgaXMgYWJzZW50LCBzbyBpdCBjYW5ub3QgdGVsbCAqdW5zZXQqIGZyb20gKnNldCB0byB0aGUgc2hpcHBlZCBkZWZhdWx0KiBcdTIwMTRcbiAqICAgcmVzdG9yaW5nIGZyb20gaXQgd291bGQgbGVhdmUgdGhlIGtleSB3cml0dGVuIHdoZXJlIGl0IGhhZCBub3QgYmVlbi5cbiAqICAgYGFwcC52YXVsdC5jb25maWdgIGhvbGRzIG9ubHkgdGhlIGtleXMgY2hhbmdlZCBmcm9tIHRoZWlyIGRlZmF1bHQsIHNvXG4gKiAgIGBPYmplY3QuaGFzT3duYCBvbiBpdCBpcyB0aGUgc2lnbmFsIGEgcmVzdG9yZSBuZWVkcy5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIChkcml2ZXMgYSBsaXZlIE9ic2lkaWFuIHZpYSBldmFsSW5PYnNpZGlhbikgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRXZhbEluT2JzaWRpYW5QYXJhbXMsXG4gIEdlbmVyaWNPYmplY3Rcbn0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJy4vbm9ybWFsaXplLW9wdGlvbmFsLXByb3BlcnRpZXMubWpzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QXBwQ29uZmlnfSwgYW5kIHRoZSBzaGFyZWQgc2hhcGUgb2YgdGhlIHdyaXRlcnMgYmVsb3cuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwQ29uZmlnUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSB2YXVsdCBjb25maWcga2V5LCBlLmcuIGBzZXR0aW5nc1BvcG91dFdpbmRvd2AuIE5vdCBuYXJyb3dlZCB0b1xuICAgKiBgb2JzaWRpYW4tdHlwaW5nc2AnIGBDb25maWdJdGVtYDogdGhhdCB1bmlvbiBvbWl0cyBrZXlzIE9ic2lkaWFuIHJlYWxseVxuICAgKiByZWFkcywgYHNldHRpbmdzUG9wb3V0V2luZG93YCBhbW9uZyB0aGVtLCB3aGljaCBpcyB0aGUgd2hvbGUgcmVhc29uIGFcbiAgICogY29uc3VtZXIgaGFkIHRvIHdpZGVuIHRoZSBzZXR0ZXIgYnkgaGFuZC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ0tleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgdHJhbnNwb3J0LiBXaGVuIG9taXR0ZWQsIHRoZSB0cmFuc3BvcnQgdGhlIGN1cnJlbnQgdGVzdFxuICAgKiBjb250ZXh0IGlzIGRyaXZpbmcgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydD86IE9ic2lkaWFuVHJhbnNwb3J0O1xuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQgd2hvc2UgT2JzaWRpYW4gaW5zdGFuY2UgdG8gcmVhZCBvciB3cml0ZS4gV2hlbiBvbWl0dGVkLCB0aGVcbiAgICogY3VycmVudCB0ZXN0IGNvbnRleHQncyB2YXVsdCBpcyB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHRQYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQge0BsaW5rIHNldEFwcENvbmZpZ30gY2FwdHVyZWQgYmVmb3JlIGl0IHdyb3RlLCBhbmQgYWxsXG4gKiB7QGxpbmsgcmVzdG9yZUFwcENvbmZpZ30gbmVlZHMgdG8gcHV0IHRoZSBrZXkgYmFjayBleGFjdGx5IGFzIGl0IHdhcyBcdTIwMTRcbiAqIGluY2x1ZGluZyBwdXR0aW5nIGl0IGJhY2sgdG8gKmFic2VudCouXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwQ29uZmlnUmVzdG9yZSB7XG4gIC8qKlxuICAgKiBUaGUga2V5IHRoYXQgd2FzIHdyaXR0ZW4uXG4gICAqL1xuICByZWFkb25seSBjb25maWdLZXk6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgdmF1bHQncyBjb25maWcgY2FycmllZCB0aGUga2V5IGF0IGFsbCBiZWZvcmUgdGhlIHdyaXRlLiBgZmFsc2VgXG4gICAqIG1lYW5zIHRoZSB2YXVsdCB3YXMgcnVubmluZyBvbiBPYnNpZGlhbidzIG93biBkZWZhdWx0LCBhbmQgcmVzdG9yaW5nIGlzIGFcbiAgICogZGVsZXRlIHJhdGhlciB0aGFuIGEgd3JpdGUuXG4gICAqL1xuICByZWFkb25seSBpc1ByZXNlbnQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB0cmFuc3BvcnQgdGhlIGNhcHR1cmUgd2FzIG1hZGUgYWdhaW5zdCwgc28gdGhlIHJlc3RvcmUgbGFuZHMgaW4gdGhlXG4gICAqIHNhbWUgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ/OiBPYnNpZGlhblRyYW5zcG9ydDtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRoZSBrZXkgaGVsZCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB7QGxpbmsgaXNQcmVzZW50fSBpcyBgZmFsc2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd247XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCB0aGUgY2FwdHVyZSB3YXMgbWFkZSBhZ2FpbnN0LCBzbyB0aGUgcmVzdG9yZSBsYW5kcyBpbiB0aGUgc2FtZVxuICAgKiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0UGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc2V0QXBwQ29uZmlnfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXRBcHBDb25maWdQYXJhbXMgZXh0ZW5kcyBBcHBDb25maWdQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHZhbHVlIHRvIHdyaXRlLiBgdW5kZWZpbmVkYCBkZWxldGVzIHRoZSBrZXksIGxlYXZpbmcgT2JzaWRpYW4ncyBvd25cbiAgICogZGVmYXVsdCBpbiBmb3JjZS5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB3aXRoQXBwQ29uZmlnfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBXaGF0IHRoZSB3cmFwcGVkIHdvcmsgcmV0dXJucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaXRoQXBwQ29uZmlnUGFyYW1zPFQ+IGV4dGVuZHMgU2V0QXBwQ29uZmlnUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSB3b3JrIHRvIHJ1biB3aGlsZSB0aGUga2V5IGhvbGRzIHtAbGluayBTZXRBcHBDb25maWdQYXJhbXMudmFsdWV9LlxuICAgKi9cbiAgcmVhZG9ubHkgY2FsbGJhY2s6ICh0aGlzOiB2b2lkKSA9PiBQcm9taXNlPFQ+O1xufVxuXG4vKipcbiAqIFdoYXQgYSB3cml0ZSBjYXB0dXJlZCBhYm91dCB0aGUga2V5J3Mgc3RhdGUgYmVmb3JlIGl0IHdyb3RlLlxuICovXG5pbnRlcmZhY2UgQ2FwdHVyZWRWYWx1ZSB7XG4gIGlzUHJlc2VudDogYm9vbGVhbjtcbiAgdmFsdWU6IHVua25vd247XG59XG5cbi8qKlxuICogVGhlIHNlcmlhbGl6ZWQgcGF5bG9hZCBvZiBhIHJlYWQuXG4gKi9cbmludGVyZmFjZSBSZWFkSW5wdXQgZXh0ZW5kcyBHZW5lcmljT2JqZWN0IHtcbiAgY29uZmlnS2V5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHNlcmlhbGl6ZWQgcGF5bG9hZCBvZiBhIHJlc3RvcmUuXG4gKi9cbmludGVyZmFjZSBSZXN0b3JlSW5wdXQgZXh0ZW5kcyBHZW5lcmljT2JqZWN0IHtcbiAgY29uZmlnS2V5OiBzdHJpbmc7XG4gIGlzUHJlc2VudDogYm9vbGVhbjtcbiAgdmFsdWU6IHVua25vd247XG59XG5cbi8qKlxuICogVGhlIHNlcmlhbGl6ZWQgcGF5bG9hZCBvZiBhIHdyaXRlLlxuICovXG5pbnRlcmZhY2UgV3JpdGVJbnB1dCBleHRlbmRzIEdlbmVyaWNPYmplY3Qge1xuICBjb25maWdLZXk6IHN0cmluZztcbiAgdmFsdWU6IHVua25vd247XG59XG5cbi8qKlxuICogUmVhZHMgYSB2YXVsdCBjb25maWcga2V5LCByZXNvbHZpbmcgdGhlIHRyYW5zcG9ydCBhbmQgdmF1bHQgZnJvbSB0aGUgY3VycmVudFxuICogdGVzdCBjb250ZXh0LlxuICpcbiAqIFRoaXMgaXMgT2JzaWRpYW4ncyBvd24gYFZhdWx0LmdldENvbmZpZ2AsIHNvIGFuIGFic2VudCBrZXkgcmVhZHMgYmFjayBhc1xuICogT2JzaWRpYW4ncyAqKmRlZmF1bHQqKiBmb3IgaXQgcmF0aGVyIHRoYW4gYXMgYHVuZGVmaW5lZGAgXHUyMDE0IHNlZSB0aGlzIGZpbGUnc1xuICogaGVhZGVyLiBVc2Uge0BsaW5rIHNldEFwcENvbmZpZ30ncyB7QGxpbmsgQXBwQ29uZmlnUmVzdG9yZS5pc1ByZXNlbnR9IHdoZW4gdGhlXG4gKiBkaWZmZXJlbmNlIG1hdHRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBrZXkgdG8gcmVhZCwgYW5kIHRyYW5zcG9ydCAvIHZhdWx0IG92ZXJyaWRlcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUga2V5J3MgZWZmZWN0aXZlIHZhbHVlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXBwQ29uZmlnKHBhcmFtczogQXBwQ29uZmlnUGFyYW1zKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IHtcbiAgICBjb25maWdLZXksXG4gICAgdHJhbnNwb3J0LFxuICAgIHZhdWx0UGF0aFxuICB9ID0gcGFyYW1zO1xuXG4gIHJldHVybiBhd2FpdCBldmFsSW5PYnNpZGlhbihub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RXZhbEluT2JzaWRpYW5QYXJhbXM8UmVhZElucHV0LCB1bmtub3duPj4oe1xuICAgIGNhbGxiYWNrKHsgYXBwLCBjb25maWdLZXk6IGtleSB9KTogdW5rbm93biB7XG4gICAgICBjb25zdCBnZXRDb25maWcgPSBhcHAudmF1bHQuZ2V0Q29uZmlnLmJpbmQoYXBwLnZhdWx0KSBhcyAoY29uZmlnS2V5OiBzdHJpbmcpID0+IHVua25vd247XG4gICAgICByZXR1cm4gZ2V0Q29uZmlnKGtleSk7XG4gICAgfSxcbiAgICBpbnB1dDogeyBjb25maWdLZXkgfSxcbiAgICB0cmFuc3BvcnQsXG4gICAgdmF1bHRQYXRoXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBQdXRzIGEga2V5IGJhY2sgZXhhY3RseSBhcyB7QGxpbmsgc2V0QXBwQ29uZmlnfSBmb3VuZCBpdCBcdTIwMTQgd3JpdGluZyB0aGUgY2FwdHVyZWRcbiAqIHZhbHVlIGJhY2ssIG9yICoqZGVsZXRpbmcqKiB0aGUga2V5IHdoZW4gdGhlIHZhdWx0IGhhZCBuZXZlciBjYXJyaWVkIGl0LlxuICpcbiAqIFRoZSBgYmVmb3JlQWxsYCAvIGBhZnRlckFsbGAgaGFsZiBvZiB0aGUgc2VhbS4gQSB0ZXN0IHRoYXQgc2NvcGVzIHRoZSBjaGFuZ2VcbiAqIHRvIG9uZSBjYWxsYmFjayB3YW50cyB7QGxpbmsgd2l0aEFwcENvbmZpZ30gaW5zdGVhZCwgd2hpY2ggY2Fubm90IGZvcmdldCB0aGVcbiAqIHJlc3RvcmUuXG4gKlxuICogQHBhcmFtIHJlc3RvcmUgLSBUaGUgdG9rZW4ge0BsaW5rIHNldEFwcENvbmZpZ30gcmV0dXJuZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGtleSBpcyBiYWNrIGFzIGl0IHdhcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVBcHBDb25maWcocmVzdG9yZTogQXBwQ29uZmlnUmVzdG9yZSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgY29uZmlnS2V5LFxuICAgIGlzUHJlc2VudCxcbiAgICB0cmFuc3BvcnQsXG4gICAgdmFsdWUsXG4gICAgdmF1bHRQYXRoXG4gIH0gPSByZXN0b3JlO1xuXG4gIGF3YWl0IGV2YWxJbk9ic2lkaWFuKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFdmFsSW5PYnNpZGlhblBhcmFtczxSZXN0b3JlSW5wdXQsIHVuZGVmaW5lZD4+KHtcbiAgICBjYWxsYmFjayh7XG4gICAgICBhcHAsXG4gICAgICBjb25maWdLZXk6IGtleSxcbiAgICAgIGlzUHJlc2VudDogd2FzUHJlc2VudCxcbiAgICAgIHZhbHVlOiBwcmV2aW91c1ZhbHVlXG4gICAgfSk6IHVuZGVmaW5lZCB7XG4gICAgICBjb25zdCBzZXRDb25maWcgPSBhcHAudmF1bHQuc2V0Q29uZmlnLmJpbmQoYXBwLnZhdWx0KSBhcyAoY29uZmlnS2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB2b2lkO1xuXG4gICAgICAvLyBgdW5kZWZpbmVkYCBpcyBub3QgYSBuby1vcCBoZXJlOiBgc2V0Q29uZmlnYCBkZWxldGVzIHRoZSBrZXkgZm9yIGl0LFxuICAgICAgLy8gV2hpY2ggaXMgdGhlIG9ubHkgd2F5IHRvIHJlc3RvcmUgb25lIHRoZSB2YXVsdCBuZXZlciBjYXJyaWVkLlxuICAgICAgc2V0Q29uZmlnKGtleSwgd2FzUHJlc2VudCA/IHByZXZpb3VzVmFsdWUgOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgaW5wdXQ6IHtcbiAgICAgIGNvbmZpZ0tleSxcbiAgICAgIGlzUHJlc2VudCxcbiAgICAgIHZhbHVlXG4gICAgfSxcbiAgICB0cmFuc3BvcnQsXG4gICAgdmF1bHRQYXRoXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBXcml0ZXMgYSB2YXVsdCBjb25maWcga2V5LCBjYXB0dXJpbmcgd2hhdCBpdCBoZWxkIGZpcnN0IHNvIHRoZSB3cml0ZSBjYW4gYmVcbiAqIHVuZG9uZSBleGFjdGx5LlxuICpcbiAqIE9ic2lkaWFuIHBlcnNpc3RzIHRoZSBjaGFuZ2UgKGByZXF1ZXN0U2F2ZUNvbmZpZ2ApIGFuZCBmaXJlcyBpdHNcbiAqIGBjb25maWctY2hhbmdlZGAgZXZlbnQsIGJvdGggb2Ygd2hpY2ggdGhlIGFwcCdzIG93biBzZXR0aW5ncyBVSSBkb2VzIHRvbyBcdTIwMTQgc29cbiAqIGFueXRoaW5nIGxpc3RlbmluZyByZWFjdHMgYXMgaXQgd291bGQgdG8gYSB1c2VyIGZsaXBwaW5nIHRoZSB0b2dnbGUuIEEgd3JpdGVcbiAqIG9mIHRoZSB2YWx1ZSB0aGUga2V5IGFscmVhZHkgaG9sZHMgaXMgYSBuby1vcCBpbiBPYnNpZGlhbiBpdHNlbGYsIGFuZCB0aGVcbiAqIHJldHVybmVkIHRva2VuIHN0aWxsIGRlc2NyaWJlcyB0aGUgc3RhdGUgdGhhdCBwcmVjZWRlZCBpdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGtleSwgdGhlIHZhbHVlLCBhbmQgdHJhbnNwb3J0IC8gdmF1bHQgb3ZlcnJpZGVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSB7QGxpbmsgQXBwQ29uZmlnUmVzdG9yZX0gdG9rZW4gdG9cbiAqICAgaGFuZCB7QGxpbmsgcmVzdG9yZUFwcENvbmZpZ30uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRBcHBDb25maWcocGFyYW1zOiBTZXRBcHBDb25maWdQYXJhbXMpOiBQcm9taXNlPEFwcENvbmZpZ1Jlc3RvcmU+IHtcbiAgY29uc3Qge1xuICAgIGNvbmZpZ0tleSxcbiAgICB0cmFuc3BvcnQsXG4gICAgdmFsdWUsXG4gICAgdmF1bHRQYXRoXG4gIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgY2FwdHVyZWQgPSBhd2FpdCBldmFsSW5PYnNpZGlhbihub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RXZhbEluT2JzaWRpYW5QYXJhbXM8V3JpdGVJbnB1dCwgQ2FwdHVyZWRWYWx1ZT4+KHtcbiAgICBjYWxsYmFjayh7XG4gICAgICBhcHAsXG4gICAgICBjb25maWdLZXk6IGtleSxcbiAgICAgIHZhbHVlOiBuZXdWYWx1ZVxuICAgIH0pOiBDYXB0dXJlZFZhbHVlIHtcbiAgICAgIC8vIGBjb25maWdgIGNhcnJpZXMgT05MWSB0aGUga2V5cyBjaGFuZ2VkIGZyb20gdGhlaXIgZGVmYXVsdCwgd2hpY2ggaXMgd2hhdFxuICAgICAgLy8gTWFrZXMgaXQgdGhlIHByZXNlbmNlIHNpZ25hbDsgYGdldENvbmZpZ2Agc3Vic3RpdHV0ZXMgdGhlIGRlZmF1bHQgYW5kIHNvXG4gICAgICAvLyBDYW5ub3QgdGVsbCBhbiB1bnNldCBrZXkgZnJvbSBvbmUgc2V0IHRvIHRoYXQgZGVmYXVsdC4gVGhlIHZhbHVlIGl0c2VsZlxuICAgICAgLy8gU3RpbGwgY29tZXMgZnJvbSBgZ2V0Q29uZmlnYCwgd2hpY2ggcmV0dXJucyB0aGUgc3RvcmVkIG9uZSB3aGVuZXZlclxuICAgICAgLy8gVGhlcmUgaXMgb25lIFx1MjAxNCBzbyB0aGUgcmVhZCBuZWVkcyBubyBjYXN0IG9mIHRoZSBjb25maWcgb2JqZWN0LlxuICAgICAgY29uc3QgaXNQcmVzZW50ID0gT2JqZWN0Lmhhc093bihhcHAudmF1bHQuY29uZmlnLCBrZXkpO1xuXG4gICAgICBjb25zdCBnZXRDb25maWcgPSBhcHAudmF1bHQuZ2V0Q29uZmlnLmJpbmQoYXBwLnZhdWx0KSBhcyAoY29uZmlnS2V5OiBzdHJpbmcpID0+IHVua25vd247XG4gICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gaXNQcmVzZW50ID8gZ2V0Q29uZmlnKGtleSkgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IHNldENvbmZpZyA9IGFwcC52YXVsdC5zZXRDb25maWcuYmluZChhcHAudmF1bHQpIGFzIChjb25maWdLZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IHZvaWQ7XG4gICAgICBzZXRDb25maWcoa2V5LCBuZXdWYWx1ZSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzUHJlc2VudCxcbiAgICAgICAgdmFsdWU6IHByZXZpb3VzVmFsdWVcbiAgICAgIH07XG4gICAgfSxcbiAgICBpbnB1dDoge1xuICAgICAgY29uZmlnS2V5LFxuICAgICAgdmFsdWVcbiAgICB9LFxuICAgIHRyYW5zcG9ydCxcbiAgICB2YXVsdFBhdGhcbiAgfSkpO1xuXG4gIHJldHVybiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8QXBwQ29uZmlnUmVzdG9yZT4oe1xuICAgIGNvbmZpZ0tleSxcbiAgICBpc1ByZXNlbnQ6IGNhcHR1cmVkLmlzUHJlc2VudCxcbiAgICB0cmFuc3BvcnQsXG4gICAgdmFsdWU6IGNhcHR1cmVkLnZhbHVlLFxuICAgIHZhdWx0UGF0aFxuICB9KTtcbn1cblxuLyoqXG4gKiBSdW5zIHdvcmsgd2l0aCBhIHZhdWx0IGNvbmZpZyBrZXkgdGVtcG9yYXJpbHkgc2V0LCBhbmQgcHV0cyB0aGUga2V5IGJhY2tcbiAqIGFmdGVyd2FyZHMgXHUyMDE0IG9uIGEgdGhyb3cgYXMgbXVjaCBhcyBvbiBhIHJldHVybi5cbiAqXG4gKiBUaGUgc2hhcGUgYSBwb3BvdXQtc3ViamVjdCB0ZXN0IHdhbnRzOlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCB3aXRoQXBwQ29uZmlnKHtcbiAqICAgYXN5bmMgY2FsbGJhY2soKSB7XG4gKiAgICAgYXdhaXQgZXZhbEluT2JzaWRpYW4oeyAuLi4gfSk7IC8vIHRoZSBzZXR0aW5ncyB3aW5kb3cgaXMgYSBwb3BvdXQgaW4gaGVyZVxuICogICB9LFxuICogICBjb25maWdLZXk6ICdzZXR0aW5nc1BvcG91dFdpbmRvdycsXG4gKiAgIHZhbHVlOiB0cnVlLFxuICogICB2YXVsdFBhdGhcbiAqIH0pO1xuICogYGBgXG4gKlxuICogVGhlIGNhbGxiYWNrIHJ1bnMgb24gdGhlICoqTm9kZSoqIHNpZGUsIHNvIGl0IGlzIGZyZWUgdG8gbWFrZSBzZXZlcmFsIGV2YWxzLFxuICogdGFrZSBhIHNjcmVlbnNob3QsIG9yIGFzc2VydCBiZXR3ZWVuIHRoZW0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gV2hhdCB0aGUgd3JhcHBlZCB3b3JrIHJldHVybnMuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGtleSwgdGhlIHZhbHVlIHRvIGhvbGQgaXQgYXQsIHRoZSB3b3JrLCBhbmQgdHJhbnNwb3J0IC9cbiAqICAgdmF1bHQgb3ZlcnJpZGVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHdoYXRldmVyIHRoZSBjYWxsYmFjayByZXR1cm5lZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhBcHBDb25maWc8VD4ocGFyYW1zOiBXaXRoQXBwQ29uZmlnUGFyYW1zPFQ+KTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHtcbiAgICBjYWxsYmFjayxcbiAgICBjb25maWdLZXksXG4gICAgdHJhbnNwb3J0LFxuICAgIHZhbHVlLFxuICAgIHZhdWx0UGF0aFxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHJlc3RvcmUgPSBhd2FpdCBzZXRBcHBDb25maWcobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNldEFwcENvbmZpZ1BhcmFtcz4oe1xuICAgIGNvbmZpZ0tleSxcbiAgICB0cmFuc3BvcnQsXG4gICAgdmFsdWUsXG4gICAgdmF1bHRQYXRoXG4gIH0pKTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHJlc3RvcmVBcHBDb25maWcocmVzdG9yZSk7XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQTBEQSxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLG1DQUFtQztBQWtJNUMsZUFBc0IsYUFBYSxRQUEyQztBQUM1RSxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBRUosU0FBTyxNQUFNLGVBQWUsNEJBQXNFO0FBQUEsSUFDaEcsU0FBUyxFQUFFLEtBQUssV0FBVyxJQUFJLEdBQVk7QUFDekMsWUFBTSxZQUFZLElBQUksTUFBTSxVQUFVLEtBQUssSUFBSSxLQUFLO0FBQ3BELGFBQU8sVUFBVSxHQUFHO0FBQUEsSUFDdEI7QUFBQSxJQUNBLE9BQU8sRUFBRSxVQUFVO0FBQUEsSUFDbkI7QUFBQSxJQUNBO0FBQUEsRUFDRixDQUFDLENBQUM7QUFDSjtBQWFBLGVBQXNCLGlCQUFpQixTQUEwQztBQUMvRSxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFFSixRQUFNLGVBQWUsNEJBQTJFO0FBQUEsSUFDOUYsU0FBUztBQUFBLE1BQ1A7QUFBQSxNQUNBLFdBQVc7QUFBQSxNQUNYLFdBQVc7QUFBQSxNQUNYLE9BQU87QUFBQSxJQUNULEdBQWM7QUFDWixZQUFNLFlBQVksSUFBSSxNQUFNLFVBQVUsS0FBSyxJQUFJLEtBQUs7QUFJcEQsZ0JBQVUsS0FBSyxhQUFhLGdCQUFnQixNQUFTO0FBQUEsSUFDdkQ7QUFBQSxJQUNBLE9BQU87QUFBQSxNQUNMO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUMsQ0FBQztBQUNKO0FBZ0JBLGVBQXNCLGFBQWEsUUFBdUQ7QUFDeEYsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFFSixRQUFNLFdBQVcsTUFBTSxlQUFlLDRCQUE2RTtBQUFBLElBQ2pILFNBQVM7QUFBQSxNQUNQO0FBQUEsTUFDQSxXQUFXO0FBQUEsTUFDWCxPQUFPO0FBQUEsSUFDVCxHQUFrQjtBQU1oQixZQUFNLFlBQVksT0FBTyxPQUFPLElBQUksTUFBTSxRQUFRLEdBQUc7QUFFckQsWUFBTSxZQUFZLElBQUksTUFBTSxVQUFVLEtBQUssSUFBSSxLQUFLO0FBQ3BELFlBQU0sZ0JBQWdCLFlBQVksVUFBVSxHQUFHLElBQUk7QUFFbkQsWUFBTSxZQUFZLElBQUksTUFBTSxVQUFVLEtBQUssSUFBSSxLQUFLO0FBQ3BELGdCQUFVLEtBQUssUUFBUTtBQUV2QixhQUFPO0FBQUEsUUFDTDtBQUFBLFFBQ0EsT0FBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBQUEsSUFDQSxPQUFPO0FBQUEsTUFDTDtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUMsQ0FBQztBQUVGLFNBQU8sNEJBQThDO0FBQUEsSUFDbkQ7QUFBQSxJQUNBLFdBQVcsU0FBUztBQUFBLElBQ3BCO0FBQUEsSUFDQSxPQUFPLFNBQVM7QUFBQSxJQUNoQjtBQUFBLEVBQ0YsQ0FBQztBQUNIO0FBMkJBLGVBQXNCLGNBQWlCLFFBQTRDO0FBQ2pGLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUVKLFFBQU0sVUFBVSxNQUFNLGFBQWEsNEJBQWdEO0FBQUEsSUFDakY7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUMsQ0FBQztBQUVGLE1BQUk7QUFDRixXQUFPLE1BQU0sU0FBUztBQUFBLEVBQ3hCLFVBQUU7QUFDQSxVQUFNLGlCQUFpQixPQUFPO0FBQUEsRUFDaEM7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -29,6 +29,26 @@ export declare const DEFAULT_SESSION_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS =
|
|
|
29
29
|
* @returns The timeout in milliseconds.
|
|
30
30
|
*/
|
|
31
31
|
export declare function resolveAppiumStartTimeoutInMilliseconds(options: ObsidianAndroidAppiumTransportOptions): number;
|
|
32
|
+
/**
|
|
33
|
+
* Resolves the per-script (per-`evalInObsidian`) timeout, applying the default
|
|
34
|
+
* when the option is omitted.
|
|
35
|
+
*
|
|
36
|
+
* This is what `AppiumTransport.evaluate` enforces on the Node side; it is also
|
|
37
|
+
* sent as the W3C `timeouts.script` capability, which was measured to be
|
|
38
|
+
* accepted and never acted on. It is deliberately NOT the knob to reach for when
|
|
39
|
+
* a closure times out: the closure is what should get shorter, with the waiting
|
|
40
|
+
* moved to Node via `pollInObsidian`.
|
|
41
|
+
*
|
|
42
|
+
* The default is {@link DEFAULT_EVAL_CAP_IN_MILLISECONDS}, the shared per-eval
|
|
43
|
+
* cap, rather than an Android-specific number: the protocol default WebDriver
|
|
44
|
+
* would nominally apply was measured not to be applied at all on this driver, so
|
|
45
|
+
* this is the only number that actually bounds an Android eval — which makes it
|
|
46
|
+
* the same policy the desktop transport enforces, not a coincidence.
|
|
47
|
+
*
|
|
48
|
+
* @param options - The Android Appium transport options.
|
|
49
|
+
* @returns The timeout in milliseconds.
|
|
50
|
+
*/
|
|
51
|
+
export declare function resolveScriptTimeoutInMilliseconds(options: ObsidianAndroidAppiumTransportOptions): number;
|
|
32
52
|
/**
|
|
33
53
|
* Resolves the Appium session connection retry timeout, applying the default
|
|
34
54
|
* when the option is omitted.
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
import { DEFAULT_EVAL_CAP_IN_MILLISECONDS } from "./eval-cap.mjs";
|
|
1
2
|
const DEFAULT_APPIUM_START_TIMEOUT_IN_MILLISECONDS = 18e4;
|
|
2
3
|
const DEFAULT_SESSION_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS = 18e4;
|
|
3
4
|
function resolveAppiumStartTimeoutInMilliseconds(options) {
|
|
4
5
|
return options.appiumStartTimeoutInMilliseconds ?? DEFAULT_APPIUM_START_TIMEOUT_IN_MILLISECONDS;
|
|
5
6
|
}
|
|
7
|
+
function resolveScriptTimeoutInMilliseconds(options) {
|
|
8
|
+
return options.scriptTimeoutInMilliseconds ?? DEFAULT_EVAL_CAP_IN_MILLISECONDS;
|
|
9
|
+
}
|
|
6
10
|
function resolveSessionConnectionRetryTimeoutInMilliseconds(options) {
|
|
7
11
|
return options.sessionConnectionRetryTimeoutInMilliseconds ?? DEFAULT_SESSION_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS;
|
|
8
12
|
}
|
|
@@ -10,6 +14,7 @@ export {
|
|
|
10
14
|
DEFAULT_APPIUM_START_TIMEOUT_IN_MILLISECONDS,
|
|
11
15
|
DEFAULT_SESSION_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS,
|
|
12
16
|
resolveAppiumStartTimeoutInMilliseconds,
|
|
17
|
+
resolveScriptTimeoutInMilliseconds,
|
|
13
18
|
resolveSessionConnectionRetryTimeoutInMilliseconds
|
|
14
19
|
};
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FwcGl1bS1zZXNzaW9uLWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlc29sdmVzIHR1bmFibGUgQXBwaXVtIHNlcnZlci1zdGFydCBhbmQgc2Vzc2lvbi1lc3RhYmxpc2htZW50IHRpbWVvdXRzIGZyb21cbiAqIHRoZSB0cmFuc3BvcnQgb3B0aW9ucywgYXBwbHlpbmcgZGVmYXVsdHMuIEtlcHQgc2VwYXJhdGUgZnJvbSB0aGVcbiAqIGludGVncmF0aW9uLW9ubHkgYHRyYW5zcG9ydC1mYWN0b3J5YCBzbyB0aGUgZGVmYXVsdCByZXNvbHV0aW9uIHN0YXlzXG4gKiB1bml0LXRlc3RhYmxlICh0aGUgZmFjdG9yeSBpdHNlbGYgbmVlZHMgYSByZWFsIEFwcGl1bSBzZXJ2ZXIgYW5kIGlzIGV4Y2x1ZGVkXG4gKiBmcm9tIHVuaXQgdGVzdHMpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcblxuaW1wb3J0IHsgREVGQVVMVF9FVkFMX0NBUF9JTl9NSUxMSVNFQ09ORFMgfSBmcm9tICcuL2V2YWwtY2FwLm1qcyc7XG5cbi8qKlxuICogRGVmYXVsdCBmb3Ige0BsaW5rIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMuYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHN9LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxODBfMDAwO1xuXG4vKipcbiAqIERlZmF1bHQgZm9yIHtAbGluayBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLnNlc3Npb25Db25uZWN0aW9uUmV0cnlUaW1lb3V0SW5NaWxsaXNlY29uZHN9LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVNTSU9OX0NPTk5FQ1RJT05fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxODBfMDAwO1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciByZWFkaW5lc3MgdGltZW91dCwgYXBwbHlpbmcgdGhlXG4gKiBkZWZhdWx0IHdoZW4gdGhlIG9wdGlvbiBpcyBvbWl0dGVkLlxuICpcbiAqIFRoaXMgZ292ZXJucyBob3cgbG9uZyB0aGUgZmFjdG9yeSBwb2xscyB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXInc1xuICogYC9zdGF0dXNgIGVuZHBvaW50IGJlZm9yZSBnaXZpbmcgdXAuIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgaGFybmVzc1xuICogYXV0by1zdGFydHMgdGhlIHNlcnZlcjsgd2hlbiBhdHRhY2hpbmcgdG8gYW4gYWxyZWFkeS1ydW5uaW5nIHNlcnZlciB0aGUgd2FpdFxuICogaXMgc2tpcHBlZCBlbnRpcmVseS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBBbmRyb2lkIEFwcGl1bSB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyhcbiAgb3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuKTogbnVtYmVyIHtcbiAgcmV0dXJuIG9wdGlvbnMuYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9BUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHBlci1zY3JpcHQgKHBlci1gZXZhbEluT2JzaWRpYW5gKSB0aW1lb3V0LCBhcHBseWluZyB0aGUgZGVmYXVsdFxuICogd2hlbiB0aGUgb3B0aW9uIGlzIG9taXR0ZWQuXG4gKlxuICogVGhpcyBpcyB3aGF0IGBBcHBpdW1UcmFuc3BvcnQuZXZhbHVhdGVgIGVuZm9yY2VzIG9uIHRoZSBOb2RlIHNpZGU7IGl0IGlzIGFsc29cbiAqIHNlbnQgYXMgdGhlIFczQyBgdGltZW91dHMuc2NyaXB0YCBjYXBhYmlsaXR5LCB3aGljaCB3YXMgbWVhc3VyZWQgdG8gYmVcbiAqIGFjY2VwdGVkIGFuZCBuZXZlciBhY3RlZCBvbi4gSXQgaXMgZGVsaWJlcmF0ZWx5IE5PVCB0aGUga25vYiB0byByZWFjaCBmb3Igd2hlblxuICogYSBjbG9zdXJlIHRpbWVzIG91dDogdGhlIGNsb3N1cmUgaXMgd2hhdCBzaG91bGQgZ2V0IHNob3J0ZXIsIHdpdGggdGhlIHdhaXRpbmdcbiAqIG1vdmVkIHRvIE5vZGUgdmlhIGBwb2xsSW5PYnNpZGlhbmAuXG4gKlxuICogVGhlIGRlZmF1bHQgaXMge0BsaW5rIERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTfSwgdGhlIHNoYXJlZCBwZXItZXZhbFxuICogY2FwLCByYXRoZXIgdGhhbiBhbiBBbmRyb2lkLXNwZWNpZmljIG51bWJlcjogdGhlIHByb3RvY29sIGRlZmF1bHQgV2ViRHJpdmVyXG4gKiB3b3VsZCBub21pbmFsbHkgYXBwbHkgd2FzIG1lYXN1cmVkIG5vdCB0byBiZSBhcHBsaWVkIGF0IGFsbCBvbiB0aGlzIGRyaXZlciwgc29cbiAqIHRoaXMgaXMgdGhlIG9ubHkgbnVtYmVyIHRoYXQgYWN0dWFsbHkgYm91bmRzIGFuIEFuZHJvaWQgZXZhbCBcdTIwMTQgd2hpY2ggbWFrZXMgaXRcbiAqIHRoZSBzYW1lIHBvbGljeSB0aGUgZGVza3RvcCB0cmFuc3BvcnQgZW5mb3JjZXMsIG5vdCBhIGNvaW5jaWRlbmNlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIEFuZHJvaWQgQXBwaXVtIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyhcbiAgb3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuKTogbnVtYmVyIHtcbiAgcmV0dXJuIG9wdGlvbnMuc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBBcHBpdW0gc2Vzc2lvbiBjb25uZWN0aW9uIHJldHJ5IHRpbWVvdXQsIGFwcGx5aW5nIHRoZSBkZWZhdWx0XG4gKiB3aGVuIHRoZSBvcHRpb24gaXMgb21pdHRlZC5cbiAqXG4gKiBUaGlzIGdvdmVybnMgaG93IGxvbmcgV2ViRHJpdmVySU8ncyBgcmVtb3RlKClgIHdhaXRzIGZvciB0aGUgc2Vzc2lvbiB0byBiZVxuICogZXN0YWJsaXNoZWQgKFVpQXV0b21hdG9yMiBzZXJ2ZXIgaW5zdGFsbCArIGFwcCBsYXVuY2gpIFx1MjAxNCBlbXBpcmljYWxseSB0aGVcbiAqIGxhcmdlc3QgYW5kIG1vc3QgbG9hZC1zZW5zaXRpdmUgc3RlcCBvZiB0aGUgQW5kcm9pZCBzZXR1cCwgc28gaXQgaXMgdGhlIGtub2JcbiAqIHRvIHJhaXNlIHdoZW4gc2Vzc2lvbiBlc3RhYmxpc2htZW50IHRpbWVzIG91dCBvbiBhIGNvbGQgb3IgY29udGVuZGVkIGVtdWxhdG9yLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIEFuZHJvaWQgQXBwaXVtIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNlc3Npb25Db25uZWN0aW9uUmV0cnlUaW1lb3V0SW5NaWxsaXNlY29uZHMoXG4gIG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnNcbik6IG51bWJlciB7XG4gIHJldHVybiBvcHRpb25zLnNlc3Npb25Db25uZWN0aW9uUmV0cnlUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9TRVNTSU9OX0NPTk5FQ1RJT05fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFZQSxTQUFTLHdDQUF3QztBQUsxQyxNQUFNLCtDQUErQztBQUtyRCxNQUFNLDJEQUEyRDtBQWNqRSxTQUFTLHdDQUNkLFNBQ1E7QUFDUixTQUFPLFFBQVEsb0NBQW9DO0FBQ3JEO0FBcUJPLFNBQVMsbUNBQ2QsU0FDUTtBQUNSLFNBQU8sUUFBUSwrQkFBK0I7QUFDaEQ7QUFjTyxTQUFTLG1EQUNkLFNBQ1E7QUFDUixTQUFPLFFBQVEsK0NBQStDO0FBQ2hFOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* The distinct error the desktop CDP transport raises when a single CDP command
|
|
5
|
+
* gets no response within `commandTimeoutInMilliseconds`.
|
|
6
|
+
*
|
|
7
|
+
* It exists as a type rather than a bare `Error` so ONE caller can tell it apart:
|
|
8
|
+
* `evaluate()`, which is the only `Runtime.evaluate` carrying a test's own
|
|
9
|
+
* closure, re-reports it as `EvalCapExceededError`. The harness's other
|
|
10
|
+
* `Runtime.evaluate` calls — the trust dialog, the parent-liveness watchdog, the
|
|
11
|
+
* boot probes — time out for reasons that have nothing to do with a test waiting
|
|
12
|
+
* too long, and matching them on the method name would produce exactly the
|
|
13
|
+
* misdiagnosis this work removes, pointing the other way.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Parameters for the {@link CdpCommandTimeoutError} constructor.
|
|
17
|
+
*/
|
|
18
|
+
export interface CdpCommandTimeoutErrorConstructorParams {
|
|
19
|
+
/**
|
|
20
|
+
The CDP method that got no response, e.g. `'Runtime.evaluate'`.
|
|
21
|
+
*/
|
|
22
|
+
readonly method: string;
|
|
23
|
+
/**
|
|
24
|
+
The per-command budget that elapsed, in milliseconds.
|
|
25
|
+
*/
|
|
26
|
+
readonly timeoutInMilliseconds: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Thrown when a CDP command gets no response within the transport's per-command
|
|
30
|
+
* timeout. Carries the method and the budget so a caller can `instanceof`-match
|
|
31
|
+
* and re-report it in its own terms.
|
|
32
|
+
*/
|
|
33
|
+
export declare class CdpCommandTimeoutError extends Error {
|
|
34
|
+
/**
|
|
35
|
+
The CDP method that got no response.
|
|
36
|
+
*/
|
|
37
|
+
readonly method: string;
|
|
38
|
+
/**
|
|
39
|
+
The per-command budget that elapsed, in milliseconds.
|
|
40
|
+
*/
|
|
41
|
+
readonly timeoutInMilliseconds: number;
|
|
42
|
+
/**
|
|
43
|
+
* Creates the error from the method and the elapsed budget.
|
|
44
|
+
*
|
|
45
|
+
* @param params - The CDP method and the per-command timeout.
|
|
46
|
+
*/
|
|
47
|
+
constructor(params: CdpCommandTimeoutErrorConstructorParams);
|
|
48
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
class CdpCommandTimeoutError extends Error {
|
|
2
|
+
/**
|
|
3
|
+
The CDP method that got no response.
|
|
4
|
+
*/
|
|
5
|
+
method;
|
|
6
|
+
/**
|
|
7
|
+
The per-command budget that elapsed, in milliseconds.
|
|
8
|
+
*/
|
|
9
|
+
timeoutInMilliseconds;
|
|
10
|
+
/**
|
|
11
|
+
* Creates the error from the method and the elapsed budget.
|
|
12
|
+
*
|
|
13
|
+
* @param params - The CDP method and the per-command timeout.
|
|
14
|
+
*/
|
|
15
|
+
constructor(params) {
|
|
16
|
+
const { method, timeoutInMilliseconds } = params;
|
|
17
|
+
super(`CDP command timed out after ${String(timeoutInMilliseconds)}ms: ${method}`);
|
|
18
|
+
this.name = "CdpCommandTimeoutError";
|
|
19
|
+
this.method = method;
|
|
20
|
+
this.timeoutInMilliseconds = timeoutInMilliseconds;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
CdpCommandTimeoutError
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NkcC1jb21tYW5kLXRpbWVvdXQtZXJyb3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgZGlzdGluY3QgZXJyb3IgdGhlIGRlc2t0b3AgQ0RQIHRyYW5zcG9ydCByYWlzZXMgd2hlbiBhIHNpbmdsZSBDRFAgY29tbWFuZFxuICogZ2V0cyBubyByZXNwb25zZSB3aXRoaW4gYGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHNgLlxuICpcbiAqIEl0IGV4aXN0cyBhcyBhIHR5cGUgcmF0aGVyIHRoYW4gYSBiYXJlIGBFcnJvcmAgc28gT05FIGNhbGxlciBjYW4gdGVsbCBpdCBhcGFydDpcbiAqIGBldmFsdWF0ZSgpYCwgd2hpY2ggaXMgdGhlIG9ubHkgYFJ1bnRpbWUuZXZhbHVhdGVgIGNhcnJ5aW5nIGEgdGVzdCdzIG93blxuICogY2xvc3VyZSwgcmUtcmVwb3J0cyBpdCBhcyBgRXZhbENhcEV4Y2VlZGVkRXJyb3JgLiBUaGUgaGFybmVzcydzIG90aGVyXG4gKiBgUnVudGltZS5ldmFsdWF0ZWAgY2FsbHMgXHUyMDE0IHRoZSB0cnVzdCBkaWFsb2csIHRoZSBwYXJlbnQtbGl2ZW5lc3Mgd2F0Y2hkb2csIHRoZVxuICogYm9vdCBwcm9iZXMgXHUyMDE0IHRpbWUgb3V0IGZvciByZWFzb25zIHRoYXQgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggYSB0ZXN0IHdhaXRpbmdcbiAqIHRvbyBsb25nLCBhbmQgbWF0Y2hpbmcgdGhlbSBvbiB0aGUgbWV0aG9kIG5hbWUgd291bGQgcHJvZHVjZSBleGFjdGx5IHRoZVxuICogbWlzZGlhZ25vc2lzIHRoaXMgd29yayByZW1vdmVzLCBwb2ludGluZyB0aGUgb3RoZXIgd2F5LlxuICovXG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBDZHBDb21tYW5kVGltZW91dEVycm9yfSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZHBDb21tYW5kVGltZW91dEVycm9yQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgVGhlIENEUCBtZXRob2QgdGhhdCBnb3Qgbm8gcmVzcG9uc2UsIGUuZy4gYCdSdW50aW1lLmV2YWx1YXRlJ2AuXG4gICAqL1xuICByZWFkb25seSBtZXRob2Q6IHN0cmluZztcblxuICAvKipcbiAgVGhlIHBlci1jb21tYW5kIGJ1ZGdldCB0aGF0IGVsYXBzZWQsIGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgQ0RQIGNvbW1hbmQgZ2V0cyBubyByZXNwb25zZSB3aXRoaW4gdGhlIHRyYW5zcG9ydCdzIHBlci1jb21tYW5kXG4gKiB0aW1lb3V0LiBDYXJyaWVzIHRoZSBtZXRob2QgYW5kIHRoZSBidWRnZXQgc28gYSBjYWxsZXIgY2FuIGBpbnN0YW5jZW9mYC1tYXRjaFxuICogYW5kIHJlLXJlcG9ydCBpdCBpbiBpdHMgb3duIHRlcm1zLlxuICovXG5leHBvcnQgY2xhc3MgQ2RwQ29tbWFuZFRpbWVvdXRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gIFRoZSBDRFAgbWV0aG9kIHRoYXQgZ290IG5vIHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1ldGhvZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgcGVyLWNvbW1hbmQgYnVkZ2V0IHRoYXQgZWxhcHNlZCwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBlcnJvciBmcm9tIHRoZSBtZXRob2QgYW5kIHRoZSBlbGFwc2VkIGJ1ZGdldC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBDRFAgbWV0aG9kIGFuZCB0aGUgcGVyLWNvbW1hbmQgdGltZW91dC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IENkcENvbW1hbmRUaW1lb3V0RXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIGNvbnN0IHsgbWV0aG9kLCB0aW1lb3V0SW5NaWxsaXNlY29uZHMgfSA9IHBhcmFtcztcbiAgICBzdXBlcihgQ0RQIGNvbW1hbmQgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXM6ICR7bWV0aG9kfWApO1xuICAgIHRoaXMubmFtZSA9ICdDZHBDb21tYW5kVGltZW91dEVycm9yJztcbiAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgICB0aGlzLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IHRpbWVvdXRJbk1pbGxpc2Vjb25kcztcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBbUNPLE1BQU0sK0JBQStCLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUloQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVCxZQUFZLFFBQWlEO0FBQ2xFLFVBQU0sRUFBRSxRQUFRLHNCQUFzQixJQUFJO0FBQzFDLFVBQU0sK0JBQStCLE9BQU8scUJBQXFCLENBQUMsT0FBTyxNQUFNLEVBQUU7QUFDakYsU0FBSyxPQUFPO0FBQ1osU0FBSyxTQUFTO0FBQ2QsU0FBSyx3QkFBd0I7QUFBQSxFQUMvQjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -117,6 +117,11 @@ export interface ConnectToCdpOptions {
|
|
|
117
117
|
/**
|
|
118
118
|
* Timeout in milliseconds for individual CDP commands.
|
|
119
119
|
*
|
|
120
|
+
* A test's closure travels as one `Runtime.evaluate` command, so this is also
|
|
121
|
+
* the desktop per-eval cap. The default is `DEFAULT_EVAL_CAP_IN_MILLISECONDS`,
|
|
122
|
+
* exported from the package root — import it rather than restating the number,
|
|
123
|
+
* so a closure sized against the cap follows it if it ever moves.
|
|
124
|
+
*
|
|
120
125
|
* @default `30000`
|
|
121
126
|
*/
|
|
122
127
|
readonly commandTimeoutInMilliseconds?: number;
|
|
@@ -112,4 +112,4 @@ async function sweepLeftovers(transportOptions) {
|
|
|
112
112
|
export {
|
|
113
113
|
connectToCdp
|
|
114
114
|
};
|
|
115
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Nvbm5lY3QtdG8tY2RwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHJvZ3JhbW1hdGljIGhlbHBlciB0byBsYXVuY2ggKG9yIGF0dGFjaCB0bykgYSBDRFAtZW5hYmxlZCBPYnNpZGlhbiBpbnN0YW5jZVxuICogd2l0aCB0aGUgcnVudGltZSBoZWxwZXIgbmFtZXNwYWNlIGJvb3RzdHJhcHBlZCwgZm9yIGFkLWhvYyByZWFsLWFwcCBkZWJ1Z2dpbmcuXG4gKlxuICogQSBzaW5nbGUge0BsaW5rIGNvbm5lY3RUb0NkcH0gY2FsbCByZXNvbHZlcyB0aGUgb3duZWQtaW5zdGFuY2UgY29uZmlnLCBvcGVucyBhXG4gKiB2YXVsdCwgYW5kIGJvb3RzdHJhcHMgYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCAoc28gYGV2YWxXcmFwcGVyYCxcbiAqIHRoZSBiYXNlIGBsaWJgIGhlbHBlcnMsIGBlcnJvclRvU3RyaW5nYCwgYGdldE9ic2lkaWFuTW9kdWxlYCwgXHUyMDI2IGFyZSBhdmFpbGFibGUpLCB0aGVuXG4gKiBoYW5kcyBiYWNrIGEgZGlzcG9zYWJsZSB7QGxpbmsgQ2RwQ29ubmVjdGlvbn0gZXhwb3NpbmcgdGhlIGNob3NlbiBDRFAgcG9ydCwgYVxuICogcmF3IHtAbGluayBDZHBDb25uZWN0aW9uLmludm9rZX0gYW5kIHRoZSByaWNoIHtAbGluayBDZHBDb25uZWN0aW9uLmV2YWxJbk9ic2lkaWFufS5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIChsYXVuY2hlcyBPYnNpZGlhbiAvIENEUCkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgRXhjZXB0IH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBBc2FyRmFsbGJhY2sgfSBmcm9tICcuL2FzYXItZmFsbGJhY2stZGV0ZWN0aW9uLm1qcyc7XG5pbXBvcnQgdHlwZSB7IENhcHR1cmVTY3JlZW5zaG90UGFyYW1zIH0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QubWpzJztcbmltcG9ydCB0eXBlIHsgQ29udGV4dElkIH0gZnJvbSAnLi9jb250ZXh0LWlkLm1qcyc7XG5pbXBvcnQgdHlwZSB7IEVsZWN0cm9uQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBFdmFsSW5PYnNpZGlhblBhcmFtcyxcbiAgR2VuZXJpY09iamVjdFxufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB0eXBlIHsgSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkubWpzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtb3B0aW9ucy5tanMnO1xuXG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHsgZW5zdXJlSGVhZGxlc3NWYXVsdENvbmZpZyB9IGZyb20gJy4vaGVhZGxlc3MtdmF1bHQtY29uZmlnLm1qcyc7XG5pbXBvcnQge1xuICByZXNvbHZlTGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcyxcbiAgc3dlZXBIb3N0TGVmdG92ZXJzLFxuICB3aWxsU3dlZXBMZWZ0b3ZlcnNcbn0gZnJvbSAnLi9sZWZ0b3Zlci1jbGVhbnVwLm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi9ub3JtYWxpemUtb3B0aW9uYWwtcHJvcGVydGllcy5tanMnO1xuaW1wb3J0IHsgVGVtcG9yYXJ5VmF1bHQgfSBmcm9tICcuL3RlbXBvcmFyeS12YXVsdC5tanMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQgeyBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LWZhY3RvcnkubWpzJztcbmltcG9ydCB7IHJlc29sdmVPd25lZENvbmZpZ0RpcmVjdG9yeSB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcblxuY29uc3QgREVGQVVMVF9DRFBfSE9TVCA9ICdsb2NhbGhvc3QnO1xuXG4vKipcbiAqIEEgbGl2ZSBjb25uZWN0aW9uIHRvIGEgQ0RQLWVuYWJsZWQgT2JzaWRpYW4gaW5zdGFuY2Ugd2l0aCB0aGUgcnVudGltZSBoZWxwZXJcbiAqIG5hbWVzcGFjZSBib290c3RyYXBwZWQuXG4gKlxuICogSW1wbGVtZW50cyBgQXN5bmNEaXNwb3NhYmxlYCwgc28gYGF3YWl0IHVzaW5nIGNvbm4gPSBhd2FpdCBjb25uZWN0VG9DZHAoXHUyMDI2KWBcbiAqIGRpc3Bvc2VzIGl0IChraWxsaW5nIGFuIG93bmVkIGluc3RhbmNlIGFuZCBcdTIwMTQgZm9yIGEgdGhyb3ctYXdheSB0ZW1wIHZhdWx0IFx1MjAxNFxuICogcmVtb3ZpbmcgaXRzIGRpcmVjdG9yeSkgYXV0b21hdGljYWxseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZHBDb25uZWN0aW9uIGV4dGVuZHMgQXN5bmNEaXNwb3NhYmxlIHtcbiAgLyoqXG4gICAqIFRoZSBzaWxlbnQtYXNhci1mYWxsYmFjayB2ZXJkaWN0IGZvciBhbiBvd25lZCBpbnN0YW5jZSwgcmVhZCBsaXZlIGFmdGVyIGJvb3Q6XG4gICAqIHdoZXRoZXIgdGhlIGFwcCB2ZXJzaW9uIGl0IGlzIGFjdHVhbGx5IHJ1bm5pbmcgbWF0Y2hlcyB0aGUgc3dhcHBlZC1pbiBwaW4sIG9yXG4gICAqIHRoZSBpbnN0YWxsZXIgc2lsZW50bHkgcmV2ZXJ0ZWQgdG8gaXRzIG93biBidW5kbGVkIGFzYXIuIGB1bmRlZmluZWRgIGluIGF0dGFjaFxuICAgKiBtb2RlLCB3aGVuIG5vIGFzYXIgd2FzIHN3YXBwZWQsIG9yIHdoZW4gdGhlIHJ1bm5pbmcgdmVyc2lvbiB3YXMgdW5yZWFkYWJsZS4gQVxuICAgKiBgJ2ZhbGxiYWNrJ2AgdmVyZGljdCByZWFjaGVzIGhlcmUgb25seSB3aGVuIHRoZSB0aHJvdyBpcyBkaXNhYmxlZFxuICAgKiAoe0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnMuc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFja30gYGZhbHNlYCk7XG4gICAqIG90aGVyd2lzZSBpdCB0aHJvd3MgYFNpbGVudEFzYXJGYWxsYmFja0Vycm9yYCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gaXMgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFzYXJGYWxsYmFjaz86IEFzYXJGYWxsYmFjayB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ2FwdHVyZXMgYSBQTkcgc2NyZWVuc2hvdCBvZiB0aGlzIGNvbm5lY3Rpb24ncyBPYnNpZGlhbiB3aW5kb3csIHdpdGggdGhlXG4gICAqIHZhdWx0IHBhdGggcHJlLWJvdW5kLlxuICAgKlxuICAgKiBQYXNzIGB3aWR0aEluUGl4ZWxzYCArIGBoZWlnaHRJblBpeGVsc2AgdG8gcGluIHRoZSB2aWV3cG9ydCBmb3IgdGhlIGR1cmF0aW9uXG4gICAqIG9mIHRoZSBjYXB0dXJlLCBzbyB0aGUgZW1pdHRlZCBQTkcgaXMgZXhhY3RseSB0aGF0IHNpemUgd2hhdGV2ZXIgc2l6ZSB0aGVcbiAgICogd2luZG93IGhhcHBlbnMgdG8gYmUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZXhhY3Qgc2l6ZSB0byBjYXB0dXJlIGF0LiBPbWl0IHRvIGNhcHR1cmUgdGhlIHdpbmRvdyBhdCBpdHMgbmF0dXJhbCBzaXplLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByYXcgUE5HIGJ5dGVzLlxuICAgKi9cbiAgY2FwdHVyZVNjcmVlbnNob3QocGFyYW1zPzogRXhjZXB0PENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLCAnY3dkJz4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+O1xuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBDRFAgVVJMLCBlLmcuIGBodHRwOi8vbG9jYWxob3N0OjUxODg4YC5cbiAgICovXG4gIHJlYWRvbmx5IGNkcFVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgdmVyZGljdCBmb3IgYW4gb3duZWQgaW5zdGFuY2UsIHdoZW5cbiAgICogaXQgY291bGQgYmUgZGV0ZXJtaW5lZC4gYHVuZGVmaW5lZGAgaW4gYXR0YWNoIG1vZGUsIG9yIHdoZW4gdGhlIHZlcmRpY3QgaXNcbiAgICogdW5rbm93biAodW5kZXRlY3RhYmxlIHNoZWxsIHZlcnNpb24sIG9yIHRoZSBhcHAgdmVyc2lvbiBpcyBhYnNlbnQgZnJvbSB0aGVcbiAgICogdGFibGUpLiBBbiBgJ3VucnVubmFibGUnYCB2ZXJkaWN0IHJlYWNoZXMgaGVyZSBvbmx5IHdoZW4gdGhlIHByb2FjdGl2ZSB0aHJvd1xuICAgKiBpcyBkaXNhYmxlZCAoe0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnMuc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcn1cbiAgICogYGZhbHNlYCk7IG90aGVyd2lzZSBpdCB0aHJvd3MgYEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcmAgYmVmb3JlIHRoZVxuICAgKiBjb25uZWN0aW9uIGlzIGNyZWF0ZWQuXG4gICAqL1xuICByZWFkb25seSBjb21wYXRpYmlsaXR5PzogSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRGlzcG9zZXMgdGhlIGNvbm5lY3Rpb246IGtpbGxzIGFuIG93bmVkIGluc3RhbmNlIGFuZCByZW1vdmVzIGl0cyBpc29sYXRlZFxuICAgKiB1c2VyLWRhdGEgZGlyLiBUaGUgdmF1bHQgZGlyZWN0b3J5IGlzIHJlbW92ZWQgb25seSB3aGVuIGl0IGlzIGEgdGhyb3ctYXdheVxuICAgKiB0ZW1wIHZhdWx0IChzZWUge0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnMuc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2V9KTsgYVxuICAgKiByZWFsIHZhdWx0IHBhc3NlZCB2aWEge0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnMudmF1bHR9IGlzIG5ldmVyIGRlbGV0ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSBkaXNwb3NhbCBjb21wbGV0ZXMuXG4gICAqL1xuICBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSBydW50aW1lIEVsZWN0cm9uIGNvbXBhdGliaWxpdHkgdmVyZGljdCBmb3IgYW4gb3duZWQgaW5zdGFuY2UsIHJlYWQgbGl2ZVxuICAgKiBhZnRlciBib290OiB3aGV0aGVyIHRoZSBFbGVjdHJvbiB2ZXJzaW9uIGl0IGlzIGFjdHVhbGx5IHJ1bm5pbmcgaXMgbmV3IGVub3VnaFxuICAgKiBmb3IgdGhlIHJ1bm5pbmcgYXBwIHZlcnNpb24uIGB1bmRlZmluZWRgIGluIGF0dGFjaCBtb2RlLCBvciB3aGVuIHRoZSB2ZXJkaWN0XG4gICAqIGlzIHVua25vd24gKHRoZSBsaXZlIHZlcnNpb24gd2FzIHVucmVhZGFibGUsIG9yIHRoZSBhcHAgdmVyc2lvbiBjYXJyaWVzIG5vXG4gICAqIHJlY29tbWVuZGVkIEVsZWN0cm9uIHZlcnNpb24pLiBBbiBvbGQgRWxlY3Ryb24gbmV2ZXIgYmxvY2tzIFx1MjAxNCBpdCBvbmx5IHdhcm5zIFx1MjAxNFxuICAgKiBzbyB1bmxpa2Uge0BsaW5rIGNvbXBhdGliaWxpdHl9IHRoZXJlIGlzIG5vIHRocm93aW5nIHRpZXIuXG4gICAqL1xuICByZWFkb25seSBlbGVjdHJvbkNvbXBhdGliaWxpdHk/OiBFbGVjdHJvbkNvbXBhdGliaWxpdHkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIHNlbGYtY29udGFpbmVkIGZ1bmN0aW9uIGluc2lkZSBPYnNpZGlhbiB2aWEgdGhlIHJpY2ggaGVscGVyXG4gICAqIHBhdGgsIHJlY2VpdmluZyBgeyBhcHAsIGxpYiwgb2JzaWRpYW5Nb2R1bGUsIGNvbnRleHQgfWAgcGx1cyBhbnkgYGlucHV0YFxuICAgKiAoc2hhcmVkIGhlbHBlcnMgbGlrZSBgdHlwZUludG9FZGl0b3JgIC8gYHdhaXRVbnRpbGAgbGl2ZSBvbiBgbGliYCkuIE1pcnJvcnNcbiAgICogdGhlIHRvcC1sZXZlbCBgZXZhbEluT2JzaWRpYW5gLCB3aXRoIHRoZSB0cmFuc3BvcnQgYW5kIHZhdWx0IHBhdGggcHJlLWJvdW5kXG4gICAqIHRvIHRoaXMgY29ubmVjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBldmFsdWF0aW9uIHBhcmFtZXRlcnMgKGBjYWxsYmFja2AsIG9wdGlvbmFsIGBpbnB1dGAvYGNvbnRleHRJZGApLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgYGNhbGxiYWNrYC5cbiAgICovXG4gIGV2YWxJbk9ic2lkaWFuPElucHV0IGV4dGVuZHMgR2VuZXJpY09iamVjdCwgUmVzdWx0LCBUQ29udGV4dElkIGV4dGVuZHMgQ29udGV4dElkPHVua25vd24+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPihcbiAgICBwYXJhbXM6IEV4Y2VwdDxFdmFsSW5PYnNpZGlhblBhcmFtczxJbnB1dCwgUmVzdWx0LCBUQ29udGV4dElkPiwgJ3RyYW5zcG9ydCcgfCAndmF1bHRQYXRoJz5cbiAgKTogUHJvbWlzZTxSZXN1bHQ+O1xuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSByYXcgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiBhbmQgcmV0dXJucyB0aGVcbiAgICogbm9ybWFsaXplZCBzdHJpbmcgcmVzdWx0IChlLmcuIGAnNSdgLCBhIEpTT04gc3RyaW5nLCBvciBgJyhubyBvdXRwdXQpJ2ApLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIEEgc2VsZi1jb250YWluZWQgSmF2YVNjcmlwdCBleHByZXNzaW9uLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByYXcgcmVzdWx0IHN0cmluZy5cbiAgICovXG4gIGludm9rZShleHByZXNzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFRoZSBDRFAgcG9ydCB0aGUgaW5zdGFuY2UgaXMgcmVhY2hhYmxlIG9uICh0aGUgZnJlZSBwb3J0IGNob3NlbiBmb3IgYW5cbiAgICogb3duZWQgaW5zdGFuY2UsIG9yIHRoZSBhdHRhY2hlZCB7QGxpbmsgQ29ubmVjdFRvQ2RwT3B0aW9ucy5wb3J0fSkuXG4gICAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBvcGVuZWQgdmF1bHQuIEV4cG9zZXMgYHBhdGhgIGFuZCBgcG9wdWxhdGUoLi4uKWAgZm9yIHNlZWRpbmcgZmlsZXMuXG4gICAqL1xuICByZWFkb25seSB2YXVsdDogVGVtcG9yYXJ5VmF1bHQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNvbm5lY3RUb0NkcH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdFRvQ2RwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgaW5kaXZpZHVhbCBDRFAgY29tbWFuZHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAzMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCdzICoqY29uZmlnIGZvbGRlcioqIFx1MjAxNCBPYnNpZGlhbidzIHBlci12YXVsdCAqT3ZlcnJpZGUgY29uZmlnXG4gICAqIGZvbGRlciogc2V0dGluZywgZS5nLiBgJy5vYnNpZGlhbi1kZXNrdG9wJ2AuIFNldCBpdCB0byBvcGVuIGEgdmF1bHQgdGhhdFxuICAgKiBrZWVwcyBpdHMgc2V0dGluZ3Mgc29tZXdoZXJlIG90aGVyIHRoYW4gYC5vYnNpZGlhbmA7IHdpdGhvdXQgaXQgc3VjaCBhIHZhdWx0XG4gICAqIG9wZW5zIGFnYWluc3QgYC5vYnNpZGlhbmAsIHdoaWNoIGZvciBhIHZhdWx0IHRoYXQgaGFzIGEgc3RhbGUgb25lIGJlc2lkZSB0aGVcbiAgICogcmVhbCBmb2xkZXIgbWVhbnMgb3BlbmluZyBzdWNjZXNzZnVsbHkgYWdhaW5zdCB0aGUgd3Jvbmcgc2V0dGluZ3MuXG4gICAqXG4gICAqIE11c3Qgc3RhcnQgd2l0aCBhIGRvdCwgbXVzdCBub3QgYmUgdGhlIGJhcmUgZG90LCBhbmQgbXVzdCBub3QgY29udGFpbiBhIHBhdGhcbiAgICogc2VwYXJhdG9yIFx1MjAxNCBhbnl0aGluZyBlbHNlIHRocm93cyBiZWZvcmUgT2JzaWRpYW4gbGF1bmNoZXMsIHNpbmNlIE9ic2lkaWFuXG4gICAqIHdvdWxkIHNpbGVudGx5IHN1YnN0aXR1dGUgYC5vYnNpZGlhbmAuIEFmdGVyIHRoZSB2YXVsdCBvcGVucywgaXRzIGFjdHVhbFxuICAgKiBgYXBwLnZhdWx0LmNvbmZpZ0RpcmAgaXMgcmVhZCBiYWNrIGFuZCBhIG1pc21hdGNoIHRocm93c1xuICAgKiBgQ29uZmlnRGlyZWN0b3J5RmFsbGJhY2tFcnJvcmAuXG4gICAqXG4gICAqIElnbm9yZWQgaW4gYXR0YWNoIG1vZGUgKHtAbGluayBDb25uZWN0VG9DZHBPcHRpb25zLnBvcnR9IHNldCksIHdoZXJlIHRoZVxuICAgKiB2YXVsdCBpcyBvcGVuZWQgYnkgdGhlIHVzZXIncyBvd24gT2JzaWRpYW4gdW5kZXIgaXRzIG93biBjb25maWcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgIChPYnNpZGlhbidzIG93biBkZWZhdWx0LCBgLm9ic2lkaWFuYClcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ0RpcmVjdG9yeT86IHN0cmluZztcblxuICAvKipcbiAgICogR3JhY2Ugd2luZG93IGluIG1pbGxpc2Vjb25kcyBmb3IgZmFzdC1mYWlsaW5nIGEgZGVhZCBib290IG9mIHRoZSBvd25lZFxuICAgKiBpbnN0YW5jZSBcdTIwMTQgdGhlIHJlbmRlcmVyIGxvYWRlZCBidXQgdGhlIGFwcCBuZXZlciBib290c3RyYXBwZWQgKGVtcHR5XG4gICAqIGA8Ym9keT5gLCBubyBgd2luZG93LmFwcGApLCB0aGUgdGVybWluYWwgc3RhdGUgd2hlbiB0aGUgYXNhciBjYW5ub3QgcnVuIG9uXG4gICAqIHRoZSBsYXVuY2hlZCBFbGVjdHJvbiBzaGVsbC4gT25jZSBpdCBoYXMgaGVsZCB0aGlzIGxvbmcgYVxuICAgKiBgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvcmAgaXMgdGhyb3duIGluc3RlYWQgb2Ygd2FpdGluZyBvdXQgdGhlIGZ1bGxcbiAgICogcmVhZGluZXNzIHRpbWVvdXQuIElnbm9yZWQgaW4gYXR0YWNoIG1vZGUgKHtAbGluayBwb3J0fSBzZXQpLiBTZXQgYDBgIHRvXG4gICAqIGRpc2FibGUgZmFzdC1mYWlsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTAwMDBgXG4gICAqL1xuICByZWFkb25seSBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENEUCBob3N0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ2xvY2FsaG9zdCdgXG4gICAqL1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBPYnNpZGlhbiB3aW5kb3cgaXMgc2hvd24gb24gc2NyZWVuLiBEZWZhdWx0cyB0byBgdHJ1ZWA7IHNldFxuICAgKiBgZmFsc2VgIHRvIGxhdW5jaCBpdCBvZmYtc2NyZWVuLlxuICAgKiBJZ25vcmVkIGluIGF0dGFjaCBtb2RlICh7QGxpbmsgcG9ydH0gc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc09ic2lkaWFuQXBwVmlzaWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBpbnMgdGhlIEVsZWN0cm9uIHNoZWxsIChpbnN0YWxsZXIgYnVpbGQpIHRoZSBvd25lZCBpbnN0YW5jZSBydW5zLiBBY2NlcHRzXG4gICAqIGAneC55LnonYCwgYCdwdWJsaWMtbGF0ZXN0J2AsIG9yIGAnY2F0YWx5c3QtbGF0ZXN0J2AuIElnbm9yZWQgd2hlblxuICAgKiB7QGxpbmsgcG9ydH0gKGF0dGFjaCBtb2RlKSBpcyBzZXQuIFdoZW4gb21pdHRlZCwgdGhlIGluc3RhbGxlZCBzaGVsbCBpcyB1c2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQaW5zIHRoZSBPYnNpZGlhbiBhcHAgdmVyc2lvbiAoYXNhcikgdGhlIG93bmVkIGluc3RhbmNlIHJ1bnMuIEFjY2VwdHNcbiAgICogYCd4LnkueidgLCBgJ3B1YmxpYy1sYXRlc3QnYCwgb3IgYCdjYXRhbHlzdC1sYXRlc3QnYC4gSWdub3JlZCB3aGVuXG4gICAqIHtAbGluayBwb3J0fSAoYXR0YWNoIG1vZGUpIGlzIHNldC4gV2hlbiBvbWl0dGVkLCB0aGUgaW5zdGFsbGVkIHZlcnNpb24gaXMgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9ic2lkaWFuVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQ0RQIHBvcnQgb2YgYW4gYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuIHRvICoqYXR0YWNoKiogdG8uIFdoZW4gb21pdHRlZCwgYW5cbiAgICogaXNvbGF0ZWQgaW5zdGFuY2UgaXMgbGF1bmNoZWQgb24gYW4gYXV0b21hdGljYWxseSBjaG9zZW4gZnJlZSBwb3J0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBsYXVuY2ggdGhlIG93bmVkIGluc3RhbmNlIHdpdGggQ2hyb21pdW0ncyBzYW5kYm94IGRpc2FibGVkXG4gICAqIChgLS1uby1zYW5kYm94YCkuXG4gICAqXG4gICAqIE5lZWRlZCB0byBib290IG9uIExpbnV4IHdpdGhvdXQgYSBjb3JyZWN0bHktY29uZmlndXJlZCBzZXR1aWRcbiAgICogYGNocm9tZS1zYW5kYm94YCBoZWxwZXIgKGUuZy4gYW4gaW5zdGFsbGVyLWV4dHJhY3RlZCBwb3J0YWJsZSBzaGVsbCwgb3IgQ0lcbiAgICogcnVubmluZyBhcyBhIG5vbi1yb290IHVzZXIpOyBoYXJtbGVzcyBvbiBXaW5kb3dzL21hY09TLiBJZ25vcmVkIGluIGF0dGFjaFxuICAgKiBtb2RlICh7QGxpbmsgcG9ydH0gc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRGlzYWJsZVNhbmRib3g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbW92ZSB0aGUgdmF1bHQgZGlyZWN0b3J5IG9uIHtAbGluayBDZHBDb25uZWN0aW9uLmRpc3Bvc2V9LlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGRlZmF1bHRzIHRvIGB0cnVlYCBmb3IgYW4gaW1wbGljaXQgdGhyb3ctYXdheSB0ZW1wIHZhdWx0XG4gICAqICh7QGxpbmsgdmF1bHR9IG5vdCBnaXZlbikgYW5kIGBmYWxzZWAgd2hlbiBhIHtAbGluayB2YXVsdH0gcGF0aCBpcyBnaXZlbiwgc29cbiAgICogYSByZWFsIHZhdWx0IGlzIG5ldmVyIGRlbGV0ZWQuIFNldCBleHBsaWNpdGx5IHRvIG92ZXJyaWRlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFuICoqdW5ydW5uYWJsZSoqIGluc3RhbGxlclx1MjE5NGFwcCB2ZXJzaW9uIHBhaXIgZmFpbHMgZmFzdCBiZWZvcmUgbGF1bmNoLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCBhbiBpbnN0YWxsZXIgYmVsb3cgdGhlIGFwcCdzIHJ1biBmbG9vciB0aHJvd3NcbiAgICogYEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcmAgZnJvbSB2ZXJzaW9uIHJlc29sdXRpb24gYmVmb3JlIGFueXRoaW5nIGlzXG4gICAqIGRvd25sb2FkZWQgb3IgbGF1bmNoZWQuIFNldCBgZmFsc2VgIHRvIGxldCB0aGUgcGluIHByb2NlZWQgdG8gbGF1bmNoIFx1MjAxNCB3aGVyZVxuICAgKiB0aGUgcmVhY3RpdmUgZGVhZC1ib290IGZhc3QtZmFpbCBzdGlsbCBjYXRjaGVzIHRoZSBibGFjay1zY3JlZW4gYm9vdCwgYW5kIHRoZVxuICAgKiBgJ3VucnVubmFibGUnYCB2ZXJkaWN0IGlzIHN1cmZhY2VkIG9uIHtAbGluayBDZHBDb25uZWN0aW9uLmNvbXBhdGliaWxpdHl9XG4gICAqIHJhdGhlciB0aGFuIHRocm93bi4gSWdub3JlZCBpbiBhdHRhY2ggbW9kZSAoe0BsaW5rIHBvcnR9IHNldCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBwb3N0LWJvb3QgKipzaWxlbnQgYXNhciBmYWxsYmFjayoqIGZhaWxzIGZhc3QuXG4gICAqXG4gICAqIFdoZW4gYW4gYXNhciBpcyBzd2FwcGVkIG9udG8gYW4gaW5zdGFsbGVyIHNoZWxsIHRvbyBvbGQgZm9yIGl0LCB0aGUgaW5zdGFuY2VcbiAgICogbWF5IHNpbGVudGx5IHJldmVydCB0byB0aGUgaW5zdGFsbGVyJ3Mgb3duIGJ1bmRsZWQgYXNhciBhbmQgcnVuIHRoZSAqKndyb25nXG4gICAqIChvbGRlcikqKiB2ZXJzaW9uIGJlaGluZCBhIGhlYWx0aHkgVUkuIFdoZW4gYHRydWVgICh0aGUgZGVmYXVsdCksIHRoZSBydW5uaW5nXG4gICAqIGFwcCB2ZXJzaW9uIGlzIHZlcmlmaWVkIGFnYWluc3QgdGhlIHBpbiBwb3N0LWJvb3QgYW5kIGEgbWlzbWF0Y2ggdGhyb3dzXG4gICAqIGBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcmAuIFNldCBgZmFsc2VgIHRvIGxldCB0aGUgYm9vdCBwcm9jZWVkIFx1MjAxNCB0aGUgbWlzbWF0Y2hcbiAgICogaXMgdGhlbiBzdXJmYWNlZCBvbiB7QGxpbmsgQ2RwQ29ubmVjdGlvbi5hc2FyRmFsbGJhY2t9IHJhdGhlciB0aGFuIHRocm93bi5cbiAgICogSWdub3JlZCBpbiBhdHRhY2ggbW9kZSAoe0BsaW5rIHBvcnR9IHNldCkgYW5kIHdoZW4gbm8gYXNhciBpcyBzd2FwcGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2s/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvd25lZC1pbnN0YW5jZSBjb21wYXRpYmlsaXR5ICoqbmFnIHdhcm5pbmdzKiogYXJlIGVtaXR0ZWQuXG4gICAqXG4gICAqIENvdmVycyBib3RoIHRoZSBvZmZsaW5lIGluc3RhbGxlclx1MjE5NGFwcCB3YXJuaW5nIGFuZCB0aGUgcG9zdC1ib290XG4gICAqIHJ1bnRpbWUtRWxlY3Ryb24gd2FybmluZy4gV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSBlYWNoIGZpcmVzIHZpYSB0aGUgaGFybmVzc1xuICAgKiBsb2c7IHNldCBgZmFsc2VgIHRvIHNpbGVuY2UgYm90aCBcdTIwMTQgdGhlIHZlcmRpY3RzIGFyZSBzdGlsbCBzdXJmYWNlZCBvblxuICAgKiB7QGxpbmsgQ2RwQ29ubmVjdGlvbi5jb21wYXRpYmlsaXR5fSAvIHtAbGluayBDZHBDb25uZWN0aW9uLmVsZWN0cm9uQ29tcGF0aWJpbGl0eX0sXG4gICAqIG9ubHkgdGhlIGxvZyBpcyBzdXBwcmVzc2VkLiBJZ25vcmVkIGluIGF0dGFjaCBtb2RlICh7QGxpbmsgcG9ydH0gc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byBhbiBleGlzdGluZyB2YXVsdCB0byBvcGVuLiBXaGVuIG9taXR0ZWQsIGFuIGVtcHR5IHRlbXBvcmFyeVxuICAgKiB2YXVsdCBpcyBjcmVhdGVkIChhbmQgcmVtb3ZlZCBvbiBkaXNwb3NlIHVubGVzc1xuICAgKiB7QGxpbmsgc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2V9IHNheXMgb3RoZXJ3aXNlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcmVzb2x2ZWQgQ0RQIGhvc3QvcG9ydCBwYWlyLlxuICovXG5pbnRlcmZhY2UgUmVzb2x2ZWRFbmRwb2ludCB7XG4gIGhvc3Q6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xufVxuXG4vKipcbiAqIExhdW5jaGVzIChvciBhdHRhY2hlcyB0bykgYSBDRFAtZW5hYmxlZCBPYnNpZGlhbiBpbnN0YW5jZSwgb3BlbnMgYSB2YXVsdCwgYW5kXG4gKiBib290c3RyYXBzIHRoZSBydW50aW1lIGhlbHBlciBuYW1lc3BhY2UsIHJldHVybmluZyBhIGRpc3Bvc2FibGUgY29ubmVjdGlvbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbm5lY3Rpb24gb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGxpdmUge0BsaW5rIENkcENvbm5lY3Rpb259LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29ubmVjdFRvQ2RwKG9wdGlvbnM/OiBDb25uZWN0VG9DZHBPcHRpb25zKTogUHJvbWlzZTxDZHBDb25uZWN0aW9uPiB7XG4gIGNvbnN0IHRyYW5zcG9ydE9wdGlvbnMgPSBidWlsZENkcFRyYW5zcG9ydE9wdGlvbnMob3B0aW9ucyk7XG4gIGF3YWl0IHN3ZWVwTGVmdG92ZXJzKHRyYW5zcG9ydE9wdGlvbnMpO1xuICBjb25zdCB0cmFuc3BvcnQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyh0cmFuc3BvcnRPcHRpb25zKTtcbiAgY29uc3Qgc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2UgPSBvcHRpb25zPy5zaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZSA/PyAob3B0aW9ucz8udmF1bHQgPT09IHVuZGVmaW5lZCk7XG4gIGNvbnN0IHZhdWx0ID0gbmV3IFRlbXBvcmFyeVZhdWx0KG9wdGlvbnM/LnZhdWx0LCB7IHNob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZTogc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2UgfSk7XG5cbiAgLy8gVGhlIGhlYWRsZXNzIGRlZmF1bHRzIGdvIG9ubHkgaW50byBhIHZhdWx0IHRoZSBoYXJuZXNzIG1hZGUgXHUyMDE0IHRoZSBzYW1lXG4gIC8vIGBvcHRpb25zLnZhdWx0ID09PSB1bmRlZmluZWRgIGRpc2NyaW1pbmF0b3IgdGhlIGRpc3Bvc2FsIGFib3ZlIHR1cm5zIG9uLiBBXG4gIC8vIENhbGxlci1zdXBwbGllZCB2YXVsdCBpcyBhIHJlYWwgb25lIHRoZSB1c2VyIGtlZXBzLCBhbmQgYSBkZWJ1Z2dpbmcgc2Vzc2lvblxuICAvLyBIYXMgbm8gYnVzaW5lc3MgcmV3cml0aW5nIGl0cyBzZXR0aW5ncy5cbiAgaWYgKG9wdGlvbnM/LnZhdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICBhd2FpdCBlbnN1cmVIZWFkbGVzc1ZhdWx0Q29uZmlnKHtcbiAgICAgIGNvbmZpZ0RpcmVjdG9yeTogcmVzb2x2ZU93bmVkQ29uZmlnRGlyZWN0b3J5KHRyYW5zcG9ydE9wdGlvbnMpLFxuICAgICAgbGFiZWw6IHRyYW5zcG9ydE9wdGlvbnMudHlwZSxcbiAgICAgIHZhdWx0UGF0aDogdmF1bHQucGF0aFxuICAgIH0pO1xuICB9XG5cbiAgLy8gUmVnaXN0ZXJpbmcgdGhlIHZhdWx0IGlzIHdoYXQgbGF1bmNoZXMgdGhlIG93bmVkIGluc3RhbmNlIChwcm92aXNpb25zIHRoZVxuICAvLyBBc2FyLCBvcGVucyB0aGUgdmF1bHQsIGFuZCBib290c3RyYXBzIHRoZSBoZWxwZXIgbmFtZXNwYWNlKSwgb3Igb3BlbnMgdGhlXG4gIC8vIFZhdWx0IGluIHRoZSBhdHRhY2hlZCBpbnN0YW5jZS5cbiAgYXdhaXQgdmF1bHQucmVnaXN0ZXIodHJhbnNwb3J0KTtcblxuICBjb25zdCB7IGhvc3QsIHBvcnQgfSA9IHJlc29sdmVFbmRwb2ludCh0cmFuc3BvcnQsIG9wdGlvbnMpO1xuICBjb25zdCBjZHBVcmwgPSBgaHR0cDovLyR7aG9zdH06JHtTdHJpbmcocG9ydCl9YDtcbiAgY29uc3QgYXNhckZhbGxiYWNrID0gdHJhbnNwb3J0IGluc3RhbmNlb2YgRGVza3RvcENkcFRyYW5zcG9ydCA/IHRyYW5zcG9ydC5nZXRBc2FyRmFsbGJhY2soKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY29tcGF0aWJpbGl0eSA9IHRyYW5zcG9ydCBpbnN0YW5jZW9mIERlc2t0b3BDZHBUcmFuc3BvcnQgPyB0cmFuc3BvcnQuZ2V0Q29tcGF0aWJpbGl0eSgpIDogdW5kZWZpbmVkO1xuICBjb25zdCBlbGVjdHJvbkNvbXBhdGliaWxpdHkgPSB0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0ID8gdHJhbnNwb3J0LmdldEVsZWN0cm9uQ29tcGF0aWJpbGl0eSgpIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGNvbm5lY3Rpb246IENkcENvbm5lY3Rpb24gPSB7XG4gICAgY2RwVXJsLFxuICAgIC4uLihhc2FyRmFsbGJhY2sgJiYgeyBhc2FyRmFsbGJhY2sgfSksXG4gICAgLi4uKGNvbXBhdGliaWxpdHkgJiYgeyBjb21wYXRpYmlsaXR5IH0pLFxuICAgIC4uLihlbGVjdHJvbkNvbXBhdGliaWxpdHkgJiYgeyBlbGVjdHJvbkNvbXBhdGliaWxpdHkgfSksXG5cbiAgICBhc3luYyBjYXB0dXJlU2NyZWVuc2hvdChwYXJhbXM/OiBFeGNlcHQ8Q2FwdHVyZVNjcmVlbnNob3RQYXJhbXMsICdjd2QnPik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgICAgLy8gRXZlcnkgdHJhbnNwb3J0IGBjb25uZWN0VG9DZHBgIGJ1aWxkcyBpcyBhIERlc2t0b3BDZHBUcmFuc3BvcnQsIHdoaWNoXG4gICAgICAvLyBJbXBsZW1lbnRzIHRoZSBvcHRpb25hbCBtZXRob2QgXHUyMDE0IGJ1dCB0aGUgaW50ZXJmYWNlIHN0aWxsIHR5cGVzIGl0XG4gICAgICAvLyBPcHRpb25hbCwgc28gdGhlIGFic2VuY2UgaXMgcmVwb3J0ZWQgcmF0aGVyIHRoYW4gc2lsZW50bHkgdGhyb3duIGF0LlxuICAgICAgaWYgKCF0cmFuc3BvcnQuY2FwdHVyZVNjcmVlbnNob3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb25uZWN0VG9DZHA6IHRoaXMgdHJhbnNwb3J0IGNhbm5vdCBjYXB0dXJlIHNjcmVlbnNob3RzLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJhbnNwb3J0LmNhcHR1cmVTY3JlZW5zaG90KHsgLi4ucGFyYW1zLCBjd2Q6IHZhdWx0LnBhdGggfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGUgdmF1bHQgY2FycmllcyBgc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2VgIGl0c2VsZiAoaGFuZGVkIHRvIGl0cyBjb25zdHJ1Y3RvciBhYm92ZSksIHNvXG4gICAgICAgIC8vIFRoaXMgaXMgb25lIGNhbGwgcmF0aGVyIHRoYW4gYSBicmFuY2g6IGl0IGFsd2F5cyB1bnJlZ2lzdGVycywgYW5kIHJlbW92ZXMgdGhlIGRpcmVjdG9yeSBvbmx5XG4gICAgICAgIC8vIFdoZW4gdGhhdCBmbGFnIHNheXMgdG8uXG4gICAgICAgIGF3YWl0IHZhdWx0LmRpc3Bvc2UodHJhbnNwb3J0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHRyYW5zcG9ydC5kaXNwb3NlPy4oKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZXZhbEluT2JzaWRpYW48SW5wdXQgZXh0ZW5kcyBHZW5lcmljT2JqZWN0LCBSZXN1bHQsIFRDb250ZXh0SWQgZXh0ZW5kcyBDb250ZXh0SWQ8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+KFxuICAgICAgcGFyYW1zOiBFeGNlcHQ8RXZhbEluT2JzaWRpYW5QYXJhbXM8SW5wdXQsIFJlc3VsdCwgVENvbnRleHRJZD4sICd0cmFuc3BvcnQnIHwgJ3ZhdWx0UGF0aCc+XG4gICAgKTogUHJvbWlzZTxSZXN1bHQ+IHtcbiAgICAgIHJldHVybiBldmFsSW5PYnNpZGlhbjxJbnB1dCwgUmVzdWx0LCBUQ29udGV4dElkPih7IC4uLnBhcmFtcywgdHJhbnNwb3J0LCB2YXVsdFBhdGg6IHZhdWx0LnBhdGggfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGludm9rZShleHByZXNzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgcmV0dXJuIHRyYW5zcG9ydC5ldmFsdWF0ZShleHByZXNzaW9uLCB7IGN3ZDogdmF1bHQucGF0aCB9KTtcbiAgICB9LFxuXG4gICAgcG9ydCxcblxuICAgIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uZGlzcG9zZSgpO1xuICAgIH0sXG5cbiAgICB2YXVsdFxuICB9O1xuXG4gIHJldHVybiBjb25uZWN0aW9uO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUge0BsaW5rIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9uc30gZm9yIGEgY29ubmVjdGlvbiwgdGhyZWFkaW5nIG9ubHlcbiAqIHRoZSBwcm92aWRlZCB7QGxpbmsgQ29ubmVjdFRvQ2RwT3B0aW9uc30gdGhyb3VnaCAob3duZWQtdmlzaWJsZSBkZWZhdWx0cyB0b1xuICogYHRydWVgLCB1bmxpa2UgdGhlIGhpZGRlbi1ieS1kZWZhdWx0IHRlc3QgdHJhbnNwb3J0cykuIFVuc2V0IGtub2JzIHBhc3MgdGhyb3VnaFxuICogYXMgYHVuZGVmaW5lZGAgYW5kIGFyZSByZWFkIHdpdGggYD8/IGRlZmF1bHRgIC8gYCE9PSB1bmRlZmluZWRgIGd1YXJkc1xuICogZG93bnN0cmVhbSwgc28gYW4gZXhwbGljaXQgYHVuZGVmaW5lZGAgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiBhYnNlbnQga2V5LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGNvbm5lY3Rpb24gb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSB0cmFuc3BvcnQgb3B0aW9ucyB0byBjcmVhdGUgdGhlIGNvbm5lY3Rpb24ncyB0cmFuc3BvcnQgZnJvbS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRDZHBUcmFuc3BvcnRPcHRpb25zKG9wdGlvbnM/OiBDb25uZWN0VG9DZHBPcHRpb25zKTogT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnM+KHtcbiAgICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zPy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgIGNvbmZpZ0RpcmVjdG9yeTogb3B0aW9ucz8uY29uZmlnRGlyZWN0b3J5LFxuICAgIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kczogb3B0aW9ucz8uZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzLFxuICAgIGhvc3Q6IG9wdGlvbnM/Lmhvc3QsXG4gICAgaXNPYnNpZGlhbkFwcFZpc2libGU6IG9wdGlvbnM/LmlzT2JzaWRpYW5BcHBWaXNpYmxlID8/IHRydWUsXG4gICAgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uOiBvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24sXG4gICAgb2JzaWRpYW5WZXJzaW9uOiBvcHRpb25zPy5vYnNpZGlhblZlcnNpb24sXG4gICAgcG9ydDogb3B0aW9ucz8ucG9ydCxcbiAgICBzaG91bGREaXNhYmxlU2FuZGJveDogb3B0aW9ucz8uc2hvdWxkRGlzYWJsZVNhbmRib3gsXG4gICAgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcjogb3B0aW9ucz8uc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcixcbiAgICBzaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrOiBvcHRpb25zPy5zaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrLFxuICAgIHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXM6IG9wdGlvbnM/LnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMsXG4gICAgdHlwZTogJ29ic2lkaWFuLWNkcCdcbiAgfSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIENEUCBob3N0L3BvcnQgZm9yIHRoZSBjb25uZWN0aW9uOiBmcm9tIHRoZSBvd25lZCBpbnN0YW5jZSdzXG4gKiBsYXVuY2hlZCBlbmRwb2ludCB3aGVuIHByZXNlbnQsIG90aGVyd2lzZSBmcm9tIHRoZSBhdHRhY2ggb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCBjcmVhdGVkIGZvciB0aGlzIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBjb25uZWN0aW9uIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgaG9zdCBhbmQgcG9ydC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHBvcnQgY2Fubm90IGJlIGRldGVybWluZWQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVFbmRwb2ludCh0cmFuc3BvcnQ6IHVua25vd24sIG9wdGlvbnM6IENvbm5lY3RUb0NkcE9wdGlvbnMgfCB1bmRlZmluZWQpOiBSZXNvbHZlZEVuZHBvaW50IHtcbiAgaWYgKHRyYW5zcG9ydCBpbnN0YW5jZW9mIERlc2t0b3BDZHBUcmFuc3BvcnQpIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRyYW5zcG9ydC5nZXRPd25lZEluc3RhbmNlRW5kcG9pbnQoKTtcbiAgICBpZiAoZW5kcG9pbnQpIHtcbiAgICAgIHJldHVybiB7IGhvc3Q6IGVuZHBvaW50Lmhvc3QsIHBvcnQ6IGVuZHBvaW50LnBvcnQgfTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0aW9ucz8ucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHsgaG9zdDogb3B0aW9ucy5ob3N0ID8/IERFRkFVTFRfQ0RQX0hPU1QsIHBvcnQ6IG9wdGlvbnMucG9ydCB9O1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdjb25uZWN0VG9DZHA6IGNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIENEUCBwb3J0LicpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGhvc3Qtc2lkZSB0ZW1wIGRpcmVjdG9yaWVzIGVhcmxpZXIgcnVucyBsZWFrZWQsIGJlZm9yZSB0aGlzXG4gKiBjb25uZWN0aW9uIGFkZHMgaXRzIG93bi5cbiAqXG4gKiBgY29ubmVjdFRvQ2RwYCBtaW50cyB0aGUgc2FtZSBgdGVtcC12YXVsdC0qYCAvIG93bmVkIGB1c2VyZGF0YS0qYCBkaXJlY3Rvcmllc1xuICogdGhlIHRlc3QgZ2xvYmFsIHNldHVwIGRvZXMsIGFuZCBhbiBhZC1ob2MgZGVidWdnaW5nIHNlc3Npb24gaXMgZXhhY3RseSB0aGVcbiAqIGtpbmQgdGhhdCBnZXRzIGtpbGxlZCB3aXRoIGEgbGVmdG92ZXIgYmVoaW5kIFx1MjAxNCBzbyBpdCBzd2VlcHMgdG9vLiBBZ2UtZ2F0ZWQgYW5kXG4gKiBiZXN0LWVmZm9ydDsgc2VlIHRoZSBjb3JlJ3MgYHN3ZWVwTGVmdG92ZXJzYC5cbiAqXG4gKiBAcGFyYW0gdHJhbnNwb3J0T3B0aW9ucyAtIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucyAoc291cmNlIG9mIHRoZSBzd2VlcCBrbm9icykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN3ZWVwTGVmdG92ZXJzKHRyYW5zcG9ydE9wdGlvbnM6IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXdpbGxTd2VlcExlZnRvdmVycyh0cmFuc3BvcnRPcHRpb25zKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3dlZXBIb3N0TGVmdG92ZXJzKHtcbiAgICAgIG1heEFnZUluTWlsbGlzZWNvbmRzOiByZXNvbHZlTGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcyh0cmFuc3BvcnRPcHRpb25zKVxuICAgIH0pO1xuICAgIGlmIChyZXN1bHQucmVtb3ZlZENvdW50ID4gMCB8fCByZXN1bHQuZmFpbGVkQ291bnQgPiAwKSB7XG4gICAgICBsb2coXG4gICAgICAgIGBbY29ubmVjdC10by1jZHBdIFN3ZXB0ICR7U3RyaW5nKHJlc3VsdC5yZW1vdmVkQ291bnQpfSBsZWZ0b3ZlciB0ZW1wIGRpcmVjdG9yKGllcykgZnJvbSBlYXJsaWVyIHJ1bnMgYFxuICAgICAgICAgICsgYCgke1N0cmluZyhyZXN1bHQuZmFpbGVkQ291bnQpfSBzdGlsbCBpbiB1c2UpLmBcbiAgICAgICk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2Nvbm5lY3QtdG8tY2RwXSBMZWZ0b3ZlciBzd2VlcCBlcnJvciAobm9uLWZhdGFsKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUE0QkEsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxpQ0FBaUM7QUFDMUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxXQUFXO0FBQ3BCLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsa0NBQWtDO0FBQzNDLFNBQVMsbUNBQW1DO0FBRTVDLE1BQU0sbUJBQW1CO0FBeVJ6QixlQUFzQixhQUFhLFNBQXVEO0FBQ3hGLFFBQU0sbUJBQW1CLHlCQUF5QixPQUFPO0FBQ3pELFFBQU0sZUFBZSxnQkFBZ0I7QUFDckMsUUFBTSxZQUFZLE1BQU0sMkJBQTJCLGdCQUFnQjtBQUNuRSxRQUFNLDZCQUE2QixTQUFTLDhCQUErQixTQUFTLFVBQVU7QUFDOUYsUUFBTSxRQUFRLElBQUksZUFBZSxTQUFTLE9BQU8sRUFBRSxnQ0FBZ0MsMkJBQTJCLENBQUM7QUFNL0csTUFBSSxTQUFTLFVBQVUsUUFBVztBQUNoQyxVQUFNLDBCQUEwQjtBQUFBLE1BQzlCLGlCQUFpQiw0QkFBNEIsZ0JBQWdCO0FBQUEsTUFDN0QsT0FBTyxpQkFBaUI7QUFBQSxNQUN4QixXQUFXLE1BQU07QUFBQSxJQUNuQixDQUFDO0FBQUEsRUFDSDtBQUtBLFFBQU0sTUFBTSxTQUFTLFNBQVM7QUFFOUIsUUFBTSxFQUFFLE1BQU0sS0FBSyxJQUFJLGdCQUFnQixXQUFXLE9BQU87QUFDekQsUUFBTSxTQUFTLFVBQVUsSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQzdDLFFBQU0sZUFBZSxxQkFBcUIsc0JBQXNCLFVBQVUsZ0JBQWdCLElBQUk7QUFDOUYsUUFBTSxnQkFBZ0IscUJBQXFCLHNCQUFzQixVQUFVLGlCQUFpQixJQUFJO0FBQ2hHLFFBQU0sd0JBQXdCLHFCQUFxQixzQkFBc0IsVUFBVSx5QkFBeUIsSUFBSTtBQUVoSCxRQUFNLGFBQTRCO0FBQUEsSUFDaEM7QUFBQSxJQUNBLEdBQUksZ0JBQWdCLEVBQUUsYUFBYTtBQUFBLElBQ25DLEdBQUksaUJBQWlCLEVBQUUsY0FBYztBQUFBLElBQ3JDLEdBQUkseUJBQXlCLEVBQUUsc0JBQXNCO0FBQUEsSUFFckQsTUFBTSxrQkFBa0IsUUFBc0U7QUFJNUYsVUFBSSxDQUFDLFVBQVUsbUJBQW1CO0FBQ2hDLGNBQU0sSUFBSSxNQUFNLDBEQUEwRDtBQUFBLE1BQzVFO0FBRUEsYUFBTyxVQUFVLGtCQUFrQixFQUFFLEdBQUcsUUFBUSxLQUFLLE1BQU0sS0FBSyxDQUFDO0FBQUEsSUFDbkU7QUFBQSxJQUVBLE1BQU0sVUFBeUI7QUFDN0IsVUFBSTtBQUlGLGNBQU0sTUFBTSxRQUFRLFNBQVM7QUFBQSxNQUMvQixVQUFFO0FBQ0EsY0FBTSxVQUFVLFVBQVU7QUFBQSxNQUM1QjtBQUFBLElBQ0Y7QUFBQSxJQUVBLE1BQU0sZUFDSixRQUNpQjtBQUNqQixhQUFPLGVBQTBDLEVBQUUsR0FBRyxRQUFRLFdBQVcsV0FBVyxNQUFNLEtBQUssQ0FBQztBQUFBLElBQ2xHO0FBQUEsSUFFQSxNQUFNLE9BQU8sWUFBcUM7QUFDaEQsYUFBTyxVQUFVLFNBQVMsWUFBWSxFQUFFLEtBQUssTUFBTSxLQUFLLENBQUM7QUFBQSxJQUMzRDtBQUFBLElBRUE7QUFBQSxJQUVBLE9BQU8sT0FBTyxZQUFZLElBQW1CO0FBQzNDLFlBQU0sV0FBVyxRQUFRO0FBQUEsSUFDM0I7QUFBQSxJQUVBO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQVlBLFNBQVMseUJBQXlCLFNBQTREO0FBQzVGLFNBQU8sNEJBQXlEO0FBQUEsSUFDOUQsOEJBQThCLFNBQVM7QUFBQSxJQUN2QyxpQkFBaUIsU0FBUztBQUFBLElBQzFCLDZCQUE2QixTQUFTO0FBQUEsSUFDdEMsTUFBTSxTQUFTO0FBQUEsSUFDZixzQkFBc0IsU0FBUyx3QkFBd0I7QUFBQSxJQUN2RCwwQkFBMEIsU0FBUztBQUFBLElBQ25DLGlCQUFpQixTQUFTO0FBQUEsSUFDMUIsTUFBTSxTQUFTO0FBQUEsSUFDZixzQkFBc0IsU0FBUztBQUFBLElBQy9CLG9DQUFvQyxTQUFTO0FBQUEsSUFDN0MsaUNBQWlDLFNBQVM7QUFBQSxJQUMxQyxpQ0FBaUMsU0FBUztBQUFBLElBQzFDLE1BQU07QUFBQSxFQUNSLENBQUM7QUFDSDtBQVdBLFNBQVMsZ0JBQWdCLFdBQW9CLFNBQTREO0FBQ3ZHLE1BQUkscUJBQXFCLHFCQUFxQjtBQUM1QyxVQUFNLFdBQVcsVUFBVSx5QkFBeUI7QUFDcEQsUUFBSSxVQUFVO0FBQ1osYUFBTyxFQUFFLE1BQU0sU0FBUyxNQUFNLE1BQU0sU0FBUyxLQUFLO0FBQUEsSUFDcEQ7QUFBQSxFQUNGO0FBRUEsTUFBSSxTQUFTLFNBQVMsUUFBVztBQUMvQixXQUFPLEVBQUUsTUFBTSxRQUFRLFFBQVEsa0JBQWtCLE1BQU0sUUFBUSxLQUFLO0FBQUEsRUFDdEU7QUFFQSxRQUFNLElBQUksTUFBTSxpREFBaUQ7QUFDbkU7QUFhQSxlQUFlLGVBQWUsa0JBQThEO0FBQzFGLE1BQUksQ0FBQyxtQkFBbUIsZ0JBQWdCLEdBQUc7QUFDekM7QUFBQSxFQUNGO0FBRUEsTUFBSTtBQUNGLFVBQU0sU0FBUyxNQUFNLG1CQUFtQjtBQUFBLE1BQ3RDLHNCQUFzQixvQ0FBb0MsZ0JBQWdCO0FBQUEsSUFDNUUsQ0FBQztBQUNELFFBQUksT0FBTyxlQUFlLEtBQUssT0FBTyxjQUFjLEdBQUc7QUFDckQ7QUFBQSxRQUNFLDBCQUEwQixPQUFPLE9BQU8sWUFBWSxDQUFDLG1EQUM3QyxPQUFPLE9BQU8sV0FBVyxDQUFDO0FBQUEsTUFDcEM7QUFBQSxJQUNGO0FBQUEsRUFDRixTQUFTLE9BQWdCO0FBQ3ZCLFFBQUksc0RBQXNELE9BQU8sS0FBSyxDQUFDLEVBQUU7QUFBQSxFQUMzRTtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
115
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Nvbm5lY3QtdG8tY2RwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHJvZ3JhbW1hdGljIGhlbHBlciB0byBsYXVuY2ggKG9yIGF0dGFjaCB0bykgYSBDRFAtZW5hYmxlZCBPYnNpZGlhbiBpbnN0YW5jZVxuICogd2l0aCB0aGUgcnVudGltZSBoZWxwZXIgbmFtZXNwYWNlIGJvb3RzdHJhcHBlZCwgZm9yIGFkLWhvYyByZWFsLWFwcCBkZWJ1Z2dpbmcuXG4gKlxuICogQSBzaW5nbGUge0BsaW5rIGNvbm5lY3RUb0NkcH0gY2FsbCByZXNvbHZlcyB0aGUgb3duZWQtaW5zdGFuY2UgY29uZmlnLCBvcGVucyBhXG4gKiB2YXVsdCwgYW5kIGJvb3RzdHJhcHMgYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCAoc28gYGV2YWxXcmFwcGVyYCxcbiAqIHRoZSBiYXNlIGBsaWJgIGhlbHBlcnMsIGBlcnJvclRvU3RyaW5nYCwgYGdldE9ic2lkaWFuTW9kdWxlYCwgXHUyMDI2IGFyZSBhdmFpbGFibGUpLCB0aGVuXG4gKiBoYW5kcyBiYWNrIGEgZGlzcG9zYWJsZSB7QGxpbmsgQ2RwQ29ubmVjdGlvbn0gZXhwb3NpbmcgdGhlIGNob3NlbiBDRFAgcG9ydCwgYVxuICogcmF3IHtAbGluayBDZHBDb25uZWN0aW9uLmludm9rZX0gYW5kIHRoZSByaWNoIHtAbGluayBDZHBDb25uZWN0aW9uLmV2YWxJbk9ic2lkaWFufS5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIChsYXVuY2hlcyBPYnNpZGlhbiAvIENEUCkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgRXhjZXB0IH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBBc2FyRmFsbGJhY2sgfSBmcm9tICcuL2FzYXItZmFsbGJhY2stZGV0ZWN0aW9uLm1qcyc7XG5pbXBvcnQgdHlwZSB7IENhcHR1cmVTY3JlZW5zaG90UGFyYW1zIH0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QubWpzJztcbmltcG9ydCB0eXBlIHsgQ29udGV4dElkIH0gZnJvbSAnLi9jb250ZXh0LWlkLm1qcyc7XG5pbXBvcnQgdHlwZSB7IEVsZWN0cm9uQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBFdmFsSW5PYnNpZGlhblBhcmFtcyxcbiAgR2VuZXJpY09iamVjdFxufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB0eXBlIHsgSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkubWpzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtb3B0aW9ucy5tanMnO1xuXG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHsgZW5zdXJlSGVhZGxlc3NWYXVsdENvbmZpZyB9IGZyb20gJy4vaGVhZGxlc3MtdmF1bHQtY29uZmlnLm1qcyc7XG5pbXBvcnQge1xuICByZXNvbHZlTGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcyxcbiAgc3dlZXBIb3N0TGVmdG92ZXJzLFxuICB3aWxsU3dlZXBMZWZ0b3ZlcnNcbn0gZnJvbSAnLi9sZWZ0b3Zlci1jbGVhbnVwLm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi9ub3JtYWxpemUtb3B0aW9uYWwtcHJvcGVydGllcy5tanMnO1xuaW1wb3J0IHsgVGVtcG9yYXJ5VmF1bHQgfSBmcm9tICcuL3RlbXBvcmFyeS12YXVsdC5tanMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQgeyBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LWZhY3RvcnkubWpzJztcbmltcG9ydCB7IHJlc29sdmVPd25lZENvbmZpZ0RpcmVjdG9yeSB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcblxuY29uc3QgREVGQVVMVF9DRFBfSE9TVCA9ICdsb2NhbGhvc3QnO1xuXG4vKipcbiAqIEEgbGl2ZSBjb25uZWN0aW9uIHRvIGEgQ0RQLWVuYWJsZWQgT2JzaWRpYW4gaW5zdGFuY2Ugd2l0aCB0aGUgcnVudGltZSBoZWxwZXJcbiAqIG5hbWVzcGFjZSBib290c3RyYXBwZWQuXG4gKlxuICogSW1wbGVtZW50cyBgQXN5bmNEaXNwb3NhYmxlYCwgc28gYGF3YWl0IHVzaW5nIGNvbm4gPSBhd2FpdCBjb25uZWN0VG9DZHAoXHUyMDI2KWBcbiAqIGRpc3Bvc2VzIGl0IChraWxsaW5nIGFuIG93bmVkIGluc3RhbmNlIGFuZCBcdTIwMTQgZm9yIGEgdGhyb3ctYXdheSB0ZW1wIHZhdWx0IFx1MjAxNFxuICogcmVtb3ZpbmcgaXRzIGRpcmVjdG9yeSkgYXV0b21hdGljYWxseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZHBDb25uZWN0aW9uIGV4dGVuZHMgQXN5bmNEaXNwb3NhYmxlIHtcbiAgLyoqXG4gICAqIFRoZSBzaWxlbnQtYXNhci1mYWxsYmFjayB2ZXJkaWN0IGZvciBhbiBvd25lZCBpbnN0YW5jZSwgcmVhZCBsaXZlIGFmdGVyIGJvb3Q6XG4gICAqIHdoZXRoZXIgdGhlIGFwcCB2ZXJzaW9uIGl0IGlzIGFjdHVhbGx5IHJ1bm5pbmcgbWF0Y2hlcyB0aGUgc3dhcHBlZC1pbiBwaW4sIG9yXG4gICAqIHRoZSBpbnN0YWxsZXIgc2lsZW50bHkgcmV2ZXJ0ZWQgdG8gaXRzIG93biBidW5kbGVkIGFzYXIuIGB1bmRlZmluZWRgIGluIGF0dGFjaFxuICAgKiBtb2RlLCB3aGVuIG5vIGFzYXIgd2FzIHN3YXBwZWQsIG9yIHdoZW4gdGhlIHJ1bm5pbmcgdmVyc2lvbiB3YXMgdW5yZWFkYWJsZS4gQVxuICAgKiBgJ2ZhbGxiYWNrJ2AgdmVyZGljdCByZWFjaGVzIGhlcmUgb25seSB3aGVuIHRoZSB0aHJvdyBpcyBkaXNhYmxlZFxuICAgKiAoe0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnMuc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFja30gYGZhbHNlYCk7XG4gICAqIG90aGVyd2lzZSBpdCB0aHJvd3MgYFNpbGVudEFzYXJGYWxsYmFja0Vycm9yYCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gaXMgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFzYXJGYWxsYmFjaz86IEFzYXJGYWxsYmFjayB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ2FwdHVyZXMgYSBQTkcgc2NyZWVuc2hvdCBvZiB0aGlzIGNvbm5lY3Rpb24ncyBPYnNpZGlhbiB3aW5kb3csIHdpdGggdGhlXG4gICAqIHZhdWx0IHBhdGggcHJlLWJvdW5kLlxuICAgKlxuICAgKiBQYXNzIGB3aWR0aEluUGl4ZWxzYCArIGBoZWlnaHRJblBpeGVsc2AgdG8gcGluIHRoZSB2aWV3cG9ydCBmb3IgdGhlIGR1cmF0aW9uXG4gICAqIG9mIHRoZSBjYXB0dXJlLCBzbyB0aGUgZW1pdHRlZCBQTkcgaXMgZXhhY3RseSB0aGF0IHNpemUgd2hhdGV2ZXIgc2l6ZSB0aGVcbiAgICogd2luZG93IGhhcHBlbnMgdG8gYmUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZXhhY3Qgc2l6ZSB0byBjYXB0dXJlIGF0LiBPbWl0IHRvIGNhcHR1cmUgdGhlIHdpbmRvdyBhdCBpdHMgbmF0dXJhbCBzaXplLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByYXcgUE5HIGJ5dGVzLlxuICAgKi9cbiAgY2FwdHVyZVNjcmVlbnNob3QocGFyYW1zPzogRXhjZXB0PENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLCAnY3dkJz4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+O1xuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBDRFAgVVJMLCBlLmcuIGBodHRwOi8vbG9jYWxob3N0OjUxODg4YC5cbiAgICovXG4gIHJlYWRvbmx5IGNkcFVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgdmVyZGljdCBmb3IgYW4gb3duZWQgaW5zdGFuY2UsIHdoZW5cbiAgICogaXQgY291bGQgYmUgZGV0ZXJtaW5lZC4gYHVuZGVmaW5lZGAgaW4gYXR0YWNoIG1vZGUsIG9yIHdoZW4gdGhlIHZlcmRpY3QgaXNcbiAgICogdW5rbm93biAodW5kZXRlY3RhYmxlIHNoZWxsIHZlcnNpb24sIG9yIHRoZSBhcHAgdmVyc2lvbiBpcyBhYnNlbnQgZnJvbSB0aGVcbiAgICogdGFibGUpLiBBbiBgJ3VucnVubmFibGUnYCB2ZXJkaWN0IHJlYWNoZXMgaGVyZSBvbmx5IHdoZW4gdGhlIHByb2FjdGl2ZSB0aHJvd1xuICAgKiBpcyBkaXNhYmxlZCAoe0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnMuc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcn1cbiAgICogYGZhbHNlYCk7IG90aGVyd2lzZSBpdCB0aHJvd3MgYEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcmAgYmVmb3JlIHRoZVxuICAgKiBjb25uZWN0aW9uIGlzIGNyZWF0ZWQuXG4gICAqL1xuICByZWFkb25seSBjb21wYXRpYmlsaXR5PzogSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRGlzcG9zZXMgdGhlIGNvbm5lY3Rpb246IGtpbGxzIGFuIG93bmVkIGluc3RhbmNlIGFuZCByZW1vdmVzIGl0cyBpc29sYXRlZFxuICAgKiB1c2VyLWRhdGEgZGlyLiBUaGUgdmF1bHQgZGlyZWN0b3J5IGlzIHJlbW92ZWQgb25seSB3aGVuIGl0IGlzIGEgdGhyb3ctYXdheVxuICAgKiB0ZW1wIHZhdWx0IChzZWUge0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnMuc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2V9KTsgYVxuICAgKiByZWFsIHZhdWx0IHBhc3NlZCB2aWEge0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnMudmF1bHR9IGlzIG5ldmVyIGRlbGV0ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSBkaXNwb3NhbCBjb21wbGV0ZXMuXG4gICAqL1xuICBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSBydW50aW1lIEVsZWN0cm9uIGNvbXBhdGliaWxpdHkgdmVyZGljdCBmb3IgYW4gb3duZWQgaW5zdGFuY2UsIHJlYWQgbGl2ZVxuICAgKiBhZnRlciBib290OiB3aGV0aGVyIHRoZSBFbGVjdHJvbiB2ZXJzaW9uIGl0IGlzIGFjdHVhbGx5IHJ1bm5pbmcgaXMgbmV3IGVub3VnaFxuICAgKiBmb3IgdGhlIHJ1bm5pbmcgYXBwIHZlcnNpb24uIGB1bmRlZmluZWRgIGluIGF0dGFjaCBtb2RlLCBvciB3aGVuIHRoZSB2ZXJkaWN0XG4gICAqIGlzIHVua25vd24gKHRoZSBsaXZlIHZlcnNpb24gd2FzIHVucmVhZGFibGUsIG9yIHRoZSBhcHAgdmVyc2lvbiBjYXJyaWVzIG5vXG4gICAqIHJlY29tbWVuZGVkIEVsZWN0cm9uIHZlcnNpb24pLiBBbiBvbGQgRWxlY3Ryb24gbmV2ZXIgYmxvY2tzIFx1MjAxNCBpdCBvbmx5IHdhcm5zIFx1MjAxNFxuICAgKiBzbyB1bmxpa2Uge0BsaW5rIGNvbXBhdGliaWxpdHl9IHRoZXJlIGlzIG5vIHRocm93aW5nIHRpZXIuXG4gICAqL1xuICByZWFkb25seSBlbGVjdHJvbkNvbXBhdGliaWxpdHk/OiBFbGVjdHJvbkNvbXBhdGliaWxpdHkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIHNlbGYtY29udGFpbmVkIGZ1bmN0aW9uIGluc2lkZSBPYnNpZGlhbiB2aWEgdGhlIHJpY2ggaGVscGVyXG4gICAqIHBhdGgsIHJlY2VpdmluZyBgeyBhcHAsIGxpYiwgb2JzaWRpYW5Nb2R1bGUsIGNvbnRleHQgfWAgcGx1cyBhbnkgYGlucHV0YFxuICAgKiAoc2hhcmVkIGhlbHBlcnMgbGlrZSBgdHlwZUludG9FZGl0b3JgIC8gYHdhaXRVbnRpbGAgbGl2ZSBvbiBgbGliYCkuIE1pcnJvcnNcbiAgICogdGhlIHRvcC1sZXZlbCBgZXZhbEluT2JzaWRpYW5gLCB3aXRoIHRoZSB0cmFuc3BvcnQgYW5kIHZhdWx0IHBhdGggcHJlLWJvdW5kXG4gICAqIHRvIHRoaXMgY29ubmVjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBldmFsdWF0aW9uIHBhcmFtZXRlcnMgKGBjYWxsYmFja2AsIG9wdGlvbmFsIGBpbnB1dGAvYGNvbnRleHRJZGApLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgYGNhbGxiYWNrYC5cbiAgICovXG4gIGV2YWxJbk9ic2lkaWFuPElucHV0IGV4dGVuZHMgR2VuZXJpY09iamVjdCwgUmVzdWx0LCBUQ29udGV4dElkIGV4dGVuZHMgQ29udGV4dElkPHVua25vd24+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPihcbiAgICBwYXJhbXM6IEV4Y2VwdDxFdmFsSW5PYnNpZGlhblBhcmFtczxJbnB1dCwgUmVzdWx0LCBUQ29udGV4dElkPiwgJ3RyYW5zcG9ydCcgfCAndmF1bHRQYXRoJz5cbiAgKTogUHJvbWlzZTxSZXN1bHQ+O1xuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSByYXcgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiBhbmQgcmV0dXJucyB0aGVcbiAgICogbm9ybWFsaXplZCBzdHJpbmcgcmVzdWx0IChlLmcuIGAnNSdgLCBhIEpTT04gc3RyaW5nLCBvciBgJyhubyBvdXRwdXQpJ2ApLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIEEgc2VsZi1jb250YWluZWQgSmF2YVNjcmlwdCBleHByZXNzaW9uLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByYXcgcmVzdWx0IHN0cmluZy5cbiAgICovXG4gIGludm9rZShleHByZXNzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFRoZSBDRFAgcG9ydCB0aGUgaW5zdGFuY2UgaXMgcmVhY2hhYmxlIG9uICh0aGUgZnJlZSBwb3J0IGNob3NlbiBmb3IgYW5cbiAgICogb3duZWQgaW5zdGFuY2UsIG9yIHRoZSBhdHRhY2hlZCB7QGxpbmsgQ29ubmVjdFRvQ2RwT3B0aW9ucy5wb3J0fSkuXG4gICAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBvcGVuZWQgdmF1bHQuIEV4cG9zZXMgYHBhdGhgIGFuZCBgcG9wdWxhdGUoLi4uKWAgZm9yIHNlZWRpbmcgZmlsZXMuXG4gICAqL1xuICByZWFkb25seSB2YXVsdDogVGVtcG9yYXJ5VmF1bHQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNvbm5lY3RUb0NkcH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdFRvQ2RwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgaW5kaXZpZHVhbCBDRFAgY29tbWFuZHMuXG4gICAqXG4gICAqIEEgdGVzdCdzIGNsb3N1cmUgdHJhdmVscyBhcyBvbmUgYFJ1bnRpbWUuZXZhbHVhdGVgIGNvbW1hbmQsIHNvIHRoaXMgaXMgYWxzb1xuICAgKiB0aGUgZGVza3RvcCBwZXItZXZhbCBjYXAuIFRoZSBkZWZhdWx0IGlzIGBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EU2AsXG4gICAqIGV4cG9ydGVkIGZyb20gdGhlIHBhY2thZ2Ugcm9vdCBcdTIwMTQgaW1wb3J0IGl0IHJhdGhlciB0aGFuIHJlc3RhdGluZyB0aGUgbnVtYmVyLFxuICAgKiBzbyBhIGNsb3N1cmUgc2l6ZWQgYWdhaW5zdCB0aGUgY2FwIGZvbGxvd3MgaXQgaWYgaXQgZXZlciBtb3Zlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDMwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHZhdWx0J3MgKipjb25maWcgZm9sZGVyKiogXHUyMDE0IE9ic2lkaWFuJ3MgcGVyLXZhdWx0ICpPdmVycmlkZSBjb25maWdcbiAgICogZm9sZGVyKiBzZXR0aW5nLCBlLmcuIGAnLm9ic2lkaWFuLWRlc2t0b3AnYC4gU2V0IGl0IHRvIG9wZW4gYSB2YXVsdCB0aGF0XG4gICAqIGtlZXBzIGl0cyBzZXR0aW5ncyBzb21ld2hlcmUgb3RoZXIgdGhhbiBgLm9ic2lkaWFuYDsgd2l0aG91dCBpdCBzdWNoIGEgdmF1bHRcbiAgICogb3BlbnMgYWdhaW5zdCBgLm9ic2lkaWFuYCwgd2hpY2ggZm9yIGEgdmF1bHQgdGhhdCBoYXMgYSBzdGFsZSBvbmUgYmVzaWRlIHRoZVxuICAgKiByZWFsIGZvbGRlciBtZWFucyBvcGVuaW5nIHN1Y2Nlc3NmdWxseSBhZ2FpbnN0IHRoZSB3cm9uZyBzZXR0aW5ncy5cbiAgICpcbiAgICogTXVzdCBzdGFydCB3aXRoIGEgZG90LCBtdXN0IG5vdCBiZSB0aGUgYmFyZSBkb3QsIGFuZCBtdXN0IG5vdCBjb250YWluIGEgcGF0aFxuICAgKiBzZXBhcmF0b3IgXHUyMDE0IGFueXRoaW5nIGVsc2UgdGhyb3dzIGJlZm9yZSBPYnNpZGlhbiBsYXVuY2hlcywgc2luY2UgT2JzaWRpYW5cbiAgICogd291bGQgc2lsZW50bHkgc3Vic3RpdHV0ZSBgLm9ic2lkaWFuYC4gQWZ0ZXIgdGhlIHZhdWx0IG9wZW5zLCBpdHMgYWN0dWFsXG4gICAqIGBhcHAudmF1bHQuY29uZmlnRGlyYCBpcyByZWFkIGJhY2sgYW5kIGEgbWlzbWF0Y2ggdGhyb3dzXG4gICAqIGBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yYC5cbiAgICpcbiAgICogSWdub3JlZCBpbiBhdHRhY2ggbW9kZSAoe0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnMucG9ydH0gc2V0KSwgd2hlcmUgdGhlXG4gICAqIHZhdWx0IGlzIG9wZW5lZCBieSB0aGUgdXNlcidzIG93biBPYnNpZGlhbiB1bmRlciBpdHMgb3duIGNvbmZpZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGAgKE9ic2lkaWFuJ3Mgb3duIGRlZmF1bHQsIGAub2JzaWRpYW5gKVxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHcmFjZSB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGZvciBmYXN0LWZhaWxpbmcgYSBkZWFkIGJvb3Qgb2YgdGhlIG93bmVkXG4gICAqIGluc3RhbmNlIFx1MjAxNCB0aGUgcmVuZGVyZXIgbG9hZGVkIGJ1dCB0aGUgYXBwIG5ldmVyIGJvb3RzdHJhcHBlZCAoZW1wdHlcbiAgICogYDxib2R5PmAsIG5vIGB3aW5kb3cuYXBwYCksIHRoZSB0ZXJtaW5hbCBzdGF0ZSB3aGVuIHRoZSBhc2FyIGNhbm5vdCBydW4gb25cbiAgICogdGhlIGxhdW5jaGVkIEVsZWN0cm9uIHNoZWxsLiBPbmNlIGl0IGhhcyBoZWxkIHRoaXMgbG9uZyBhXG4gICAqIGBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yYCBpcyB0aHJvd24gaW5zdGVhZCBvZiB3YWl0aW5nIG91dCB0aGUgZnVsbFxuICAgKiByZWFkaW5lc3MgdGltZW91dC4gSWdub3JlZCBpbiBhdHRhY2ggbW9kZSAoe0BsaW5rIHBvcnR9IHNldCkuIFNldCBgMGAgdG9cbiAgICogZGlzYWJsZSBmYXN0LWZhaWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQ0RQIGhvc3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnbG9jYWxob3N0J2BcbiAgICovXG4gIHJlYWRvbmx5IGhvc3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIE9ic2lkaWFuIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uIERlZmF1bHRzIHRvIGB0cnVlYDsgc2V0XG4gICAqIGBmYWxzZWAgdG8gbGF1bmNoIGl0IG9mZi1zY3JlZW4uXG4gICAqIElnbm9yZWQgaW4gYXR0YWNoIG1vZGUgKHtAbGluayBwb3J0fSBzZXQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzT2JzaWRpYW5BcHBWaXNpYmxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUGlucyB0aGUgRWxlY3Ryb24gc2hlbGwgKGluc3RhbGxlciBidWlsZCkgdGhlIG93bmVkIGluc3RhbmNlIHJ1bnMuIEFjY2VwdHNcbiAgICogYCd4LnkueidgLCBgJ3B1YmxpYy1sYXRlc3QnYCwgb3IgYCdjYXRhbHlzdC1sYXRlc3QnYC4gSWdub3JlZCB3aGVuXG4gICAqIHtAbGluayBwb3J0fSAoYXR0YWNoIG1vZGUpIGlzIHNldC4gV2hlbiBvbWl0dGVkLCB0aGUgaW5zdGFsbGVkIHNoZWxsIGlzIHVzZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhbkluc3RhbGxlclZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBpbnMgdGhlIE9ic2lkaWFuIGFwcCB2ZXJzaW9uIChhc2FyKSB0aGUgb3duZWQgaW5zdGFuY2UgcnVucy4gQWNjZXB0c1xuICAgKiBgJ3gueS56J2AsIGAncHVibGljLWxhdGVzdCdgLCBvciBgJ2NhdGFseXN0LWxhdGVzdCdgLiBJZ25vcmVkIHdoZW5cbiAgICoge0BsaW5rIHBvcnR9IChhdHRhY2ggbW9kZSkgaXMgc2V0LiBXaGVuIG9taXR0ZWQsIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiBpcyB1c2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5WZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDRFAgcG9ydCBvZiBhbiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4gdG8gKiphdHRhY2gqKiB0by4gV2hlbiBvbWl0dGVkLCBhblxuICAgKiBpc29sYXRlZCBpbnN0YW5jZSBpcyBsYXVuY2hlZCBvbiBhbiBhdXRvbWF0aWNhbGx5IGNob3NlbiBmcmVlIHBvcnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBwb3J0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGxhdW5jaCB0aGUgb3duZWQgaW5zdGFuY2Ugd2l0aCBDaHJvbWl1bSdzIHNhbmRib3ggZGlzYWJsZWRcbiAgICogKGAtLW5vLXNhbmRib3hgKS5cbiAgICpcbiAgICogTmVlZGVkIHRvIGJvb3Qgb24gTGludXggd2l0aG91dCBhIGNvcnJlY3RseS1jb25maWd1cmVkIHNldHVpZFxuICAgKiBgY2hyb21lLXNhbmRib3hgIGhlbHBlciAoZS5nLiBhbiBpbnN0YWxsZXItZXh0cmFjdGVkIHBvcnRhYmxlIHNoZWxsLCBvciBDSVxuICAgKiBydW5uaW5nIGFzIGEgbm9uLXJvb3QgdXNlcik7IGhhcm1sZXNzIG9uIFdpbmRvd3MvbWFjT1MuIElnbm9yZWQgaW4gYXR0YWNoXG4gICAqIG1vZGUgKHtAbGluayBwb3J0fSBzZXQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGREaXNhYmxlU2FuZGJveD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVtb3ZlIHRoZSB2YXVsdCBkaXJlY3Rvcnkgb24ge0BsaW5rIENkcENvbm5lY3Rpb24uZGlzcG9zZX0uXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgZGVmYXVsdHMgdG8gYHRydWVgIGZvciBhbiBpbXBsaWNpdCB0aHJvdy1hd2F5IHRlbXAgdmF1bHRcbiAgICogKHtAbGluayB2YXVsdH0gbm90IGdpdmVuKSBhbmQgYGZhbHNlYCB3aGVuIGEge0BsaW5rIHZhdWx0fSBwYXRoIGlzIGdpdmVuLCBzb1xuICAgKiBhIHJlYWwgdmF1bHQgaXMgbmV2ZXIgZGVsZXRlZC4gU2V0IGV4cGxpY2l0bHkgdG8gb3ZlcnJpZGUuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYW4gKip1bnJ1bm5hYmxlKiogaW5zdGFsbGVyXHUyMTk0YXBwIHZlcnNpb24gcGFpciBmYWlscyBmYXN0IGJlZm9yZSBsYXVuY2guXG4gICAqXG4gICAqIFdoZW4gYHRydWVgICh0aGUgZGVmYXVsdCksIGFuIGluc3RhbGxlciBiZWxvdyB0aGUgYXBwJ3MgcnVuIGZsb29yIHRocm93c1xuICAgKiBgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yYCBmcm9tIHZlcnNpb24gcmVzb2x1dGlvbiBiZWZvcmUgYW55dGhpbmcgaXNcbiAgICogZG93bmxvYWRlZCBvciBsYXVuY2hlZC4gU2V0IGBmYWxzZWAgdG8gbGV0IHRoZSBwaW4gcHJvY2VlZCB0byBsYXVuY2ggXHUyMDE0IHdoZXJlXG4gICAqIHRoZSByZWFjdGl2ZSBkZWFkLWJvb3QgZmFzdC1mYWlsIHN0aWxsIGNhdGNoZXMgdGhlIGJsYWNrLXNjcmVlbiBib290LCBhbmQgdGhlXG4gICAqIGAndW5ydW5uYWJsZSdgIHZlcmRpY3QgaXMgc3VyZmFjZWQgb24ge0BsaW5rIENkcENvbm5lY3Rpb24uY29tcGF0aWJpbGl0eX1cbiAgICogcmF0aGVyIHRoYW4gdGhyb3duLiBJZ25vcmVkIGluIGF0dGFjaCBtb2RlICh7QGxpbmsgcG9ydH0gc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBhIHBvc3QtYm9vdCAqKnNpbGVudCBhc2FyIGZhbGxiYWNrKiogZmFpbHMgZmFzdC5cbiAgICpcbiAgICogV2hlbiBhbiBhc2FyIGlzIHN3YXBwZWQgb250byBhbiBpbnN0YWxsZXIgc2hlbGwgdG9vIG9sZCBmb3IgaXQsIHRoZSBpbnN0YW5jZVxuICAgKiBtYXkgc2lsZW50bHkgcmV2ZXJ0IHRvIHRoZSBpbnN0YWxsZXIncyBvd24gYnVuZGxlZCBhc2FyIGFuZCBydW4gdGhlICoqd3JvbmdcbiAgICogKG9sZGVyKSoqIHZlcnNpb24gYmVoaW5kIGEgaGVhbHRoeSBVSS4gV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgdGhlIHJ1bm5pbmdcbiAgICogYXBwIHZlcnNpb24gaXMgdmVyaWZpZWQgYWdhaW5zdCB0aGUgcGluIHBvc3QtYm9vdCBhbmQgYSBtaXNtYXRjaCB0aHJvd3NcbiAgICogYFNpbGVudEFzYXJGYWxsYmFja0Vycm9yYC4gU2V0IGBmYWxzZWAgdG8gbGV0IHRoZSBib290IHByb2NlZWQgXHUyMDE0IHRoZSBtaXNtYXRjaFxuICAgKiBpcyB0aGVuIHN1cmZhY2VkIG9uIHtAbGluayBDZHBDb25uZWN0aW9uLmFzYXJGYWxsYmFja30gcmF0aGVyIHRoYW4gdGhyb3duLlxuICAgKiBJZ25vcmVkIGluIGF0dGFjaCBtb2RlICh7QGxpbmsgcG9ydH0gc2V0KSBhbmQgd2hlbiBubyBhc2FyIGlzIHN3YXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG93bmVkLWluc3RhbmNlIGNvbXBhdGliaWxpdHkgKipuYWcgd2FybmluZ3MqKiBhcmUgZW1pdHRlZC5cbiAgICpcbiAgICogQ292ZXJzIGJvdGggdGhlIG9mZmxpbmUgaW5zdGFsbGVyXHUyMTk0YXBwIHdhcm5pbmcgYW5kIHRoZSBwb3N0LWJvb3RcbiAgICogcnVudGltZS1FbGVjdHJvbiB3YXJuaW5nLiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpIGVhY2ggZmlyZXMgdmlhIHRoZSBoYXJuZXNzXG4gICAqIGxvZzsgc2V0IGBmYWxzZWAgdG8gc2lsZW5jZSBib3RoIFx1MjAxNCB0aGUgdmVyZGljdHMgYXJlIHN0aWxsIHN1cmZhY2VkIG9uXG4gICAqIHtAbGluayBDZHBDb25uZWN0aW9uLmNvbXBhdGliaWxpdHl9IC8ge0BsaW5rIENkcENvbm5lY3Rpb24uZWxlY3Ryb25Db21wYXRpYmlsaXR5fSxcbiAgICogb25seSB0aGUgbG9nIGlzIHN1cHByZXNzZWQuIElnbm9yZWQgaW4gYXR0YWNoIG1vZGUgKHtAbGluayBwb3J0fSBzZXQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBwYXRoIHRvIGFuIGV4aXN0aW5nIHZhdWx0IHRvIG9wZW4uIFdoZW4gb21pdHRlZCwgYW4gZW1wdHkgdGVtcG9yYXJ5XG4gICAqIHZhdWx0IGlzIGNyZWF0ZWQgKGFuZCByZW1vdmVkIG9uIGRpc3Bvc2UgdW5sZXNzXG4gICAqIHtAbGluayBzaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZX0gc2F5cyBvdGhlcndpc2UpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSByZXNvbHZlZCBDRFAgaG9zdC9wb3J0IHBhaXIuXG4gKi9cbmludGVyZmFjZSBSZXNvbHZlZEVuZHBvaW50IHtcbiAgaG9zdDogc3RyaW5nO1xuICBwb3J0OiBudW1iZXI7XG59XG5cbi8qKlxuICogTGF1bmNoZXMgKG9yIGF0dGFjaGVzIHRvKSBhIENEUC1lbmFibGVkIE9ic2lkaWFuIGluc3RhbmNlLCBvcGVucyBhIHZhdWx0LCBhbmRcbiAqIGJvb3RzdHJhcHMgdGhlIHJ1bnRpbWUgaGVscGVyIG5hbWVzcGFjZSwgcmV0dXJuaW5nIGEgZGlzcG9zYWJsZSBjb25uZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29ubmVjdGlvbiBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbGl2ZSB7QGxpbmsgQ2RwQ29ubmVjdGlvbn0uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0VG9DZHAob3B0aW9ucz86IENvbm5lY3RUb0NkcE9wdGlvbnMpOiBQcm9taXNlPENkcENvbm5lY3Rpb24+IHtcbiAgY29uc3QgdHJhbnNwb3J0T3B0aW9ucyA9IGJ1aWxkQ2RwVHJhbnNwb3J0T3B0aW9ucyhvcHRpb25zKTtcbiAgYXdhaXQgc3dlZXBMZWZ0b3ZlcnModHJhbnNwb3J0T3B0aW9ucyk7XG4gIGNvbnN0IHRyYW5zcG9ydCA9IGF3YWl0IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKHRyYW5zcG9ydE9wdGlvbnMpO1xuICBjb25zdCBzaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZSA9IG9wdGlvbnM/LnNob3VsZFJlbW92ZVZhdWx0T25EaXNwb3NlID8/IChvcHRpb25zPy52YXVsdCA9PT0gdW5kZWZpbmVkKTtcbiAgY29uc3QgdmF1bHQgPSBuZXcgVGVtcG9yYXJ5VmF1bHQob3B0aW9ucz8udmF1bHQsIHsgc2hvdWxkUmVtb3ZlRGlyZWN0b3J5T25EaXNwb3NlOiBzaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZSB9KTtcblxuICAvLyBUaGUgaGVhZGxlc3MgZGVmYXVsdHMgZ28gb25seSBpbnRvIGEgdmF1bHQgdGhlIGhhcm5lc3MgbWFkZSBcdTIwMTQgdGhlIHNhbWVcbiAgLy8gYG9wdGlvbnMudmF1bHQgPT09IHVuZGVmaW5lZGAgZGlzY3JpbWluYXRvciB0aGUgZGlzcG9zYWwgYWJvdmUgdHVybnMgb24uIEFcbiAgLy8gQ2FsbGVyLXN1cHBsaWVkIHZhdWx0IGlzIGEgcmVhbCBvbmUgdGhlIHVzZXIga2VlcHMsIGFuZCBhIGRlYnVnZ2luZyBzZXNzaW9uXG4gIC8vIEhhcyBubyBidXNpbmVzcyByZXdyaXRpbmcgaXRzIHNldHRpbmdzLlxuICBpZiAob3B0aW9ucz8udmF1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgIGF3YWl0IGVuc3VyZUhlYWRsZXNzVmF1bHRDb25maWcoe1xuICAgICAgY29uZmlnRGlyZWN0b3J5OiByZXNvbHZlT3duZWRDb25maWdEaXJlY3RvcnkodHJhbnNwb3J0T3B0aW9ucyksXG4gICAgICBsYWJlbDogdHJhbnNwb3J0T3B0aW9ucy50eXBlLFxuICAgICAgdmF1bHRQYXRoOiB2YXVsdC5wYXRoXG4gICAgfSk7XG4gIH1cblxuICAvLyBSZWdpc3RlcmluZyB0aGUgdmF1bHQgaXMgd2hhdCBsYXVuY2hlcyB0aGUgb3duZWQgaW5zdGFuY2UgKHByb3Zpc2lvbnMgdGhlXG4gIC8vIEFzYXIsIG9wZW5zIHRoZSB2YXVsdCwgYW5kIGJvb3RzdHJhcHMgdGhlIGhlbHBlciBuYW1lc3BhY2UpLCBvciBvcGVucyB0aGVcbiAgLy8gVmF1bHQgaW4gdGhlIGF0dGFjaGVkIGluc3RhbmNlLlxuICBhd2FpdCB2YXVsdC5yZWdpc3Rlcih0cmFuc3BvcnQpO1xuXG4gIGNvbnN0IHsgaG9zdCwgcG9ydCB9ID0gcmVzb2x2ZUVuZHBvaW50KHRyYW5zcG9ydCwgb3B0aW9ucyk7XG4gIGNvbnN0IGNkcFVybCA9IGBodHRwOi8vJHtob3N0fToke1N0cmluZyhwb3J0KX1gO1xuICBjb25zdCBhc2FyRmFsbGJhY2sgPSB0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0ID8gdHJhbnNwb3J0LmdldEFzYXJGYWxsYmFjaygpIDogdW5kZWZpbmVkO1xuICBjb25zdCBjb21wYXRpYmlsaXR5ID0gdHJhbnNwb3J0IGluc3RhbmNlb2YgRGVza3RvcENkcFRyYW5zcG9ydCA/IHRyYW5zcG9ydC5nZXRDb21wYXRpYmlsaXR5KCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGVsZWN0cm9uQ29tcGF0aWJpbGl0eSA9IHRyYW5zcG9ydCBpbnN0YW5jZW9mIERlc2t0b3BDZHBUcmFuc3BvcnQgPyB0cmFuc3BvcnQuZ2V0RWxlY3Ryb25Db21wYXRpYmlsaXR5KCkgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgY29ubmVjdGlvbjogQ2RwQ29ubmVjdGlvbiA9IHtcbiAgICBjZHBVcmwsXG4gICAgLi4uKGFzYXJGYWxsYmFjayAmJiB7IGFzYXJGYWxsYmFjayB9KSxcbiAgICAuLi4oY29tcGF0aWJpbGl0eSAmJiB7IGNvbXBhdGliaWxpdHkgfSksXG4gICAgLi4uKGVsZWN0cm9uQ29tcGF0aWJpbGl0eSAmJiB7IGVsZWN0cm9uQ29tcGF0aWJpbGl0eSB9KSxcblxuICAgIGFzeW5jIGNhcHR1cmVTY3JlZW5zaG90KHBhcmFtcz86IEV4Y2VwdDxDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcywgJ2N3ZCc+KTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgICAvLyBFdmVyeSB0cmFuc3BvcnQgYGNvbm5lY3RUb0NkcGAgYnVpbGRzIGlzIGEgRGVza3RvcENkcFRyYW5zcG9ydCwgd2hpY2hcbiAgICAgIC8vIEltcGxlbWVudHMgdGhlIG9wdGlvbmFsIG1ldGhvZCBcdTIwMTQgYnV0IHRoZSBpbnRlcmZhY2Ugc3RpbGwgdHlwZXMgaXRcbiAgICAgIC8vIE9wdGlvbmFsLCBzbyB0aGUgYWJzZW5jZSBpcyByZXBvcnRlZCByYXRoZXIgdGhhbiBzaWxlbnRseSB0aHJvd24gYXQuXG4gICAgICBpZiAoIXRyYW5zcG9ydC5jYXB0dXJlU2NyZWVuc2hvdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nvbm5lY3RUb0NkcDogdGhpcyB0cmFuc3BvcnQgY2Fubm90IGNhcHR1cmUgc2NyZWVuc2hvdHMuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cmFuc3BvcnQuY2FwdHVyZVNjcmVlbnNob3QoeyAuLi5wYXJhbXMsIGN3ZDogdmF1bHQucGF0aCB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoZSB2YXVsdCBjYXJyaWVzIGBzaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZWAgaXRzZWxmIChoYW5kZWQgdG8gaXRzIGNvbnN0cnVjdG9yIGFib3ZlKSwgc29cbiAgICAgICAgLy8gVGhpcyBpcyBvbmUgY2FsbCByYXRoZXIgdGhhbiBhIGJyYW5jaDogaXQgYWx3YXlzIHVucmVnaXN0ZXJzLCBhbmQgcmVtb3ZlcyB0aGUgZGlyZWN0b3J5IG9ubHlcbiAgICAgICAgLy8gV2hlbiB0aGF0IGZsYWcgc2F5cyB0by5cbiAgICAgICAgYXdhaXQgdmF1bHQuZGlzcG9zZSh0cmFuc3BvcnQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgdHJhbnNwb3J0LmRpc3Bvc2U/LigpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBldmFsSW5PYnNpZGlhbjxJbnB1dCBleHRlbmRzIEdlbmVyaWNPYmplY3QsIFJlc3VsdCwgVENvbnRleHRJZCBleHRlbmRzIENvbnRleHRJZDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gICAgICBwYXJhbXM6IEV4Y2VwdDxFdmFsSW5PYnNpZGlhblBhcmFtczxJbnB1dCwgUmVzdWx0LCBUQ29udGV4dElkPiwgJ3RyYW5zcG9ydCcgfCAndmF1bHRQYXRoJz5cbiAgICApOiBQcm9taXNlPFJlc3VsdD4ge1xuICAgICAgcmV0dXJuIGV2YWxJbk9ic2lkaWFuPElucHV0LCBSZXN1bHQsIFRDb250ZXh0SWQ+KHsgLi4ucGFyYW1zLCB0cmFuc3BvcnQsIHZhdWx0UGF0aDogdmF1bHQucGF0aCB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaW52b2tlKGV4cHJlc3Npb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICByZXR1cm4gdHJhbnNwb3J0LmV2YWx1YXRlKGV4cHJlc3Npb24sIHsgY3dkOiB2YXVsdC5wYXRoIH0pO1xuICAgIH0sXG5cbiAgICBwb3J0LFxuXG4gICAgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgY29ubmVjdGlvbi5kaXNwb3NlKCk7XG4gICAgfSxcblxuICAgIHZhdWx0XG4gIH07XG5cbiAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSB7QGxpbmsgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zfSBmb3IgYSBjb25uZWN0aW9uLCB0aHJlYWRpbmcgb25seVxuICogdGhlIHByb3ZpZGVkIHtAbGluayBDb25uZWN0VG9DZHBPcHRpb25zfSB0aHJvdWdoIChvd25lZC12aXNpYmxlIGRlZmF1bHRzIHRvXG4gKiBgdHJ1ZWAsIHVubGlrZSB0aGUgaGlkZGVuLWJ5LWRlZmF1bHQgdGVzdCB0cmFuc3BvcnRzKS4gVW5zZXQga25vYnMgcGFzcyB0aHJvdWdoXG4gKiBhcyBgdW5kZWZpbmVkYCBhbmQgYXJlIHJlYWQgd2l0aCBgPz8gZGVmYXVsdGAgLyBgIT09IHVuZGVmaW5lZGAgZ3VhcmRzXG4gKiBkb3duc3RyZWFtLCBzbyBhbiBleHBsaWNpdCBgdW5kZWZpbmVkYCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIGFic2VudCBrZXkuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgY29ubmVjdGlvbiBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHRyYW5zcG9ydCBvcHRpb25zIHRvIGNyZWF0ZSB0aGUgY29ubmVjdGlvbidzIHRyYW5zcG9ydCBmcm9tLlxuICovXG5mdW5jdGlvbiBidWlsZENkcFRyYW5zcG9ydE9wdGlvbnMob3B0aW9ucz86IENvbm5lY3RUb0NkcE9wdGlvbnMpOiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMge1xuICByZXR1cm4gbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucz4oe1xuICAgIGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnM/LmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgY29uZmlnRGlyZWN0b3J5OiBvcHRpb25zPy5jb25maWdEaXJlY3RvcnksXG4gICAgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzOiBvcHRpb25zPy5kZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMsXG4gICAgaG9zdDogb3B0aW9ucz8uaG9zdCxcbiAgICBpc09ic2lkaWFuQXBwVmlzaWJsZTogb3B0aW9ucz8uaXNPYnNpZGlhbkFwcFZpc2libGUgPz8gdHJ1ZSxcbiAgICBvYnNpZGlhbkluc3RhbGxlclZlcnNpb246IG9wdGlvbnM/Lm9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbixcbiAgICBvYnNpZGlhblZlcnNpb246IG9wdGlvbnM/Lm9ic2lkaWFuVmVyc2lvbixcbiAgICBwb3J0OiBvcHRpb25zPy5wb3J0LFxuICAgIHNob3VsZERpc2FibGVTYW5kYm94OiBvcHRpb25zPy5zaG91bGREaXNhYmxlU2FuZGJveCxcbiAgICBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyOiBvcHRpb25zPy5zaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyLFxuICAgIHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2s6IG9wdGlvbnM/LnNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2ssXG4gICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3Vlczogb3B0aW9ucz8uc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyxcbiAgICB0eXBlOiAnb2JzaWRpYW4tY2RwJ1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgQ0RQIGhvc3QvcG9ydCBmb3IgdGhlIGNvbm5lY3Rpb246IGZyb20gdGhlIG93bmVkIGluc3RhbmNlJ3NcbiAqIGxhdW5jaGVkIGVuZHBvaW50IHdoZW4gcHJlc2VudCwgb3RoZXJ3aXNlIGZyb20gdGhlIGF0dGFjaCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB0cmFuc3BvcnQgLSBUaGUgdHJhbnNwb3J0IGNyZWF0ZWQgZm9yIHRoaXMgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGNvbm5lY3Rpb24gb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBob3N0IGFuZCBwb3J0LlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgcG9ydCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUVuZHBvaW50KHRyYW5zcG9ydDogdW5rbm93biwgb3B0aW9uczogQ29ubmVjdFRvQ2RwT3B0aW9ucyB8IHVuZGVmaW5lZCk6IFJlc29sdmVkRW5kcG9pbnQge1xuICBpZiAodHJhbnNwb3J0IGluc3RhbmNlb2YgRGVza3RvcENkcFRyYW5zcG9ydCkge1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdHJhbnNwb3J0LmdldE93bmVkSW5zdGFuY2VFbmRwb2ludCgpO1xuICAgIGlmIChlbmRwb2ludCkge1xuICAgICAgcmV0dXJuIHsgaG9zdDogZW5kcG9pbnQuaG9zdCwgcG9ydDogZW5kcG9pbnQucG9ydCB9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zPy5wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4geyBob3N0OiBvcHRpb25zLmhvc3QgPz8gREVGQVVMVF9DRFBfSE9TVCwgcG9ydDogb3B0aW9ucy5wb3J0IH07XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ2Nvbm5lY3RUb0NkcDogY291bGQgbm90IGRldGVybWluZSB0aGUgQ0RQIHBvcnQuJyk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgaG9zdC1zaWRlIHRlbXAgZGlyZWN0b3JpZXMgZWFybGllciBydW5zIGxlYWtlZCwgYmVmb3JlIHRoaXNcbiAqIGNvbm5lY3Rpb24gYWRkcyBpdHMgb3duLlxuICpcbiAqIGBjb25uZWN0VG9DZHBgIG1pbnRzIHRoZSBzYW1lIGB0ZW1wLXZhdWx0LSpgIC8gb3duZWQgYHVzZXJkYXRhLSpgIGRpcmVjdG9yaWVzXG4gKiB0aGUgdGVzdCBnbG9iYWwgc2V0dXAgZG9lcywgYW5kIGFuIGFkLWhvYyBkZWJ1Z2dpbmcgc2Vzc2lvbiBpcyBleGFjdGx5IHRoZVxuICoga2luZCB0aGF0IGdldHMga2lsbGVkIHdpdGggYSBsZWZ0b3ZlciBiZWhpbmQgXHUyMDE0IHNvIGl0IHN3ZWVwcyB0b28uIEFnZS1nYXRlZCBhbmRcbiAqIGJlc3QtZWZmb3J0OyBzZWUgdGhlIGNvcmUncyBgc3dlZXBMZWZ0b3ZlcnNgLlxuICpcbiAqIEBwYXJhbSB0cmFuc3BvcnRPcHRpb25zIC0gVGhlIHJlc29sdmVkIHRyYW5zcG9ydCBvcHRpb25zIChzb3VyY2Ugb2YgdGhlIHN3ZWVwIGtub2JzKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3dlZXBMZWZ0b3ZlcnModHJhbnNwb3J0T3B0aW9uczogT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghd2lsbFN3ZWVwTGVmdG92ZXJzKHRyYW5zcG9ydE9wdGlvbnMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzd2VlcEhvc3RMZWZ0b3ZlcnMoe1xuICAgICAgbWF4QWdlSW5NaWxsaXNlY29uZHM6IHJlc29sdmVMZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzKHRyYW5zcG9ydE9wdGlvbnMpXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5yZW1vdmVkQ291bnQgPiAwIHx8IHJlc3VsdC5mYWlsZWRDb3VudCA+IDApIHtcbiAgICAgIGxvZyhcbiAgICAgICAgYFtjb25uZWN0LXRvLWNkcF0gU3dlcHQgJHtTdHJpbmcocmVzdWx0LnJlbW92ZWRDb3VudCl9IGxlZnRvdmVyIHRlbXAgZGlyZWN0b3IoaWVzKSBmcm9tIGVhcmxpZXIgcnVucyBgXG4gICAgICAgICAgKyBgKCR7U3RyaW5nKHJlc3VsdC5mYWlsZWRDb3VudCl9IHN0aWxsIGluIHVzZSkuYFxuICAgICAgKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbY29ubmVjdC10by1jZHBdIExlZnRvdmVyIHN3ZWVwIGVycm9yIChub24tZmF0YWwpOiAke1N0cmluZyhlcnJvcil9YCk7XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQTRCQSxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLGlDQUFpQztBQUMxQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFdBQVc7QUFDcEIsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyxrQ0FBa0M7QUFDM0MsU0FBUyxtQ0FBbUM7QUFFNUMsTUFBTSxtQkFBbUI7QUE4UnpCLGVBQXNCLGFBQWEsU0FBdUQ7QUFDeEYsUUFBTSxtQkFBbUIseUJBQXlCLE9BQU87QUFDekQsUUFBTSxlQUFlLGdCQUFnQjtBQUNyQyxRQUFNLFlBQVksTUFBTSwyQkFBMkIsZ0JBQWdCO0FBQ25FLFFBQU0sNkJBQTZCLFNBQVMsOEJBQStCLFNBQVMsVUFBVTtBQUM5RixRQUFNLFFBQVEsSUFBSSxlQUFlLFNBQVMsT0FBTyxFQUFFLGdDQUFnQywyQkFBMkIsQ0FBQztBQU0vRyxNQUFJLFNBQVMsVUFBVSxRQUFXO0FBQ2hDLFVBQU0sMEJBQTBCO0FBQUEsTUFDOUIsaUJBQWlCLDRCQUE0QixnQkFBZ0I7QUFBQSxNQUM3RCxPQUFPLGlCQUFpQjtBQUFBLE1BQ3hCLFdBQVcsTUFBTTtBQUFBLElBQ25CLENBQUM7QUFBQSxFQUNIO0FBS0EsUUFBTSxNQUFNLFNBQVMsU0FBUztBQUU5QixRQUFNLEVBQUUsTUFBTSxLQUFLLElBQUksZ0JBQWdCLFdBQVcsT0FBTztBQUN6RCxRQUFNLFNBQVMsVUFBVSxJQUFJLElBQUksT0FBTyxJQUFJLENBQUM7QUFDN0MsUUFBTSxlQUFlLHFCQUFxQixzQkFBc0IsVUFBVSxnQkFBZ0IsSUFBSTtBQUM5RixRQUFNLGdCQUFnQixxQkFBcUIsc0JBQXNCLFVBQVUsaUJBQWlCLElBQUk7QUFDaEcsUUFBTSx3QkFBd0IscUJBQXFCLHNCQUFzQixVQUFVLHlCQUF5QixJQUFJO0FBRWhILFFBQU0sYUFBNEI7QUFBQSxJQUNoQztBQUFBLElBQ0EsR0FBSSxnQkFBZ0IsRUFBRSxhQUFhO0FBQUEsSUFDbkMsR0FBSSxpQkFBaUIsRUFBRSxjQUFjO0FBQUEsSUFDckMsR0FBSSx5QkFBeUIsRUFBRSxzQkFBc0I7QUFBQSxJQUVyRCxNQUFNLGtCQUFrQixRQUFzRTtBQUk1RixVQUFJLENBQUMsVUFBVSxtQkFBbUI7QUFDaEMsY0FBTSxJQUFJLE1BQU0sMERBQTBEO0FBQUEsTUFDNUU7QUFFQSxhQUFPLFVBQVUsa0JBQWtCLEVBQUUsR0FBRyxRQUFRLEtBQUssTUFBTSxLQUFLLENBQUM7QUFBQSxJQUNuRTtBQUFBLElBRUEsTUFBTSxVQUF5QjtBQUM3QixVQUFJO0FBSUYsY0FBTSxNQUFNLFFBQVEsU0FBUztBQUFBLE1BQy9CLFVBQUU7QUFDQSxjQUFNLFVBQVUsVUFBVTtBQUFBLE1BQzVCO0FBQUEsSUFDRjtBQUFBLElBRUEsTUFBTSxlQUNKLFFBQ2lCO0FBQ2pCLGFBQU8sZUFBMEMsRUFBRSxHQUFHLFFBQVEsV0FBVyxXQUFXLE1BQU0sS0FBSyxDQUFDO0FBQUEsSUFDbEc7QUFBQSxJQUVBLE1BQU0sT0FBTyxZQUFxQztBQUNoRCxhQUFPLFVBQVUsU0FBUyxZQUFZLEVBQUUsS0FBSyxNQUFNLEtBQUssQ0FBQztBQUFBLElBQzNEO0FBQUEsSUFFQTtBQUFBLElBRUEsT0FBTyxPQUFPLFlBQVksSUFBbUI7QUFDM0MsWUFBTSxXQUFXLFFBQVE7QUFBQSxJQUMzQjtBQUFBLElBRUE7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBWUEsU0FBUyx5QkFBeUIsU0FBNEQ7QUFDNUYsU0FBTyw0QkFBeUQ7QUFBQSxJQUM5RCw4QkFBOEIsU0FBUztBQUFBLElBQ3ZDLGlCQUFpQixTQUFTO0FBQUEsSUFDMUIsNkJBQTZCLFNBQVM7QUFBQSxJQUN0QyxNQUFNLFNBQVM7QUFBQSxJQUNmLHNCQUFzQixTQUFTLHdCQUF3QjtBQUFBLElBQ3ZELDBCQUEwQixTQUFTO0FBQUEsSUFDbkMsaUJBQWlCLFNBQVM7QUFBQSxJQUMxQixNQUFNLFNBQVM7QUFBQSxJQUNmLHNCQUFzQixTQUFTO0FBQUEsSUFDL0Isb0NBQW9DLFNBQVM7QUFBQSxJQUM3QyxpQ0FBaUMsU0FBUztBQUFBLElBQzFDLGlDQUFpQyxTQUFTO0FBQUEsSUFDMUMsTUFBTTtBQUFBLEVBQ1IsQ0FBQztBQUNIO0FBV0EsU0FBUyxnQkFBZ0IsV0FBb0IsU0FBNEQ7QUFDdkcsTUFBSSxxQkFBcUIscUJBQXFCO0FBQzVDLFVBQU0sV0FBVyxVQUFVLHlCQUF5QjtBQUNwRCxRQUFJLFVBQVU7QUFDWixhQUFPLEVBQUUsTUFBTSxTQUFTLE1BQU0sTUFBTSxTQUFTLEtBQUs7QUFBQSxJQUNwRDtBQUFBLEVBQ0Y7QUFFQSxNQUFJLFNBQVMsU0FBUyxRQUFXO0FBQy9CLFdBQU8sRUFBRSxNQUFNLFFBQVEsUUFBUSxrQkFBa0IsTUFBTSxRQUFRLEtBQUs7QUFBQSxFQUN0RTtBQUVBLFFBQU0sSUFBSSxNQUFNLGlEQUFpRDtBQUNuRTtBQWFBLGVBQWUsZUFBZSxrQkFBOEQ7QUFDMUYsTUFBSSxDQUFDLG1CQUFtQixnQkFBZ0IsR0FBRztBQUN6QztBQUFBLEVBQ0Y7QUFFQSxNQUFJO0FBQ0YsVUFBTSxTQUFTLE1BQU0sbUJBQW1CO0FBQUEsTUFDdEMsc0JBQXNCLG9DQUFvQyxnQkFBZ0I7QUFBQSxJQUM1RSxDQUFDO0FBQ0QsUUFBSSxPQUFPLGVBQWUsS0FBSyxPQUFPLGNBQWMsR0FBRztBQUNyRDtBQUFBLFFBQ0UsMEJBQTBCLE9BQU8sT0FBTyxZQUFZLENBQUMsbURBQzdDLE9BQU8sT0FBTyxXQUFXLENBQUM7QUFBQSxNQUNwQztBQUFBLElBQ0Y7QUFBQSxFQUNGLFNBQVMsT0FBZ0I7QUFDdkIsUUFBSSxzREFBc0QsT0FBTyxLQUFLLENBQUMsRUFBRTtBQUFBLEVBQzNFO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|