@dbx-tools/search 0.6.107 → 0.6.111

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/lib/src/plugin.js CHANGED
@@ -1,40 +1,37 @@
1
1
  /**
2
- * AppKit plugin (registered name: `search`) that turns a Databricks AI
3
- * Search (Vector Search) index into a batteries-included search surface. It is
4
- * the "shortcut" half of this package: register it with nothing but an index
5
- * name and you get, all at once -
2
+ * AppKit extension plugin (registered name: `search`) around a sibling
3
+ * `aiSearch` provider. Native AppKit owns Vector Search query execution; this
4
+ * plugin adds the surfaces that remain useful across native and Lakebase
5
+ * providers:
6
6
  *
7
7
  * - a `search` / `universal_search` / (opt-in) `add_documents` tool set for
8
8
  * both Mastra and AppKit agents (autocomplete is a small-`limit` search);
9
- * - HTTP routes under `/api/search` a browser search box calls directly
9
+ * - compatibility and extension routes under `/api/search`
10
10
  * (`POST /` search, `POST /universal` federated, `GET /indexes` catalogue,
11
11
  * and `POST /documents` when writes are enabled);
12
12
  * - a `clientConfig()` payload so a UI knows the indexes, default, and page
13
13
  * size at boot with no round-trip;
14
14
  * - `exports()` so app code can `appkit.search.search(...)` directly.
15
15
  *
16
- * Everything runs under the caller's OBO identity (routes wrap in `asUser`),
17
- * so Unity Catalog ACLs on the index apply. Registering the plugin resolves
18
- * and logs the effective config (default index, known indexes, page size,
19
- * mode) so a misconfiguration shows up in the boot log rather than on the
20
- * first search.
16
+ * Vector Search reads delegate to the registered native AppKit `aiSearch`
17
+ * plugin, preserving its OBO, caching, reranking, and response handling. The
18
+ * alternative `lakebaseAiSearch` provider supplies the same query contract
19
+ * over PostgreSQL full-text search.
21
20
  *
22
21
  * @module
23
22
  */
24
- import { lakebase, Plugin, ResourceType, toPlugin, } from "@databricks/appkit";
25
- import { defineTool, executeFromRegistry, toolsFromRegistry, } from "@databricks/appkit/beta";
23
+ import { Plugin, toPlugin } from "@databricks/appkit";
24
+ import { aiSearch, defineTool, executeFromRegistry, toolsFromRegistry, } from "@databricks/appkit/beta";
26
25
  import { plugin as appkitPlugin } from "@dbx-tools/appkit";
27
26
  import { error as sharedError, log, string } from "@dbx-tools/shared-core";
28
27
  import { search as sharedSearch } from "@dbx-tools/shared-search";
29
- import { SEARCH_CONFIG_SCHEMA, DATABRICKS_INDEX_ENV, ENDPOINT_ENV, INDEX_ENV, resolveSearchConfig, } from "./config.js";
28
+ import { SEARCH_CONFIG_SCHEMA, resolveSearchConfig } from "./config.js";
30
29
  import { toCreateIndexOptions } from "./index-tools.js";
31
- import { LakebaseSearchBackend } from "./lakebase.js";
30
+ import { nativeAiSearchBackend } from "./native.js";
32
31
  import { toDocumentArray } from "./query.js";
33
32
  import { getSearchRuntime, resetSearchRuntime } from "./runtime.js";
34
33
  import { ADD_DOCUMENTS_TOOL_DESCRIPTION, CREATE_INDEX_TOOL_DESCRIPTION, SEARCH_TOOL_DESCRIPTION, SYNC_INDEX_TOOL_DESCRIPTION, UNIVERSAL_SEARCH_TOOL_DESCRIPTION, } from "./schema.js";
35
34
  const logger = log.logger("search");
36
- /** Mount-relative route (under `/api/search`) for a single-index search. */
37
- const SEARCH_ROUTE = "/";
38
35
  /** Mount-relative route for a universal (federated) search across indexes. */
39
36
  const UNIVERSAL_ROUTE = "/universal";
40
37
  /** Mount-relative route serving the index catalogue a search box reads. */
@@ -46,50 +43,31 @@ const INDEX_ROUTE = "/index";
46
43
  /** Mount-relative route for syncing a Delta Sync index from its source table. */
47
44
  const INDEX_SYNC_ROUTE = "/index/sync";
48
45
  /**
49
- * The AI Search index resource. Declared optional because the plugin is happy
50
- * with no default index (a caller can name one per request); it is promoted to
51
- * required once a deployment pins one. `SELECT` is the permission a query needs.
52
- */
53
- const INDEX_RESOURCE = {
54
- type: ResourceType.VECTOR_SEARCH_INDEX,
55
- alias: "AI Search Index",
56
- resourceKey: "search-index",
57
- description: "Databricks AI Search (Vector Search) index the app searches by default " +
58
- "(catalog.schema.index). Optional: a request may name any index the caller can read.",
59
- permission: "SELECT",
60
- fields: {
61
- name: {
62
- env: INDEX_ENV,
63
- description: `Default AI Search index. ${DATABRICKS_INDEX_ENV} is also honored.`,
64
- discovery: {
65
- type: "cli",
66
- cliCommand: "databricks vector-search-indexes list-indexes --endpoint-name <ENDPOINT> --output json",
67
- selectField: ".name",
68
- },
69
- },
70
- },
71
- };
72
- /**
73
- * AppKit plugin exposing AI Search as a search box, an agent tool set, and a
74
- * direct API.
46
+ * AppKit extension plugin for agent tools, federated search, and optional
47
+ * Vector Search lifecycle operations. Register `aiSearch()` or
48
+ * `lakebaseAiSearch()` before this plugin.
75
49
  *
76
50
  * @example
77
51
  * ```ts
78
52
  * import { createApp, server } from "@databricks/appkit";
53
+ * import { aiSearch } from "@databricks/appkit/beta";
79
54
  * import { plugin as searchPlugin } from "@dbx-tools/search";
80
55
  *
81
56
  * await createApp({
82
57
  * plugins: [
83
58
  * server(),
84
- * // zero-config: reads DATABRICKS_VECTOR_SEARCH_INDEX
85
- * searchPlugin.search(),
86
- * // or go deeper:
87
- * // searchPlugin.search({
88
- * // index: "main.support.docs",
89
- * // indexes: ["main.support.docs", "main.catalog.products"],
90
- * // columns: ["title", "url", "body"],
91
- * // mode: "hybrid",
92
- * // }),
59
+ * aiSearch({
60
+ * indexes: {
61
+ * docs: {
62
+ * indexName: "main.support.docs",
63
+ * columns: ["id", "title", "body"],
64
+ * },
65
+ * },
66
+ * }),
67
+ * searchPlugin.search({
68
+ * index: "main.support.docs",
69
+ * indexes: [{ name: "main.support.docs", alias: "docs" }],
70
+ * }),
93
71
  * ],
94
72
  * });
95
73
  * ```
@@ -103,7 +81,7 @@ export class SearchPlugin extends Plugin {
103
81
  stability: "beta",
104
82
  resources: {
105
83
  required: [],
106
- optional: [INDEX_RESOURCE],
84
+ optional: [],
107
85
  },
108
86
  config: { schema: SEARCH_CONFIG_SCHEMA },
109
87
  };
@@ -111,16 +89,6 @@ export class SearchPlugin extends Plugin {
111
89
  get basePath() {
112
90
  return `/api/${SearchPlugin.manifest.name}`;
113
91
  }
114
- /**
115
- * Promote the index to a required resource once a deployment pins a default,
116
- * through plugin config or either environment name.
117
- */
118
- static getResourceRequirements(config) {
119
- const pinned = string.trimToNull(config.index) ??
120
- string.trimToNull(process.env[INDEX_ENV]) ??
121
- string.trimToNull(process.env[DATABRICKS_INDEX_ENV]);
122
- return pinned === null ? [] : [{ ...INDEX_RESOURCE, required: true }];
123
- }
124
92
  /**
125
93
  * The tools this plugin offers to an AppKit agent. `search` /
126
94
  * `universal_search` are reads; `add_documents` / `create_index` /
@@ -129,7 +97,7 @@ export class SearchPlugin extends Plugin {
129
97
  * granted explicitly.
130
98
  */
131
99
  get tools() {
132
- const { config } = getSearchRuntime({ config: this.config });
100
+ const { config, readBackend } = getSearchRuntime({ config: this.config });
133
101
  const registry = {
134
102
  search: defineTool({
135
103
  description: SEARCH_TOOL_DESCRIPTION,
@@ -156,39 +124,37 @@ export class SearchPlugin extends Plugin {
156
124
  autoInheritable: false,
157
125
  execute: async (args, signal) => this.runAddDocuments(args, signal),
158
126
  });
159
- registry.create_index = defineTool({
160
- description: CREATE_INDEX_TOOL_DESCRIPTION,
161
- schema: sharedSearch.createIndexRequestSchema,
162
- annotations: { effect: "write", requiresUserContext: true },
163
- autoInheritable: false,
164
- execute: async (args, signal) => this.runCreateIndex(args, signal),
165
- });
166
- registry.sync_index = defineTool({
167
- description: SYNC_INDEX_TOOL_DESCRIPTION,
168
- schema: sharedSearch.syncIndexRequestSchema,
169
- annotations: { effect: "write", requiresUserContext: true },
170
- autoInheritable: false,
171
- execute: async (args, signal) => this.runSyncIndex(args, signal),
172
- });
127
+ if (readBackend?.supportsLifecycle) {
128
+ registry.create_index = defineTool({
129
+ description: CREATE_INDEX_TOOL_DESCRIPTION,
130
+ schema: sharedSearch.createIndexRequestSchema,
131
+ annotations: { effect: "write", requiresUserContext: true },
132
+ autoInheritable: false,
133
+ execute: async (args, signal) => this.runCreateIndex(args, signal),
134
+ });
135
+ registry.sync_index = defineTool({
136
+ description: SYNC_INDEX_TOOL_DESCRIPTION,
137
+ schema: sharedSearch.syncIndexRequestSchema,
138
+ annotations: { effect: "write", requiresUserContext: true },
139
+ autoInheritable: false,
140
+ execute: async (args, signal) => this.runSyncIndex(args, signal),
141
+ });
142
+ }
173
143
  }
174
144
  return registry;
175
145
  }
176
146
  /** Prime the shared runtime from config and log the effective policy at boot. */
177
147
  async setup() {
178
- // Choose a backend. Vector Search is primary; when NO Vector Search
179
- // endpoint is configured but the AppKit `lakebase` plugin is registered,
180
- // fall back to a Postgres full-text index. Both answer with the identical
181
- // shape, so this choice is invisible to tools, routes, and the UI.
182
- const lakebaseBackend = this.resolveLakebaseBackend();
148
+ const readBackend = this.resolveProviderBackend();
183
149
  // The runtime may already have been built (config-only) when `tools()` ran
184
150
  // during registration; rebuild it so it carries the chosen backend.
185
151
  resetSearchRuntime();
186
152
  const { config } = getSearchRuntime({
187
153
  config: this.config,
188
- ...(lakebaseBackend ? { lakebase: lakebaseBackend } : {}),
154
+ readBackend,
189
155
  });
190
156
  logger.info("ready", {
191
- backend: lakebaseBackend ? "lakebase" : "vector-search",
157
+ backend: readBackend.supportsLifecycle ? "appkit-ai-search" : "lakebase-ai-search",
192
158
  defaultIndex: config.defaultIndex ?? "(none - pass per request)",
193
159
  indexes: config.indexes.map((i) => i.alias),
194
160
  pageSize: config.pageSize,
@@ -201,34 +167,14 @@ export class SearchPlugin extends Plugin {
201
167
  });
202
168
  // Provision a real index in the BACKGROUND so a slow first-time endpoint or
203
169
  // index build never blocks the server from coming up.
204
- if (config.ensureOnSetup)
170
+ if (config.ensureOnSetup && readBackend.supportsLifecycle) {
205
171
  void this.runEnsureOnSetup(config);
172
+ }
206
173
  }
207
- /**
208
- * Build the Lakebase FALLBACK backend, or return `undefined` when Vector
209
- * Search should be used. Falls back only when there is NO Vector Search
210
- * endpoint configured (plugin config or `SEARCH_ENDPOINT` /
211
- * `DATABRICKS_VECTOR_SEARCH_ENDPOINT`) AND the sibling AppKit `lakebase`
212
- * plugin is registered. The pg pool is built from that plugin's
213
- * service-principal config exactly like `@dbx-tools/appkit-mastra`'s memory
214
- * pool - no auth is re-implemented here.
215
- */
216
- resolveLakebaseBackend() {
217
- const config = resolveSearchConfig(this.config);
218
- const hasEndpoint = config.endpoint !== undefined ||
219
- string.trimToNull(process.env[ENDPOINT_ENV]) !== null ||
220
- string.trimToNull(process.env.DATABRICKS_VECTOR_SEARCH_ENDPOINT) !== null;
221
- if (hasEndpoint)
222
- return undefined;
223
- const lake = appkitPlugin.instance(this.context, lakebase);
224
- if (!lake)
225
- return undefined;
226
- logger.info("backend-lakebase", {
227
- reason: "no Vector Search endpoint configured; using the Lakebase full-text fallback",
228
- });
229
- // `getPgConfig()` must be read OUTSIDE any asUser scope (as it is here at
230
- // setup) so it carries the SP connection target + token-refresh callback.
231
- return new LakebaseSearchBackend(() => lake.exports().getPgConfig());
174
+ /** Resolve the registered AppKit-compatible AI Search provider. */
175
+ resolveProviderBackend() {
176
+ const provider = appkitPlugin.require(this.context, aiSearch, this).exports();
177
+ return nativeAiSearchBackend(provider, resolveSearchConfig(this.config));
232
178
  }
233
179
  /**
234
180
  * Ensure the endpoint + index exist and seed them, honoring `ensureOnSetup`.
@@ -302,23 +248,10 @@ export class SearchPlugin extends Plugin {
302
248
  void this.shutdown();
303
249
  }
304
250
  /**
305
- * Mount the search routes under `/api/search`. Each is wrapped in
306
- * `asUser(req)` so the query runs as the requesting user and the index's
307
- * Unity Catalog ACLs apply. `GET /indexes` needs no user scope - it just
308
- * echoes the configured catalogue.
251
+ * Mount extension routes under `/api/search`. Single-index queries stay on
252
+ * the provider's native `/api/ai-search/:alias/query` surface.
309
253
  */
310
254
  injectRoutes(router) {
311
- this.route(router, {
312
- name: "search",
313
- method: "post",
314
- path: SEARCH_ROUTE,
315
- handler: async (req, res) => {
316
- await this.respond(res, "search", () => {
317
- const request = sharedSearch.searchRequestSchema.parse(req.body ?? {});
318
- return this.asUser(req).runSearch(request);
319
- });
320
- },
321
- });
322
255
  this.route(router, {
323
256
  name: "universalSearch",
324
257
  method: "post",
@@ -356,8 +289,8 @@ export class SearchPlugin extends Plugin {
356
289
  method: "post",
357
290
  path: INDEX_ROUTE,
358
291
  handler: async (req, res) => {
359
- const { config } = getSearchRuntime();
360
- if (!config.allowWrite) {
292
+ const { config, readBackend } = getSearchRuntime();
293
+ if (!config.allowWrite || !readBackend?.supportsLifecycle) {
361
294
  res.status(403).json({ error: "the index write surface is disabled" });
362
295
  return;
363
296
  }
@@ -369,8 +302,8 @@ export class SearchPlugin extends Plugin {
369
302
  method: "post",
370
303
  path: INDEX_SYNC_ROUTE,
371
304
  handler: async (req, res) => {
372
- const { config } = getSearchRuntime();
373
- if (!config.allowWrite) {
305
+ const { config, readBackend } = getSearchRuntime();
306
+ if (!config.allowWrite || !readBackend?.supportsLifecycle) {
374
307
  res.status(403).json({ error: "the index write surface is disabled" });
375
308
  return;
376
309
  }
@@ -503,4 +436,4 @@ export class SearchPlugin extends Plugin {
503
436
  * ```
504
437
  */
505
438
  export const search = toPlugin(SearchPlugin);
506
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFlBQVksRUFDWixRQUFRLEdBSVQsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixpQkFBaUIsR0FJbEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsTUFBTSxJQUFJLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sRUFBRSxLQUFLLElBQUksV0FBVyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsTUFBTSxJQUFJLFlBQVksRUFBMkIsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixZQUFZLEVBQ1osU0FBUyxFQUNULG1CQUFtQixHQUVwQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEUsT0FBTyxFQUNMLDhCQUE4QixFQUM5Qiw2QkFBNkIsRUFDN0IsdUJBQXVCLEVBQ3ZCLDJCQUEyQixFQUMzQixpQ0FBaUMsR0FDbEMsTUFBTSxhQUFhLENBQUM7QUFFckIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVwQyw0RUFBNEU7QUFD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QztRQUNqQixJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDdkMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLGdCQUFnQixFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTtnQkFDekMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNyRCxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzNELEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN0RSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZFLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDOUQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM3QixHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENB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QztJQUVPLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBYSxFQUFFLE1BQW9CO1FBQzVELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDekQsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNqQyxDQUFDOztBQUdIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IHBsdWdpbiAocmVnaXN0ZXJlZCBuYW1lOiBgc2VhcmNoYCkgdGhhdCB0dXJucyBhIERhdGFicmlja3MgQUlcbiAqIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXggaW50byBhIGJhdHRlcmllcy1pbmNsdWRlZCBzZWFyY2ggc3VyZmFjZS4gSXQgaXNcbiAqIHRoZSBcInNob3J0Y3V0XCIgaGFsZiBvZiB0aGlzIHBhY2thZ2U6IHJlZ2lzdGVyIGl0IHdpdGggbm90aGluZyBidXQgYW4gaW5kZXhcbiAqIG5hbWUgYW5kIHlvdSBnZXQsIGFsbCBhdCBvbmNlIC1cbiAqXG4gKiAgIC0gYSBgc2VhcmNoYCAvIGB1bml2ZXJzYWxfc2VhcmNoYCAvIChvcHQtaW4pIGBhZGRfZG9jdW1lbnRzYCB0b29sIHNldCBmb3JcbiAqICAgICBib3RoIE1hc3RyYSBhbmQgQXBwS2l0IGFnZW50cyAoYXV0b2NvbXBsZXRlIGlzIGEgc21hbGwtYGxpbWl0YCBzZWFyY2gpO1xuICogICAtIEhUVFAgcm91dGVzIHVuZGVyIGAvYXBpL3NlYXJjaGAgYSBicm93c2VyIHNlYXJjaCBib3ggY2FsbHMgZGlyZWN0bHlcbiAqICAgICAoYFBPU1QgL2Agc2VhcmNoLCBgUE9TVCAvdW5pdmVyc2FsYCBmZWRlcmF0ZWQsIGBHRVQgL2luZGV4ZXNgIGNhdGFsb2d1ZSxcbiAqICAgICBhbmQgYFBPU1QgL2RvY3VtZW50c2Agd2hlbiB3cml0ZXMgYXJlIGVuYWJsZWQpO1xuICogICAtIGEgYGNsaWVudENvbmZpZygpYCBwYXlsb2FkIHNvIGEgVUkga25vd3MgdGhlIGluZGV4ZXMsIGRlZmF1bHQsIGFuZCBwYWdlXG4gKiAgICAgc2l6ZSBhdCBib290IHdpdGggbm8gcm91bmQtdHJpcDtcbiAqICAgLSBgZXhwb3J0cygpYCBzbyBhcHAgY29kZSBjYW4gYGFwcGtpdC5zZWFyY2guc2VhcmNoKC4uLilgIGRpcmVjdGx5LlxuICpcbiAqIEV2ZXJ5dGhpbmcgcnVucyB1bmRlciB0aGUgY2FsbGVyJ3MgT0JPIGlkZW50aXR5IChyb3V0ZXMgd3JhcCBpbiBgYXNVc2VyYCksXG4gKiBzbyBVbml0eSBDYXRhbG9nIEFDTHMgb24gdGhlIGluZGV4IGFwcGx5LiBSZWdpc3RlcmluZyB0aGUgcGx1Z2luIHJlc29sdmVzXG4gKiBhbmQgbG9ncyB0aGUgZWZmZWN0aXZlIGNvbmZpZyAoZGVmYXVsdCBpbmRleCwga25vd24gaW5kZXhlcywgcGFnZSBzaXplLFxuICogbW9kZSkgc28gYSBtaXNjb25maWd1cmF0aW9uIHNob3dzIHVwIGluIHRoZSBib290IGxvZyByYXRoZXIgdGhhbiBvbiB0aGVcbiAqIGZpcnN0IHNlYXJjaC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgbGFrZWJhc2UsXG4gIFBsdWdpbixcbiAgUmVzb3VyY2VUeXBlLFxuICB0b1BsdWdpbixcbiAgdHlwZSBJQXBwUm91dGVyLFxuICB0eXBlIFBsdWdpbk1hbmlmZXN0LFxuICB0eXBlIFJlc291cmNlUmVxdWlyZW1lbnQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGRlZmluZVRvb2wsXG4gIGV4ZWN1dGVGcm9tUmVnaXN0cnksXG4gIHRvb2xzRnJvbVJlZ2lzdHJ5LFxuICB0eXBlIEFnZW50VG9vbERlZmluaXRpb24sXG4gIHR5cGUgVG9vbFByb3ZpZGVyLFxuICB0eXBlIFRvb2xSZWdpc3RyeSxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBwbHVnaW4gYXMgYXBwa2l0UGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBlcnJvciBhcyBzaGFyZWRFcnJvciwgbG9nLCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgc2VhcmNoIGFzIHNoYXJlZFNlYXJjaCwgdHlwZSBTZWFyY2hDbGllbnRDb25maWcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQge1xuICBTRUFSQ0hfQ09ORklHX1NDSEVNQSxcbiAgREFUQUJSSUNLU19JTkRFWF9FTlYsXG4gIEVORFBPSU5UX0VOVixcbiAgSU5ERVhfRU5WLFxuICByZXNvbHZlU2VhcmNoQ29uZmlnLFxuICB0eXBlIFNlYXJjaFBsdWdpbkNvbmZpZyxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyB0b0NyZWF0ZUluZGV4T3B0aW9ucyB9IGZyb20gXCIuL2luZGV4LXRvb2xzLnRzXCI7XG5pbXBvcnQgeyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQgfSBmcm9tIFwiLi9sYWtlYmFzZS50c1wiO1xuaW1wb3J0IHsgdG9Eb2N1bWVudEFycmF5IH0gZnJvbSBcIi4vcXVlcnkudHNcIjtcbmltcG9ydCB7IGdldFNlYXJjaFJ1bnRpbWUsIHJlc2V0U2VhcmNoUnVudGltZSB9IGZyb20gXCIuL3J1bnRpbWUudHNcIjtcbmltcG9ydCB7XG4gIEFERF9ET0NVTUVOVFNfVE9PTF9ERVNDUklQVElPTixcbiAgQ1JFQVRFX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gIFNFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICBTWU5DX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gIFVOSVZFUlNBTF9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbn0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJzZWFyY2hcIik7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSAodW5kZXIgYC9hcGkvc2VhcmNoYCkgZm9yIGEgc2luZ2xlLWluZGV4IHNlYXJjaC4gKi9cbmNvbnN0IFNFQVJDSF9ST1VURSA9IFwiL1wiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgZm9yIGEgdW5pdmVyc2FsIChmZWRlcmF0ZWQpIHNlYXJjaCBhY3Jvc3MgaW5kZXhlcy4gKi9cbmNvbnN0IFVOSVZFUlNBTF9ST1VURSA9IFwiL3VuaXZlcnNhbFwiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgc2VydmluZyB0aGUgaW5kZXggY2F0YWxvZ3VlIGEgc2VhcmNoIGJveCByZWFkcy4gKi9cbmNvbnN0IElOREVYRVNfUk9VVEUgPSBcIi9pbmRleGVzXCI7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBmb3IgYWRkaW5nIGRvY3VtZW50cyB0byBhIGRpcmVjdC1hY2Nlc3MgaW5kZXguICovXG5jb25zdCBET0NVTUVOVFNfUk9VVEUgPSBcIi9kb2N1bWVudHNcIjtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJvdXRlIGZvciBjcmVhdGluZyBhIFZlY3RvciBTZWFyY2ggaW5kZXguICovXG5jb25zdCBJTkRFWF9ST1VURSA9IFwiL2luZGV4XCI7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBmb3Igc3luY2luZyBhIERlbHRhIFN5bmMgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlLiAqL1xuY29uc3QgSU5ERVhfU1lOQ19ST1VURSA9IFwiL2luZGV4L3N5bmNcIjtcblxuLyoqXG4gKiBUaGUgQUkgU2VhcmNoIGluZGV4IHJlc291cmNlLiBEZWNsYXJlZCBvcHRpb25hbCBiZWNhdXNlIHRoZSBwbHVnaW4gaXMgaGFwcHlcbiAqIHdpdGggbm8gZGVmYXVsdCBpbmRleCAoYSBjYWxsZXIgY2FuIG5hbWUgb25lIHBlciByZXF1ZXN0KTsgaXQgaXMgcHJvbW90ZWQgdG9cbiAqIHJlcXVpcmVkIG9uY2UgYSBkZXBsb3ltZW50IHBpbnMgb25lLiBgU0VMRUNUYCBpcyB0aGUgcGVybWlzc2lvbiBhIHF1ZXJ5IG5lZWRzLlxuICovXG5jb25zdCBJTkRFWF9SRVNPVVJDRSA9IHtcbiAgdHlwZTogUmVzb3VyY2VUeXBlLlZFQ1RPUl9TRUFSQ0hfSU5ERVgsXG4gIGFsaWFzOiBcIkFJIFNlYXJjaCBJbmRleFwiLFxuICByZXNvdXJjZUtleTogXCJzZWFyY2gtaW5kZXhcIixcbiAgZGVzY3JpcHRpb246XG4gICAgXCJEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXggdGhlIGFwcCBzZWFyY2hlcyBieSBkZWZhdWx0IFwiICtcbiAgICBcIihjYXRhbG9nLnNjaGVtYS5pbmRleCkuIE9wdGlvbmFsOiBhIHJlcXVlc3QgbWF5IG5hbWUgYW55IGluZGV4IHRoZSBjYWxsZXIgY2FuIHJlYWQuXCIsXG4gIHBlcm1pc3Npb246IFwiU0VMRUNUXCIsXG4gIGZpZWxkczoge1xuICAgIG5hbWU6IHtcbiAgICAgIGVudjogSU5ERVhfRU5WLFxuICAgICAgZGVzY3JpcHRpb246IGBEZWZhdWx0IEFJIFNlYXJjaCBpbmRleC4gJHtEQVRBQlJJQ0tTX0lOREVYX0VOVn0gaXMgYWxzbyBob25vcmVkLmAsXG4gICAgICBkaXNjb3Zlcnk6IHtcbiAgICAgICAgdHlwZTogXCJjbGlcIixcbiAgICAgICAgY2xpQ29tbWFuZDpcbiAgICAgICAgICBcImRhdGFicmlja3MgdmVjdG9yLXNlYXJjaC1pbmRleGVzIGxpc3QtaW5kZXhlcyAtLWVuZHBvaW50LW5hbWUgPEVORFBPSU5UPiAtLW91dHB1dCBqc29uXCIsXG4gICAgICAgIHNlbGVjdEZpZWxkOiBcIi5uYW1lXCIsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IHNhdGlzZmllcyBPbWl0PFJlc291cmNlUmVxdWlyZW1lbnQsIFwicmVxdWlyZWRcIj47XG5cbi8qKlxuICogQXBwS2l0IHBsdWdpbiBleHBvc2luZyBBSSBTZWFyY2ggYXMgYSBzZWFyY2ggYm94LCBhbiBhZ2VudCB0b29sIHNldCwgYW5kIGFcbiAqIGRpcmVjdCBBUEkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIHNlcnZlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IHBsdWdpbiBhcyBzZWFyY2hQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9zZWFyY2hcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgLy8gemVyby1jb25maWc6IHJlYWRzIERBVEFCUklDS1NfVkVDVE9SX1NFQVJDSF9JTkRFWFxuICogICAgIHNlYXJjaFBsdWdpbi5zZWFyY2goKSxcbiAqICAgICAvLyBvciBnbyBkZWVwZXI6XG4gKiAgICAgLy8gc2VhcmNoUGx1Z2luLnNlYXJjaCh7XG4gKiAgICAgLy8gICBpbmRleDogXCJtYWluLnN1cHBvcnQuZG9jc1wiLFxuICogICAgIC8vICAgaW5kZXhlczogW1wibWFpbi5zdXBwb3J0LmRvY3NcIiwgXCJtYWluLmNhdGFsb2cucHJvZHVjdHNcIl0sXG4gKiAgICAgLy8gICBjb2x1bW5zOiBbXCJ0aXRsZVwiLCBcInVybFwiLCBcImJvZHlcIl0sXG4gKiAgICAgLy8gICBtb2RlOiBcImh5YnJpZFwiLFxuICogICAgIC8vIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaFBsdWdpbiBleHRlbmRzIFBsdWdpbjxTZWFyY2hQbHVnaW5Db25maWc+IGltcGxlbWVudHMgVG9vbFByb3ZpZGVyIHtcbiAgc3RhdGljIG1hbmlmZXN0ID0ge1xuICAgIG5hbWU6IFwic2VhcmNoXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiQUkgU2VhcmNoXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlNlYXJjaCBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXhlczogYWdlbnQgdG9vbHMsIEhUVFAgcm91dGVzIGZvciBhIFwiICtcbiAgICAgIFwic2VhcmNoIGJveCwgdW5pdmVyc2FsIHNlYXJjaCBhY3Jvc3MgaW5kZXhlcywgYW5kIGFuIG9wdC1pbiBkb2N1bWVudCB3cml0ZSBzdXJmYWNlLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW0lOREVYX1JFU09VUkNFXSxcbiAgICB9LFxuICAgIGNvbmZpZzogeyBzY2hlbWE6IFNFQVJDSF9DT05GSUdfU0NIRU1BIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk1hbmlmZXN0PFwic2VhcmNoXCI+O1xuXG4gIC8qKiBUaGUgYmFzZSBwYXRoIEFwcEtpdCBtb3VudHMgdGhpcyBwbHVnaW4ncyByb3V0ZXMgdW5kZXIuICovXG4gIHByaXZhdGUgZ2V0IGJhc2VQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvYXBpLyR7U2VhcmNoUGx1Z2luLm1hbmlmZXN0Lm5hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9tb3RlIHRoZSBpbmRleCB0byBhIHJlcXVpcmVkIHJlc291cmNlIG9uY2UgYSBkZXBsb3ltZW50IHBpbnMgYSBkZWZhdWx0LFxuICAgKiB0aHJvdWdoIHBsdWdpbiBjb25maWcgb3IgZWl0aGVyIGVudmlyb25tZW50IG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0UmVzb3VyY2VSZXF1aXJlbWVudHMoY29uZmlnOiBTZWFyY2hQbHVnaW5Db25maWcpOiBSZXNvdXJjZVJlcXVpcmVtZW50W10ge1xuICAgIGNvbnN0IHBpbm5lZCA9XG4gICAgICBzdHJpbmcudHJpbVRvTnVsbChjb25maWcuaW5kZXgpID8/XG4gICAgICBzdHJpbmcudHJpbVRvTnVsbChwcm9jZXNzLmVudltJTkRFWF9FTlZdKSA/P1xuICAgICAgc3RyaW5nLnRyaW1Ub051bGwocHJvY2Vzcy5lbnZbREFUQUJSSUNLU19JTkRFWF9FTlZdKTtcbiAgICByZXR1cm4gcGlubmVkID09PSBudWxsID8gW10gOiBbeyAuLi5JTkRFWF9SRVNPVVJDRSwgcmVxdWlyZWQ6IHRydWUgfV07XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRvb2xzIHRoaXMgcGx1Z2luIG9mZmVycyB0byBhbiBBcHBLaXQgYWdlbnQuIGBzZWFyY2hgIC9cbiAgICogYHVuaXZlcnNhbF9zZWFyY2hgIGFyZSByZWFkczsgYGFkZF9kb2N1bWVudHNgIC8gYGNyZWF0ZV9pbmRleGAgL1xuICAgKiBgc3luY19pbmRleGAgYXJlIG9ubHkgb2ZmZXJlZCB3aGVuIHRoZSB3cml0ZSBzdXJmYWNlIGlzIGVuYWJsZWQuIE5vbmUgaXNcbiAgICogYXV0b0luaGVyaXRhYmxlOiBldmVyeSB0b29sIHJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIGlkZW50aXR5LCBzbyBpdCBtdXN0IGJlXG4gICAqIGdyYW50ZWQgZXhwbGljaXRseS5cbiAgICovXG4gIHByaXZhdGUgZ2V0IHRvb2xzKCk6IFRvb2xSZWdpc3RyeSB7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoeyBjb25maWc6IHRoaXMuY29uZmlnIH0pO1xuICAgIGNvbnN0IHJlZ2lzdHJ5OiBUb29sUmVnaXN0cnkgPSB7XG4gICAgICBzZWFyY2g6IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2hhcmVkU2VhcmNoLnNlYXJjaFJlcXVlc3RTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJyZWFkXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5TZWFyY2goYXJncywgc2lnbmFsKSxcbiAgICAgIH0pLFxuICAgICAgdW5pdmVyc2FsX3NlYXJjaDogZGVmaW5lVG9vbCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBVTklWRVJTQUxfU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2hhcmVkU2VhcmNoLnVuaXZlcnNhbFNlYXJjaFJlcXVlc3RTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJyZWFkXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5Vbml2ZXJzYWxTZWFyY2goYXJncywgc2lnbmFsKSxcbiAgICAgIH0pLFxuICAgIH07XG4gICAgaWYgKGNvbmZpZy5hbGxvd1dyaXRlKSB7XG4gICAgICByZWdpc3RyeS5hZGRfZG9jdW1lbnRzID0gZGVmaW5lVG9vbCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBBRERfRE9DVU1FTlRTX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2hhcmVkU2VhcmNoLnNlYXJjaFJlcXVlc3RTY2hlbWFcbiAgICAgICAgICAucGljayh7IGluZGV4OiB0cnVlIH0pXG4gICAgICAgICAgLmV4dGVuZCh7IGRvY3VtZW50czogc2hhcmVkU2VhcmNoLnNlYXJjaERvY3VtZW50U2NoZW1hLmFycmF5KCkgfSksXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJ3cml0ZVwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuQWRkRG9jdW1lbnRzKGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KTtcbiAgICAgIHJlZ2lzdHJ5LmNyZWF0ZV9pbmRleCA9IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogQ1JFQVRFX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2hhcmVkU2VhcmNoLmNyZWF0ZUluZGV4UmVxdWVzdFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHsgZWZmZWN0OiBcIndyaXRlXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5DcmVhdGVJbmRleChhcmdzLCBzaWduYWwpLFxuICAgICAgfSk7XG4gICAgICByZWdpc3RyeS5zeW5jX2luZGV4ID0gZGVmaW5lVG9vbCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBTWU5DX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2hhcmVkU2VhcmNoLnN5bmNJbmRleFJlcXVlc3RTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJ3cml0ZVwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuU3luY0luZGV4KGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqIFByaW1lIHRoZSBzaGFyZWQgcnVudGltZSBmcm9tIGNvbmZpZyBhbmQgbG9nIHRoZSBlZmZlY3RpdmUgcG9saWN5IGF0IGJvb3QuICovXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENob29zZSBhIGJhY2tlbmQuIFZlY3RvciBTZWFyY2ggaXMgcHJpbWFyeTsgd2hlbiBOTyBWZWN0b3IgU2VhcmNoXG4gICAgLy8gZW5kcG9pbnQgaXMgY29uZmlndXJlZCBidXQgdGhlIEFwcEtpdCBgbGFrZWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkLFxuICAgIC8vIGZhbGwgYmFjayB0byBhIFBvc3RncmVzIGZ1bGwtdGV4dCBpbmRleC4gQm90aCBhbnN3ZXIgd2l0aCB0aGUgaWRlbnRpY2FsXG4gICAgLy8gc2hhcGUsIHNvIHRoaXMgY2hvaWNlIGlzIGludmlzaWJsZSB0byB0b29scywgcm91dGVzLCBhbmQgdGhlIFVJLlxuICAgIGNvbnN0IGxha2ViYXNlQmFja2VuZCA9IHRoaXMucmVzb2x2ZUxha2ViYXNlQmFja2VuZCgpO1xuICAgIC8vIFRoZSBydW50aW1lIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBidWlsdCAoY29uZmlnLW9ubHkpIHdoZW4gYHRvb2xzKClgIHJhblxuICAgIC8vIGR1cmluZyByZWdpc3RyYXRpb247IHJlYnVpbGQgaXQgc28gaXQgY2FycmllcyB0aGUgY2hvc2VuIGJhY2tlbmQuXG4gICAgcmVzZXRTZWFyY2hSdW50aW1lKCk7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoe1xuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIC4uLihsYWtlYmFzZUJhY2tlbmQgPyB7IGxha2ViYXNlOiBsYWtlYmFzZUJhY2tlbmQgfSA6IHt9KSxcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIGJhY2tlbmQ6IGxha2ViYXNlQmFja2VuZCA/IFwibGFrZWJhc2VcIiA6IFwidmVjdG9yLXNlYXJjaFwiLFxuICAgICAgZGVmYXVsdEluZGV4OiBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiKG5vbmUgLSBwYXNzIHBlciByZXF1ZXN0KVwiLFxuICAgICAgaW5kZXhlczogY29uZmlnLmluZGV4ZXMubWFwKChpKSA9PiBpLmFsaWFzKSxcbiAgICAgIHBhZ2VTaXplOiBjb25maWcucGFnZVNpemUsXG4gICAgICBtb2RlOiBjb25maWcubW9kZSxcbiAgICAgIGFsbG93V3JpdGU6IGNvbmZpZy5hbGxvd1dyaXRlLFxuICAgICAgYmFzZVBhdGg6IHRoaXMuYmFzZVBhdGgsXG4gICAgICBlbnN1cmVPblNldHVwOiBjb25maWcuZW5zdXJlT25TZXR1cFxuICAgICAgICA/IChjb25maWcuZW5zdXJlT25TZXR1cC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4KVxuICAgICAgICA6IFwib2ZmXCIsXG4gICAgfSk7XG4gICAgLy8gUHJvdmlzaW9uIGEgcmVhbCBpbmRleCBpbiB0aGUgQkFDS0dST1VORCBzbyBhIHNsb3cgZmlyc3QtdGltZSBlbmRwb2ludCBvclxuICAgIC8vIGluZGV4IGJ1aWxkIG5ldmVyIGJsb2NrcyB0aGUgc2VydmVyIGZyb20gY29taW5nIHVwLlxuICAgIGlmIChjb25maWcuZW5zdXJlT25TZXR1cCkgdm9pZCB0aGlzLnJ1bkVuc3VyZU9uU2V0dXAoY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgTGFrZWJhc2UgRkFMTEJBQ0sgYmFja2VuZCwgb3IgcmV0dXJuIGB1bmRlZmluZWRgIHdoZW4gVmVjdG9yXG4gICAqIFNlYXJjaCBzaG91bGQgYmUgdXNlZC4gRmFsbHMgYmFjayBvbmx5IHdoZW4gdGhlcmUgaXMgTk8gVmVjdG9yIFNlYXJjaFxuICAgKiBlbmRwb2ludCBjb25maWd1cmVkIChwbHVnaW4gY29uZmlnIG9yIGBTRUFSQ0hfRU5EUE9JTlRgIC9cbiAgICogYERBVEFCUklDS1NfVkVDVE9SX1NFQVJDSF9FTkRQT0lOVGApIEFORCB0aGUgc2libGluZyBBcHBLaXQgYGxha2ViYXNlYFxuICAgKiBwbHVnaW4gaXMgcmVnaXN0ZXJlZC4gVGhlIHBnIHBvb2wgaXMgYnVpbHQgZnJvbSB0aGF0IHBsdWdpbidzXG4gICAqIHNlcnZpY2UtcHJpbmNpcGFsIGNvbmZpZyBleGFjdGx5IGxpa2UgYEBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYWAncyBtZW1vcnlcbiAgICogcG9vbCAtIG5vIGF1dGggaXMgcmUtaW1wbGVtZW50ZWQgaGVyZS5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUxha2ViYXNlQmFja2VuZCgpOiBMYWtlYmFzZVNlYXJjaEJhY2tlbmQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvbmZpZyA9IHJlc29sdmVTZWFyY2hDb25maWcodGhpcy5jb25maWcpO1xuICAgIGNvbnN0IGhhc0VuZHBvaW50ID1cbiAgICAgIGNvbmZpZy5lbmRwb2ludCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBzdHJpbmcudHJpbVRvTnVsbChwcm9jZXNzLmVudltFTkRQT0lOVF9FTlZdKSAhPT0gbnVsbCB8fFxuICAgICAgc3RyaW5nLnRyaW1Ub051bGwocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19WRUNUT1JfU0VBUkNIX0VORFBPSU5UKSAhPT0gbnVsbDtcbiAgICBpZiAoaGFzRW5kcG9pbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGFrZSA9IGFwcGtpdFBsdWdpbi5pbnN0YW5jZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlKTtcbiAgICBpZiAoIWxha2UpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbG9nZ2VyLmluZm8oXCJiYWNrZW5kLWxha2ViYXNlXCIsIHtcbiAgICAgIHJlYXNvbjogXCJubyBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IGNvbmZpZ3VyZWQ7IHVzaW5nIHRoZSBMYWtlYmFzZSBmdWxsLXRleHQgZmFsbGJhY2tcIixcbiAgICB9KTtcbiAgICAvLyBgZ2V0UGdDb25maWcoKWAgbXVzdCBiZSByZWFkIE9VVFNJREUgYW55IGFzVXNlciBzY29wZSAoYXMgaXQgaXMgaGVyZSBhdFxuICAgIC8vIHNldHVwKSBzbyBpdCBjYXJyaWVzIHRoZSBTUCBjb25uZWN0aW9uIHRhcmdldCArIHRva2VuLXJlZnJlc2ggY2FsbGJhY2suXG4gICAgcmV0dXJuIG5ldyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQoKCkgPT4gbGFrZS5leHBvcnRzKCkuZ2V0UGdDb25maWcoKSk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIHRoZSBlbmRwb2ludCArIGluZGV4IGV4aXN0IGFuZCBzZWVkIHRoZW0sIGhvbm9yaW5nIGBlbnN1cmVPblNldHVwYC5cbiAgICogVXNlcyBib290LXRpbWUgU0RLIGF1dGggKGVudiAvIGNvbmZpZyBwcm9maWxlKSB2aWEgdGhlIGNsaWVudCdzXG4gICAqIG91dC1vZi1yZXF1ZXN0IGZhbGxiYWNrLiBGYWlsdXJlcyBhcmUgbG9nZ2VkLCBuZXZlciB0aHJvd24gLSBhIHNlYXJjaCBhcHBcbiAgICogc2hvdWxkIHN0aWxsIHN0YXJ0IGV2ZW4gaWYgcHJvdmlzaW9uaW5nIGlzIHNsb3cgb3IgYSBwZXJtaXNzaW9uIGlzIG1pc3NpbmcuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJ1bkVuc3VyZU9uU2V0dXAoXG4gICAgY29uZmlnOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRTZWFyY2hSdW50aW1lPltcImNvbmZpZ1wiXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3BlYyA9IGNvbmZpZy5lbnN1cmVPblNldHVwO1xuICAgIGlmICghc3BlYykgcmV0dXJuO1xuICAgIGNvbnN0IGluZGV4ID0gc3RyaW5nLnRyaW1Ub051bGwoc3BlYy5pbmRleCkgPz8gY29uZmlnLmRlZmF1bHRJbmRleDtcbiAgICBpZiAoIWluZGV4KSB7XG4gICAgICBsb2dnZXIud2FybihcImVuc3VyZS1za2lwcGVkXCIsIHtcbiAgICAgICAgcmVhc29uOiBcIm5vIGluZGV4IG5hbWUgKHNldCBgaW5kZXhgIG9yIGBlbnN1cmVPblNldHVwLmluZGV4YClcIixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkb2N1bWVudHMgPSBzcGVjLmRvY3VtZW50cyA/PyBbXTtcbiAgICAvLyBJbmZlciBhIG1hbmFnZWQtZGlyZWN0LWFjY2VzcyBzY2hlbWEgZnJvbSB0aGUgZmlyc3Qgc2VlZCByb3cgd2hlbiBub3QgZ2l2ZW4uXG4gICAgY29uc3Qgc2NoZW1hID1cbiAgICAgIHNwZWMuc2NoZW1hID8/XG4gICAgICAoZG9jdW1lbnRzLmxlbmd0aCA+IDAgJiYgIXNwZWMuc291cmNlVGFibGVcbiAgICAgICAgPyB0aGlzLmluZmVyU2NoZW1hKGRvY3VtZW50c1swXSwgc3BlYy5wcmltYXJ5S2V5ID8/IFwiaWRcIiwgc3BlYy50ZXh0Q29sdW1uID8/IFwidGV4dFwiKVxuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gICAgdHJ5IHtcbiAgICAgIGxvZ2dlci5pbmZvKFwiZW5zdXJlLXN0YXJ0XCIsIHsgaW5kZXggfSk7XG4gICAgICBjb25zdCB7IGNsaWVudCB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IGNsaWVudC5wcm92aXNpb24oaW5kZXgsIHtcbiAgICAgICAgLi4uKHNwZWMuZW5kcG9pbnQgPyB7IGVuZHBvaW50OiBzcGVjLmVuZHBvaW50IH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLnByaW1hcnlLZXkgPyB7IHByaW1hcnlLZXk6IHNwZWMucHJpbWFyeUtleSB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy50ZXh0Q29sdW1uID8geyBlbWJlZGRpbmdTb3VyY2VDb2x1bW46IHNwZWMudGV4dENvbHVtbiB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy5lbWJlZGRpbmdNb2RlbCA/IHsgZW1iZWRkaW5nTW9kZWw6IHNwZWMuZW1iZWRkaW5nTW9kZWwgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMuc291cmNlVGFibGUgPyB7IHNvdXJjZVRhYmxlOiBzcGVjLnNvdXJjZVRhYmxlIH0gOiB7fSksXG4gICAgICAgIC4uLihzY2hlbWEgPyB7IHNjaGVtYSB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy50aW1lb3V0TXMgPyB7IHRpbWVvdXRNczogc3BlYy50aW1lb3V0TXMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGRvY3VtZW50cy5sZW5ndGggPiAwID8geyBzZWVkOiBkb2N1bWVudHMgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLmluZm8oXCJlbnN1cmUtcmVhZHlcIiwge1xuICAgICAgICBpbmRleDogaW5mby5uYW1lLFxuICAgICAgICByZWFkeTogaW5mby5yZWFkeSxcbiAgICAgICAgcm93Q291bnQ6IGluZm8ucm93Q291bnQgPz8gMCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICBsb2dnZXIud2FybihcImVuc3VyZS1mYWlsZWRcIiwgeyBpbmRleCwgbWVzc2FnZTogc2hhcmVkRXJyb3IuZXJyb3JNZXNzYWdlKGNhdXNlKSB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgYSBWZWN0b3IgU2VhcmNoIGBzY2hlbWFfanNvbmAgbWFwIGZyb20gYSBzZWVkIGRvY3VtZW50J3MgdmFsdWUgdHlwZXMuICovXG4gIHByaXZhdGUgaW5mZXJTY2hlbWEoXG4gICAgZG9jOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBwcmltYXJ5S2V5OiBzdHJpbmcsXG4gICAgdGV4dENvbHVtbjogc3RyaW5nLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7IFtwcmltYXJ5S2V5XTogXCJzdHJpbmdcIiwgW3RleHRDb2x1bW5dOiBcInN0cmluZ1wiIH07XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZG9jKSkge1xuICAgICAgaWYgKGtleSBpbiBzY2hlbWEpIGNvbnRpbnVlO1xuICAgICAgc2NoZW1hW2tleV0gPVxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICA/IE51bWJlci5pc0ludGVnZXIodmFsdWUpXG4gICAgICAgICAgICA/IFwiaW50XCJcbiAgICAgICAgICAgIDogXCJkb3VibGVcIlxuICAgICAgICAgIDogdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIlxuICAgICAgICAgICAgPyBcImJvb2xlYW5cIlxuICAgICAgICAgICAgOiBcInN0cmluZ1wiO1xuICAgIH1cbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgLyoqIERyb3AgdGhlIHNoYXJlZCBydW50aW1lIHNvIGEgcmVzdGFydGVkIGFwcCByZS1yZXNvbHZlcyBjb25maWcuICovXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJlc2V0U2VhcmNoUnVudGltZSgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk6IHZvaWQge1xuICAgIHN1cGVyLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICAgIHZvaWQgdGhpcy5zaHV0ZG93bigpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSBzZWFyY2ggcm91dGVzIHVuZGVyIGAvYXBpL3NlYXJjaGAuIEVhY2ggaXMgd3JhcHBlZCBpblxuICAgKiBgYXNVc2VyKHJlcSlgIHNvIHRoZSBxdWVyeSBydW5zIGFzIHRoZSByZXF1ZXN0aW5nIHVzZXIgYW5kIHRoZSBpbmRleCdzXG4gICAqIFVuaXR5IENhdGFsb2cgQUNMcyBhcHBseS4gYEdFVCAvaW5kZXhlc2AgbmVlZHMgbm8gdXNlciBzY29wZSAtIGl0IGp1c3RcbiAgICogZWNob2VzIHRoZSBjb25maWd1cmVkIGNhdGFsb2d1ZS5cbiAgICovXG4gIG92ZXJyaWRlIGluamVjdFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJzZWFyY2hcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBTRUFSQ0hfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJzZWFyY2hcIiwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBzaGFyZWRTZWFyY2guc2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShyZXEuYm9keSA/PyB7fSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYXNVc2VyKHJlcSkucnVuU2VhcmNoKHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwidW5pdmVyc2FsU2VhcmNoXCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogVU5JVkVSU0FMX1JPVVRFLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVzcG9uZChyZXMsIFwidW5pdmVyc2FsU2VhcmNoXCIsICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc2hhcmVkU2VhcmNoLnVuaXZlcnNhbFNlYXJjaFJlcXVlc3RTY2hlbWEucGFyc2UocmVxLmJvZHkgPz8ge30pO1xuICAgICAgICAgIHJldHVybiB0aGlzLmFzVXNlcihyZXEpLnJ1blVuaXZlcnNhbFNlYXJjaChyZXF1ZXN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImluZGV4ZXNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IElOREVYRVNfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoX3JlcSwgcmVzKSA9PiB7XG4gICAgICAgIHJlcy5qc29uKHRoaXMuY2xpZW50Q29uZmlnKCkpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJkb2N1bWVudHNcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBET0NVTUVOVFNfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICAgICAgaWYgKCFjb25maWcuYWxsb3dXcml0ZSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwidGhlIGRvY3VtZW50IHdyaXRlIHN1cmZhY2UgaXMgZGlzYWJsZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJhZGREb2N1bWVudHNcIiwgKCkgPT5cbiAgICAgICAgICB0aGlzLmFzVXNlcihyZXEpLnJ1bkFkZERvY3VtZW50cyhyZXEuYm9keSA/PyB7fSksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImNyZWF0ZUluZGV4XCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogSU5ERVhfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICAgICAgaWYgKCFjb25maWcuYWxsb3dXcml0ZSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwidGhlIGluZGV4IHdyaXRlIHN1cmZhY2UgaXMgZGlzYWJsZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJjcmVhdGVJbmRleFwiLCAoKSA9PlxuICAgICAgICAgIHRoaXMuYXNVc2VyKHJlcSkucnVuQ3JlYXRlSW5kZXgocmVxLmJvZHkgPz8ge30pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJzeW5jSW5kZXhcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBJTkRFWF9TWU5DX1JPVVRFLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29uZmlnIH0gPSBnZXRTZWFyY2hSdW50aW1lKCk7XG4gICAgICAgIGlmICghY29uZmlnLmFsbG93V3JpdGUpIHtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwMykuanNvbih7IGVycm9yOiBcInRoZSBpbmRleCB3cml0ZSBzdXJmYWNlIGlzIGRpc2FibGVkXCIgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMucmVzcG9uZChyZXMsIFwic3luY0luZGV4XCIsICgpID0+IHRoaXMuYXNVc2VyKHJlcSkucnVuU3luY0luZGV4KHJlcS5ib2R5ID8/IHt9KSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBhIHJvdXRlIGJvZHksIHR1cm5pbmcgYSBmYWlsdXJlIGludG8gYSBKU09OIGVycm9yIHJlc3BvbnNlLlxuICAgKlxuICAgKiBBcHBLaXQncyBgcm91dGUoKWAgcmVnaXN0ZXJzIHRoZSBoYW5kbGVyIGFzLWlzLCBzbyBhIHJlamVjdGlvbiBlc2NhcGVzIGFzXG4gICAqIGFuIHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiBhbmQgdGFrZXMgdGhlIHdob2xlIHByb2Nlc3MgZG93biByYXRoZXIgdGhhblxuICAgKiBmYWlsaW5nIHRoZSBvbmUgcmVxdWVzdC4gRXZlcnkgcm91dGUgaGVyZSBnb2VzIHRocm91Z2ggdGhpcywgc28gYSBiYWQgaW5kZXhcbiAgICogbmFtZSBvciBhIFZlY3RvciBTZWFyY2ggQVBJIGVycm9yIHJldHVybnMgNTAwIHdpdGggYSBtZXNzYWdlIGluc3RlYWQgb2ZcbiAgICoga2lsbGluZyB0aGUgc2VydmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNwb25kKFxuICAgIHJlczogUGFyYW1ldGVyczxQYXJhbWV0ZXJzPElBcHBSb3V0ZXJbXCJwb3N0XCJdPlsxXT5bMV0sXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgcnVuOiAoKSA9PiBQcm9taXNlPHVua25vd24+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmVzLmpzb24oYXdhaXQgcnVuKCkpO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gc2hhcmVkRXJyb3IuZXJyb3JNZXNzYWdlKGNhdXNlKTtcbiAgICAgIGxvZ2dlci53YXJuKFwicm91dGUtZmFpbGVkXCIsIHsgb3BlcmF0aW9uLCBtZXNzYWdlIH0pO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogbWVzc2FnZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogU3VyZmFjZSB0aGUgaW5kZXggY2F0YWxvZ3VlICsgZGVmYXVsdHMgc28gYSBzZWFyY2ggYm94IG5lZWRzIG5vIHJvdW5kLXRyaXAuICovXG4gIG92ZXJyaWRlIGNsaWVudENvbmZpZygpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoeyBjb25maWc6IHRoaXMuY29uZmlnIH0pO1xuICAgIGNvbnN0IHBheWxvYWQ6IFNlYXJjaENsaWVudENvbmZpZyA9IHtcbiAgICAgIGluZGV4ZXM6IGNvbmZpZy5pbmRleGVzLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAgIG5hbWU6IGluZGV4Lm5hbWUsXG4gICAgICAgIGFsaWFzOiBpbmRleC5hbGlhcyxcbiAgICAgICAgLi4uKGluZGV4LnByaW1hcnlLZXkgPyB7IHByaW1hcnlLZXk6IGluZGV4LnByaW1hcnlLZXkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGluZGV4LmNvbHVtbnMgPyB7IGNvbHVtbnM6IGluZGV4LmNvbHVtbnMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGluZGV4Lm5hbWUgPT09IGNvbmZpZy5kZWZhdWx0SW5kZXggPyB7IGlzRGVmYXVsdDogdHJ1ZSB9IDoge30pLFxuICAgICAgfSkpLFxuICAgICAgLi4uKGNvbmZpZy5kZWZhdWx0SW5kZXggPyB7IGRlZmF1bHRJbmRleDogY29uZmlnLmRlZmF1bHRJbmRleCB9IDoge30pLFxuICAgICAgcGFnZVNpemU6IGNvbmZpZy5wYWdlU2l6ZSxcbiAgICAgIGJhc2VQYXRoOiB0aGlzLmJhc2VQYXRoLFxuICAgIH07XG4gICAgcmV0dXJuIHBheWxvYWQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIC8qKiBBcHBLaXQgYFRvb2xQcm92aWRlcmA6IHRoZSB0b29sIGRlZmluaXRpb25zIG9mZmVyZWQgdG8gYW4gYWdlbnQuICovXG4gIGdldEFnZW50VG9vbHMoKTogQWdlbnRUb29sRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gdG9vbHNGcm9tUmVnaXN0cnkodGhpcy50b29scyk7XG4gIH1cblxuICAvKiogQXBwS2l0IGBUb29sUHJvdmlkZXJgOiBydW4gb25lIHRvb2wgY2FsbCwgdmFsaWRhdGluZyBpbnB1dCBhZ2FpbnN0IGl0cyBzY2hlbWEuICovXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudFRvb2wobmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBleGVjdXRlRnJvbVJlZ2lzdHJ5KHRoaXMudG9vbHMsIG5hbWUsIGFyZ3MsIHNpZ25hbCk7XG4gIH1cblxuICBvdmVycmlkZSBleHBvcnRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvKiogU2VhcmNoIG9uZSBpbmRleCAoZGVmYXVsdCB3aGVuIG9taXR0ZWQpLiBSdW5zIGFzIHRoZSBjdXJyZW50IGNvbnRleHQgdXNlci4gKi9cbiAgICAgIHNlYXJjaDogKHJlcXVlc3Q6IHNoYXJlZFNlYXJjaC5TZWFyY2hSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5TZWFyY2gocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBTZWFyY2ggYWNyb3NzIGV2ZXJ5IGNvbmZpZ3VyZWQgaW5kZXggYW5kIG1lcmdlIHRoZSBoaXRzLiAqL1xuICAgICAgdW5pdmVyc2FsU2VhcmNoOiAocmVxdWVzdDogc2hhcmVkU2VhcmNoLlVuaXZlcnNhbFNlYXJjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1blVuaXZlcnNhbFNlYXJjaChyZXF1ZXN0LCBzaWduYWwpLFxuICAgICAgLyoqIEFkZCBvciB1cGRhdGUgZG9jdW1lbnRzIGluIGEgZGlyZWN0LWFjY2VzcyBpbmRleCAodGhyb3dzIHdoZW4gd3JpdGVzIGFyZSBkaXNhYmxlZCkuICovXG4gICAgICBhZGREb2N1bWVudHM6IChyZXF1ZXN0OiB7IGluZGV4Pzogc3RyaW5nOyBkb2N1bWVudHM6IHVua25vd24gfSwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuQWRkRG9jdW1lbnRzKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogQ3JlYXRlIGEgVmVjdG9yIFNlYXJjaCBpbmRleCAodGhyb3dzIHdoZW4gd3JpdGVzIGFyZSBkaXNhYmxlZCkuICovXG4gICAgICBjcmVhdGVJbmRleDogKHJlcXVlc3Q6IHNoYXJlZFNlYXJjaC5DcmVhdGVJbmRleFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1bkNyZWF0ZUluZGV4KHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogU3luYyBhIERlbHRhIFN5bmMgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlICh0aHJvd3Mgd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkKS4gKi9cbiAgICAgIHN5bmNJbmRleDogKHJlcXVlc3Q6IHNoYXJlZFNlYXJjaC5TeW5jSW5kZXhSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5TeW5jSW5kZXgocmVxdWVzdCwgc2lnbmFsKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5TZWFyY2goYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gc2hhcmVkU2VhcmNoLnNlYXJjaFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgY29uc3QgeyBjbGllbnQgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICByZXR1cm4gY2xpZW50LnNlYXJjaChyZXF1ZXN0LnF1ZXJ5LCB7XG4gICAgICAuLi4ocmVxdWVzdC5pbmRleCA/IHsgaW5kZXg6IHJlcXVlc3QuaW5kZXggfSA6IHt9KSxcbiAgICAgIC4uLihyZXF1ZXN0LmxpbWl0ID8geyBsaW1pdDogcmVxdWVzdC5saW1pdCB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3QubW9kZSA/IHsgbW9kZTogcmVxdWVzdC5tb2RlIH0gOiB7fSksXG4gICAgICAuLi4ocmVxdWVzdC5jb2x1bW5zID8geyBjb2x1bW5zOiByZXF1ZXN0LmNvbHVtbnMgfSA6IHt9KSxcbiAgICAgIC4uLihyZXF1ZXN0LmZpbHRlciA/IHsgZmlsdGVyOiByZXF1ZXN0LmZpbHRlciB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3Quc2NvcmVUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHsgc2NvcmVUaHJlc2hvbGQ6IHJlcXVlc3Quc2NvcmVUaHJlc2hvbGQgfSA6IHt9KSxcbiAgICAgIC4uLihzaWduYWwgPyB7IHNpZ25hbCB9IDoge30pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5Vbml2ZXJzYWxTZWFyY2goYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gc2hhcmVkU2VhcmNoLnVuaXZlcnNhbFNlYXJjaFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgY29uc3QgeyBjbGllbnQgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICByZXR1cm4gY2xpZW50LnVuaXZlcnNhbFNlYXJjaChyZXF1ZXN0LnF1ZXJ5LCB7XG4gICAgICAuLi4ocmVxdWVzdC5pbmRleGVzID8geyBpbmRleGVzOiByZXF1ZXN0LmluZGV4ZXMgfSA6IHt9KSxcbiAgICAgIC4uLihyZXF1ZXN0LmxpbWl0ID8geyBsaW1pdDogcmVxdWVzdC5saW1pdCB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3QubW9kZSA/IHsgbW9kZTogcmVxdWVzdC5tb2RlIH0gOiB7fSksXG4gICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuQWRkRG9jdW1lbnRzKGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVjb3JkID0gKGFyZ3MgPz8ge30pIGFzIHsgaW5kZXg/OiBzdHJpbmc7IGRvY3VtZW50czogdW5rbm93biB9O1xuICAgIGNvbnN0IHsgY2xpZW50LCBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICBjb25zdCBkb2N1bWVudHMgPSB0b0RvY3VtZW50QXJyYXkocmVjb3JkLmRvY3VtZW50cyk7XG4gICAgY29uc3QgaW5kZXggPSByZWNvcmQuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIlwiO1xuICAgIHJldHVybiBjbGllbnQuYWRkRG9jdW1lbnRzKGluZGV4LCBkb2N1bWVudHMsIHNpZ25hbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bkNyZWF0ZUluZGV4KGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNoYXJlZFNlYXJjaC5jcmVhdGVJbmRleFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgY29uc3QgeyBjbGllbnQgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICByZXR1cm4gY2xpZW50LmNyZWF0ZUluZGV4KHJlcXVlc3QubmFtZSwgdG9DcmVhdGVJbmRleE9wdGlvbnMocmVxdWVzdCwgc2lnbmFsKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blN5bmNJbmRleChhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBzaGFyZWRTZWFyY2guc3luY0luZGV4UmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCwgY29uZmlnIH0gPSBnZXRTZWFyY2hSdW50aW1lKCk7XG4gICAgY29uc3QgaW5kZXggPSByZXF1ZXN0LmluZGV4ID8/IGNvbmZpZy5kZWZhdWx0SW5kZXggPz8gXCJcIjtcbiAgICBhd2FpdCBjbGllbnQuc3luY0luZGV4KGluZGV4LCBzaWduYWwpO1xuICAgIHJldHVybiB7IGluZGV4LCBzeW5jZWQ6IHRydWUgfTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBBSSBTZWFyY2ggcGx1Z2luIHdpdGggQXBwS2l0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBwbHVnaW4gYXMgc2VhcmNoUGx1Z2luLCB0b29sIGFzIHNlYXJjaFRvb2xBcGkgfSBmcm9tIFwiQGRieC10b29scy9zZWFyY2hcIjtcbiAqIGltcG9ydCB7IGFnZW50cywgcGx1Z2luIGFzIG1hc3RyYVBsdWdpbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiBjb25zdCBzdXBwb3J0ID0gYWdlbnRzLmNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIkFuc3dlciBmcm9tIHRoZSBkb2NzOyB1c2UgYHNlYXJjaGAgdG8gZmluZCB0aGVtLlwiLFxuICogICB0b29sczogKCkgPT4gKHsgc2VhcmNoOiBzZWFyY2hUb29sQXBpLnNlYXJjaFRvb2woKSB9KSxcbiAqIH0pO1xuICpcbiAqIGF3YWl0IGNyZWF0ZUFwcCh7XG4gKiAgIHBsdWdpbnM6IFtcbiAqICAgICBzZXJ2ZXIoKSxcbiAqICAgICBzZWFyY2hQbHVnaW4uc2VhcmNoKHsgaW5kZXg6IFwibWFpbi5zdXBwb3J0LmRvY3NcIiB9KSxcbiAqICAgICBtYXN0cmFQbHVnaW4ubWFzdHJhKHsgYWdlbnRzOiBzdXBwb3J0IH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHNlYXJjaCA9IHRvUGx1Z2luKFNlYXJjaFBsdWdpbik7XG4iXX0=
439
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQXdDLE1BQU0sb0JBQW9CLENBQUM7QUFDNUYsT0FBTyxFQUNMLFFBQVEsRUFDUixVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLGlCQUFpQixHQUlsQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxNQUFNLElBQUksWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssSUFBSSxXQUFXLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzNFLE9BQU8sRUFBRSxNQUFNLElBQUksWUFBWSxFQUEyQixNQUFNLDBCQUEwQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxtQkFBbUIsRUFBMkIsTUFBTSxhQUFhLENBQUM7QUFDakcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDN0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BFLE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIsNkJBQTZCLEVBQzdCLHVCQUF1QixFQUN2QiwyQkFBMkIsRUFDM0IsaUNBQWlDLEdBQ2xDLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFcEMsOEVBQThFO0FBQzlFLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQztBQUVyQywyRUFBMkU7QUFD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TSxPQUFPLEdBQUcsWUFBWSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUN0QyxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFhLEVBQUUsTUFBb0I7UUFDNUQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDOUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUN6RCxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2pDLENBQUM7O0FBR0g7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgZXh0ZW5zaW9uIHBsdWdpbiAocmVnaXN0ZXJlZCBuYW1lOiBgc2VhcmNoYCkgYXJvdW5kIGEgc2libGluZ1xuICogYGFpU2VhcmNoYCBwcm92aWRlci4gTmF0aXZlIEFwcEtpdCBvd25zIFZlY3RvciBTZWFyY2ggcXVlcnkgZXhlY3V0aW9uOyB0aGlzXG4gKiBwbHVnaW4gYWRkcyB0aGUgc3VyZmFjZXMgdGhhdCByZW1haW4gdXNlZnVsIGFjcm9zcyBuYXRpdmUgYW5kIExha2ViYXNlXG4gKiBwcm92aWRlcnM6XG4gKlxuICogICAtIGEgYHNlYXJjaGAgLyBgdW5pdmVyc2FsX3NlYXJjaGAgLyAob3B0LWluKSBgYWRkX2RvY3VtZW50c2AgdG9vbCBzZXQgZm9yXG4gKiAgICAgYm90aCBNYXN0cmEgYW5kIEFwcEtpdCBhZ2VudHMgKGF1dG9jb21wbGV0ZSBpcyBhIHNtYWxsLWBsaW1pdGAgc2VhcmNoKTtcbiAqICAgLSBjb21wYXRpYmlsaXR5IGFuZCBleHRlbnNpb24gcm91dGVzIHVuZGVyIGAvYXBpL3NlYXJjaGBcbiAqICAgICAoYFBPU1QgL2Agc2VhcmNoLCBgUE9TVCAvdW5pdmVyc2FsYCBmZWRlcmF0ZWQsIGBHRVQgL2luZGV4ZXNgIGNhdGFsb2d1ZSxcbiAqICAgICBhbmQgYFBPU1QgL2RvY3VtZW50c2Agd2hlbiB3cml0ZXMgYXJlIGVuYWJsZWQpO1xuICogICAtIGEgYGNsaWVudENvbmZpZygpYCBwYXlsb2FkIHNvIGEgVUkga25vd3MgdGhlIGluZGV4ZXMsIGRlZmF1bHQsIGFuZCBwYWdlXG4gKiAgICAgc2l6ZSBhdCBib290IHdpdGggbm8gcm91bmQtdHJpcDtcbiAqICAgLSBgZXhwb3J0cygpYCBzbyBhcHAgY29kZSBjYW4gYGFwcGtpdC5zZWFyY2guc2VhcmNoKC4uLilgIGRpcmVjdGx5LlxuICpcbiAqIFZlY3RvciBTZWFyY2ggcmVhZHMgZGVsZWdhdGUgdG8gdGhlIHJlZ2lzdGVyZWQgbmF0aXZlIEFwcEtpdCBgYWlTZWFyY2hgXG4gKiBwbHVnaW4sIHByZXNlcnZpbmcgaXRzIE9CTywgY2FjaGluZywgcmVyYW5raW5nLCBhbmQgcmVzcG9uc2UgaGFuZGxpbmcuIFRoZVxuICogYWx0ZXJuYXRpdmUgYGxha2ViYXNlQWlTZWFyY2hgIHByb3ZpZGVyIHN1cHBsaWVzIHRoZSBzYW1lIHF1ZXJ5IGNvbnRyYWN0XG4gKiBvdmVyIFBvc3RncmVTUUwgZnVsbC10ZXh0IHNlYXJjaC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgUGx1Z2luLCB0b1BsdWdpbiwgdHlwZSBJQXBwUm91dGVyLCB0eXBlIFBsdWdpbk1hbmlmZXN0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgYWlTZWFyY2gsXG4gIGRlZmluZVRvb2wsXG4gIGV4ZWN1dGVGcm9tUmVnaXN0cnksXG4gIHRvb2xzRnJvbVJlZ2lzdHJ5LFxuICB0eXBlIEFnZW50VG9vbERlZmluaXRpb24sXG4gIHR5cGUgVG9vbFByb3ZpZGVyLFxuICB0eXBlIFRvb2xSZWdpc3RyeSxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBwbHVnaW4gYXMgYXBwa2l0UGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBlcnJvciBhcyBzaGFyZWRFcnJvciwgbG9nLCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgc2VhcmNoIGFzIHNoYXJlZFNlYXJjaCwgdHlwZSBTZWFyY2hDbGllbnRDb25maWcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQgeyBTRUFSQ0hfQ09ORklHX1NDSEVNQSwgcmVzb2x2ZVNlYXJjaENvbmZpZywgdHlwZSBTZWFyY2hQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IHRvQ3JlYXRlSW5kZXhPcHRpb25zIH0gZnJvbSBcIi4vaW5kZXgtdG9vbHMudHNcIjtcbmltcG9ydCB7IG5hdGl2ZUFpU2VhcmNoQmFja2VuZCB9IGZyb20gXCIuL25hdGl2ZS50c1wiO1xuaW1wb3J0IHsgdG9Eb2N1bWVudEFycmF5IH0gZnJvbSBcIi4vcXVlcnkudHNcIjtcbmltcG9ydCB7IGdldFNlYXJjaFJ1bnRpbWUsIHJlc2V0U2VhcmNoUnVudGltZSB9IGZyb20gXCIuL3J1bnRpbWUudHNcIjtcbmltcG9ydCB7XG4gIEFERF9ET0NVTUVOVFNfVE9PTF9ERVNDUklQVElPTixcbiAgQ1JFQVRFX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gIFNFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICBTWU5DX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gIFVOSVZFUlNBTF9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbn0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJzZWFyY2hcIik7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBmb3IgYSB1bml2ZXJzYWwgKGZlZGVyYXRlZCkgc2VhcmNoIGFjcm9zcyBpbmRleGVzLiAqL1xuY29uc3QgVU5JVkVSU0FMX1JPVVRFID0gXCIvdW5pdmVyc2FsXCI7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBzZXJ2aW5nIHRoZSBpbmRleCBjYXRhbG9ndWUgYSBzZWFyY2ggYm94IHJlYWRzLiAqL1xuY29uc3QgSU5ERVhFU19ST1VURSA9IFwiL2luZGV4ZXNcIjtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJvdXRlIGZvciBhZGRpbmcgZG9jdW1lbnRzIHRvIGEgZGlyZWN0LWFjY2VzcyBpbmRleC4gKi9cbmNvbnN0IERPQ1VNRU5UU19ST1VURSA9IFwiL2RvY3VtZW50c1wiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgZm9yIGNyZWF0aW5nIGEgVmVjdG9yIFNlYXJjaCBpbmRleC4gKi9cbmNvbnN0IElOREVYX1JPVVRFID0gXCIvaW5kZXhcIjtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJvdXRlIGZvciBzeW5jaW5nIGEgRGVsdGEgU3luYyBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUuICovXG5jb25zdCBJTkRFWF9TWU5DX1JPVVRFID0gXCIvaW5kZXgvc3luY1wiO1xuXG4vKipcbiAqIEFwcEtpdCBleHRlbnNpb24gcGx1Z2luIGZvciBhZ2VudCB0b29scywgZmVkZXJhdGVkIHNlYXJjaCwgYW5kIG9wdGlvbmFsXG4gKiBWZWN0b3IgU2VhcmNoIGxpZmVjeWNsZSBvcGVyYXRpb25zLiBSZWdpc3RlciBgYWlTZWFyY2goKWAgb3JcbiAqIGBsYWtlYmFzZUFpU2VhcmNoKClgIGJlZm9yZSB0aGlzIHBsdWdpbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgYWlTZWFyY2ggfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0L2JldGFcIjtcbiAqIGltcG9ydCB7IHBsdWdpbiBhcyBzZWFyY2hQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9zZWFyY2hcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgYWlTZWFyY2goe1xuICogICAgICAgaW5kZXhlczoge1xuICogICAgICAgICBkb2NzOiB7XG4gKiAgICAgICAgICAgaW5kZXhOYW1lOiBcIm1haW4uc3VwcG9ydC5kb2NzXCIsXG4gKiAgICAgICAgICAgY29sdW1uczogW1wiaWRcIiwgXCJ0aXRsZVwiLCBcImJvZHlcIl0sXG4gKiAgICAgICAgIH0sXG4gKiAgICAgICB9LFxuICogICAgIH0pLFxuICogICAgIHNlYXJjaFBsdWdpbi5zZWFyY2goe1xuICogICAgICAgaW5kZXg6IFwibWFpbi5zdXBwb3J0LmRvY3NcIixcbiAqICAgICAgIGluZGV4ZXM6IFt7IG5hbWU6IFwibWFpbi5zdXBwb3J0LmRvY3NcIiwgYWxpYXM6IFwiZG9jc1wiIH1dLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaFBsdWdpbiBleHRlbmRzIFBsdWdpbjxTZWFyY2hQbHVnaW5Db25maWc+IGltcGxlbWVudHMgVG9vbFByb3ZpZGVyIHtcbiAgc3RhdGljIG1hbmlmZXN0ID0ge1xuICAgIG5hbWU6IFwic2VhcmNoXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiQUkgU2VhcmNoXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlNlYXJjaCBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXhlczogYWdlbnQgdG9vbHMsIEhUVFAgcm91dGVzIGZvciBhIFwiICtcbiAgICAgIFwic2VhcmNoIGJveCwgdW5pdmVyc2FsIHNlYXJjaCBhY3Jvc3MgaW5kZXhlcywgYW5kIGFuIG9wdC1pbiBkb2N1bWVudCB3cml0ZSBzdXJmYWNlLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW10sXG4gICAgfSxcbiAgICBjb25maWc6IHsgc2NoZW1hOiBTRUFSQ0hfQ09ORklHX1NDSEVNQSB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDxcInNlYXJjaFwiPjtcblxuICAvKiogVGhlIGJhc2UgcGF0aCBBcHBLaXQgbW91bnRzIHRoaXMgcGx1Z2luJ3Mgcm91dGVzIHVuZGVyLiAqL1xuICBwcml2YXRlIGdldCBiYXNlUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgL2FwaS8ke1NlYXJjaFBsdWdpbi5tYW5pZmVzdC5uYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRvb2xzIHRoaXMgcGx1Z2luIG9mZmVycyB0byBhbiBBcHBLaXQgYWdlbnQuIGBzZWFyY2hgIC9cbiAgICogYHVuaXZlcnNhbF9zZWFyY2hgIGFyZSByZWFkczsgYGFkZF9kb2N1bWVudHNgIC8gYGNyZWF0ZV9pbmRleGAgL1xuICAgKiBgc3luY19pbmRleGAgYXJlIG9ubHkgb2ZmZXJlZCB3aGVuIHRoZSB3cml0ZSBzdXJmYWNlIGlzIGVuYWJsZWQuIE5vbmUgaXNcbiAgICogYXV0b0luaGVyaXRhYmxlOiBldmVyeSB0b29sIHJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIGlkZW50aXR5LCBzbyBpdCBtdXN0IGJlXG4gICAqIGdyYW50ZWQgZXhwbGljaXRseS5cbiAgICovXG4gIHByaXZhdGUgZ2V0IHRvb2xzKCk6IFRvb2xSZWdpc3RyeSB7XG4gICAgY29uc3QgeyBjb25maWcsIHJlYWRCYWNrZW5kIH0gPSBnZXRTZWFyY2hSdW50aW1lKHsgY29uZmlnOiB0aGlzLmNvbmZpZyB9KTtcbiAgICBjb25zdCByZWdpc3RyeTogVG9vbFJlZ2lzdHJ5ID0ge1xuICAgICAgc2VhcmNoOiBkZWZpbmVUb29sKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFNFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICBzY2hlbWE6IHNoYXJlZFNlYXJjaC5zZWFyY2hSZXF1ZXN0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwicmVhZFwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuU2VhcmNoKGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KSxcbiAgICAgIHVuaXZlcnNhbF9zZWFyY2g6IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogVU5JVkVSU0FMX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICBzY2hlbWE6IHNoYXJlZFNlYXJjaC51bml2ZXJzYWxTZWFyY2hSZXF1ZXN0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwicmVhZFwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuVW5pdmVyc2FsU2VhcmNoKGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KSxcbiAgICB9O1xuICAgIGlmIChjb25maWcuYWxsb3dXcml0ZSkge1xuICAgICAgcmVnaXN0cnkuYWRkX2RvY3VtZW50cyA9IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICBzY2hlbWE6IHNoYXJlZFNlYXJjaC5zZWFyY2hSZXF1ZXN0U2NoZW1hXG4gICAgICAgICAgLnBpY2soeyBpbmRleDogdHJ1ZSB9KVxuICAgICAgICAgIC5leHRlbmQoeyBkb2N1bWVudHM6IHNoYXJlZFNlYXJjaC5zZWFyY2hEb2N1bWVudFNjaGVtYS5hcnJheSgpIH0pLFxuICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwid3JpdGVcIiwgcmVxdWlyZXNVc2VyQ29udGV4dDogdHJ1ZSB9LFxuICAgICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnJ1bkFkZERvY3VtZW50cyhhcmdzLCBzaWduYWwpLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVhZEJhY2tlbmQ/LnN1cHBvcnRzTGlmZWN5Y2xlKSB7XG4gICAgICAgIHJlZ2lzdHJ5LmNyZWF0ZV9pbmRleCA9IGRlZmluZVRvb2woe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBDUkVBVEVfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgICAgICAgICBzY2hlbWE6IHNoYXJlZFNlYXJjaC5jcmVhdGVJbmRleFJlcXVlc3RTY2hlbWEsXG4gICAgICAgICAgYW5ub3RhdGlvbnM6IHsgZWZmZWN0OiBcIndyaXRlXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuQ3JlYXRlSW5kZXgoYXJncywgc2lnbmFsKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlZ2lzdHJ5LnN5bmNfaW5kZXggPSBkZWZpbmVUb29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogU1lOQ19JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICAgIHNjaGVtYTogc2hhcmVkU2VhcmNoLnN5bmNJbmRleFJlcXVlc3RTY2hlbWEsXG4gICAgICAgICAgYW5ub3RhdGlvbnM6IHsgZWZmZWN0OiBcIndyaXRlXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuU3luY0luZGV4KGFyZ3MsIHNpZ25hbCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVnaXN0cnk7XG4gIH1cblxuICAvKiogUHJpbWUgdGhlIHNoYXJlZCBydW50aW1lIGZyb20gY29uZmlnIGFuZCBsb2cgdGhlIGVmZmVjdGl2ZSBwb2xpY3kgYXQgYm9vdC4gKi9cbiAgb3ZlcnJpZGUgYXN5bmMgc2V0dXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVhZEJhY2tlbmQgPSB0aGlzLnJlc29sdmVQcm92aWRlckJhY2tlbmQoKTtcbiAgICAvLyBUaGUgcnVudGltZSBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gYnVpbHQgKGNvbmZpZy1vbmx5KSB3aGVuIGB0b29scygpYCByYW5cbiAgICAvLyBkdXJpbmcgcmVnaXN0cmF0aW9uOyByZWJ1aWxkIGl0IHNvIGl0IGNhcnJpZXMgdGhlIGNob3NlbiBiYWNrZW5kLlxuICAgIHJlc2V0U2VhcmNoUnVudGltZSgpO1xuICAgIGNvbnN0IHsgY29uZmlnIH0gPSBnZXRTZWFyY2hSdW50aW1lKHtcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICByZWFkQmFja2VuZCxcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIGJhY2tlbmQ6IHJlYWRCYWNrZW5kLnN1cHBvcnRzTGlmZWN5Y2xlID8gXCJhcHBraXQtYWktc2VhcmNoXCIgOiBcImxha2ViYXNlLWFpLXNlYXJjaFwiLFxuICAgICAgZGVmYXVsdEluZGV4OiBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiKG5vbmUgLSBwYXNzIHBlciByZXF1ZXN0KVwiLFxuICAgICAgaW5kZXhlczogY29uZmlnLmluZGV4ZXMubWFwKChpKSA9PiBpLmFsaWFzKSxcbiAgICAgIHBhZ2VTaXplOiBjb25maWcucGFnZVNpemUsXG4gICAgICBtb2RlOiBjb25maWcubW9kZSxcbiAgICAgIGFsbG93V3JpdGU6IGNvbmZpZy5hbGxvd1dyaXRlLFxuICAgICAgYmFzZVBhdGg6IHRoaXMuYmFzZVBhdGgsXG4gICAgICBlbnN1cmVPblNldHVwOiBjb25maWcuZW5zdXJlT25TZXR1cFxuICAgICAgICA/IChjb25maWcuZW5zdXJlT25TZXR1cC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4KVxuICAgICAgICA6IFwib2ZmXCIsXG4gICAgfSk7XG4gICAgLy8gUHJvdmlzaW9uIGEgcmVhbCBpbmRleCBpbiB0aGUgQkFDS0dST1VORCBzbyBhIHNsb3cgZmlyc3QtdGltZSBlbmRwb2ludCBvclxuICAgIC8vIGluZGV4IGJ1aWxkIG5ldmVyIGJsb2NrcyB0aGUgc2VydmVyIGZyb20gY29taW5nIHVwLlxuICAgIGlmIChjb25maWcuZW5zdXJlT25TZXR1cCAmJiByZWFkQmFja2VuZC5zdXBwb3J0c0xpZmVjeWNsZSkge1xuICAgICAgdm9pZCB0aGlzLnJ1bkVuc3VyZU9uU2V0dXAoY29uZmlnKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVzb2x2ZSB0aGUgcmVnaXN0ZXJlZCBBcHBLaXQtY29tcGF0aWJsZSBBSSBTZWFyY2ggcHJvdmlkZXIuICovXG4gIHByaXZhdGUgcmVzb2x2ZVByb3ZpZGVyQmFja2VuZCgpOiBSZXR1cm5UeXBlPHR5cGVvZiBuYXRpdmVBaVNlYXJjaEJhY2tlbmQ+IHtcbiAgICBjb25zdCBwcm92aWRlciA9IGFwcGtpdFBsdWdpbi5yZXF1aXJlKHRoaXMuY29udGV4dCwgYWlTZWFyY2gsIHRoaXMpLmV4cG9ydHMoKTtcbiAgICByZXR1cm4gbmF0aXZlQWlTZWFyY2hCYWNrZW5kKHByb3ZpZGVyLCByZXNvbHZlU2VhcmNoQ29uZmlnKHRoaXMuY29uZmlnKSk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIHRoZSBlbmRwb2ludCArIGluZGV4IGV4aXN0IGFuZCBzZWVkIHRoZW0sIGhvbm9yaW5nIGBlbnN1cmVPblNldHVwYC5cbiAgICogVXNlcyBib290LXRpbWUgU0RLIGF1dGggKGVudiAvIGNvbmZpZyBwcm9maWxlKSB2aWEgdGhlIGNsaWVudCdzXG4gICAqIG91dC1vZi1yZXF1ZXN0IGZhbGxiYWNrLiBGYWlsdXJlcyBhcmUgbG9nZ2VkLCBuZXZlciB0aHJvd24gLSBhIHNlYXJjaCBhcHBcbiAgICogc2hvdWxkIHN0aWxsIHN0YXJ0IGV2ZW4gaWYgcHJvdmlzaW9uaW5nIGlzIHNsb3cgb3IgYSBwZXJtaXNzaW9uIGlzIG1pc3NpbmcuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJ1bkVuc3VyZU9uU2V0dXAoXG4gICAgY29uZmlnOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRTZWFyY2hSdW50aW1lPltcImNvbmZpZ1wiXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3BlYyA9IGNvbmZpZy5lbnN1cmVPblNldHVwO1xuICAgIGlmICghc3BlYykgcmV0dXJuO1xuICAgIGNvbnN0IGluZGV4ID0gc3RyaW5nLnRyaW1Ub051bGwoc3BlYy5pbmRleCkgPz8gY29uZmlnLmRlZmF1bHRJbmRleDtcbiAgICBpZiAoIWluZGV4KSB7XG4gICAgICBsb2dnZXIud2FybihcImVuc3VyZS1za2lwcGVkXCIsIHtcbiAgICAgICAgcmVhc29uOiBcIm5vIGluZGV4IG5hbWUgKHNldCBgaW5kZXhgIG9yIGBlbnN1cmVPblNldHVwLmluZGV4YClcIixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkb2N1bWVudHMgPSBzcGVjLmRvY3VtZW50cyA/PyBbXTtcbiAgICAvLyBJbmZlciBhIG1hbmFnZWQtZGlyZWN0LWFjY2VzcyBzY2hlbWEgZnJvbSB0aGUgZmlyc3Qgc2VlZCByb3cgd2hlbiBub3QgZ2l2ZW4uXG4gICAgY29uc3Qgc2NoZW1hID1cbiAgICAgIHNwZWMuc2NoZW1hID8/XG4gICAgICAoZG9jdW1lbnRzLmxlbmd0aCA+IDAgJiYgIXNwZWMuc291cmNlVGFibGVcbiAgICAgICAgPyB0aGlzLmluZmVyU2NoZW1hKGRvY3VtZW50c1swXSwgc3BlYy5wcmltYXJ5S2V5ID8/IFwiaWRcIiwgc3BlYy50ZXh0Q29sdW1uID8/IFwidGV4dFwiKVxuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gICAgdHJ5IHtcbiAgICAgIGxvZ2dlci5pbmZvKFwiZW5zdXJlLXN0YXJ0XCIsIHsgaW5kZXggfSk7XG4gICAgICBjb25zdCB7IGNsaWVudCB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IGNsaWVudC5wcm92aXNpb24oaW5kZXgsIHtcbiAgICAgICAgLi4uKHNwZWMuZW5kcG9pbnQgPyB7IGVuZHBvaW50OiBzcGVjLmVuZHBvaW50IH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLnByaW1hcnlLZXkgPyB7IHByaW1hcnlLZXk6IHNwZWMucHJpbWFyeUtleSB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy50ZXh0Q29sdW1uID8geyBlbWJlZGRpbmdTb3VyY2VDb2x1bW46IHNwZWMudGV4dENvbHVtbiB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy5lbWJlZGRpbmdNb2RlbCA/IHsgZW1iZWRkaW5nTW9kZWw6IHNwZWMuZW1iZWRkaW5nTW9kZWwgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMuc291cmNlVGFibGUgPyB7IHNvdXJjZVRhYmxlOiBzcGVjLnNvdXJjZVRhYmxlIH0gOiB7fSksXG4gICAgICAgIC4uLihzY2hlbWEgPyB7IHNjaGVtYSB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy50aW1lb3V0TXMgPyB7IHRpbWVvdXRNczogc3BlYy50aW1lb3V0TXMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGRvY3VtZW50cy5sZW5ndGggPiAwID8geyBzZWVkOiBkb2N1bWVudHMgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLmluZm8oXCJlbnN1cmUtcmVhZHlcIiwge1xuICAgICAgICBpbmRleDogaW5mby5uYW1lLFxuICAgICAgICByZWFkeTogaW5mby5yZWFkeSxcbiAgICAgICAgcm93Q291bnQ6IGluZm8ucm93Q291bnQgPz8gMCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICBsb2dnZXIud2FybihcImVuc3VyZS1mYWlsZWRcIiwgeyBpbmRleCwgbWVzc2FnZTogc2hhcmVkRXJyb3IuZXJyb3JNZXNzYWdlKGNhdXNlKSB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgYSBWZWN0b3IgU2VhcmNoIGBzY2hlbWFfanNvbmAgbWFwIGZyb20gYSBzZWVkIGRvY3VtZW50J3MgdmFsdWUgdHlwZXMuICovXG4gIHByaXZhdGUgaW5mZXJTY2hlbWEoXG4gICAgZG9jOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBwcmltYXJ5S2V5OiBzdHJpbmcsXG4gICAgdGV4dENvbHVtbjogc3RyaW5nLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7IFtwcmltYXJ5S2V5XTogXCJzdHJpbmdcIiwgW3RleHRDb2x1bW5dOiBcInN0cmluZ1wiIH07XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZG9jKSkge1xuICAgICAgaWYgKGtleSBpbiBzY2hlbWEpIGNvbnRpbnVlO1xuICAgICAgc2NoZW1hW2tleV0gPVxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICA/IE51bWJlci5pc0ludGVnZXIodmFsdWUpXG4gICAgICAgICAgICA/IFwiaW50XCJcbiAgICAgICAgICAgIDogXCJkb3VibGVcIlxuICAgICAgICAgIDogdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIlxuICAgICAgICAgICAgPyBcImJvb2xlYW5cIlxuICAgICAgICAgICAgOiBcInN0cmluZ1wiO1xuICAgIH1cbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgLyoqIERyb3AgdGhlIHNoYXJlZCBydW50aW1lIHNvIGEgcmVzdGFydGVkIGFwcCByZS1yZXNvbHZlcyBjb25maWcuICovXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJlc2V0U2VhcmNoUnVudGltZSgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk6IHZvaWQge1xuICAgIHN1cGVyLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICAgIHZvaWQgdGhpcy5zaHV0ZG93bigpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IGV4dGVuc2lvbiByb3V0ZXMgdW5kZXIgYC9hcGkvc2VhcmNoYC4gU2luZ2xlLWluZGV4IHF1ZXJpZXMgc3RheSBvblxuICAgKiB0aGUgcHJvdmlkZXIncyBuYXRpdmUgYC9hcGkvYWktc2VhcmNoLzphbGlhcy9xdWVyeWAgc3VyZmFjZS5cbiAgICovXG4gIG92ZXJyaWRlIGluamVjdFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJ1bml2ZXJzYWxTZWFyY2hcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBVTklWRVJTQUxfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJ1bml2ZXJzYWxTZWFyY2hcIiwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBzaGFyZWRTZWFyY2gudW5pdmVyc2FsU2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShyZXEuYm9keSA/PyB7fSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYXNVc2VyKHJlcSkucnVuVW5pdmVyc2FsU2VhcmNoKHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiaW5kZXhlc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogSU5ERVhFU19ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChfcmVxLCByZXMpID0+IHtcbiAgICAgICAgcmVzLmpzb24odGhpcy5jbGllbnRDb25maWcoKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImRvY3VtZW50c1wiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IERPQ1VNRU5UU19ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmZpZyB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgICAgICBpZiAoIWNvbmZpZy5hbGxvd1dyaXRlKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDMpLmpzb24oeyBlcnJvcjogXCJ0aGUgZG9jdW1lbnQgd3JpdGUgc3VyZmFjZSBpcyBkaXNhYmxlZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlc3BvbmQocmVzLCBcImFkZERvY3VtZW50c1wiLCAoKSA9PlxuICAgICAgICAgIHRoaXMuYXNVc2VyKHJlcSkucnVuQWRkRG9jdW1lbnRzKHJlcS5ib2R5ID8/IHt9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiY3JlYXRlSW5kZXhcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBJTkRFWF9ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmZpZywgcmVhZEJhY2tlbmQgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICAgICAgaWYgKCFjb25maWcuYWxsb3dXcml0ZSB8fCAhcmVhZEJhY2tlbmQ/LnN1cHBvcnRzTGlmZWN5Y2xlKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDMpLmpzb24oeyBlcnJvcjogXCJ0aGUgaW5kZXggd3JpdGUgc3VyZmFjZSBpcyBkaXNhYmxlZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlc3BvbmQocmVzLCBcImNyZWF0ZUluZGV4XCIsICgpID0+XG4gICAgICAgICAgdGhpcy5hc1VzZXIocmVxKS5ydW5DcmVhdGVJbmRleChyZXEuYm9keSA/PyB7fSksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcInN5bmNJbmRleFwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IElOREVYX1NZTkNfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25maWcsIHJlYWRCYWNrZW5kIH0gPSBnZXRTZWFyY2hSdW50aW1lKCk7XG4gICAgICAgIGlmICghY29uZmlnLmFsbG93V3JpdGUgfHwgIXJlYWRCYWNrZW5kPy5zdXBwb3J0c0xpZmVjeWNsZSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwidGhlIGluZGV4IHdyaXRlIHN1cmZhY2UgaXMgZGlzYWJsZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJzeW5jSW5kZXhcIiwgKCkgPT4gdGhpcy5hc1VzZXIocmVxKS5ydW5TeW5jSW5kZXgocmVxLmJvZHkgPz8ge30pKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGEgcm91dGUgYm9keSwgdHVybmluZyBhIGZhaWx1cmUgaW50byBhIEpTT04gZXJyb3IgcmVzcG9uc2UuXG4gICAqXG4gICAqIEFwcEtpdCdzIGByb3V0ZSgpYCByZWdpc3RlcnMgdGhlIGhhbmRsZXIgYXMtaXMsIHNvIGEgcmVqZWN0aW9uIGVzY2FwZXMgYXNcbiAgICogYW4gdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIGFuZCB0YWtlcyB0aGUgd2hvbGUgcHJvY2VzcyBkb3duIHJhdGhlciB0aGFuXG4gICAqIGZhaWxpbmcgdGhlIG9uZSByZXF1ZXN0LiBFdmVyeSByb3V0ZSBoZXJlIGdvZXMgdGhyb3VnaCB0aGlzLCBzbyBhIGJhZCBpbmRleFxuICAgKiBuYW1lIG9yIGEgVmVjdG9yIFNlYXJjaCBBUEkgZXJyb3IgcmV0dXJucyA1MDAgd2l0aCBhIG1lc3NhZ2UgaW5zdGVhZCBvZlxuICAgKiBraWxsaW5nIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc3BvbmQoXG4gICAgcmVzOiBQYXJhbWV0ZXJzPFBhcmFtZXRlcnM8SUFwcFJvdXRlcltcInBvc3RcIl0+WzFdPlsxXSxcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBydW46ICgpID0+IFByb21pc2U8dW5rbm93bj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXMuanNvbihhd2FpdCBydW4oKSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBzaGFyZWRFcnJvci5lcnJvck1lc3NhZ2UoY2F1c2UpO1xuICAgICAgbG9nZ2VyLndhcm4oXCJyb3V0ZS1mYWlsZWRcIiwgeyBvcGVyYXRpb24sIG1lc3NhZ2UgfSk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiBtZXNzYWdlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTdXJmYWNlIHRoZSBpbmRleCBjYXRhbG9ndWUgKyBkZWZhdWx0cyBzbyBhIHNlYXJjaCBib3ggbmVlZHMgbm8gcm91bmQtdHJpcC4gKi9cbiAgb3ZlcnJpZGUgY2xpZW50Q29uZmlnKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCB7IGNvbmZpZyB9ID0gZ2V0U2VhcmNoUnVudGltZSh7IGNvbmZpZzogdGhpcy5jb25maWcgfSk7XG4gICAgY29uc3QgcGF5bG9hZDogU2VhcmNoQ2xpZW50Q29uZmlnID0ge1xuICAgICAgaW5kZXhlczogY29uZmlnLmluZGV4ZXMubWFwKChpbmRleCkgPT4gKHtcbiAgICAgICAgbmFtZTogaW5kZXgubmFtZSxcbiAgICAgICAgYWxpYXM6IGluZGV4LmFsaWFzLFxuICAgICAgICAuLi4oaW5kZXgucHJpbWFyeUtleSA/IHsgcHJpbWFyeUtleTogaW5kZXgucHJpbWFyeUtleSB9IDoge30pLFxuICAgICAgICAuLi4oaW5kZXguY29sdW1ucyA/IHsgY29sdW1uczogaW5kZXguY29sdW1ucyB9IDoge30pLFxuICAgICAgICAuLi4oaW5kZXgubmFtZSA9PT0gY29uZmlnLmRlZmF1bHRJbmRleCA/IHsgaXNEZWZhdWx0OiB0cnVlIH0gOiB7fSksXG4gICAgICB9KSksXG4gICAgICAuLi4oY29uZmlnLmRlZmF1bHRJbmRleCA/IHsgZGVmYXVsdEluZGV4OiBjb25maWcuZGVmYXVsdEluZGV4IH0gOiB7fSksXG4gICAgICBwYWdlU2l6ZTogY29uZmlnLnBhZ2VTaXplLFxuICAgICAgYmFzZVBhdGg6IHRoaXMuYmFzZVBhdGgsXG4gICAgfTtcbiAgICByZXR1cm4gcGF5bG9hZCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgLyoqIEFwcEtpdCBgVG9vbFByb3ZpZGVyYDogdGhlIHRvb2wgZGVmaW5pdGlvbnMgb2ZmZXJlZCB0byBhbiBhZ2VudC4gKi9cbiAgZ2V0QWdlbnRUb29scygpOiBBZ2VudFRvb2xEZWZpbml0aW9uW10ge1xuICAgIHJldHVybiB0b29sc0Zyb21SZWdpc3RyeSh0aGlzLnRvb2xzKTtcbiAgfVxuXG4gIC8qKiBBcHBLaXQgYFRvb2xQcm92aWRlcmA6IHJ1biBvbmUgdG9vbCBjYWxsLCB2YWxpZGF0aW5nIGlucHV0IGFnYWluc3QgaXRzIHNjaGVtYS4gKi9cbiAgYXN5bmMgZXhlY3V0ZUFnZW50VG9vbChuYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGV4ZWN1dGVGcm9tUmVnaXN0cnkodGhpcy50b29scywgbmFtZSwgYXJncywgc2lnbmFsKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKiBTZWFyY2ggb25lIGluZGV4IChkZWZhdWx0IHdoZW4gb21pdHRlZCkuIFJ1bnMgYXMgdGhlIGN1cnJlbnQgY29udGV4dCB1c2VyLiAqL1xuICAgICAgc2VhcmNoOiAocmVxdWVzdDogc2hhcmVkU2VhcmNoLlNlYXJjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1blNlYXJjaChyZXF1ZXN0LCBzaWduYWwpLFxuICAgICAgLyoqIFNlYXJjaCBhY3Jvc3MgZXZlcnkgY29uZmlndXJlZCBpbmRleCBhbmQgbWVyZ2UgdGhlIGhpdHMuICovXG4gICAgICB1bml2ZXJzYWxTZWFyY2g6IChyZXF1ZXN0OiBzaGFyZWRTZWFyY2guVW5pdmVyc2FsU2VhcmNoUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuVW5pdmVyc2FsU2VhcmNoKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogQWRkIG9yIHVwZGF0ZSBkb2N1bWVudHMgaW4gYSBkaXJlY3QtYWNjZXNzIGluZGV4ICh0aHJvd3Mgd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkKS4gKi9cbiAgICAgIGFkZERvY3VtZW50czogKHJlcXVlc3Q6IHsgaW5kZXg/OiBzdHJpbmc7IGRvY3VtZW50czogdW5rbm93biB9LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5BZGREb2N1bWVudHMocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBDcmVhdGUgYSBWZWN0b3IgU2VhcmNoIGluZGV4ICh0aHJvd3Mgd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkKS4gKi9cbiAgICAgIGNyZWF0ZUluZGV4OiAocmVxdWVzdDogc2hhcmVkU2VhcmNoLkNyZWF0ZUluZGV4UmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuQ3JlYXRlSW5kZXgocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBTeW5jIGEgRGVsdGEgU3luYyBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUgKHRocm93cyB3aGVuIHdyaXRlcyBhcmUgZGlzYWJsZWQpLiAqL1xuICAgICAgc3luY0luZGV4OiAocmVxdWVzdDogc2hhcmVkU2VhcmNoLlN5bmNJbmRleFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1blN5bmNJbmRleChyZXF1ZXN0LCBzaWduYWwpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blNlYXJjaChhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBzaGFyZWRTZWFyY2guc2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgIHJldHVybiBjbGllbnQuc2VhcmNoKHJlcXVlc3QucXVlcnksIHtcbiAgICAgIC4uLihyZXF1ZXN0LmluZGV4ID8geyBpbmRleDogcmVxdWVzdC5pbmRleCB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3QubGltaXQgPyB7IGxpbWl0OiByZXF1ZXN0LmxpbWl0IH0gOiB7fSksXG4gICAgICAuLi4ocmVxdWVzdC5tb2RlID8geyBtb2RlOiByZXF1ZXN0Lm1vZGUgfSA6IHt9KSxcbiAgICAgIC4uLihyZXF1ZXN0LmNvbHVtbnMgPyB7IGNvbHVtbnM6IHJlcXVlc3QuY29sdW1ucyB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3QuZmlsdGVyID8geyBmaWx0ZXI6IHJlcXVlc3QuZmlsdGVyIH0gOiB7fSksXG4gICAgICAuLi4ocmVxdWVzdC5zY29yZVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkID8geyBzY29yZVRocmVzaG9sZDogcmVxdWVzdC5zY29yZVRocmVzaG9sZCB9IDoge30pLFxuICAgICAgLi4uKHNpZ25hbCA/IHsgc2lnbmFsIH0gOiB7fSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blVuaXZlcnNhbFNlYXJjaChhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBzaGFyZWRTZWFyY2gudW5pdmVyc2FsU2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgIHJldHVybiBjbGllbnQudW5pdmVyc2FsU2VhcmNoKHJlcXVlc3QucXVlcnksIHtcbiAgICAgIC4uLihyZXF1ZXN0LmluZGV4ZXMgPyB7IGluZGV4ZXM6IHJlcXVlc3QuaW5kZXhlcyB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3QubGltaXQgPyB7IGxpbWl0OiByZXF1ZXN0LmxpbWl0IH0gOiB7fSksXG4gICAgICAuLi4ocmVxdWVzdC5tb2RlID8geyBtb2RlOiByZXF1ZXN0Lm1vZGUgfSA6IHt9KSxcbiAgICAgIC4uLihzaWduYWwgPyB7IHNpZ25hbCB9IDoge30pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5BZGREb2N1bWVudHMoYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZWNvcmQgPSAoYXJncyA/PyB7fSkgYXMgeyBpbmRleD86IHN0cmluZzsgZG9jdW1lbnRzOiB1bmtub3duIH07XG4gICAgY29uc3QgeyBjbGllbnQsIGNvbmZpZyB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgIGNvbnN0IGRvY3VtZW50cyA9IHRvRG9jdW1lbnRBcnJheShyZWNvcmQuZG9jdW1lbnRzKTtcbiAgICBjb25zdCBpbmRleCA9IHJlY29yZC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiXCI7XG4gICAgcmV0dXJuIGNsaWVudC5hZGREb2N1bWVudHMoaW5kZXgsIGRvY3VtZW50cywgc2lnbmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuQ3JlYXRlSW5kZXgoYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gc2hhcmVkU2VhcmNoLmNyZWF0ZUluZGV4UmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgIHJldHVybiBjbGllbnQuY3JlYXRlSW5kZXgocmVxdWVzdC5uYW1lLCB0b0NyZWF0ZUluZGV4T3B0aW9ucyhyZXF1ZXN0LCBzaWduYWwpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuU3luY0luZGV4KGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNoYXJlZFNlYXJjaC5zeW5jSW5kZXhSZXF1ZXN0U2NoZW1hLnBhcnNlKGFyZ3MpO1xuICAgIGNvbnN0IHsgY2xpZW50LCBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICBjb25zdCBpbmRleCA9IHJlcXVlc3QuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIlwiO1xuICAgIGF3YWl0IGNsaWVudC5zeW5jSW5kZXgoaW5kZXgsIHNpZ25hbCk7XG4gICAgcmV0dXJuIHsgaW5kZXgsIHN5bmNlZDogdHJ1ZSB9O1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIEFJIFNlYXJjaCBwbHVnaW4gd2l0aCBBcHBLaXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIHNlcnZlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IHBsdWdpbiBhcyBzZWFyY2hQbHVnaW4sIHRvb2wgYXMgc2VhcmNoVG9vbEFwaSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NlYXJjaFwiO1xuICogaW1wb3J0IHsgYWdlbnRzLCBwbHVnaW4gYXMgbWFzdHJhUGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICpcbiAqIGNvbnN0IHN1cHBvcnQgPSBhZ2VudHMuY3JlYXRlQWdlbnQoe1xuICogICBpbnN0cnVjdGlvbnM6IFwiQW5zd2VyIGZyb20gdGhlIGRvY3M7IHVzZSBgc2VhcmNoYCB0byBmaW5kIHRoZW0uXCIsXG4gKiAgIHRvb2xzOiAoKSA9PiAoeyBzZWFyY2g6IHNlYXJjaFRvb2xBcGkuc2VhcmNoVG9vbCgpIH0pLFxuICogfSk7XG4gKlxuICogYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW1xuICogICAgIHNlcnZlcigpLFxuICogICAgIHNlYXJjaFBsdWdpbi5zZWFyY2goeyBpbmRleDogXCJtYWluLnN1cHBvcnQuZG9jc1wiIH0pLFxuICogICAgIG1hc3RyYVBsdWdpbi5tYXN0cmEoeyBhZ2VudHM6IHN1cHBvcnQgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgc2VhcmNoID0gdG9QbHVnaW4oU2VhcmNoUGx1Z2luKTtcbiJdfQ==
@@ -1,60 +1,4 @@
1
- /**
2
- * Translation between the browser-safe search contract and the Databricks
3
- * Vector Search query API, kept in one place so the client, the tools, and the
4
- * routes never hand-roll a `filters_json` string or unpack a `data_array` by
5
- * hand.
6
- *
7
- * - {@link toQueryType} maps the friendly {@link SearchMode} onto the API's
8
- * `query_type` (`HYBRID` / `ANN`). Keyword-only search rides on `ANN` with
9
- * text but no vector, which Databricks answers with its BM25 path.
10
- * - {@link compileFilter} turns the `{ column: value }` filter object (with
11
- * optional operator maps like `{ ">=": 10 }`) into the `filters_json`
12
- * string the API expects, so a caller never learns Databricks' filter
13
- * spelling.
14
- * - {@link toHits} unpacks the columnar `{ manifest, result }` response into
15
- * `{ id, score, fields }` hits, pulling the score out of the reserved
16
- * `__db_score` / `score` column and the id out of the primary-key column.
17
- *
18
- * @module
19
- */
20
- import type { SearchHit, SearchMode } from "@dbx-tools/shared-search";
21
- /** Map a {@link SearchMode} onto the serving API `query_type`. */
22
- export declare function toQueryType(mode: SearchMode): string;
23
- /**
24
- * Compile a `{ column: value }` filter object into the `filters_json` string
25
- * the query API expects. A scalar becomes an equality; an array becomes an
26
- * IN-style match; an operator map (`{ ">=": 10, "<": 20 }`) expands to the
27
- * `column operator` keys Databricks uses. Returns `undefined` for an empty
28
- * filter so the field is omitted rather than sent as `{}`.
29
- */
30
- export declare function compileFilter(filter: Record<string, unknown> | undefined): string | undefined;
31
- /** A minimal structural view of the Vector Search query response. */
32
- export interface QueryResponseLike {
33
- manifest?: {
34
- columns?: Array<{
35
- name?: string;
36
- }>;
37
- };
38
- result?: {
39
- data_array?: Array<Array<unknown>>;
40
- };
41
- next_page_token?: string;
42
- }
43
- /**
44
- * Unpack a columnar query response into {@link SearchHit}s. The manifest names
45
- * the columns in order; each row is a positional array. The score comes from
46
- * the reserved score column and the id from `primaryKey` (falling back to the
47
- * first column when the key is unknown). The score column is stripped from
48
- * `fields` so a hit's fields are just the document.
49
- */
50
- export declare function toHits(response: QueryResponseLike, primaryKey: string | undefined, indexName?: string): SearchHit[];
51
- /**
52
- * The columns to request from an index for a search. When neither the request
53
- * nor the index config names columns, the score column alone is requested and
54
- * the primary key is appended so a hit always has an id. Callers that want the
55
- * whole document should pass the index's own column list.
56
- */
57
- export declare function toRequestColumns(requested: readonly string[] | undefined, fallback: readonly string[] | undefined, primaryKey: string | undefined): string[];
1
+ /** Request-shape helpers for search extension write routes and tools. */
58
2
  /**
59
3
  * Parse a JSON document payload the model / a route supplied for a write.
60
4
  * Accepts an already-parsed array/object or a JSON string, and always returns