@dbx-tools/search 0.9.154 → 0.9.157

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.
@@ -24,7 +24,7 @@
24
24
  */
25
25
  import { ExecutionError } from "@databricks/appkit";
26
26
  import { postgresConnectionOptions } from "@dbx-tools/postgres";
27
- import { asyncUtils, log, object, stringUtils } from "@dbx-tools/shared-core";
27
+ import { log, sleep, isRecord, tokenizeWithOptions, trimToEmpty, trimToNull, toSlug, } from "@dbx-tools/shared-core";
28
28
  import { Pool } from "pg";
29
29
  const logger = log.logger("search/lakebase");
30
30
  /** The internal columns every search table carries, excluded from a hit's `fields`. */
@@ -50,9 +50,7 @@ const RESERVED_COLUMNS = new Set(["id", "search_text", "document", "search_vecto
50
50
  * built.
51
51
  */
52
52
  export function toSearchTerms(query) {
53
- return [
54
- ...stringUtils.tokenizeWithOptions({ lowerCase: true, camelCase: false, distinct: true }, query),
55
- ];
53
+ return [...tokenizeWithOptions({ lowerCase: true, camelCase: false, distinct: true }, query)];
56
54
  }
57
55
  /**
58
56
  * Compile terms into a `to_tsquery` input where every term is a PREFIX, so a
@@ -93,7 +91,7 @@ export class LakebaseSearchBackend {
93
91
  this.pool = this.poolSource.managedPool() ?? undefined;
94
92
  if (this.pool)
95
93
  return this.pool;
96
- await asyncUtils.sleep(50);
94
+ await sleep(50);
97
95
  }
98
96
  throw new ExecutionError("search (lakebase): managed pool did not initialize", {
99
97
  context: { operation: "connect" },
@@ -128,7 +126,7 @@ export class LakebaseSearchBackend {
128
126
  * shaped identically to the Vector Search backend.
129
127
  */
130
128
  async search(index, query, options = {}) {
131
- const text = stringUtils.trimToEmpty(query);
129
+ const text = trimToEmpty(query);
132
130
  const table = this.tableFor(index);
133
131
  const limit = options.limit ?? 10;
134
132
  const pool = await this.getPool();
@@ -241,7 +239,7 @@ export class LakebaseSearchBackend {
241
239
  /** Upsert rows: the whole document as jsonb + a flattened text blob to index. */
242
240
  async upsert(pool, table, documents, textColumn, signal) {
243
241
  for (const doc of documents) {
244
- const id = stringUtils.trimToNull(String(doc.id ?? doc.ID ?? "")) ?? undefined;
242
+ const id = trimToNull(String(doc.id ?? doc.ID ?? "")) ?? undefined;
245
243
  if (id === undefined) {
246
244
  throw new ExecutionError("search (lakebase): a document is missing an `id`", {
247
245
  context: { operation: "addDocuments" },
@@ -256,7 +254,7 @@ export class LakebaseSearchBackend {
256
254
  }
257
255
  /** The text a row is indexed by: the text column first, then any other string field. */
258
256
  searchText(doc, textColumn) {
259
- const primary = stringUtils.trimToEmpty(String(doc[textColumn] ?? ""));
257
+ const primary = trimToEmpty(String(doc[textColumn] ?? ""));
260
258
  const rest = Object.entries(doc)
261
259
  .filter(([key, value]) => key !== textColumn && key !== "id" && typeof value === "string")
262
260
  .map(([, value]) => value);
@@ -264,7 +262,7 @@ export class LakebaseSearchBackend {
264
262
  }
265
263
  /** A hit's `fields`: the stored document minus the reserved/internal keys. */
266
264
  toFields(document) {
267
- if (!object.isRecord(document))
265
+ if (!isRecord(document))
268
266
  return {};
269
267
  const fields = {};
270
268
  for (const [key, value] of Object.entries(document)) {
@@ -302,7 +300,7 @@ export class LakebaseSearchBackend {
302
300
  /** A safe bare table name derived from an index reference. */
303
301
  bareName(reference) {
304
302
  const last = reference.split(".").filter(Boolean).pop() ?? reference;
305
- const slug = stringUtils.toSlug(last).replace(/-/g, "_");
303
+ const slug = toSlug(last).replace(/-/g, "_");
306
304
  return slug.length > 0 ? slug : "documents";
307
305
  }
308
306
  /** Quote a Postgres identifier. */
@@ -333,4 +331,4 @@ export class LakebaseSearchBackend {
333
331
  }
334
332
  }
335
333
  }
336
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFrZWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVE5RSxPQUFPLEVBQUUsSUFBSSxFQUFvQyxNQUFNLElBQUksQ0FBQztBQUU1RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFN0MsdUZBQXVGO0FBQ3ZGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBRXJGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxLQUFhO0lBQ3pDLE9BQU87UUFDTCxHQUFHLFdBQVcsQ0FBQyxtQkFBbUIsQ0FDaEMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUNyRCxLQUFLLENBQ047S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQXdCLEVBQUUsV0FBc0IsR0FBRztJQUMzRSxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ2hFLENB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QUFFLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQy9DLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQVcsRUFBRSxDQUFDO1FBQ3RDLENBQUM7Z0JBQVMsQ0FBQztZQUNULE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLFFBQVE7Z0JBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExha2ViYXNlIChQb3N0Z3JlcykgZnVsbC10ZXh0IHJ1bnRpbWUgYmVoaW5kIGBsYWtlYmFzZUFpU2VhcmNoYC4gSXQgcHJvdmlzaW9uc1xuICogYSBzaW5nbGUgdGFibGUgcGVyIGluZGV4IGFsaWFzLCBpbmRleGVzIGEgZ2VuZXJhdGVkXG4gKiBgdHN2ZWN0b3JgLCBhbmQgYW5zd2VycyBxdWVyaWVzIHdpdGggYSBwcmVmaXggYHRvX3RzcXVlcnlgICsgYHRzX3JhbmtgLlxuICpcbiAqIFF1ZXJpZXMgYXJlIGNvbXBpbGVkIHJhdGhlciB0aGFuIHBhc3NlZCB0aHJvdWdoIGB3ZWJzZWFyY2hfdG9fdHNxdWVyeWAsXG4gKiBiZWNhdXNlIGEgc2VhcmNoIGJveCBuZWVkcyB0d28gdGhpbmdzIHRoYXQgZnVuY3Rpb24gZG9lcyBub3QgZ2l2ZTpcbiAqIHB1bmN0dWF0aW9uLWluc2Vuc2l0aXZpdHkgKHNvIGBzdG9yZS1pbnRlbGxpZ2VuY2VgIG1hdGNoZXMgdGhlIHNhbWUgcm93cyBhc1xuICogYHN0b3JlIGludGVsbGlnZW5jZWApIGFuZCBwcmVmaXggbWF0Y2hpbmcgKHNvIGBpbnRlbGAgcmVhY2hlc1xuICogYGludGVsbGlnZW5jZWApLiBTZWUge0BsaW5rIHRvU2VhcmNoVGVybXN9IC8ge0BsaW5rIHRvVHNRdWVyeX0uXG4gKlxuICogVGhlIHdob2xlIHBvaW50IGlzIHBhcml0eTogdGhpcyBiYWNrZW5kIHJldHVybnMgdGhlIEVYQUNUIHNhbWVcbiAqIGBAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hgIHNoYXBlcyAoYFNlYXJjaFJlc3VsdGAgLyBgU2VhcmNoSGl0YCAvXG4gKiBgVXBzZXJ0UmVzdWx0YCkgYXMgdGhlIFZlY3RvciBTZWFyY2ggYmFja2VuZCwgc28gdGhlIGNsaWVudCwgdGhlIE1hc3RyYVxuICogdG9vbHMsIHRoZSByb3V0ZXMsIGFuZCB0aGUgUmVhY3Qgc2VhcmNoIGJveCBjYW5ub3QgdGVsbCB3aGljaCBvbmUgYW5zd2VyZWQuXG4gKiBBIGhpdCdzIGBpZGAgaXMgdGhlIHByaW1hcnkga2V5LCBpdHMgYHNjb3JlYCBpcyB0aGUgdGV4dC1yYW5rLCBhbmQgYGZpZWxkc2BcbiAqIGlzIHRoZSBzdG9yZWQgZG9jdW1lbnQgbWludXMgdGhlIGludGVybmFsIGNvbHVtbnMuXG4gKlxuICogU3RhbmRhbG9uZSBjYWxsZXJzIGNhbiBzdXBwbHkgYSBgUG9vbENvbmZpZ2AgZmFjdG9yeSBhbmQgbGV0IHRoaXMgYmFja2VuZCBvd25cbiAqIHRoZSByZXN1bHRpbmcgcG9vbC4gQXBwS2l0IGludGVncmF0aW9ucyBpbnN0ZWFkIHN1cHBseSB0aGUgTGFrZWJhc2UgcGx1Z2luJ3NcbiAqIG1hbmFnZWQgcG9vbCBkaXJlY3RseSwgcHJlc2VydmluZyBpdHMgcm91dGluZyBhbmQgY3JlZGVudGlhbCByZWZyZXNoLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBFeGVjdXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IHBvc3RncmVzQ29ubmVjdGlvbk9wdGlvbnMgfSBmcm9tIFwiQGRieC10b29scy9wb3N0Z3Jlc1wiO1xuaW1wb3J0IHsgYXN5bmNVdGlscywgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHtcbiAgU2VhcmNoRG9jdW1lbnQsXG4gIFNlYXJjaEhpdCxcbiAgU2VhcmNoUmVxdWVzdCxcbiAgU2VhcmNoUmVzdWx0LFxuICBVcHNlcnRSZXN1bHQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hcIjtcbmltcG9ydCB7IFBvb2wsIHR5cGUgUG9vbENsaWVudCwgdHlwZSBQb29sQ29uZmlnIH0gZnJvbSBcInBnXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJzZWFyY2gvbGFrZWJhc2VcIik7XG5cbi8qKiBUaGUgaW50ZXJuYWwgY29sdW1ucyBldmVyeSBzZWFyY2ggdGFibGUgY2FycmllcywgZXhjbHVkZWQgZnJvbSBhIGhpdCdzIGBmaWVsZHNgLiAqL1xuY29uc3QgUkVTRVJWRURfQ09MVU1OUyA9IG5ldyBTZXQoW1wiaWRcIiwgXCJzZWFyY2hfdGV4dFwiLCBcImRvY3VtZW50XCIsIFwic2VhcmNoX3ZlY3RvclwiXSk7XG5cbi8qKlxuICogU3BsaXQgYSBzZWFyY2gtYm94IHN0cmluZyBpbnRvIHRoZSB0ZXJtcyBhIHRzcXVlcnkgaXMgYnVpbHQgZnJvbSwgdXNpbmcgdGhlXG4gKiBzaGFyZWQgYEBkYngtdG9vbHMvc2hhcmVkLWNvcmVgIHRva2VuaXplciBzbyB0aGUgc3BsaXR0aW5nIHJ1bGVzIHN0YXlcbiAqIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgdG9vbGtpdC5cbiAqXG4gKiBTcGxpdHRpbmcgb24gcHVuY3R1YXRpb24gaXMgd2hhdCBtYWtlcyBgc3RvcmUtaW50ZWxsaWdlbmNlYCBiZWhhdmUgbGlrZVxuICogYHN0b3JlIGludGVsbGlnZW5jZWAuIFBvc3RncmVzIGluZGV4ZXMgYSBoeXBoZW5hdGVkIHdvcmQgYXMgdGhlIGNvbXBvdW5kXG4gKiBsZXhlbWUgUExVUyBlYWNoIG9mIGl0cyBwYXJ0cywgYnV0IGNvbXBpbGVzIGEgaHlwaGVuYXRlZCBRVUVSWSB0byB0aGVcbiAqIGNvbXBvdW5kIGFsb25lIC0gc28gYHN0b3JlLWludGVsbGlnZW5jZWAgZGVtYW5kcyBhIGBzdG9yZS1pbnRlbGxpZ2AgbGV4ZW1lXG4gKiB0aGF0IGEgZG9jdW1lbnQgdGl0bGVkIGBzYW1wbGUtc3RvcmUtaW50ZWxsaWdlbmNlYCBkb2VzIG5vdCBoYXZlLCBhbmQgdGhlXG4gKiBzZWFyY2ggc2lsZW50bHkgcmV0dXJucyBub3RoaW5nIHdoaWxlIGBzdG9yZSBpbnRlbGxpZ2VuY2VgIHJldHVybnNcbiAqIGV2ZXJ5dGhpbmcuIFNhbWUgZm9yIGAuYCBhbmQgYF9gIGluIGEgdGFibGUgcmVmZXJlbmNlLlxuICpcbiAqIGBjYW1lbENhc2U6IGZhbHNlYCBpcyBsb2FkLWJlYXJpbmcgcmF0aGVyIHRoYW4gYSBkZWZhdWx0OiB0aGUgY2FtZWxDYXNlXG4gKiBzcGxpdHRlciBhbHNvIGJyZWFrcyBkaWdpdCBydW5zLCB0dXJuaW5nIGBncHQ0YCBpbnRvIGBncHRgICsgYDRgIGFuZCBgczNgXG4gKiBpbnRvIGBzYCArIGAzYC4gUG9zdGdyZXMgaW5kZXhlcyBlYWNoIG9mIHRob3NlIGFzIE9ORSBsZXhlbWUsIHNvIG5vIGxleGVtZVxuICogZXZlciBzdGFydHMgd2l0aCB0aGUgdHJhaWxpbmcgZGlnaXRzIGFuZCB0aGUgcHJlY2lzZSBwYXNzIGNvdWxkIG5vdCBtYXRjaFxuICogdGhlbS4gS2VlcGluZyBwdW5jdHVhdGlvbiBhcyB0aGUgb25seSBib3VuZGFyeSBtaXJyb3JzIGhvdyB0aGUgaW5kZXggd2FzXG4gKiBidWlsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvU2VhcmNoVGVybXMocXVlcnk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5zdHJpbmdVdGlscy50b2tlbml6ZVdpdGhPcHRpb25zKFxuICAgICAgeyBsb3dlckNhc2U6IHRydWUsIGNhbWVsQ2FzZTogZmFsc2UsIGRpc3RpbmN0OiB0cnVlIH0sXG4gICAgICBxdWVyeSxcbiAgICApLFxuICBdO1xufVxuXG4vKipcbiAqIENvbXBpbGUgdGVybXMgaW50byBhIGB0b190c3F1ZXJ5YCBpbnB1dCB3aGVyZSBldmVyeSB0ZXJtIGlzIGEgUFJFRklYLCBzbyBhXG4gKiBwYXJ0aWFsbHkgdHlwZWQgd29yZCBzdGlsbCBtYXRjaGVzIChgaW50ZWw6KmAgcmVhY2hlcyBgaW50ZWxsaWdlbmNlYCkuXG4gKlxuICogVGVybXMgY2Fycnkgb25seSBsZXR0ZXJzIGFuZCBkaWdpdHMgYnkgY29uc3RydWN0aW9uLCBzbyBub25lIG9mIHRzcXVlcnknc1xuICogb3BlcmF0b3JzIChgJiB8ICEgKCApIDogKmApIGNhbiBzdXJ2aXZlIGZyb20gdXNlciBpbnB1dCBpbnRvIHRoZSBjb21waWxlZFxuICogc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Uc1F1ZXJ5KHRlcm1zOiByZWFkb25seSBzdHJpbmdbXSwgb3BlcmF0b3I6IFwiJlwiIHwgXCJ8XCIgPSBcIiZcIik6IHN0cmluZyB7XG4gIHJldHVybiB0ZXJtcy5tYXAoKHRlcm0pID0+IGAke3Rlcm19OipgKS5qb2luKGAgJHtvcGVyYXRvcn0gYCk7XG59XG5cbi8qKiBPcHRpb25zIGZvciBhIHNpbmdsZS1pbmRleCBMYWtlYmFzZSBzZWFyY2ggKG1pcnJvcnMgdGhlIGNsaWVudCdzIGBTZWFyY2hPcHRpb25zYCkuICovXG5leHBvcnQgaW50ZXJmYWNlIExha2ViYXNlU2VhcmNoT3B0aW9ucyB7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBmaWx0ZXI/OiBTZWFyY2hSZXF1ZXN0W1wiZmlsdGVyXCJdO1xuICBzY29yZVRocmVzaG9sZD86IG51bWJlcjtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKiBPbmUgcmF3IHNlYXJjaCByb3cgYmVmb3JlIGl0IGlzIHNoYXBlZCBpbnRvIGEge0BsaW5rIFNlYXJjaEhpdH0uICovXG5pbnRlcmZhY2UgU2VhcmNoUm93IHtcbiAgaWQ6IHN0cmluZztcbiAgZG9jdW1lbnQ6IHVua25vd247XG4gIHNjb3JlOiBudW1iZXI7XG59XG5cbi8qKiBUaGUgbWFuYWdlZC1wb29sIHN1cmZhY2UgbmVlZGVkIGJ5IHRoZSBzZWFyY2ggYmFja2VuZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJhc2VTZWFyY2hQb29sIHtcbiAgY29ubmVjdCgpOiBQcm9taXNlPFBvb2xDbGllbnQ+O1xufVxuXG50eXBlIExha2ViYXNlUG9vbFNvdXJjZSA9XG4gIHwgKCgpID0+IFByb21pc2U8UG9vbENvbmZpZz4gfCBQb29sQ29uZmlnKVxuICB8IExha2ViYXNlU2VhcmNoUG9vbFxuICB8IHsgbWFuYWdlZFBvb2w6ICgpID0+IExha2ViYXNlU2VhcmNoUG9vbCB8IG51bGwgfCB1bmRlZmluZWQgfTtcblxuLyoqIE9wdGlvbnMgZm9yIHByb3Zpc2lvbmluZyBhIExha2ViYXNlLWJhY2tlZCBpbmRleC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJhc2VQcm92aXNpb25PcHRpb25zIHtcbiAgLyoqIFRleHQgY29sdW1uIGVtYmVkZGVkIGludG8gdGhlIHNlYXJjaCB2ZWN0b3IuIERlZmF1bHRzIHRvIGB0ZXh0YC4gKi9cbiAgdGV4dENvbHVtbj86IHN0cmluZztcbiAgLyoqIERvY3VtZW50cyB0byBzZWVkIHdoZW4gdGhlIHRhYmxlIGlzIGVtcHR5LiAqL1xuICBzZWVkPzogU2VhcmNoRG9jdW1lbnRbXTtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogQSBQb3N0Z3JlcyBmdWxsLXRleHQgYmFja2VuZC4gT25lIGluc3RhbmNlIGlzIHNoYXJlZCBhY3Jvc3MgaW5kZXhlczsgZWFjaFxuICogaW5kZXggbWFwcyB0byBhIHRhYmxlIHdob3NlIG5hbWUgaXMgZGVyaXZlZCBmcm9tIHRoZSBpbmRleCByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQge1xuICBwcml2YXRlIHBvb2w6IExha2ViYXNlU2VhcmNoUG9vbCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBwb29sUHJvbWlzZTogUHJvbWlzZTxMYWtlYmFzZVNlYXJjaFBvb2w+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG93bnNQb29sID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvdmlzaW9uZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvb2xTb3VyY2U6IExha2ViYXNlUG9vbFNvdXJjZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNjaGVtYSA9IFwicHVibGljXCIsXG4gICAgLyoqIEhvdyBhIHBvb2wgaXMgYnVpbHQgZnJvbSB0aGUgcmVzb2x2ZWQgY29uZmlnLiBPdmVycmlkYWJsZSBmb3IgdGVzdHMuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb29sRmFjdG9yeTogKGNvbmZpZzogUG9vbENvbmZpZykgPT4gUG9vbCA9IChjb25maWcpID0+IG5ldyBQb29sKGNvbmZpZyksXG4gICkge31cblxuICAvKiogTGF6aWx5IGJ1aWxkIChhbmQgY2FjaGUpIHRoZSBwZyBwb29sIGZyb20gdGhlIHJlc29sdmVkIExha2ViYXNlIGNvbmZpZy4gKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRQb29sKCk6IFByb21pc2U8TGFrZWJhc2VTZWFyY2hQb29sPiB7XG4gICAgaWYgKHRoaXMucG9vbCkgcmV0dXJuIHRoaXMucG9vbDtcbiAgICBpZiAoXCJtYW5hZ2VkUG9vbFwiIGluIHRoaXMucG9vbFNvdXJjZSkge1xuICAgICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCAyMDA7IGF0dGVtcHQgKz0gMSkge1xuICAgICAgICB0aGlzLnBvb2wgPSB0aGlzLnBvb2xTb3VyY2UubWFuYWdlZFBvb2woKSA/PyB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLnBvb2wpIHJldHVybiB0aGlzLnBvb2w7XG4gICAgICAgIGF3YWl0IGFzeW5jVXRpbHMuc2xlZXAoNTApO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoIChsYWtlYmFzZSk6IG1hbmFnZWQgcG9vbCBkaWQgbm90IGluaXRpYWxpemVcIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjb25uZWN0XCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMucG9vbFNvdXJjZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLnBvb2wgPSB0aGlzLnBvb2xTb3VyY2U7XG4gICAgICByZXR1cm4gdGhpcy5wb29sO1xuICAgIH1cbiAgICBjb25zdCBwZ0NvbmZpZ0ZhY3RvcnkgPSB0aGlzLnBvb2xTb3VyY2U7XG4gICAgdGhpcy5wb29sUHJvbWlzZSA/Pz0gKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHBnQ29uZmlnRmFjdG9yeSgpO1xuICAgICAgY29uc3QgcG9vbCA9IHRoaXMucG9vbEZhY3RvcnkocG9zdGdyZXNDb25uZWN0aW9uT3B0aW9ucyhjb25maWcpKTtcbiAgICAgIHRoaXMucG9vbCA9IHBvb2w7XG4gICAgICB0aGlzLm93bnNQb29sID0gdHJ1ZTtcbiAgICAgIHJldHVybiBwb29sO1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIHRoaXMucG9vbFByb21pc2U7XG4gIH1cblxuICAvKiogQ2xvc2UgdGhlIHBvb2wgc28gYSByZXN0YXJ0ZWQgYXBwIHJlYnVpbGRzIGl0LiAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwb29sID0gdGhpcy5wb29sO1xuICAgIHRoaXMucG9vbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBvb2xQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucHJvdmlzaW9uZWQuY2xlYXIoKTtcbiAgICBpZiAocG9vbCAmJiB0aGlzLm93bnNQb29sKSBhd2FpdCAocG9vbCBhcyBQb29sKS5lbmQoKTtcbiAgICB0aGlzLm93bnNQb29sID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIGEgTGFrZWJhc2UtYmFja2VkIGluZGV4LiBSZXR1cm5zIGhpdHMgc29ydGVkIG1vc3QtcmVsZXZhbnQtZmlyc3QsXG4gICAqIHNoYXBlZCBpZGVudGljYWxseSB0byB0aGUgVmVjdG9yIFNlYXJjaCBiYWNrZW5kLlxuICAgKi9cbiAgYXN5bmMgc2VhcmNoKFxuICAgIGluZGV4OiBzdHJpbmcsXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zOiBMYWtlYmFzZVNlYXJjaE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICBjb25zdCB0ZXh0ID0gc3RyaW5nVXRpbHMudHJpbVRvRW1wdHkocXVlcnkpO1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZUZvcihpbmRleCk7XG4gICAgY29uc3QgbGltaXQgPSBvcHRpb25zLmxpbWl0ID8/IDEwO1xuICAgIGNvbnN0IHBvb2wgPSBhd2FpdCB0aGlzLmdldFBvb2woKTtcbiAgICBjb25zdCB0ZXJtcyA9IHRvU2VhcmNoVGVybXModGV4dCk7XG5cbiAgICAvLyBBbiBlbXB0eSAob3IgcHVuY3R1YXRpb24tb25seSkgYm94IHJldHVybnMgcm93cyByYXRoZXIgdGhhbiBub3RoaW5nLCBzb1xuICAgIC8vIHRoZSBVSSBzaG93cyBjb250ZW50IGJlZm9yZSB0aGUgdXNlciB0eXBlcyAtIGFzIGEga2V5d29yZCBpbmRleCB3b3VsZC5cbiAgICBpZiAodGVybXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmZpbHRlckNsYXVzZShvcHRpb25zLmZpbHRlciwgMSk7XG4gICAgICBjb25zdCBsaW1pdFBvc2l0aW9uID0gZmlsdGVyLnBhcmFtcy5sZW5ndGggKyAxO1xuICAgICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLnF1ZXJ5PFNlYXJjaFJvdz4oXG4gICAgICAgIHBvb2wsXG4gICAgICAgIGBTRUxFQ1QgaWQsIGRvY3VtZW50LCAwOjpmbG9hdDQgQVMgc2NvcmVcbiAgICAgICAgICAgRlJPTSAke3RhYmxlfVxuICAgICAgICAgIFdIRVJFIFRSVUUke2ZpbHRlci5zcWx9XG4gICAgICAgICAgT1JERVIgQlkgaWRcbiAgICAgICAgICBMSU1JVCAkJHtsaW1pdFBvc2l0aW9ufWAsXG4gICAgICAgIFsuLi5maWx0ZXIucGFyYW1zLCBsaW1pdF0sXG4gICAgICAgIG9wdGlvbnMuc2lnbmFsLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLnRvUmVzdWx0KHRleHQsIGluZGV4LCByb3dzLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBQcmVjaXNlIHBhc3M6IGV2ZXJ5IHRlcm0gbXVzdCBtYXRjaCwgZWFjaCBhcyBhIHByZWZpeC5cbiAgICBjb25zdCBzdHJpY3RGaWx0ZXIgPSB0aGlzLmZpbHRlckNsYXVzZShvcHRpb25zLmZpbHRlciwgMik7XG4gICAgY29uc3Qgc3RyaWN0TGltaXRQb3NpdGlvbiA9IHN0cmljdEZpbHRlci5wYXJhbXMubGVuZ3RoICsgMjtcbiAgICBjb25zdCBzdHJpY3QgPSBhd2FpdCB0aGlzLnF1ZXJ5PFNlYXJjaFJvdz4oXG4gICAgICBwb29sLFxuICAgICAgYFNFTEVDVCBpZCwgZG9jdW1lbnQsIHRzX3Jhbmsoc2VhcmNoX3ZlY3RvciwgdG9fdHNxdWVyeSgnZW5nbGlzaCcsICQxKSkgQVMgc2NvcmVcbiAgICAgICAgIEZST00gJHt0YWJsZX1cbiAgICAgICAgV0hFUkUgc2VhcmNoX3ZlY3RvciBAQCB0b190c3F1ZXJ5KCdlbmdsaXNoJywgJDEpXG4gICAgICAgICAgJHtzdHJpY3RGaWx0ZXIuc3FsfVxuICAgICAgICBPUkRFUiBCWSBzY29yZSBERVNDXG4gICAgICAgIExJTUlUICQke3N0cmljdExpbWl0UG9zaXRpb259YCxcbiAgICAgIFt0b1RzUXVlcnkodGVybXMpLCAuLi5zdHJpY3RGaWx0ZXIucGFyYW1zLCBsaW1pdF0sXG4gICAgICBvcHRpb25zLnNpZ25hbCxcbiAgICApO1xuICAgIGlmIChzdHJpY3Qucm93cy5sZW5ndGggPiAwKSByZXR1cm4gdGhpcy50b1Jlc3VsdCh0ZXh0LCBpbmRleCwgc3RyaWN0LnJvd3MsIG9wdGlvbnMpO1xuXG4gICAgLy8gTm90aGluZyBtYXRjaGVkIEVWRVJZIHRlcm0sIHNvIHJlbGF4IHJhdGhlciB0aGFuIHJldHVybiBhbiBlbXB0eSBib3g6XG4gICAgLy8gYW55IG9uZSB0ZXJtIGlzIGVub3VnaCwgYW5kIGFuIGBJTElLRWAgcGFzcyBhZGRpdGlvbmFsbHkgY2F0Y2hlcyBhXG4gICAgLy8gZnJhZ21lbnQgdGhhdCBpcyBub3QgYSBwcmVmaXggKGB0ZWxsaWdlbmNlYCkgb3IgYSB0b2tlbiB0aGUgdGV4dC1zZWFyY2hcbiAgICAvLyBwYXJzZXIgc3BsaXQgZGlmZmVyZW50bHkgdGhhbiBleHBlY3RlZC4gU3Vic3RyaW5nIG1hdGNoaW5nIGNhbm5vdCB1c2VcbiAgICAvLyB0aGUgR0lOIGluZGV4LCB3aGljaCBpcyB3aHkgaXQgb25seSBydW5zIG9uY2UgdGhlIGluZGV4ZWQgcGFzcyBmYWlscy5cbiAgICBjb25zdCByZWxheGVkRmlsdGVyID0gdGhpcy5maWx0ZXJDbGF1c2Uob3B0aW9ucy5maWx0ZXIsIDMpO1xuICAgIGNvbnN0IHJlbGF4ZWRMaW1pdFBvc2l0aW9uID0gcmVsYXhlZEZpbHRlci5wYXJhbXMubGVuZ3RoICsgMztcbiAgICBjb25zdCByZWxheGVkID0gYXdhaXQgdGhpcy5xdWVyeTxTZWFyY2hSb3c+KFxuICAgICAgcG9vbCxcbiAgICAgIGBTRUxFQ1QgaWQsIGRvY3VtZW50LCB0c19yYW5rKHNlYXJjaF92ZWN0b3IsIHRvX3RzcXVlcnkoJ2VuZ2xpc2gnLCAkMSkpIEFTIHNjb3JlXG4gICAgICAgICBGUk9NICR7dGFibGV9XG4gICAgICAgIFdIRVJFIChzZWFyY2hfdmVjdG9yIEBAIHRvX3RzcXVlcnkoJ2VuZ2xpc2gnLCAkMSlcbiAgICAgICAgICAgT1Igc2VhcmNoX3RleHQgSUxJS0UgQU5ZKCQyOjp0ZXh0W10pKVxuICAgICAgICAgICR7cmVsYXhlZEZpbHRlci5zcWx9XG4gICAgICAgIE9SREVSIEJZIHNjb3JlIERFU0NcbiAgICAgICAgTElNSVQgJCR7cmVsYXhlZExpbWl0UG9zaXRpb259YCxcbiAgICAgIFt0b1RzUXVlcnkodGVybXMsIFwifFwiKSwgdGVybXMubWFwKCh0ZXJtKSA9PiBgJSR7dGVybX0lYCksIC4uLnJlbGF4ZWRGaWx0ZXIucGFyYW1zLCBsaW1pdF0sXG4gICAgICBvcHRpb25zLnNpZ25hbCxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnRvUmVzdWx0KHRleHQsIGluZGV4LCByZWxheGVkLnJvd3MsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIFNoYXBlIHJhdyByb3dzIGludG8gdGhlIGBTZWFyY2hSZXN1bHRgIGJvdGggYmFja2VuZHMgcmV0dXJuLiAqL1xuICBwcml2YXRlIHRvUmVzdWx0KFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgaW5kZXg6IHN0cmluZyxcbiAgICByb3dzOiBTZWFyY2hSb3dbXSxcbiAgICBvcHRpb25zOiBMYWtlYmFzZVNlYXJjaE9wdGlvbnMsXG4gICk6IFNlYXJjaFJlc3VsdCB7XG4gICAgY29uc3QgaGl0czogU2VhcmNoSGl0W10gPSByb3dzXG4gICAgICAubWFwKChyb3cpID0+ICh7XG4gICAgICAgIGlkOiBTdHJpbmcocm93LmlkKSxcbiAgICAgICAgc2NvcmU6IE51bWJlcihyb3cuc2NvcmUpIHx8IDAsXG4gICAgICAgIGZpZWxkczogdGhpcy50b0ZpZWxkcyhyb3cuZG9jdW1lbnQpLFxuICAgICAgfSkpXG4gICAgICAuZmlsdGVyKChoaXQpID0+IG9wdGlvbnMuc2NvcmVUaHJlc2hvbGQgPT09IHVuZGVmaW5lZCB8fCBoaXQuc2NvcmUgPj0gb3B0aW9ucy5zY29yZVRocmVzaG9sZCk7XG4gICAgcmV0dXJuIHsgcXVlcnksIGluZGV4LCBoaXRzLCBjb3VudDogaGl0cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgdGhlIHRhYmxlICsgZnVsbC10ZXh0IGluZGV4IGV4aXN0IGFuZCBzZWVkIGRvY3VtZW50cyB3aGVuIGVtcHR5LlxuICAgKiBJZGVtcG90ZW50LCBzbyBpdCBpcyBzYWZlIHRvIGNhbGwgb24gZXZlcnkgYm9vdC5cbiAgICovXG4gIGFzeW5jIHByb3Zpc2lvbihpbmRleDogc3RyaW5nLCBvcHRpb25zOiBMYWtlYmFzZVByb3Zpc2lvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlRm9yKGluZGV4KTtcbiAgICBjb25zdCBwb29sID0gYXdhaXQgdGhpcy5nZXRQb29sKCk7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVUYWJsZShwb29sLCB0YWJsZSwgb3B0aW9ucy5zaWduYWwpO1xuXG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLnF1ZXJ5PHsgY291bnQ6IHN0cmluZyB9PihcbiAgICAgIHBvb2wsXG4gICAgICBgU0VMRUNUIGNvdW50KCopOjp0ZXh0IEFTIGNvdW50IEZST00gJHt0YWJsZX1gLFxuICAgICAgW10sXG4gICAgICBvcHRpb25zLnNpZ25hbCxcbiAgICApO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gTnVtYmVyKHJvd3NbMF0/LmNvdW50ID8/IFwiMFwiKTtcbiAgICBjb25zdCBzZWVkID0gb3B0aW9ucy5zZWVkID8/IFtdO1xuICAgIGlmIChleGlzdGluZyA9PT0gMCAmJiBzZWVkLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMudXBzZXJ0KHBvb2wsIHRhYmxlLCBzZWVkLCBvcHRpb25zLnRleHRDb2x1bW4gPz8gXCJ0ZXh0XCIsIG9wdGlvbnMuc2lnbmFsKTtcbiAgICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtc2VlZGVkXCIsIHsgaW5kZXgsIHRhYmxlLCBjb3VudDogc2VlZC5sZW5ndGggfSk7XG4gICAgICByZXR1cm4gc2VlZC5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBleGlzdGluZztcbiAgfVxuXG4gIC8qKiBBZGQgb3IgdXBkYXRlIGRvY3VtZW50cyBieSBwcmltYXJ5IGtleS4gKi9cbiAgYXN5bmMgYWRkRG9jdW1lbnRzKFxuICAgIGluZGV4OiBzdHJpbmcsXG4gICAgZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdLFxuICAgIHRleHRDb2x1bW4gPSBcInRleHRcIixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+IHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVGb3IoaW5kZXgpO1xuICAgIGNvbnN0IHBvb2wgPSBhd2FpdCB0aGlzLmdldFBvb2woKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVRhYmxlKHBvb2wsIHRhYmxlLCBzaWduYWwpO1xuICAgIGF3YWl0IHRoaXMudXBzZXJ0KHBvb2wsIHRhYmxlLCBkb2N1bWVudHMsIHRleHRDb2x1bW4sIHNpZ25hbCk7XG4gICAgcmV0dXJuIHsgaW5kZXgsIGNvdW50OiBkb2N1bWVudHMubGVuZ3RoIH07XG4gIH1cblxuICAvKiogRGVsZXRlIGRvY3VtZW50cyBieSBwcmltYXJ5IGtleS4gKi9cbiAgYXN5bmMgZGVsZXRlRG9jdW1lbnRzKFxuICAgIGluZGV4OiBzdHJpbmcsXG4gICAgaWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZUZvcihpbmRleCk7XG4gICAgY29uc3QgcG9vbCA9IGF3YWl0IHRoaXMuZ2V0UG9vbCgpO1xuICAgIGF3YWl0IHRoaXMucXVlcnkocG9vbCwgYERFTEVURSBGUk9NICR7dGFibGV9IFdIRVJFIGlkID0gQU5ZKCQxKWAsIFtpZHMubWFwKFN0cmluZyldLCBzaWduYWwpO1xuICAgIHJldHVybiB7IGluZGV4LCBjb3VudDogaWRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqIENyZWF0ZSB0aGUgdGFibGUgKyBHSU4gaW5kZXggb25jZSBwZXIgdGFibGUgKG1lbW9pemVkIGFjcm9zcyBjYWxscykuICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlVGFibGUoXG4gICAgcG9vbDogTGFrZWJhc2VTZWFyY2hQb29sLFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnByb3Zpc2lvbmVkLmhhcyh0YWJsZSkpIHJldHVybjtcbiAgICAvLyBgZG9jdW1lbnRgIGhvbGRzIHRoZSB3aG9sZSByb3c7IGBzZWFyY2hfdGV4dGAgaXMgdGhlIGluZGV4ZWQgdGV4dDsgdGhlXG4gICAgLy8gZ2VuZXJhdGVkIGBzZWFyY2hfdmVjdG9yYCBrZWVwcyB0aGUgdHN2ZWN0b3IgaW4gbG9ja3N0ZXAgd2l0aCBpdCBzbyBhXG4gICAgLy8gd3JpdGUgbmV2ZXIgaGFzIHRvIGNvbXB1dGUgdGhlIHZlY3RvciBieSBoYW5kLlxuICAgIGF3YWl0IHRoaXMucXVlcnkocG9vbCwgYENSRUFURSBTQ0hFTUEgSUYgTk9UIEVYSVNUUyAke3RoaXMuaWRlbnQodGhpcy5zY2hlbWEpfWAsIFtdLCBzaWduYWwpO1xuICAgIGF3YWl0IHRoaXMucXVlcnkoXG4gICAgICBwb29sLFxuICAgICAgYENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICR7dGFibGV9IChcbiAgICAgICAgIGlkIHRleHQgUFJJTUFSWSBLRVksXG4gICAgICAgICBzZWFyY2hfdGV4dCB0ZXh0IE5PVCBOVUxMIERFRkFVTFQgJycsXG4gICAgICAgICBkb2N1bWVudCBqc29uYiBOT1QgTlVMTCBERUZBVUxUICd7fSc6Ompzb25iLFxuICAgICAgICAgc2VhcmNoX3ZlY3RvciB0c3ZlY3RvciBHRU5FUkFURUQgQUxXQVlTIEFTICh0b190c3ZlY3RvcignZW5nbGlzaCcsIHNlYXJjaF90ZXh0KSkgU1RPUkVEXG4gICAgICAgKWAsXG4gICAgICBbXSxcbiAgICAgIHNpZ25hbCxcbiAgICApO1xuICAgIGF3YWl0IHRoaXMucXVlcnkoXG4gICAgICBwb29sLFxuICAgICAgYEFMVEVSIFRBQkxFICR7dGFibGV9XG4gICAgICAgICBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgc2VhcmNoX3ZlY3RvciB0c3ZlY3RvclxuICAgICAgICAgR0VORVJBVEVEIEFMV0FZUyBBUyAodG9fdHN2ZWN0b3IoJ2VuZ2xpc2gnLCBzZWFyY2hfdGV4dCkpIFNUT1JFRGAsXG4gICAgICBbXSxcbiAgICAgIHNpZ25hbCxcbiAgICApO1xuICAgIGF3YWl0IHRoaXMucXVlcnkoXG4gICAgICBwb29sLFxuICAgICAgYENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTICR7dGhpcy5pZGVudChgJHt0aGlzLmJhcmVOYW1lKHRhYmxlKX1fZnRzYCl9XG4gICAgICAgICBPTiAke3RhYmxlfSBVU0lORyBnaW4gKHNlYXJjaF92ZWN0b3IpYCxcbiAgICAgIFtdLFxuICAgICAgc2lnbmFsLFxuICAgICk7XG4gICAgdGhpcy5wcm92aXNpb25lZC5hZGQodGFibGUpO1xuICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtY3JlYXRlZFwiLCB7IHRhYmxlIH0pO1xuICB9XG5cbiAgLyoqIFVwc2VydCByb3dzOiB0aGUgd2hvbGUgZG9jdW1lbnQgYXMganNvbmIgKyBhIGZsYXR0ZW5lZCB0ZXh0IGJsb2IgdG8gaW5kZXguICovXG4gIHByaXZhdGUgYXN5bmMgdXBzZXJ0KFxuICAgIHBvb2w6IExha2ViYXNlU2VhcmNoUG9vbCxcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGRvY3VtZW50czogU2VhcmNoRG9jdW1lbnRbXSxcbiAgICB0ZXh0Q29sdW1uOiBzdHJpbmcsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3VtZW50cykge1xuICAgICAgY29uc3QgaWQgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKFN0cmluZyhkb2MuaWQgPz8gZG9jLklEID8/IFwiXCIpKSA/PyB1bmRlZmluZWQ7XG4gICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2ggKGxha2ViYXNlKTogYSBkb2N1bWVudCBpcyBtaXNzaW5nIGFuIGBpZGBcIiwge1xuICAgICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImFkZERvY3VtZW50c1wiIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VhcmNoVGV4dCA9IHRoaXMuc2VhcmNoVGV4dChkb2MsIHRleHRDb2x1bW4pO1xuICAgICAgYXdhaXQgdGhpcy5xdWVyeShcbiAgICAgICAgcG9vbCxcbiAgICAgICAgYElOU0VSVCBJTlRPICR7dGFibGV9IChpZCwgc2VhcmNoX3RleHQsIGRvY3VtZW50KVxuICAgICAgICAgICBWQUxVRVMgKCQxLCAkMiwgJDM6Ompzb25iKVxuICAgICAgICAgT04gQ09ORkxJQ1QgKGlkKSBETyBVUERBVEVcbiAgICAgICAgICAgU0VUIHNlYXJjaF90ZXh0ID0gRVhDTFVERUQuc2VhcmNoX3RleHQsIGRvY3VtZW50ID0gRVhDTFVERUQuZG9jdW1lbnRgLFxuICAgICAgICBbaWQsIHNlYXJjaFRleHQsIEpTT04uc3RyaW5naWZ5KGRvYyldLFxuICAgICAgICBzaWduYWwsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgdGV4dCBhIHJvdyBpcyBpbmRleGVkIGJ5OiB0aGUgdGV4dCBjb2x1bW4gZmlyc3QsIHRoZW4gYW55IG90aGVyIHN0cmluZyBmaWVsZC4gKi9cbiAgcHJpdmF0ZSBzZWFyY2hUZXh0KGRvYzogU2VhcmNoRG9jdW1lbnQsIHRleHRDb2x1bW46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJpbWFyeSA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KFN0cmluZyhkb2NbdGV4dENvbHVtbl0gPz8gXCJcIikpO1xuICAgIGNvbnN0IHJlc3QgPSBPYmplY3QuZW50cmllcyhkb2MpXG4gICAgICAuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IGtleSAhPT0gdGV4dENvbHVtbiAmJiBrZXkgIT09IFwiaWRcIiAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpXG4gICAgICAubWFwKChbLCB2YWx1ZV0pID0+IHZhbHVlIGFzIHN0cmluZyk7XG4gICAgcmV0dXJuIFtwcmltYXJ5LCAuLi5yZXN0XS5maWx0ZXIoQm9vbGVhbikuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIC8qKiBBIGhpdCdzIGBmaWVsZHNgOiB0aGUgc3RvcmVkIGRvY3VtZW50IG1pbnVzIHRoZSByZXNlcnZlZC9pbnRlcm5hbCBrZXlzLiAqL1xuICBwcml2YXRlIHRvRmllbGRzKGRvY3VtZW50OiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKGRvY3VtZW50KSkgcmV0dXJuIHt9O1xuICAgIGNvbnN0IGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkb2N1bWVudCkpIHtcbiAgICAgIGlmIChSRVNFUlZFRF9DT0xVTU5TLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGZpZWxkc1trZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBmaWVsZHM7XG4gIH1cblxuICAvKiogQ29tcGlsZSBBcHBLaXQgc2NhbGFyL2FycmF5IGZpbHRlcnMgYWdhaW5zdCB0aGUgc3RvcmVkIEpTT04gZG9jdW1lbnQuICovXG4gIHByaXZhdGUgZmlsdGVyQ2xhdXNlKFxuICAgIGZpbHRlcjogU2VhcmNoUmVxdWVzdFtcImZpbHRlclwiXSxcbiAgICBzdGFydFBvc2l0aW9uOiBudW1iZXIsXG4gICk6IHsgc3FsOiBzdHJpbmc7IHBhcmFtczogdW5rbm93bltdIH0ge1xuICAgIGlmICghZmlsdGVyIHx8IE9iamVjdC5rZXlzKGZpbHRlcikubGVuZ3RoID09PSAwKSByZXR1cm4geyBzcWw6IFwiXCIsIHBhcmFtczogW10gfTtcbiAgICBjb25zdCBjbGF1c2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHBhcmFtczogdW5rbm93bltdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmlsdGVyKSkge1xuICAgICAgY29uc3Qga2V5UG9zaXRpb24gPSBzdGFydFBvc2l0aW9uICsgcGFyYW1zLmxlbmd0aDtcbiAgICAgIHBhcmFtcy5wdXNoKGtleSk7XG4gICAgICBjb25zdCB2YWx1ZVBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbiArIHBhcmFtcy5sZW5ndGg7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcGFyYW1zLnB1c2godmFsdWUubWFwKFN0cmluZykpO1xuICAgICAgICBjbGF1c2VzLnB1c2goYGRvY3VtZW50IC0+PiAkJHtrZXlQb3NpdGlvbn0gPSBBTlkoJCR7dmFsdWVQb3NpdGlvbn06OnRleHRbXSlgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmFtcy5wdXNoKFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICBjbGF1c2VzLnB1c2goYGRvY3VtZW50IC0+PiAkJHtrZXlQb3NpdGlvbn0gPSAkJHt2YWx1ZVBvc2l0aW9ufWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBzcWw6IGAgQU5EICR7Y2xhdXNlcy5qb2luKFwiIEFORCBcIil9YCwgcGFyYW1zIH07XG4gIH1cblxuICAvKiogVGhlIGZ1bGx5LXF1YWxpZmllZCB0YWJsZSBuYW1lIGZvciBhbiBpbmRleCByZWZlcmVuY2UuICovXG4gIHByaXZhdGUgdGFibGVGb3IoaW5kZXg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuaWRlbnQodGhpcy5zY2hlbWEpfS4ke3RoaXMuaWRlbnQodGhpcy5iYXJlTmFtZShpbmRleCkpfWA7XG4gIH1cblxuICAvKiogQSBzYWZlIGJhcmUgdGFibGUgbmFtZSBkZXJpdmVkIGZyb20gYW4gaW5kZXggcmVmZXJlbmNlLiAqL1xuICBwcml2YXRlIGJhcmVOYW1lKHJlZmVyZW5jZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0ID0gcmVmZXJlbmNlLnNwbGl0KFwiLlwiKS5maWx0ZXIoQm9vbGVhbikucG9wKCkgPz8gcmVmZXJlbmNlO1xuICAgIGNvbnN0IHNsdWcgPSBzdHJpbmdVdGlscy50b1NsdWcobGFzdCkucmVwbGFjZSgvLS9nLCBcIl9cIik7XG4gICAgcmV0dXJuIHNsdWcubGVuZ3RoID4gMCA/IHNsdWcgOiBcImRvY3VtZW50c1wiO1xuICB9XG5cbiAgLyoqIFF1b3RlIGEgUG9zdGdyZXMgaWRlbnRpZmllci4gKi9cbiAgcHJpdmF0ZSBpZGVudChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXCIke25hbWUucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cImA7XG4gIH1cblxuICAvKiogUnVuIG9uZSBxdWVyeSB1bmRlciBleHRlcm5hbCBjYW5jZWxsYXRpb24uICovXG4gIHByaXZhdGUgYXN5bmMgcXVlcnk8VD4oXG4gICAgcG9vbDogTGFrZWJhc2VTZWFyY2hQb29sLFxuICAgIHNxbDogc3RyaW5nLFxuICAgIHBhcmFtczogdW5rbm93bltdLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPHsgcm93czogVFtdIH0+IHtcbiAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBFeGVjdXRpb25FcnJvci5jYW5jZWxlZCgpO1xuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHBvb2wuY29ubmVjdCgpO1xuICAgIGxldCByZWxlYXNlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiB7XG4gICAgICBpZiAocmVsZWFzZWQpIHJldHVybjtcbiAgICAgIHJlbGVhc2VkID0gdHJ1ZTtcbiAgICAgIGNsaWVudC5yZWxlYXNlKHRydWUpO1xuICAgIH07XG4gICAgc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQucXVlcnkoc3FsLCBwYXJhbXMpO1xuICAgICAgcmV0dXJuIHsgcm93czogcmVzdWx0LnJvd3MgYXMgVFtdIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpO1xuICAgICAgaWYgKCFyZWxlYXNlZCkgY2xpZW50LnJlbGVhc2UoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
334
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFrZWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hFLE9BQU8sRUFDTCxHQUFHLEVBQ0gsS0FBSyxFQUNMLFFBQVEsRUFDUixtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLFVBQVUsRUFDVixNQUFNLEdBQ1AsTUFBTSx3QkFBd0IsQ0FBQztBQVFoQyxPQUFPLEVBQUUsSUFBSSxFQUFvQyxNQUFNLElBQUksQ0FBQztBQUU1RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFN0MsdUZBQXVGO0FBQ3ZGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBRXJGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxLQUFhO0lBQ3pDLE9BQU8sQ0FBQyxHQUFHLG1CQUFtQixDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hHLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUF3QixFQUFFLFdBQXNCLEdBQUc7SUFDM0UsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxH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TSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMvQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFXLEVBQUUsQ0FBQztRQUN0QyxDQUFDO2dCQUFTLENBQUM7WUFDVCxNQUFNLEVBQUUsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxRQUFRO2dCQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMYWtlYmFzZSAoUG9zdGdyZXMpIGZ1bGwtdGV4dCBydW50aW1lIGJlaGluZCBgbGFrZWJhc2VBaVNlYXJjaGAuIEl0IHByb3Zpc2lvbnNcbiAqIGEgc2luZ2xlIHRhYmxlIHBlciBpbmRleCBhbGlhcywgaW5kZXhlcyBhIGdlbmVyYXRlZFxuICogYHRzdmVjdG9yYCwgYW5kIGFuc3dlcnMgcXVlcmllcyB3aXRoIGEgcHJlZml4IGB0b190c3F1ZXJ5YCArIGB0c19yYW5rYC5cbiAqXG4gKiBRdWVyaWVzIGFyZSBjb21waWxlZCByYXRoZXIgdGhhbiBwYXNzZWQgdGhyb3VnaCBgd2Vic2VhcmNoX3RvX3RzcXVlcnlgLFxuICogYmVjYXVzZSBhIHNlYXJjaCBib3ggbmVlZHMgdHdvIHRoaW5ncyB0aGF0IGZ1bmN0aW9uIGRvZXMgbm90IGdpdmU6XG4gKiBwdW5jdHVhdGlvbi1pbnNlbnNpdGl2aXR5IChzbyBgc3RvcmUtaW50ZWxsaWdlbmNlYCBtYXRjaGVzIHRoZSBzYW1lIHJvd3MgYXNcbiAqIGBzdG9yZSBpbnRlbGxpZ2VuY2VgKSBhbmQgcHJlZml4IG1hdGNoaW5nIChzbyBgaW50ZWxgIHJlYWNoZXNcbiAqIGBpbnRlbGxpZ2VuY2VgKS4gU2VlIHtAbGluayB0b1NlYXJjaFRlcm1zfSAvIHtAbGluayB0b1RzUXVlcnl9LlxuICpcbiAqIFRoZSB3aG9sZSBwb2ludCBpcyBwYXJpdHk6IHRoaXMgYmFja2VuZCByZXR1cm5zIHRoZSBFWEFDVCBzYW1lXG4gKiBgQGRieC10b29scy9zaGFyZWQtc2VhcmNoYCBzaGFwZXMgKGBTZWFyY2hSZXN1bHRgIC8gYFNlYXJjaEhpdGAgL1xuICogYFVwc2VydFJlc3VsdGApIGFzIHRoZSBWZWN0b3IgU2VhcmNoIGJhY2tlbmQsIHNvIHRoZSBjbGllbnQsIHRoZSBNYXN0cmFcbiAqIHRvb2xzLCB0aGUgcm91dGVzLCBhbmQgdGhlIFJlYWN0IHNlYXJjaCBib3ggY2Fubm90IHRlbGwgd2hpY2ggb25lIGFuc3dlcmVkLlxuICogQSBoaXQncyBgaWRgIGlzIHRoZSBwcmltYXJ5IGtleSwgaXRzIGBzY29yZWAgaXMgdGhlIHRleHQtcmFuaywgYW5kIGBmaWVsZHNgXG4gKiBpcyB0aGUgc3RvcmVkIGRvY3VtZW50IG1pbnVzIHRoZSBpbnRlcm5hbCBjb2x1bW5zLlxuICpcbiAqIFN0YW5kYWxvbmUgY2FsbGVycyBjYW4gc3VwcGx5IGEgYFBvb2xDb25maWdgIGZhY3RvcnkgYW5kIGxldCB0aGlzIGJhY2tlbmQgb3duXG4gKiB0aGUgcmVzdWx0aW5nIHBvb2wuIEFwcEtpdCBpbnRlZ3JhdGlvbnMgaW5zdGVhZCBzdXBwbHkgdGhlIExha2ViYXNlIHBsdWdpbidzXG4gKiBtYW5hZ2VkIHBvb2wgZGlyZWN0bHksIHByZXNlcnZpbmcgaXRzIHJvdXRpbmcgYW5kIGNyZWRlbnRpYWwgcmVmcmVzaC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgRXhlY3V0aW9uRXJyb3IgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwb3N0Z3Jlc0Nvbm5lY3Rpb25PcHRpb25zIH0gZnJvbSBcIkBkYngtdG9vbHMvcG9zdGdyZXNcIjtcbmltcG9ydCB7XG4gIGxvZyxcbiAgc2xlZXAsXG4gIGlzUmVjb3JkLFxuICB0b2tlbml6ZVdpdGhPcHRpb25zLFxuICB0cmltVG9FbXB0eSxcbiAgdHJpbVRvTnVsbCxcbiAgdG9TbHVnLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUge1xuICBTZWFyY2hEb2N1bWVudCxcbiAgU2VhcmNoSGl0LFxuICBTZWFyY2hSZXF1ZXN0LFxuICBTZWFyY2hSZXN1bHQsXG4gIFVwc2VydFJlc3VsdCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuaW1wb3J0IHsgUG9vbCwgdHlwZSBQb29sQ2xpZW50LCB0eXBlIFBvb2xDb25maWcgfSBmcm9tIFwicGdcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInNlYXJjaC9sYWtlYmFzZVwiKTtcblxuLyoqIFRoZSBpbnRlcm5hbCBjb2x1bW5zIGV2ZXJ5IHNlYXJjaCB0YWJsZSBjYXJyaWVzLCBleGNsdWRlZCBmcm9tIGEgaGl0J3MgYGZpZWxkc2AuICovXG5jb25zdCBSRVNFUlZFRF9DT0xVTU5TID0gbmV3IFNldChbXCJpZFwiLCBcInNlYXJjaF90ZXh0XCIsIFwiZG9jdW1lbnRcIiwgXCJzZWFyY2hfdmVjdG9yXCJdKTtcblxuLyoqXG4gKiBTcGxpdCBhIHNlYXJjaC1ib3ggc3RyaW5nIGludG8gdGhlIHRlcm1zIGEgdHNxdWVyeSBpcyBidWlsdCBmcm9tLCB1c2luZyB0aGVcbiAqIHNoYXJlZCBgQGRieC10b29scy9zaGFyZWQtY29yZWAgdG9rZW5pemVyIHNvIHRoZSBzcGxpdHRpbmcgcnVsZXMgc3RheVxuICogY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIHRoZSB0b29sa2l0LlxuICpcbiAqIFNwbGl0dGluZyBvbiBwdW5jdHVhdGlvbiBpcyB3aGF0IG1ha2VzIGBzdG9yZS1pbnRlbGxpZ2VuY2VgIGJlaGF2ZSBsaWtlXG4gKiBgc3RvcmUgaW50ZWxsaWdlbmNlYC4gUG9zdGdyZXMgaW5kZXhlcyBhIGh5cGhlbmF0ZWQgd29yZCBhcyB0aGUgY29tcG91bmRcbiAqIGxleGVtZSBQTFVTIGVhY2ggb2YgaXRzIHBhcnRzLCBidXQgY29tcGlsZXMgYSBoeXBoZW5hdGVkIFFVRVJZIHRvIHRoZVxuICogY29tcG91bmQgYWxvbmUgLSBzbyBgc3RvcmUtaW50ZWxsaWdlbmNlYCBkZW1hbmRzIGEgYHN0b3JlLWludGVsbGlnYCBsZXhlbWVcbiAqIHRoYXQgYSBkb2N1bWVudCB0aXRsZWQgYHNhbXBsZS1zdG9yZS1pbnRlbGxpZ2VuY2VgIGRvZXMgbm90IGhhdmUsIGFuZCB0aGVcbiAqIHNlYXJjaCBzaWxlbnRseSByZXR1cm5zIG5vdGhpbmcgd2hpbGUgYHN0b3JlIGludGVsbGlnZW5jZWAgcmV0dXJuc1xuICogZXZlcnl0aGluZy4gU2FtZSBmb3IgYC5gIGFuZCBgX2AgaW4gYSB0YWJsZSByZWZlcmVuY2UuXG4gKlxuICogYGNhbWVsQ2FzZTogZmFsc2VgIGlzIGxvYWQtYmVhcmluZyByYXRoZXIgdGhhbiBhIGRlZmF1bHQ6IHRoZSBjYW1lbENhc2VcbiAqIHNwbGl0dGVyIGFsc28gYnJlYWtzIGRpZ2l0IHJ1bnMsIHR1cm5pbmcgYGdwdDRgIGludG8gYGdwdGAgKyBgNGAgYW5kIGBzM2BcbiAqIGludG8gYHNgICsgYDNgLiBQb3N0Z3JlcyBpbmRleGVzIGVhY2ggb2YgdGhvc2UgYXMgT05FIGxleGVtZSwgc28gbm8gbGV4ZW1lXG4gKiBldmVyIHN0YXJ0cyB3aXRoIHRoZSB0cmFpbGluZyBkaWdpdHMgYW5kIHRoZSBwcmVjaXNlIHBhc3MgY291bGQgbm90IG1hdGNoXG4gKiB0aGVtLiBLZWVwaW5nIHB1bmN0dWF0aW9uIGFzIHRoZSBvbmx5IGJvdW5kYXJ5IG1pcnJvcnMgaG93IHRoZSBpbmRleCB3YXNcbiAqIGJ1aWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TZWFyY2hUZXJtcyhxdWVyeTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLnRva2VuaXplV2l0aE9wdGlvbnMoeyBsb3dlckNhc2U6IHRydWUsIGNhbWVsQ2FzZTogZmFsc2UsIGRpc3RpbmN0OiB0cnVlIH0sIHF1ZXJ5KV07XG59XG5cbi8qKlxuICogQ29tcGlsZSB0ZXJtcyBpbnRvIGEgYHRvX3RzcXVlcnlgIGlucHV0IHdoZXJlIGV2ZXJ5IHRlcm0gaXMgYSBQUkVGSVgsIHNvIGFcbiAqIHBhcnRpYWxseSB0eXBlZCB3b3JkIHN0aWxsIG1hdGNoZXMgKGBpbnRlbDoqYCByZWFjaGVzIGBpbnRlbGxpZ2VuY2VgKS5cbiAqXG4gKiBUZXJtcyBjYXJyeSBvbmx5IGxldHRlcnMgYW5kIGRpZ2l0cyBieSBjb25zdHJ1Y3Rpb24sIHNvIG5vbmUgb2YgdHNxdWVyeSdzXG4gKiBvcGVyYXRvcnMgKGAmIHwgISAoICkgOiAqYCkgY2FuIHN1cnZpdmUgZnJvbSB1c2VyIGlucHV0IGludG8gdGhlIGNvbXBpbGVkXG4gKiBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1RzUXVlcnkodGVybXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBvcGVyYXRvcjogXCImXCIgfCBcInxcIiA9IFwiJlwiKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRlcm1zLm1hcCgodGVybSkgPT4gYCR7dGVybX06KmApLmpvaW4oYCAke29wZXJhdG9yfSBgKTtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIGEgc2luZ2xlLWluZGV4IExha2ViYXNlIHNlYXJjaCAobWlycm9ycyB0aGUgY2xpZW50J3MgYFNlYXJjaE9wdGlvbnNgKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJhc2VTZWFyY2hPcHRpb25zIHtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIGZpbHRlcj86IFNlYXJjaFJlcXVlc3RbXCJmaWx0ZXJcIl07XG4gIHNjb3JlVGhyZXNob2xkPzogbnVtYmVyO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIE9uZSByYXcgc2VhcmNoIHJvdyBiZWZvcmUgaXQgaXMgc2hhcGVkIGludG8gYSB7QGxpbmsgU2VhcmNoSGl0fS4gKi9cbmludGVyZmFjZSBTZWFyY2hSb3cge1xuICBpZDogc3RyaW5nO1xuICBkb2N1bWVudDogdW5rbm93bjtcbiAgc2NvcmU6IG51bWJlcjtcbn1cblxuLyoqIFRoZSBtYW5hZ2VkLXBvb2wgc3VyZmFjZSBuZWVkZWQgYnkgdGhlIHNlYXJjaCBiYWNrZW5kLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYWtlYmFzZVNlYXJjaFBvb2wge1xuICBjb25uZWN0KCk6IFByb21pc2U8UG9vbENsaWVudD47XG59XG5cbnR5cGUgTGFrZWJhc2VQb29sU291cmNlID1cbiAgfCAoKCkgPT4gUHJvbWlzZTxQb29sQ29uZmlnPiB8IFBvb2xDb25maWcpXG4gIHwgTGFrZWJhc2VTZWFyY2hQb29sXG4gIHwgeyBtYW5hZ2VkUG9vbDogKCkgPT4gTGFrZWJhc2VTZWFyY2hQb29sIHwgbnVsbCB8IHVuZGVmaW5lZCB9O1xuXG4vKiogT3B0aW9ucyBmb3IgcHJvdmlzaW9uaW5nIGEgTGFrZWJhc2UtYmFja2VkIGluZGV4LiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYWtlYmFzZVByb3Zpc2lvbk9wdGlvbnMge1xuICAvKiogVGV4dCBjb2x1bW4gZW1iZWRkZWQgaW50byB0aGUgc2VhcmNoIHZlY3Rvci4gRGVmYXVsdHMgdG8gYHRleHRgLiAqL1xuICB0ZXh0Q29sdW1uPzogc3RyaW5nO1xuICAvKiogRG9jdW1lbnRzIHRvIHNlZWQgd2hlbiB0aGUgdGFibGUgaXMgZW1wdHkuICovXG4gIHNlZWQ/OiBTZWFyY2hEb2N1bWVudFtdO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBBIFBvc3RncmVzIGZ1bGwtdGV4dCBiYWNrZW5kLiBPbmUgaW5zdGFuY2UgaXMgc2hhcmVkIGFjcm9zcyBpbmRleGVzOyBlYWNoXG4gKiBpbmRleCBtYXBzIHRvIGEgdGFibGUgd2hvc2UgbmFtZSBpcyBkZXJpdmVkIGZyb20gdGhlIGluZGV4IHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGNsYXNzIExha2ViYXNlU2VhcmNoQmFja2VuZCB7XG4gIHByaXZhdGUgcG9vbDogTGFrZWJhc2VTZWFyY2hQb29sIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHBvb2xQcm9taXNlOiBQcm9taXNlPExha2ViYXNlU2VhcmNoUG9vbD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgb3duc1Bvb2wgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm92aXNpb25lZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9vbFNvdXJjZTogTGFrZWJhc2VQb29sU291cmNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2NoZW1hID0gXCJwdWJsaWNcIixcbiAgICAvKiogSG93IGEgcG9vbCBpcyBidWlsdCBmcm9tIHRoZSByZXNvbHZlZCBjb25maWcuIE92ZXJyaWRhYmxlIGZvciB0ZXN0cy4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvb2xGYWN0b3J5OiAoY29uZmlnOiBQb29sQ29uZmlnKSA9PiBQb29sID0gKGNvbmZpZykgPT4gbmV3IFBvb2woY29uZmlnKSxcbiAgKSB7fVxuXG4gIC8qKiBMYXppbHkgYnVpbGQgKGFuZCBjYWNoZSkgdGhlIHBnIHBvb2wgZnJvbSB0aGUgcmVzb2x2ZWQgTGFrZWJhc2UgY29uZmlnLiAqL1xuICBwcml2YXRlIGFzeW5jIGdldFBvb2woKTogUHJvbWlzZTxMYWtlYmFzZVNlYXJjaFBvb2w+IHtcbiAgICBpZiAodGhpcy5wb29sKSByZXR1cm4gdGhpcy5wb29sO1xuICAgIGlmIChcIm1hbmFnZWRQb29sXCIgaW4gdGhpcy5wb29sU291cmNlKSB7XG4gICAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IDIwMDsgYXR0ZW1wdCArPSAxKSB7XG4gICAgICAgIHRoaXMucG9vbCA9IHRoaXMucG9vbFNvdXJjZS5tYW5hZ2VkUG9vbCgpID8/IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMucG9vbCkgcmV0dXJuIHRoaXMucG9vbDtcbiAgICAgICAgYXdhaXQgc2xlZXAoNTApO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoIChsYWtlYmFzZSk6IG1hbmFnZWQgcG9vbCBkaWQgbm90IGluaXRpYWxpemVcIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjb25uZWN0XCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMucG9vbFNvdXJjZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLnBvb2wgPSB0aGlzLnBvb2xTb3VyY2U7XG4gICAgICByZXR1cm4gdGhpcy5wb29sO1xuICAgIH1cbiAgICBjb25zdCBwZ0NvbmZpZ0ZhY3RvcnkgPSB0aGlzLnBvb2xTb3VyY2U7XG4gICAgdGhpcy5wb29sUHJvbWlzZSA/Pz0gKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHBnQ29uZmlnRmFjdG9yeSgpO1xuICAgICAgY29uc3QgcG9vbCA9IHRoaXMucG9vbEZhY3RvcnkocG9zdGdyZXNDb25uZWN0aW9uT3B0aW9ucyhjb25maWcpKTtcbiAgICAgIHRoaXMucG9vbCA9IHBvb2w7XG4gICAgICB0aGlzLm93bnNQb29sID0gdHJ1ZTtcbiAgICAgIHJldHVybiBwb29sO1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIHRoaXMucG9vbFByb21pc2U7XG4gIH1cblxuICAvKiogQ2xvc2UgdGhlIHBvb2wgc28gYSByZXN0YXJ0ZWQgYXBwIHJlYnVpbGRzIGl0LiAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwb29sID0gdGhpcy5wb29sO1xuICAgIHRoaXMucG9vbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBvb2xQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucHJvdmlzaW9uZWQuY2xlYXIoKTtcbiAgICBpZiAocG9vbCAmJiB0aGlzLm93bnNQb29sKSBhd2FpdCAocG9vbCBhcyBQb29sKS5lbmQoKTtcbiAgICB0aGlzLm93bnNQb29sID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIGEgTGFrZWJhc2UtYmFja2VkIGluZGV4LiBSZXR1cm5zIGhpdHMgc29ydGVkIG1vc3QtcmVsZXZhbnQtZmlyc3QsXG4gICAqIHNoYXBlZCBpZGVudGljYWxseSB0byB0aGUgVmVjdG9yIFNlYXJjaCBiYWNrZW5kLlxuICAgKi9cbiAgYXN5bmMgc2VhcmNoKFxuICAgIGluZGV4OiBzdHJpbmcsXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zOiBMYWtlYmFzZVNlYXJjaE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICBjb25zdCB0ZXh0ID0gdHJpbVRvRW1wdHkocXVlcnkpO1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZUZvcihpbmRleCk7XG4gICAgY29uc3QgbGltaXQgPSBvcHRpb25zLmxpbWl0ID8/IDEwO1xuICAgIGNvbnN0IHBvb2wgPSBhd2FpdCB0aGlzLmdldFBvb2woKTtcbiAgICBjb25zdCB0ZXJtcyA9IHRvU2VhcmNoVGVybXModGV4dCk7XG5cbiAgICAvLyBBbiBlbXB0eSAob3IgcHVuY3R1YXRpb24tb25seSkgYm94IHJldHVybnMgcm93cyByYXRoZXIgdGhhbiBub3RoaW5nLCBzb1xuICAgIC8vIHRoZSBVSSBzaG93cyBjb250ZW50IGJlZm9yZSB0aGUgdXNlciB0eXBlcyAtIGFzIGEga2V5d29yZCBpbmRleCB3b3VsZC5cbiAgICBpZiAodGVybXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmZpbHRlckNsYXVzZShvcHRpb25zLmZpbHRlciwgMSk7XG4gICAgICBjb25zdCBsaW1pdFBvc2l0aW9uID0gZmlsdGVyLnBhcmFtcy5sZW5ndGggKyAxO1xuICAgICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLnF1ZXJ5PFNlYXJjaFJvdz4oXG4gICAgICAgIHBvb2wsXG4gICAgICAgIGBTRUxFQ1QgaWQsIGRvY3VtZW50LCAwOjpmbG9hdDQgQVMgc2NvcmVcbiAgICAgICAgICAgRlJPTSAke3RhYmxlfVxuICAgICAgICAgIFdIRVJFIFRSVUUke2ZpbHRlci5zcWx9XG4gICAgICAgICAgT1JERVIgQlkgaWRcbiAgICAgICAgICBMSU1JVCAkJHtsaW1pdFBvc2l0aW9ufWAsXG4gICAgICAgIFsuLi5maWx0ZXIucGFyYW1zLCBsaW1pdF0sXG4gICAgICAgIG9wdGlvbnMuc2lnbmFsLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLnRvUmVzdWx0KHRleHQsIGluZGV4LCByb3dzLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBQcmVjaXNlIHBhc3M6IGV2ZXJ5IHRlcm0gbXVzdCBtYXRjaCwgZWFjaCBhcyBhIHByZWZpeC5cbiAgICBjb25zdCBzdHJpY3RGaWx0ZXIgPSB0aGlzLmZpbHRlckNsYXVzZShvcHRpb25zLmZpbHRlciwgMik7XG4gICAgY29uc3Qgc3RyaWN0TGltaXRQb3NpdGlvbiA9IHN0cmljdEZpbHRlci5wYXJhbXMubGVuZ3RoICsgMjtcbiAgICBjb25zdCBzdHJpY3QgPSBhd2FpdCB0aGlzLnF1ZXJ5PFNlYXJjaFJvdz4oXG4gICAgICBwb29sLFxuICAgICAgYFNFTEVDVCBpZCwgZG9jdW1lbnQsIHRzX3Jhbmsoc2VhcmNoX3ZlY3RvciwgdG9fdHNxdWVyeSgnZW5nbGlzaCcsICQxKSkgQVMgc2NvcmVcbiAgICAgICAgIEZST00gJHt0YWJsZX1cbiAgICAgICAgV0hFUkUgc2VhcmNoX3ZlY3RvciBAQCB0b190c3F1ZXJ5KCdlbmdsaXNoJywgJDEpXG4gICAgICAgICAgJHtzdHJpY3RGaWx0ZXIuc3FsfVxuICAgICAgICBPUkRFUiBCWSBzY29yZSBERVNDXG4gICAgICAgIExJTUlUICQke3N0cmljdExpbWl0UG9zaXRpb259YCxcbiAgICAgIFt0b1RzUXVlcnkodGVybXMpLCAuLi5zdHJpY3RGaWx0ZXIucGFyYW1zLCBsaW1pdF0sXG4gICAgICBvcHRpb25zLnNpZ25hbCxcbiAgICApO1xuICAgIGlmIChzdHJpY3Qucm93cy5sZW5ndGggPiAwKSByZXR1cm4gdGhpcy50b1Jlc3VsdCh0ZXh0LCBpbmRleCwgc3RyaWN0LnJvd3MsIG9wdGlvbnMpO1xuXG4gICAgLy8gTm90aGluZyBtYXRjaGVkIEVWRVJZIHRlcm0sIHNvIHJlbGF4IHJhdGhlciB0aGFuIHJldHVybiBhbiBlbXB0eSBib3g6XG4gICAgLy8gYW55IG9uZSB0ZXJtIGlzIGVub3VnaCwgYW5kIGFuIGBJTElLRWAgcGFzcyBhZGRpdGlvbmFsbHkgY2F0Y2hlcyBhXG4gICAgLy8gZnJhZ21lbnQgdGhhdCBpcyBub3QgYSBwcmVmaXggKGB0ZWxsaWdlbmNlYCkgb3IgYSB0b2tlbiB0aGUgdGV4dC1zZWFyY2hcbiAgICAvLyBwYXJzZXIgc3BsaXQgZGlmZmVyZW50bHkgdGhhbiBleHBlY3RlZC4gU3Vic3RyaW5nIG1hdGNoaW5nIGNhbm5vdCB1c2VcbiAgICAvLyB0aGUgR0lOIGluZGV4LCB3aGljaCBpcyB3aHkgaXQgb25seSBydW5zIG9uY2UgdGhlIGluZGV4ZWQgcGFzcyBmYWlscy5cbiAgICBjb25zdCByZWxheGVkRmlsdGVyID0gdGhpcy5maWx0ZXJDbGF1c2Uob3B0aW9ucy5maWx0ZXIsIDMpO1xuICAgIGNvbnN0IHJlbGF4ZWRMaW1pdFBvc2l0aW9uID0gcmVsYXhlZEZpbHRlci5wYXJhbXMubGVuZ3RoICsgMztcbiAgICBjb25zdCByZWxheGVkID0gYXdhaXQgdGhpcy5xdWVyeTxTZWFyY2hSb3c+KFxuICAgICAgcG9vbCxcbiAgICAgIGBTRUxFQ1QgaWQsIGRvY3VtZW50LCB0c19yYW5rKHNlYXJjaF92ZWN0b3IsIHRvX3RzcXVlcnkoJ2VuZ2xpc2gnLCAkMSkpIEFTIHNjb3JlXG4gICAgICAgICBGUk9NICR7dGFibGV9XG4gICAgICAgIFdIRVJFIChzZWFyY2hfdmVjdG9yIEBAIHRvX3RzcXVlcnkoJ2VuZ2xpc2gnLCAkMSlcbiAgICAgICAgICAgT1Igc2VhcmNoX3RleHQgSUxJS0UgQU5ZKCQyOjp0ZXh0W10pKVxuICAgICAgICAgICR7cmVsYXhlZEZpbHRlci5zcWx9XG4gICAgICAgIE9SREVSIEJZIHNjb3JlIERFU0NcbiAgICAgICAgTElNSVQgJCR7cmVsYXhlZExpbWl0UG9zaXRpb259YCxcbiAgICAgIFt0b1RzUXVlcnkodGVybXMsIFwifFwiKSwgdGVybXMubWFwKCh0ZXJtKSA9PiBgJSR7dGVybX0lYCksIC4uLnJlbGF4ZWRGaWx0ZXIucGFyYW1zLCBsaW1pdF0sXG4gICAgICBvcHRpb25zLnNpZ25hbCxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnRvUmVzdWx0KHRleHQsIGluZGV4LCByZWxheGVkLnJvd3MsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIFNoYXBlIHJhdyByb3dzIGludG8gdGhlIGBTZWFyY2hSZXN1bHRgIGJvdGggYmFja2VuZHMgcmV0dXJuLiAqL1xuICBwcml2YXRlIHRvUmVzdWx0KFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgaW5kZXg6IHN0cmluZyxcbiAgICByb3dzOiBTZWFyY2hSb3dbXSxcbiAgICBvcHRpb25zOiBMYWtlYmFzZVNlYXJjaE9wdGlvbnMsXG4gICk6IFNlYXJjaFJlc3VsdCB7XG4gICAgY29uc3QgaGl0czogU2VhcmNoSGl0W10gPSByb3dzXG4gICAgICAubWFwKChyb3cpID0+ICh7XG4gICAgICAgIGlkOiBTdHJpbmcocm93LmlkKSxcbiAgICAgICAgc2NvcmU6IE51bWJlcihyb3cuc2NvcmUpIHx8IDAsXG4gICAgICAgIGZpZWxkczogdGhpcy50b0ZpZWxkcyhyb3cuZG9jdW1lbnQpLFxuICAgICAgfSkpXG4gICAgICAuZmlsdGVyKChoaXQpID0+IG9wdGlvbnMuc2NvcmVUaHJlc2hvbGQgPT09IHVuZGVmaW5lZCB8fCBoaXQuc2NvcmUgPj0gb3B0aW9ucy5zY29yZVRocmVzaG9sZCk7XG4gICAgcmV0dXJuIHsgcXVlcnksIGluZGV4LCBoaXRzLCBjb3VudDogaGl0cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgdGhlIHRhYmxlICsgZnVsbC10ZXh0IGluZGV4IGV4aXN0IGFuZCBzZWVkIGRvY3VtZW50cyB3aGVuIGVtcHR5LlxuICAgKiBJZGVtcG90ZW50LCBzbyBpdCBpcyBzYWZlIHRvIGNhbGwgb24gZXZlcnkgYm9vdC5cbiAgICovXG4gIGFzeW5jIHByb3Zpc2lvbihpbmRleDogc3RyaW5nLCBvcHRpb25zOiBMYWtlYmFzZVByb3Zpc2lvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlRm9yKGluZGV4KTtcbiAgICBjb25zdCBwb29sID0gYXdhaXQgdGhpcy5nZXRQb29sKCk7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVUYWJsZShwb29sLCB0YWJsZSwgb3B0aW9ucy5zaWduYWwpO1xuXG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLnF1ZXJ5PHsgY291bnQ6IHN0cmluZyB9PihcbiAgICAgIHBvb2wsXG4gICAgICBgU0VMRUNUIGNvdW50KCopOjp0ZXh0IEFTIGNvdW50IEZST00gJHt0YWJsZX1gLFxuICAgICAgW10sXG4gICAgICBvcHRpb25zLnNpZ25hbCxcbiAgICApO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gTnVtYmVyKHJvd3NbMF0/LmNvdW50ID8/IFwiMFwiKTtcbiAgICBjb25zdCBzZWVkID0gb3B0aW9ucy5zZWVkID8/IFtdO1xuICAgIGlmIChleGlzdGluZyA9PT0gMCAmJiBzZWVkLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMudXBzZXJ0KHBvb2wsIHRhYmxlLCBzZWVkLCBvcHRpb25zLnRleHRDb2x1bW4gPz8gXCJ0ZXh0XCIsIG9wdGlvbnMuc2lnbmFsKTtcbiAgICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtc2VlZGVkXCIsIHsgaW5kZXgsIHRhYmxlLCBjb3VudDogc2VlZC5sZW5ndGggfSk7XG4gICAgICByZXR1cm4gc2VlZC5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBleGlzdGluZztcbiAgfVxuXG4gIC8qKiBBZGQgb3IgdXBkYXRlIGRvY3VtZW50cyBieSBwcmltYXJ5IGtleS4gKi9cbiAgYXN5bmMgYWRkRG9jdW1lbnRzKFxuICAgIGluZGV4OiBzdHJpbmcsXG4gICAgZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdLFxuICAgIHRleHRDb2x1bW4gPSBcInRleHRcIixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+IHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVGb3IoaW5kZXgpO1xuICAgIGNvbnN0IHBvb2wgPSBhd2FpdCB0aGlzLmdldFBvb2woKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVRhYmxlKHBvb2wsIHRhYmxlLCBzaWduYWwpO1xuICAgIGF3YWl0IHRoaXMudXBzZXJ0KHBvb2wsIHRhYmxlLCBkb2N1bWVudHMsIHRleHRDb2x1bW4sIHNpZ25hbCk7XG4gICAgcmV0dXJuIHsgaW5kZXgsIGNvdW50OiBkb2N1bWVudHMubGVuZ3RoIH07XG4gIH1cblxuICAvKiogRGVsZXRlIGRvY3VtZW50cyBieSBwcmltYXJ5IGtleS4gKi9cbiAgYXN5bmMgZGVsZXRlRG9jdW1lbnRzKFxuICAgIGluZGV4OiBzdHJpbmcsXG4gICAgaWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZUZvcihpbmRleCk7XG4gICAgY29uc3QgcG9vbCA9IGF3YWl0IHRoaXMuZ2V0UG9vbCgpO1xuICAgIGF3YWl0IHRoaXMucXVlcnkocG9vbCwgYERFTEVURSBGUk9NICR7dGFibGV9IFdIRVJFIGlkID0gQU5ZKCQxKWAsIFtpZHMubWFwKFN0cmluZyldLCBzaWduYWwpO1xuICAgIHJldHVybiB7IGluZGV4LCBjb3VudDogaWRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqIENyZWF0ZSB0aGUgdGFibGUgKyBHSU4gaW5kZXggb25jZSBwZXIgdGFibGUgKG1lbW9pemVkIGFjcm9zcyBjYWxscykuICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlVGFibGUoXG4gICAgcG9vbDogTGFrZWJhc2VTZWFyY2hQb29sLFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnByb3Zpc2lvbmVkLmhhcyh0YWJsZSkpIHJldHVybjtcbiAgICAvLyBgZG9jdW1lbnRgIGhvbGRzIHRoZSB3aG9sZSByb3c7IGBzZWFyY2hfdGV4dGAgaXMgdGhlIGluZGV4ZWQgdGV4dDsgdGhlXG4gICAgLy8gZ2VuZXJhdGVkIGBzZWFyY2hfdmVjdG9yYCBrZWVwcyB0aGUgdHN2ZWN0b3IgaW4gbG9ja3N0ZXAgd2l0aCBpdCBzbyBhXG4gICAgLy8gd3JpdGUgbmV2ZXIgaGFzIHRvIGNvbXB1dGUgdGhlIHZlY3RvciBieSBoYW5kLlxuICAgIGF3YWl0IHRoaXMucXVlcnkocG9vbCwgYENSRUFURSBTQ0hFTUEgSUYgTk9UIEVYSVNUUyAke3RoaXMuaWRlbnQodGhpcy5zY2hlbWEpfWAsIFtdLCBzaWduYWwpO1xuICAgIGF3YWl0IHRoaXMucXVlcnkoXG4gICAgICBwb29sLFxuICAgICAgYENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICR7dGFibGV9IChcbiAgICAgICAgIGlkIHRleHQgUFJJTUFSWSBLRVksXG4gICAgICAgICBzZWFyY2hfdGV4dCB0ZXh0IE5PVCBOVUxMIERFRkFVTFQgJycsXG4gICAgICAgICBkb2N1bWVudCBqc29uYiBOT1QgTlVMTCBERUZBVUxUICd7fSc6Ompzb25iLFxuICAgICAgICAgc2VhcmNoX3ZlY3RvciB0c3ZlY3RvciBHRU5FUkFURUQgQUxXQVlTIEFTICh0b190c3ZlY3RvcignZW5nbGlzaCcsIHNlYXJjaF90ZXh0KSkgU1RPUkVEXG4gICAgICAgKWAsXG4gICAgICBbXSxcbiAgICAgIHNpZ25hbCxcbiAgICApO1xuICAgIGF3YWl0IHRoaXMucXVlcnkoXG4gICAgICBwb29sLFxuICAgICAgYEFMVEVSIFRBQkxFICR7dGFibGV9XG4gICAgICAgICBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgc2VhcmNoX3ZlY3RvciB0c3ZlY3RvclxuICAgICAgICAgR0VORVJBVEVEIEFMV0FZUyBBUyAodG9fdHN2ZWN0b3IoJ2VuZ2xpc2gnLCBzZWFyY2hfdGV4dCkpIFNUT1JFRGAsXG4gICAgICBbXSxcbiAgICAgIHNpZ25hbCxcbiAgICApO1xuICAgIGF3YWl0IHRoaXMucXVlcnkoXG4gICAgICBwb29sLFxuICAgICAgYENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTICR7dGhpcy5pZGVudChgJHt0aGlzLmJhcmVOYW1lKHRhYmxlKX1fZnRzYCl9XG4gICAgICAgICBPTiAke3RhYmxlfSBVU0lORyBnaW4gKHNlYXJjaF92ZWN0b3IpYCxcbiAgICAgIFtdLFxuICAgICAgc2lnbmFsLFxuICAgICk7XG4gICAgdGhpcy5wcm92aXNpb25lZC5hZGQodGFibGUpO1xuICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtY3JlYXRlZFwiLCB7IHRhYmxlIH0pO1xuICB9XG5cbiAgLyoqIFVwc2VydCByb3dzOiB0aGUgd2hvbGUgZG9jdW1lbnQgYXMganNvbmIgKyBhIGZsYXR0ZW5lZCB0ZXh0IGJsb2IgdG8gaW5kZXguICovXG4gIHByaXZhdGUgYXN5bmMgdXBzZXJ0KFxuICAgIHBvb2w6IExha2ViYXNlU2VhcmNoUG9vbCxcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGRvY3VtZW50czogU2VhcmNoRG9jdW1lbnRbXSxcbiAgICB0ZXh0Q29sdW1uOiBzdHJpbmcsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3VtZW50cykge1xuICAgICAgY29uc3QgaWQgPSB0cmltVG9OdWxsKFN0cmluZyhkb2MuaWQgPz8gZG9jLklEID8/IFwiXCIpKSA/PyB1bmRlZmluZWQ7XG4gICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2ggKGxha2ViYXNlKTogYSBkb2N1bWVudCBpcyBtaXNzaW5nIGFuIGBpZGBcIiwge1xuICAgICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImFkZERvY3VtZW50c1wiIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VhcmNoVGV4dCA9IHRoaXMuc2VhcmNoVGV4dChkb2MsIHRleHRDb2x1bW4pO1xuICAgICAgYXdhaXQgdGhpcy5xdWVyeShcbiAgICAgICAgcG9vbCxcbiAgICAgICAgYElOU0VSVCBJTlRPICR7dGFibGV9IChpZCwgc2VhcmNoX3RleHQsIGRvY3VtZW50KVxuICAgICAgICAgICBWQUxVRVMgKCQxLCAkMiwgJDM6Ompzb25iKVxuICAgICAgICAgT04gQ09ORkxJQ1QgKGlkKSBETyBVUERBVEVcbiAgICAgICAgICAgU0VUIHNlYXJjaF90ZXh0ID0gRVhDTFVERUQuc2VhcmNoX3RleHQsIGRvY3VtZW50ID0gRVhDTFVERUQuZG9jdW1lbnRgLFxuICAgICAgICBbaWQsIHNlYXJjaFRleHQsIEpTT04uc3RyaW5naWZ5KGRvYyldLFxuICAgICAgICBzaWduYWwsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgdGV4dCBhIHJvdyBpcyBpbmRleGVkIGJ5OiB0aGUgdGV4dCBjb2x1bW4gZmlyc3QsIHRoZW4gYW55IG90aGVyIHN0cmluZyBmaWVsZC4gKi9cbiAgcHJpdmF0ZSBzZWFyY2hUZXh0KGRvYzogU2VhcmNoRG9jdW1lbnQsIHRleHRDb2x1bW46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJpbWFyeSA9IHRyaW1Ub0VtcHR5KFN0cmluZyhkb2NbdGV4dENvbHVtbl0gPz8gXCJcIikpO1xuICAgIGNvbnN0IHJlc3QgPSBPYmplY3QuZW50cmllcyhkb2MpXG4gICAgICAuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IGtleSAhPT0gdGV4dENvbHVtbiAmJiBrZXkgIT09IFwiaWRcIiAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpXG4gICAgICAubWFwKChbLCB2YWx1ZV0pID0+IHZhbHVlIGFzIHN0cmluZyk7XG4gICAgcmV0dXJuIFtwcmltYXJ5LCAuLi5yZXN0XS5maWx0ZXIoQm9vbGVhbikuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIC8qKiBBIGhpdCdzIGBmaWVsZHNgOiB0aGUgc3RvcmVkIGRvY3VtZW50IG1pbnVzIHRoZSByZXNlcnZlZC9pbnRlcm5hbCBrZXlzLiAqL1xuICBwcml2YXRlIHRvRmllbGRzKGRvY3VtZW50OiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghaXNSZWNvcmQoZG9jdW1lbnQpKSByZXR1cm4ge307XG4gICAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRvY3VtZW50KSkge1xuICAgICAgaWYgKFJFU0VSVkVEX0NPTFVNTlMuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgZmllbGRzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkcztcbiAgfVxuXG4gIC8qKiBDb21waWxlIEFwcEtpdCBzY2FsYXIvYXJyYXkgZmlsdGVycyBhZ2FpbnN0IHRoZSBzdG9yZWQgSlNPTiBkb2N1bWVudC4gKi9cbiAgcHJpdmF0ZSBmaWx0ZXJDbGF1c2UoXG4gICAgZmlsdGVyOiBTZWFyY2hSZXF1ZXN0W1wiZmlsdGVyXCJdLFxuICAgIHN0YXJ0UG9zaXRpb246IG51bWJlcixcbiAgKTogeyBzcWw6IHN0cmluZzsgcGFyYW1zOiB1bmtub3duW10gfSB7XG4gICAgaWYgKCFmaWx0ZXIgfHwgT2JqZWN0LmtleXMoZmlsdGVyKS5sZW5ndGggPT09IDApIHJldHVybiB7IHNxbDogXCJcIiwgcGFyYW1zOiBbXSB9O1xuICAgIGNvbnN0IGNsYXVzZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcGFyYW1zOiB1bmtub3duW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmaWx0ZXIpKSB7XG4gICAgICBjb25zdCBrZXlQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb24gKyBwYXJhbXMubGVuZ3RoO1xuICAgICAgcGFyYW1zLnB1c2goa2V5KTtcbiAgICAgIGNvbnN0IHZhbHVlUG9zaXRpb24gPSBzdGFydFBvc2l0aW9uICsgcGFyYW1zLmxlbmd0aDtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBwYXJhbXMucHVzaCh2YWx1ZS5tYXAoU3RyaW5nKSk7XG4gICAgICAgIGNsYXVzZXMucHVzaChgZG9jdW1lbnQgLT4+ICQke2tleVBvc2l0aW9ufSA9IEFOWSgkJHt2YWx1ZVBvc2l0aW9ufTo6dGV4dFtdKWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1zLnB1c2goU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgIGNsYXVzZXMucHVzaChgZG9jdW1lbnQgLT4+ICQke2tleVBvc2l0aW9ufSA9ICQke3ZhbHVlUG9zaXRpb259YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHNxbDogYCBBTkQgJHtjbGF1c2VzLmpvaW4oXCIgQU5EIFwiKX1gLCBwYXJhbXMgfTtcbiAgfVxuXG4gIC8qKiBUaGUgZnVsbHktcXVhbGlmaWVkIHRhYmxlIG5hbWUgZm9yIGFuIGluZGV4IHJlZmVyZW5jZS4gKi9cbiAgcHJpdmF0ZSB0YWJsZUZvcihpbmRleDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5pZGVudCh0aGlzLnNjaGVtYSl9LiR7dGhpcy5pZGVudCh0aGlzLmJhcmVOYW1lKGluZGV4KSl9YDtcbiAgfVxuXG4gIC8qKiBBIHNhZmUgYmFyZSB0YWJsZSBuYW1lIGRlcml2ZWQgZnJvbSBhbiBpbmRleCByZWZlcmVuY2UuICovXG4gIHByaXZhdGUgYmFyZU5hbWUocmVmZXJlbmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhc3QgPSByZWZlcmVuY2Uuc3BsaXQoXCIuXCIpLmZpbHRlcihCb29sZWFuKS5wb3AoKSA/PyByZWZlcmVuY2U7XG4gICAgY29uc3Qgc2x1ZyA9IHRvU2x1ZyhsYXN0KS5yZXBsYWNlKC8tL2csIFwiX1wiKTtcbiAgICByZXR1cm4gc2x1Zy5sZW5ndGggPiAwID8gc2x1ZyA6IFwiZG9jdW1lbnRzXCI7XG4gIH1cblxuICAvKiogUXVvdGUgYSBQb3N0Z3JlcyBpZGVudGlmaWVyLiAqL1xuICBwcml2YXRlIGlkZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBcIiR7bmFtZS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYDtcbiAgfVxuXG4gIC8qKiBSdW4gb25lIHF1ZXJ5IHVuZGVyIGV4dGVybmFsIGNhbmNlbGxhdGlvbi4gKi9cbiAgcHJpdmF0ZSBhc3luYyBxdWVyeTxUPihcbiAgICBwb29sOiBMYWtlYmFzZVNlYXJjaFBvb2wsXG4gICAgc3FsOiBzdHJpbmcsXG4gICAgcGFyYW1zOiB1bmtub3duW10sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8eyByb3dzOiBUW10gfT4ge1xuICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHRocm93IEV4ZWN1dGlvbkVycm9yLmNhbmNlbGVkKCk7XG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgcG9vbC5jb25uZWN0KCk7XG4gICAgbGV0IHJlbGVhc2VkID0gZmFsc2U7XG4gICAgY29uc3Qgb25BYm9ydCA9ICgpID0+IHtcbiAgICAgIGlmIChyZWxlYXNlZCkgcmV0dXJuO1xuICAgICAgcmVsZWFzZWQgPSB0cnVlO1xuICAgICAgY2xpZW50LnJlbGVhc2UodHJ1ZSk7XG4gICAgfTtcbiAgICBzaWduYWw/LmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5xdWVyeShzcWwsIHBhcmFtcyk7XG4gICAgICByZXR1cm4geyByb3dzOiByZXN1bHQucm93cyBhcyBUW10gfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCk7XG4gICAgICBpZiAoIXJlbGVhc2VkKSBjbGllbnQucmVsZWFzZSgpO1xuICAgIH1cbiAgfVxufVxuIl19
package/lib/src/native.js CHANGED
@@ -5,8 +5,8 @@
5
5
  * @module
6
6
  */
7
7
  import { ValidationError } from "@databricks/appkit";
8
- import { stringUtils } from "@dbx-tools/shared-core";
9
- import { searchSchemas, } from "@dbx-tools/shared-search";
8
+ import { trimToNull } from "@dbx-tools/shared-core";
9
+ import { toAiSearchQueryType, } from "@dbx-tools/shared-search";
10
10
  import { indexConfigFor } from "./config.js";
11
11
  function filters(value) {
12
12
  if (!value)
@@ -30,7 +30,7 @@ function hitId(data, primaryKey, index) {
30
30
  return String(value);
31
31
  }
32
32
  function aliasFor(index, config) {
33
- const alias = indexConfigFor(config, index)?.alias ?? stringUtils.trimToNull(index);
33
+ const alias = indexConfigFor(config, index)?.alias ?? trimToNull(index);
34
34
  if (!alias)
35
35
  throw new ValidationError("AI Search requires a configured index alias");
36
36
  return alias;
@@ -43,7 +43,7 @@ export function nativeAiSearchBackend(provider, config) {
43
43
  options.signal?.throwIfAborted();
44
44
  const known = indexConfigFor(config, index);
45
45
  const alias = aliasFor(index, config);
46
- const resolvedQueryType = searchSchemas.toAiSearchQueryType(options.mode);
46
+ const resolvedQueryType = toAiSearchQueryType(options.mode);
47
47
  const resolvedFilters = filters(options.filter);
48
48
  const response = await provider.query(alias, {
49
49
  queryText: query,
@@ -76,4 +76,4 @@ export function nativeAiSearchBackend(provider, config) {
76
76
  },
77
77
  };
78
78
  }
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU1yRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUNMLGFBQWEsR0FNZCxNQUFNLDBCQUEwQixDQUFDO0FBRWxDLE9BQU8sRUFBRSxjQUFjLEVBQTZCLE1BQU0sYUFBYSxDQUFDO0FBU3hFLFNBQVMsT0FBTyxDQUFDLEtBQXVDO0lBQ3RELElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0IsTUFBTSxNQUFNLEdBQXdCLEVBQUUsQ0FBQztJQUN2QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2hELElBQ0UsT0FBTyxJQUFJLEtBQUssUUFBUTtZQUN4QixPQUFPLElBQUksS0FBSyxRQUFRO1lBQ3hCLE9BQU8sSUFBSSxLQUFLLFNBQVM7WUFDekIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLEVBQ2hGLENBQUM7WUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ25CLFNBQVM7UUFDWCxDQUFDO1FBQ0QsTUFBTSxJQUFJLGVBQWUsQ0FDdkIscUJBQXFCLEdBQUcsNkRBQTZELENBQ3RGLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsS0FBSyxDQUNaLElBQTZC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LEVBQUUsQ0FBQztRQUNwRCxDQUFDO0tBQ0YsQ0FBQztJQUNGLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNELElBQUksQ0FBQyxZQUFZO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDbEMsT0FBTztRQUNMLEdBQUcsT0FBTztRQUNWLEtBQUssQ0FBQyxZQUFZLENBQ2hCLEtBQWEsRUFDYixTQUEyQixFQUMzQixNQUFvQjtZQUVwQixNQUFNLEVBQUUsY0FBYyxFQUFFLENBQUM7WUFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN0RSxNQUFNLEVBQUUsY0FBYyxFQUFFLENBQUM7WUFDekIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBZGFwdGVyIGZyb20gQXBwS2l0J3MgbmF0aXZlIEFJIFNlYXJjaCBwcm92aWRlciB0byB0aGUgZGJ4LXRvb2xzIGV4dGVuc2lvblxuICogY29udHJhY3QgdXNlZCBieSBmZWRlcmF0ZWQgc2VhcmNoIGFuZCBhZ2VudCB0b29scy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUge1xuICBTZWFyY2hGaWx0ZXJzIGFzIEFwcEtpdFNlYXJjaEZpbHRlcnMsXG4gIFNlYXJjaFJlcXVlc3QgYXMgQXBwS2l0U2VhcmNoUmVxdWVzdCxcbiAgU2VhcmNoUmVzcG9uc2UgYXMgQXBwS2l0U2VhcmNoUmVzcG9uc2UsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuaW1wb3J0IHsgc3RyaW5nVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgc2VhcmNoU2NoZW1hcyxcbiAgdHlwZSBTZWFyY2hEb2N1bWVudCxcbiAgdHlwZSBTZWFyY2hIaXQsXG4gIHR5cGUgU2VhcmNoUmVxdWVzdCBhcyBFeHRlbnNpb25TZWFyY2hSZXF1ZXN0LFxuICB0eXBlIFNlYXJjaFJlc3VsdCxcbiAgdHlwZSBVcHNlcnRSZXN1bHQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hcIjtcbmltcG9ydCB0eXBlIHsgU2VhcmNoT3B0aW9ucywgU2VhcmNoUmVhZEJhY2tlbmQgfSBmcm9tIFwiLi9jbGllbnQudHNcIjtcbmltcG9ydCB7IGluZGV4Q29uZmlnRm9yLCB0eXBlIFJlc29sdmVkU2VhcmNoQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5cbi8qKiBNaW5pbWFsIHF1ZXJ5IHN1cmZhY2UgZXhwb3NlZCBieSBBcHBLaXQncyBuYXRpdmUgYGFpU2VhcmNoYCBwbHVnaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIEFpU2VhcmNoUHJvdmlkZXIge1xuICBwcm92aWRlcktpbmQ/OiBcImxha2ViYXNlXCI7XG4gIHF1ZXJ5KGFsaWFzOiBzdHJpbmcsIHJlcXVlc3Q6IEFwcEtpdFNlYXJjaFJlcXVlc3QpOiBQcm9taXNlPEFwcEtpdFNlYXJjaFJlc3BvbnNlPjtcbiAgYWRkRG9jdW1lbnRzPyhhbGlhczogc3RyaW5nLCBkb2N1bWVudHM6IFNlYXJjaERvY3VtZW50W10pOiBQcm9taXNlPFVwc2VydFJlc3VsdD47XG59XG5cbmZ1bmN0aW9uIGZpbHRlcnModmFsdWU6IEV4dGVuc2lvblNlYXJjaFJlcXVlc3RbXCJmaWx0ZXJcIl0pOiBBcHBLaXRTZWFyY2hGaWx0ZXJzIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcmVzdWx0OiBBcHBLaXRTZWFyY2hGaWx0ZXJzID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgaXRlbV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIgfHxcbiAgICAgIHR5cGVvZiBpdGVtID09PSBcIm51bWJlclwiIHx8XG4gICAgICB0eXBlb2YgaXRlbSA9PT0gXCJib29sZWFuXCIgfHxcbiAgICAgIChBcnJheS5pc0FycmF5KGl0ZW0pICYmXG4gICAgICAgIGl0ZW0uZXZlcnkoKGVudHJ5KSA9PiB0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGVudHJ5ID09PSBcIm51bWJlclwiKSlcbiAgICApIHtcbiAgICAgIHJlc3VsdFtrZXldID0gaXRlbTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYEFJIFNlYXJjaCBmaWx0ZXIgXCIke2tleX1cIiBtdXN0IGJlIGEgc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG9yIHN0cmluZy9udW1iZXIgYXJyYXlgLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaGl0SWQoXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBwcmltYXJ5S2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGluZGV4OiBudW1iZXIsXG4pOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZSA9IGRhdGFbcHJpbWFyeUtleSA/PyBcImlkXCJdID8/IE9iamVjdC52YWx1ZXMoZGF0YSlbMF0gPz8gaW5kZXg7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBhbGlhc0ZvcihpbmRleDogc3RyaW5nLCBjb25maWc6IFJlc29sdmVkU2VhcmNoQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgYWxpYXMgPSBpbmRleENvbmZpZ0Zvcihjb25maWcsIGluZGV4KT8uYWxpYXMgPz8gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChpbmRleCk7XG4gIGlmICghYWxpYXMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJBSSBTZWFyY2ggcmVxdWlyZXMgYSBjb25maWd1cmVkIGluZGV4IGFsaWFzXCIpO1xuICByZXR1cm4gYWxpYXM7XG59XG5cbi8qKiBCdWlsZCBhIHJlYWQgYmFja2VuZCB0aGF0IGRlbGVnYXRlcyBldmVyeSBWZWN0b3IgU2VhcmNoIHF1ZXJ5IHRvIEFwcEtpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVBaVNlYXJjaEJhY2tlbmQoXG4gIHByb3ZpZGVyOiBBaVNlYXJjaFByb3ZpZGVyLFxuICBjb25maWc6IFJlc29sdmVkU2VhcmNoQ29uZmlnLFxuKTogU2VhcmNoUmVhZEJhY2tlbmQge1xuICBjb25zdCBiYWNrZW5kOiBTZWFyY2hSZWFkQmFja2VuZCA9IHtcbiAgICBzdXBwb3J0c0xpZmVjeWNsZTogcHJvdmlkZXIucHJvdmlkZXJLaW5kICE9PSBcImxha2ViYXNlXCIsXG4gICAgYXN5bmMgc2VhcmNoKGluZGV4OiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgICBvcHRpb25zLnNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IGtub3duID0gaW5kZXhDb25maWdGb3IoY29uZmlnLCBpbmRleCk7XG4gICAgICBjb25zdCBhbGlhcyA9IGFsaWFzRm9yKGluZGV4LCBjb25maWcpO1xuICAgICAgY29uc3QgcmVzb2x2ZWRRdWVyeVR5cGUgPSBzZWFyY2hTY2hlbWFzLnRvQWlTZWFyY2hRdWVyeVR5cGUob3B0aW9ucy5tb2RlKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkRmlsdGVycyA9IGZpbHRlcnMob3B0aW9ucy5maWx0ZXIpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwcm92aWRlci5xdWVyeShhbGlhcywge1xuICAgICAgICBxdWVyeVRleHQ6IHF1ZXJ5LFxuICAgICAgICBudW1SZXN1bHRzOiBvcHRpb25zLmxpbWl0ID8/IGNvbmZpZy5wYWdlU2l6ZSxcbiAgICAgICAgLi4uKG9wdGlvbnMuY29sdW1ucyA/IHsgY29sdW1uczogWy4uLm9wdGlvbnMuY29sdW1uc10gfSA6IHt9KSxcbiAgICAgICAgLi4uKHJlc29sdmVkUXVlcnlUeXBlID8geyBxdWVyeVR5cGU6IHJlc29sdmVkUXVlcnlUeXBlIH0gOiB7fSksXG4gICAgICAgIC4uLihyZXNvbHZlZEZpbHRlcnMgPyB7IGZpbHRlcnM6IHJlc29sdmVkRmlsdGVycyB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICBvcHRpb25zLnNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IGhpdHM6IFNlYXJjaEhpdFtdID0gcmVzcG9uc2UucmVzdWx0c1xuICAgICAgICAubWFwKChyZXN1bHQsIHJlc3VsdEluZGV4KSA9PiAoe1xuICAgICAgICAgIGlkOiBoaXRJZChyZXN1bHQuZGF0YSwga25vd24/LnByaW1hcnlLZXksIHJlc3VsdEluZGV4KSxcbiAgICAgICAgICBzY29yZTogcmVzdWx0LnNjb3JlLFxuICAgICAgICAgIGZpZWxkczogcmVzdWx0LmRhdGEsXG4gICAgICAgIH0pKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChoaXQpID0+IG9wdGlvbnMuc2NvcmVUaHJlc2hvbGQgPT09IHVuZGVmaW5lZCB8fCBoaXQuc2NvcmUgPj0gb3B0aW9ucy5zY29yZVRocmVzaG9sZCxcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiB7IHF1ZXJ5LCBpbmRleCwgaGl0cywgY291bnQ6IGhpdHMubGVuZ3RoIH07XG4gICAgfSxcbiAgfTtcbiAgY29uc3QgYWRkRG9jdW1lbnRzID0gcHJvdmlkZXIuYWRkRG9jdW1lbnRzPy5iaW5kKHByb3ZpZGVyKTtcbiAgaWYgKCFhZGREb2N1bWVudHMpIHJldHVybiBiYWNrZW5kO1xuICByZXR1cm4ge1xuICAgIC4uLmJhY2tlbmQsXG4gICAgYXN5bmMgYWRkRG9jdW1lbnRzKFxuICAgICAgaW5kZXg6IHN0cmluZyxcbiAgICAgIGRvY3VtZW50czogU2VhcmNoRG9jdW1lbnRbXSxcbiAgICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICAgICk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PiB7XG4gICAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhZGREb2N1bWVudHMoYWxpYXNGb3IoaW5kZXgsIGNvbmZpZyksIGRvY3VtZW50cyk7XG4gICAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG59XG4iXX0=
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU1yRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxFQU1MLG1CQUFtQixHQUNwQixNQUFNLDBCQUEwQixDQUFDO0FBRWxDLE9BQU8sRUFBRSxjQUFjLEVBQTZCLE1BQU0sYUFBYSxDQUFDO0FBU3hFLFNBQVMsT0FBTyxDQUFDLEtBQThCO0lBQzdDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0IsTUFBTSxNQUFNLEdBQXdCLEVBQUUsQ0FBQztJQUN2QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2hELElBQ0UsT0FBTyxJQUFJLEtBQUssUUFBUTtZQUN4QixPQUFPLElBQUksS0FBSyxRQUFRO1lBQ3hCLE9BQU8sSUFBSSxLQUFLLFNBQVM7WUFDekIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLEVBQ2hGLENBQUM7WUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ25CLFNBQVM7UUFDWCxDQUFDO1FBQ0QsTUFBTSxJQUFJLGVBQWUsQ0FDdkIscUJBQXFCLEdBQUcsNkRBQTZELENBQ3RGLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsS0FBSyxDQUNaLElB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Q0FBQztLQUNGLENBQUM7SUFDRixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzRCxJQUFJLENBQUMsWUFBWTtRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQ2xDLE9BQU87UUFDTCxHQUFHLE9BQU87UUFDVixLQUFLLENBQUMsWUFBWSxDQUNoQixLQUFhLEVBQ2IsU0FBMkIsRUFDM0IsTUFBb0I7WUFFcEIsTUFBTSxFQUFFLGNBQWMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDdEUsTUFBTSxFQUFFLGNBQWMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWRhcHRlciBmcm9tIEFwcEtpdCdzIG5hdGl2ZSBBSSBTZWFyY2ggcHJvdmlkZXIgdG8gdGhlIGRieC10b29scyBleHRlbnNpb25cbiAqIGNvbnRyYWN0IHVzZWQgYnkgZmVkZXJhdGVkIHNlYXJjaCBhbmQgYWdlbnQgdG9vbHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHtcbiAgU2VhcmNoRmlsdGVycyBhcyBBcHBLaXRTZWFyY2hGaWx0ZXJzLFxuICBTZWFyY2hSZXF1ZXN0IGFzIEFwcEtpdFNlYXJjaFJlcXVlc3QsXG4gIFNlYXJjaFJlc3BvbnNlIGFzIEFwcEtpdFNlYXJjaFJlc3BvbnNlLFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0L2JldGFcIjtcbmltcG9ydCB7IHRyaW1Ub051bGwgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBTZWFyY2hEb2N1bWVudCxcbiAgdHlwZSBTZWFyY2hIaXQsXG4gIHR5cGUgU2VhcmNoUmVxdWVzdCxcbiAgdHlwZSBTZWFyY2hSZXN1bHQsXG4gIHR5cGUgVXBzZXJ0UmVzdWx0LFxuICB0b0FpU2VhcmNoUXVlcnlUeXBlLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaE9wdGlvbnMsIFNlYXJjaFJlYWRCYWNrZW5kIH0gZnJvbSBcIi4vY2xpZW50LnRzXCI7XG5pbXBvcnQgeyBpbmRleENvbmZpZ0ZvciwgdHlwZSBSZXNvbHZlZFNlYXJjaENvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuXG4vKiogTWluaW1hbCBxdWVyeSBzdXJmYWNlIGV4cG9zZWQgYnkgQXBwS2l0J3MgbmF0aXZlIGBhaVNlYXJjaGAgcGx1Z2luLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBaVNlYXJjaFByb3ZpZGVyIHtcbiAgcHJvdmlkZXJLaW5kPzogXCJsYWtlYmFzZVwiO1xuICBxdWVyeShhbGlhczogc3RyaW5nLCByZXF1ZXN0OiBBcHBLaXRTZWFyY2hSZXF1ZXN0KTogUHJvbWlzZTxBcHBLaXRTZWFyY2hSZXNwb25zZT47XG4gIGFkZERvY3VtZW50cz8oYWxpYXM6IHN0cmluZywgZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+O1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJzKHZhbHVlOiBTZWFyY2hSZXF1ZXN0W1wiZmlsdGVyXCJdKTogQXBwS2l0U2VhcmNoRmlsdGVycyB8IHVuZGVmaW5lZCB7XG4gIGlmICghdmFsdWUpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc3VsdDogQXBwS2l0U2VhcmNoRmlsdGVycyA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIGl0ZW1dIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiIHx8XG4gICAgICB0eXBlb2YgaXRlbSA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIGl0ZW0gPT09IFwiYm9vbGVhblwiIHx8XG4gICAgICAoQXJyYXkuaXNBcnJheShpdGVtKSAmJlxuICAgICAgICBpdGVtLmV2ZXJ5KChlbnRyeSkgPT4gdHlwZW9mIGVudHJ5ID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBlbnRyeSA9PT0gXCJudW1iZXJcIikpXG4gICAgKSB7XG4gICAgICByZXN1bHRba2V5XSA9IGl0ZW07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBBSSBTZWFyY2ggZmlsdGVyIFwiJHtrZXl9XCIgbXVzdCBiZSBhIHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBvciBzdHJpbmcvbnVtYmVyIGFycmF5YCxcbiAgICApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGhpdElkKFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcHJpbWFyeUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBpbmRleDogbnVtYmVyLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgdmFsdWUgPSBkYXRhW3ByaW1hcnlLZXkgPz8gXCJpZFwiXSA/PyBPYmplY3QudmFsdWVzKGRhdGEpWzBdID8/IGluZGV4O1xuICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gYWxpYXNGb3IoaW5kZXg6IHN0cmluZywgY29uZmlnOiBSZXNvbHZlZFNlYXJjaENvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IGFsaWFzID0gaW5kZXhDb25maWdGb3IoY29uZmlnLCBpbmRleCk/LmFsaWFzID8/IHRyaW1Ub051bGwoaW5kZXgpO1xuICBpZiAoIWFsaWFzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiQUkgU2VhcmNoIHJlcXVpcmVzIGEgY29uZmlndXJlZCBpbmRleCBhbGlhc1wiKTtcbiAgcmV0dXJuIGFsaWFzO1xufVxuXG4vKiogQnVpbGQgYSByZWFkIGJhY2tlbmQgdGhhdCBkZWxlZ2F0ZXMgZXZlcnkgVmVjdG9yIFNlYXJjaCBxdWVyeSB0byBBcHBLaXQuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlQWlTZWFyY2hCYWNrZW5kKFxuICBwcm92aWRlcjogQWlTZWFyY2hQcm92aWRlcixcbiAgY29uZmlnOiBSZXNvbHZlZFNlYXJjaENvbmZpZyxcbik6IFNlYXJjaFJlYWRCYWNrZW5kIHtcbiAgY29uc3QgYmFja2VuZDogU2VhcmNoUmVhZEJhY2tlbmQgPSB7XG4gICAgc3VwcG9ydHNMaWZlY3ljbGU6IHByb3ZpZGVyLnByb3ZpZGVyS2luZCAhPT0gXCJsYWtlYmFzZVwiLFxuICAgIGFzeW5jIHNlYXJjaChpbmRleDogc3RyaW5nLCBxdWVyeTogc3RyaW5nLCBvcHRpb25zOiBTZWFyY2hPcHRpb25zID0ge30pOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgICAgb3B0aW9ucy5zaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBjb25zdCBrbm93biA9IGluZGV4Q29uZmlnRm9yKGNvbmZpZywgaW5kZXgpO1xuICAgICAgY29uc3QgYWxpYXMgPSBhbGlhc0ZvcihpbmRleCwgY29uZmlnKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkUXVlcnlUeXBlID0gdG9BaVNlYXJjaFF1ZXJ5VHlwZShvcHRpb25zLm1vZGUpO1xuICAgICAgY29uc3QgcmVzb2x2ZWRGaWx0ZXJzID0gZmlsdGVycyhvcHRpb25zLmZpbHRlcik7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHByb3ZpZGVyLnF1ZXJ5KGFsaWFzLCB7XG4gICAgICAgIHF1ZXJ5VGV4dDogcXVlcnksXG4gICAgICAgIG51bVJlc3VsdHM6IG9wdGlvbnMubGltaXQgPz8gY29uZmlnLnBhZ2VTaXplLFxuICAgICAgICAuLi4ob3B0aW9ucy5jb2x1bW5zID8geyBjb2x1bW5zOiBbLi4ub3B0aW9ucy5jb2x1bW5zXSB9IDoge30pLFxuICAgICAgICAuLi4ocmVzb2x2ZWRRdWVyeVR5cGUgPyB7IHF1ZXJ5VHlwZTogcmVzb2x2ZWRRdWVyeVR5cGUgfSA6IHt9KSxcbiAgICAgICAgLi4uKHJlc29sdmVkRmlsdGVycyA/IHsgZmlsdGVyczogcmVzb2x2ZWRGaWx0ZXJzIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIG9wdGlvbnMuc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgaGl0czogU2VhcmNoSGl0W10gPSByZXNwb25zZS5yZXN1bHRzXG4gICAgICAgIC5tYXAoKHJlc3VsdCwgcmVzdWx0SW5kZXgpID0+ICh7XG4gICAgICAgICAgaWQ6IGhpdElkKHJlc3VsdC5kYXRhLCBrbm93bj8ucHJpbWFyeUtleSwgcmVzdWx0SW5kZXgpLFxuICAgICAgICAgIHNjb3JlOiByZXN1bHQuc2NvcmUsXG4gICAgICAgICAgZmllbGRzOiByZXN1bHQuZGF0YSxcbiAgICAgICAgfSkpXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGhpdCkgPT4gb3B0aW9ucy5zY29yZVRocmVzaG9sZCA9PT0gdW5kZWZpbmVkIHx8IGhpdC5zY29yZSA+PSBvcHRpb25zLnNjb3JlVGhyZXNob2xkLFxuICAgICAgICApO1xuICAgICAgcmV0dXJuIHsgcXVlcnksIGluZGV4LCBoaXRzLCBjb3VudDogaGl0cy5sZW5ndGggfTtcbiAgICB9LFxuICB9O1xuICBjb25zdCBhZGREb2N1bWVudHMgPSBwcm92aWRlci5hZGREb2N1bWVudHM/LmJpbmQocHJvdmlkZXIpO1xuICBpZiAoIWFkZERvY3VtZW50cykgcmV0dXJuIGJhY2tlbmQ7XG4gIHJldHVybiB7XG4gICAgLi4uYmFja2VuZCxcbiAgICBhc3luYyBhZGREb2N1bWVudHMoXG4gICAgICBpbmRleDogc3RyaW5nLFxuICAgICAgZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdLFxuICAgICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+IHtcbiAgICAgIHNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFkZERvY3VtZW50cyhhbGlhc0ZvcihpbmRleCwgY29uZmlnKSwgZG9jdW1lbnRzKTtcbiAgICAgIHNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
@@ -22,7 +22,7 @@
22
22
  import { type IAppRouter } from "@databricks/appkit";
23
23
  import { type ToolRegistry } from "@databricks/appkit/beta";
24
24
  import { ToolRegistryPlugin } from "@dbx-tools/appkit";
25
- import { searchSchemas } from "@dbx-tools/shared-search";
25
+ import { type SearchRequest, type UniversalSearchRequest, type CreateIndexRequest, type SyncIndexRequest } from "@dbx-tools/shared-search";
26
26
  import { type SearchPluginConfig } from "./config.ts";
27
27
  /**
28
28
  * AppKit extension plugin for agent tools, federated search, and optional
@@ -115,7 +115,7 @@ export declare class SearchPlugin extends ToolRegistryPlugin<SearchPluginConfig>
115
115
  clientConfig(): Record<string, unknown>;
116
116
  exports(): {
117
117
  /** Search one index (default when omitted). Runs as the current context user. */
118
- search: (request: searchSchemas.SearchRequest, signal?: AbortSignal) => Promise<{
118
+ search: (request: SearchRequest, signal?: AbortSignal) => Promise<{
119
119
  query: string;
120
120
  hits: {
121
121
  id: string;
@@ -127,7 +127,7 @@ export declare class SearchPlugin extends ToolRegistryPlugin<SearchPluginConfig>
127
127
  index?: string | undefined;
128
128
  }>;
129
129
  /** Search across every configured index and merge the hits. */
130
- universalSearch: (request: searchSchemas.UniversalSearchRequest, signal?: AbortSignal) => Promise<{
130
+ universalSearch: (request: UniversalSearchRequest, signal?: AbortSignal) => Promise<{
131
131
  query: string;
132
132
  hits: {
133
133
  id: string;
@@ -147,7 +147,7 @@ export declare class SearchPlugin extends ToolRegistryPlugin<SearchPluginConfig>
147
147
  count: number;
148
148
  }>;
149
149
  /** Create a Vector Search index (throws when writes are disabled). */
150
- createIndex: (request: searchSchemas.CreateIndexRequest, signal?: AbortSignal) => Promise<{
150
+ createIndex: (request: CreateIndexRequest, signal?: AbortSignal) => Promise<{
151
151
  name: string;
152
152
  columns: string[];
153
153
  ready: boolean;
@@ -157,7 +157,7 @@ export declare class SearchPlugin extends ToolRegistryPlugin<SearchPluginConfig>
157
157
  directAccess?: boolean | undefined;
158
158
  }>;
159
159
  /** Sync a Delta Sync index from its source table (throws when writes are disabled). */
160
- syncIndex: (request: searchSchemas.SyncIndexRequest, signal?: AbortSignal) => Promise<{
160
+ syncIndex: (request: SyncIndexRequest, signal?: AbortSignal) => Promise<{
161
161
  index: string;
162
162
  synced: boolean;
163
163
  }>;