@dbx-tools/appkit-web-search 0.6.222 → 0.6.224

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,16 +1,16 @@
1
1
  /**
2
2
  * AppKit plugin (registered name: `web-search`) that owns the resolved
3
3
  * web-search runtime - the URL policy, result / length caps, timeout, and
4
- * default approval gate the {@link webSearchTool} / {@link webFetchTool}
5
- * read. Registering it resolves and logs the effective config (which URL
6
- * policy is in force, the caps) so a misconfiguration is visible in the boot
7
- * logs rather than on the first search, and installs the plugin's
8
- * `execute()` as the runtime's executor so every outbound call picks up
9
- * AppKit's cache / retry / timeout / telemetry chain.
4
+ * default approval gate its tools read. Registering it resolves and logs the
5
+ * effective config (which URL policy is in force, the caps) so a
6
+ * misconfiguration is visible in the boot logs rather than on the first
7
+ * search. The plugin's `execute()` is captured by its own runtime so every
8
+ * outbound call picks up AppKit's cache / retry / timeout / telemetry chain.
10
9
  *
11
10
  * The plugin also implements AppKit's `ToolProvider`, so an AppKit agent gets
12
- * `web_search` / `web_fetch` without going through Mastra; the Mastra tools in
13
- * `tool.ts` are the other half and share the same runtime.
11
+ * `web_search` / `web_fetch` without going through Mastra. App-integrated
12
+ * Mastra agents consume this provider through `plugins["web-search"].toolkit()`;
13
+ * standalone factories in `tool.ts` use their own explicit runtime or config.
14
14
  *
15
15
  * @module
16
16
  */
@@ -19,7 +19,7 @@ import { defineTool, executeFromRegistry, toolsFromRegistry, } from "@databricks
19
19
  import { log, string } from "@dbx-tools/shared-core";
20
20
  import { MODEL_ENV, SERVING_ENDPOINT_ENV, WEB_SEARCH_CONFIG_SCHEMA, } from "./config.js";
21
21
  import { runWebFetch } from "./fetch.js";
22
- import { getWebSearchRuntime, resetWebSearchRuntime, setWebSearchExecutor } from "./runtime.js";
22
+ import { createWebSearchRuntime } from "./runtime.js";
23
23
  import { webFetchRequestSchema, webSearchRequestSchema, WEB_FETCH_TOOL_DESCRIPTION, WEB_SEARCH_TOOL_DESCRIPTION, } from "./schema.js";
24
24
  import { resolveWebSearchContext, runWebSearch } from "./search.js";
25
25
  const logger = log.logger("web-search");
@@ -84,6 +84,8 @@ export class WebSearchPlugin extends Plugin {
84
84
  },
85
85
  config: { schema: WEB_SEARCH_CONFIG_SCHEMA },
86
86
  };
87
+ /** Runtime owned exclusively by this plugin instance. */
88
+ runtime = createWebSearchRuntime(this.config, (fn, settings) => this.execute(fn, settings));
87
89
  /**
88
90
  * Promote the serving endpoint to a required resource once a deployment
89
91
  * pins one, through plugin config or either environment name. Left optional
@@ -127,13 +129,12 @@ export class WebSearchPlugin extends Plugin {
127
129
  }),
128
130
  };
129
131
  /**
130
- * Prime the shared runtime from this plugin's config (over env), route the
131
- * tools' outbound calls through this plugin's interceptor chain, and log the
132
- * effective policy so an active allow-list / caps are obvious at boot.
132
+ * Log the effective policy so an active allow-list and caps are obvious at
133
+ * boot. Runtime construction already resolved config and captured this
134
+ * plugin's interceptor chain.
133
135
  */
134
136
  async setup() {
135
- const { config } = getWebSearchRuntime(this.config);
136
- setWebSearchExecutor((fn, settings) => this.execute(fn, settings));
137
+ const { config } = this.runtime;
137
138
  logger.info("ready", {
138
139
  model: config.model ?? `fallbacks:[${config.modelFallbacks.join(", ")}]`,
139
140
  modelSource: config.modelSource,
@@ -146,23 +147,15 @@ export class WebSearchPlugin extends Plugin {
146
147
  });
147
148
  }
148
149
  /**
149
- * Drop the shared runtime so a restarted app re-resolves config and does not
150
- * keep calling through a torn-down plugin's `execute()`. Bounded and
151
- * idempotent: there is no connection to drain, only the memo to clear.
150
+ * No runtime resources require draining. The instance-owned config and
151
+ * executor become unreachable with this plugin.
152
152
  */
153
- async shutdown() {
154
- resetWebSearchRuntime();
153
+ shutdown() {
154
+ return;
155
155
  }
156
- /**
157
- * Abort in-flight work. AppKit's graceful shutdown only invokes this hook -
158
- * it never calls {@link shutdown} - so the runtime memo is dropped from here
159
- * to keep a restarted app from calling through a torn-down `execute()`. The
160
- * teardown is synchronous and idempotent, so the un-awaited call costs
161
- * nothing.
162
- */
156
+ /** Abort in-flight work owned by this plugin instance. */
163
157
  abortActiveOperations() {
164
158
  super.abortActiveOperations();
165
- void this.shutdown();
166
159
  }
167
160
  /** AppKit `ToolProvider`: the tool definitions offered to an agent. */
168
161
  getAgentTools() {
@@ -180,22 +173,22 @@ export class WebSearchPlugin extends Plugin {
180
173
  return {
181
174
  /**
182
175
  * Run a web search directly (bypassing the agent tool). Resolves the
183
- * OBO client from the active execution context and reads the shared
184
- * runtime config primed at setup.
176
+ * OBO client from the active execution context and reads this plugin's
177
+ * runtime config.
185
178
  */
186
179
  search: (request, signal) => this.search(request, signal),
187
180
  /**
188
181
  * Fetch one URL directly (bypassing the agent tool). Enforces the
189
- * configured URL policy. Reads the shared runtime config.
182
+ * configured URL policy.
190
183
  */
191
184
  fetch: (request, signal) => this.fetch(request, signal),
192
185
  };
193
186
  }
194
187
  async search(request, signal) {
195
- return runWebSearch(request, getWebSearchRuntime().config, await resolveWebSearchContext(), signal);
188
+ return runWebSearch(request, this.runtime, await resolveWebSearchContext(), signal);
196
189
  }
197
190
  async fetch(request, signal) {
198
- return runWebFetch(request, getWebSearchRuntime().config, signal);
191
+ return runWebFetch(request, this.runtime, signal);
199
192
  }
200
193
  }
201
194
  /**
@@ -204,12 +197,14 @@ export class WebSearchPlugin extends Plugin {
204
197
  * @example
205
198
  * ```ts
206
199
  * import { createApp, server } from "@databricks/appkit";
207
- * import { plugin as webSearchPlugin, tool as webTool } from "@dbx-tools/appkit-web-search";
200
+ * import { plugin as webSearchPlugin } from "@dbx-tools/appkit-web-search";
208
201
  * import { agents, plugin as mastraPlugin } from "@dbx-tools/appkit-mastra";
209
202
  *
210
203
  * const researcher = agents.createAgent({
211
204
  * instructions: "Research questions with web_search, then read sources with web_fetch.",
212
- * tools: () => ({ web_search: webTool.webSearchTool(), web_fetch: webTool.webFetchTool() }),
205
+ * async tools(plugins) {
206
+ * return { ...(await plugins["web-search"].toolkit()) };
207
+ * },
213
208
  * });
214
209
  *
215
210
  * await createApp({
@@ -222,4 +217,4 @@ export class WebSearchPlugin extends Plugin {
222
217
  * ```
223
218
  */
224
219
  export const webSearch = toPlugin(WebSearchPlugin);
225
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixRQUFRLEdBR1QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixpQkFBaUIsR0FJbEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFDTCxTQUFTLEVBQ1Qsb0JBQW9CLEVBQ3BCLHdCQUF3QixHQUV6QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QiwwQkFBMEIsRUFDMUIsMkJBQTJCLEdBQzVCLE1BQU0sYUFBYSxDQUFDO0FBT3JCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFcEUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUV4Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLHlCQUF5QixHQUFHO0lBQ2hDLElBQUksRUFBRSxZQUFZLENBQUMsZ0JBQWdCO0lBQ25DLEtBQUssRUFBRSxxQkFBcUI7SUFDNUIsV0FBVyxFQUFFLHFCQUFxQjtJQUNsQyxXQUFXLEVBQ1QseUZBQXlGO1FBQ3pGLG9FQUFvRTtJQUN0RSxVQUFVLEVBQUUsV0FBVztJQUN2QixNQUFNLEVBQUU7UUFDTixJQUFJLEVBQUU7WUFDSixHQUFHLEVBQUUs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S0FBSyxFQUFFLENBQUMsT0FBd0IsRUFBRSxNQUFvQixFQUEyQixFQUFFLENBQ2pGLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQztTQUM5QixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBeUIsRUFBRSxNQUFvQjtRQUNsRSxPQUFPLFlBQVksQ0FDakIsT0FBTyxFQUNQLG1CQUFtQixFQUFFLENBQUMsTUFBTSxFQUM1QixNQUFNLHVCQUF1QixFQUFFLEVBQy9CLE1BQU0sQ0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBd0IsRUFBRSxNQUFvQjtRQUNoRSxPQUFPLFdBQVcsQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEUsQ0FBQzs7QUFHSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFwcEtpdCBwbHVnaW4gKHJlZ2lzdGVyZWQgbmFtZTogYHdlYi1zZWFyY2hgKSB0aGF0IG93bnMgdGhlIHJlc29sdmVkXG4gKiB3ZWItc2VhcmNoIHJ1bnRpbWUgLSB0aGUgVVJMIHBvbGljeSwgcmVzdWx0IC8gbGVuZ3RoIGNhcHMsIHRpbWVvdXQsIGFuZFxuICogZGVmYXVsdCBhcHByb3ZhbCBnYXRlIHRoZSB7QGxpbmsgd2ViU2VhcmNoVG9vbH0gLyB7QGxpbmsgd2ViRmV0Y2hUb29sfVxuICogcmVhZC4gUmVnaXN0ZXJpbmcgaXQgcmVzb2x2ZXMgYW5kIGxvZ3MgdGhlIGVmZmVjdGl2ZSBjb25maWcgKHdoaWNoIFVSTFxuICogcG9saWN5IGlzIGluIGZvcmNlLCB0aGUgY2Fwcykgc28gYSBtaXNjb25maWd1cmF0aW9uIGlzIHZpc2libGUgaW4gdGhlIGJvb3RcbiAqIGxvZ3MgcmF0aGVyIHRoYW4gb24gdGhlIGZpcnN0IHNlYXJjaCwgYW5kIGluc3RhbGxzIHRoZSBwbHVnaW4nc1xuICogYGV4ZWN1dGUoKWAgYXMgdGhlIHJ1bnRpbWUncyBleGVjdXRvciBzbyBldmVyeSBvdXRib3VuZCBjYWxsIHBpY2tzIHVwXG4gKiBBcHBLaXQncyBjYWNoZSAvIHJldHJ5IC8gdGltZW91dCAvIHRlbGVtZXRyeSBjaGFpbi5cbiAqXG4gKiBUaGUgcGx1Z2luIGFsc28gaW1wbGVtZW50cyBBcHBLaXQncyBgVG9vbFByb3ZpZGVyYCwgc28gYW4gQXBwS2l0IGFnZW50IGdldHNcbiAqIGB3ZWJfc2VhcmNoYCAvIGB3ZWJfZmV0Y2hgIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCBNYXN0cmE7IHRoZSBNYXN0cmEgdG9vbHMgaW5cbiAqIGB0b29sLnRzYCBhcmUgdGhlIG90aGVyIGhhbGYgYW5kIHNoYXJlIHRoZSBzYW1lIHJ1bnRpbWUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIFBsdWdpbixcbiAgUmVzb3VyY2VUeXBlLFxuICB0b1BsdWdpbixcbiAgdHlwZSBQbHVnaW5NYW5pZmVzdCxcbiAgdHlwZSBSZXNvdXJjZVJlcXVpcmVtZW50LFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQge1xuICBkZWZpbmVUb29sLFxuICBleGVjdXRlRnJvbVJlZ2lzdHJ5LFxuICB0b29sc0Zyb21SZWdpc3RyeSxcbiAgdHlwZSBBZ2VudFRvb2xEZWZpbml0aW9uLFxuICB0eXBlIFRvb2xQcm92aWRlcixcbiAgdHlwZSBUb29sUmVnaXN0cnksXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuaW1wb3J0IHsgbG9nLCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgTU9ERUxfRU5WLFxuICBTRVJWSU5HX0VORFBPSU5UX0VOVixcbiAgV0VCX1NFQVJDSF9DT05GSUdfU0NIRU1BLFxuICB0eXBlIFdlYlNlYXJjaFBsdWdpbkNvbmZpZyxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBydW5XZWJGZXRjaCB9IGZyb20gXCIuL2ZldGNoLnRzXCI7XG5pbXBvcnQgeyBnZXRXZWJTZWFyY2hSdW50aW1lLCByZXNldFdlYlNlYXJjaFJ1bnRpbWUsIHNldFdlYlNlYXJjaEV4ZWN1dG9yIH0gZnJvbSBcIi4vcnVudGltZS50c1wiO1xuaW1wb3J0IHtcbiAgd2ViRmV0Y2hSZXF1ZXN0U2NoZW1hLFxuICB3ZWJTZWFyY2hSZXF1ZXN0U2NoZW1hLFxuICBXRUJfRkVUQ0hfVE9PTF9ERVNDUklQVElPTixcbiAgV0VCX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxufSBmcm9tIFwiLi9zY2hlbWEudHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgV2ViRmV0Y2hSZXF1ZXN0LFxuICBXZWJGZXRjaFJlc3VsdCxcbiAgV2ViU2VhcmNoUmVxdWVzdCxcbiAgV2ViU2VhcmNoUmVzdWx0LFxufSBmcm9tIFwiLi9zY2hlbWEudHNcIjtcbmltcG9ydCB7IHJlc29sdmVXZWJTZWFyY2hDb250ZXh0LCBydW5XZWJTZWFyY2ggfSBmcm9tIFwiLi9zZWFyY2gudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIndlYi1zZWFyY2hcIik7XG5cbi8qKlxuICogVGhlIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnQgdGhlIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2wgcnVucyBvbi4gRGVjbGFyZWRcbiAqIG9wdGlvbmFsIGJlY2F1c2UgdGhlIHBsdWdpbiByZXNvbHZlcyBhIHdlYi1zZWFyY2gtY2FwYWJsZSBlbmRwb2ludCBmcm9tIHRoZVxuICogbGl2ZSBjYXRhbG9ndWUgd2hlbiBub3RoaW5nIGlzIHBpbm5lZDsge0BsaW5rIFdlYlNlYXJjaFBsdWdpbi5nZXRSZXNvdXJjZVJlcXVpcmVtZW50c31cbiAqIHByb21vdGVzIGl0IHRvIHJlcXVpcmVkIG9uY2UgYSBkZXBsb3ltZW50IG5hbWVzIG9uZS4gYENBTl9RVUVSWWAgaXMgdGhlXG4gKiB3ZWFrZXN0IHBlcm1pc3Npb24gdGhhdCBjYW4gaW52b2tlIGFuIGVuZHBvaW50LlxuICovXG5jb25zdCBTRVJWSU5HX0VORFBPSU5UX1JFU09VUkNFID0ge1xuICB0eXBlOiBSZXNvdXJjZVR5cGUuU0VSVklOR19FTkRQT0lOVCxcbiAgYWxpYXM6IFwiV2ViIFNlYXJjaCBFbmRwb2ludFwiLFxuICByZXNvdXJjZUtleTogXCJ3ZWItc2VhcmNoLWVuZHBvaW50XCIsXG4gIGRlc2NyaXB0aW9uOlxuICAgIFwiTW9kZWwgU2VydmluZyBlbmRwb2ludCBydW5uaW5nIHRoZSBuYXRpdmUgd2ViLXNlYXJjaCB0b29sLiBPcHRpb25hbDogcmVzb2x2ZWQgZnJvbSB0aGUgXCIgK1xuICAgIFwid29ya3NwYWNlIGNhdGFsb2d1ZSAoR2VtaW5pLCB0aGVuIEdQVCkgd2hlbiBubyBlbmRwb2ludCBpcyBwaW5uZWQuXCIsXG4gIHBlcm1pc3Npb246IFwiQ0FOX1FVRVJZXCIsXG4gIGZpZWxkczoge1xuICAgIG5hbWU6IHtcbiAgICAgIGVudjogU0VSVklOR19FTkRQT0lOVF9FTlYsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlcnZpbmcgZW5kcG9pbnQgbmFtZSBmb3Igd2ViIHNlYXJjaC4gJHtNT0RFTF9FTlZ9IG92ZXJyaWRlcyBpdC5gLFxuICAgICAgZGlzY292ZXJ5OiB7XG4gICAgICAgIHR5cGU6IFwiY2xpXCIsXG4gICAgICAgIGNsaUNvbW1hbmQ6IFwiZGF0YWJyaWNrcyBzZXJ2aW5nLWVuZHBvaW50cyBsaXN0IC0tcHJvZmlsZSA8UFJPRklMRT4gLS1vdXRwdXQganNvblwiLFxuICAgICAgICBzZWxlY3RGaWVsZDogXCIubmFtZVwiLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSBzYXRpc2ZpZXMgT21pdDxSZXNvdXJjZVJlcXVpcmVtZW50LCBcInJlcXVpcmVkXCI+O1xuXG4vKipcbiAqIEFwcEtpdCBwbHVnaW4gdGhhdCByZXNvbHZlcyBhbmQgaG9sZHMgdGhlIHdlYi1zZWFyY2ggcnVudGltZSBjb25maWcgdXNlZFxuICogYnkgdGhlIGB3ZWJfc2VhcmNoYCAvIGB3ZWJfZmV0Y2hgIHRvb2xzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBwbHVnaW4gYXMgd2ViU2VhcmNoUGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LXdlYi1zZWFyY2hcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgd2ViU2VhcmNoUGx1Z2luLndlYlNlYXJjaCh7XG4gKiAgICAgICBtb2RlbDogXCJnZW1pbmlcIixcbiAqICAgICAgIHVybFBvbGljeTogXCJhbGxvd2xpc3RcIixcbiAqICAgICAgIGFsbG93ZWRVcmxzOiBbXCIqLmRhdGFicmlja3MuY29tXCJdLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlNlYXJjaFBsdWdpbiBleHRlbmRzIFBsdWdpbjxXZWJTZWFyY2hQbHVnaW5Db25maWc+IGltcGxlbWVudHMgVG9vbFByb3ZpZGVyIHtcbiAgc3RhdGljIG1hbmlmZXN0ID0ge1xuICAgIG5hbWU6IFwid2ViLXNlYXJjaFwiLFxuICAgIGRpc3BsYXlOYW1lOiBcIldlYiBTZWFyY2hcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiU2VhcmNoZXMgdGhlIHdlYiB0aHJvdWdoIHRoZSBEYXRhYnJpY2tzIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2wgb24gaXRzIG93biBcIiArXG4gICAgICBcIndlYi1jYXBhYmxlIHNlcnZpbmcgZW5kcG9pbnQsIGFuZCBmZXRjaGVzIHBhZ2VzIHZpYSBnb3Qtc2NyYXBpbmcsIGJlaGluZCBhbiBcIiArXG4gICAgICBcIm9wdGlvbmFsIFVSTCBhbGxvdy1saXN0IGFuZCBwZXItdG9vbCBhcHByb3ZhbCBnYXRpbmcuXCIsXG4gICAgc3RhYmlsaXR5OiBcImJldGFcIixcbiAgICByZXNvdXJjZXM6IHtcbiAgICAgIHJlcXVpcmVkOiBbXSxcbiAgICAgIG9wdGlvbmFsOiBbU0VSVklOR19FTkRQT0lOVF9SRVNPVVJDRV0sXG4gICAgfSxcbiAgICBjb25maWc6IHsgc2NoZW1hOiBXRUJfU0VBUkNIX0NPTkZJR19TQ0hFTUEgfSxcbiAgfSBzYXRpc2ZpZXMgUGx1Z2luTWFuaWZlc3Q8XCJ3ZWItc2VhcmNoXCI+O1xuXG4gIC8qKlxuICAgKiBQcm9tb3RlIHRoZSBzZXJ2aW5nIGVuZHBvaW50IHRvIGEgcmVxdWlyZWQgcmVzb3VyY2Ugb25jZSBhIGRlcGxveW1lbnRcbiAgICogcGlucyBvbmUsIHRocm91Z2ggcGx1Z2luIGNvbmZpZyBvciBlaXRoZXIgZW52aXJvbm1lbnQgbmFtZS4gTGVmdCBvcHRpb25hbFxuICAgKiBvdGhlcndpc2UsIGJlY2F1c2UgdGhlIHBsdWdpbiBwaWNrcyBhIHdlYi1zZWFyY2gtY2FwYWJsZSBlbmRwb2ludCBvdXQgb2ZcbiAgICogdGhlIGxpdmUgY2F0YWxvZ3VlIG9uIGl0cyBvd24uXG4gICAqL1xuICBzdGF0aWMgZ2V0UmVzb3VyY2VSZXF1aXJlbWVudHMoY29uZmlnOiBXZWJTZWFyY2hQbHVnaW5Db25maWcpOiBSZXNvdXJjZVJlcXVpcmVtZW50W10ge1xuICAgIGNvbnN0IHBpbm5lZCA9XG4gICAgICBzdHJpbmcudHJpbVRvTnVsbChjb25maWcubW9kZWwpID8/XG4gICAgICBzdHJpbmcudHJpbVRvTnVsbChwcm9jZXNzLmVudltNT0RFTF9FTlZdKSA/P1xuICAgICAgc3RyaW5nLnRyaW1Ub051bGwocHJvY2Vzcy5lbnZbU0VSVklOR19FTkRQT0lOVF9FTlZdKTtcbiAgICByZXR1cm4gcGlubmVkID09PSBudWxsID8gW10gOiBbeyAuLi5TRVJWSU5HX0VORFBPSU5UX1JFU09VUkNFLCByZXF1aXJlZDogdHJ1ZSB9XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdG9vbHMgdGhpcyBwbHVnaW4gb2ZmZXJzIHRvIGFuIEFwcEtpdCBhZ2VudC4gQm90aCBhcmUgcmVhZHMgYW5kIGJvdGhcbiAgICogcnVuIHVuZGVyIHRoZSBjYWxsZXIncyBpZGVudGl0eS5cbiAgICpcbiAgICogTmVpdGhlciBpcyBgYXV0b0luaGVyaXRhYmxlYC4gYHdlYl9mZXRjaGAgcmVhY2hlcyBhIFVSTCB0aGUgbW9kZWwgY2hvc2UsXG4gICAqIHdoaWNoIGlzIHJlYWNoYWJsZSBmcm9tIGluc2lkZSB0aGUgd29ya3NwYWNlIG5ldHdvcmssIHNvIGl0IG11c3Qgb25seVxuICAgKiBhcHBlYXIgaW4gYW4gYWdlbnQgdGhhdCBhc2tlZCBmb3IgaXQgYW5kIGFjY2VwdGVkIHRoZSBVUkwgcG9saWN5IHRoYXRcbiAgICogY29tZXMgd2l0aCBpdC4gYHdlYl9zZWFyY2hgIGlzIHNhZmVyIGJ1dCBzdGlsbCBzcGVuZHMgc2VydmluZyB0b2tlbnMgb25cbiAgICogZXZlcnkgY2FsbCwgc28gaXQgaXMgb3B0LWluIGZvciBjb3N0IHJhdGhlciB0aGFuIGZvciBzYWZldHkuXG4gICAqXG4gICAqIGBleGVjdXRlYCByZS1wYXJzZXMgaXRzIGFyZ3VtZW50cyB3aXRoIHRoZSBsb2NhbCBzY2hlbWE6IEFwcEtpdCB2YWxpZGF0ZXNcbiAgICogYWdhaW5zdCB0aGUgc2FtZSBzY2hlbWEgZmlyc3QsIGJ1dCByZS1wYXJzaW5nIGlzIHdoYXQgZ2l2ZXMgdGhlIGJvZHkgdHlwZWRcbiAgICogYXJndW1lbnRzIGluc3RlYWQgb2YgYHVua25vd25gLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0b29sczogVG9vbFJlZ2lzdHJ5ID0ge1xuICAgIHdlYl9zZWFyY2g6IGRlZmluZVRvb2woe1xuICAgICAgZGVzY3JpcHRpb246IFdFQl9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbiAgICAgIHNjaGVtYTogd2ViU2VhcmNoUmVxdWVzdFNjaGVtYSxcbiAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJyZWFkXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnNlYXJjaCh3ZWJTZWFyY2hSZXF1ZXN0U2NoZW1hLnBhcnNlKGFyZ3MpLCBzaWduYWwpLFxuICAgIH0pLFxuICAgIHdlYl9mZXRjaDogZGVmaW5lVG9vbCh7XG4gICAgICBkZXNjcmlwdGlvbjogV0VCX0ZFVENIX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICBzY2hlbWE6IHdlYkZldGNoUmVxdWVzdFNjaGVtYSxcbiAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJyZWFkXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLmZldGNoKHdlYkZldGNoUmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKSwgc2lnbmFsKSxcbiAgICB9KSxcbiAgfTtcblxuICAvKipcbiAgICogUHJpbWUgdGhlIHNoYXJlZCBydW50aW1lIGZyb20gdGhpcyBwbHVnaW4ncyBjb25maWcgKG92ZXIgZW52KSwgcm91dGUgdGhlXG4gICAqIHRvb2xzJyBvdXRib3VuZCBjYWxscyB0aHJvdWdoIHRoaXMgcGx1Z2luJ3MgaW50ZXJjZXB0b3IgY2hhaW4sIGFuZCBsb2cgdGhlXG4gICAqIGVmZmVjdGl2ZSBwb2xpY3kgc28gYW4gYWN0aXZlIGFsbG93LWxpc3QgLyBjYXBzIGFyZSBvYnZpb3VzIGF0IGJvb3QuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGNvbmZpZyB9ID0gZ2V0V2ViU2VhcmNoUnVudGltZSh0aGlzLmNvbmZpZyk7XG4gICAgc2V0V2ViU2VhcmNoRXhlY3V0b3IoKGZuLCBzZXR0aW5ncykgPT4gdGhpcy5leGVjdXRlKGZuLCBzZXR0aW5ncykpO1xuICAgIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgICAgbW9kZWw6IGNvbmZpZy5tb2RlbCA/PyBgZmFsbGJhY2tzOlske2NvbmZpZy5tb2RlbEZhbGxiYWNrcy5qb2luKFwiLCBcIil9XWAsXG4gICAgICBtb2RlbFNvdXJjZTogY29uZmlnLm1vZGVsU291cmNlLFxuICAgICAgdXJsUG9saWN5OiBjb25maWcudXJsUG9saWN5LFxuICAgICAgLi4uKGNvbmZpZy5hbGxvd0xpc3QucmVzdHJpY3RlZCA/IHsgYWxsb3dlZFVybHM6IGNvbmZpZy5hbGxvd0xpc3QucGF0dGVybnMgfSA6IHt9KSxcbiAgICAgIG1heENpdGF0aW9uczogY29uZmlnLm1heENpdGF0aW9ucyxcbiAgICAgIGZldGNoTWF4TGVuZ3RoOiBjb25maWcuZmV0Y2hNYXhMZW5ndGgsXG4gICAgICBhcHByb3ZhbDogY29uZmlnLmFwcHJvdmFsLm1vZGUsXG4gICAgICBzY3JhcGVGYWxsYmFjazogY29uZmlnLnNjcmFwZUZhbGxiYWNrLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERyb3AgdGhlIHNoYXJlZCBydW50aW1lIHNvIGEgcmVzdGFydGVkIGFwcCByZS1yZXNvbHZlcyBjb25maWcgYW5kIGRvZXMgbm90XG4gICAqIGtlZXAgY2FsbGluZyB0aHJvdWdoIGEgdG9ybi1kb3duIHBsdWdpbidzIGBleGVjdXRlKClgLiBCb3VuZGVkIGFuZFxuICAgKiBpZGVtcG90ZW50OiB0aGVyZSBpcyBubyBjb25uZWN0aW9uIHRvIGRyYWluLCBvbmx5IHRoZSBtZW1vIHRvIGNsZWFyLlxuICAgKi9cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmVzZXRXZWJTZWFyY2hSdW50aW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnQgaW4tZmxpZ2h0IHdvcmsuIEFwcEtpdCdzIGdyYWNlZnVsIHNodXRkb3duIG9ubHkgaW52b2tlcyB0aGlzIGhvb2sgLVxuICAgKiBpdCBuZXZlciBjYWxscyB7QGxpbmsgc2h1dGRvd259IC0gc28gdGhlIHJ1bnRpbWUgbWVtbyBpcyBkcm9wcGVkIGZyb20gaGVyZVxuICAgKiB0byBrZWVwIGEgcmVzdGFydGVkIGFwcCBmcm9tIGNhbGxpbmcgdGhyb3VnaCBhIHRvcm4tZG93biBgZXhlY3V0ZSgpYC4gVGhlXG4gICAqIHRlYXJkb3duIGlzIHN5bmNocm9ub3VzIGFuZCBpZGVtcG90ZW50LCBzbyB0aGUgdW4tYXdhaXRlZCBjYWxsIGNvc3RzXG4gICAqIG5vdGhpbmcuXG4gICAqL1xuICBvdmVycmlkZSBhYm9ydEFjdGl2ZU9wZXJhdGlvbnMoKTogdm9pZCB7XG4gICAgc3VwZXIuYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk7XG4gICAgdm9pZCB0aGlzLnNodXRkb3duKCk7XG4gIH1cblxuICAvKiogQXBwS2l0IGBUb29sUHJvdmlkZXJgOiB0aGUgdG9vbCBkZWZpbml0aW9ucyBvZmZlcmVkIHRvIGFuIGFnZW50LiAqL1xuICBnZXRBZ2VudFRvb2xzKCk6IEFnZW50VG9vbERlZmluaXRpb25bXSB7XG4gICAgcmV0dXJuIHRvb2xzRnJvbVJlZ2lzdHJ5KHRoaXMudG9vbHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcEtpdCBgVG9vbFByb3ZpZGVyYDogcnVuIG9uZSB0b29sIGNhbGwuIEFyZ3VtZW50cyBhcmUgdmFsaWRhdGVkIGFnYWluc3RcbiAgICogdGhlIHRvb2wncyBzY2hlbWEgZmlyc3QsIGFuZCBhIHZhbGlkYXRpb24gZmFpbHVyZSBjb21lcyBiYWNrIGFzIGFuXG4gICAqIExMTS1mcmllbmRseSBzdHJpbmcgc28gdGhlIG1vZGVsIGNhbiBjb3JyZWN0IGl0c2VsZiBvbiB0aGUgbmV4dCB0dXJuLlxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZUFnZW50VG9vbChuYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGV4ZWN1dGVGcm9tUmVnaXN0cnkodGhpcy50b29scywgbmFtZSwgYXJncywgc2lnbmFsKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogUnVuIGEgd2ViIHNlYXJjaCBkaXJlY3RseSAoYnlwYXNzaW5nIHRoZSBhZ2VudCB0b29sKS4gUmVzb2x2ZXMgdGhlXG4gICAgICAgKiBPQk8gY2xpZW50IGZyb20gdGhlIGFjdGl2ZSBleGVjdXRpb24gY29udGV4dCBhbmQgcmVhZHMgdGhlIHNoYXJlZFxuICAgICAgICogcnVudGltZSBjb25maWcgcHJpbWVkIGF0IHNldHVwLlxuICAgICAgICovXG4gICAgICBzZWFyY2g6IChyZXF1ZXN0OiBXZWJTZWFyY2hSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8V2ViU2VhcmNoUmVzdWx0PiA9PlxuICAgICAgICB0aGlzLnNlYXJjaChyZXF1ZXN0LCBzaWduYWwpLFxuICAgICAgLyoqXG4gICAgICAgKiBGZXRjaCBvbmUgVVJMIGRpcmVjdGx5IChieXBhc3NpbmcgdGhlIGFnZW50IHRvb2wpLiBFbmZvcmNlcyB0aGVcbiAgICAgICAqIGNvbmZpZ3VyZWQgVVJMIHBvbGljeS4gUmVhZHMgdGhlIHNoYXJlZCBydW50aW1lIGNvbmZpZy5cbiAgICAgICAqL1xuICAgICAgZmV0Y2g6IChyZXF1ZXN0OiBXZWJGZXRjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxXZWJGZXRjaFJlc3VsdD4gPT5cbiAgICAgICAgdGhpcy5mZXRjaChyZXF1ZXN0LCBzaWduYWwpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlYXJjaChyZXF1ZXN0OiBXZWJTZWFyY2hSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8V2ViU2VhcmNoUmVzdWx0PiB7XG4gICAgcmV0dXJuIHJ1bldlYlNlYXJjaChcbiAgICAgIHJlcXVlc3QsXG4gICAgICBnZXRXZWJTZWFyY2hSdW50aW1lKCkuY29uZmlnLFxuICAgICAgYXdhaXQgcmVzb2x2ZVdlYlNlYXJjaENvbnRleHQoKSxcbiAgICAgIHNpZ25hbCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaChyZXF1ZXN0OiBXZWJGZXRjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxXZWJGZXRjaFJlc3VsdD4ge1xuICAgIHJldHVybiBydW5XZWJGZXRjaChyZXF1ZXN0LCBnZXRXZWJTZWFyY2hSdW50aW1lKCkuY29uZmlnLCBzaWduYWwpO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIHdlYi1zZWFyY2ggcnVudGltZSB3aXRoIEFwcEtpdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgcGx1Z2luIGFzIHdlYlNlYXJjaFBsdWdpbiwgdG9vbCBhcyB3ZWJUb29sIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LXdlYi1zZWFyY2hcIjtcbiAqIGltcG9ydCB7IGFnZW50cywgcGx1Z2luIGFzIG1hc3RyYVBsdWdpbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiBjb25zdCByZXNlYXJjaGVyID0gYWdlbnRzLmNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIlJlc2VhcmNoIHF1ZXN0aW9ucyB3aXRoIHdlYl9zZWFyY2gsIHRoZW4gcmVhZCBzb3VyY2VzIHdpdGggd2ViX2ZldGNoLlwiLFxuICogICB0b29sczogKCkgPT4gKHsgd2ViX3NlYXJjaDogd2ViVG9vbC53ZWJTZWFyY2hUb29sKCksIHdlYl9mZXRjaDogd2ViVG9vbC53ZWJGZXRjaFRvb2woKSB9KSxcbiAqIH0pO1xuICpcbiAqIGF3YWl0IGNyZWF0ZUFwcCh7XG4gKiAgIHBsdWdpbnM6IFtcbiAqICAgICBzZXJ2ZXIoKSxcbiAqICAgICB3ZWJTZWFyY2hQbHVnaW4ud2ViU2VhcmNoKHsgbW9kZWw6IFwiZ2VtaW5pXCIgfSksXG4gKiAgICAgbWFzdHJhUGx1Z2luLm1hc3RyYSh7IGFnZW50czogcmVzZWFyY2hlciB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3ZWJTZWFyY2ggPSB0b1BsdWdpbihXZWJTZWFyY2hQbHVnaW4pO1xuIl19
220
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixRQUFRLEdBR1QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixpQkFBaUIsR0FJbEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFDTCxTQUFTLEVBQ1Qsb0JBQW9CLEVBQ3BCLHdCQUF3QixHQUV6QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxzQkFBc0IsRUFBeUIsTUFBTSxjQUFjLENBQUM7QUFDN0UsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdEIsMEJBQTBCLEVBQzFCLDJCQUEyQixHQUM1QixNQUFNLGFBQWEsQ0FBQztBQU9yQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXBFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFeEM7Ozs7OztHQU1HO0FBQ0gsTUFBTSx5QkFBeUIsR0FBRztJQUNoQyxJQUFJLEVBQUUsWUFBWSxDQUFDLGdCQUFnQjtJQUNuQyxLQUFLLEVBQUUscUJBQXFCO0lBQzVCLFdBQVcsRUFBRSxxQkFBcUI7SUFDbEMsV0FBVyxFQUNULHlGQUF5RjtRQUN6RixvRUFBb0U7SUFDdEUsVUFBVSxFQUFFLFdBQVc7SUFDdkIsTUFBTSxFQUFFO1FBQ04sSUFBSSxFQUFFO1lBQ0osR0FBRyxFQUFFLG9CQUFvQjtZQUN6QixXQUFXLEVBQUUs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QyxLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQztTQUM5QixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBeUIsRUFBRSxNQUFvQjtRQUNsRSxPQUFPLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVPLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBd0IsRUFBRSxNQUFvQjtRQUNoRSxPQUFPLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDOztBQUdIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgcGx1Z2luIChyZWdpc3RlcmVkIG5hbWU6IGB3ZWItc2VhcmNoYCkgdGhhdCBvd25zIHRoZSByZXNvbHZlZFxuICogd2ViLXNlYXJjaCBydW50aW1lIC0gdGhlIFVSTCBwb2xpY3ksIHJlc3VsdCAvIGxlbmd0aCBjYXBzLCB0aW1lb3V0LCBhbmRcbiAqIGRlZmF1bHQgYXBwcm92YWwgZ2F0ZSBpdHMgdG9vbHMgcmVhZC4gUmVnaXN0ZXJpbmcgaXQgcmVzb2x2ZXMgYW5kIGxvZ3MgdGhlXG4gKiBlZmZlY3RpdmUgY29uZmlnICh3aGljaCBVUkwgcG9saWN5IGlzIGluIGZvcmNlLCB0aGUgY2Fwcykgc28gYVxuICogbWlzY29uZmlndXJhdGlvbiBpcyB2aXNpYmxlIGluIHRoZSBib290IGxvZ3MgcmF0aGVyIHRoYW4gb24gdGhlIGZpcnN0XG4gKiBzZWFyY2guIFRoZSBwbHVnaW4ncyBgZXhlY3V0ZSgpYCBpcyBjYXB0dXJlZCBieSBpdHMgb3duIHJ1bnRpbWUgc28gZXZlcnlcbiAqIG91dGJvdW5kIGNhbGwgcGlja3MgdXAgQXBwS2l0J3MgY2FjaGUgLyByZXRyeSAvIHRpbWVvdXQgLyB0ZWxlbWV0cnkgY2hhaW4uXG4gKlxuICogVGhlIHBsdWdpbiBhbHNvIGltcGxlbWVudHMgQXBwS2l0J3MgYFRvb2xQcm92aWRlcmAsIHNvIGFuIEFwcEtpdCBhZ2VudCBnZXRzXG4gKiBgd2ViX3NlYXJjaGAgLyBgd2ViX2ZldGNoYCB3aXRob3V0IGdvaW5nIHRocm91Z2ggTWFzdHJhLiBBcHAtaW50ZWdyYXRlZFxuICogTWFzdHJhIGFnZW50cyBjb25zdW1lIHRoaXMgcHJvdmlkZXIgdGhyb3VnaCBgcGx1Z2luc1tcIndlYi1zZWFyY2hcIl0udG9vbGtpdCgpYDtcbiAqIHN0YW5kYWxvbmUgZmFjdG9yaWVzIGluIGB0b29sLnRzYCB1c2UgdGhlaXIgb3duIGV4cGxpY2l0IHJ1bnRpbWUgb3IgY29uZmlnLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBQbHVnaW4sXG4gIFJlc291cmNlVHlwZSxcbiAgdG9QbHVnaW4sXG4gIHR5cGUgUGx1Z2luTWFuaWZlc3QsXG4gIHR5cGUgUmVzb3VyY2VSZXF1aXJlbWVudCxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgZGVmaW5lVG9vbCxcbiAgZXhlY3V0ZUZyb21SZWdpc3RyeSxcbiAgdG9vbHNGcm9tUmVnaXN0cnksXG4gIHR5cGUgQWdlbnRUb29sRGVmaW5pdGlvbixcbiAgdHlwZSBUb29sUHJvdmlkZXIsXG4gIHR5cGUgVG9vbFJlZ2lzdHJ5LFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0L2JldGFcIjtcbmltcG9ydCB7IGxvZywgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1PREVMX0VOVixcbiAgU0VSVklOR19FTkRQT0lOVF9FTlYsXG4gIFdFQl9TRUFSQ0hfQ09ORklHX1NDSEVNQSxcbiAgdHlwZSBXZWJTZWFyY2hQbHVnaW5Db25maWcsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgcnVuV2ViRmV0Y2ggfSBmcm9tIFwiLi9mZXRjaC50c1wiO1xuaW1wb3J0IHsgY3JlYXRlV2ViU2VhcmNoUnVudGltZSwgdHlwZSBXZWJTZWFyY2hSdW50aW1lIH0gZnJvbSBcIi4vcnVudGltZS50c1wiO1xuaW1wb3J0IHtcbiAgd2ViRmV0Y2hSZXF1ZXN0U2NoZW1hLFxuICB3ZWJTZWFyY2hSZXF1ZXN0U2NoZW1hLFxuICBXRUJfRkVUQ0hfVE9PTF9ERVNDUklQVElPTixcbiAgV0VCX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxufSBmcm9tIFwiLi9zY2hlbWEudHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgV2ViRmV0Y2hSZXF1ZXN0LFxuICBXZWJGZXRjaFJlc3VsdCxcbiAgV2ViU2VhcmNoUmVxdWVzdCxcbiAgV2ViU2VhcmNoUmVzdWx0LFxufSBmcm9tIFwiLi9zY2hlbWEudHNcIjtcbmltcG9ydCB7IHJlc29sdmVXZWJTZWFyY2hDb250ZXh0LCBydW5XZWJTZWFyY2ggfSBmcm9tIFwiLi9zZWFyY2gudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIndlYi1zZWFyY2hcIik7XG5cbi8qKlxuICogVGhlIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnQgdGhlIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2wgcnVucyBvbi4gRGVjbGFyZWRcbiAqIG9wdGlvbmFsIGJlY2F1c2UgdGhlIHBsdWdpbiByZXNvbHZlcyBhIHdlYi1zZWFyY2gtY2FwYWJsZSBlbmRwb2ludCBmcm9tIHRoZVxuICogbGl2ZSBjYXRhbG9ndWUgd2hlbiBub3RoaW5nIGlzIHBpbm5lZDsge0BsaW5rIFdlYlNlYXJjaFBsdWdpbi5nZXRSZXNvdXJjZVJlcXVpcmVtZW50c31cbiAqIHByb21vdGVzIGl0IHRvIHJlcXVpcmVkIG9uY2UgYSBkZXBsb3ltZW50IG5hbWVzIG9uZS4gYENBTl9RVUVSWWAgaXMgdGhlXG4gKiB3ZWFrZXN0IHBlcm1pc3Npb24gdGhhdCBjYW4gaW52b2tlIGFuIGVuZHBvaW50LlxuICovXG5jb25zdCBTRVJWSU5HX0VORFBPSU5UX1JFU09VUkNFID0ge1xuICB0eXBlOiBSZXNvdXJjZVR5cGUuU0VSVklOR19FTkRQT0lOVCxcbiAgYWxpYXM6IFwiV2ViIFNlYXJjaCBFbmRwb2ludFwiLFxuICByZXNvdXJjZUtleTogXCJ3ZWItc2VhcmNoLWVuZHBvaW50XCIsXG4gIGRlc2NyaXB0aW9uOlxuICAgIFwiTW9kZWwgU2VydmluZyBlbmRwb2ludCBydW5uaW5nIHRoZSBuYXRpdmUgd2ViLXNlYXJjaCB0b29sLiBPcHRpb25hbDogcmVzb2x2ZWQgZnJvbSB0aGUgXCIgK1xuICAgIFwid29ya3NwYWNlIGNhdGFsb2d1ZSAoR2VtaW5pLCB0aGVuIEdQVCkgd2hlbiBubyBlbmRwb2ludCBpcyBwaW5uZWQuXCIsXG4gIHBlcm1pc3Npb246IFwiQ0FOX1FVRVJZXCIsXG4gIGZpZWxkczoge1xuICAgIG5hbWU6IHtcbiAgICAgIGVudjogU0VSVklOR19FTkRQT0lOVF9FTlYsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlcnZpbmcgZW5kcG9pbnQgbmFtZSBmb3Igd2ViIHNlYXJjaC4gJHtNT0RFTF9FTlZ9IG92ZXJyaWRlcyBpdC5gLFxuICAgICAgZGlzY292ZXJ5OiB7XG4gICAgICAgIHR5cGU6IFwiY2xpXCIsXG4gICAgICAgIGNsaUNvbW1hbmQ6IFwiZGF0YWJyaWNrcyBzZXJ2aW5nLWVuZHBvaW50cyBsaXN0IC0tcHJvZmlsZSA8UFJPRklMRT4gLS1vdXRwdXQganNvblwiLFxuICAgICAgICBzZWxlY3RGaWVsZDogXCIubmFtZVwiLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSBzYXRpc2ZpZXMgT21pdDxSZXNvdXJjZVJlcXVpcmVtZW50LCBcInJlcXVpcmVkXCI+O1xuXG4vKipcbiAqIEFwcEtpdCBwbHVnaW4gdGhhdCByZXNvbHZlcyBhbmQgaG9sZHMgdGhlIHdlYi1zZWFyY2ggcnVudGltZSBjb25maWcgdXNlZFxuICogYnkgdGhlIGB3ZWJfc2VhcmNoYCAvIGB3ZWJfZmV0Y2hgIHRvb2xzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBwbHVnaW4gYXMgd2ViU2VhcmNoUGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LXdlYi1zZWFyY2hcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgd2ViU2VhcmNoUGx1Z2luLndlYlNlYXJjaCh7XG4gKiAgICAgICBtb2RlbDogXCJnZW1pbmlcIixcbiAqICAgICAgIHVybFBvbGljeTogXCJhbGxvd2xpc3RcIixcbiAqICAgICAgIGFsbG93ZWRVcmxzOiBbXCIqLmRhdGFicmlja3MuY29tXCJdLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlNlYXJjaFBsdWdpbiBleHRlbmRzIFBsdWdpbjxXZWJTZWFyY2hQbHVnaW5Db25maWc+IGltcGxlbWVudHMgVG9vbFByb3ZpZGVyIHtcbiAgc3RhdGljIG1hbmlmZXN0ID0ge1xuICAgIG5hbWU6IFwid2ViLXNlYXJjaFwiLFxuICAgIGRpc3BsYXlOYW1lOiBcIldlYiBTZWFyY2hcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiU2VhcmNoZXMgdGhlIHdlYiB0aHJvdWdoIHRoZSBEYXRhYnJpY2tzIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2wgb24gaXRzIG93biBcIiArXG4gICAgICBcIndlYi1jYXBhYmxlIHNlcnZpbmcgZW5kcG9pbnQsIGFuZCBmZXRjaGVzIHBhZ2VzIHZpYSBnb3Qtc2NyYXBpbmcsIGJlaGluZCBhbiBcIiArXG4gICAgICBcIm9wdGlvbmFsIFVSTCBhbGxvdy1saXN0IGFuZCBwZXItdG9vbCBhcHByb3ZhbCBnYXRpbmcuXCIsXG4gICAgc3RhYmlsaXR5OiBcImJldGFcIixcbiAgICByZXNvdXJjZXM6IHtcbiAgICAgIHJlcXVpcmVkOiBbXSxcbiAgICAgIG9wdGlvbmFsOiBbU0VSVklOR19FTkRQT0lOVF9SRVNPVVJDRV0sXG4gICAgfSxcbiAgICBjb25maWc6IHsgc2NoZW1hOiBXRUJfU0VBUkNIX0NPTkZJR19TQ0hFTUEgfSxcbiAgfSBzYXRpc2ZpZXMgUGx1Z2luTWFuaWZlc3Q8XCJ3ZWItc2VhcmNoXCI+O1xuXG4gIC8qKiBSdW50aW1lIG93bmVkIGV4Y2x1c2l2ZWx5IGJ5IHRoaXMgcGx1Z2luIGluc3RhbmNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJ1bnRpbWU6IFdlYlNlYXJjaFJ1bnRpbWUgPSBjcmVhdGVXZWJTZWFyY2hSdW50aW1lKHRoaXMuY29uZmlnLCAoZm4sIHNldHRpbmdzKSA9PlxuICAgIHRoaXMuZXhlY3V0ZShmbiwgc2V0dGluZ3MpLFxuICApO1xuXG4gIC8qKlxuICAgKiBQcm9tb3RlIHRoZSBzZXJ2aW5nIGVuZHBvaW50IHRvIGEgcmVxdWlyZWQgcmVzb3VyY2Ugb25jZSBhIGRlcGxveW1lbnRcbiAgICogcGlucyBvbmUsIHRocm91Z2ggcGx1Z2luIGNvbmZpZyBvciBlaXRoZXIgZW52aXJvbm1lbnQgbmFtZS4gTGVmdCBvcHRpb25hbFxuICAgKiBvdGhlcndpc2UsIGJlY2F1c2UgdGhlIHBsdWdpbiBwaWNrcyBhIHdlYi1zZWFyY2gtY2FwYWJsZSBlbmRwb2ludCBvdXQgb2ZcbiAgICogdGhlIGxpdmUgY2F0YWxvZ3VlIG9uIGl0cyBvd24uXG4gICAqL1xuICBzdGF0aWMgZ2V0UmVzb3VyY2VSZXF1aXJlbWVudHMoY29uZmlnOiBXZWJTZWFyY2hQbHVnaW5Db25maWcpOiBSZXNvdXJjZVJlcXVpcmVtZW50W10ge1xuICAgIGNvbnN0IHBpbm5lZCA9XG4gICAgICBzdHJpbmcudHJpbVRvTnVsbChjb25maWcubW9kZWwpID8/XG4gICAgICBzdHJpbmcudHJpbVRvTnVsbChwcm9jZXNzLmVudltNT0RFTF9FTlZdKSA/P1xuICAgICAgc3RyaW5nLnRyaW1Ub051bGwocHJvY2Vzcy5lbnZbU0VSVklOR19FTkRQT0lOVF9FTlZdKTtcbiAgICByZXR1cm4gcGlubmVkID09PSBudWxsID8gW10gOiBbeyAuLi5TRVJWSU5HX0VORFBPSU5UX1JFU09VUkNFLCByZXF1aXJlZDogdHJ1ZSB9XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdG9vbHMgdGhpcyBwbHVnaW4gb2ZmZXJzIHRvIGFuIEFwcEtpdCBhZ2VudC4gQm90aCBhcmUgcmVhZHMgYW5kIGJvdGhcbiAgICogcnVuIHVuZGVyIHRoZSBjYWxsZXIncyBpZGVudGl0eS5cbiAgICpcbiAgICogTmVpdGhlciBpcyBgYXV0b0luaGVyaXRhYmxlYC4gYHdlYl9mZXRjaGAgcmVhY2hlcyBhIFVSTCB0aGUgbW9kZWwgY2hvc2UsXG4gICAqIHdoaWNoIGlzIHJlYWNoYWJsZSBmcm9tIGluc2lkZSB0aGUgd29ya3NwYWNlIG5ldHdvcmssIHNvIGl0IG11c3Qgb25seVxuICAgKiBhcHBlYXIgaW4gYW4gYWdlbnQgdGhhdCBhc2tlZCBmb3IgaXQgYW5kIGFjY2VwdGVkIHRoZSBVUkwgcG9saWN5IHRoYXRcbiAgICogY29tZXMgd2l0aCBpdC4gYHdlYl9zZWFyY2hgIGlzIHNhZmVyIGJ1dCBzdGlsbCBzcGVuZHMgc2VydmluZyB0b2tlbnMgb25cbiAgICogZXZlcnkgY2FsbCwgc28gaXQgaXMgb3B0LWluIGZvciBjb3N0IHJhdGhlciB0aGFuIGZvciBzYWZldHkuXG4gICAqXG4gICAqIGBleGVjdXRlYCByZS1wYXJzZXMgaXRzIGFyZ3VtZW50cyB3aXRoIHRoZSBsb2NhbCBzY2hlbWE6IEFwcEtpdCB2YWxpZGF0ZXNcbiAgICogYWdhaW5zdCB0aGUgc2FtZSBzY2hlbWEgZmlyc3QsIGJ1dCByZS1wYXJzaW5nIGlzIHdoYXQgZ2l2ZXMgdGhlIGJvZHkgdHlwZWRcbiAgICogYXJndW1lbnRzIGluc3RlYWQgb2YgYHVua25vd25gLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0b29sczogVG9vbFJlZ2lzdHJ5ID0ge1xuICAgIHdlYl9zZWFyY2g6IGRlZmluZVRvb2woe1xuICAgICAgZGVzY3JpcHRpb246IFdFQl9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbiAgICAgIHNjaGVtYTogd2ViU2VhcmNoUmVxdWVzdFNjaGVtYSxcbiAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJyZWFkXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnNlYXJjaCh3ZWJTZWFyY2hSZXF1ZXN0U2NoZW1hLnBhcnNlKGFyZ3MpLCBzaWduYWwpLFxuICAgIH0pLFxuICAgIHdlYl9mZXRjaDogZGVmaW5lVG9vbCh7XG4gICAgICBkZXNjcmlwdGlvbjogV0VCX0ZFVENIX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICBzY2hlbWE6IHdlYkZldGNoUmVxdWVzdFNjaGVtYSxcbiAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJyZWFkXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLmZldGNoKHdlYkZldGNoUmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKSwgc2lnbmFsKSxcbiAgICB9KSxcbiAgfTtcblxuICAvKipcbiAgICogTG9nIHRoZSBlZmZlY3RpdmUgcG9saWN5IHNvIGFuIGFjdGl2ZSBhbGxvdy1saXN0IGFuZCBjYXBzIGFyZSBvYnZpb3VzIGF0XG4gICAqIGJvb3QuIFJ1bnRpbWUgY29uc3RydWN0aW9uIGFscmVhZHkgcmVzb2x2ZWQgY29uZmlnIGFuZCBjYXB0dXJlZCB0aGlzXG4gICAqIHBsdWdpbidzIGludGVyY2VwdG9yIGNoYWluLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgc2V0dXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IHRoaXMucnVudGltZTtcbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIG1vZGVsOiBjb25maWcubW9kZWwgPz8gYGZhbGxiYWNrczpbJHtjb25maWcubW9kZWxGYWxsYmFja3Muam9pbihcIiwgXCIpfV1gLFxuICAgICAgbW9kZWxTb3VyY2U6IGNvbmZpZy5tb2RlbFNvdXJjZSxcbiAgICAgIHVybFBvbGljeTogY29uZmlnLnVybFBvbGljeSxcbiAgICAgIC4uLihjb25maWcuYWxsb3dMaXN0LnJlc3RyaWN0ZWQgPyB7IGFsbG93ZWRVcmxzOiBjb25maWcuYWxsb3dMaXN0LnBhdHRlcm5zIH0gOiB7fSksXG4gICAgICBtYXhDaXRhdGlvbnM6IGNvbmZpZy5tYXhDaXRhdGlvbnMsXG4gICAgICBmZXRjaE1heExlbmd0aDogY29uZmlnLmZldGNoTWF4TGVuZ3RoLFxuICAgICAgYXBwcm92YWw6IGNvbmZpZy5hcHByb3ZhbC5tb2RlLFxuICAgICAgc2NyYXBlRmFsbGJhY2s6IGNvbmZpZy5zY3JhcGVGYWxsYmFjayxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBObyBydW50aW1lIHJlc291cmNlcyByZXF1aXJlIGRyYWluaW5nLiBUaGUgaW5zdGFuY2Utb3duZWQgY29uZmlnIGFuZFxuICAgKiBleGVjdXRvciBiZWNvbWUgdW5yZWFjaGFibGUgd2l0aCB0aGlzIHBsdWdpbi5cbiAgICovXG4gIHNodXRkb3duKCk6IHZvaWQge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKiBBYm9ydCBpbi1mbGlnaHQgd29yayBvd25lZCBieSB0aGlzIHBsdWdpbiBpbnN0YW5jZS4gKi9cbiAgb3ZlcnJpZGUgYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk6IHZvaWQge1xuICAgIHN1cGVyLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICB9XG5cbiAgLyoqIEFwcEtpdCBgVG9vbFByb3ZpZGVyYDogdGhlIHRvb2wgZGVmaW5pdGlvbnMgb2ZmZXJlZCB0byBhbiBhZ2VudC4gKi9cbiAgZ2V0QWdlbnRUb29scygpOiBBZ2VudFRvb2xEZWZpbml0aW9uW10ge1xuICAgIHJldHVybiB0b29sc0Zyb21SZWdpc3RyeSh0aGlzLnRvb2xzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBLaXQgYFRvb2xQcm92aWRlcmA6IHJ1biBvbmUgdG9vbCBjYWxsLiBBcmd1bWVudHMgYXJlIHZhbGlkYXRlZCBhZ2FpbnN0XG4gICAqIHRoZSB0b29sJ3Mgc2NoZW1hIGZpcnN0LCBhbmQgYSB2YWxpZGF0aW9uIGZhaWx1cmUgY29tZXMgYmFjayBhcyBhblxuICAgKiBMTE0tZnJpZW5kbHkgc3RyaW5nIHNvIHRoZSBtb2RlbCBjYW4gY29ycmVjdCBpdHNlbGYgb24gdGhlIG5leHQgdHVybi5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudFRvb2wobmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBleGVjdXRlRnJvbVJlZ2lzdHJ5KHRoaXMudG9vbHMsIG5hbWUsIGFyZ3MsIHNpZ25hbCk7XG4gIH1cblxuICBvdmVycmlkZSBleHBvcnRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIFJ1biBhIHdlYiBzZWFyY2ggZGlyZWN0bHkgKGJ5cGFzc2luZyB0aGUgYWdlbnQgdG9vbCkuIFJlc29sdmVzIHRoZVxuICAgICAgICogT0JPIGNsaWVudCBmcm9tIHRoZSBhY3RpdmUgZXhlY3V0aW9uIGNvbnRleHQgYW5kIHJlYWRzIHRoaXMgcGx1Z2luJ3NcbiAgICAgICAqIHJ1bnRpbWUgY29uZmlnLlxuICAgICAgICovXG4gICAgICBzZWFyY2g6IChyZXF1ZXN0OiBXZWJTZWFyY2hSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8V2ViU2VhcmNoUmVzdWx0PiA9PlxuICAgICAgICB0aGlzLnNlYXJjaChyZXF1ZXN0LCBzaWduYWwpLFxuICAgICAgLyoqXG4gICAgICAgKiBGZXRjaCBvbmUgVVJMIGRpcmVjdGx5IChieXBhc3NpbmcgdGhlIGFnZW50IHRvb2wpLiBFbmZvcmNlcyB0aGVcbiAgICAgICAqIGNvbmZpZ3VyZWQgVVJMIHBvbGljeS5cbiAgICAgICAqL1xuICAgICAgZmV0Y2g6IChyZXF1ZXN0OiBXZWJGZXRjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxXZWJGZXRjaFJlc3VsdD4gPT5cbiAgICAgICAgdGhpcy5mZXRjaChyZXF1ZXN0LCBzaWduYWwpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlYXJjaChyZXF1ZXN0OiBXZWJTZWFyY2hSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8V2ViU2VhcmNoUmVzdWx0PiB7XG4gICAgcmV0dXJuIHJ1bldlYlNlYXJjaChyZXF1ZXN0LCB0aGlzLnJ1bnRpbWUsIGF3YWl0IHJlc29sdmVXZWJTZWFyY2hDb250ZXh0KCksIHNpZ25hbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoKHJlcXVlc3Q6IFdlYkZldGNoUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFdlYkZldGNoUmVzdWx0PiB7XG4gICAgcmV0dXJuIHJ1bldlYkZldGNoKHJlcXVlc3QsIHRoaXMucnVudGltZSwgc2lnbmFsKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSB3ZWItc2VhcmNoIHJ1bnRpbWUgd2l0aCBBcHBLaXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIHNlcnZlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IHBsdWdpbiBhcyB3ZWJTZWFyY2hQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtd2ViLXNlYXJjaFwiO1xuICogaW1wb3J0IHsgYWdlbnRzLCBwbHVnaW4gYXMgbWFzdHJhUGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICpcbiAqIGNvbnN0IHJlc2VhcmNoZXIgPSBhZ2VudHMuY3JlYXRlQWdlbnQoe1xuICogICBpbnN0cnVjdGlvbnM6IFwiUmVzZWFyY2ggcXVlc3Rpb25zIHdpdGggd2ViX3NlYXJjaCwgdGhlbiByZWFkIHNvdXJjZXMgd2l0aCB3ZWJfZmV0Y2guXCIsXG4gKiAgIGFzeW5jIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICByZXR1cm4geyAuLi4oYXdhaXQgcGx1Z2luc1tcIndlYi1zZWFyY2hcIl0udG9vbGtpdCgpKSB9O1xuICogICB9LFxuICogfSk7XG4gKlxuICogYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW1xuICogICAgIHNlcnZlcigpLFxuICogICAgIHdlYlNlYXJjaFBsdWdpbi53ZWJTZWFyY2goeyBtb2RlbDogXCJnZW1pbmlcIiB9KSxcbiAqICAgICBtYXN0cmFQbHVnaW4ubWFzdHJhKHsgYWdlbnRzOiByZXNlYXJjaGVyIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHdlYlNlYXJjaCA9IHRvUGx1Z2luKFdlYlNlYXJjaFBsdWdpbik7XG4iXX0=
@@ -1,20 +1,9 @@
1
1
  /**
2
- * The web-search runtime: a lazily-resolved, process-wide config shared by
3
- * the plugin and the `web_search` / `web_fetch` tools, so both read one
4
- * resolved allow-list / cap / timeout set. The first caller (normally the
5
- * plugin at setup) primes it from the plugin's config; later callers (the
6
- * tools' `execute`) reuse it.
2
+ * Web-search runtime construction and execution helpers.
7
3
  *
8
- * The runtime also carries the {@link WebSearchExecutor} every outbound call
9
- * runs through. The plugin installs its own `execute()` there at setup, which
10
- * is how the tools - plain functions with no plugin instance in scope - still
11
- * get AppKit's cache / retry / timeout / telemetry chain. Without a
12
- * registered plugin (a direct call from a script or a test) the calls still
13
- * run, just without interceptors.
14
- *
15
- * Unlike the email runtime there is no connection to pool - the backend is
16
- * stateless HTTP per call - so the runtime holds only the resolved config and
17
- * that executor.
4
+ * Each plugin instance owns one runtime. Standalone tool factories create their
5
+ * own runtime, so separate apps and direct consumers cannot overwrite each
6
+ * other's policy or executor.
18
7
  *
19
8
  * @module
20
9
  */
@@ -27,29 +16,41 @@ import type { WebSearchExecutionSettings } from "./defaults.ts";
27
16
  * `{ ok: false }`.
28
17
  */
29
18
  export type WebSearchExecutor = <T>(fn: (signal?: AbortSignal) => Promise<T>, settings: WebSearchExecutionSettings) => Promise<ExecutionResult<T>>;
30
- /** The shared resolved config plus the executor outbound calls run through. */
19
+ /** The resolved config plus the executor outbound calls run through. */
31
20
  export interface WebSearchRuntime {
32
21
  config: ResolvedWebSearchConfig;
33
22
  execute: WebSearchExecutor;
34
23
  }
24
+ /** Runtime-aware operation input, retaining resolved-config compatibility. */
25
+ export type WebSearchRuntimeInput = WebSearchRuntime | ResolvedWebSearchConfig;
26
+ /** Build an isolated runtime for one plugin instance or standalone tool set. */
27
+ export declare function createWebSearchRuntime(overrides?: WebSearchPluginConfig, execute?: WebSearchExecutor): WebSearchRuntime;
28
+ /** Build an isolated runtime from config that has already been resolved. */
29
+ export declare function createResolvedWebSearchRuntime(config: ResolvedWebSearchConfig, execute?: WebSearchExecutor): WebSearchRuntime;
30
+ /** Normalize an explicit runtime or legacy resolved config for one operation. */
31
+ export declare function toWebSearchRuntime(input: WebSearchRuntimeInput): WebSearchRuntime;
35
32
  /**
36
- * Return the shared runtime, building it on first use from the supplied
37
- * config layered over environment defaults. Overrides are only read when the
38
- * runtime is first created, so prime it from the plugin's config at setup;
39
- * subsequent calls (the tools' `execute`) pass nothing and get the same
40
- * instance.
33
+ * Build an isolated standalone runtime.
34
+ *
35
+ * @deprecated Use {@link createWebSearchRuntime}. This compatibility helper
36
+ * returns a new runtime on every call and never reads or updates plugin state.
41
37
  */
42
38
  export declare function getWebSearchRuntime(overrides?: WebSearchPluginConfig): WebSearchRuntime;
39
+ /** Install an executor on an explicit runtime. */
40
+ export declare function setWebSearchExecutor(runtime: WebSearchRuntime, execute: WebSearchExecutor): void;
41
+ /**
42
+ * @deprecated Process-global executor registration is no longer supported.
43
+ * Pass a runtime as the first argument or provide the executor to
44
+ * {@link createWebSearchRuntime}.
45
+ */
46
+ export declare function setWebSearchExecutor(execute: WebSearchExecutor): never;
43
47
  /**
44
- * Install the executor outbound calls run through. The plugin calls this at
45
- * setup with its own `execute()`; a second call replaces the previous one, so
46
- * a re-registered plugin does not leave the tools bound to a dead instance.
48
+ * @deprecated Plugin runtimes are instance-owned and need no global reset.
49
+ * This compatibility helper is intentionally a no-op.
47
50
  */
48
- export declare function setWebSearchExecutor(execute: WebSearchExecutor): void;
49
- /** Drop the memoized runtime so the next {@link getWebSearchRuntime} rebuilds it. */
50
51
  export declare function resetWebSearchRuntime(): void;
51
52
  /**
52
- * Run one idempotent read through the shared executor and unwrap it.
53
+ * Run one idempotent read through the runtime executor and unwrap it.
53
54
  *
54
55
  * `execute()` never throws, so a failed call arrives as `{ ok: false }` with
55
56
  * a status the interceptors already sanitized; it is logged here and re-raised
@@ -58,4 +59,4 @@ export declare function resetWebSearchRuntime(): void;
58
59
  * run, a request teardown); it is merged with the signal the timeout
59
60
  * interceptor supplies so either one unwinds the I/O.
60
61
  */
61
- export declare function executeRead<T>(operation: string, settings: WebSearchExecutionSettings, fn: (signal?: AbortSignal) => Promise<T>, signal?: AbortSignal): Promise<T>;
62
+ export declare function executeRead<T>(runtime: WebSearchRuntime, operation: string, settings: WebSearchExecutionSettings, fn: (signal?: AbortSignal) => Promise<T>, signal?: AbortSignal): Promise<T>;
@@ -1,20 +1,9 @@
1
1
  /**
2
- * The web-search runtime: a lazily-resolved, process-wide config shared by
3
- * the plugin and the `web_search` / `web_fetch` tools, so both read one
4
- * resolved allow-list / cap / timeout set. The first caller (normally the
5
- * plugin at setup) primes it from the plugin's config; later callers (the
6
- * tools' `execute`) reuse it.
2
+ * Web-search runtime construction and execution helpers.
7
3
  *
8
- * The runtime also carries the {@link WebSearchExecutor} every outbound call
9
- * runs through. The plugin installs its own `execute()` there at setup, which
10
- * is how the tools - plain functions with no plugin instance in scope - still
11
- * get AppKit's cache / retry / timeout / telemetry chain. Without a
12
- * registered plugin (a direct call from a script or a test) the calls still
13
- * run, just without interceptors.
14
- *
15
- * Unlike the email runtime there is no connection to pool - the backend is
16
- * stateless HTTP per call - so the runtime holds only the resolved config and
17
- * that executor.
4
+ * Each plugin instance owns one runtime. Standalone tool factories create their
5
+ * own runtime, so separate apps and direct consumers cannot overwrite each
6
+ * other's policy or executor.
18
7
  *
19
8
  * @module
20
9
  */
@@ -23,39 +12,49 @@ import { execution, log } from "@dbx-tools/shared-core";
23
12
  import { resolveWebSearchConfig, } from "./config.js";
24
13
  const logger = log.logger("web-search/runtime");
25
14
  /**
26
- * Executor used until (or unless) the plugin installs its own: run the call
27
- * directly, mapping a throw onto the same {@link ExecutionResult} shape so
28
- * call sites branch on `ok` either way.
15
+ * Executor used by standalone runtimes: run the call directly, mapping a throw
16
+ * onto the same {@link ExecutionResult} shape so call sites branch on `ok`
17
+ * either way.
29
18
  */
30
19
  const directExecute = execution.directExecutor();
31
- let runtime;
20
+ /** Build an isolated runtime for one plugin instance or standalone tool set. */
21
+ export function createWebSearchRuntime(overrides, execute = directExecute) {
22
+ return { config: resolveWebSearchConfig(overrides), execute };
23
+ }
24
+ /** Build an isolated runtime from config that has already been resolved. */
25
+ export function createResolvedWebSearchRuntime(config, execute = directExecute) {
26
+ return { config, execute };
27
+ }
28
+ /** Normalize an explicit runtime or legacy resolved config for one operation. */
29
+ export function toWebSearchRuntime(input) {
30
+ return "execute" in input ? input : createResolvedWebSearchRuntime(input);
31
+ }
32
32
  /**
33
- * Return the shared runtime, building it on first use from the supplied
34
- * config layered over environment defaults. Overrides are only read when the
35
- * runtime is first created, so prime it from the plugin's config at setup;
36
- * subsequent calls (the tools' `execute`) pass nothing and get the same
37
- * instance.
33
+ * Build an isolated standalone runtime.
34
+ *
35
+ * @deprecated Use {@link createWebSearchRuntime}. This compatibility helper
36
+ * returns a new runtime on every call and never reads or updates plugin state.
38
37
  */
39
38
  export function getWebSearchRuntime(overrides) {
40
- if (!runtime) {
41
- runtime = { config: resolveWebSearchConfig(overrides), execute: directExecute };
39
+ return createWebSearchRuntime(overrides);
40
+ }
41
+ export function setWebSearchExecutor(runtimeOrExecute, execute) {
42
+ if (typeof runtimeOrExecute === "function") {
43
+ throw new TypeError("setWebSearchExecutor requires an explicit runtime; use createWebSearchRuntime(config, executor)");
42
44
  }
43
- return runtime;
45
+ if (!execute)
46
+ throw new TypeError("setWebSearchExecutor requires an executor");
47
+ runtimeOrExecute.execute = execute;
44
48
  }
45
49
  /**
46
- * Install the executor outbound calls run through. The plugin calls this at
47
- * setup with its own `execute()`; a second call replaces the previous one, so
48
- * a re-registered plugin does not leave the tools bound to a dead instance.
50
+ * @deprecated Plugin runtimes are instance-owned and need no global reset.
51
+ * This compatibility helper is intentionally a no-op.
49
52
  */
50
- export function setWebSearchExecutor(execute) {
51
- getWebSearchRuntime().execute = execute;
52
- }
53
- /** Drop the memoized runtime so the next {@link getWebSearchRuntime} rebuilds it. */
54
53
  export function resetWebSearchRuntime() {
55
- runtime = undefined;
54
+ return;
56
55
  }
57
56
  /**
58
- * Run one idempotent read through the shared executor and unwrap it.
57
+ * Run one idempotent read through the runtime executor and unwrap it.
59
58
  *
60
59
  * `execute()` never throws, so a failed call arrives as `{ ok: false }` with
61
60
  * a status the interceptors already sanitized; it is logged here and re-raised
@@ -64,12 +63,11 @@ export function resetWebSearchRuntime() {
64
63
  * run, a request teardown); it is merged with the signal the timeout
65
64
  * interceptor supplies so either one unwinds the I/O.
66
65
  */
67
- export async function executeRead(operation, settings, fn, signal) {
68
- const { execute } = getWebSearchRuntime();
66
+ export async function executeRead(runtime, operation, settings, fn, signal) {
69
67
  return execution.run({
70
68
  operation,
71
69
  settings,
72
- execute,
70
+ execute: runtime.execute,
73
71
  fn,
74
72
  signal,
75
73
  canceled: ExecutionError.canceled,
@@ -85,4 +83,4 @@ export async function executeRead(operation, settings, fn, signal) {
85
83
  },
86
84
  });
87
85
  }
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLGNBQWMsRUFBd0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sRUFDTCxzQkFBc0IsR0FHdkIsTUFBTSxhQUFhLENBQUM7QUFHckIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBa0JoRDs7OztHQUlHO0FBQ0gsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLGNBQWMsRUFBOEIsQ0FBQztBQUU3RSxJQUFJLE9BQXFDLENBQUM7QUFFMUM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFNBQWlDO0lBQ25FLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE9BQU8sR0FBRyxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUM7SUFDbEYsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLE9BQTBCO0lBQzdELG1CQUFtQixFQUFFLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUMxQyxDQUFDO0FBRUQscUZBQXFGO0FBQ3JGLE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUN0QixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQy9CLFNBQWlCLEVBQ2pCLFFBQW9DLEVBQ3BDLEVBQXdDLEVBQ3hDLE1BQW9CO0lBRXBCLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxtQkFBbUIsRUFBRSxDQUFDO0lBQzFDLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQztRQUNuQixTQUFTO1FBQ1QsUUFBUTtRQUNSLE9BQU87UUFDUCxFQUFFO1FBQ0YsTUFBTTtRQUNOLFFBQVEsRUFBRSxjQUFjLENBQUMsUUFBUTtRQUNqQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNsQixNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUM5QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7Z0JBQzVCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtnQkFDdEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2FBQ3ZCLENBQUMsQ0FBQztZQUNILE9BQU8sSUFBSSxjQUFjLENBQUMsZUFBZSxPQUFPLENBQUMsU0FBUyxTQUFTLEVBQUU7Z0JBQ25FLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFO2FBQ2xFLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgd2ViLXNlYXJjaCBydW50aW1lOiBhIGxhemlseS1yZXNvbHZlZCwgcHJvY2Vzcy13aWRlIGNvbmZpZyBzaGFyZWQgYnlcbiAqIHRoZSBwbHVnaW4gYW5kIHRoZSBgd2ViX3NlYXJjaGAgLyBgd2ViX2ZldGNoYCB0b29scywgc28gYm90aCByZWFkIG9uZVxuICogcmVzb2x2ZWQgYWxsb3ctbGlzdCAvIGNhcCAvIHRpbWVvdXQgc2V0LiBUaGUgZmlyc3QgY2FsbGVyIChub3JtYWxseSB0aGVcbiAqIHBsdWdpbiBhdCBzZXR1cCkgcHJpbWVzIGl0IGZyb20gdGhlIHBsdWdpbidzIGNvbmZpZzsgbGF0ZXIgY2FsbGVycyAodGhlXG4gKiB0b29scycgYGV4ZWN1dGVgKSByZXVzZSBpdC5cbiAqXG4gKiBUaGUgcnVudGltZSBhbHNvIGNhcnJpZXMgdGhlIHtAbGluayBXZWJTZWFyY2hFeGVjdXRvcn0gZXZlcnkgb3V0Ym91bmQgY2FsbFxuICogcnVucyB0aHJvdWdoLiBUaGUgcGx1Z2luIGluc3RhbGxzIGl0cyBvd24gYGV4ZWN1dGUoKWAgdGhlcmUgYXQgc2V0dXAsIHdoaWNoXG4gKiBpcyBob3cgdGhlIHRvb2xzIC0gcGxhaW4gZnVuY3Rpb25zIHdpdGggbm8gcGx1Z2luIGluc3RhbmNlIGluIHNjb3BlIC0gc3RpbGxcbiAqIGdldCBBcHBLaXQncyBjYWNoZSAvIHJldHJ5IC8gdGltZW91dCAvIHRlbGVtZXRyeSBjaGFpbi4gV2l0aG91dCBhXG4gKiByZWdpc3RlcmVkIHBsdWdpbiAoYSBkaXJlY3QgY2FsbCBmcm9tIGEgc2NyaXB0IG9yIGEgdGVzdCkgdGhlIGNhbGxzIHN0aWxsXG4gKiBydW4sIGp1c3Qgd2l0aG91dCBpbnRlcmNlcHRvcnMuXG4gKlxuICogVW5saWtlIHRoZSBlbWFpbCBydW50aW1lIHRoZXJlIGlzIG5vIGNvbm5lY3Rpb24gdG8gcG9vbCAtIHRoZSBiYWNrZW5kIGlzXG4gKiBzdGF0ZWxlc3MgSFRUUCBwZXIgY2FsbCAtIHNvIHRoZSBydW50aW1lIGhvbGRzIG9ubHkgdGhlIHJlc29sdmVkIGNvbmZpZyBhbmRcbiAqIHRoYXQgZXhlY3V0b3IuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IEV4ZWN1dGlvbkVycm9yLCB0eXBlIEV4ZWN1dGlvblJlc3VsdCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGV4ZWN1dGlvbiwgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIHJlc29sdmVXZWJTZWFyY2hDb25maWcsXG4gIHR5cGUgUmVzb2x2ZWRXZWJTZWFyY2hDb25maWcsXG4gIHR5cGUgV2ViU2VhcmNoUGx1Z2luQ29uZmlnLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB0eXBlIHsgV2ViU2VhcmNoRXhlY3V0aW9uU2V0dGluZ3MgfSBmcm9tIFwiLi9kZWZhdWx0cy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwid2ViLXNlYXJjaC9ydW50aW1lXCIpO1xuXG4vKipcbiAqIFJ1bnMgb25lIG91dGJvdW5kIGNhbGwgdGhyb3VnaCBBcHBLaXQncyBpbnRlcmNlcHRvciBjaGFpbi4gTWF0Y2hlc1xuICogYFBsdWdpbi5leGVjdXRlKClgLCB3aGljaCBuZXZlciB0aHJvd3M6IGEgZmFpbHVyZSBjb21lcyBiYWNrIGFzXG4gKiBgeyBvazogZmFsc2UgfWAuXG4gKi9cbmV4cG9ydCB0eXBlIFdlYlNlYXJjaEV4ZWN1dG9yID0gPFQ+KFxuICBmbjogKHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPFQ+LFxuICBzZXR0aW5nczogV2ViU2VhcmNoRXhlY3V0aW9uU2V0dGluZ3MsXG4pID0+IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PFQ+PjtcblxuLyoqIFRoZSBzaGFyZWQgcmVzb2x2ZWQgY29uZmlnIHBsdXMgdGhlIGV4ZWN1dG9yIG91dGJvdW5kIGNhbGxzIHJ1biB0aHJvdWdoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJTZWFyY2hSdW50aW1lIHtcbiAgY29uZmlnOiBSZXNvbHZlZFdlYlNlYXJjaENvbmZpZztcbiAgZXhlY3V0ZTogV2ViU2VhcmNoRXhlY3V0b3I7XG59XG5cbi8qKlxuICogRXhlY3V0b3IgdXNlZCB1bnRpbCAob3IgdW5sZXNzKSB0aGUgcGx1Z2luIGluc3RhbGxzIGl0cyBvd246IHJ1biB0aGUgY2FsbFxuICogZGlyZWN0bHksIG1hcHBpbmcgYSB0aHJvdyBvbnRvIHRoZSBzYW1lIHtAbGluayBFeGVjdXRpb25SZXN1bHR9IHNoYXBlIHNvXG4gKiBjYWxsIHNpdGVzIGJyYW5jaCBvbiBgb2tgIGVpdGhlciB3YXkuXG4gKi9cbmNvbnN0IGRpcmVjdEV4ZWN1dGUgPSBleGVjdXRpb24uZGlyZWN0RXhlY3V0b3I8V2ViU2VhcmNoRXhlY3V0aW9uU2V0dGluZ3M+KCk7XG5cbmxldCBydW50aW1lOiBXZWJTZWFyY2hSdW50aW1lIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJldHVybiB0aGUgc2hhcmVkIHJ1bnRpbWUsIGJ1aWxkaW5nIGl0IG9uIGZpcnN0IHVzZSBmcm9tIHRoZSBzdXBwbGllZFxuICogY29uZmlnIGxheWVyZWQgb3ZlciBlbnZpcm9ubWVudCBkZWZhdWx0cy4gT3ZlcnJpZGVzIGFyZSBvbmx5IHJlYWQgd2hlbiB0aGVcbiAqIHJ1bnRpbWUgaXMgZmlyc3QgY3JlYXRlZCwgc28gcHJpbWUgaXQgZnJvbSB0aGUgcGx1Z2luJ3MgY29uZmlnIGF0IHNldHVwO1xuICogc3Vic2VxdWVudCBjYWxscyAodGhlIHRvb2xzJyBgZXhlY3V0ZWApIHBhc3Mgbm90aGluZyBhbmQgZ2V0IHRoZSBzYW1lXG4gKiBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdlYlNlYXJjaFJ1bnRpbWUob3ZlcnJpZGVzPzogV2ViU2VhcmNoUGx1Z2luQ29uZmlnKTogV2ViU2VhcmNoUnVudGltZSB7XG4gIGlmICghcnVudGltZSkge1xuICAgIHJ1bnRpbWUgPSB7IGNvbmZpZzogcmVzb2x2ZVdlYlNlYXJjaENvbmZpZyhvdmVycmlkZXMpLCBleGVjdXRlOiBkaXJlY3RFeGVjdXRlIH07XG4gIH1cbiAgcmV0dXJuIHJ1bnRpbWU7XG59XG5cbi8qKlxuICogSW5zdGFsbCB0aGUgZXhlY3V0b3Igb3V0Ym91bmQgY2FsbHMgcnVuIHRocm91Z2guIFRoZSBwbHVnaW4gY2FsbHMgdGhpcyBhdFxuICogc2V0dXAgd2l0aCBpdHMgb3duIGBleGVjdXRlKClgOyBhIHNlY29uZCBjYWxsIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBvbmUsIHNvXG4gKiBhIHJlLXJlZ2lzdGVyZWQgcGx1Z2luIGRvZXMgbm90IGxlYXZlIHRoZSB0b29scyBib3VuZCB0byBhIGRlYWQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRXZWJTZWFyY2hFeGVjdXRvcihleGVjdXRlOiBXZWJTZWFyY2hFeGVjdXRvcik6IHZvaWQge1xuICBnZXRXZWJTZWFyY2hSdW50aW1lKCkuZXhlY3V0ZSA9IGV4ZWN1dGU7XG59XG5cbi8qKiBEcm9wIHRoZSBtZW1vaXplZCBydW50aW1lIHNvIHRoZSBuZXh0IHtAbGluayBnZXRXZWJTZWFyY2hSdW50aW1lfSByZWJ1aWxkcyBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldFdlYlNlYXJjaFJ1bnRpbWUoKTogdm9pZCB7XG4gIHJ1bnRpbWUgPSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUnVuIG9uZSBpZGVtcG90ZW50IHJlYWQgdGhyb3VnaCB0aGUgc2hhcmVkIGV4ZWN1dG9yIGFuZCB1bndyYXAgaXQuXG4gKlxuICogYGV4ZWN1dGUoKWAgbmV2ZXIgdGhyb3dzLCBzbyBhIGZhaWxlZCBjYWxsIGFycml2ZXMgYXMgYHsgb2s6IGZhbHNlIH1gIHdpdGhcbiAqIGEgc3RhdHVzIHRoZSBpbnRlcmNlcHRvcnMgYWxyZWFkeSBzYW5pdGl6ZWQ7IGl0IGlzIGxvZ2dlZCBoZXJlIGFuZCByZS1yYWlzZWRcbiAqIGFzIGEgc3RhYmxlIHtAbGluayBFeGVjdXRpb25FcnJvcn0gc28gYW4gdXBzdHJlYW0gbWVzc2FnZSBuZXZlciBiZWNvbWVzIHRoZVxuICogY2FsbGVyJ3MgZXJyb3IgdGV4dC4gYHNpZ25hbGAgaXMgdGhlIGNhbGxlcidzIG93biBjYW5jZWxsYXRpb24gKGFuIGFnZW50XG4gKiBydW4sIGEgcmVxdWVzdCB0ZWFyZG93bik7IGl0IGlzIG1lcmdlZCB3aXRoIHRoZSBzaWduYWwgdGhlIHRpbWVvdXRcbiAqIGludGVyY2VwdG9yIHN1cHBsaWVzIHNvIGVpdGhlciBvbmUgdW53aW5kcyB0aGUgSS9PLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVJlYWQ8VD4oXG4gIG9wZXJhdGlvbjogc3RyaW5nLFxuICBzZXR0aW5nczogV2ViU2VhcmNoRXhlY3V0aW9uU2V0dGluZ3MsXG4gIGZuOiAoc2lnbmFsPzogQWJvcnRTaWduYWwpID0+IFByb21pc2U8VD4sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHsgZXhlY3V0ZSB9ID0gZ2V0V2ViU2VhcmNoUnVudGltZSgpO1xuICByZXR1cm4gZXhlY3V0aW9uLnJ1bih7XG4gICAgb3BlcmF0aW9uLFxuICAgIHNldHRpbmdzLFxuICAgIGV4ZWN1dGUsXG4gICAgZm4sXG4gICAgc2lnbmFsLFxuICAgIGNhbmNlbGVkOiBFeGVjdXRpb25FcnJvci5jYW5jZWxlZCxcbiAgICBmYWlsZWQ6IChmYWlsdXJlKSA9PiB7XG4gICAgICBsb2dnZXIud2FybihcImV4ZWN1dGlvbi1mYWlsZWRcIiwge1xuICAgICAgICBvcGVyYXRpb246IGZhaWx1cmUub3BlcmF0aW9uLFxuICAgICAgICBzdGF0dXM6IGZhaWx1cmUuc3RhdHVzLFxuICAgICAgICBlcnJvcjogZmFpbHVyZS5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IEV4ZWN1dGlvbkVycm9yKGB3ZWItc2VhcmNoOiAke2ZhaWx1cmUub3BlcmF0aW9ufSBmYWlsZWRgLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBmYWlsdXJlLm9wZXJhdGlvbiwgc3RhdHVzOiBmYWlsdXJlLnN0YXR1cyB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLGNBQWMsRUFBd0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sRUFDTCxzQkFBc0IsR0FHdkIsTUFBTSxhQUFhLENBQUM7QUFHckIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBcUJoRDs7OztHQUlHO0FBQ0gsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLGNBQWMsRUFBOEIsQ0FBQztBQUU3RSxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxTQUFpQyxFQUNqQyxVQUE2QixhQUFhO0lBRTFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsc0JBQXNCLENBQUMsU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDaEUsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxNQUFNLFVBQVUsOEJBQThCLENBQzVDLE1BQStCLEVBQy9CLFVBQTZCLGFBQWE7SUFFMUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM3QixDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxLQUE0QjtJQUM3RCxPQUFPLFNBQVMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsOEJBQThCLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFNBQWlDO0lBQ25FLE9BQU8sc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQVVELE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsZ0JBQXNELEVBQ3RELE9BQTJCO0lBRTNCLElBQUksT0FBTyxnQkFBZ0IsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUMzQyxNQUFNLElBQUksU0FBUyxDQUNqQixpR0FBaUcsQ0FDbEcsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLENBQUMsT0FBTztRQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsMkNBQTJDLENBQUMsQ0FBQztJQUMvRSxnQkFBZ0IsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQ3JDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLE9BQU87QUFDVCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQy9CLE9BQXlCLEVBQ3pCLFNBQWlCLEVBQ2pCLFFBQW9DLEVBQ3BDLEVBQXdDLEVBQ3hDLE1BQW9CO0lBRXBCLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQztRQUNuQixTQUFTO1FBQ1QsUUFBUTtRQUNSLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztRQUN4QixFQUFFO1FBQ0YsTUFBTTtRQUNOLFFBQVEsRUFBRSxjQUFjLENBQUMsUUFBUTtRQUNqQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNsQixNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUM5QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7Z0JBQzVCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtnQkFDdEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2FBQ3ZCLENBQUMsQ0FBQztZQUNILE9BQU8sSUFBSSxjQUFjLENBQUMsZUFBZSxPQUFPLENBQUMsU0FBUyxTQUFTLEVBQUU7Z0JBQ25FLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFO2FBQ2xFLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXZWItc2VhcmNoIHJ1bnRpbWUgY29uc3RydWN0aW9uIGFuZCBleGVjdXRpb24gaGVscGVycy5cbiAqXG4gKiBFYWNoIHBsdWdpbiBpbnN0YW5jZSBvd25zIG9uZSBydW50aW1lLiBTdGFuZGFsb25lIHRvb2wgZmFjdG9yaWVzIGNyZWF0ZSB0aGVpclxuICogb3duIHJ1bnRpbWUsIHNvIHNlcGFyYXRlIGFwcHMgYW5kIGRpcmVjdCBjb25zdW1lcnMgY2Fubm90IG92ZXJ3cml0ZSBlYWNoXG4gKiBvdGhlcidzIHBvbGljeSBvciBleGVjdXRvci5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgRXhlY3V0aW9uRXJyb3IsIHR5cGUgRXhlY3V0aW9uUmVzdWx0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZXhlY3V0aW9uLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZVdlYlNlYXJjaENvbmZpZyxcbiAgdHlwZSBSZXNvbHZlZFdlYlNlYXJjaENvbmZpZyxcbiAgdHlwZSBXZWJTZWFyY2hQbHVnaW5Db25maWcsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHR5cGUgeyBXZWJTZWFyY2hFeGVjdXRpb25TZXR0aW5ncyB9IGZyb20gXCIuL2RlZmF1bHRzLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ3ZWItc2VhcmNoL3J1bnRpbWVcIik7XG5cbi8qKlxuICogUnVucyBvbmUgb3V0Ym91bmQgY2FsbCB0aHJvdWdoIEFwcEtpdCdzIGludGVyY2VwdG9yIGNoYWluLiBNYXRjaGVzXG4gKiBgUGx1Z2luLmV4ZWN1dGUoKWAsIHdoaWNoIG5ldmVyIHRocm93czogYSBmYWlsdXJlIGNvbWVzIGJhY2sgYXNcbiAqIGB7IG9rOiBmYWxzZSB9YC5cbiAqL1xuZXhwb3J0IHR5cGUgV2ViU2VhcmNoRXhlY3V0b3IgPSA8VD4oXG4gIGZuOiAoc2lnbmFsPzogQWJvcnRTaWduYWwpID0+IFByb21pc2U8VD4sXG4gIHNldHRpbmdzOiBXZWJTZWFyY2hFeGVjdXRpb25TZXR0aW5ncyxcbikgPT4gUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8VD4+O1xuXG4vKiogVGhlIHJlc29sdmVkIGNvbmZpZyBwbHVzIHRoZSBleGVjdXRvciBvdXRib3VuZCBjYWxscyBydW4gdGhyb3VnaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU2VhcmNoUnVudGltZSB7XG4gIGNvbmZpZzogUmVzb2x2ZWRXZWJTZWFyY2hDb25maWc7XG4gIGV4ZWN1dGU6IFdlYlNlYXJjaEV4ZWN1dG9yO1xufVxuXG4vKiogUnVudGltZS1hd2FyZSBvcGVyYXRpb24gaW5wdXQsIHJldGFpbmluZyByZXNvbHZlZC1jb25maWcgY29tcGF0aWJpbGl0eS4gKi9cbmV4cG9ydCB0eXBlIFdlYlNlYXJjaFJ1bnRpbWVJbnB1dCA9IFdlYlNlYXJjaFJ1bnRpbWUgfCBSZXNvbHZlZFdlYlNlYXJjaENvbmZpZztcblxuLyoqXG4gKiBFeGVjdXRvciB1c2VkIGJ5IHN0YW5kYWxvbmUgcnVudGltZXM6IHJ1biB0aGUgY2FsbCBkaXJlY3RseSwgbWFwcGluZyBhIHRocm93XG4gKiBvbnRvIHRoZSBzYW1lIHtAbGluayBFeGVjdXRpb25SZXN1bHR9IHNoYXBlIHNvIGNhbGwgc2l0ZXMgYnJhbmNoIG9uIGBva2BcbiAqIGVpdGhlciB3YXkuXG4gKi9cbmNvbnN0IGRpcmVjdEV4ZWN1dGUgPSBleGVjdXRpb24uZGlyZWN0RXhlY3V0b3I8V2ViU2VhcmNoRXhlY3V0aW9uU2V0dGluZ3M+KCk7XG5cbi8qKiBCdWlsZCBhbiBpc29sYXRlZCBydW50aW1lIGZvciBvbmUgcGx1Z2luIGluc3RhbmNlIG9yIHN0YW5kYWxvbmUgdG9vbCBzZXQuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViU2VhcmNoUnVudGltZShcbiAgb3ZlcnJpZGVzPzogV2ViU2VhcmNoUGx1Z2luQ29uZmlnLFxuICBleGVjdXRlOiBXZWJTZWFyY2hFeGVjdXRvciA9IGRpcmVjdEV4ZWN1dGUsXG4pOiBXZWJTZWFyY2hSdW50aW1lIHtcbiAgcmV0dXJuIHsgY29uZmlnOiByZXNvbHZlV2ViU2VhcmNoQ29uZmlnKG92ZXJyaWRlcyksIGV4ZWN1dGUgfTtcbn1cblxuLyoqIEJ1aWxkIGFuIGlzb2xhdGVkIHJ1bnRpbWUgZnJvbSBjb25maWcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJlc29sdmVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc29sdmVkV2ViU2VhcmNoUnVudGltZShcbiAgY29uZmlnOiBSZXNvbHZlZFdlYlNlYXJjaENvbmZpZyxcbiAgZXhlY3V0ZTogV2ViU2VhcmNoRXhlY3V0b3IgPSBkaXJlY3RFeGVjdXRlLFxuKTogV2ViU2VhcmNoUnVudGltZSB7XG4gIHJldHVybiB7IGNvbmZpZywgZXhlY3V0ZSB9O1xufVxuXG4vKiogTm9ybWFsaXplIGFuIGV4cGxpY2l0IHJ1bnRpbWUgb3IgbGVnYWN5IHJlc29sdmVkIGNvbmZpZyBmb3Igb25lIG9wZXJhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1dlYlNlYXJjaFJ1bnRpbWUoaW5wdXQ6IFdlYlNlYXJjaFJ1bnRpbWVJbnB1dCk6IFdlYlNlYXJjaFJ1bnRpbWUge1xuICByZXR1cm4gXCJleGVjdXRlXCIgaW4gaW5wdXQgPyBpbnB1dCA6IGNyZWF0ZVJlc29sdmVkV2ViU2VhcmNoUnVudGltZShpbnB1dCk7XG59XG5cbi8qKlxuICogQnVpbGQgYW4gaXNvbGF0ZWQgc3RhbmRhbG9uZSBydW50aW1lLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgY3JlYXRlV2ViU2VhcmNoUnVudGltZX0uIFRoaXMgY29tcGF0aWJpbGl0eSBoZWxwZXJcbiAqIHJldHVybnMgYSBuZXcgcnVudGltZSBvbiBldmVyeSBjYWxsIGFuZCBuZXZlciByZWFkcyBvciB1cGRhdGVzIHBsdWdpbiBzdGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdlYlNlYXJjaFJ1bnRpbWUob3ZlcnJpZGVzPzogV2ViU2VhcmNoUGx1Z2luQ29uZmlnKTogV2ViU2VhcmNoUnVudGltZSB7XG4gIHJldHVybiBjcmVhdGVXZWJTZWFyY2hSdW50aW1lKG92ZXJyaWRlcyk7XG59XG5cbi8qKiBJbnN0YWxsIGFuIGV4ZWN1dG9yIG9uIGFuIGV4cGxpY2l0IHJ1bnRpbWUuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0V2ViU2VhcmNoRXhlY3V0b3IocnVudGltZTogV2ViU2VhcmNoUnVudGltZSwgZXhlY3V0ZTogV2ViU2VhcmNoRXhlY3V0b3IpOiB2b2lkO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBQcm9jZXNzLWdsb2JhbCBleGVjdXRvciByZWdpc3RyYXRpb24gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC5cbiAqIFBhc3MgYSBydW50aW1lIGFzIHRoZSBmaXJzdCBhcmd1bWVudCBvciBwcm92aWRlIHRoZSBleGVjdXRvciB0b1xuICoge0BsaW5rIGNyZWF0ZVdlYlNlYXJjaFJ1bnRpbWV9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0V2ViU2VhcmNoRXhlY3V0b3IoZXhlY3V0ZTogV2ViU2VhcmNoRXhlY3V0b3IpOiBuZXZlcjtcbmV4cG9ydCBmdW5jdGlvbiBzZXRXZWJTZWFyY2hFeGVjdXRvcihcbiAgcnVudGltZU9yRXhlY3V0ZTogV2ViU2VhcmNoUnVudGltZSB8IFdlYlNlYXJjaEV4ZWN1dG9yLFxuICBleGVjdXRlPzogV2ViU2VhcmNoRXhlY3V0b3IsXG4pOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiBydW50aW1lT3JFeGVjdXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgXCJzZXRXZWJTZWFyY2hFeGVjdXRvciByZXF1aXJlcyBhbiBleHBsaWNpdCBydW50aW1lOyB1c2UgY3JlYXRlV2ViU2VhcmNoUnVudGltZShjb25maWcsIGV4ZWN1dG9yKVwiLFxuICAgICk7XG4gIH1cbiAgaWYgKCFleGVjdXRlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwic2V0V2ViU2VhcmNoRXhlY3V0b3IgcmVxdWlyZXMgYW4gZXhlY3V0b3JcIik7XG4gIHJ1bnRpbWVPckV4ZWN1dGUuZXhlY3V0ZSA9IGV4ZWN1dGU7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgUGx1Z2luIHJ1bnRpbWVzIGFyZSBpbnN0YW5jZS1vd25lZCBhbmQgbmVlZCBubyBnbG9iYWwgcmVzZXQuXG4gKiBUaGlzIGNvbXBhdGliaWxpdHkgaGVscGVyIGlzIGludGVudGlvbmFsbHkgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0V2ViU2VhcmNoUnVudGltZSgpOiB2b2lkIHtcbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIFJ1biBvbmUgaWRlbXBvdGVudCByZWFkIHRocm91Z2ggdGhlIHJ1bnRpbWUgZXhlY3V0b3IgYW5kIHVud3JhcCBpdC5cbiAqXG4gKiBgZXhlY3V0ZSgpYCBuZXZlciB0aHJvd3MsIHNvIGEgZmFpbGVkIGNhbGwgYXJyaXZlcyBhcyBgeyBvazogZmFsc2UgfWAgd2l0aFxuICogYSBzdGF0dXMgdGhlIGludGVyY2VwdG9ycyBhbHJlYWR5IHNhbml0aXplZDsgaXQgaXMgbG9nZ2VkIGhlcmUgYW5kIHJlLXJhaXNlZFxuICogYXMgYSBzdGFibGUge0BsaW5rIEV4ZWN1dGlvbkVycm9yfSBzbyBhbiB1cHN0cmVhbSBtZXNzYWdlIG5ldmVyIGJlY29tZXMgdGhlXG4gKiBjYWxsZXIncyBlcnJvciB0ZXh0LiBgc2lnbmFsYCBpcyB0aGUgY2FsbGVyJ3Mgb3duIGNhbmNlbGxhdGlvbiAoYW4gYWdlbnRcbiAqIHJ1biwgYSByZXF1ZXN0IHRlYXJkb3duKTsgaXQgaXMgbWVyZ2VkIHdpdGggdGhlIHNpZ25hbCB0aGUgdGltZW91dFxuICogaW50ZXJjZXB0b3Igc3VwcGxpZXMgc28gZWl0aGVyIG9uZSB1bndpbmRzIHRoZSBJL08uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlUmVhZDxUPihcbiAgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSxcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gIHNldHRpbmdzOiBXZWJTZWFyY2hFeGVjdXRpb25TZXR0aW5ncyxcbiAgZm46IChzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzZTxUPixcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIGV4ZWN1dGlvbi5ydW4oe1xuICAgIG9wZXJhdGlvbixcbiAgICBzZXR0aW5ncyxcbiAgICBleGVjdXRlOiBydW50aW1lLmV4ZWN1dGUsXG4gICAgZm4sXG4gICAgc2lnbmFsLFxuICAgIGNhbmNlbGVkOiBFeGVjdXRpb25FcnJvci5jYW5jZWxlZCxcbiAgICBmYWlsZWQ6IChmYWlsdXJlKSA9PiB7XG4gICAgICBsb2dnZXIud2FybihcImV4ZWN1dGlvbi1mYWlsZWRcIiwge1xuICAgICAgICBvcGVyYXRpb246IGZhaWx1cmUub3BlcmF0aW9uLFxuICAgICAgICBzdGF0dXM6IGZhaWx1cmUuc3RhdHVzLFxuICAgICAgICBlcnJvcjogZmFpbHVyZS5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IEV4ZWN1dGlvbkVycm9yKGB3ZWItc2VhcmNoOiAke2ZhaWx1cmUub3BlcmF0aW9ufSBmYWlsZWRgLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBmYWlsdXJlLm9wZXJhdGlvbiwgc3RhdHVzOiBmYWlsdXJlLnN0YXR1cyB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
@@ -17,8 +17,10 @@
17
17
  *
18
18
  * @module
19
19
  */
20
- import type { ResolvedWebSearchConfig } from "./config.ts";
21
- import type { WebSearchRequest, WebSearchResult } from "./schema.ts";
20
+ import { type WebSearchRuntimeInput } from "./runtime.ts";
21
+ import type { WebSearchCitation, WebSearchRequest, WebSearchResult } from "./schema.ts";
22
+ /** Parse DDG HTML result blocks into citations (title, url, snippet). */
23
+ export declare function parseDdgHtml(html: string): WebSearchCitation[];
22
24
  /**
23
25
  * Run a scraping search over DuckDuckGo. Returns the same
24
26
  * {@link WebSearchResult} shape as the native path, with `model` set to
@@ -26,4 +28,4 @@ import type { WebSearchRequest, WebSearchResult } from "./schema.ts";
26
28
  * Citations are filtered through the configured URL allow-list. `signal`
27
29
  * cancels the in-flight request.
28
30
  */
29
- export declare function runScrapeSearch(request: WebSearchRequest, config: ResolvedWebSearchConfig, signal?: AbortSignal): Promise<WebSearchResult>;
31
+ export declare function runScrapeSearch(request: WebSearchRequest, runtimeOrConfig: WebSearchRuntimeInput, signal?: AbortSignal): Promise<WebSearchResult>;
package/lib/src/scrape.js CHANGED
@@ -18,10 +18,11 @@
18
18
  * @module
19
19
  */
20
20
  import { log } from "@dbx-tools/shared-core";
21
+ import { load } from "cheerio";
21
22
  import { gotScraping } from "got-scraping";
22
23
  import { scrapeSearchExecuteDefaults, toCallSettings } from "./defaults.js";
23
24
  import { htmlFragmentToText } from "./html-text.js";
24
- import { executeRead } from "./runtime.js";
25
+ import { executeRead, toWebSearchRuntime } from "./runtime.js";
25
26
  const logger = log.logger("web-search/scrape");
26
27
  /** DuckDuckGo's no-JS HTML results endpoint (queried via GET). */
27
28
  const DDG_HTML_URL = "https://html.duckduckgo.com/html/";
@@ -42,27 +43,19 @@ function unwrapDdgUrl(href) {
42
43
  }
43
44
  }
44
45
  /** Parse DDG HTML result blocks into citations (title, url, snippet). */
45
- function parseDdgHtml(html) {
46
+ export function parseDdgHtml(html) {
47
+ const $ = load(html);
46
48
  const citations = [];
47
- // Each result: an anchor with class result__a (title + href) and a snippet
48
- // with class result__snippet. Match anchors, then the following snippet.
49
- const anchorRe = /<a[^>]*class="[^"]*result__a[^"]*"[^>]*href="([^"]+)"[^>]*>([\s\S]*?)<\/a>/g;
50
- const snippetRe = /<a[^>]*class="[^"]*result__snippet[^"]*"[^>]*>([\s\S]*?)<\/a>/g;
51
- const snippets = [];
52
- let sm;
53
- while ((sm = snippetRe.exec(html)) !== null)
54
- snippets.push(htmlFragmentToText(sm[1] ?? ""));
55
- let am;
56
- let i = 0;
57
- while ((am = anchorRe.exec(html)) !== null) {
58
- const url = unwrapDdgUrl(am[1] ?? "");
59
- const title = htmlFragmentToText(am[2] ?? "");
49
+ $("a.result__a").each((_index, element) => {
50
+ const anchor = $(element);
51
+ const url = unwrapDdgUrl(anchor.attr("href") ?? "");
52
+ const title = htmlFragmentToText(anchor.html() ?? "");
60
53
  if (!url || !title)
61
- continue;
62
- const snippet = snippets[i] ?? "";
54
+ return;
55
+ const snippetElement = anchor.closest(".result").find(".result__snippet").first();
56
+ const snippet = htmlFragmentToText(snippetElement.html() ?? "");
63
57
  citations.push({ url, title, ...(snippet ? { snippet } : {}) });
64
- i += 1;
65
- }
58
+ });
66
59
  return citations;
67
60
  }
68
61
  /**
@@ -72,8 +65,10 @@ function parseDdgHtml(html) {
72
65
  * Citations are filtered through the configured URL allow-list. `signal`
73
66
  * cancels the in-flight request.
74
67
  */
75
- export async function runScrapeSearch(request, config, signal) {
76
- const page = await executeRead("scrape-search", toCallSettings(scrapeSearchExecuteDefaults, config.timeoutMs, [
68
+ export async function runScrapeSearch(request, runtimeOrConfig, signal) {
69
+ const runtime = toWebSearchRuntime(runtimeOrConfig);
70
+ const { config } = runtime;
71
+ const page = await executeRead(runtime, "scrape-search", toCallSettings(scrapeSearchExecuteDefaults, config.timeoutMs, [
77
72
  "web-search",
78
73
  "scrape",
79
74
  request.query,
@@ -110,4 +105,4 @@ export async function runScrapeSearch(request, config, signal) {
110
105
  });
111
106
  return { query: request.query, answer, citations, model: "scrape:duckduckgo" };
112
107
  }
113
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyYXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFM0MsT0FBTyxFQUFFLDJCQUEyQixFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRzNDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUUvQyxrRUFBa0U7QUFDbEUsTUFBTSxZQUFZLEdBQUcsbUNBQW1DLENBQUM7QUFFekQ7OztHQUdHO0FBQ0gsU0FBUyxZQUFZLENBQUMsSUFBWTtJQUNoQyxJQUFJLENBQUM7UUFDSCxNQUFNLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztRQUNsRCxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxJQUFJLE1BQU07WUFBRSxPQUFPLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2pGLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQseUVBQXlFO0FB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cmFwaW5nIGZhbGxiYWNrIGZvciBgd2ViX3NlYXJjaGAsIHVzZWQgT05MWSB3aGVuIHRoZVxuICogd29ya3NwYWNlIGhhcyBubyBEYXRhYnJpY2tzIHdlYi1zZWFyY2gtY2FwYWJsZSBtb2RlbCBkZXBsb3llZCAobm8gR1BUIC9cbiAqIEdlbWluaSBzZXJ2aW5nIGVuZHBvaW50KS4gVGhlIG5hdGl2ZSBEYXRhYnJpY2tzIHdlYi1zZWFyY2ggdG9vbCBpcyBhbHdheXNcbiAqIHByZWZlcnJlZCAoc2VlIGBzZWFyY2gudHNgKTsgdGhpcyBleGlzdHMgc28gdGhlIHRvb2wgc3RpbGwgcmV0dXJucyB1c2VmdWxcbiAqIHJlc3VsdHMgaW4gYW4gZW52aXJvbm1lbnQgdGhhdCBjYW4ndCBydW4gaXQsIHJhdGhlciB0aGFuIGVycm9yaW5nIG9uIGV2ZXJ5XG4gKiBjYWxsLlxuICpcbiAqIEl0IHF1ZXJpZXMgRHVja0R1Y2tHbydzIG5vLUpTIEhUTUwgZW5kcG9pbnQgdGhyb3VnaCBgZ290LXNjcmFwaW5nYFxuICogKGJyb3dzZXItbGlrZSBmaW5nZXJwcmludHMgc28gdGhlIHJlcXVlc3QgaXNuJ3QgYmxvY2tlZCkgdmlhIGEgR0VUIHdpdGggdGhlXG4gKiBxdWVyeSBpbiB0aGUgcXVlcnkgc3RyaW5nIC0gYSBQT1NUIHRvIHRoZSBzYW1lIGVuZHBvaW50IHRyaXBzIERERydzIGJvdFxuICogY2hhbGxlbmdlIChIVFRQIDIwMiksIHdoaWxlIHRoZSBHRVQgcmV0dXJucyBub3JtYWwgcmVzdWx0IG1hcmt1cC4gSXQgdGhlblxuICogcGFyc2VzIHRoZSByZXN1bHQgYW5jaG9ycyArIHNuaXBwZXRzLiBVbmxpa2UgdGhlIG5hdGl2ZSB0b29sIHRoZXJlIGlzIG5vXG4gKiBtb2RlbCBzeW50aGVzaXppbmcgYW4gYW5zd2VyLCBzbyBgYW5zd2VyYCBpcyBhIHNob3J0IGxlYWQtaW4gb3ZlciB0aGUgdG9wXG4gKiBzbmlwcGV0cyBhbmQgdGhlIHN1YnN0YW5jZSByaWRlcyBpbiBgY2l0YXRpb25zYCAtIHRoZSBjYWxsaW5nIGFnZW50IHJlYWRzXG4gKiB0aG9zZSBhbmQgd3JpdGVzIGl0cyBvd24gYW5zd2VyLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgZ290U2NyYXBpbmcgfSBmcm9tIFwiZ290LXNjcmFwaW5nXCI7XG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBzY3JhcGVTZWFyY2hFeGVjdXRlRGVmYXVsdHMsIHRvQ2FsbFNldHRpbmdzIH0gZnJvbSBcIi4vZGVmYXVsdHMudHNcIjtcbmltcG9ydCB7IGh0bWxGcmFnbWVudFRvVGV4dCB9IGZyb20gXCIuL2h0bWwtdGV4dC50c1wiO1xuaW1wb3J0IHsgZXhlY3V0ZVJlYWQgfSBmcm9tIFwiLi9ydW50aW1lLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFdlYlNlYXJjaENpdGF0aW9uLCBXZWJTZWFyY2hSZXF1ZXN0LCBXZWJTZWFyY2hSZXN1bHQgfSBmcm9tIFwiLi9zY2hlbWEudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIndlYi1zZWFyY2gvc2NyYXBlXCIpO1xuXG4vKiogRHVja0R1Y2tHbydzIG5vLUpTIEhUTUwgcmVzdWx0cyBlbmRwb2ludCAocXVlcmllZCB2aWEgR0VUKS4gKi9cbmNvbnN0IERER19IVE1MX1VSTCA9IFwiaHR0cHM6Ly9odG1sLmR1Y2tkdWNrZ28uY29tL2h0bWwvXCI7XG5cbi8qKlxuICogRERHIHdyYXBzIHJlc3VsdCBVUkxzIGluIGEgcmVkaXJlY3QgKGAvL2R1Y2tkdWNrZ28uY29tL2wvP3VkZGc9PGVuY29kZWQ+YCkuXG4gKiBVbndyYXAgdG8gdGhlIHJlYWwgZGVzdGluYXRpb247IGxlYXZlIGFscmVhZHktYWJzb2x1dGUgVVJMcyB1bnRvdWNoZWQuXG4gKi9cbmZ1bmN0aW9uIHVud3JhcERkZ1VybChocmVmOiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHUgPSBuZXcgVVJMKGhyZWYsIFwiaHR0cHM6Ly9kdWNrZHVja2dvLmNvbVwiKTtcbiAgICBjb25zdCB0YXJnZXQgPSB1LnNlYXJjaFBhcmFtcy5nZXQoXCJ1ZGRnXCIpO1xuICAgIGlmICh0YXJnZXQpIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodGFyZ2V0KTtcbiAgICByZXR1cm4gdS5wcm90b2NvbCA9PT0gXCJodHRwOlwiIHx8IHUucHJvdG9jb2wgPT09IFwiaHR0cHM6XCIgPyB1LnRvU3RyaW5nKCkgOiBocmVmO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gaHJlZjtcbiAgfVxufVxuXG4vKiogUGFyc2UgRERHIEhUTUwgcmVzdWx0IGJsb2NrcyBpbnRvIGNpdGF0aW9ucyAodGl0bGUsIHVybCwgc25pcHBldCkuICovXG5mdW5jdGlvbiBwYXJzZURkZ0h0bWwoaHRtbDogc3RyaW5nKTogV2ViU2VhcmNoQ2l0YXRpb25bXSB7XG4gIGNvbnN0IGNpdGF0aW9uczogV2ViU2VhcmNoQ2l0YXRpb25bXSA9IFtdO1xuICAvLyBFYWNoIHJlc3VsdDogYW4gYW5jaG9yIHdpdGggY2xhc3MgcmVzdWx0X19hICh0aXRsZSArIGhyZWYpIGFuZCBhIHNuaXBwZXRcbiAgLy8gd2l0aCBjbGFzcyByZXN1bHRfX3NuaXBwZXQuIE1hdGNoIGFuY2hvcnMsIHRoZW4gdGhlIGZvbGxvd2luZyBzbmlwcGV0LlxuICBjb25zdCBhbmNob3JSZSA9IC88YVtePl0qY2xhc3M9XCJbXlwiXSpyZXN1bHRfX2FbXlwiXSpcIltePl0qaHJlZj1cIihbXlwiXSspXCJbXj5dKj4oW1xcc1xcU10qPyk8XFwvYT4vZztcbiAgY29uc3Qgc25pcHBldFJlID0gLzxhW14+XSpjbGFzcz1cIlteXCJdKnJlc3VsdF9fc25pcHBldFteXCJdKlwiW14+XSo+KFtcXHNcXFNdKj8pPFxcL2E+L2c7XG4gIGNvbnN0IHNuaXBwZXRzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgc206IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG4gIHdoaWxlICgoc20gPSBzbmlwcGV0UmUuZXhlYyhodG1sKSkgIT09IG51bGwpIHNuaXBwZXRzLnB1c2goaHRtbEZyYWdtZW50VG9UZXh0KHNtWzFdID8/IFwiXCIpKTtcbiAgbGV0IGFtOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICBsZXQgaSA9IDA7XG4gIHdoaWxlICgoYW0gPSBhbmNob3JSZS5leGVjKGh0bWwpKSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHVybCA9IHVud3JhcERkZ1VybChhbVsxXSA/PyBcIlwiKTtcbiAgICBjb25zdCB0aXRsZSA9IGh0bWxGcmFnbWVudFRvVGV4dChhbVsyXSA/PyBcIlwiKTtcbiAgICBpZiAoIXVybCB8fCAhdGl0bGUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHNuaXBwZXQgPSBzbmlwcGV0c1tpXSA/PyBcIlwiO1xuICAgIGNpdGF0aW9ucy5wdXNoKHsgdXJsLCB0aXRsZSwgLi4uKHNuaXBwZXQgPyB7IHNuaXBwZXQgfSA6IHt9KSB9KTtcbiAgICBpICs9IDE7XG4gIH1cbiAgcmV0dXJuIGNpdGF0aW9ucztcbn1cblxuLyoqXG4gKiBSdW4gYSBzY3JhcGluZyBzZWFyY2ggb3ZlciBEdWNrRHVja0dvLiBSZXR1cm5zIHRoZSBzYW1lXG4gKiB7QGxpbmsgV2ViU2VhcmNoUmVzdWx0fSBzaGFwZSBhcyB0aGUgbmF0aXZlIHBhdGgsIHdpdGggYG1vZGVsYCBzZXQgdG9cbiAqIGBcInNjcmFwZTpkdWNrZHVja2dvXCJgIHNvIGNhbGxlcnMgY2FuIHRlbGwgaG93IHRoZSByZXN1bHQgd2FzIHByb2R1Y2VkLlxuICogQ2l0YXRpb25zIGFyZSBmaWx0ZXJlZCB0aHJvdWdoIHRoZSBjb25maWd1cmVkIFVSTCBhbGxvdy1saXN0LiBgc2lnbmFsYFxuICogY2FuY2VscyB0aGUgaW4tZmxpZ2h0IHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5TY3JhcGVTZWFyY2goXG4gIHJlcXVlc3Q6IFdlYlNlYXJjaFJlcXVlc3QsXG4gIGNvbmZpZzogUmVzb2x2ZWRXZWJTZWFyY2hDb25maWcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxXZWJTZWFyY2hSZXN1bHQ+IHtcbiAgY29uc3QgcGFnZSA9IGF3YWl0IGV4ZWN1dGVSZWFkKFxuICAgIFwic2NyYXBlLXNlYXJjaFwiLFxuICAgIHRvQ2FsbFNldHRpbmdzKHNjcmFwZVNlYXJjaEV4ZWN1dGVEZWZhdWx0cywgY29uZmlnLnRpbWVvdXRNcywgW1xuICAgICAgXCJ3ZWItc2VhcmNoXCIsXG4gICAgICBcInNjcmFwZVwiLFxuICAgICAgcmVxdWVzdC5xdWVyeSxcbiAgICBdKSxcbiAgICBhc3luYyAoZXhlY3V0ZVNpZ25hbCk6IFByb21pc2U8eyBib2R5OiBzdHJpbmc7IHN0YXR1c0NvZGU6IG51bWJlciB9PiA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdvdFNjcmFwaW5nKHtcbiAgICAgICAgdXJsOiBgJHtEREdfSFRNTF9VUkx9P3E9JHtlbmNvZGVVUklDb21wb25lbnQocmVxdWVzdC5xdWVyeSl9YCxcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAvLyBnb3QncyBvd24gdGltZW91dCBhYm9ydHMgdGhlIHNvY2tldCBhbmQgcmVwb3J0cyB3aGljaCBwaGFzZSB0aW1lZFxuICAgICAgICAvLyBvdXQ7IHRoZSBpbnRlcmNlcHRvciB0aW1lb3V0IGJvdW5kcyB0aGUgd2hvbGUgYXR0ZW1wdCBhcm91bmQgaXQuXG4gICAgICAgIHRpbWVvdXQ6IHsgcmVxdWVzdDogY29uZmlnLnRpbWVvdXRNcyB9LFxuICAgICAgICB0aHJvd0h0dHBFcnJvcnM6IGZhbHNlLFxuICAgICAgICBmb2xsb3dSZWRpcmVjdDogdHJ1ZSxcbiAgICAgICAgLi4uKGV4ZWN1dGVTaWduYWwgPyB7IHNpZ25hbDogZXhlY3V0ZVNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBib2R5OiB0eXBlb2YgcmVzcG9uc2UuYm9keSA9PT0gXCJzdHJpbmdcIiA/IHJlc3BvbnNlLmJvZHkgOiBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyBcIlwiKSxcbiAgICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzQ29kZSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBzaWduYWwsXG4gICk7XG4gIGNvbnN0IGFsbCA9IHBhcnNlRGRnSHRtbChwYWdlLmJvZHkpO1xuICBjb25zdCBwZXJtaXR0ZWQgPSBhbGwuZmlsdGVyKChjKSA9PiBjb25maWcuYWxsb3dMaXN0LmFsbG93cyhjLnVybCkpO1xuICBjb25zdCBjaXRhdGlvbnMgPSBwZXJtaXR0ZWQuc2xpY2UoMCwgY29uZmlnLm1heENpdGF0aW9ucyk7XG4gIGNvbnN0IGFuc3dlciA9XG4gICAgY2l0YXRpb25zLmxlbmd0aCA+IDBcbiAgICAgID8gYFdlYiByZXN1bHRzIGZvciBcIiR7cmVxdWVzdC5xdWVyeX1cIiAobm8gRGF0YWJyaWNrcyB3ZWItc2VhcmNoIG1vZGVsIGlzIGRlcGxveWVkIGluIHRoaXMgd29ya3NwYWNlLCBzbyB0aGVzZSBhcmUgdW5zeW50aGVzaXplZCBzZWFyY2ggcmVzdWx0cyAtIHJlYWQgdGhlIGNpdGF0aW9ucyk6XFxuXFxuYCArXG4gICAgICAgIGNpdGF0aW9uc1xuICAgICAgICAgIC5tYXAoKGMsIG4pID0+IGAke24gKyAxfS4gJHtjLnRpdGxlfSR7Yy5zbmlwcGV0ID8gYCAtICR7Yy5zbmlwcGV0fWAgOiBcIlwifSAoJHtjLnVybH0pYClcbiAgICAgICAgICAuam9pbihcIlxcblwiKVxuICAgICAgOiBgTm8gd2ViIHJlc3VsdHMgZm91bmQgZm9yIFwiJHtyZXF1ZXN0LnF1ZXJ5fVwiLmA7XG4gIGxvZ2dlci5kZWJ1ZyhcInNjcmFwZWRcIiwge1xuICAgIHF1ZXJ5OiByZXF1ZXN0LnF1ZXJ5LFxuICAgIGZvdW5kOiBhbGwubGVuZ3RoLFxuICAgIHJldHVybmVkOiBjaXRhdGlvbnMubGVuZ3RoLFxuICAgIHN0YXR1czogcGFnZS5zdGF0dXNDb2RlLFxuICB9KTtcbiAgcmV0dXJuIHsgcXVlcnk6IHJlcXVlc3QucXVlcnksIGFuc3dlciwgY2l0YXRpb25zLCBtb2RlbDogXCJzY3JhcGU6ZHVja2R1Y2tnb1wiIH07XG59XG4iXX0=
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyYXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDL0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMzQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQThCLE1BQU0sY0FBYyxDQUFDO0FBRzNGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUUvQyxrRUFBa0U7QUFDbEUsTUFBTSxZQUFZLEdBQUcsbUNBQW1DLENBQUM7QUFFekQ7OztHQUdHO0FBQ0gsU0FBUyxZQUFZLENBQUMsSUFBWTtJQUNoQyxJQUFJLENBQUM7UUFDSCxNQUFNLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztRQUNsRCxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxJQUFJLE1BQU07WUFBRSxPQUFPLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2pGLENBQUM7SUFBQyxNQUFNLENBQUM7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cmFwaW5nIGZhbGxiYWNrIGZvciBgd2ViX3NlYXJjaGAsIHVzZWQgT05MWSB3aGVuIHRoZVxuICogd29ya3NwYWNlIGhhcyBubyBEYXRhYnJpY2tzIHdlYi1zZWFyY2gtY2FwYWJsZSBtb2RlbCBkZXBsb3llZCAobm8gR1BUIC9cbiAqIEdlbWluaSBzZXJ2aW5nIGVuZHBvaW50KS4gVGhlIG5hdGl2ZSBEYXRhYnJpY2tzIHdlYi1zZWFyY2ggdG9vbCBpcyBhbHdheXNcbiAqIHByZWZlcnJlZCAoc2VlIGBzZWFyY2gudHNgKTsgdGhpcyBleGlzdHMgc28gdGhlIHRvb2wgc3RpbGwgcmV0dXJucyB1c2VmdWxcbiAqIHJlc3VsdHMgaW4gYW4gZW52aXJvbm1lbnQgdGhhdCBjYW4ndCBydW4gaXQsIHJhdGhlciB0aGFuIGVycm9yaW5nIG9uIGV2ZXJ5XG4gKiBjYWxsLlxuICpcbiAqIEl0IHF1ZXJpZXMgRHVja0R1Y2tHbydzIG5vLUpTIEhUTUwgZW5kcG9pbnQgdGhyb3VnaCBgZ290LXNjcmFwaW5nYFxuICogKGJyb3dzZXItbGlrZSBmaW5nZXJwcmludHMgc28gdGhlIHJlcXVlc3QgaXNuJ3QgYmxvY2tlZCkgdmlhIGEgR0VUIHdpdGggdGhlXG4gKiBxdWVyeSBpbiB0aGUgcXVlcnkgc3RyaW5nIC0gYSBQT1NUIHRvIHRoZSBzYW1lIGVuZHBvaW50IHRyaXBzIERERydzIGJvdFxuICogY2hhbGxlbmdlIChIVFRQIDIwMiksIHdoaWxlIHRoZSBHRVQgcmV0dXJucyBub3JtYWwgcmVzdWx0IG1hcmt1cC4gSXQgdGhlblxuICogcGFyc2VzIHRoZSByZXN1bHQgYW5jaG9ycyArIHNuaXBwZXRzLiBVbmxpa2UgdGhlIG5hdGl2ZSB0b29sIHRoZXJlIGlzIG5vXG4gKiBtb2RlbCBzeW50aGVzaXppbmcgYW4gYW5zd2VyLCBzbyBgYW5zd2VyYCBpcyBhIHNob3J0IGxlYWQtaW4gb3ZlciB0aGUgdG9wXG4gKiBzbmlwcGV0cyBhbmQgdGhlIHN1YnN0YW5jZSByaWRlcyBpbiBgY2l0YXRpb25zYCAtIHRoZSBjYWxsaW5nIGFnZW50IHJlYWRzXG4gKiB0aG9zZSBhbmQgd3JpdGVzIGl0cyBvd24gYW5zd2VyLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgbG9hZCB9IGZyb20gXCJjaGVlcmlvXCI7XG5pbXBvcnQgeyBnb3RTY3JhcGluZyB9IGZyb20gXCJnb3Qtc2NyYXBpbmdcIjtcbmltcG9ydCB7IHNjcmFwZVNlYXJjaEV4ZWN1dGVEZWZhdWx0cywgdG9DYWxsU2V0dGluZ3MgfSBmcm9tIFwiLi9kZWZhdWx0cy50c1wiO1xuaW1wb3J0IHsgaHRtbEZyYWdtZW50VG9UZXh0IH0gZnJvbSBcIi4vaHRtbC10ZXh0LnRzXCI7XG5pbXBvcnQgeyBleGVjdXRlUmVhZCwgdG9XZWJTZWFyY2hSdW50aW1lLCB0eXBlIFdlYlNlYXJjaFJ1bnRpbWVJbnB1dCB9IGZyb20gXCIuL3J1bnRpbWUudHNcIjtcbmltcG9ydCB0eXBlIHsgV2ViU2VhcmNoQ2l0YXRpb24sIFdlYlNlYXJjaFJlcXVlc3QsIFdlYlNlYXJjaFJlc3VsdCB9IGZyb20gXCIuL3NjaGVtYS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwid2ViLXNlYXJjaC9zY3JhcGVcIik7XG5cbi8qKiBEdWNrRHVja0dvJ3Mgbm8tSlMgSFRNTCByZXN1bHRzIGVuZHBvaW50IChxdWVyaWVkIHZpYSBHRVQpLiAqL1xuY29uc3QgRERHX0hUTUxfVVJMID0gXCJodHRwczovL2h0bWwuZHVja2R1Y2tnby5jb20vaHRtbC9cIjtcblxuLyoqXG4gKiBEREcgd3JhcHMgcmVzdWx0IFVSTHMgaW4gYSByZWRpcmVjdCAoYC8vZHVja2R1Y2tnby5jb20vbC8/dWRkZz08ZW5jb2RlZD5gKS5cbiAqIFVud3JhcCB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbjsgbGVhdmUgYWxyZWFkeS1hYnNvbHV0ZSBVUkxzIHVudG91Y2hlZC5cbiAqL1xuZnVuY3Rpb24gdW53cmFwRGRnVXJsKGhyZWY6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3QgdSA9IG5ldyBVUkwoaHJlZiwgXCJodHRwczovL2R1Y2tkdWNrZ28uY29tXCIpO1xuICAgIGNvbnN0IHRhcmdldCA9IHUuc2VhcmNoUGFyYW1zLmdldChcInVkZGdcIik7XG4gICAgaWYgKHRhcmdldCkgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0YXJnZXQpO1xuICAgIHJldHVybiB1LnByb3RvY29sID09PSBcImh0dHA6XCIgfHwgdS5wcm90b2NvbCA9PT0gXCJodHRwczpcIiA/IHUudG9TdHJpbmcoKSA6IGhyZWY7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBocmVmO1xuICB9XG59XG5cbi8qKiBQYXJzZSBEREcgSFRNTCByZXN1bHQgYmxvY2tzIGludG8gY2l0YXRpb25zICh0aXRsZSwgdXJsLCBzbmlwcGV0KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURkZ0h0bWwoaHRtbDogc3RyaW5nKTogV2ViU2VhcmNoQ2l0YXRpb25bXSB7XG4gIGNvbnN0ICQgPSBsb2FkKGh0bWwpO1xuICBjb25zdCBjaXRhdGlvbnM6IFdlYlNlYXJjaENpdGF0aW9uW10gPSBbXTtcbiAgJChcImEucmVzdWx0X19hXCIpLmVhY2goKF9pbmRleCwgZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGFuY2hvciA9ICQoZWxlbWVudCk7XG4gICAgY29uc3QgdXJsID0gdW53cmFwRGRnVXJsKGFuY2hvci5hdHRyKFwiaHJlZlwiKSA/PyBcIlwiKTtcbiAgICBjb25zdCB0aXRsZSA9IGh0bWxGcmFnbWVudFRvVGV4dChhbmNob3IuaHRtbCgpID8/IFwiXCIpO1xuICAgIGlmICghdXJsIHx8ICF0aXRsZSkgcmV0dXJuO1xuICAgIGNvbnN0IHNuaXBwZXRFbGVtZW50ID0gYW5jaG9yLmNsb3Nlc3QoXCIucmVzdWx0XCIpLmZpbmQoXCIucmVzdWx0X19zbmlwcGV0XCIpLmZpcnN0KCk7XG4gICAgY29uc3Qgc25pcHBldCA9IGh0bWxGcmFnbWVudFRvVGV4dChzbmlwcGV0RWxlbWVudC5odG1sKCkgPz8gXCJcIik7XG4gICAgY2l0YXRpb25zLnB1c2goeyB1cmwsIHRpdGxlLCAuLi4oc25pcHBldCA/IHsgc25pcHBldCB9IDoge30pIH0pO1xuICB9KTtcbiAgcmV0dXJuIGNpdGF0aW9ucztcbn1cblxuLyoqXG4gKiBSdW4gYSBzY3JhcGluZyBzZWFyY2ggb3ZlciBEdWNrRHVja0dvLiBSZXR1cm5zIHRoZSBzYW1lXG4gKiB7QGxpbmsgV2ViU2VhcmNoUmVzdWx0fSBzaGFwZSBhcyB0aGUgbmF0aXZlIHBhdGgsIHdpdGggYG1vZGVsYCBzZXQgdG9cbiAqIGBcInNjcmFwZTpkdWNrZHVja2dvXCJgIHNvIGNhbGxlcnMgY2FuIHRlbGwgaG93IHRoZSByZXN1bHQgd2FzIHByb2R1Y2VkLlxuICogQ2l0YXRpb25zIGFyZSBmaWx0ZXJlZCB0aHJvdWdoIHRoZSBjb25maWd1cmVkIFVSTCBhbGxvdy1saXN0LiBgc2lnbmFsYFxuICogY2FuY2VscyB0aGUgaW4tZmxpZ2h0IHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5TY3JhcGVTZWFyY2goXG4gIHJlcXVlc3Q6IFdlYlNlYXJjaFJlcXVlc3QsXG4gIHJ1bnRpbWVPckNvbmZpZzogV2ViU2VhcmNoUnVudGltZUlucHV0LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8V2ViU2VhcmNoUmVzdWx0PiB7XG4gIGNvbnN0IHJ1bnRpbWUgPSB0b1dlYlNlYXJjaFJ1bnRpbWUocnVudGltZU9yQ29uZmlnKTtcbiAgY29uc3QgeyBjb25maWcgfSA9IHJ1bnRpbWU7XG4gIGNvbnN0IHBhZ2UgPSBhd2FpdCBleGVjdXRlUmVhZChcbiAgICBydW50aW1lLFxuICAgIFwic2NyYXBlLXNlYXJjaFwiLFxuICAgIHRvQ2FsbFNldHRpbmdzKHNjcmFwZVNlYXJjaEV4ZWN1dGVEZWZhdWx0cywgY29uZmlnLnRpbWVvdXRNcywgW1xuICAgICAgXCJ3ZWItc2VhcmNoXCIsXG4gICAgICBcInNjcmFwZVwiLFxuICAgICAgcmVxdWVzdC5xdWVyeSxcbiAgICBdKSxcbiAgICBhc3luYyAoZXhlY3V0ZVNpZ25hbCk6IFByb21pc2U8eyBib2R5OiBzdHJpbmc7IHN0YXR1c0NvZGU6IG51bWJlciB9PiA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdvdFNjcmFwaW5nKHtcbiAgICAgICAgdXJsOiBgJHtEREdfSFRNTF9VUkx9P3E9JHtlbmNvZGVVUklDb21wb25lbnQocmVxdWVzdC5xdWVyeSl9YCxcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAvLyBnb3QncyBvd24gdGltZW91dCBhYm9ydHMgdGhlIHNvY2tldCBhbmQgcmVwb3J0cyB3aGljaCBwaGFzZSB0aW1lZFxuICAgICAgICAvLyBvdXQ7IHRoZSBpbnRlcmNlcHRvciB0aW1lb3V0IGJvdW5kcyB0aGUgd2hvbGUgYXR0ZW1wdCBhcm91bmQgaXQuXG4gICAgICAgIHRpbWVvdXQ6IHsgcmVxdWVzdDogY29uZmlnLnRpbWVvdXRNcyB9LFxuICAgICAgICB0aHJvd0h0dHBFcnJvcnM6IGZhbHNlLFxuICAgICAgICBmb2xsb3dSZWRpcmVjdDogdHJ1ZSxcbiAgICAgICAgLi4uKGV4ZWN1dGVTaWduYWwgPyB7IHNpZ25hbDogZXhlY3V0ZVNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBib2R5OiB0eXBlb2YgcmVzcG9uc2UuYm9keSA9PT0gXCJzdHJpbmdcIiA/IHJlc3BvbnNlLmJvZHkgOiBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyBcIlwiKSxcbiAgICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzQ29kZSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBzaWduYWwsXG4gICk7XG4gIGNvbnN0IGFsbCA9IHBhcnNlRGRnSHRtbChwYWdlLmJvZHkpO1xuICBjb25zdCBwZXJtaXR0ZWQgPSBhbGwuZmlsdGVyKChjKSA9PiBjb25maWcuYWxsb3dMaXN0LmFsbG93cyhjLnVybCkpO1xuICBjb25zdCBjaXRhdGlvbnMgPSBwZXJtaXR0ZWQuc2xpY2UoMCwgY29uZmlnLm1heENpdGF0aW9ucyk7XG4gIGNvbnN0IGFuc3dlciA9XG4gICAgY2l0YXRpb25zLmxlbmd0aCA+IDBcbiAgICAgID8gYFdlYiByZXN1bHRzIGZvciBcIiR7cmVxdWVzdC5xdWVyeX1cIiAobm8gRGF0YWJyaWNrcyB3ZWItc2VhcmNoIG1vZGVsIGlzIGRlcGxveWVkIGluIHRoaXMgd29ya3NwYWNlLCBzbyB0aGVzZSBhcmUgdW5zeW50aGVzaXplZCBzZWFyY2ggcmVzdWx0cyAtIHJlYWQgdGhlIGNpdGF0aW9ucyk6XFxuXFxuYCArXG4gICAgICAgIGNpdGF0aW9uc1xuICAgICAgICAgIC5tYXAoKGMsIG4pID0+IGAke24gKyAxfS4gJHtjLnRpdGxlfSR7Yy5zbmlwcGV0ID8gYCAtICR7Yy5zbmlwcGV0fWAgOiBcIlwifSAoJHtjLnVybH0pYClcbiAgICAgICAgICAuam9pbihcIlxcblwiKVxuICAgICAgOiBgTm8gd2ViIHJlc3VsdHMgZm91bmQgZm9yIFwiJHtyZXF1ZXN0LnF1ZXJ5fVwiLmA7XG4gIGxvZ2dlci5kZWJ1ZyhcInNjcmFwZWRcIiwge1xuICAgIHF1ZXJ5OiByZXF1ZXN0LnF1ZXJ5LFxuICAgIGZvdW5kOiBhbGwubGVuZ3RoLFxuICAgIHJldHVybmVkOiBjaXRhdGlvbnMubGVuZ3RoLFxuICAgIHN0YXR1czogcGFnZS5zdGF0dXNDb2RlLFxuICB9KTtcbiAgcmV0dXJuIHsgcXVlcnk6IHJlcXVlc3QucXVlcnksIGFuc3dlciwgY2l0YXRpb25zLCBtb2RlbDogXCJzY3JhcGU6ZHVja2R1Y2tnb1wiIH07XG59XG4iXX0=