@dbx-tools/search 0.9.5 → 0.9.6

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.
@@ -23,7 +23,7 @@
23
23
  * @module
24
24
  */
25
25
  import { ExecutionError } from "@databricks/appkit";
26
- import { log, object, string } from "@dbx-tools/shared-core";
26
+ import { log, object, stringUtils } from "@dbx-tools/shared-core";
27
27
  import { Pool } from "pg";
28
28
  const logger = log.logger("search/lakebase");
29
29
  /** The internal columns every search table carries, excluded from a hit's `fields`. */
@@ -50,7 +50,7 @@ const RESERVED_COLUMNS = new Set(["id", "search_text", "document", "search_vecto
50
50
  */
51
51
  export function toSearchTerms(query) {
52
52
  return [
53
- ...string.tokenizeWithOptions({ lowerCase: true, camelCase: false, distinct: true }, query),
53
+ ...stringUtils.tokenizeWithOptions({ lowerCase: true, camelCase: false, distinct: true }, query),
54
54
  ];
55
55
  }
56
56
  /**
@@ -127,7 +127,7 @@ export class LakebaseSearchBackend {
127
127
  * shaped identically to the Vector Search backend.
128
128
  */
129
129
  async search(index, query, options = {}) {
130
- const text = string.trimToEmpty(query);
130
+ const text = stringUtils.trimToEmpty(query);
131
131
  const table = this.tableFor(index);
132
132
  const limit = options.limit ?? 10;
133
133
  const pool = await this.getPool();
@@ -240,7 +240,7 @@ export class LakebaseSearchBackend {
240
240
  /** Upsert rows: the whole document as jsonb + a flattened text blob to index. */
241
241
  async upsert(pool, table, documents, textColumn, signal) {
242
242
  for (const doc of documents) {
243
- const id = string.trimToNull(String(doc.id ?? doc.ID ?? "")) ?? undefined;
243
+ const id = stringUtils.trimToNull(String(doc.id ?? doc.ID ?? "")) ?? undefined;
244
244
  if (id === undefined) {
245
245
  throw new ExecutionError("search (lakebase): a document is missing an `id`", {
246
246
  context: { operation: "addDocuments" },
@@ -255,7 +255,7 @@ export class LakebaseSearchBackend {
255
255
  }
256
256
  /** The text a row is indexed by: the text column first, then any other string field. */
257
257
  searchText(doc, textColumn) {
258
- const primary = string.trimToEmpty(String(doc[textColumn] ?? ""));
258
+ const primary = stringUtils.trimToEmpty(String(doc[textColumn] ?? ""));
259
259
  const rest = Object.entries(doc)
260
260
  .filter(([key, value]) => key !== textColumn && key !== "id" && typeof value === "string")
261
261
  .map(([, value]) => value);
@@ -301,7 +301,7 @@ export class LakebaseSearchBackend {
301
301
  /** A safe bare table name derived from an index reference. */
302
302
  bareName(reference) {
303
303
  const last = reference.split(".").filter(Boolean).pop() ?? reference;
304
- const slug = string.toSlug(last).replace(/-/g, "_");
304
+ const slug = stringUtils.toSlug(last).replace(/-/g, "_");
305
305
  return slug.length > 0 ? slug : "documents";
306
306
  }
307
307
  /** Quote a Postgres identifier. */
@@ -332,4 +332,4 @@ export class LakebaseSearchBackend {
332
332
  }
333
333
  }
334
334
  }
335
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFrZWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBUTdELE9BQU8sRUFBRSxJQUFJLEVBQW9DLE1BQU0sSUFBSSxDQUFDO0FBRTVELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUU3Qyx1RkFBdUY7QUFDdkYsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7QUFFckY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQWE7SUFDekMsT0FBTztRQUNMLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLENBQUM7S0FDNUYsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUF3QixFQUFFLFdBQXNCLEdBQUc7SUFDM0UsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBb0NEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxxQkFBcUI7SUFPYjtJQUNBO0lBRUE7SUFU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QztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDL0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBVyxFQUFFLENBQUM7UUFDdEMsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsTUFBTSxFQUFFLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsUUFBUTtnQkFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGFrZWJhc2UgKFBvc3RncmVzKSBmdWxsLXRleHQgcnVudGltZSBiZWhpbmQgYGxha2ViYXNlQWlTZWFyY2hgLiBJdCBwcm92aXNpb25zXG4gKiBhIHNpbmdsZSB0YWJsZSBwZXIgaW5kZXggYWxpYXMsIGluZGV4ZXMgYSBnZW5lcmF0ZWRcbiAqIGB0c3ZlY3RvcmAsIGFuZCBhbnN3ZXJzIHF1ZXJpZXMgd2l0aCBhIHByZWZpeCBgdG9fdHNxdWVyeWAgKyBgdHNfcmFua2AuXG4gKlxuICogUXVlcmllcyBhcmUgY29tcGlsZWQgcmF0aGVyIHRoYW4gcGFzc2VkIHRocm91Z2ggYHdlYnNlYXJjaF90b190c3F1ZXJ5YCxcbiAqIGJlY2F1c2UgYSBzZWFyY2ggYm94IG5lZWRzIHR3byB0aGluZ3MgdGhhdCBmdW5jdGlvbiBkb2VzIG5vdCBnaXZlOlxuICogcHVuY3R1YXRpb24taW5zZW5zaXRpdml0eSAoc28gYHN0b3JlLWludGVsbGlnZW5jZWAgbWF0Y2hlcyB0aGUgc2FtZSByb3dzIGFzXG4gKiBgc3RvcmUgaW50ZWxsaWdlbmNlYCkgYW5kIHByZWZpeCBtYXRjaGluZyAoc28gYGludGVsYCByZWFjaGVzXG4gKiBgaW50ZWxsaWdlbmNlYCkuIFNlZSB7QGxpbmsgdG9TZWFyY2hUZXJtc30gLyB7QGxpbmsgdG9Uc1F1ZXJ5fS5cbiAqXG4gKiBUaGUgd2hvbGUgcG9pbnQgaXMgcGFyaXR5OiB0aGlzIGJhY2tlbmQgcmV0dXJucyB0aGUgRVhBQ1Qgc2FtZVxuICogYEBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaGAgc2hhcGVzIChgU2VhcmNoUmVzdWx0YCAvIGBTZWFyY2hIaXRgIC9cbiAqIGBVcHNlcnRSZXN1bHRgKSBhcyB0aGUgVmVjdG9yIFNlYXJjaCBiYWNrZW5kLCBzbyB0aGUgY2xpZW50LCB0aGUgTWFzdHJhXG4gKiB0b29scywgdGhlIHJvdXRlcywgYW5kIHRoZSBSZWFjdCBzZWFyY2ggYm94IGNhbm5vdCB0ZWxsIHdoaWNoIG9uZSBhbnN3ZXJlZC5cbiAqIEEgaGl0J3MgYGlkYCBpcyB0aGUgcHJpbWFyeSBrZXksIGl0cyBgc2NvcmVgIGlzIHRoZSB0ZXh0LXJhbmssIGFuZCBgZmllbGRzYFxuICogaXMgdGhlIHN0b3JlZCBkb2N1bWVudCBtaW51cyB0aGUgaW50ZXJuYWwgY29sdW1ucy5cbiAqXG4gKiBTdGFuZGFsb25lIGNhbGxlcnMgY2FuIHN1cHBseSBhIGBQb29sQ29uZmlnYCBmYWN0b3J5IGFuZCBsZXQgdGhpcyBiYWNrZW5kIG93blxuICogdGhlIHJlc3VsdGluZyBwb29sLiBBcHBLaXQgaW50ZWdyYXRpb25zIGluc3RlYWQgc3VwcGx5IHRoZSBMYWtlYmFzZSBwbHVnaW4nc1xuICogbWFuYWdlZCBwb29sIGRpcmVjdGx5LCBwcmVzZXJ2aW5nIGl0cyByb3V0aW5nIGFuZCBjcmVkZW50aWFsIHJlZnJlc2guXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IEV4ZWN1dGlvbkVycm9yIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgbG9nLCBvYmplY3QsIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFNlYXJjaERvY3VtZW50LFxuICBTZWFyY2hIaXQsXG4gIFNlYXJjaFJlcXVlc3QsXG4gIFNlYXJjaFJlc3VsdCxcbiAgVXBzZXJ0UmVzdWx0LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQgeyBQb29sLCB0eXBlIFBvb2xDbGllbnQsIHR5cGUgUG9vbENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwic2VhcmNoL2xha2ViYXNlXCIpO1xuXG4vKiogVGhlIGludGVybmFsIGNvbHVtbnMgZXZlcnkgc2VhcmNoIHRhYmxlIGNhcnJpZXMsIGV4Y2x1ZGVkIGZyb20gYSBoaXQncyBgZmllbGRzYC4gKi9cbmNvbnN0IFJFU0VSVkVEX0NPTFVNTlMgPSBuZXcgU2V0KFtcImlkXCIsIFwic2VhcmNoX3RleHRcIiwgXCJkb2N1bWVudFwiLCBcInNlYXJjaF92ZWN0b3JcIl0pO1xuXG4vKipcbiAqIFNwbGl0IGEgc2VhcmNoLWJveCBzdHJpbmcgaW50byB0aGUgdGVybXMgYSB0c3F1ZXJ5IGlzIGJ1aWx0IGZyb20sIHVzaW5nIHRoZVxuICogc2hhcmVkIGBAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlYCB0b2tlbml6ZXIgc28gdGhlIHNwbGl0dGluZyBydWxlcyBzdGF5XG4gKiBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgdGhlIHRvb2xraXQuXG4gKlxuICogU3BsaXR0aW5nIG9uIHB1bmN0dWF0aW9uIGlzIHdoYXQgbWFrZXMgYHN0b3JlLWludGVsbGlnZW5jZWAgYmVoYXZlIGxpa2VcbiAqIGBzdG9yZSBpbnRlbGxpZ2VuY2VgLiBQb3N0Z3JlcyBpbmRleGVzIGEgaHlwaGVuYXRlZCB3b3JkIGFzIHRoZSBjb21wb3VuZFxuICogbGV4ZW1lIFBMVVMgZWFjaCBvZiBpdHMgcGFydHMsIGJ1dCBjb21waWxlcyBhIGh5cGhlbmF0ZWQgUVVFUlkgdG8gdGhlXG4gKiBjb21wb3VuZCBhbG9uZSAtIHNvIGBzdG9yZS1pbnRlbGxpZ2VuY2VgIGRlbWFuZHMgYSBgc3RvcmUtaW50ZWxsaWdgIGxleGVtZVxuICogdGhhdCBhIGRvY3VtZW50IHRpdGxlZCBgcmFjZXRyYWMtc3RvcmUtaW50ZWxsaWdlbmNlYCBkb2VzIG5vdCBoYXZlLCBhbmQgdGhlXG4gKiBzZWFyY2ggc2lsZW50bHkgcmV0dXJucyBub3RoaW5nIHdoaWxlIGBzdG9yZSBpbnRlbGxpZ2VuY2VgIHJldHVybnNcbiAqIGV2ZXJ5dGhpbmcuIFNhbWUgZm9yIGAuYCBhbmQgYF9gIGluIGEgdGFibGUgcmVmZXJlbmNlLlxuICpcbiAqIGBjYW1lbENhc2U6IGZhbHNlYCBpcyBsb2FkLWJlYXJpbmcgcmF0aGVyIHRoYW4gYSBkZWZhdWx0OiB0aGUgY2FtZWxDYXNlXG4gKiBzcGxpdHRlciBhbHNvIGJyZWFrcyBkaWdpdCBydW5zLCB0dXJuaW5nIGBncHQ0YCBpbnRvIGBncHRgICsgYDRgIGFuZCBgczNgXG4gKiBpbnRvIGBzYCArIGAzYC4gUG9zdGdyZXMgaW5kZXhlcyBlYWNoIG9mIHRob3NlIGFzIE9ORSBsZXhlbWUsIHNvIG5vIGxleGVtZVxuICogZXZlciBzdGFydHMgd2l0aCB0aGUgdHJhaWxpbmcgZGlnaXRzIGFuZCB0aGUgcHJlY2lzZSBwYXNzIGNvdWxkIG5vdCBtYXRjaFxuICogdGhlbS4gS2VlcGluZyBwdW5jdHVhdGlvbiBhcyB0aGUgb25seSBib3VuZGFyeSBtaXJyb3JzIGhvdyB0aGUgaW5kZXggd2FzXG4gKiBidWlsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvU2VhcmNoVGVybXMocXVlcnk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5zdHJpbmcudG9rZW5pemVXaXRoT3B0aW9ucyh7IGxvd2VyQ2FzZTogdHJ1ZSwgY2FtZWxDYXNlOiBmYWxzZSwgZGlzdGluY3Q6IHRydWUgfSwgcXVlcnkpLFxuICBdO1xufVxuXG4vKipcbiAqIENvbXBpbGUgdGVybXMgaW50byBhIGB0b190c3F1ZXJ5YCBpbnB1dCB3aGVyZSBldmVyeSB0ZXJtIGlzIGEgUFJFRklYLCBzbyBhXG4gKiBwYXJ0aWFsbHkgdHlwZWQgd29yZCBzdGlsbCBtYXRjaGVzIChgaW50ZWw6KmAgcmVhY2hlcyBgaW50ZWxsaWdlbmNlYCkuXG4gKlxuICogVGVybXMgY2Fycnkgb25seSBsZXR0ZXJzIGFuZCBkaWdpdHMgYnkgY29uc3RydWN0aW9uLCBzbyBub25lIG9mIHRzcXVlcnknc1xuICogb3BlcmF0b3JzIChgJiB8ICEgKCApIDogKmApIGNhbiBzdXJ2aXZlIGZyb20gdXNlciBpbnB1dCBpbnRvIHRoZSBjb21waWxlZFxuICogc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Uc1F1ZXJ5KHRlcm1zOiByZWFkb25seSBzdHJpbmdbXSwgb3BlcmF0b3I6IFwiJlwiIHwgXCJ8XCIgPSBcIiZcIik6IHN0cmluZyB7XG4gIHJldHVybiB0ZXJtcy5tYXAoKHRlcm0pID0+IGAke3Rlcm19OipgKS5qb2luKGAgJHtvcGVyYXRvcn0gYCk7XG59XG5cbi8qKiBPcHRpb25zIGZvciBhIHNpbmdsZS1pbmRleCBMYWtlYmFzZSBzZWFyY2ggKG1pcnJvcnMgdGhlIGNsaWVudCdzIGBTZWFyY2hPcHRpb25zYCkuICovXG5leHBvcnQgaW50ZXJmYWNlIExha2ViYXNlU2VhcmNoT3B0aW9ucyB7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBmaWx0ZXI/OiBTZWFyY2hSZXF1ZXN0W1wiZmlsdGVyXCJdO1xuICBzY29yZVRocmVzaG9sZD86IG51bWJlcjtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKiBPbmUgcmF3IHNlYXJjaCByb3cgYmVmb3JlIGl0IGlzIHNoYXBlZCBpbnRvIGEge0BsaW5rIFNlYXJjaEhpdH0uICovXG5pbnRlcmZhY2UgU2VhcmNoUm93IHtcbiAgaWQ6IHN0cmluZztcbiAgZG9jdW1lbnQ6IHVua25vd247XG4gIHNjb3JlOiBudW1iZXI7XG59XG5cbi8qKiBUaGUgbWFuYWdlZC1wb29sIHN1cmZhY2UgbmVlZGVkIGJ5IHRoZSBzZWFyY2ggYmFja2VuZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJhc2VTZWFyY2hQb29sIHtcbiAgY29ubmVjdCgpOiBQcm9taXNlPFBvb2xDbGllbnQ+O1xufVxuXG50eXBlIExha2ViYXNlUG9vbFNvdXJjZSA9XG4gIHwgKCgpID0+IFByb21pc2U8UG9vbENvbmZpZz4gfCBQb29sQ29uZmlnKVxuICB8IExha2ViYXNlU2VhcmNoUG9vbFxuICB8IHsgbWFuYWdlZFBvb2w6ICgpID0+IExha2ViYXNlU2VhcmNoUG9vbCB8IG51bGwgfCB1bmRlZmluZWQgfTtcblxuLyoqIE9wdGlvbnMgZm9yIHByb3Zpc2lvbmluZyBhIExha2ViYXNlLWJhY2tlZCBpbmRleC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJhc2VQcm92aXNpb25PcHRpb25zIHtcbiAgLyoqIFRleHQgY29sdW1uIGVtYmVkZGVkIGludG8gdGhlIHNlYXJjaCB2ZWN0b3IuIERlZmF1bHRzIHRvIGB0ZXh0YC4gKi9cbiAgdGV4dENvbHVtbj86IHN0cmluZztcbiAgLyoqIERvY3VtZW50cyB0byBzZWVkIHdoZW4gdGhlIHRhYmxlIGlzIGVtcHR5LiAqL1xuICBzZWVkPzogU2VhcmNoRG9jdW1lbnRbXTtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogQSBQb3N0Z3JlcyBmdWxsLXRleHQgYmFja2VuZC4gT25lIGluc3RhbmNlIGlzIHNoYXJlZCBhY3Jvc3MgaW5kZXhlczsgZWFjaFxuICogaW5kZXggbWFwcyB0byBhIHRhYmxlIHdob3NlIG5hbWUgaXMgZGVyaXZlZCBmcm9tIHRoZSBpbmRleCByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQge1xuICBwcml2YXRlIHBvb2w6IExha2ViYXNlU2VhcmNoUG9vbCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBwb29sUHJvbWlzZTogUHJvbWlzZTxMYWtlYmFzZVNlYXJjaFBvb2w+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG93bnNQb29sID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvdmlzaW9uZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvb2xTb3VyY2U6IExha2ViYXNlUG9vbFNvdXJjZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNjaGVtYSA9IFwicHVibGljXCIsXG4gICAgLyoqIEhvdyBhIHBvb2wgaXMgYnVpbHQgZnJvbSB0aGUgcmVzb2x2ZWQgY29uZmlnLiBPdmVycmlkYWJsZSBmb3IgdGVzdHMuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb29sRmFjdG9yeTogKGNvbmZpZzogUG9vbENvbmZpZykgPT4gUG9vbCA9IChjb25maWcpID0+IG5ldyBQb29sKGNvbmZpZyksXG4gICkge31cblxuICAvKiogTGF6aWx5IGJ1aWxkIChhbmQgY2FjaGUpIHRoZSBwZyBwb29sIGZyb20gdGhlIHJlc29sdmVkIExha2ViYXNlIGNvbmZpZy4gKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRQb29sKCk6IFByb21pc2U8TGFrZWJhc2VTZWFyY2hQb29sPiB7XG4gICAgaWYgKHRoaXMucG9vbCkgcmV0dXJuIHRoaXMucG9vbDtcbiAgICBpZiAoXCJtYW5hZ2VkUG9vbFwiIGluIHRoaXMucG9vbFNvdXJjZSkge1xuICAgICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCAyMDA7IGF0dGVtcHQgKz0gMSkge1xuICAgICAgICB0aGlzLnBvb2wgPSB0aGlzLnBvb2xTb3VyY2UubWFuYWdlZFBvb2woKSA/PyB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLnBvb2wpIHJldHVybiB0aGlzLnBvb2w7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwKSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2ggKGxha2ViYXNlKTogbWFuYWdlZCBwb29sIGRpZCBub3QgaW5pdGlhbGl6ZVwiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImNvbm5lY3RcIiB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5wb29sU291cmNlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMucG9vbCA9IHRoaXMucG9vbFNvdXJjZTtcbiAgICAgIHJldHVybiB0aGlzLnBvb2w7XG4gICAgfVxuICAgIGNvbnN0IHBnQ29uZmlnRmFjdG9yeSA9IHRoaXMucG9vbFNvdXJjZTtcbiAgICB0aGlzLnBvb2xQcm9taXNlID8/PSAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgcGdDb25maWdGYWN0b3J5KCk7XG4gICAgICBjb25zdCBwb29sID0gdGhpcy5wb29sRmFjdG9yeShjb25maWcpO1xuICAgICAgdGhpcy5wb29sID0gcG9vbDtcbiAgICAgIHRoaXMub3duc1Bvb2wgPSB0cnVlO1xuICAgICAgcmV0dXJuIHBvb2w7XG4gICAgfSkoKTtcbiAgICByZXR1cm4gdGhpcy5wb29sUHJvbWlzZTtcbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgcG9vbCBzbyBhIHJlc3RhcnRlZCBhcHAgcmVidWlsZHMgaXQuICovXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBvb2wgPSB0aGlzLnBvb2w7XG4gICAgdGhpcy5wb29sID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucG9vbFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5wcm92aXNpb25lZC5jbGVhcigpO1xuICAgIGlmIChwb29sICYmIHRoaXMub3duc1Bvb2wpIGF3YWl0IChwb29sIGFzIFBvb2wpLmVuZCgpO1xuICAgIHRoaXMub3duc1Bvb2wgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggYSBMYWtlYmFzZS1iYWNrZWQgaW5kZXguIFJldHVybnMgaGl0cyBzb3J0ZWQgbW9zdC1yZWxldmFudC1maXJzdCxcbiAgICogc2hhcGVkIGlkZW50aWNhbGx5IHRvIHRoZSBWZWN0b3IgU2VhcmNoIGJhY2tlbmQuXG4gICAqL1xuICBhc3luYyBzZWFyY2goXG4gICAgaW5kZXg6IHN0cmluZyxcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IExha2ViYXNlU2VhcmNoT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIGNvbnN0IHRleHQgPSBzdHJpbmcudHJpbVRvRW1wdHkocXVlcnkpO1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZUZvcihpbmRleCk7XG4gICAgY29uc3QgbGltaXQgPSBvcHRpb25zLmxpbWl0ID8/IDEwO1xuICAgIGNvbnN0IHBvb2wgPSBhd2FpdCB0aGlzLmdldFBvb2woKTtcbiAgICBjb25zdCB0ZXJtcyA9IHRvU2VhcmNoVGVybXModGV4dCk7XG5cbiAgICAvLyBBbiBlbXB0eSAob3IgcHVuY3R1YXRpb24tb25seSkgYm94IHJldHVybnMgcm93cyByYXRoZXIgdGhhbiBub3RoaW5nLCBzb1xuICAgIC8vIHRoZSBVSSBzaG93cyBjb250ZW50IGJlZm9yZSB0aGUgdXNlciB0eXBlcyAtIGFzIGEga2V5d29yZCBpbmRleCB3b3VsZC5cbiAgICBpZiAodGVybXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmZpbHRlckNsYXVzZShvcHRpb25zLmZpbHRlciwgMSk7XG4gICAgICBjb25zdCBsaW1pdFBvc2l0aW9uID0gZmlsdGVyLnBhcmFtcy5sZW5ndGggKyAxO1xuICAgICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLnF1ZXJ5PFNlYXJjaFJvdz4oXG4gICAgICAgIHBvb2wsXG4gICAgICAgIGBTRUxFQ1QgaWQsIGRvY3VtZW50LCAwOjpmbG9hdDQgQVMgc2NvcmVcbiAgICAgICAgICAgRlJPTSAke3RhYmxlfVxuICAgICAgICAgIFdIRVJFIFRSVUUke2ZpbHRlci5zcWx9XG4gICAgICAgICAgT1JERVIgQlkgaWRcbiAgICAgICAgICBMSU1JVCAkJHtsaW1pdFBvc2l0aW9ufWAsXG4gICAgICAgIFsuLi5maWx0ZXIucGFyYW1zLCBsaW1pdF0sXG4gICAgICAgIG9wdGlvbnMuc2lnbmFsLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLnRvUmVzdWx0KHRleHQsIGluZGV4LCByb3dzLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBQcmVjaXNlIHBhc3M6IGV2ZXJ5IHRlcm0gbXVzdCBtYXRjaCwgZWFjaCBhcyBhIHByZWZpeC5cbiAgICBjb25zdCBzdHJpY3RGaWx0ZXIgPSB0aGlzLmZpbHRlckNsYXVzZShvcHRpb25zLmZpbHRlciwgMik7XG4gICAgY29uc3Qgc3RyaWN0TGltaXRQb3NpdGlvbiA9IHN0cmljdEZpbHRlci5wYXJhbXMubGVuZ3RoICsgMjtcbiAgICBjb25zdCBzdHJpY3QgPSBhd2FpdCB0aGlzLnF1ZXJ5PFNlYXJjaFJvdz4oXG4gICAgICBwb29sLFxuICAgICAgYFNFTEVDVCBpZCwgZG9jdW1lbnQsIHRzX3Jhbmsoc2VhcmNoX3ZlY3RvciwgdG9fdHNxdWVyeSgnZW5nbGlzaCcsICQxKSkgQVMgc2NvcmVcbiAgICAgICAgIEZST00gJHt0YWJsZX1cbiAgICAgICAgV0hFUkUgc2VhcmNoX3ZlY3RvciBAQCB0b190c3F1ZXJ5KCdlbmdsaXNoJywgJDEpXG4gICAgICAgICAgJHtzdHJpY3RGaWx0ZXIuc3FsfVxuICAgICAgICBPUkRFUiBCWSBzY29yZSBERVNDXG4gICAgICAgIExJTUlUICQke3N0cmljdExpbWl0UG9zaXRpb259YCxcbiAgICAgIFt0b1RzUXVlcnkodGVybXMpLCAuLi5zdHJpY3RGaWx0ZXIucGFyYW1zLCBsaW1pdF0sXG4gICAgICBvcHRpb25zLnNpZ25hbCxcbiAgICApO1xuICAgIGlmIChzdHJpY3Qucm93cy5sZW5ndGggPiAwKSByZXR1cm4gdGhpcy50b1Jlc3VsdCh0ZXh0LCBpbmRleCwgc3RyaWN0LnJvd3MsIG9wdGlvbnMpO1xuXG4gICAgLy8gTm90aGluZyBtYXRjaGVkIEVWRVJZIHRlcm0sIHNvIHJlbGF4IHJhdGhlciB0aGFuIHJldHVybiBhbiBlbXB0eSBib3g6XG4gICAgLy8gYW55IG9uZSB0ZXJtIGlzIGVub3VnaCwgYW5kIGFuIGBJTElLRWAgcGFzcyBhZGRpdGlvbmFsbHkgY2F0Y2hlcyBhXG4gICAgLy8gZnJhZ21lbnQgdGhhdCBpcyBub3QgYSBwcmVmaXggKGB0ZWxsaWdlbmNlYCkgb3IgYSB0b2tlbiB0aGUgdGV4dC1zZWFyY2hcbiAgICAvLyBwYXJzZXIgc3BsaXQgZGlmZmVyZW50bHkgdGhhbiBleHBlY3RlZC4gU3Vic3RyaW5nIG1hdGNoaW5nIGNhbm5vdCB1c2VcbiAgICAvLyB0aGUgR0lOIGluZGV4LCB3aGljaCBpcyB3aHkgaXQgb25seSBydW5zIG9uY2UgdGhlIGluZGV4ZWQgcGFzcyBmYWlscy5cbiAgICBjb25zdCByZWxheGVkRmlsdGVyID0gdGhpcy5maWx0ZXJDbGF1c2Uob3B0aW9ucy5maWx0ZXIsIDMpO1xuICAgIGNvbnN0IHJlbGF4ZWRMaW1pdFBvc2l0aW9uID0gcmVsYXhlZEZpbHRlci5wYXJhbXMubGVuZ3RoICsgMztcbiAgICBjb25zdCByZWxheGVkID0gYXdhaXQgdGhpcy5xdWVyeTxTZWFyY2hSb3c+KFxuICAgICAgcG9vbCxcbiAgICAgIGBTRUxFQ1QgaWQsIGRvY3VtZW50LCB0c19yYW5rKHNlYXJjaF92ZWN0b3IsIHRvX3RzcXVlcnkoJ2VuZ2xpc2gnLCAkMSkpIEFTIHNjb3JlXG4gICAgICAgICBGUk9NICR7dGFibGV9XG4gICAgICAgIFdIRVJFIChzZWFyY2hfdmVjdG9yIEBAIHRvX3RzcXVlcnkoJ2VuZ2xpc2gnLCAkMSlcbiAgICAgICAgICAgT1Igc2VhcmNoX3RleHQgSUxJS0UgQU5ZKCQyOjp0ZXh0W10pKVxuICAgICAgICAgICR7cmVsYXhlZEZpbHRlci5zcWx9XG4gICAgICAgIE9SREVSIEJZIHNjb3JlIERFU0NcbiAgICAgICAgTElNSVQgJCR7cmVsYXhlZExpbWl0UG9zaXRpb259YCxcbiAgICAgIFt0b1RzUXVlcnkodGVybXMsIFwifFwiKSwgdGVybXMubWFwKCh0ZXJtKSA9PiBgJSR7dGVybX0lYCksIC4uLnJlbGF4ZWRGaWx0ZXIucGFyYW1zLCBsaW1pdF0sXG4gICAgICBvcHRpb25zLnNpZ25hbCxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnRvUmVzdWx0KHRleHQsIGluZGV4LCByZWxheGVkLnJvd3MsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIFNoYXBlIHJhdyByb3dzIGludG8gdGhlIGBTZWFyY2hSZXN1bHRgIGJvdGggYmFja2VuZHMgcmV0dXJuLiAqL1xuICBwcml2YXRlIHRvUmVzdWx0KFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgaW5kZXg6IHN0cmluZyxcbiAgICByb3dzOiBTZWFyY2hSb3dbXSxcbiAgICBvcHRpb25zOiBMYWtlYmFzZVNlYXJjaE9wdGlvbnMsXG4gICk6IFNlYXJjaFJlc3VsdCB7XG4gICAgY29uc3QgaGl0czogU2VhcmNoSGl0W10gPSByb3dzXG4gICAgICAubWFwKChyb3cpID0+ICh7XG4gICAgICAgIGlkOiBTdHJpbmcocm93LmlkKSxcbiAgICAgICAgc2NvcmU6IE51bWJlcihyb3cuc2NvcmUpIHx8IDAsXG4gICAgICAgIGZpZWxkczogdGhpcy50b0ZpZWxkcyhyb3cuZG9jdW1lbnQpLFxuICAgICAgfSkpXG4gICAgICAuZmlsdGVyKChoaXQpID0+IG9wdGlvbnMuc2NvcmVUaHJlc2hvbGQgPT09IHVuZGVmaW5lZCB8fCBoaXQuc2NvcmUgPj0gb3B0aW9ucy5zY29yZVRocmVzaG9sZCk7XG4gICAgcmV0dXJuIHsgcXVlcnksIGluZGV4LCBoaXRzLCBjb3VudDogaGl0cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgdGhlIHRhYmxlICsgZnVsbC10ZXh0IGluZGV4IGV4aXN0IGFuZCBzZWVkIGRvY3VtZW50cyB3aGVuIGVtcHR5LlxuICAgKiBJZGVtcG90ZW50LCBzbyBpdCBpcyBzYWZlIHRvIGNhbGwgb24gZXZlcnkgYm9vdC5cbiAgICovXG4gIGFzeW5jIHByb3Zpc2lvbihpbmRleDogc3RyaW5nLCBvcHRpb25zOiBMYWtlYmFzZVByb3Zpc2lvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlRm9yKGluZGV4KTtcbiAgICBjb25zdCBwb29sID0gYXdhaXQgdGhpcy5nZXRQb29sKCk7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVUYWJsZShwb29sLCB0YWJsZSwgb3B0aW9ucy5zaWduYWwpO1xuXG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLnF1ZXJ5PHsgY291bnQ6IHN0cmluZyB9PihcbiAgICAgIHBvb2wsXG4gICAgICBgU0VMRUNUIGNvdW50KCopOjp0ZXh0IEFTIGNvdW50IEZST00gJHt0YWJsZX1gLFxuICAgICAgW10sXG4gICAgICBvcHRpb25zLnNpZ25hbCxcbiAgICApO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gTnVtYmVyKHJvd3NbMF0/LmNvdW50ID8/IFwiMFwiKTtcbiAgICBjb25zdCBzZWVkID0gb3B0aW9ucy5zZWVkID8/IFtdO1xuICAgIGlmIChleGlzdGluZyA9PT0gMCAmJiBzZWVkLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMudXBzZXJ0KHBvb2wsIHRhYmxlLCBzZWVkLCBvcHRpb25zLnRleHRDb2x1bW4gPz8gXCJ0ZXh0XCIsIG9wdGlvbnMuc2lnbmFsKTtcbiAgICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtc2VlZGVkXCIsIHsgaW5kZXgsIHRhYmxlLCBjb3VudDogc2VlZC5sZW5ndGggfSk7XG4gICAgICByZXR1cm4gc2VlZC5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBleGlzdGluZztcbiAgfVxuXG4gIC8qKiBBZGQgb3IgdXBkYXRlIGRvY3VtZW50cyBieSBwcmltYXJ5IGtleS4gKi9cbiAgYXN5bmMgYWRkRG9jdW1lbnRzKFxuICAgIGluZGV4OiBzdHJpbmcsXG4gICAgZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdLFxuICAgIHRleHRDb2x1bW4gPSBcInRleHRcIixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+IHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVGb3IoaW5kZXgpO1xuICAgIGNvbnN0IHBvb2wgPSBhd2FpdCB0aGlzLmdldFBvb2woKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVRhYmxlKHBvb2wsIHRhYmxlLCBzaWduYWwpO1xuICAgIGF3YWl0IHRoaXMudXBzZXJ0KHBvb2wsIHRhYmxlLCBkb2N1bWVudHMsIHRleHRDb2x1bW4sIHNpZ25hbCk7XG4gICAgcmV0dXJuIHsgaW5kZXgsIGNvdW50OiBkb2N1bWVudHMubGVuZ3RoIH07XG4gIH1cblxuICAvKiogRGVsZXRlIGRvY3VtZW50cyBieSBwcmltYXJ5IGtleS4gKi9cbiAgYXN5bmMgZGVsZXRlRG9jdW1lbnRzKFxuICAgIGluZGV4OiBzdHJpbmcsXG4gICAgaWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZUZvcihpbmRleCk7XG4gICAgY29uc3QgcG9vbCA9IGF3YWl0IHRoaXMuZ2V0UG9vbCgpO1xuICAgIGF3YWl0IHRoaXMucXVlcnkocG9vbCwgYERFTEVURSBGUk9NICR7dGFibGV9IFdIRVJFIGlkID0gQU5ZKCQxKWAsIFtpZHMubWFwKFN0cmluZyldLCBzaWduYWwpO1xuICAgIHJldHVybiB7IGluZGV4LCBjb3VudDogaWRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqIENyZWF0ZSB0aGUgdGFibGUgKyBHSU4gaW5kZXggb25jZSBwZXIgdGFibGUgKG1lbW9pemVkIGFjcm9zcyBjYWxscykuICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlVGFibGUoXG4gICAgcG9vbDogTGFrZWJhc2VTZWFyY2hQb29sLFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnByb3Zpc2lvbmVkLmhhcyh0YWJsZSkpIHJldHVybjtcbiAgICAvLyBgZG9jdW1lbnRgIGhvbGRzIHRoZSB3aG9sZSByb3c7IGBzZWFyY2hfdGV4dGAgaXMgdGhlIGluZGV4ZWQgdGV4dDsgdGhlXG4gICAgLy8gZ2VuZXJhdGVkIGBzZWFyY2hfdmVjdG9yYCBrZWVwcyB0aGUgdHN2ZWN0b3IgaW4gbG9ja3N0ZXAgd2l0aCBpdCBzbyBhXG4gICAgLy8gd3JpdGUgbmV2ZXIgaGFzIHRvIGNvbXB1dGUgdGhlIHZlY3RvciBieSBoYW5kLlxuICAgIGF3YWl0IHRoaXMucXVlcnkocG9vbCwgYENSRUFURSBTQ0hFTUEgSUYgTk9UIEVYSVNUUyAke3RoaXMuaWRlbnQodGhpcy5zY2hlbWEpfWAsIFtdLCBzaWduYWwpO1xuICAgIGF3YWl0IHRoaXMucXVlcnkoXG4gICAgICBwb29sLFxuICAgICAgYENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICR7dGFibGV9IChcbiAgICAgICAgIGlkIHRleHQgUFJJTUFSWSBLRVksXG4gICAgICAgICBzZWFyY2hfdGV4dCB0ZXh0IE5PVCBOVUxMIERFRkFVTFQgJycsXG4gICAgICAgICBkb2N1bWVudCBqc29uYiBOT1QgTlVMTCBERUZBVUxUICd7fSc6Ompzb25iLFxuICAgICAgICAgc2VhcmNoX3ZlY3RvciB0c3ZlY3RvciBHRU5FUkFURUQgQUxXQVlTIEFTICh0b190c3ZlY3RvcignZW5nbGlzaCcsIHNlYXJjaF90ZXh0KSkgU1RPUkVEXG4gICAgICAgKWAsXG4gICAgICBbXSxcbiAgICAgIHNpZ25hbCxcbiAgICApO1xuICAgIGF3YWl0IHRoaXMucXVlcnkoXG4gICAgICBwb29sLFxuICAgICAgYEFMVEVSIFRBQkxFICR7dGFibGV9XG4gICAgICAgICBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgc2VhcmNoX3ZlY3RvciB0c3ZlY3RvclxuICAgICAgICAgR0VORVJBVEVEIEFMV0FZUyBBUyAodG9fdHN2ZWN0b3IoJ2VuZ2xpc2gnLCBzZWFyY2hfdGV4dCkpIFNUT1JFRGAsXG4gICAgICBbXSxcbiAgICAgIHNpZ25hbCxcbiAgICApO1xuICAgIGF3YWl0IHRoaXMucXVlcnkoXG4gICAgICBwb29sLFxuICAgICAgYENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTICR7dGhpcy5pZGVudChgJHt0aGlzLmJhcmVOYW1lKHRhYmxlKX1fZnRzYCl9XG4gICAgICAgICBPTiAke3RhYmxlfSBVU0lORyBnaW4gKHNlYXJjaF92ZWN0b3IpYCxcbiAgICAgIFtdLFxuICAgICAgc2lnbmFsLFxuICAgICk7XG4gICAgdGhpcy5wcm92aXNpb25lZC5hZGQodGFibGUpO1xuICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtY3JlYXRlZFwiLCB7IHRhYmxlIH0pO1xuICB9XG5cbiAgLyoqIFVwc2VydCByb3dzOiB0aGUgd2hvbGUgZG9jdW1lbnQgYXMganNvbmIgKyBhIGZsYXR0ZW5lZCB0ZXh0IGJsb2IgdG8gaW5kZXguICovXG4gIHByaXZhdGUgYXN5bmMgdXBzZXJ0KFxuICAgIHBvb2w6IExha2ViYXNlU2VhcmNoUG9vbCxcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGRvY3VtZW50czogU2VhcmNoRG9jdW1lbnRbXSxcbiAgICB0ZXh0Q29sdW1uOiBzdHJpbmcsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3VtZW50cykge1xuICAgICAgY29uc3QgaWQgPSBzdHJpbmcudHJpbVRvTnVsbChTdHJpbmcoZG9jLmlkID8/IGRvYy5JRCA/PyBcIlwiKSkgPz8gdW5kZWZpbmVkO1xuICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoIChsYWtlYmFzZSk6IGEgZG9jdW1lbnQgaXMgbWlzc2luZyBhbiBgaWRgXCIsIHtcbiAgICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJhZGREb2N1bWVudHNcIiB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLnNlYXJjaFRleHQoZG9jLCB0ZXh0Q29sdW1uKTtcbiAgICAgIGF3YWl0IHRoaXMucXVlcnkoXG4gICAgICAgIHBvb2wsXG4gICAgICAgIGBJTlNFUlQgSU5UTyAke3RhYmxlfSAoaWQsIHNlYXJjaF90ZXh0LCBkb2N1bWVudClcbiAgICAgICAgICAgVkFMVUVTICgkMSwgJDIsICQzOjpqc29uYilcbiAgICAgICAgIE9OIENPTkZMSUNUIChpZCkgRE8gVVBEQVRFXG4gICAgICAgICAgIFNFVCBzZWFyY2hfdGV4dCA9IEVYQ0xVREVELnNlYXJjaF90ZXh0LCBkb2N1bWVudCA9IEVYQ0xVREVELmRvY3VtZW50YCxcbiAgICAgICAgW2lkLCBzZWFyY2hUZXh0LCBKU09OLnN0cmluZ2lmeShkb2MpXSxcbiAgICAgICAgc2lnbmFsLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIHRleHQgYSByb3cgaXMgaW5kZXhlZCBieTogdGhlIHRleHQgY29sdW1uIGZpcnN0LCB0aGVuIGFueSBvdGhlciBzdHJpbmcgZmllbGQuICovXG4gIHByaXZhdGUgc2VhcmNoVGV4dChkb2M6IFNlYXJjaERvY3VtZW50LCB0ZXh0Q29sdW1uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByaW1hcnkgPSBzdHJpbmcudHJpbVRvRW1wdHkoU3RyaW5nKGRvY1t0ZXh0Q29sdW1uXSA/PyBcIlwiKSk7XG4gICAgY29uc3QgcmVzdCA9IE9iamVjdC5lbnRyaWVzKGRvYylcbiAgICAgIC5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4ga2V5ICE9PSB0ZXh0Q29sdW1uICYmIGtleSAhPT0gXCJpZFwiICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgIC5tYXAoKFssIHZhbHVlXSkgPT4gdmFsdWUgYXMgc3RyaW5nKTtcbiAgICByZXR1cm4gW3ByaW1hcnksIC4uLnJlc3RdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLyoqIEEgaGl0J3MgYGZpZWxkc2A6IHRoZSBzdG9yZWQgZG9jdW1lbnQgbWludXMgdGhlIHJlc2VydmVkL2ludGVybmFsIGtleXMuICovXG4gIHByaXZhdGUgdG9GaWVsZHMoZG9jdW1lbnQ6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgaWYgKCFvYmplY3QuaXNSZWNvcmQoZG9jdW1lbnQpKSByZXR1cm4ge307XG4gICAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRvY3VtZW50KSkge1xuICAgICAgaWYgKFJFU0VSVkVEX0NPTFVNTlMuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgZmllbGRzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkcztcbiAgfVxuXG4gIC8qKiBDb21waWxlIEFwcEtpdCBzY2FsYXIvYXJyYXkgZmlsdGVycyBhZ2FpbnN0IHRoZSBzdG9yZWQgSlNPTiBkb2N1bWVudC4gKi9cbiAgcHJpdmF0ZSBmaWx0ZXJDbGF1c2UoXG4gICAgZmlsdGVyOiBTZWFyY2hSZXF1ZXN0W1wiZmlsdGVyXCJdLFxuICAgIHN0YXJ0UG9zaXRpb246IG51bWJlcixcbiAgKTogeyBzcWw6IHN0cmluZzsgcGFyYW1zOiB1bmtub3duW10gfSB7XG4gICAgaWYgKCFmaWx0ZXIgfHwgT2JqZWN0LmtleXMoZmlsdGVyKS5sZW5ndGggPT09IDApIHJldHVybiB7IHNxbDogXCJcIiwgcGFyYW1zOiBbXSB9O1xuICAgIGNvbnN0IGNsYXVzZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcGFyYW1zOiB1bmtub3duW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmaWx0ZXIpKSB7XG4gICAgICBjb25zdCBrZXlQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb24gKyBwYXJhbXMubGVuZ3RoO1xuICAgICAgcGFyYW1zLnB1c2goa2V5KTtcbiAgICAgIGNvbnN0IHZhbHVlUG9zaXRpb24gPSBzdGFydFBvc2l0aW9uICsgcGFyYW1zLmxlbmd0aDtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBwYXJhbXMucHVzaCh2YWx1ZS5tYXAoU3RyaW5nKSk7XG4gICAgICAgIGNsYXVzZXMucHVzaChgZG9jdW1lbnQgLT4+ICQke2tleVBvc2l0aW9ufSA9IEFOWSgkJHt2YWx1ZVBvc2l0aW9ufTo6dGV4dFtdKWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1zLnB1c2goU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgIGNsYXVzZXMucHVzaChgZG9jdW1lbnQgLT4+ICQke2tleVBvc2l0aW9ufSA9ICQke3ZhbHVlUG9zaXRpb259YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHNxbDogYCBBTkQgJHtjbGF1c2VzLmpvaW4oXCIgQU5EIFwiKX1gLCBwYXJhbXMgfTtcbiAgfVxuXG4gIC8qKiBUaGUgZnVsbHktcXVhbGlmaWVkIHRhYmxlIG5hbWUgZm9yIGFuIGluZGV4IHJlZmVyZW5jZS4gKi9cbiAgcHJpdmF0ZSB0YWJsZUZvcihpbmRleDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5pZGVudCh0aGlzLnNjaGVtYSl9LiR7dGhpcy5pZGVudCh0aGlzLmJhcmVOYW1lKGluZGV4KSl9YDtcbiAgfVxuXG4gIC8qKiBBIHNhZmUgYmFyZSB0YWJsZSBuYW1lIGRlcml2ZWQgZnJvbSBhbiBpbmRleCByZWZlcmVuY2UuICovXG4gIHByaXZhdGUgYmFyZU5hbWUocmVmZXJlbmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhc3QgPSByZWZlcmVuY2Uuc3BsaXQoXCIuXCIpLmZpbHRlcihCb29sZWFuKS5wb3AoKSA/PyByZWZlcmVuY2U7XG4gICAgY29uc3Qgc2x1ZyA9IHN0cmluZy50b1NsdWcobGFzdCkucmVwbGFjZSgvLS9nLCBcIl9cIik7XG4gICAgcmV0dXJuIHNsdWcubGVuZ3RoID4gMCA/IHNsdWcgOiBcImRvY3VtZW50c1wiO1xuICB9XG5cbiAgLyoqIFF1b3RlIGEgUG9zdGdyZXMgaWRlbnRpZmllci4gKi9cbiAgcHJpdmF0ZSBpZGVudChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXCIke25hbWUucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cImA7XG4gIH1cblxuICAvKiogUnVuIG9uZSBxdWVyeSB1bmRlciBleHRlcm5hbCBjYW5jZWxsYXRpb24uICovXG4gIHByaXZhdGUgYXN5bmMgcXVlcnk8VD4oXG4gICAgcG9vbDogTGFrZWJhc2VTZWFyY2hQb29sLFxuICAgIHNxbDogc3RyaW5nLFxuICAgIHBhcmFtczogdW5rbm93bltdLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPHsgcm93czogVFtdIH0+IHtcbiAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBFeGVjdXRpb25FcnJvci5jYW5jZWxlZCgpO1xuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHBvb2wuY29ubmVjdCgpO1xuICAgIGxldCByZWxlYXNlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiB7XG4gICAgICBpZiAocmVsZWFzZWQpIHJldHVybjtcbiAgICAgIHJlbGVhc2VkID0gdHJ1ZTtcbiAgICAgIGNsaWVudC5yZWxlYXNlKHRydWUpO1xuICAgIH07XG4gICAgc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQucXVlcnkoc3FsLCBwYXJhbXMpO1xuICAgICAgcmV0dXJuIHsgcm93czogcmVzdWx0LnJvd3MgYXMgVFtdIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpO1xuICAgICAgaWYgKCFyZWxlYXNlZCkgY2xpZW50LnJlbGVhc2UoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
335
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFrZWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBUWxFLE9BQU8sRUFBRSxJQUFJLEVBQW9DLE1BQU0sSUFBSSxDQUFDO0FBRTVELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUU3Qyx1RkFBdUY7QUFDdkYsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7QUFFckY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQWE7SUFDekMsT0FBTztRQUNMLEdBQUcsV0FBVyxDQUFDLG1CQUFtQixDQUNoQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQ3JELEtBQUssQ0FDTjtLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBd0IsRUFBRSxXQUFzQixHQUFHO0lBQzNFLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQW9DRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8scUJBQXFCO0lBT2I7SUFDQTtJQUVBO0lB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QUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQy9DLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQVcsRUFBRSxDQUFDO1FBQ3RDLENBQUM7Z0JBQVMsQ0FBQztZQUNULE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLFFBQVE7Z0JBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExha2ViYXNlIChQb3N0Z3JlcykgZnVsbC10ZXh0IHJ1bnRpbWUgYmVoaW5kIGBsYWtlYmFzZUFpU2VhcmNoYC4gSXQgcHJvdmlzaW9uc1xuICogYSBzaW5nbGUgdGFibGUgcGVyIGluZGV4IGFsaWFzLCBpbmRleGVzIGEgZ2VuZXJhdGVkXG4gKiBgdHN2ZWN0b3JgLCBhbmQgYW5zd2VycyBxdWVyaWVzIHdpdGggYSBwcmVmaXggYHRvX3RzcXVlcnlgICsgYHRzX3JhbmtgLlxuICpcbiAqIFF1ZXJpZXMgYXJlIGNvbXBpbGVkIHJhdGhlciB0aGFuIHBhc3NlZCB0aHJvdWdoIGB3ZWJzZWFyY2hfdG9fdHNxdWVyeWAsXG4gKiBiZWNhdXNlIGEgc2VhcmNoIGJveCBuZWVkcyB0d28gdGhpbmdzIHRoYXQgZnVuY3Rpb24gZG9lcyBub3QgZ2l2ZTpcbiAqIHB1bmN0dWF0aW9uLWluc2Vuc2l0aXZpdHkgKHNvIGBzdG9yZS1pbnRlbGxpZ2VuY2VgIG1hdGNoZXMgdGhlIHNhbWUgcm93cyBhc1xuICogYHN0b3JlIGludGVsbGlnZW5jZWApIGFuZCBwcmVmaXggbWF0Y2hpbmcgKHNvIGBpbnRlbGAgcmVhY2hlc1xuICogYGludGVsbGlnZW5jZWApLiBTZWUge0BsaW5rIHRvU2VhcmNoVGVybXN9IC8ge0BsaW5rIHRvVHNRdWVyeX0uXG4gKlxuICogVGhlIHdob2xlIHBvaW50IGlzIHBhcml0eTogdGhpcyBiYWNrZW5kIHJldHVybnMgdGhlIEVYQUNUIHNhbWVcbiAqIGBAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hgIHNoYXBlcyAoYFNlYXJjaFJlc3VsdGAgLyBgU2VhcmNoSGl0YCAvXG4gKiBgVXBzZXJ0UmVzdWx0YCkgYXMgdGhlIFZlY3RvciBTZWFyY2ggYmFja2VuZCwgc28gdGhlIGNsaWVudCwgdGhlIE1hc3RyYVxuICogdG9vbHMsIHRoZSByb3V0ZXMsIGFuZCB0aGUgUmVhY3Qgc2VhcmNoIGJveCBjYW5ub3QgdGVsbCB3aGljaCBvbmUgYW5zd2VyZWQuXG4gKiBBIGhpdCdzIGBpZGAgaXMgdGhlIHByaW1hcnkga2V5LCBpdHMgYHNjb3JlYCBpcyB0aGUgdGV4dC1yYW5rLCBhbmQgYGZpZWxkc2BcbiAqIGlzIHRoZSBzdG9yZWQgZG9jdW1lbnQgbWludXMgdGhlIGludGVybmFsIGNvbHVtbnMuXG4gKlxuICogU3RhbmRhbG9uZSBjYWxsZXJzIGNhbiBzdXBwbHkgYSBgUG9vbENvbmZpZ2AgZmFjdG9yeSBhbmQgbGV0IHRoaXMgYmFja2VuZCBvd25cbiAqIHRoZSByZXN1bHRpbmcgcG9vbC4gQXBwS2l0IGludGVncmF0aW9ucyBpbnN0ZWFkIHN1cHBseSB0aGUgTGFrZWJhc2UgcGx1Z2luJ3NcbiAqIG1hbmFnZWQgcG9vbCBkaXJlY3RseSwgcHJlc2VydmluZyBpdHMgcm91dGluZyBhbmQgY3JlZGVudGlhbCByZWZyZXNoLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBFeGVjdXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFNlYXJjaERvY3VtZW50LFxuICBTZWFyY2hIaXQsXG4gIFNlYXJjaFJlcXVlc3QsXG4gIFNlYXJjaFJlc3VsdCxcbiAgVXBzZXJ0UmVzdWx0LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQgeyBQb29sLCB0eXBlIFBvb2xDbGllbnQsIHR5cGUgUG9vbENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwic2VhcmNoL2xha2ViYXNlXCIpO1xuXG4vKiogVGhlIGludGVybmFsIGNvbHVtbnMgZXZlcnkgc2VhcmNoIHRhYmxlIGNhcnJpZXMsIGV4Y2x1ZGVkIGZyb20gYSBoaXQncyBgZmllbGRzYC4gKi9cbmNvbnN0IFJFU0VSVkVEX0NPTFVNTlMgPSBuZXcgU2V0KFtcImlkXCIsIFwic2VhcmNoX3RleHRcIiwgXCJkb2N1bWVudFwiLCBcInNlYXJjaF92ZWN0b3JcIl0pO1xuXG4vKipcbiAqIFNwbGl0IGEgc2VhcmNoLWJveCBzdHJpbmcgaW50byB0aGUgdGVybXMgYSB0c3F1ZXJ5IGlzIGJ1aWx0IGZyb20sIHVzaW5nIHRoZVxuICogc2hhcmVkIGBAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlYCB0b2tlbml6ZXIgc28gdGhlIHNwbGl0dGluZyBydWxlcyBzdGF5XG4gKiBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgdGhlIHRvb2xraXQuXG4gKlxuICogU3BsaXR0aW5nIG9uIHB1bmN0dWF0aW9uIGlzIHdoYXQgbWFrZXMgYHN0b3JlLWludGVsbGlnZW5jZWAgYmVoYXZlIGxpa2VcbiAqIGBzdG9yZSBpbnRlbGxpZ2VuY2VgLiBQb3N0Z3JlcyBpbmRleGVzIGEgaHlwaGVuYXRlZCB3b3JkIGFzIHRoZSBjb21wb3VuZFxuICogbGV4ZW1lIFBMVVMgZWFjaCBvZiBpdHMgcGFydHMsIGJ1dCBjb21waWxlcyBhIGh5cGhlbmF0ZWQgUVVFUlkgdG8gdGhlXG4gKiBjb21wb3VuZCBhbG9uZSAtIHNvIGBzdG9yZS1pbnRlbGxpZ2VuY2VgIGRlbWFuZHMgYSBgc3RvcmUtaW50ZWxsaWdgIGxleGVtZVxuICogdGhhdCBhIGRvY3VtZW50IHRpdGxlZCBgcmFjZXRyYWMtc3RvcmUtaW50ZWxsaWdlbmNlYCBkb2VzIG5vdCBoYXZlLCBhbmQgdGhlXG4gKiBzZWFyY2ggc2lsZW50bHkgcmV0dXJucyBub3RoaW5nIHdoaWxlIGBzdG9yZSBpbnRlbGxpZ2VuY2VgIHJldHVybnNcbiAqIGV2ZXJ5dGhpbmcuIFNhbWUgZm9yIGAuYCBhbmQgYF9gIGluIGEgdGFibGUgcmVmZXJlbmNlLlxuICpcbiAqIGBjYW1lbENhc2U6IGZhbHNlYCBpcyBsb2FkLWJlYXJpbmcgcmF0aGVyIHRoYW4gYSBkZWZhdWx0OiB0aGUgY2FtZWxDYXNlXG4gKiBzcGxpdHRlciBhbHNvIGJyZWFrcyBkaWdpdCBydW5zLCB0dXJuaW5nIGBncHQ0YCBpbnRvIGBncHRgICsgYDRgIGFuZCBgczNgXG4gKiBpbnRvIGBzYCArIGAzYC4gUG9zdGdyZXMgaW5kZXhlcyBlYWNoIG9mIHRob3NlIGFzIE9ORSBsZXhlbWUsIHNvIG5vIGxleGVtZVxuICogZXZlciBzdGFydHMgd2l0aCB0aGUgdHJhaWxpbmcgZGlnaXRzIGFuZCB0aGUgcHJlY2lzZSBwYXNzIGNvdWxkIG5vdCBtYXRjaFxuICogdGhlbS4gS2VlcGluZyBwdW5jdHVhdGlvbiBhcyB0aGUgb25seSBib3VuZGFyeSBtaXJyb3JzIGhvdyB0aGUgaW5kZXggd2FzXG4gKiBidWlsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvU2VhcmNoVGVybXMocXVlcnk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5zdHJpbmdVdGlscy50b2tlbml6ZVdpdGhPcHRpb25zKFxuICAgICAgeyBsb3dlckNhc2U6IHRydWUsIGNhbWVsQ2FzZTogZmFsc2UsIGRpc3RpbmN0OiB0cnVlIH0sXG4gICAgICBxdWVyeSxcbiAgICApLFxuICBdO1xufVxuXG4vKipcbiAqIENvbXBpbGUgdGVybXMgaW50byBhIGB0b190c3F1ZXJ5YCBpbnB1dCB3aGVyZSBldmVyeSB0ZXJtIGlzIGEgUFJFRklYLCBzbyBhXG4gKiBwYXJ0aWFsbHkgdHlwZWQgd29yZCBzdGlsbCBtYXRjaGVzIChgaW50ZWw6KmAgcmVhY2hlcyBgaW50ZWxsaWdlbmNlYCkuXG4gKlxuICogVGVybXMgY2Fycnkgb25seSBsZXR0ZXJzIGFuZCBkaWdpdHMgYnkgY29uc3RydWN0aW9uLCBzbyBub25lIG9mIHRzcXVlcnknc1xuICogb3BlcmF0b3JzIChgJiB8ICEgKCApIDogKmApIGNhbiBzdXJ2aXZlIGZyb20gdXNlciBpbnB1dCBpbnRvIHRoZSBjb21waWxlZFxuICogc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Uc1F1ZXJ5KHRlcm1zOiByZWFkb25seSBzdHJpbmdbXSwgb3BlcmF0b3I6IFwiJlwiIHwgXCJ8XCIgPSBcIiZcIik6IHN0cmluZyB7XG4gIHJldHVybiB0ZXJtcy5tYXAoKHRlcm0pID0+IGAke3Rlcm19OipgKS5qb2luKGAgJHtvcGVyYXRvcn0gYCk7XG59XG5cbi8qKiBPcHRpb25zIGZvciBhIHNpbmdsZS1pbmRleCBMYWtlYmFzZSBzZWFyY2ggKG1pcnJvcnMgdGhlIGNsaWVudCdzIGBTZWFyY2hPcHRpb25zYCkuICovXG5leHBvcnQgaW50ZXJmYWNlIExha2ViYXNlU2VhcmNoT3B0aW9ucyB7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBmaWx0ZXI/OiBTZWFyY2hSZXF1ZXN0W1wiZmlsdGVyXCJdO1xuICBzY29yZVRocmVzaG9sZD86IG51bWJlcjtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKiBPbmUgcmF3IHNlYXJjaCByb3cgYmVmb3JlIGl0IGlzIHNoYXBlZCBpbnRvIGEge0BsaW5rIFNlYXJjaEhpdH0uICovXG5pbnRlcmZhY2UgU2VhcmNoUm93IHtcbiAgaWQ6IHN0cmluZztcbiAgZG9jdW1lbnQ6IHVua25vd247XG4gIHNjb3JlOiBudW1iZXI7XG59XG5cbi8qKiBUaGUgbWFuYWdlZC1wb29sIHN1cmZhY2UgbmVlZGVkIGJ5IHRoZSBzZWFyY2ggYmFja2VuZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJhc2VTZWFyY2hQb29sIHtcbiAgY29ubmVjdCgpOiBQcm9taXNlPFBvb2xDbGllbnQ+O1xufVxuXG50eXBlIExha2ViYXNlUG9vbFNvdXJjZSA9XG4gIHwgKCgpID0+IFByb21pc2U8UG9vbENvbmZpZz4gfCBQb29sQ29uZmlnKVxuICB8IExha2ViYXNlU2VhcmNoUG9vbFxuICB8IHsgbWFuYWdlZFBvb2w6ICgpID0+IExha2ViYXNlU2VhcmNoUG9vbCB8IG51bGwgfCB1bmRlZmluZWQgfTtcblxuLyoqIE9wdGlvbnMgZm9yIHByb3Zpc2lvbmluZyBhIExha2ViYXNlLWJhY2tlZCBpbmRleC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJhc2VQcm92aXNpb25PcHRpb25zIHtcbiAgLyoqIFRleHQgY29sdW1uIGVtYmVkZGVkIGludG8gdGhlIHNlYXJjaCB2ZWN0b3IuIERlZmF1bHRzIHRvIGB0ZXh0YC4gKi9cbiAgdGV4dENvbHVtbj86IHN0cmluZztcbiAgLyoqIERvY3VtZW50cyB0byBzZWVkIHdoZW4gdGhlIHRhYmxlIGlzIGVtcHR5LiAqL1xuICBzZWVkPzogU2VhcmNoRG9jdW1lbnRbXTtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogQSBQb3N0Z3JlcyBmdWxsLXRleHQgYmFja2VuZC4gT25lIGluc3RhbmNlIGlzIHNoYXJlZCBhY3Jvc3MgaW5kZXhlczsgZWFjaFxuICogaW5kZXggbWFwcyB0byBhIHRhYmxlIHdob3NlIG5hbWUgaXMgZGVyaXZlZCBmcm9tIHRoZSBpbmRleCByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQge1xuICBwcml2YXRlIHBvb2w6IExha2ViYXNlU2VhcmNoUG9vbCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBwb29sUHJvbWlzZTogUHJvbWlzZTxMYWtlYmFzZVNlYXJjaFBvb2w+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG93bnNQb29sID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvdmlzaW9uZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvb2xTb3VyY2U6IExha2ViYXNlUG9vbFNvdXJjZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNjaGVtYSA9IFwicHVibGljXCIsXG4gICAgLyoqIEhvdyBhIHBvb2wgaXMgYnVpbHQgZnJvbSB0aGUgcmVzb2x2ZWQgY29uZmlnLiBPdmVycmlkYWJsZSBmb3IgdGVzdHMuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb29sRmFjdG9yeTogKGNvbmZpZzogUG9vbENvbmZpZykgPT4gUG9vbCA9IChjb25maWcpID0+IG5ldyBQb29sKGNvbmZpZyksXG4gICkge31cblxuICAvKiogTGF6aWx5IGJ1aWxkIChhbmQgY2FjaGUpIHRoZSBwZyBwb29sIGZyb20gdGhlIHJlc29sdmVkIExha2ViYXNlIGNvbmZpZy4gKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRQb29sKCk6IFByb21pc2U8TGFrZWJhc2VTZWFyY2hQb29sPiB7XG4gICAgaWYgKHRoaXMucG9vbCkgcmV0dXJuIHRoaXMucG9vbDtcbiAgICBpZiAoXCJtYW5hZ2VkUG9vbFwiIGluIHRoaXMucG9vbFNvdXJjZSkge1xuICAgICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCAyMDA7IGF0dGVtcHQgKz0gMSkge1xuICAgICAgICB0aGlzLnBvb2wgPSB0aGlzLnBvb2xTb3VyY2UubWFuYWdlZFBvb2woKSA/PyB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLnBvb2wpIHJldHVybiB0aGlzLnBvb2w7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwKSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2ggKGxha2ViYXNlKTogbWFuYWdlZCBwb29sIGRpZCBub3QgaW5pdGlhbGl6ZVwiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImNvbm5lY3RcIiB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5wb29sU291cmNlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMucG9vbCA9IHRoaXMucG9vbFNvdXJjZTtcbiAgICAgIHJldHVybiB0aGlzLnBvb2w7XG4gICAgfVxuICAgIGNvbnN0IHBnQ29uZmlnRmFjdG9yeSA9IHRoaXMucG9vbFNvdXJjZTtcbiAgICB0aGlzLnBvb2xQcm9taXNlID8/PSAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgcGdDb25maWdGYWN0b3J5KCk7XG4gICAgICBjb25zdCBwb29sID0gdGhpcy5wb29sRmFjdG9yeShjb25maWcpO1xuICAgICAgdGhpcy5wb29sID0gcG9vbDtcbiAgICAgIHRoaXMub3duc1Bvb2wgPSB0cnVlO1xuICAgICAgcmV0dXJuIHBvb2w7XG4gICAgfSkoKTtcbiAgICByZXR1cm4gdGhpcy5wb29sUHJvbWlzZTtcbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgcG9vbCBzbyBhIHJlc3RhcnRlZCBhcHAgcmVidWlsZHMgaXQuICovXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBvb2wgPSB0aGlzLnBvb2w7XG4gICAgdGhpcy5wb29sID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucG9vbFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5wcm92aXNpb25lZC5jbGVhcigpO1xuICAgIGlmIChwb29sICYmIHRoaXMub3duc1Bvb2wpIGF3YWl0IChwb29sIGFzIFBvb2wpLmVuZCgpO1xuICAgIHRoaXMub3duc1Bvb2wgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggYSBMYWtlYmFzZS1iYWNrZWQgaW5kZXguIFJldHVybnMgaGl0cyBzb3J0ZWQgbW9zdC1yZWxldmFudC1maXJzdCxcbiAgICogc2hhcGVkIGlkZW50aWNhbGx5IHRvIHRoZSBWZWN0b3IgU2VhcmNoIGJhY2tlbmQuXG4gICAqL1xuICBhc3luYyBzZWFyY2goXG4gICAgaW5kZXg6IHN0cmluZyxcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IExha2ViYXNlU2VhcmNoT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIGNvbnN0IHRleHQgPSBzdHJpbmdVdGlscy50cmltVG9FbXB0eShxdWVyeSk7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlRm9yKGluZGV4KTtcbiAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnMubGltaXQgPz8gMTA7XG4gICAgY29uc3QgcG9vbCA9IGF3YWl0IHRoaXMuZ2V0UG9vbCgpO1xuICAgIGNvbnN0IHRlcm1zID0gdG9TZWFyY2hUZXJtcyh0ZXh0KTtcblxuICAgIC8vIEFuIGVtcHR5IChvciBwdW5jdHVhdGlvbi1vbmx5KSBib3ggcmV0dXJucyByb3dzIHJhdGhlciB0aGFuIG5vdGhpbmcsIHNvXG4gICAgLy8gdGhlIFVJIHNob3dzIGNvbnRlbnQgYmVmb3JlIHRoZSB1c2VyIHR5cGVzIC0gYXMgYSBrZXl3b3JkIGluZGV4IHdvdWxkLlxuICAgIGlmICh0ZXJtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZmlsdGVyQ2xhdXNlKG9wdGlvbnMuZmlsdGVyLCAxKTtcbiAgICAgIGNvbnN0IGxpbWl0UG9zaXRpb24gPSBmaWx0ZXIucGFyYW1zLmxlbmd0aCArIDE7XG4gICAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMucXVlcnk8U2VhcmNoUm93PihcbiAgICAgICAgcG9vbCxcbiAgICAgICAgYFNFTEVDVCBpZCwgZG9jdW1lbnQsIDA6OmZsb2F0NCBBUyBzY29yZVxuICAgICAgICAgICBGUk9NICR7dGFibGV9XG4gICAgICAgICAgV0hFUkUgVFJVRSR7ZmlsdGVyLnNxbH1cbiAgICAgICAgICBPUkRFUiBCWSBpZFxuICAgICAgICAgIExJTUlUICQke2xpbWl0UG9zaXRpb259YCxcbiAgICAgICAgWy4uLmZpbHRlci5wYXJhbXMsIGxpbWl0XSxcbiAgICAgICAgb3B0aW9ucy5zaWduYWwsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMudG9SZXN1bHQodGV4dCwgaW5kZXgsIHJvd3MsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIFByZWNpc2UgcGFzczogZXZlcnkgdGVybSBtdXN0IG1hdGNoLCBlYWNoIGFzIGEgcHJlZml4LlxuICAgIGNvbnN0IHN0cmljdEZpbHRlciA9IHRoaXMuZmlsdGVyQ2xhdXNlKG9wdGlvbnMuZmlsdGVyLCAyKTtcbiAgICBjb25zdCBzdHJpY3RMaW1pdFBvc2l0aW9uID0gc3RyaWN0RmlsdGVyLnBhcmFtcy5sZW5ndGggKyAyO1xuICAgIGNvbnN0IHN0cmljdCA9IGF3YWl0IHRoaXMucXVlcnk8U2VhcmNoUm93PihcbiAgICAgIHBvb2wsXG4gICAgICBgU0VMRUNUIGlkLCBkb2N1bWVudCwgdHNfcmFuayhzZWFyY2hfdmVjdG9yLCB0b190c3F1ZXJ5KCdlbmdsaXNoJywgJDEpKSBBUyBzY29yZVxuICAgICAgICAgRlJPTSAke3RhYmxlfVxuICAgICAgICBXSEVSRSBzZWFyY2hfdmVjdG9yIEBAIHRvX3RzcXVlcnkoJ2VuZ2xpc2gnLCAkMSlcbiAgICAgICAgICAke3N0cmljdEZpbHRlci5zcWx9XG4gICAgICAgIE9SREVSIEJZIHNjb3JlIERFU0NcbiAgICAgICAgTElNSVQgJCR7c3RyaWN0TGltaXRQb3NpdGlvbn1gLFxuICAgICAgW3RvVHNRdWVyeSh0ZXJtcyksIC4uLnN0cmljdEZpbHRlci5wYXJhbXMsIGxpbWl0XSxcbiAgICAgIG9wdGlvbnMuc2lnbmFsLFxuICAgICk7XG4gICAgaWYgKHN0cmljdC5yb3dzLmxlbmd0aCA+IDApIHJldHVybiB0aGlzLnRvUmVzdWx0KHRleHQsIGluZGV4LCBzdHJpY3Qucm93cywgb3B0aW9ucyk7XG5cbiAgICAvLyBOb3RoaW5nIG1hdGNoZWQgRVZFUlkgdGVybSwgc28gcmVsYXggcmF0aGVyIHRoYW4gcmV0dXJuIGFuIGVtcHR5IGJveDpcbiAgICAvLyBhbnkgb25lIHRlcm0gaXMgZW5vdWdoLCBhbmQgYW4gYElMSUtFYCBwYXNzIGFkZGl0aW9uYWxseSBjYXRjaGVzIGFcbiAgICAvLyBmcmFnbWVudCB0aGF0IGlzIG5vdCBhIHByZWZpeCAoYHRlbGxpZ2VuY2VgKSBvciBhIHRva2VuIHRoZSB0ZXh0LXNlYXJjaFxuICAgIC8vIHBhcnNlciBzcGxpdCBkaWZmZXJlbnRseSB0aGFuIGV4cGVjdGVkLiBTdWJzdHJpbmcgbWF0Y2hpbmcgY2Fubm90IHVzZVxuICAgIC8vIHRoZSBHSU4gaW5kZXgsIHdoaWNoIGlzIHdoeSBpdCBvbmx5IHJ1bnMgb25jZSB0aGUgaW5kZXhlZCBwYXNzIGZhaWxzLlxuICAgIGNvbnN0IHJlbGF4ZWRGaWx0ZXIgPSB0aGlzLmZpbHRlckNsYXVzZShvcHRpb25zLmZpbHRlciwgMyk7XG4gICAgY29uc3QgcmVsYXhlZExpbWl0UG9zaXRpb24gPSByZWxheGVkRmlsdGVyLnBhcmFtcy5sZW5ndGggKyAzO1xuICAgIGNvbnN0IHJlbGF4ZWQgPSBhd2FpdCB0aGlzLnF1ZXJ5PFNlYXJjaFJvdz4oXG4gICAgICBwb29sLFxuICAgICAgYFNFTEVDVCBpZCwgZG9jdW1lbnQsIHRzX3Jhbmsoc2VhcmNoX3ZlY3RvciwgdG9fdHNxdWVyeSgnZW5nbGlzaCcsICQxKSkgQVMgc2NvcmVcbiAgICAgICAgIEZST00gJHt0YWJsZX1cbiAgICAgICAgV0hFUkUgKHNlYXJjaF92ZWN0b3IgQEAgdG9fdHNxdWVyeSgnZW5nbGlzaCcsICQxKVxuICAgICAgICAgICBPUiBzZWFyY2hfdGV4dCBJTElLRSBBTlkoJDI6OnRleHRbXSkpXG4gICAgICAgICAgJHtyZWxheGVkRmlsdGVyLnNxbH1cbiAgICAgICAgT1JERVIgQlkgc2NvcmUgREVTQ1xuICAgICAgICBMSU1JVCAkJHtyZWxheGVkTGltaXRQb3NpdGlvbn1gLFxuICAgICAgW3RvVHNRdWVyeSh0ZXJtcywgXCJ8XCIpLCB0ZXJtcy5tYXAoKHRlcm0pID0+IGAlJHt0ZXJtfSVgKSwgLi4ucmVsYXhlZEZpbHRlci5wYXJhbXMsIGxpbWl0XSxcbiAgICAgIG9wdGlvbnMuc2lnbmFsLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMudG9SZXN1bHQodGV4dCwgaW5kZXgsIHJlbGF4ZWQucm93cywgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogU2hhcGUgcmF3IHJvd3MgaW50byB0aGUgYFNlYXJjaFJlc3VsdGAgYm90aCBiYWNrZW5kcyByZXR1cm4uICovXG4gIHByaXZhdGUgdG9SZXN1bHQoXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBpbmRleDogc3RyaW5nLFxuICAgIHJvd3M6IFNlYXJjaFJvd1tdLFxuICAgIG9wdGlvbnM6IExha2ViYXNlU2VhcmNoT3B0aW9ucyxcbiAgKTogU2VhcmNoUmVzdWx0IHtcbiAgICBjb25zdCBoaXRzOiBTZWFyY2hIaXRbXSA9IHJvd3NcbiAgICAgIC5tYXAoKHJvdykgPT4gKHtcbiAgICAgICAgaWQ6IFN0cmluZyhyb3cuaWQpLFxuICAgICAgICBzY29yZTogTnVtYmVyKHJvdy5zY29yZSkgfHwgMCxcbiAgICAgICAgZmllbGRzOiB0aGlzLnRvRmllbGRzKHJvdy5kb2N1bWVudCksXG4gICAgICB9KSlcbiAgICAgIC5maWx0ZXIoKGhpdCkgPT4gb3B0aW9ucy5zY29yZVRocmVzaG9sZCA9PT0gdW5kZWZpbmVkIHx8IGhpdC5zY29yZSA+PSBvcHRpb25zLnNjb3JlVGhyZXNob2xkKTtcbiAgICByZXR1cm4geyBxdWVyeSwgaW5kZXgsIGhpdHMsIGNvdW50OiBoaXRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSB0aGUgdGFibGUgKyBmdWxsLXRleHQgaW5kZXggZXhpc3QgYW5kIHNlZWQgZG9jdW1lbnRzIHdoZW4gZW1wdHkuXG4gICAqIElkZW1wb3RlbnQsIHNvIGl0IGlzIHNhZmUgdG8gY2FsbCBvbiBldmVyeSBib290LlxuICAgKi9cbiAgYXN5bmMgcHJvdmlzaW9uKGluZGV4OiBzdHJpbmcsIG9wdGlvbnM6IExha2ViYXNlUHJvdmlzaW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVGb3IoaW5kZXgpO1xuICAgIGNvbnN0IHBvb2wgPSBhd2FpdCB0aGlzLmdldFBvb2woKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVRhYmxlKHBvb2wsIHRhYmxlLCBvcHRpb25zLnNpZ25hbCk7XG5cbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMucXVlcnk8eyBjb3VudDogc3RyaW5nIH0+KFxuICAgICAgcG9vbCxcbiAgICAgIGBTRUxFQ1QgY291bnQoKik6OnRleHQgQVMgY291bnQgRlJPTSAke3RhYmxlfWAsXG4gICAgICBbXSxcbiAgICAgIG9wdGlvbnMuc2lnbmFsLFxuICAgICk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBOdW1iZXIocm93c1swXT8uY291bnQgPz8gXCIwXCIpO1xuICAgIGNvbnN0IHNlZWQgPSBvcHRpb25zLnNlZWQgPz8gW107XG4gICAgaWYgKGV4aXN0aW5nID09PSAwICYmIHNlZWQubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy51cHNlcnQocG9vbCwgdGFibGUsIHNlZWQsIG9wdGlvbnMudGV4dENvbHVtbiA/PyBcInRleHRcIiwgb3B0aW9ucy5zaWduYWwpO1xuICAgICAgbG9nZ2VyLmluZm8oXCJpbmRleC1zZWVkZWRcIiwgeyBpbmRleCwgdGFibGUsIGNvdW50OiBzZWVkLmxlbmd0aCB9KTtcbiAgICAgIHJldHVybiBzZWVkLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGV4aXN0aW5nO1xuICB9XG5cbiAgLyoqIEFkZCBvciB1cGRhdGUgZG9jdW1lbnRzIGJ5IHByaW1hcnkga2V5LiAqL1xuICBhc3luYyBhZGREb2N1bWVudHMoXG4gICAgaW5kZXg6IHN0cmluZyxcbiAgICBkb2N1bWVudHM6IFNlYXJjaERvY3VtZW50W10sXG4gICAgdGV4dENvbHVtbiA9IFwidGV4dFwiLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZUZvcihpbmRleCk7XG4gICAgY29uc3QgcG9vbCA9IGF3YWl0IHRoaXMuZ2V0UG9vbCgpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlVGFibGUocG9vbCwgdGFibGUsIHNpZ25hbCk7XG4gICAgYXdhaXQgdGhpcy51cHNlcnQocG9vbCwgdGFibGUsIGRvY3VtZW50cywgdGV4dENvbHVtbiwgc2lnbmFsKTtcbiAgICByZXR1cm4geyBpbmRleCwgY291bnQ6IGRvY3VtZW50cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgZG9jdW1lbnRzIGJ5IHByaW1hcnkga2V5LiAqL1xuICBhc3luYyBkZWxldGVEb2N1bWVudHMoXG4gICAgaW5kZXg6IHN0cmluZyxcbiAgICBpZHM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PiB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlRm9yKGluZGV4KTtcbiAgICBjb25zdCBwb29sID0gYXdhaXQgdGhpcy5nZXRQb29sKCk7XG4gICAgYXdhaXQgdGhpcy5xdWVyeShwb29sLCBgREVMRVRFIEZST00gJHt0YWJsZX0gV0hFUkUgaWQgPSBBTlkoJDEpYCwgW2lkcy5tYXAoU3RyaW5nKV0sIHNpZ25hbCk7XG4gICAgcmV0dXJuIHsgaW5kZXgsIGNvdW50OiBpZHMubGVuZ3RoIH07XG4gIH1cblxuICAvKiogQ3JlYXRlIHRoZSB0YWJsZSArIEdJTiBpbmRleCBvbmNlIHBlciB0YWJsZSAobWVtb2l6ZWQgYWNyb3NzIGNhbGxzKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVUYWJsZShcbiAgICBwb29sOiBMYWtlYmFzZVNlYXJjaFBvb2wsXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMucHJvdmlzaW9uZWQuaGFzKHRhYmxlKSkgcmV0dXJuO1xuICAgIC8vIGBkb2N1bWVudGAgaG9sZHMgdGhlIHdob2xlIHJvdzsgYHNlYXJjaF90ZXh0YCBpcyB0aGUgaW5kZXhlZCB0ZXh0OyB0aGVcbiAgICAvLyBnZW5lcmF0ZWQgYHNlYXJjaF92ZWN0b3JgIGtlZXBzIHRoZSB0c3ZlY3RvciBpbiBsb2Nrc3RlcCB3aXRoIGl0IHNvIGFcbiAgICAvLyB3cml0ZSBuZXZlciBoYXMgdG8gY29tcHV0ZSB0aGUgdmVjdG9yIGJ5IGhhbmQuXG4gICAgYXdhaXQgdGhpcy5xdWVyeShwb29sLCBgQ1JFQVRFIFNDSEVNQSBJRiBOT1QgRVhJU1RTICR7dGhpcy5pZGVudCh0aGlzLnNjaGVtYSl9YCwgW10sIHNpZ25hbCk7XG4gICAgYXdhaXQgdGhpcy5xdWVyeShcbiAgICAgIHBvb2wsXG4gICAgICBgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJHt0YWJsZX0gKFxuICAgICAgICAgaWQgdGV4dCBQUklNQVJZIEtFWSxcbiAgICAgICAgIHNlYXJjaF90ZXh0IHRleHQgTk9UIE5VTEwgREVGQVVMVCAnJyxcbiAgICAgICAgIGRvY3VtZW50IGpzb25iIE5PVCBOVUxMIERFRkFVTFQgJ3t9Jzo6anNvbmIsXG4gICAgICAgICBzZWFyY2hfdmVjdG9yIHRzdmVjdG9yIEdFTkVSQVRFRCBBTFdBWVMgQVMgKHRvX3RzdmVjdG9yKCdlbmdsaXNoJywgc2VhcmNoX3RleHQpKSBTVE9SRURcbiAgICAgICApYCxcbiAgICAgIFtdLFxuICAgICAgc2lnbmFsLFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5xdWVyeShcbiAgICAgIHBvb2wsXG4gICAgICBgQUxURVIgVEFCTEUgJHt0YWJsZX1cbiAgICAgICAgIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBzZWFyY2hfdmVjdG9yIHRzdmVjdG9yXG4gICAgICAgICBHRU5FUkFURUQgQUxXQVlTIEFTICh0b190c3ZlY3RvcignZW5nbGlzaCcsIHNlYXJjaF90ZXh0KSkgU1RPUkVEYCxcbiAgICAgIFtdLFxuICAgICAgc2lnbmFsLFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5xdWVyeShcbiAgICAgIHBvb2wsXG4gICAgICBgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgJHt0aGlzLmlkZW50KGAke3RoaXMuYmFyZU5hbWUodGFibGUpfV9mdHNgKX1cbiAgICAgICAgIE9OICR7dGFibGV9IFVTSU5HIGdpbiAoc2VhcmNoX3ZlY3RvcilgLFxuICAgICAgW10sXG4gICAgICBzaWduYWwsXG4gICAgKTtcbiAgICB0aGlzLnByb3Zpc2lvbmVkLmFkZCh0YWJsZSk7XG4gICAgbG9nZ2VyLmluZm8oXCJpbmRleC1jcmVhdGVkXCIsIHsgdGFibGUgfSk7XG4gIH1cblxuICAvKiogVXBzZXJ0IHJvd3M6IHRoZSB3aG9sZSBkb2N1bWVudCBhcyBqc29uYiArIGEgZmxhdHRlbmVkIHRleHQgYmxvYiB0byBpbmRleC4gKi9cbiAgcHJpdmF0ZSBhc3luYyB1cHNlcnQoXG4gICAgcG9vbDogTGFrZWJhc2VTZWFyY2hQb29sLFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdLFxuICAgIHRleHRDb2x1bW46IHN0cmluZyxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jdW1lbnRzKSB7XG4gICAgICBjb25zdCBpZCA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoU3RyaW5nKGRvYy5pZCA/PyBkb2MuSUQgPz8gXCJcIikpID8/IHVuZGVmaW5lZDtcbiAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaCAobGFrZWJhc2UpOiBhIGRvY3VtZW50IGlzIG1pc3NpbmcgYW4gYGlkYFwiLCB7XG4gICAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwiYWRkRG9jdW1lbnRzXCIgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBzZWFyY2hUZXh0ID0gdGhpcy5zZWFyY2hUZXh0KGRvYywgdGV4dENvbHVtbik7XG4gICAgICBhd2FpdCB0aGlzLnF1ZXJ5KFxuICAgICAgICBwb29sLFxuICAgICAgICBgSU5TRVJUIElOVE8gJHt0YWJsZX0gKGlkLCBzZWFyY2hfdGV4dCwgZG9jdW1lbnQpXG4gICAgICAgICAgIFZBTFVFUyAoJDEsICQyLCAkMzo6anNvbmIpXG4gICAgICAgICBPTiBDT05GTElDVCAoaWQpIERPIFVQREFURVxuICAgICAgICAgICBTRVQgc2VhcmNoX3RleHQgPSBFWENMVURFRC5zZWFyY2hfdGV4dCwgZG9jdW1lbnQgPSBFWENMVURFRC5kb2N1bWVudGAsXG4gICAgICAgIFtpZCwgc2VhcmNoVGV4dCwgSlNPTi5zdHJpbmdpZnkoZG9jKV0sXG4gICAgICAgIHNpZ25hbCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSB0ZXh0IGEgcm93IGlzIGluZGV4ZWQgYnk6IHRoZSB0ZXh0IGNvbHVtbiBmaXJzdCwgdGhlbiBhbnkgb3RoZXIgc3RyaW5nIGZpZWxkLiAqL1xuICBwcml2YXRlIHNlYXJjaFRleHQoZG9jOiBTZWFyY2hEb2N1bWVudCwgdGV4dENvbHVtbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcmltYXJ5ID0gc3RyaW5nVXRpbHMudHJpbVRvRW1wdHkoU3RyaW5nKGRvY1t0ZXh0Q29sdW1uXSA/PyBcIlwiKSk7XG4gICAgY29uc3QgcmVzdCA9IE9iamVjdC5lbnRyaWVzKGRvYylcbiAgICAgIC5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4ga2V5ICE9PSB0ZXh0Q29sdW1uICYmIGtleSAhPT0gXCJpZFwiICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgIC5tYXAoKFssIHZhbHVlXSkgPT4gdmFsdWUgYXMgc3RyaW5nKTtcbiAgICByZXR1cm4gW3ByaW1hcnksIC4uLnJlc3RdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLyoqIEEgaGl0J3MgYGZpZWxkc2A6IHRoZSBzdG9yZWQgZG9jdW1lbnQgbWludXMgdGhlIHJlc2VydmVkL2ludGVybmFsIGtleXMuICovXG4gIHByaXZhdGUgdG9GaWVsZHMoZG9jdW1lbnQ6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgaWYgKCFvYmplY3QuaXNSZWNvcmQoZG9jdW1lbnQpKSByZXR1cm4ge307XG4gICAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRvY3VtZW50KSkge1xuICAgICAgaWYgKFJFU0VSVkVEX0NPTFVNTlMuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgZmllbGRzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkcztcbiAgfVxuXG4gIC8qKiBDb21waWxlIEFwcEtpdCBzY2FsYXIvYXJyYXkgZmlsdGVycyBhZ2FpbnN0IHRoZSBzdG9yZWQgSlNPTiBkb2N1bWVudC4gKi9cbiAgcHJpdmF0ZSBmaWx0ZXJDbGF1c2UoXG4gICAgZmlsdGVyOiBTZWFyY2hSZXF1ZXN0W1wiZmlsdGVyXCJdLFxuICAgIHN0YXJ0UG9zaXRpb246IG51bWJlcixcbiAgKTogeyBzcWw6IHN0cmluZzsgcGFyYW1zOiB1bmtub3duW10gfSB7XG4gICAgaWYgKCFmaWx0ZXIgfHwgT2JqZWN0LmtleXMoZmlsdGVyKS5sZW5ndGggPT09IDApIHJldHVybiB7IHNxbDogXCJcIiwgcGFyYW1zOiBbXSB9O1xuICAgIGNvbnN0IGNsYXVzZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcGFyYW1zOiB1bmtub3duW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmaWx0ZXIpKSB7XG4gICAgICBjb25zdCBrZXlQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb24gKyBwYXJhbXMubGVuZ3RoO1xuICAgICAgcGFyYW1zLnB1c2goa2V5KTtcbiAgICAgIGNvbnN0IHZhbHVlUG9zaXRpb24gPSBzdGFydFBvc2l0aW9uICsgcGFyYW1zLmxlbmd0aDtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBwYXJhbXMucHVzaCh2YWx1ZS5tYXAoU3RyaW5nKSk7XG4gICAgICAgIGNsYXVzZXMucHVzaChgZG9jdW1lbnQgLT4+ICQke2tleVBvc2l0aW9ufSA9IEFOWSgkJHt2YWx1ZVBvc2l0aW9ufTo6dGV4dFtdKWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1zLnB1c2goU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgIGNsYXVzZXMucHVzaChgZG9jdW1lbnQgLT4+ICQke2tleVBvc2l0aW9ufSA9ICQke3ZhbHVlUG9zaXRpb259YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHNxbDogYCBBTkQgJHtjbGF1c2VzLmpvaW4oXCIgQU5EIFwiKX1gLCBwYXJhbXMgfTtcbiAgfVxuXG4gIC8qKiBUaGUgZnVsbHktcXVhbGlmaWVkIHRhYmxlIG5hbWUgZm9yIGFuIGluZGV4IHJlZmVyZW5jZS4gKi9cbiAgcHJpdmF0ZSB0YWJsZUZvcihpbmRleDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5pZGVudCh0aGlzLnNjaGVtYSl9LiR7dGhpcy5pZGVudCh0aGlzLmJhcmVOYW1lKGluZGV4KSl9YDtcbiAgfVxuXG4gIC8qKiBBIHNhZmUgYmFyZSB0YWJsZSBuYW1lIGRlcml2ZWQgZnJvbSBhbiBpbmRleCByZWZlcmVuY2UuICovXG4gIHByaXZhdGUgYmFyZU5hbWUocmVmZXJlbmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhc3QgPSByZWZlcmVuY2Uuc3BsaXQoXCIuXCIpLmZpbHRlcihCb29sZWFuKS5wb3AoKSA/PyByZWZlcmVuY2U7XG4gICAgY29uc3Qgc2x1ZyA9IHN0cmluZ1V0aWxzLnRvU2x1ZyhsYXN0KS5yZXBsYWNlKC8tL2csIFwiX1wiKTtcbiAgICByZXR1cm4gc2x1Zy5sZW5ndGggPiAwID8gc2x1ZyA6IFwiZG9jdW1lbnRzXCI7XG4gIH1cblxuICAvKiogUXVvdGUgYSBQb3N0Z3JlcyBpZGVudGlmaWVyLiAqL1xuICBwcml2YXRlIGlkZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBcIiR7bmFtZS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYDtcbiAgfVxuXG4gIC8qKiBSdW4gb25lIHF1ZXJ5IHVuZGVyIGV4dGVybmFsIGNhbmNlbGxhdGlvbi4gKi9cbiAgcHJpdmF0ZSBhc3luYyBxdWVyeTxUPihcbiAgICBwb29sOiBMYWtlYmFzZVNlYXJjaFBvb2wsXG4gICAgc3FsOiBzdHJpbmcsXG4gICAgcGFyYW1zOiB1bmtub3duW10sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8eyByb3dzOiBUW10gfT4ge1xuICAgIGlmIChzaWduYWw/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 { string } from "@dbx-tools/shared-core";
9
- import { search as sharedSearch, } from "@dbx-tools/shared-search";
8
+ import { stringUtils } from "@dbx-tools/shared-core";
9
+ import { searchSchemas, } 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 ?? string.trimToNull(index);
33
+ const alias = indexConfigFor(config, index)?.alias ?? stringUtils.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 = sharedSearch.toAiSearchQueryType(options.mode);
46
+ const resolvedQueryType = searchSchemas.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU1yRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEQsT0FBTyxFQUNMLE1BQU0sSUFBSSxZQUFZLEdBTXZCLE1BQU0sMEJBQTBCLENBQUM7QUFFbEMsT0FBTyxFQUFFLGNBQWMsRUFBNkIsTUFBTSxhQUFhLENBQUM7QUFTeEUsU0FBUyxPQUFPLENBQUMsS0FBdUM7SUFDdEQsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM3QixNQUFNLE1BQU0sR0FBd0IsRUFBRSxDQUFDO0lBQ3ZDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEQsSUFDRSxPQUFPLElBQUksS0FBSyxRQUFRO1lBQ3hCLE9BQU8sSUFBSSxLQUFLLFFBQVE7WUFDeEIsT0FBTyxJQUFJLEtBQUssU0FBUztZQUN6QixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsRUFDaEYsQ0FBQztZQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDbkIsU0FBUztRQUNYLENBQUM7UUFDRCxNQUFNLElBQUksZUFBZSxDQUN2QixxQkFBcUIsR0FBRyw2REFBNkQsQ0FDdEYsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxLQUFL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SSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BELENBQUM7S0FDRixDQUFDO0lBQ0YsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0QsSUFBSSxDQUFDLFlBQVk7UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUNsQyxPQUFPO1FBQ0wsR0FBRyxPQUFPO1FBQ1YsS0FBSyxDQUFDLFlBQVksQ0FDaEIsS0FBYSxFQUNiLFNBQTJCLEVBQzNCLE1BQW9CO1lBRXBCLE1BQU0sRUFBRSxjQUFjLEVBQUUsQ0FBQztZQUN6QixNQUFNLE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sRUFBRSxjQUFjLEVBQUUsQ0FBQztZQUN6QixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFkYXB0ZXIgZnJvbSBBcHBLaXQncyBuYXRpdmUgQUkgU2VhcmNoIHByb3ZpZGVyIHRvIHRoZSBkYngtdG9vbHMgZXh0ZW5zaW9uXG4gKiBjb250cmFjdCB1c2VkIGJ5IGZlZGVyYXRlZCBzZWFyY2ggYW5kIGFnZW50IHRvb2xzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIFNlYXJjaEZpbHRlcnMgYXMgQXBwS2l0U2VhcmNoRmlsdGVycyxcbiAgU2VhcmNoUmVxdWVzdCBhcyBBcHBLaXRTZWFyY2hSZXF1ZXN0LFxuICBTZWFyY2hSZXNwb25zZSBhcyBBcHBLaXRTZWFyY2hSZXNwb25zZSxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgc2VhcmNoIGFzIHNoYXJlZFNlYXJjaCxcbiAgdHlwZSBTZWFyY2hEb2N1bWVudCxcbiAgdHlwZSBTZWFyY2hIaXQsXG4gIHR5cGUgU2VhcmNoUmVxdWVzdCBhcyBFeHRlbnNpb25TZWFyY2hSZXF1ZXN0LFxuICB0eXBlIFNlYXJjaFJlc3VsdCxcbiAgdHlwZSBVcHNlcnRSZXN1bHQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hcIjtcbmltcG9ydCB0eXBlIHsgU2VhcmNoT3B0aW9ucywgU2VhcmNoUmVhZEJhY2tlbmQgfSBmcm9tIFwiLi9jbGllbnQudHNcIjtcbmltcG9ydCB7IGluZGV4Q29uZmlnRm9yLCB0eXBlIFJlc29sdmVkU2VhcmNoQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5cbi8qKiBNaW5pbWFsIHF1ZXJ5IHN1cmZhY2UgZXhwb3NlZCBieSBBcHBLaXQncyBuYXRpdmUgYGFpU2VhcmNoYCBwbHVnaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIEFpU2VhcmNoUHJvdmlkZXIge1xuICBwcm92aWRlcktpbmQ/OiBcImxha2ViYXNlXCI7XG4gIHF1ZXJ5KGFsaWFzOiBzdHJpbmcsIHJlcXVlc3Q6IEFwcEtpdFNlYXJjaFJlcXVlc3QpOiBQcm9taXNlPEFwcEtpdFNlYXJjaFJlc3BvbnNlPjtcbiAgYWRkRG9jdW1lbnRzPyhhbGlhczogc3RyaW5nLCBkb2N1bWVudHM6IFNlYXJjaERvY3VtZW50W10pOiBQcm9taXNlPFVwc2VydFJlc3VsdD47XG59XG5cbmZ1bmN0aW9uIGZpbHRlcnModmFsdWU6IEV4dGVuc2lvblNlYXJjaFJlcXVlc3RbXCJmaWx0ZXJcIl0pOiBBcHBLaXRTZWFyY2hGaWx0ZXJzIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcmVzdWx0OiBBcHBLaXRTZWFyY2hGaWx0ZXJzID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgaXRlbV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIgfHxcbiAgICAgIHR5cGVvZiBpdGVtID09PSBcIm51bWJlclwiIHx8XG4gICAgICB0eXBlb2YgaXRlbSA9PT0gXCJib29sZWFuXCIgfHxcbiAgICAgIChBcnJheS5pc0FycmF5KGl0ZW0pICYmXG4gICAgICAgIGl0ZW0uZXZlcnkoKGVudHJ5KSA9PiB0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGVudHJ5ID09PSBcIm51bWJlclwiKSlcbiAgICApIHtcbiAgICAgIHJlc3VsdFtrZXldID0gaXRlbTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYEFJIFNlYXJjaCBmaWx0ZXIgXCIke2tleX1cIiBtdXN0IGJlIGEgc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG9yIHN0cmluZy9udW1iZXIgYXJyYXlgLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaGl0SWQoXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBwcmltYXJ5S2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGluZGV4OiBudW1iZXIsXG4pOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZSA9IGRhdGFbcHJpbWFyeUtleSA/PyBcImlkXCJdID8/IE9iamVjdC52YWx1ZXMoZGF0YSlbMF0gPz8gaW5kZXg7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBhbGlhc0ZvcihpbmRleDogc3RyaW5nLCBjb25maWc6IFJlc29sdmVkU2VhcmNoQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgYWxpYXMgPSBpbmRleENvbmZpZ0Zvcihjb25maWcsIGluZGV4KT8uYWxpYXMgPz8gc3RyaW5nLnRyaW1Ub051bGwoaW5kZXgpO1xuICBpZiAoIWFsaWFzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiQUkgU2VhcmNoIHJlcXVpcmVzIGEgY29uZmlndXJlZCBpbmRleCBhbGlhc1wiKTtcbiAgcmV0dXJuIGFsaWFzO1xufVxuXG4vKiogQnVpbGQgYSByZWFkIGJhY2tlbmQgdGhhdCBkZWxlZ2F0ZXMgZXZlcnkgVmVjdG9yIFNlYXJjaCBxdWVyeSB0byBBcHBLaXQuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlQWlTZWFyY2hCYWNrZW5kKFxuICBwcm92aWRlcjogQWlTZWFyY2hQcm92aWRlcixcbiAgY29uZmlnOiBSZXNvbHZlZFNlYXJjaENvbmZpZyxcbik6IFNlYXJjaFJlYWRCYWNrZW5kIHtcbiAgY29uc3QgYmFja2VuZDogU2VhcmNoUmVhZEJhY2tlbmQgPSB7XG4gICAgc3VwcG9ydHNMaWZlY3ljbGU6IHByb3ZpZGVyLnByb3ZpZGVyS2luZCAhPT0gXCJsYWtlYmFzZVwiLFxuICAgIGFzeW5jIHNlYXJjaChpbmRleDogc3RyaW5nLCBxdWVyeTogc3RyaW5nLCBvcHRpb25zOiBTZWFyY2hPcHRpb25zID0ge30pOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgICAgb3B0aW9ucy5zaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBjb25zdCBrbm93biA9IGluZGV4Q29uZmlnRm9yKGNvbmZpZywgaW5kZXgpO1xuICAgICAgY29uc3QgYWxpYXMgPSBhbGlhc0ZvcihpbmRleCwgY29uZmlnKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkUXVlcnlUeXBlID0gc2hhcmVkU2VhcmNoLnRvQWlTZWFyY2hRdWVyeVR5cGUob3B0aW9ucy5tb2RlKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkRmlsdGVycyA9IGZpbHRlcnMob3B0aW9ucy5maWx0ZXIpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwcm92aWRlci5xdWVyeShhbGlhcywge1xuICAgICAgICBxdWVyeVRleHQ6IHF1ZXJ5LFxuICAgICAgICBudW1SZXN1bHRzOiBvcHRpb25zLmxpbWl0ID8/IGNvbmZpZy5wYWdlU2l6ZSxcbiAgICAgICAgLi4uKG9wdGlvbnMuY29sdW1ucyA/IHsgY29sdW1uczogWy4uLm9wdGlvbnMuY29sdW1uc10gfSA6IHt9KSxcbiAgICAgICAgLi4uKHJlc29sdmVkUXVlcnlUeXBlID8geyBxdWVyeVR5cGU6IHJlc29sdmVkUXVlcnlUeXBlIH0gOiB7fSksXG4gICAgICAgIC4uLihyZXNvbHZlZEZpbHRlcnMgPyB7IGZpbHRlcnM6IHJlc29sdmVkRmlsdGVycyB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICBvcHRpb25zLnNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IGhpdHM6IFNlYXJjaEhpdFtdID0gcmVzcG9uc2UucmVzdWx0c1xuICAgICAgICAubWFwKChyZXN1bHQsIHJlc3VsdEluZGV4KSA9PiAoe1xuICAgICAgICAgIGlkOiBoaXRJZChyZXN1bHQuZGF0YSwga25vd24/LnByaW1hcnlLZXksIHJlc3VsdEluZGV4KSxcbiAgICAgICAgICBzY29yZTogcmVzdWx0LnNjb3JlLFxuICAgICAgICAgIGZpZWxkczogcmVzdWx0LmRhdGEsXG4gICAgICAgIH0pKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChoaXQpID0+IG9wdGlvbnMuc2NvcmVUaHJlc2hvbGQgPT09IHVuZGVmaW5lZCB8fCBoaXQuc2NvcmUgPj0gb3B0aW9ucy5zY29yZVRocmVzaG9sZCxcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiB7IHF1ZXJ5LCBpbmRleCwgaGl0cywgY291bnQ6IGhpdHMubGVuZ3RoIH07XG4gICAgfSxcbiAgfTtcbiAgY29uc3QgYWRkRG9jdW1lbnRzID0gcHJvdmlkZXIuYWRkRG9jdW1lbnRzPy5iaW5kKHByb3ZpZGVyKTtcbiAgaWYgKCFhZGREb2N1bWVudHMpIHJldHVybiBiYWNrZW5kO1xuICByZXR1cm4ge1xuICAgIC4uLmJhY2tlbmQsXG4gICAgYXN5bmMgYWRkRG9jdW1lbnRzKFxuICAgICAgaW5kZXg6IHN0cmluZyxcbiAgICAgIGRvY3VtZW50czogU2VhcmNoRG9jdW1lbnRbXSxcbiAgICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICAgICk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PiB7XG4gICAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhZGREb2N1bWVudHMoYWxpYXNGb3IoaW5kZXgsIGNvbmZpZyksIGRvY3VtZW50cyk7XG4gICAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG59XG4iXX0=
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU1yRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUNMLGFBQWEsR0FNZCxNQUFNLDBCQUEwQixDQUFDO0FBRWxDLE9BQU8sRUFBRSxjQUFjLEVBQTZCLE1BQU0sYUFBYSxDQUFDO0FBU3hFLFNBQVMsT0FBTyxDQUFDLEtBQXVDO0lBQ3RELElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0IsTUFBTSxNQUFNLEdBQXdCLEVBQUUsQ0FBQztJQUN2QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2hELElBQ0UsT0FBTyxJQUFJLEtBQUssUUFBUTtZQUN4QixPQUFPLElBQUksS0FBSyxRQUFRO1lBQ3hCLE9BQU8sSUFBSSxLQUFLLFNBQVM7WUFDekIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLEVBQ2hGLENBQUM7WUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ25CLFNBQVM7UUFDWCxDQUFDO1FBQ0QsTUFBTSxJQUFJLGVBQWUsQ0FDdkIscUJBQXFCLEdBQUcsNkRBQTZELENBQ3RGLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsS0FBSyxDQUNaLElBQTZC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LEVBQUUsQ0FBQztRQUNwRCxDQUFDO0tBQ0YsQ0FBQztJQUNGLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNELElBQUksQ0FBQyxZQUFZO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDbEMsT0FBTztRQUNMLEdBQUcsT0FBTztRQUNWLEtBQUssQ0FBQyxZQUFZLENBQ2hCLEtBQWEsRUFDYixTQUEyQixFQUMzQixNQUFvQjtZQUVwQixNQUFNLEVBQUUsY0FBYyxFQUFFLENBQUM7WUFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN0RSxNQUFNLEVBQUUsY0FBYyxFQUFFLENBQUM7WUFDekIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBZGFwdGVyIGZyb20gQXBwS2l0J3MgbmF0aXZlIEFJIFNlYXJjaCBwcm92aWRlciB0byB0aGUgZGJ4LXRvb2xzIGV4dGVuc2lvblxuICogY29udHJhY3QgdXNlZCBieSBmZWRlcmF0ZWQgc2VhcmNoIGFuZCBhZ2VudCB0b29scy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUge1xuICBTZWFyY2hGaWx0ZXJzIGFzIEFwcEtpdFNlYXJjaEZpbHRlcnMsXG4gIFNlYXJjaFJlcXVlc3QgYXMgQXBwS2l0U2VhcmNoUmVxdWVzdCxcbiAgU2VhcmNoUmVzcG9uc2UgYXMgQXBwS2l0U2VhcmNoUmVzcG9uc2UsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuaW1wb3J0IHsgc3RyaW5nVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgc2VhcmNoU2NoZW1hcyxcbiAgdHlwZSBTZWFyY2hEb2N1bWVudCxcbiAgdHlwZSBTZWFyY2hIaXQsXG4gIHR5cGUgU2VhcmNoUmVxdWVzdCBhcyBFeHRlbnNpb25TZWFyY2hSZXF1ZXN0LFxuICB0eXBlIFNlYXJjaFJlc3VsdCxcbiAgdHlwZSBVcHNlcnRSZXN1bHQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hcIjtcbmltcG9ydCB0eXBlIHsgU2VhcmNoT3B0aW9ucywgU2VhcmNoUmVhZEJhY2tlbmQgfSBmcm9tIFwiLi9jbGllbnQudHNcIjtcbmltcG9ydCB7IGluZGV4Q29uZmlnRm9yLCB0eXBlIFJlc29sdmVkU2VhcmNoQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5cbi8qKiBNaW5pbWFsIHF1ZXJ5IHN1cmZhY2UgZXhwb3NlZCBieSBBcHBLaXQncyBuYXRpdmUgYGFpU2VhcmNoYCBwbHVnaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIEFpU2VhcmNoUHJvdmlkZXIge1xuICBwcm92aWRlcktpbmQ/OiBcImxha2ViYXNlXCI7XG4gIHF1ZXJ5KGFsaWFzOiBzdHJpbmcsIHJlcXVlc3Q6IEFwcEtpdFNlYXJjaFJlcXVlc3QpOiBQcm9taXNlPEFwcEtpdFNlYXJjaFJlc3BvbnNlPjtcbiAgYWRkRG9jdW1lbnRzPyhhbGlhczogc3RyaW5nLCBkb2N1bWVudHM6IFNlYXJjaERvY3VtZW50W10pOiBQcm9taXNlPFVwc2VydFJlc3VsdD47XG59XG5cbmZ1bmN0aW9uIGZpbHRlcnModmFsdWU6IEV4dGVuc2lvblNlYXJjaFJlcXVlc3RbXCJmaWx0ZXJcIl0pOiBBcHBLaXRTZWFyY2hGaWx0ZXJzIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcmVzdWx0OiBBcHBLaXRTZWFyY2hGaWx0ZXJzID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgaXRlbV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIgfHxcbiAgICAgIHR5cGVvZiBpdGVtID09PSBcIm51bWJlclwiIHx8XG4gICAgICB0eXBlb2YgaXRlbSA9PT0gXCJib29sZWFuXCIgfHxcbiAgICAgIChBcnJheS5pc0FycmF5KGl0ZW0pICYmXG4gICAgICAgIGl0ZW0uZXZlcnkoKGVudHJ5KSA9PiB0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGVudHJ5ID09PSBcIm51bWJlclwiKSlcbiAgICApIHtcbiAgICAgIHJlc3VsdFtrZXldID0gaXRlbTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYEFJIFNlYXJjaCBmaWx0ZXIgXCIke2tleX1cIiBtdXN0IGJlIGEgc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG9yIHN0cmluZy9udW1iZXIgYXJyYXlgLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaGl0SWQoXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBwcmltYXJ5S2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGluZGV4OiBudW1iZXIsXG4pOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZSA9IGRhdGFbcHJpbWFyeUtleSA/PyBcImlkXCJdID8/IE9iamVjdC52YWx1ZXMoZGF0YSlbMF0gPz8gaW5kZXg7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBhbGlhc0ZvcihpbmRleDogc3RyaW5nLCBjb25maWc6IFJlc29sdmVkU2VhcmNoQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgYWxpYXMgPSBpbmRleENvbmZpZ0Zvcihjb25maWcsIGluZGV4KT8uYWxpYXMgPz8gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChpbmRleCk7XG4gIGlmICghYWxpYXMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJBSSBTZWFyY2ggcmVxdWlyZXMgYSBjb25maWd1cmVkIGluZGV4IGFsaWFzXCIpO1xuICByZXR1cm4gYWxpYXM7XG59XG5cbi8qKiBCdWlsZCBhIHJlYWQgYmFja2VuZCB0aGF0IGRlbGVnYXRlcyBldmVyeSBWZWN0b3IgU2VhcmNoIHF1ZXJ5IHRvIEFwcEtpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVBaVNlYXJjaEJhY2tlbmQoXG4gIHByb3ZpZGVyOiBBaVNlYXJjaFByb3ZpZGVyLFxuICBjb25maWc6IFJlc29sdmVkU2VhcmNoQ29uZmlnLFxuKTogU2VhcmNoUmVhZEJhY2tlbmQge1xuICBjb25zdCBiYWNrZW5kOiBTZWFyY2hSZWFkQmFja2VuZCA9IHtcbiAgICBzdXBwb3J0c0xpZmVjeWNsZTogcHJvdmlkZXIucHJvdmlkZXJLaW5kICE9PSBcImxha2ViYXNlXCIsXG4gICAgYXN5bmMgc2VhcmNoKGluZGV4OiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgICBvcHRpb25zLnNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IGtub3duID0gaW5kZXhDb25maWdGb3IoY29uZmlnLCBpbmRleCk7XG4gICAgICBjb25zdCBhbGlhcyA9IGFsaWFzRm9yKGluZGV4LCBjb25maWcpO1xuICAgICAgY29uc3QgcmVzb2x2ZWRRdWVyeVR5cGUgPSBzZWFyY2hTY2hlbWFzLnRvQWlTZWFyY2hRdWVyeVR5cGUob3B0aW9ucy5tb2RlKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkRmlsdGVycyA9IGZpbHRlcnMob3B0aW9ucy5maWx0ZXIpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwcm92aWRlci5xdWVyeShhbGlhcywge1xuICAgICAgICBxdWVyeVRleHQ6IHF1ZXJ5LFxuICAgICAgICBudW1SZXN1bHRzOiBvcHRpb25zLmxpbWl0ID8/IGNvbmZpZy5wYWdlU2l6ZSxcbiAgICAgICAgLi4uKG9wdGlvbnMuY29sdW1ucyA/IHsgY29sdW1uczogWy4uLm9wdGlvbnMuY29sdW1uc10gfSA6IHt9KSxcbiAgICAgICAgLi4uKHJlc29sdmVkUXVlcnlUeXBlID8geyBxdWVyeVR5cGU6IHJlc29sdmVkUXVlcnlUeXBlIH0gOiB7fSksXG4gICAgICAgIC4uLihyZXNvbHZlZEZpbHRlcnMgPyB7IGZpbHRlcnM6IHJlc29sdmVkRmlsdGVycyB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICBvcHRpb25zLnNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IGhpdHM6IFNlYXJjaEhpdFtdID0gcmVzcG9uc2UucmVzdWx0c1xuICAgICAgICAubWFwKChyZXN1bHQsIHJlc3VsdEluZGV4KSA9PiAoe1xuICAgICAgICAgIGlkOiBoaXRJZChyZXN1bHQuZGF0YSwga25vd24/LnByaW1hcnlLZXksIHJlc3VsdEluZGV4KSxcbiAgICAgICAgICBzY29yZTogcmVzdWx0LnNjb3JlLFxuICAgICAgICAgIGZpZWxkczogcmVzdWx0LmRhdGEsXG4gICAgICAgIH0pKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChoaXQpID0+IG9wdGlvbnMuc2NvcmVUaHJlc2hvbGQgPT09IHVuZGVmaW5lZCB8fCBoaXQuc2NvcmUgPj0gb3B0aW9ucy5zY29yZVRocmVzaG9sZCxcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiB7IHF1ZXJ5LCBpbmRleCwgaGl0cywgY291bnQ6IGhpdHMubGVuZ3RoIH07XG4gICAgfSxcbiAgfTtcbiAgY29uc3QgYWRkRG9jdW1lbnRzID0gcHJvdmlkZXIuYWRkRG9jdW1lbnRzPy5iaW5kKHByb3ZpZGVyKTtcbiAgaWYgKCFhZGREb2N1bWVudHMpIHJldHVybiBiYWNrZW5kO1xuICByZXR1cm4ge1xuICAgIC4uLmJhY2tlbmQsXG4gICAgYXN5bmMgYWRkRG9jdW1lbnRzKFxuICAgICAgaW5kZXg6IHN0cmluZyxcbiAgICAgIGRvY3VtZW50czogU2VhcmNoRG9jdW1lbnRbXSxcbiAgICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICAgICk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PiB7XG4gICAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhZGREb2N1bWVudHMoYWxpYXNGb3IoaW5kZXgsIGNvbmZpZyksIGRvY3VtZW50cyk7XG4gICAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG59XG4iXX0=
@@ -20,9 +20,10 @@
20
20
  *
21
21
  * @module
22
22
  */
23
- import { Plugin, type IAppRouter } from "@databricks/appkit";
24
- import { type AgentToolDefinition, type ToolProvider } from "@databricks/appkit/beta";
25
- import { search as sharedSearch } from "@dbx-tools/shared-search";
23
+ import { type IAppRouter } from "@databricks/appkit";
24
+ import { type ToolRegistry } from "@databricks/appkit/beta";
25
+ import { ToolRegistryPlugin } from "@dbx-tools/appkit";
26
+ import { searchSchemas } from "@dbx-tools/shared-search";
26
27
  import { type SearchPluginConfig } from "./config.ts";
27
28
  /**
28
29
  * AppKit extension plugin for agent tools, federated search, and optional
@@ -33,7 +34,7 @@ import { type SearchPluginConfig } from "./config.ts";
33
34
  * ```ts
34
35
  * import { createApp, server } from "@databricks/appkit";
35
36
  * import { aiSearch } from "@databricks/appkit/beta";
36
- * import { plugin as searchPlugin } from "@dbx-tools/search";
37
+ * import { search } from "@dbx-tools/search";
37
38
  *
38
39
  * await createApp({
39
40
  * plugins: [
@@ -46,7 +47,7 @@ import { type SearchPluginConfig } from "./config.ts";
46
47
  * },
47
48
  * },
48
49
  * }),
49
- * searchPlugin.search({
50
+ * search({
50
51
  * index: "main.support.docs",
51
52
  * indexes: [{ name: "main.support.docs", alias: "docs" }],
52
53
  * }),
@@ -54,7 +55,7 @@ import { type SearchPluginConfig } from "./config.ts";
54
55
  * });
55
56
  * ```
56
57
  */
57
- export declare class SearchPlugin extends Plugin<SearchPluginConfig> implements ToolProvider {
58
+ export declare class SearchPlugin extends ToolRegistryPlugin<SearchPluginConfig> {
58
59
  static manifest: {
59
60
  name: "search";
60
61
  displayName: string;
@@ -79,7 +80,7 @@ export declare class SearchPlugin extends Plugin<SearchPluginConfig> implements
79
80
  * autoInheritable: every tool runs under the caller's identity, so it must be
80
81
  * granted explicitly.
81
82
  */
82
- private get tools();
83
+ protected get toolRegistry(): ToolRegistry;
83
84
  /** Attach the registered provider and log the effective policy at boot. */
84
85
  setup(): Promise<void>;
85
86
  /** Resolve the registered AppKit-compatible AI Search provider. */
@@ -113,13 +114,9 @@ export declare class SearchPlugin extends Plugin<SearchPluginConfig> implements
113
114
  private respond;
114
115
  /** Surface the index catalogue + defaults so a search box needs no round-trip. */
115
116
  clientConfig(): Record<string, unknown>;
116
- /** AppKit `ToolProvider`: the tool definitions offered to an agent. */
117
- getAgentTools(): AgentToolDefinition[];
118
- /** AppKit `ToolProvider`: run one tool call, validating input against its schema. */
119
- executeAgentTool(name: string, args: unknown, signal?: AbortSignal): Promise<unknown>;
120
117
  exports(): {
121
118
  /** Search one index (default when omitted). Runs as the current context user. */
122
- search: (request: sharedSearch.SearchRequest, signal?: AbortSignal) => Promise<{
119
+ search: (request: searchSchemas.SearchRequest, signal?: AbortSignal) => Promise<{
123
120
  query: string;
124
121
  hits: {
125
122
  id: string;
@@ -131,7 +128,7 @@ export declare class SearchPlugin extends Plugin<SearchPluginConfig> implements
131
128
  index?: string | undefined;
132
129
  }>;
133
130
  /** Search across every configured index and merge the hits. */
134
- universalSearch: (request: sharedSearch.UniversalSearchRequest, signal?: AbortSignal) => Promise<{
131
+ universalSearch: (request: searchSchemas.UniversalSearchRequest, signal?: AbortSignal) => Promise<{
135
132
  query: string;
136
133
  hits: {
137
134
  id: string;
@@ -151,9 +148,9 @@ export declare class SearchPlugin extends Plugin<SearchPluginConfig> implements
151
148
  count: number;
152
149
  }>;
153
150
  /** Create a Vector Search index (throws when writes are disabled). */
154
- createIndex: (request: sharedSearch.CreateIndexRequest, signal?: AbortSignal) => Promise<import("./client.ts").IndexInfo>;
151
+ createIndex: (request: searchSchemas.CreateIndexRequest, signal?: AbortSignal) => Promise<import("./client.ts").IndexInfo>;
155
152
  /** Sync a Delta Sync index from its source table (throws when writes are disabled). */
156
- syncIndex: (request: sharedSearch.SyncIndexRequest, signal?: AbortSignal) => Promise<{
153
+ syncIndex: (request: searchSchemas.SyncIndexRequest, signal?: AbortSignal) => Promise<{
157
154
  index: string;
158
155
  synced: boolean;
159
156
  }>;
@@ -170,8 +167,8 @@ export declare class SearchPlugin extends Plugin<SearchPluginConfig> implements
170
167
  * @example
171
168
  * ```ts
172
169
  * import { createApp, server } from "@databricks/appkit";
173
- * import { plugin as searchPlugin } from "@dbx-tools/search";
174
- * import { agents, plugin as mastraPlugin } from "@dbx-tools/appkit-mastra";
170
+ * import { search } from "@dbx-tools/search";
171
+ * import { agents, mastra } from "@dbx-tools/appkit-mastra";
175
172
  *
176
173
  * const support = agents.createAgent({
177
174
  * instructions: "Answer from the docs; use `search` to find them.",
@@ -183,8 +180,8 @@ export declare class SearchPlugin extends Plugin<SearchPluginConfig> implements
183
180
  * await createApp({
184
181
  * plugins: [
185
182
  * server(),
186
- * searchPlugin.search({ index: "main.support.docs" }),
187
- * mastraPlugin.mastra({ agents: support }),
183
+ * search({ index: "main.support.docs" }),
184
+ * mastra({ agents: support }),
188
185
  * ],
189
186
  * });
190
187
  * ```