@dbx-tools/appkit-mastra 0.9.106 → 0.9.110

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/src/memory.js CHANGED
@@ -35,6 +35,7 @@ import { getUsernameWithApiLookup } from "@databricks/appkit";
35
35
  import { migration as appkitMigration } from "@dbx-tools/appkit";
36
36
  import { postgresConnectionOptions } from "@dbx-tools/postgres";
37
37
  import { hash, log } from "@dbx-tools/shared-core";
38
+ import { MASTRA_RESOURCE_ID_KEY, MASTRA_THREAD_ID_KEY, } from "@mastra/core/request-context";
38
39
  import { fastembed } from "@mastra/fastembed";
39
40
  import { Memory } from "@mastra/memory";
40
41
  import { PgVector, PostgresStore } from "@mastra/pg";
@@ -42,6 +43,28 @@ import { Pool } from "pg";
42
43
  import { agentStorageSchemaName } from "./storage-schema.js";
43
44
  import { summaryModel, TITLE_INSTRUCTIONS } from "./summarize.js";
44
45
  const logger = log.logger("mastra/memory");
46
+ /** Resolve the trusted Mastra memory scope stamped by AppKit middleware. */
47
+ export function requestMemoryScope(requestContext) {
48
+ const threadId = requestContext?.get(MASTRA_THREAD_ID_KEY);
49
+ const resourceId = requestContext?.get(MASTRA_RESOURCE_ID_KEY);
50
+ if (typeof threadId !== "string" || typeof resourceId !== "string")
51
+ return undefined;
52
+ return { thread: threadId, resource: resourceId };
53
+ }
54
+ /** Overlay trusted request memory identifiers onto Mastra execution options. */
55
+ export function withRequestMemoryScope(options, requestContext) {
56
+ const scope = requestMemoryScope(requestContext);
57
+ if (!scope)
58
+ return options;
59
+ const memory = options.memory;
60
+ return {
61
+ ...options,
62
+ memory: {
63
+ ...memory,
64
+ ...scope,
65
+ },
66
+ };
67
+ }
45
68
  /**
46
69
  * Soften {@link PostgresStore.init} so a failed migration (e.g. Lakebase
47
70
  * `must be owner of table …` on `ALTER`) is logged once instead of rethrown
@@ -322,4 +345,4 @@ function collectAgentDefinitions(config) {
322
345
  function withId(value, fallback) {
323
346
  return value.id ? value : { ...value, id: fallback };
324
347
  }
325
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lbW9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFFSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNyRCxPQUFPLEVBQUUsSUFBSSxFQUFtQixNQUFNLElBQUksQ0FBQztBQUkzQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUUzQzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxLQUFvQjtJQUN0RCxNQUFNLElBQUksR0FBRyxLQUtaLENBQUM7SUFDRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxJQUFJLGVBQTBDLENBQUM7SUFFL0MsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtRQUNyQixJQUFJ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KipcbiAqIExha2ViYXNlLWJhY2tlZCBNYXN0cmEgbWVtb3J5IHdpcmluZy5cbiAqXG4gKiBQcm92aWRlcyBhIHtAbGluayBNZW1vcnlCdWlsZGVyfSB0aGF0IG1pbnRzIG9uZSBgTWVtb3J5YCBwZXIgYWdlbnRcbiAqIHdpdGggdHdvIGluZGVwZW5kZW50IGtub2JzOlxuICpcbiAqIC0gKipTdG9yYWdlKiogKHRocmVhZHMgLyBtZXNzYWdlcyB2aWEgYFBvc3RncmVzU3RvcmVgKTogZGVmYXVsdHMgdG9cbiAqICAgKipwZXItYWdlbnQqKiBuYW1lc3BhY2luZyB2aWEge0BsaW5rIGFnZW50U3RvcmFnZVNjaGVtYU5hbWV9IHNvXG4gKiAgIGNvbnZlcnNhdGlvbiBoaXN0b3J5IHN0YXlzIGlzb2xhdGVkIGJldHdlZW4gYWdlbnRzIGluIHRoZSBzYW1lXG4gKiAgIGRhdGFiYXNlLiBgUG9zdGdyZXNTdG9yZWAgYXV0by1jcmVhdGVzIHRoZSBzY2hlbWEgd2l0aFxuICogICBgQ1JFQVRFIFNDSEVNQSBJRiBOT1QgRVhJU1RTYCBvbiBpbml0LiBBIGZhaWxlZCBtaWdyYXRpb24gKGNvbW1vbiBvblxuICogICBMYWtlYmFzZSB3aGVuIHRoZSBjb25uZWN0aW5nIHJvbGUgaXMgbm90IHRoZSB0YWJsZSBvd25lcikgaXMgbG9nZ2VkXG4gKiAgIGFuZCBza2lwcGVkIHZpYSB7QGxpbmsgd2l0aFNvZnRTdG9yYWdlSW5pdH0gc28gZXhpc3RpbmcgdGFibGVzIGtlZXBcbiAqICAgc2VydmluZyBpbnN0ZWFkIG9mIHJldHJ5aW5nIERETCBvbiBldmVyeSByZXF1ZXN0LlxuICogLSAqKk1lbW9yeSoqIChzZW1hbnRpYyByZWNhbGwgdmlhIGBQZ1ZlY3RvcmApOiBkZWZhdWx0cyB0byBhIHNpbmdsZVxuICogICAqKnNoYXJlZCoqIGluc3RhbmNlIGFjcm9zcyBldmVyeSBhZ2VudC4gQ3Jvc3MtYWdlbnQgcmVjYWxsIG9uIG9uZVxuICogICBpbmRleCBpcyBhbG1vc3QgYWx3YXlzIHdoYXQgdXNlcnMgd2FudDsgb3B0IGludG8gcGVyLWFnZW50IHJlY2FsbFxuICogICBieSBwYXNzaW5nIGEge0BsaW5rIE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlfSBvbiB0aGUgYWdlbnQuXG4gKlxuICogQWRkaXRpb25hbGx5LCB7QGxpbmsgTWVtb3J5QnVpbGRlci5pbnN0YW5jZVN0b3JhZ2V9IHJldHVybnMgYVxuICogKipNYXN0cmEtaW5zdGFuY2UtbGV2ZWwqKiBgUG9zdGdyZXNTdG9yZWAgKHNjaGVtYSBgbWFzdHJhX2luc3RhbmNlYClcbiAqIHVzZWQgZm9yIHdvcmtmbG93IHNuYXBzaG90cyAtIHRoZSBwZXJzaXN0ZW5jZSBsYXllclxuICogYGFnZW50LnJlc3VtZVN0cmVhbSgpYCByZWFkcyBmcm9tIHdoZW4gd2FraW5nIGEgc3VzcGVuZGVkXG4gKiBgcmVxdWlyZUFwcHJvdmFsYCB0b29sIGNhbGwuIFBlci1hZ2VudCBzdG9yZXMgYXJlIG5vdCBlbm91Z2ggZm9yXG4gKiB0aGlzOiB3b3JrZmxvdyBydW5zIGFyZSBzY29wZWQgdG8gdGhlIE1hc3RyYSBpbnN0YW5jZSwgbm90IGFuXG4gKiBpbmRpdmlkdWFsIGFnZW50J3MgYE1lbW9yeWAuXG4gKlxuICogUGx1Z2luLWxldmVsIGBjb25maWcuc3RvcmFnZWAgLyBgY29uZmlnLm1lbW9yeWAgYWN0IGFzIHRoZSBiYXNlbGluZVxuICogKGF1dG8tZGVmYXVsdGVkIHRvIGB0cnVlYCBpbiBgcGx1Z2luLnRzYCB3aGVuIHRoZSBgbGFrZWJhc2VgIHBsdWdpblxuICogaXMgcmVnaXN0ZXJlZCk7IHBlci1hZ2VudCBzZXR0aW5ncyBjYXNjYWRlIG9uIHRvcCBvZiB0aGF0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRVc2VybmFtZVdpdGhBcGlMb29rdXAgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBtaWdyYXRpb24gYXMgYXBwa2l0TWlncmF0aW9uIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBwb3N0Z3Jlc0Nvbm5lY3Rpb25PcHRpb25zIH0gZnJvbSBcIkBkYngtdG9vbHMvcG9zdGdyZXNcIjtcbmltcG9ydCB7IGhhc2gsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmYXN0ZW1iZWQgfSBmcm9tIFwiQG1hc3RyYS9mYXN0ZW1iZWRcIjtcbmltcG9ydCB7IE1lbW9yeSB9IGZyb20gXCJAbWFzdHJhL21lbW9yeVwiO1xuaW1wb3J0IHsgUGdWZWN0b3IsIFBvc3RncmVzU3RvcmUgfSBmcm9tIFwiQG1hc3RyYS9wZ1wiO1xuaW1wb3J0IHsgUG9vbCwgdHlwZSBQb29sQ29uZmlnIH0gZnJvbSBcInBnXCI7XG5cbmltcG9ydCB0eXBlIHsgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uLCBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZSB9IGZyb20gXCIuL2FnZW50cy50c1wiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IGFnZW50U3RvcmFnZVNjaGVtYU5hbWUgfSBmcm9tIFwiLi9zdG9yYWdlLXNjaGVtYS50c1wiO1xuaW1wb3J0IHsgc3VtbWFyeU1vZGVsLCBUSVRMRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zdW1tYXJpemUudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9tZW1vcnlcIik7XG5cbi8qKlxuICogU29mdGVuIHtAbGluayBQb3N0Z3Jlc1N0b3JlLmluaXR9IHNvIGEgZmFpbGVkIG1pZ3JhdGlvbiAoZS5nLiBMYWtlYmFzZVxuICogYG11c3QgYmUgb3duZXIgb2YgdGFibGUg4oCmYCBvbiBgQUxURVJgKSBpcyBsb2dnZWQgb25jZSBpbnN0ZWFkIG9mIHJldGhyb3duXG4gKiBvbiBldmVyeSBzdG9yYWdlIGNhbGwuXG4gKlxuICogTWFzdHJhJ3MgYGF1Z21lbnRXaXRoSW5pdGAgcmV0cmllcyBpbml0IGZvcmV2ZXIgd2hlbiBpdCB0aHJvd3MsIHNvIHRoZVxuICogb25seSB3YXkgdG8ga2VlcCBzZXJ2aW5nIGFnYWluc3QgYW4gYWxyZWFkeS11c2FibGUgc2NoZW1hIGlzIHRvIHRyZWF0XG4gKiBtaWdyYXRpb24gZmFpbHVyZSBhcyBzdWNjZXNzIGFuZCBtYXJrIHRoZSBzdG9yZSBpbml0aWFsaXplZC5cbiAqXG4gKiBDb25jdXJyZW50IGZpcnN0IGNhbGxlcnMgc2hhcmUgb25lIHNvZnQgYXR0ZW1wdC4gTm9uLW93bmVyc2hpcCBmYWlsdXJlcyBzdGF5XG4gKiBmYXRhbCBzbyBtaXNzaW5nIHNjaGVtYXMvdGFibGVzIGFyZSByZXRyaWVkIG9yIHN1cmZhY2VkIGluc3RlYWQgb2YgaGlkZGVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFNvZnRTdG9yYWdlSW5pdChzdG9yZTogUG9zdGdyZXNTdG9yZSk6IFBvc3RncmVzU3RvcmUge1xuICBjb25zdCBzb2Z0ID0gc3RvcmUgYXMgdW5rbm93biBhcyB7XG4gICAgaW5pdDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBpZDogc3RyaW5nO1xuICAgIHNjaGVtYT86IHN0cmluZztcbiAgICBpc0luaXRpYWxpemVkOiBib29sZWFuO1xuICB9O1xuICBjb25zdCBvcmlnaW5hbEluaXQgPSBzb2Z0LmluaXQuYmluZChzb2Z0KTtcbiAgbGV0IHNvZnRJbml0UHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcblxuICBzb2Z0LmluaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHNvZnQuaXNJbml0aWFsaXplZCkgcmV0dXJuO1xuICAgIHNvZnRJbml0UHJvbWlzZSA/Pz0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG9yaWdpbmFsSW5pdCgpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhYXBwa2l0TWlncmF0aW9uLmhhbmRsZU93bmVyc2hpcE1pZ3JhdGlvbkVycm9yKGVyciwge1xuICAgICAgICAgICAgc2NvcGU6IFwibWFzdHJhLXN0b3JhZ2VcIixcbiAgICAgICAgICAgIGxvZ2dlcixcbiAgICAgICAgICAgIGV2ZW50OiBcIm1hc3RyYSBzdG9yYWdlIG1pZ3JhdGlvbiBmYWlsZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IHsgc3RvcmVJZDogc29mdC5pZCwgc2NoZW1hOiBzb2Z0LnNjaGVtYSB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNvZnRJbml0UHJvbWlzZTtcbiAgICAgIHNvZnQuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzb2Z0SW5pdFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9O1xuICByZXR1cm4gc3RvcmU7XG59XG5cbi8qKlxuICogQnVpbGQgYSBkZWRpY2F0ZWQgKipzZXJ2aWNlLXByaW5jaXBhbCoqIExha2ViYXNlIHBvb2wgZm9yIE1hc3RyYVxuICogbWVtb3J5IGZyb20gdGhlIGxha2ViYXNlIHBsdWdpbidzIHJlc29sdmVkIFNQIHBnIGNvbmZpZy5cbiAqXG4gKiBUaGUgcGx1Z2luJ3MgYGV4cG9ydHMoKS5wb29sYCBpcyBhIGBSb3V0aW5nUG9vbGAgdGhhdCBzd2l0Y2hlcyB0b1xuICogdGhlIHBlci11c2VyIChPQk8pIHBvb2wgd2hlbmV2ZXIgYSBxdWVyeSBydW5zIGluc2lkZSBhbiBgYXNVc2VyYFxuICogc2NvcGUgLSBleGFjdGx5IHRoZSBjb250ZXh0IHRoZSBtYXN0cmEgcGx1Z2luIGVzdGFibGlzaGVzIGFyb3VuZFxuICogZXZlcnkgY2hhdCB0dXJuLiBNZW1vcnkgKHRocmVhZHMgLyBtZXNzYWdlcyArIHNlbWFudGljIHJlY2FsbCkgbXVzdFxuICogaW5zdGVhZCBhbHdheXMgYWN0IGFzIHRoZSBhcHAgc2VydmljZSBwcmluY2lwYWw6IGl0IG93bnMgdGhlXG4gKiBhdXRvLWNyZWF0ZWQgYG1hc3RyYV8qYCBzY2hlbWFzIChhIHBlci11c2VyIHJvbGUgdXN1YWxseSBjYW4ndFxuICogYENSRUFURSBTQ0hFTUFgKSBhbmQgaXMgc2hhcmVkIGFjcm9zcyB1c2Vycywgc28gaXQgY2Fubm90IGluaGVyaXQgYVxuICogcmVxdWVzdCdzIE9CTyBpZGVudGl0eS5cbiAqXG4gKiBgcGdDb25maWdgIG11c3QgYmUgdGhlIHBsdWdpbidzIGBleHBvcnRzKCkuZ2V0UGdDb25maWcoKWAgZXZhbHVhdGVkXG4gKiAqKm91dHNpZGUqKiBhbnkgYGFzVXNlcmAgc2NvcGUgKGkuZS4gZHVyaW5nIHNldHVwKSwgc28gaXQgY2Fycmllc1xuICogdGhlIFNQIGNvbm5lY3Rpb24gdGFyZ2V0LCBPQXV0aCB0b2tlbi1yZWZyZXNoIGBwYXNzd29yZGAgY2FsbGJhY2ssXG4gKiBhbmQgYW55IGBsYWtlYmFzZSh7IHBvb2wgfSlgIHR1bmluZyBvdmVycmlkZXMgLSBhbGwgb2Ygd2hpY2ggdGhpc1xuICogcG9vbCBpbmhlcml0cy4gU2VlIHRoZSBjYWxsIHNpdGUgaW4gYHBsdWdpbi50c2AuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTZXJ2aWNlUHJpbmNpcGFsUG9vbChwZ0NvbmZpZzogUG9vbENvbmZpZyk6IFByb21pc2U8UG9vbD4ge1xuICAvLyBgZ2V0UGdDb25maWcoKWAgcmVzb2x2ZXMgdGhlIFNQIHVzZXJuYW1lIHN5bmNocm9ub3VzbHkgZnJvbVxuICAvLyBgUEdVU0VSYCAvIGBEQVRBQlJJQ0tTX0NMSUVOVF9JRGA7IGZhbGwgYmFjayB0byB0aGUgYXN5bmMgQVBJXG4gIC8vIGxvb2t1cCAoZS5nLiBsb2NhbCBkZXYgYXV0aGVudGljYXRpbmcgdmlhIFBBVCkgc28gdGhlIHBvb2wgYWx3YXlzXG4gIC8vIGhhcyBhbiBpZGVudGl0eSB0byBjb25uZWN0IHdpdGguXG4gIGNvbnN0IHVzZXIgPSBwZ0NvbmZpZy51c2VyID8/IChhd2FpdCBnZXRVc2VybmFtZVdpdGhBcGlMb29rdXAoKSk7XG4gIHJldHVybiBuZXcgUG9vbChwb3N0Z3Jlc0Nvbm5lY3Rpb25PcHRpb25zKHsgLi4ucGdDb25maWcsIHVzZXIgfSkpO1xufVxuXG4vKiogRWZmZWN0aXZlIHBlci1rbm9iIHNldHRpbmcgYWZ0ZXIgdGhlIHBsdWdpbi9hZ2VudCBjYXNjYWRlLiAqL1xudHlwZSBTdG9yYWdlU2V0dGluZyA9IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbltcInN0b3JhZ2VcIl07XG50eXBlIE1lbW9yeVNldHRpbmcgPSBBbnlNYXN0cmFBZ2VudERlZmluaXRpb25bXCJtZW1vcnlcIl07XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGFueSBwbHVnaW4tbGV2ZWwgb3IgcGVyLWFnZW50IHNldHRpbmcgY291bGQgbmVlZCB0aGVcbiAqIExha2ViYXNlIHBvb2wuIFVzZWQgYnkgYHBsdWdpbi50c2AgdG8gZ2F0ZSBjcmVhdGlvbiBvZiB0aGVcbiAqIHNlcnZpY2UtcHJpbmNpcGFsIHBvb2wgYW5kIHRoZSB7QGxpbmsgTWVtb3J5QnVpbGRlcn0gdGhhdCBjb25zdW1lc1xuICogaXQ7IHdoZW4gZmFsc2UgbmVpdGhlciBpcyBidWlsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5lZWRzTGFrZWJhc2UoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBib29sZWFuIHtcbiAgaWYgKHNldHRpbmdOZWVkc1NoYXJlZFBvb2woY29uZmlnLnN0b3JhZ2UpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHNldHRpbmdOZWVkc1NoYXJlZFBvb2woY29uZmlnLm1lbW9yeSkpIHJldHVybiB0cnVlO1xuICBjb25zdCBkZWZzID0gY29sbGVjdEFnZW50RGVmaW5pdGlvbnMoY29uZmlnKTtcbiAgcmV0dXJuIGRlZnMuc29tZSgoZCkgPT4gc2V0dGluZ05lZWRzU2hhcmVkUG9vbChkLnN0b3JhZ2UpIHx8IHNldHRpbmdOZWVkc1NoYXJlZFBvb2woZC5tZW1vcnkpKTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSBwZXItYWdlbnQge0BsaW5rIE1lbW9yeX0gZmFjdG9yeSBib3VuZCB0byB0aGUgc3VwcGxpZWRcbiAqIHNlcnZpY2UtcHJpbmNpcGFsIHBvb2wgKHNlZSB7QGxpbmsgY3JlYXRlU2VydmljZVByaW5jaXBhbFBvb2x9KS5cbiAqIENhY2hlcyB0aGUgc2hhcmVkIGBQZ1ZlY3RvcmAgc2luZ2xldG9uIChidWlsdCBvbiBmaXJzdCBuZWVkKSBzbyBlYWNoXG4gKiBhZ2VudCBidWlsZCBpcyBPKDEpIGFmdGVyIHRoZSBmaXJzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1lbW9yeUJ1aWxkZXIoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBzZXJ2aWNlUHJpbmNpcGFsUG9vbDogUG9vbCxcbik6IE1lbW9yeUJ1aWxkZXIge1xuICByZXR1cm4gbmV3IE1lbW9yeUJ1aWxkZXIoY29uZmlnLCBzZXJ2aWNlUHJpbmNpcGFsUG9vbCk7XG59XG5cbi8qKlxuICogQnVpbGRzIG9uZSBgTWVtb3J5YCBwZXIgYWdlbnQgYWdhaW5zdCBhIHNoYXJlZCBzZXJ2aWNlLXByaW5jaXBhbFxuICogTGFrZWJhc2UgcG9vbC4gUGVyLWluc3RhbmNlIHN0YXRlIGtlZXBzIHRoZSBzaGFyZWQgYFBnVmVjdG9yYCBhbGl2ZVxuICogYWNyb3NzIGNhbGxzIHNvIHJlZ2lzdGVyaW5nIE4gYWdlbnRzIHN0YXlzIGNoZWFwLlxuICovXG5leHBvcnQgY2xhc3MgTWVtb3J5QnVpbGRlciB7XG4gIHByaXZhdGUgc2hhcmVkVmVjdG9yOiBQZ1ZlY3RvciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZVByaW5jaXBhbFBvb2w6IFBvb2wsXG4gICkge31cblxuICAvKipcbiAgICogQnVpbGQgdGhlIE1hc3RyYS1pbnN0YW5jZS1sZXZlbCBzdG9yYWdlIHVzZWQgZm9yIHdvcmtmbG93XG4gICAqIHNuYXBzaG90cy4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHBsdWdpbi1sZXZlbCBgc3RvcmFnZWAgaXNcbiAgICogZGlzYWJsZWQsIGluIHdoaWNoIGNhc2UgYGFnZW50LnJlc3VtZVN0cmVhbSgpYCAoYW5kIHRoZXJlZm9yZVxuICAgKiB0aGUgYHJlcXVpcmVBcHByb3ZhbGAgZmxvdykgd2lsbCBub3QgYmUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBUaGUgc3RvcmUgbGl2ZXMgaW4gYSBkZWRpY2F0ZWQgYG1hc3RyYV9pbnN0YW5jZWAgc2NoZW1hIHNvIGl0XG4gICAqIG5ldmVyIGNvbGxpZGVzIHdpdGggcGVyLWFnZW50IHtAbGluayBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lfSBuYW1lc3BhY2VzLlxuICAgKiBXb3JrZmxvdyBzbmFwc2hvdHMgYXJlIG5vdCBwZXItYWdlbnQgc3RhdGU7IHRoZXkgYmVsb25nIHRvIHRoZVxuICAgKiBgTWFzdHJhYCBpbnN0YW5jZSB0aGF0IG93bnMgdGhlIHdvcmtmbG93IGV4ZWN1dGlvbi5cbiAgICovXG4gIGluc3RhbmNlU3RvcmFnZSgpOiBQb3N0Z3Jlc1N0b3JlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzZXR0aW5nID0gdGhpcy5jb25maWcuc3RvcmFnZTtcbiAgICBpZiAoIXNldHRpbmcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBzZXR0aW5nID09PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gd2l0aFNvZnRTdG9yYWdlSW5pdChcbiAgICAgICAgbmV3IFBvc3RncmVzU3RvcmUoXG4gICAgICAgICAgd2l0aElkKHNldHRpbmcsIFwibWFzdHJhLXN0b3JlX19pbnN0YW5jZVwiKSBhcyBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8XG4gICAgICAgICAgICB0eXBlb2YgUG9zdGdyZXNTdG9yZVxuICAgICAgICAgID5bMF0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gd2l0aFNvZnRTdG9yYWdlSW5pdChcbiAgICAgIG5ldyBQb3N0Z3Jlc1N0b3JlKHtcbiAgICAgICAgaWQ6IFwibWFzdHJhLXN0b3JlX19pbnN0YW5jZVwiLFxuICAgICAgICBzY2hlbWFOYW1lOiBcIm1hc3RyYV9pbnN0YW5jZVwiLFxuICAgICAgICBwb29sOiB0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGBNZW1vcnlgIGZvciBgYWdlbnRJZGAgYWZ0ZXIgdGhlIHBsdWdpbi9hZ2VudCBjYXNjYWRlLlxuICAgKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIGFnZW50IGhhcyBuZWl0aGVyIHN0b3JhZ2Ugbm9yIGFcbiAgICogdmVjdG9yIHN0b3JlIGVuYWJsZWQgLSBNYXN0cmEgYWNjZXB0cyBhIG1pc3NpbmcgYG1lbW9yeWAgZmllbGRcbiAgICogYW5kIHRyZWF0cyB0aGUgYWdlbnQgYXMgc3RhdGVsZXNzLlxuICAgKi9cbiAgZm9yQWdlbnQoYWdlbnRJZDogc3RyaW5nLCBkZWY6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbik6IE1lbW9yeSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3RvcmFnZVNldHRpbmcgPSBkZWYuc3RvcmFnZSA/PyB0aGlzLmNvbmZpZy5zdG9yYWdlO1xuICAgIGNvbnN0IG1lbW9yeVNldHRpbmcgPSBkZWYubWVtb3J5ID8/IHRoaXMuY29uZmlnLm1lbW9yeTtcblxuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmJ1aWxkU3RvcmFnZShhZ2VudElkLCBzdG9yYWdlU2V0dGluZyk7XG4gICAgY29uc3QgdmVjdG9yID0gdGhpcy5idWlsZFZlY3RvcihtZW1vcnlTZXR0aW5nKTtcbiAgICBpZiAoIXN0b3JhZ2UgJiYgIXZlY3Rvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiYWdlbnQ6c3RhdGVsZXNzXCIsIHsgYWdlbnRJZCB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmRlYnVnKFwiYWdlbnQ6Y29uZmlndXJlZFwiLCB7XG4gICAgICBhZ2VudElkLFxuICAgICAgc3RvcmFnZTogc3RvcmFnZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgdmVjdG9yOiB2ZWN0b3IgIT09IHVuZGVmaW5lZCxcbiAgICAgIHZlY3Rvck1vZGU6XG4gICAgICAgIHZlY3RvciA9PT0gdW5kZWZpbmVkID8gXCJvZmZcIiA6IHR5cGVvZiBtZW1vcnlTZXR0aW5nID09PSBcIm9iamVjdFwiID8gXCJkZWRpY2F0ZWRcIiA6IFwic2hhcmVkXCIsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IE1lbW9yeSh7XG4gICAgICAuLi4oc3RvcmFnZSA/IHsgc3RvcmFnZSB9IDoge30pLFxuICAgICAgLi4uKHZlY3RvciA/IHsgdmVjdG9yLCBlbWJlZGRlcjogZmFzdGVtYmVkIH0gOiB7fSksXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGxhc3RNZXNzYWdlczogMTAsXG4gICAgICAgIC4uLih2ZWN0b3IgPyB7IHNlbWFudGljUmVjYWxsOiB7IHRvcEs6IDMsIG1lc3NhZ2VSYW5nZTogMiB9IH0gOiB7fSksXG4gICAgICAgIC8vIEF1dG8tbmFtZSBlYWNoIHRocmVhZCBmcm9tIGl0cyBvcGVuaW5nIHR1cm4gc28gdGhlXG4gICAgICAgIC8vIGNvbnZlcnNhdGlvbiBsaXN0IHRoZSBVSSByZW5kZXJzIHNob3dzIG1lYW5pbmdmdWwgdGl0bGVzXG4gICAgICAgIC8vIGluc3RlYWQgb2YgcmF3IGlkcy4gVGl0bGluZyBydW5zIG9uIHRoZSBzbWFsbCAvIGZhc3QgY2hhdFxuICAgICAgICAvLyB0aWVyIChzZWUgYHN1bW1hcml6ZS50c2ApIHJhdGhlciB0aGFuIHRoZSBhZ2VudCdzIHByaW1hcnlcbiAgICAgICAgLy8gbW9kZWwsIHNvIG5hbWluZyBhIHRocmVhZCBuZXZlciBzcGVuZHMgdGhlIGhlYXZ5d2VpZ2h0IG1vZGVsLlxuICAgICAgICAvLyBPbmx5IG1lYW5pbmdmdWwgd2hlbiBzdG9yYWdlIGlzIG9uOyBoYXJtbGVzcyBvdGhlcndpc2UuXG4gICAgICAgIC4uLihzdG9yYWdlXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGdlbmVyYXRlVGl0bGU6IHtcbiAgICAgICAgICAgICAgICBtb2RlbDogc3VtbWFyeU1vZGVsKHRoaXMuY29uZmlnKSxcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbnM6IFRJVExFX0lOU1RSVUNUSU9OUyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3RvcmFnZShhZ2VudElkOiBzdHJpbmcsIHNldHRpbmc6IFN0b3JhZ2VTZXR0aW5nKTogUG9zdGdyZXNTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFzZXR0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2Ygc2V0dGluZyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiB3aXRoU29mdFN0b3JhZ2VJbml0KFxuICAgICAgICBuZXcgUG9zdGdyZXNTdG9yZSh7XG4gICAgICAgICAgaWQ6IGBtYXN0cmEtc3RvcmVfXyR7YWdlbnRJZH1gLFxuICAgICAgICAgIHNjaGVtYU5hbWU6IGFnZW50U3RvcmFnZVNjaGVtYU5hbWUoYWdlbnRJZCksXG4gICAgICAgICAgcG9vbDogdGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBDYXN0OiBgd2l0aElkYCBndWFyYW50ZWVzIGBpZGAgaXMgc2V0LCBidXQgdGhlIGRpc3RyaWJ1dGl2ZVxuICAgIC8vIE9taXQgKyBgaWQ/OiBzdHJpbmdgIHNoYXBlIGRvZXNuJ3Qgc3RydWN0dXJhbGx5IG5hcnJvdyB0byB0aGVcbiAgICAvLyBkaXNjcmltaW5hdGVkIHVuaW9uIG1lbWJlcnMuIFJ1bnRpbWUgc2hhcGUgaXMgaWRlbnRpY2FsLlxuICAgIHJldHVybiB3aXRoU29mdFN0b3JhZ2VJbml0KFxuICAgICAgbmV3IFBvc3RncmVzU3RvcmUoXG4gICAgICAgIHdpdGhJZChzZXR0aW5nLCBgbWFzdHJhLXN0b3JlX18ke2FnZW50SWR9YCkgYXMgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFxuICAgICAgICAgIHR5cGVvZiBQb3N0Z3Jlc1N0b3JlXG4gICAgICAgID5bMF0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgYWdlbnQncyB2ZWN0b3Igc3RvcmUuIENhc2NhZGU6XG4gICAqXG4gICAqIC0gZmFsc3k6IG5vIHZlY3Rvci5cbiAgICogLSBgYm9vbGVhbmAgLyBgdW5kZWZpbmVkLWluaGVyaXRpbmctdHJ1ZWA6IHJldHVybiB0aGUgc2hhcmVkXG4gICAqICAgc2luZ2xldG9uIChidWlsdCBsYXppbHkgb24gZmlyc3QgY2FsbCkuIEFsbCBhZ2VudHMgdGhhdFxuICAgKiAgIGRlZmF1bHQtZW5hYmxlIG1lbW9yeSB3cml0ZSBpbnRvIGFuZCByZWNhbGwgZnJvbSBvbmUgaW5kZXguXG4gICAqIC0gb2JqZWN0OiBidWlsZCBhIGRlZGljYXRlZCBgUGdWZWN0b3JgIGZvciB0aGlzIGFnZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFZlY3RvcihzZXR0aW5nOiBNZW1vcnlTZXR0aW5nKTogUGdWZWN0b3IgfCB1bmRlZmluZWQge1xuICAgIGlmICghc2V0dGluZykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHNldHRpbmcgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gdGhpcy5nZXRTaGFyZWRWZWN0b3IoKTtcbiAgICByZXR1cm4gYnVpbGRQZ1ZlY3RvcihzZXR0aW5nKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2hhcmVkVmVjdG9yKCk6IFBnVmVjdG9yIHtcbiAgICBpZiAoIXRoaXMuc2hhcmVkVmVjdG9yKSB7XG4gICAgICB0aGlzLnNoYXJlZFZlY3RvciA9IGJ1aWxkU2hhcmVkUGdWZWN0b3IodGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNoYXJlZFZlY3RvcjtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBzaGFyZWQgYFBnVmVjdG9yYCB0aGF0IGJhY2tzIHRoZSBkZWZhdWx0XG4gKiBgZGVmLm1lbW9yeSA9PT0gdHJ1ZWAgY2FzZSBhY3Jvc3MgZXZlcnkgYWdlbnQuXG4gKlxuICogYFBnVmVjdG9yYCdzIGNvbnN0cnVjdG9yIGFjY2VwdHMgb25seSBjb25uZWN0aW9uLXN0eWxlIGNvbmZpZ3NcbiAqIChgSG9zdENvbmZpZ2AgLyBgQ29ubmVjdGlvblN0cmluZ0NvbmZpZ2AgLyBgQ2xpZW50Q29uZmlnYCk7IHRoZXJlIGlzXG4gKiBubyBgeyBwb29sIH1gIHNob3J0aGFuZCB0aGUgd2F5IGBQb3N0Z3Jlc1N0b3JlYCBoYXMgb25lLiBXb3JzZSwgdGhlXG4gKiBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGtpY2tzIG9mZiBhIGBjYWNoZVdhcm11cFByb21pc2VgIElJRkUgdGhhdFxuICogY2FsbHMgYHRoaXMucG9vbC5jb25uZWN0KClgIGJlZm9yZSByZXR1cm5pbmcsIHNvIHdlIGNhbid0IGNsZWFubHlcbiAqIGhhbmQgaXQgYW4gaW5lcnQgY29uZmlnIGFuZCBwYXRjaCB0aGUgcG9vbCBhZnRlcndhcmRzLlxuICpcbiAqIFRoZSB0cmljazogcGFzcyBpbGxlZ2FsLWJ1dC12YWxpZGF0aW9uLXBhc3NpbmcgcGxhY2Vob2xkZXJzIHNvIHRoZVxuICogd2FybXVwJ3MgYG5ldC5jb25uZWN0KClgIHJlamVjdHMgc3luY2hyb25vdXNseSB3aXRoIGBSYW5nZUVycm9yYFxuICogKE5vZGUgdmFsaWRhdGVzIGAwIDw9IHBvcnQgPCA2NTUzNmApLiBUaGUgSUlGRSdzIGBjYXRjaCB7fWAgc3dhbGxvd3NcbiAqIGl0LCBubyBETlMgbG9va3VwIG9yIFRDUCBhdHRlbXB0IGhhcHBlbnMsIGFuZCB3ZSB0aGVuIHN3YXBcbiAqIGBwZ1ZlY3Rvci5wb29sYCB0byB0aGUgbGFrZWJhc2UgcG9vbC4gRXZlcnkgc3Vic2VxdWVudCBgUGdWZWN0b3JgXG4gKiBtZXRob2QgcmVhZHMgYHRoaXMucG9vbGAgYXQgY2FsbCB0aW1lLCBzbyBhbGwgcmVhbCBJL08gZ29lcyB0aHJvdWdoXG4gKiB0aGUgbGFrZWJhc2UgcG9vbCBmcm9tIHRoZW4gb24uIFRoZSBwbGFjZWhvbGRlciBwb29sIGlzIGAuZW5kKClgJ2RcbiAqIHNvIGl0cyBzb2NrZXQgYm9vay1rZWVwaW5nIGlzIHJlbGVhc2VkLlxuICovXG5mdW5jdGlvbiBidWlsZFNoYXJlZFBnVmVjdG9yKHBvb2w6IFBvb2wpOiBQZ1ZlY3RvciB7XG4gIGNvbnN0IHZlY3RvciA9IG5ldyBQZ1ZlY3Rvcih7XG4gICAgaWQ6IGBwZyR7aGFzaC5pZCgpfWAsXG4gICAgLy8gS2VlcCB0aGUgcmVjYWxsIGluZGV4IG91dCBvZiBgcHVibGljYDogb24gYSBMYWtlYmFzZSBkYXRhYmFzZSB0aGUgYXBwXG4gICAgLy8gc2VydmljZSBwcmluY2lwYWwgaGFzIG5vIENSRUFURSBvbiBgcHVibGljYCAoUEcxNSsgbG9ja3MgaXQgZG93biksIHNvIGFcbiAgICAvLyBkZWZhdWx0LXNjaGVtYSBQZ1ZlY3RvciBmYWlscyBvbiBDUkVBVEUgSU5ERVggd2l0aCBcInBlcm1pc3Npb24gZGVuaWVkIGZvclxuICAgIC8vIHNjaGVtYSBwdWJsaWNcIi4gUGdWZWN0b3IgcnVucyBDUkVBVEUgU0NIRU1BIElGIE5PVCBFWElTVFMgZm9yIGEgbmFtZWRcbiAgICAvLyBzY2hlbWEsIHNvIHRoZSBTUCBjcmVhdGVzIGFuZCBvd25zIGBtYXN0cmFfaW5zdGFuY2VgICh0aGUgc2FtZVxuICAgIC8vIGluc3RhbmNlLWxldmVsIHNjaGVtYSB0aGUgd29ya2Zsb3ctc25hcHNob3Qgc3RvcmUgdXNlcykgYW5kIHRoZSBpbmRleFxuICAgIC8vIGxhbmRzIHRoZXJlLiBUYWJsZSBuYW1lcyBkb24ndCBjb2xsaWRlIHdpdGggdGhlIHN0b3JhZ2UgdGFibGVzLlxuICAgIHNjaGVtYU5hbWU6IFwibWFzdHJhX2luc3RhbmNlXCIsXG4gICAgaG9zdDogXCItMVwiLFxuICAgIHBvcnQ6IC0xLFxuICAgIGRhdGFiYXNlOiBcIl9cIixcbiAgICB1c2VyOiBcIl9cIixcbiAgICBwYXNzd29yZDogXCJfXCIsXG4gIH0pO1xuICBjb25zdCBwbGFjZWhvbGRlciA9IHZlY3Rvci5wb29sO1xuICB2ZWN0b3IucG9vbCA9IHBvb2w7XG4gIHZvaWQgcGxhY2Vob2xkZXIuZW5kKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIHZlY3Rvcjtcbn1cblxuLyoqIFBlci1hZ2VudCBkZWRpY2F0ZWQgYFBnVmVjdG9yYCAocmFyZTsgb3B0LWluIHZpYSBvYmplY3Qgb3ZlcnJpZGUpLiAqL1xuZnVuY3Rpb24gYnVpbGRQZ1ZlY3RvcihzZXR0aW5nOiBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZSk6IFBnVmVjdG9yIHtcbiAgcmV0dXJuIG5ldyBQZ1ZlY3RvcihcbiAgICB3aXRoSWQoc2V0dGluZywgYHBnLXZlY3Rvcl9fJHtoYXNoLmlkKCl9YCkgYXMgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBQZ1ZlY3Rvcj5bMF0sXG4gICk7XG59XG5cbi8qKiBUcnVlIHdoZW4gdGhpcyBzZXR0aW5nIHJlcXVpcmVzIHRoZSBzaGFyZWQgTGFrZWJhc2UgcG9vbC4gKi9cbmZ1bmN0aW9uIHNldHRpbmdOZWVkc1NoYXJlZFBvb2woc2V0dGluZzogU3RvcmFnZVNldHRpbmcgfCBNZW1vcnlTZXR0aW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBzZXR0aW5nID09PSB0cnVlO1xufVxuXG4vKiogV2FsayB0aGUgdGhyZWUgc2hhcGVzIG9mIGBjb25maWcuYWdlbnRzYCBpbnRvIGEgZmxhdCBsaXN0LiAqL1xuZnVuY3Rpb24gY29sbGVjdEFnZW50RGVmaW5pdGlvbnMoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBBbnlNYXN0cmFBZ2VudERlZmluaXRpb25bXSB7XG4gIGNvbnN0IGFnZW50cyA9IGNvbmZpZy5hZ2VudHM7XG4gIGlmICghYWdlbnRzKSByZXR1cm4gW107XG4gIGlmIChBcnJheS5pc0FycmF5KGFnZW50cykpIHJldHVybiBhZ2VudHM7XG4gIGlmIChcImluc3RydWN0aW9uc1wiIGluIGFnZW50cykge1xuICAgIHJldHVybiBbYWdlbnRzIGFzIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbl07XG4gIH1cbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoYWdlbnRzKTtcbn1cblxuLyoqIEZpbGwgaW4gYSBkZWZhdWx0IGBpZGAgd2hlbiB0aGUgY2FsbGVyIGRpZG4ndCBzdXBwbHkgb25lLiAqL1xuZnVuY3Rpb24gd2l0aElkPFQgZXh0ZW5kcyB7IGlkPzogc3RyaW5nIH0+KHZhbHVlOiBULCBmYWxsYmFjazogc3RyaW5nKTogVCB7XG4gIHJldHVybiB2YWx1ZS5pZCA/IHZhbHVlIDogeyAuLi52YWx1ZSwgaWQ6IGZhbGxiYWNrIH07XG59XG4iXX0=
348
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lbW9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFFSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFbkQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixvQkFBb0IsR0FFckIsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxJQUFJLEVBQW1CLE1BQU0sSUFBSSxDQUFDO0FBSTNDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRTNDLDRFQUE0RTtBQUM1RSxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLGNBQXVEO0lBRXZELE1BQU0sUUFBUSxHQUFHLGNBQWMsRUFBRSxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUMzRCxNQUFNLFVBQVUsR0FBRyxjQUFjLEVBQUUsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7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TyxFQUFFLGNBQWMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQThDLENBQ3hGLENBQUM7QUFDSixDQUFDO0FBRUQsZ0VBQWdFO0FBQ2hFLFNBQVMsc0JBQXNCLENBQUMsT0FBbUQ7SUFDakYsT0FBTyxPQUFPLEtBQUssSUFBSSxDQUFDO0FBQzFCLENBQUM7QUFFRCxpRUFBaUU7QUFDakUsU0FBUyx1QkFBdUIsQ0FBQyxNQUEwQjtJQUN6RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzdCLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDdkIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3pDLElBQUksY0FBYyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxNQUFrQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsZ0VBQWdFO0FBQ2hFLFNBQVMsTUFBTSxDQUE0QixLQUFRLEVBQUUsUUFBZ0I7SUFDbkUsT0FBTyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExha2ViYXNlLWJhY2tlZCBNYXN0cmEgbWVtb3J5IHdpcmluZy5cbiAqXG4gKiBQcm92aWRlcyBhIHtAbGluayBNZW1vcnlCdWlsZGVyfSB0aGF0IG1pbnRzIG9uZSBgTWVtb3J5YCBwZXIgYWdlbnRcbiAqIHdpdGggdHdvIGluZGVwZW5kZW50IGtub2JzOlxuICpcbiAqIC0gKipTdG9yYWdlKiogKHRocmVhZHMgLyBtZXNzYWdlcyB2aWEgYFBvc3RncmVzU3RvcmVgKTogZGVmYXVsdHMgdG9cbiAqICAgKipwZXItYWdlbnQqKiBuYW1lc3BhY2luZyB2aWEge0BsaW5rIGFnZW50U3RvcmFnZVNjaGVtYU5hbWV9IHNvXG4gKiAgIGNvbnZlcnNhdGlvbiBoaXN0b3J5IHN0YXlzIGlzb2xhdGVkIGJldHdlZW4gYWdlbnRzIGluIHRoZSBzYW1lXG4gKiAgIGRhdGFiYXNlLiBgUG9zdGdyZXNTdG9yZWAgYXV0by1jcmVhdGVzIHRoZSBzY2hlbWEgd2l0aFxuICogICBgQ1JFQVRFIFNDSEVNQSBJRiBOT1QgRVhJU1RTYCBvbiBpbml0LiBBIGZhaWxlZCBtaWdyYXRpb24gKGNvbW1vbiBvblxuICogICBMYWtlYmFzZSB3aGVuIHRoZSBjb25uZWN0aW5nIHJvbGUgaXMgbm90IHRoZSB0YWJsZSBvd25lcikgaXMgbG9nZ2VkXG4gKiAgIGFuZCBza2lwcGVkIHZpYSB7QGxpbmsgd2l0aFNvZnRTdG9yYWdlSW5pdH0gc28gZXhpc3RpbmcgdGFibGVzIGtlZXBcbiAqICAgc2VydmluZyBpbnN0ZWFkIG9mIHJldHJ5aW5nIERETCBvbiBldmVyeSByZXF1ZXN0LlxuICogLSAqKk1lbW9yeSoqIChzZW1hbnRpYyByZWNhbGwgdmlhIGBQZ1ZlY3RvcmApOiBkZWZhdWx0cyB0byBhIHNpbmdsZVxuICogICAqKnNoYXJlZCoqIGluc3RhbmNlIGFjcm9zcyBldmVyeSBhZ2VudC4gQ3Jvc3MtYWdlbnQgcmVjYWxsIG9uIG9uZVxuICogICBpbmRleCBpcyBhbG1vc3QgYWx3YXlzIHdoYXQgdXNlcnMgd2FudDsgb3B0IGludG8gcGVyLWFnZW50IHJlY2FsbFxuICogICBieSBwYXNzaW5nIGEge0BsaW5rIE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlfSBvbiB0aGUgYWdlbnQuXG4gKlxuICogQWRkaXRpb25hbGx5LCB7QGxpbmsgTWVtb3J5QnVpbGRlci5pbnN0YW5jZVN0b3JhZ2V9IHJldHVybnMgYVxuICogKipNYXN0cmEtaW5zdGFuY2UtbGV2ZWwqKiBgUG9zdGdyZXNTdG9yZWAgKHNjaGVtYSBgbWFzdHJhX2luc3RhbmNlYClcbiAqIHVzZWQgZm9yIHdvcmtmbG93IHNuYXBzaG90cyAtIHRoZSBwZXJzaXN0ZW5jZSBsYXllclxuICogYGFnZW50LnJlc3VtZVN0cmVhbSgpYCByZWFkcyBmcm9tIHdoZW4gd2FraW5nIGEgc3VzcGVuZGVkXG4gKiBgcmVxdWlyZUFwcHJvdmFsYCB0b29sIGNhbGwuIFBlci1hZ2VudCBzdG9yZXMgYXJlIG5vdCBlbm91Z2ggZm9yXG4gKiB0aGlzOiB3b3JrZmxvdyBydW5zIGFyZSBzY29wZWQgdG8gdGhlIE1hc3RyYSBpbnN0YW5jZSwgbm90IGFuXG4gKiBpbmRpdmlkdWFsIGFnZW50J3MgYE1lbW9yeWAuXG4gKlxuICogUGx1Z2luLWxldmVsIGBjb25maWcuc3RvcmFnZWAgLyBgY29uZmlnLm1lbW9yeWAgYWN0IGFzIHRoZSBiYXNlbGluZVxuICogKGF1dG8tZGVmYXVsdGVkIHRvIGB0cnVlYCBpbiBgcGx1Z2luLnRzYCB3aGVuIHRoZSBgbGFrZWJhc2VgIHBsdWdpblxuICogaXMgcmVnaXN0ZXJlZCk7IHBlci1hZ2VudCBzZXR0aW5ncyBjYXNjYWRlIG9uIHRvcCBvZiB0aGF0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRVc2VybmFtZVdpdGhBcGlMb29rdXAgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBtaWdyYXRpb24gYXMgYXBwa2l0TWlncmF0aW9uIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBwb3N0Z3Jlc0Nvbm5lY3Rpb25PcHRpb25zIH0gZnJvbSBcIkBkYngtdG9vbHMvcG9zdGdyZXNcIjtcbmltcG9ydCB7IGhhc2gsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50TWVtb3J5T3B0aW9uIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHtcbiAgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSxcbiAgTUFTVFJBX1RIUkVBRF9JRF9LRVksXG4gIHR5cGUgUmVxdWVzdENvbnRleHQsXG59IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBmYXN0ZW1iZWQgfSBmcm9tIFwiQG1hc3RyYS9mYXN0ZW1iZWRcIjtcbmltcG9ydCB7IE1lbW9yeSB9IGZyb20gXCJAbWFzdHJhL21lbW9yeVwiO1xuaW1wb3J0IHsgUGdWZWN0b3IsIFBvc3RncmVzU3RvcmUgfSBmcm9tIFwiQG1hc3RyYS9wZ1wiO1xuaW1wb3J0IHsgUG9vbCwgdHlwZSBQb29sQ29uZmlnIH0gZnJvbSBcInBnXCI7XG5cbmltcG9ydCB0eXBlIHsgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uLCBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZSB9IGZyb20gXCIuL2FnZW50cy50c1wiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IGFnZW50U3RvcmFnZVNjaGVtYU5hbWUgfSBmcm9tIFwiLi9zdG9yYWdlLXNjaGVtYS50c1wiO1xuaW1wb3J0IHsgc3VtbWFyeU1vZGVsLCBUSVRMRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zdW1tYXJpemUudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9tZW1vcnlcIik7XG5cbi8qKiBSZXNvbHZlIHRoZSB0cnVzdGVkIE1hc3RyYSBtZW1vcnkgc2NvcGUgc3RhbXBlZCBieSBBcHBLaXQgbWlkZGxld2FyZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0TWVtb3J5U2NvcGUoXG4gIHJlcXVlc3RDb250ZXh0OiBQaWNrPFJlcXVlc3RDb250ZXh0LCBcImdldFwiPiB8IHVuZGVmaW5lZCxcbik6IEFnZW50TWVtb3J5T3B0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdGhyZWFkSWQgPSByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9USFJFQURfSURfS0VZKTtcbiAgY29uc3QgcmVzb3VyY2VJZCA9IHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSk7XG4gIGlmICh0eXBlb2YgdGhyZWFkSWQgIT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHJlc291cmNlSWQgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7IHRocmVhZDogdGhyZWFkSWQsIHJlc291cmNlOiByZXNvdXJjZUlkIH07XG59XG5cbi8qKiBPdmVybGF5IHRydXN0ZWQgcmVxdWVzdCBtZW1vcnkgaWRlbnRpZmllcnMgb250byBNYXN0cmEgZXhlY3V0aW9uIG9wdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFJlcXVlc3RNZW1vcnlTY29wZTxUIGV4dGVuZHMgb2JqZWN0PihcbiAgb3B0aW9uczogVCxcbiAgcmVxdWVzdENvbnRleHQ6IFBpY2s8UmVxdWVzdENvbnRleHQsIFwiZ2V0XCI+IHwgdW5kZWZpbmVkLFxuKTogVCAmIHsgbWVtb3J5PzogQWdlbnRNZW1vcnlPcHRpb24gfSB7XG4gIGNvbnN0IHNjb3BlID0gcmVxdWVzdE1lbW9yeVNjb3BlKHJlcXVlc3RDb250ZXh0KTtcbiAgaWYgKCFzY29wZSkgcmV0dXJuIG9wdGlvbnM7XG4gIGNvbnN0IG1lbW9yeSA9IChvcHRpb25zIGFzIHsgbWVtb3J5PzogQWdlbnRNZW1vcnlPcHRpb24gfSkubWVtb3J5O1xuICByZXR1cm4ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbWVtb3J5OiB7XG4gICAgICAuLi5tZW1vcnksXG4gICAgICAuLi5zY29wZSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFNvZnRlbiB7QGxpbmsgUG9zdGdyZXNTdG9yZS5pbml0fSBzbyBhIGZhaWxlZCBtaWdyYXRpb24gKGUuZy4gTGFrZWJhc2VcbiAqIGBtdXN0IGJlIG93bmVyIG9mIHRhYmxlIOKApmAgb24gYEFMVEVSYCkgaXMgbG9nZ2VkIG9uY2UgaW5zdGVhZCBvZiByZXRocm93blxuICogb24gZXZlcnkgc3RvcmFnZSBjYWxsLlxuICpcbiAqIE1hc3RyYSdzIGBhdWdtZW50V2l0aEluaXRgIHJldHJpZXMgaW5pdCBmb3JldmVyIHdoZW4gaXQgdGhyb3dzLCBzbyB0aGVcbiAqIG9ubHkgd2F5IHRvIGtlZXAgc2VydmluZyBhZ2FpbnN0IGFuIGFscmVhZHktdXNhYmxlIHNjaGVtYSBpcyB0byB0cmVhdFxuICogbWlncmF0aW9uIGZhaWx1cmUgYXMgc3VjY2VzcyBhbmQgbWFyayB0aGUgc3RvcmUgaW5pdGlhbGl6ZWQuXG4gKlxuICogQ29uY3VycmVudCBmaXJzdCBjYWxsZXJzIHNoYXJlIG9uZSBzb2Z0IGF0dGVtcHQuIE5vbi1vd25lcnNoaXAgZmFpbHVyZXMgc3RheVxuICogZmF0YWwgc28gbWlzc2luZyBzY2hlbWFzL3RhYmxlcyBhcmUgcmV0cmllZCBvciBzdXJmYWNlZCBpbnN0ZWFkIG9mIGhpZGRlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTb2Z0U3RvcmFnZUluaXQoc3RvcmU6IFBvc3RncmVzU3RvcmUpOiBQb3N0Z3Jlc1N0b3JlIHtcbiAgY29uc3Qgc29mdCA9IHN0b3JlIGFzIHVua25vd24gYXMge1xuICAgIGluaXQ6ICgpID0+IFByb21pc2U8dm9pZD47XG4gICAgaWQ6IHN0cmluZztcbiAgICBzY2hlbWE/OiBzdHJpbmc7XG4gICAgaXNJbml0aWFsaXplZDogYm9vbGVhbjtcbiAgfTtcbiAgY29uc3Qgb3JpZ2luYWxJbml0ID0gc29mdC5pbml0LmJpbmQoc29mdCk7XG4gIGxldCBzb2Z0SW5pdFByb21pc2U6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG5cbiAgc29mdC5pbml0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChzb2Z0LmlzSW5pdGlhbGl6ZWQpIHJldHVybjtcbiAgICBzb2Z0SW5pdFByb21pc2UgPz89IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBvcmlnaW5hbEluaXQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWFwcGtpdE1pZ3JhdGlvbi5oYW5kbGVPd25lcnNoaXBNaWdyYXRpb25FcnJvcihlcnIsIHtcbiAgICAgICAgICAgIHNjb3BlOiBcIm1hc3RyYS1zdG9yYWdlXCIsXG4gICAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgICBldmVudDogXCJtYXN0cmEgc3RvcmFnZSBtaWdyYXRpb24gZmFpbGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiB7IHN0b3JlSWQ6IHNvZnQuaWQsIHNjaGVtYTogc29mdC5zY2hlbWEgfSxcbiAgICAgICAgICB9KVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzb2Z0SW5pdFByb21pc2U7XG4gICAgICBzb2Z0LmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc29mdEluaXRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHN0b3JlO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgZGVkaWNhdGVkICoqc2VydmljZS1wcmluY2lwYWwqKiBMYWtlYmFzZSBwb29sIGZvciBNYXN0cmFcbiAqIG1lbW9yeSBmcm9tIHRoZSBsYWtlYmFzZSBwbHVnaW4ncyByZXNvbHZlZCBTUCBwZyBjb25maWcuXG4gKlxuICogVGhlIHBsdWdpbidzIGBleHBvcnRzKCkucG9vbGAgaXMgYSBgUm91dGluZ1Bvb2xgIHRoYXQgc3dpdGNoZXMgdG9cbiAqIHRoZSBwZXItdXNlciAoT0JPKSBwb29sIHdoZW5ldmVyIGEgcXVlcnkgcnVucyBpbnNpZGUgYW4gYGFzVXNlcmBcbiAqIHNjb3BlIC0gZXhhY3RseSB0aGUgY29udGV4dCB0aGUgbWFzdHJhIHBsdWdpbiBlc3RhYmxpc2hlcyBhcm91bmRcbiAqIGV2ZXJ5IGNoYXQgdHVybi4gTWVtb3J5ICh0aHJlYWRzIC8gbWVzc2FnZXMgKyBzZW1hbnRpYyByZWNhbGwpIG11c3RcbiAqIGluc3RlYWQgYWx3YXlzIGFjdCBhcyB0aGUgYXBwIHNlcnZpY2UgcHJpbmNpcGFsOiBpdCBvd25zIHRoZVxuICogYXV0by1jcmVhdGVkIGBtYXN0cmFfKmAgc2NoZW1hcyAoYSBwZXItdXNlciByb2xlIHVzdWFsbHkgY2FuJ3RcbiAqIGBDUkVBVEUgU0NIRU1BYCkgYW5kIGlzIHNoYXJlZCBhY3Jvc3MgdXNlcnMsIHNvIGl0IGNhbm5vdCBpbmhlcml0IGFcbiAqIHJlcXVlc3QncyBPQk8gaWRlbnRpdHkuXG4gKlxuICogYHBnQ29uZmlnYCBtdXN0IGJlIHRoZSBwbHVnaW4ncyBgZXhwb3J0cygpLmdldFBnQ29uZmlnKClgIGV2YWx1YXRlZFxuICogKipvdXRzaWRlKiogYW55IGBhc1VzZXJgIHNjb3BlIChpLmUuIGR1cmluZyBzZXR1cCksIHNvIGl0IGNhcnJpZXNcbiAqIHRoZSBTUCBjb25uZWN0aW9uIHRhcmdldCwgT0F1dGggdG9rZW4tcmVmcmVzaCBgcGFzc3dvcmRgIGNhbGxiYWNrLFxuICogYW5kIGFueSBgbGFrZWJhc2UoeyBwb29sIH0pYCB0dW5pbmcgb3ZlcnJpZGVzIC0gYWxsIG9mIHdoaWNoIHRoaXNcbiAqIHBvb2wgaW5oZXJpdHMuIFNlZSB0aGUgY2FsbCBzaXRlIGluIGBwbHVnaW4udHNgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2VydmljZVByaW5jaXBhbFBvb2wocGdDb25maWc6IFBvb2xDb25maWcpOiBQcm9taXNlPFBvb2w+IHtcbiAgLy8gYGdldFBnQ29uZmlnKClgIHJlc29sdmVzIHRoZSBTUCB1c2VybmFtZSBzeW5jaHJvbm91c2x5IGZyb21cbiAgLy8gYFBHVVNFUmAgLyBgREFUQUJSSUNLU19DTElFTlRfSURgOyBmYWxsIGJhY2sgdG8gdGhlIGFzeW5jIEFQSVxuICAvLyBsb29rdXAgKGUuZy4gbG9jYWwgZGV2IGF1dGhlbnRpY2F0aW5nIHZpYSBQQVQpIHNvIHRoZSBwb29sIGFsd2F5c1xuICAvLyBoYXMgYW4gaWRlbnRpdHkgdG8gY29ubmVjdCB3aXRoLlxuICBjb25zdCB1c2VyID0gcGdDb25maWcudXNlciA/PyAoYXdhaXQgZ2V0VXNlcm5hbWVXaXRoQXBpTG9va3VwKCkpO1xuICByZXR1cm4gbmV3IFBvb2wocG9zdGdyZXNDb25uZWN0aW9uT3B0aW9ucyh7IC4uLnBnQ29uZmlnLCB1c2VyIH0pKTtcbn1cblxuLyoqIEVmZmVjdGl2ZSBwZXIta25vYiBzZXR0aW5nIGFmdGVyIHRoZSBwbHVnaW4vYWdlbnQgY2FzY2FkZS4gKi9cbnR5cGUgU3RvcmFnZVNldHRpbmcgPSBBbnlNYXN0cmFBZ2VudERlZmluaXRpb25bXCJzdG9yYWdlXCJdO1xudHlwZSBNZW1vcnlTZXR0aW5nID0gQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW1wibWVtb3J5XCJdO1xuXG4vKipcbiAqIFRydWUgd2hlbiBhbnkgcGx1Z2luLWxldmVsIG9yIHBlci1hZ2VudCBzZXR0aW5nIGNvdWxkIG5lZWQgdGhlXG4gKiBMYWtlYmFzZSBwb29sLiBVc2VkIGJ5IGBwbHVnaW4udHNgIHRvIGdhdGUgY3JlYXRpb24gb2YgdGhlXG4gKiBzZXJ2aWNlLXByaW5jaXBhbCBwb29sIGFuZCB0aGUge0BsaW5rIE1lbW9yeUJ1aWxkZXJ9IHRoYXQgY29uc3VtZXNcbiAqIGl0OyB3aGVuIGZhbHNlIG5laXRoZXIgaXMgYnVpbHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZWVkc0xha2ViYXNlKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmIChzZXR0aW5nTmVlZHNTaGFyZWRQb29sKGNvbmZpZy5zdG9yYWdlKSkgcmV0dXJuIHRydWU7XG4gIGlmIChzZXR0aW5nTmVlZHNTaGFyZWRQb29sKGNvbmZpZy5tZW1vcnkpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgZGVmcyA9IGNvbGxlY3RBZ2VudERlZmluaXRpb25zKGNvbmZpZyk7XG4gIHJldHVybiBkZWZzLnNvbWUoKGQpID0+IHNldHRpbmdOZWVkc1NoYXJlZFBvb2woZC5zdG9yYWdlKSB8fCBzZXR0aW5nTmVlZHNTaGFyZWRQb29sKGQubWVtb3J5KSk7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGEgcGVyLWFnZW50IHtAbGluayBNZW1vcnl9IGZhY3RvcnkgYm91bmQgdG8gdGhlIHN1cHBsaWVkXG4gKiBzZXJ2aWNlLXByaW5jaXBhbCBwb29sIChzZWUge0BsaW5rIGNyZWF0ZVNlcnZpY2VQcmluY2lwYWxQb29sfSkuXG4gKiBDYWNoZXMgdGhlIHNoYXJlZCBgUGdWZWN0b3JgIHNpbmdsZXRvbiAoYnVpbHQgb24gZmlyc3QgbmVlZCkgc28gZWFjaFxuICogYWdlbnQgYnVpbGQgaXMgTygxKSBhZnRlciB0aGUgZmlyc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZW1vcnlCdWlsZGVyKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgc2VydmljZVByaW5jaXBhbFBvb2w6IFBvb2wsXG4pOiBNZW1vcnlCdWlsZGVyIHtcbiAgcmV0dXJuIG5ldyBNZW1vcnlCdWlsZGVyKGNvbmZpZywgc2VydmljZVByaW5jaXBhbFBvb2wpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBvbmUgYE1lbW9yeWAgcGVyIGFnZW50IGFnYWluc3QgYSBzaGFyZWQgc2VydmljZS1wcmluY2lwYWxcbiAqIExha2ViYXNlIHBvb2wuIFBlci1pbnN0YW5jZSBzdGF0ZSBrZWVwcyB0aGUgc2hhcmVkIGBQZ1ZlY3RvcmAgYWxpdmVcbiAqIGFjcm9zcyBjYWxscyBzbyByZWdpc3RlcmluZyBOIGFnZW50cyBzdGF5cyBjaGVhcC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1lbW9yeUJ1aWxkZXIge1xuICBwcml2YXRlIHNoYXJlZFZlY3RvcjogUGdWZWN0b3IgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2VQcmluY2lwYWxQb29sOiBQb29sLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBNYXN0cmEtaW5zdGFuY2UtbGV2ZWwgc3RvcmFnZSB1c2VkIGZvciB3b3JrZmxvd1xuICAgKiBzbmFwc2hvdHMuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiBwbHVnaW4tbGV2ZWwgYHN0b3JhZ2VgIGlzXG4gICAqIGRpc2FibGVkLCBpbiB3aGljaCBjYXNlIGBhZ2VudC5yZXN1bWVTdHJlYW0oKWAgKGFuZCB0aGVyZWZvcmVcbiAgICogdGhlIGByZXF1aXJlQXBwcm92YWxgIGZsb3cpIHdpbGwgbm90IGJlIGF2YWlsYWJsZS5cbiAgICpcbiAgICogVGhlIHN0b3JlIGxpdmVzIGluIGEgZGVkaWNhdGVkIGBtYXN0cmFfaW5zdGFuY2VgIHNjaGVtYSBzbyBpdFxuICAgKiBuZXZlciBjb2xsaWRlcyB3aXRoIHBlci1hZ2VudCB7QGxpbmsgYWdlbnRTdG9yYWdlU2NoZW1hTmFtZX0gbmFtZXNwYWNlcy5cbiAgICogV29ya2Zsb3cgc25hcHNob3RzIGFyZSBub3QgcGVyLWFnZW50IHN0YXRlOyB0aGV5IGJlbG9uZyB0byB0aGVcbiAgICogYE1hc3RyYWAgaW5zdGFuY2UgdGhhdCBvd25zIHRoZSB3b3JrZmxvdyBleGVjdXRpb24uXG4gICAqL1xuICBpbnN0YW5jZVN0b3JhZ2UoKTogUG9zdGdyZXNTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2V0dGluZyA9IHRoaXMuY29uZmlnLnN0b3JhZ2U7XG4gICAgaWYgKCFzZXR0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2Ygc2V0dGluZyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHdpdGhTb2Z0U3RvcmFnZUluaXQoXG4gICAgICAgIG5ldyBQb3N0Z3Jlc1N0b3JlKFxuICAgICAgICAgIHdpdGhJZChzZXR0aW5nLCBcIm1hc3RyYS1zdG9yZV9faW5zdGFuY2VcIikgYXMgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFxuICAgICAgICAgICAgdHlwZW9mIFBvc3RncmVzU3RvcmVcbiAgICAgICAgICA+WzBdLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHdpdGhTb2Z0U3RvcmFnZUluaXQoXG4gICAgICBuZXcgUG9zdGdyZXNTdG9yZSh7XG4gICAgICAgIGlkOiBcIm1hc3RyYS1zdG9yZV9faW5zdGFuY2VcIixcbiAgICAgICAgc2NoZW1hTmFtZTogXCJtYXN0cmFfaW5zdGFuY2VcIixcbiAgICAgICAgcG9vbDogdGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbCxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBgTWVtb3J5YCBmb3IgYGFnZW50SWRgIGFmdGVyIHRoZSBwbHVnaW4vYWdlbnQgY2FzY2FkZS5cbiAgICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSBhZ2VudCBoYXMgbmVpdGhlciBzdG9yYWdlIG5vciBhXG4gICAqIHZlY3RvciBzdG9yZSBlbmFibGVkIC0gTWFzdHJhIGFjY2VwdHMgYSBtaXNzaW5nIGBtZW1vcnlgIGZpZWxkXG4gICAqIGFuZCB0cmVhdHMgdGhlIGFnZW50IGFzIHN0YXRlbGVzcy5cbiAgICovXG4gIGZvckFnZW50KGFnZW50SWQ6IHN0cmluZywgZGVmOiBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24pOiBNZW1vcnkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHN0b3JhZ2VTZXR0aW5nID0gZGVmLnN0b3JhZ2UgPz8gdGhpcy5jb25maWcuc3RvcmFnZTtcbiAgICBjb25zdCBtZW1vcnlTZXR0aW5nID0gZGVmLm1lbW9yeSA/PyB0aGlzLmNvbmZpZy5tZW1vcnk7XG5cbiAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5idWlsZFN0b3JhZ2UoYWdlbnRJZCwgc3RvcmFnZVNldHRpbmcpO1xuICAgIGNvbnN0IHZlY3RvciA9IHRoaXMuYnVpbGRWZWN0b3IobWVtb3J5U2V0dGluZyk7XG4gICAgaWYgKCFzdG9yYWdlICYmICF2ZWN0b3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImFnZW50OnN0YXRlbGVzc1wiLCB7IGFnZW50SWQgfSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGxvZ2dlci5kZWJ1ZyhcImFnZW50OmNvbmZpZ3VyZWRcIiwge1xuICAgICAgYWdlbnRJZCxcbiAgICAgIHN0b3JhZ2U6IHN0b3JhZ2UgIT09IHVuZGVmaW5lZCxcbiAgICAgIHZlY3RvcjogdmVjdG9yICE9PSB1bmRlZmluZWQsXG4gICAgICB2ZWN0b3JNb2RlOlxuICAgICAgICB2ZWN0b3IgPT09IHVuZGVmaW5lZCA/IFwib2ZmXCIgOiB0eXBlb2YgbWVtb3J5U2V0dGluZyA9PT0gXCJvYmplY3RcIiA/IFwiZGVkaWNhdGVkXCIgOiBcInNoYXJlZFwiLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBNZW1vcnkoe1xuICAgICAgLi4uKHN0b3JhZ2UgPyB7IHN0b3JhZ2UgfSA6IHt9KSxcbiAgICAgIC4uLih2ZWN0b3IgPyB7IHZlY3RvciwgZW1iZWRkZXI6IGZhc3RlbWJlZCB9IDoge30pLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBsYXN0TWVzc2FnZXM6IDEwLFxuICAgICAgICAuLi4odmVjdG9yID8geyBzZW1hbnRpY1JlY2FsbDogeyB0b3BLOiAzLCBtZXNzYWdlUmFuZ2U6IDIgfSB9IDoge30pLFxuICAgICAgICAvLyBBdXRvLW5hbWUgZWFjaCB0aHJlYWQgZnJvbSBpdHMgb3BlbmluZyB0dXJuIHNvIHRoZVxuICAgICAgICAvLyBjb252ZXJzYXRpb24gbGlzdCB0aGUgVUkgcmVuZGVycyBzaG93cyBtZWFuaW5nZnVsIHRpdGxlc1xuICAgICAgICAvLyBpbnN0ZWFkIG9mIHJhdyBpZHMuIFRpdGxpbmcgcnVucyBvbiB0aGUgc21hbGwgLyBmYXN0IGNoYXRcbiAgICAgICAgLy8gdGllciAoc2VlIGBzdW1tYXJpemUudHNgKSByYXRoZXIgdGhhbiB0aGUgYWdlbnQncyBwcmltYXJ5XG4gICAgICAgIC8vIG1vZGVsLCBzbyBuYW1pbmcgYSB0aHJlYWQgbmV2ZXIgc3BlbmRzIHRoZSBoZWF2eXdlaWdodCBtb2RlbC5cbiAgICAgICAgLy8gT25seSBtZWFuaW5nZnVsIHdoZW4gc3RvcmFnZSBpcyBvbjsgaGFybWxlc3Mgb3RoZXJ3aXNlLlxuICAgICAgICAuLi4oc3RvcmFnZVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBnZW5lcmF0ZVRpdGxlOiB7XG4gICAgICAgICAgICAgICAgbW9kZWw6IHN1bW1hcnlNb2RlbCh0aGlzLmNvbmZpZyksXG4gICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBUSVRMRV9JTlNUUlVDVElPTlMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFN0b3JhZ2UoYWdlbnRJZDogc3RyaW5nLCBzZXR0aW5nOiBTdG9yYWdlU2V0dGluZyk6IFBvc3RncmVzU3RvcmUgfCB1bmRlZmluZWQge1xuICAgIGlmICghc2V0dGluZykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHNldHRpbmcgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gd2l0aFNvZnRTdG9yYWdlSW5pdChcbiAgICAgICAgbmV3IFBvc3RncmVzU3RvcmUoe1xuICAgICAgICAgIGlkOiBgbWFzdHJhLXN0b3JlX18ke2FnZW50SWR9YCxcbiAgICAgICAgICBzY2hlbWFOYW1lOiBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lKGFnZW50SWQpLFxuICAgICAgICAgIHBvb2w6IHRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gQ2FzdDogYHdpdGhJZGAgZ3VhcmFudGVlcyBgaWRgIGlzIHNldCwgYnV0IHRoZSBkaXN0cmlidXRpdmVcbiAgICAvLyBPbWl0ICsgYGlkPzogc3RyaW5nYCBzaGFwZSBkb2Vzbid0IHN0cnVjdHVyYWxseSBuYXJyb3cgdG8gdGhlXG4gICAgLy8gZGlzY3JpbWluYXRlZCB1bmlvbiBtZW1iZXJzLiBSdW50aW1lIHNoYXBlIGlzIGlkZW50aWNhbC5cbiAgICByZXR1cm4gd2l0aFNvZnRTdG9yYWdlSW5pdChcbiAgICAgIG5ldyBQb3N0Z3Jlc1N0b3JlKFxuICAgICAgICB3aXRoSWQoc2V0dGluZywgYG1hc3RyYS1zdG9yZV9fJHthZ2VudElkfWApIGFzIENvbnN0cnVjdG9yUGFyYW1ldGVyczxcbiAgICAgICAgICB0eXBlb2YgUG9zdGdyZXNTdG9yZVxuICAgICAgICA+WzBdLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGFnZW50J3MgdmVjdG9yIHN0b3JlLiBDYXNjYWRlOlxuICAgKlxuICAgKiAtIGZhbHN5OiBubyB2ZWN0b3IuXG4gICAqIC0gYGJvb2xlYW5gIC8gYHVuZGVmaW5lZC1pbmhlcml0aW5nLXRydWVgOiByZXR1cm4gdGhlIHNoYXJlZFxuICAgKiAgIHNpbmdsZXRvbiAoYnVpbHQgbGF6aWx5IG9uIGZpcnN0IGNhbGwpLiBBbGwgYWdlbnRzIHRoYXRcbiAgICogICBkZWZhdWx0LWVuYWJsZSBtZW1vcnkgd3JpdGUgaW50byBhbmQgcmVjYWxsIGZyb20gb25lIGluZGV4LlxuICAgKiAtIG9iamVjdDogYnVpbGQgYSBkZWRpY2F0ZWQgYFBnVmVjdG9yYCBmb3IgdGhpcyBhZ2VudC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRWZWN0b3Ioc2V0dGluZzogTWVtb3J5U2V0dGluZyk6IFBnVmVjdG9yIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXNldHRpbmcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBzZXR0aW5nID09PSBcImJvb2xlYW5cIikgcmV0dXJuIHRoaXMuZ2V0U2hhcmVkVmVjdG9yKCk7XG4gICAgcmV0dXJuIGJ1aWxkUGdWZWN0b3Ioc2V0dGluZyk7XG4gIH1cblxuICBwcml2YXRlIGdldFNoYXJlZFZlY3RvcigpOiBQZ1ZlY3RvciB7XG4gICAgaWYgKCF0aGlzLnNoYXJlZFZlY3Rvcikge1xuICAgICAgdGhpcy5zaGFyZWRWZWN0b3IgPSBidWlsZFNoYXJlZFBnVmVjdG9yKHRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaGFyZWRWZWN0b3I7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgc2hhcmVkIGBQZ1ZlY3RvcmAgdGhhdCBiYWNrcyB0aGUgZGVmYXVsdFxuICogYGRlZi5tZW1vcnkgPT09IHRydWVgIGNhc2UgYWNyb3NzIGV2ZXJ5IGFnZW50LlxuICpcbiAqIGBQZ1ZlY3RvcmAncyBjb25zdHJ1Y3RvciBhY2NlcHRzIG9ubHkgY29ubmVjdGlvbi1zdHlsZSBjb25maWdzXG4gKiAoYEhvc3RDb25maWdgIC8gYENvbm5lY3Rpb25TdHJpbmdDb25maWdgIC8gYENsaWVudENvbmZpZ2ApOyB0aGVyZSBpc1xuICogbm8gYHsgcG9vbCB9YCBzaG9ydGhhbmQgdGhlIHdheSBgUG9zdGdyZXNTdG9yZWAgaGFzIG9uZS4gV29yc2UsIHRoZVxuICogY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBraWNrcyBvZmYgYSBgY2FjaGVXYXJtdXBQcm9taXNlYCBJSUZFIHRoYXRcbiAqIGNhbGxzIGB0aGlzLnBvb2wuY29ubmVjdCgpYCBiZWZvcmUgcmV0dXJuaW5nLCBzbyB3ZSBjYW4ndCBjbGVhbmx5XG4gKiBoYW5kIGl0IGFuIGluZXJ0IGNvbmZpZyBhbmQgcGF0Y2ggdGhlIHBvb2wgYWZ0ZXJ3YXJkcy5cbiAqXG4gKiBUaGUgdHJpY2s6IHBhc3MgaWxsZWdhbC1idXQtdmFsaWRhdGlvbi1wYXNzaW5nIHBsYWNlaG9sZGVycyBzbyB0aGVcbiAqIHdhcm11cCdzIGBuZXQuY29ubmVjdCgpYCByZWplY3RzIHN5bmNocm9ub3VzbHkgd2l0aCBgUmFuZ2VFcnJvcmBcbiAqIChOb2RlIHZhbGlkYXRlcyBgMCA8PSBwb3J0IDwgNjU1MzZgKS4gVGhlIElJRkUncyBgY2F0Y2gge31gIHN3YWxsb3dzXG4gKiBpdCwgbm8gRE5TIGxvb2t1cCBvciBUQ1AgYXR0ZW1wdCBoYXBwZW5zLCBhbmQgd2UgdGhlbiBzd2FwXG4gKiBgcGdWZWN0b3IucG9vbGAgdG8gdGhlIGxha2ViYXNlIHBvb2wuIEV2ZXJ5IHN1YnNlcXVlbnQgYFBnVmVjdG9yYFxuICogbWV0aG9kIHJlYWRzIGB0aGlzLnBvb2xgIGF0IGNhbGwgdGltZSwgc28gYWxsIHJlYWwgSS9PIGdvZXMgdGhyb3VnaFxuICogdGhlIGxha2ViYXNlIHBvb2wgZnJvbSB0aGVuIG9uLiBUaGUgcGxhY2Vob2xkZXIgcG9vbCBpcyBgLmVuZCgpYCdkXG4gKiBzbyBpdHMgc29ja2V0IGJvb2sta2VlcGluZyBpcyByZWxlYXNlZC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTaGFyZWRQZ1ZlY3Rvcihwb29sOiBQb29sKTogUGdWZWN0b3Ige1xuICBjb25zdCB2ZWN0b3IgPSBuZXcgUGdWZWN0b3Ioe1xuICAgIGlkOiBgcGcke2hhc2guaWQoKX1gLFxuICAgIC8vIEtlZXAgdGhlIHJlY2FsbCBpbmRleCBvdXQgb2YgYHB1YmxpY2A6IG9uIGEgTGFrZWJhc2UgZGF0YWJhc2UgdGhlIGFwcFxuICAgIC8vIHNlcnZpY2UgcHJpbmNpcGFsIGhhcyBubyBDUkVBVEUgb24gYHB1YmxpY2AgKFBHMTUrIGxvY2tzIGl0IGRvd24pLCBzbyBhXG4gICAgLy8gZGVmYXVsdC1zY2hlbWEgUGdWZWN0b3IgZmFpbHMgb24gQ1JFQVRFIElOREVYIHdpdGggXCJwZXJtaXNzaW9uIGRlbmllZCBmb3JcbiAgICAvLyBzY2hlbWEgcHVibGljXCIuIFBnVmVjdG9yIHJ1bnMgQ1JFQVRFIFNDSEVNQSBJRiBOT1QgRVhJU1RTIGZvciBhIG5hbWVkXG4gICAgLy8gc2NoZW1hLCBzbyB0aGUgU1AgY3JlYXRlcyBhbmQgb3ducyBgbWFzdHJhX2luc3RhbmNlYCAodGhlIHNhbWVcbiAgICAvLyBpbnN0YW5jZS1sZXZlbCBzY2hlbWEgdGhlIHdvcmtmbG93LXNuYXBzaG90IHN0b3JlIHVzZXMpIGFuZCB0aGUgaW5kZXhcbiAgICAvLyBsYW5kcyB0aGVyZS4gVGFibGUgbmFtZXMgZG9uJ3QgY29sbGlkZSB3aXRoIHRoZSBzdG9yYWdlIHRhYmxlcy5cbiAgICBzY2hlbWFOYW1lOiBcIm1hc3RyYV9pbnN0YW5jZVwiLFxuICAgIGhvc3Q6IFwiLTFcIixcbiAgICBwb3J0OiAtMSxcbiAgICBkYXRhYmFzZTogXCJfXCIsXG4gICAgdXNlcjogXCJfXCIsXG4gICAgcGFzc3dvcmQ6IFwiX1wiLFxuICB9KTtcbiAgY29uc3QgcGxhY2Vob2xkZXIgPSB2ZWN0b3IucG9vbDtcbiAgdmVjdG9yLnBvb2wgPSBwb29sO1xuICB2b2lkIHBsYWNlaG9sZGVyLmVuZCgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gIHJldHVybiB2ZWN0b3I7XG59XG5cbi8qKiBQZXItYWdlbnQgZGVkaWNhdGVkIGBQZ1ZlY3RvcmAgKHJhcmU7IG9wdC1pbiB2aWEgb2JqZWN0IG92ZXJyaWRlKS4gKi9cbmZ1bmN0aW9uIGJ1aWxkUGdWZWN0b3Ioc2V0dGluZzogTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGUpOiBQZ1ZlY3RvciB7XG4gIHJldHVybiBuZXcgUGdWZWN0b3IoXG4gICAgd2l0aElkKHNldHRpbmcsIGBwZy12ZWN0b3JfXyR7aGFzaC5pZCgpfWApIGFzIENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgUGdWZWN0b3I+WzBdLFxuICApO1xufVxuXG4vKiogVHJ1ZSB3aGVuIHRoaXMgc2V0dGluZyByZXF1aXJlcyB0aGUgc2hhcmVkIExha2ViYXNlIHBvb2wuICovXG5mdW5jdGlvbiBzZXR0aW5nTmVlZHNTaGFyZWRQb29sKHNldHRpbmc6IFN0b3JhZ2VTZXR0aW5nIHwgTWVtb3J5U2V0dGluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2V0dGluZyA9PT0gdHJ1ZTtcbn1cblxuLyoqIFdhbGsgdGhlIHRocmVlIHNoYXBlcyBvZiBgY29uZmlnLmFnZW50c2AgaW50byBhIGZsYXQgbGlzdC4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RBZ2VudERlZmluaXRpb25zKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW10ge1xuICBjb25zdCBhZ2VudHMgPSBjb25maWcuYWdlbnRzO1xuICBpZiAoIWFnZW50cykgcmV0dXJuIFtdO1xuICBpZiAoQXJyYXkuaXNBcnJheShhZ2VudHMpKSByZXR1cm4gYWdlbnRzO1xuICBpZiAoXCJpbnN0cnVjdGlvbnNcIiBpbiBhZ2VudHMpIHtcbiAgICByZXR1cm4gW2FnZW50cyBhcyBBbnlNYXN0cmFBZ2VudERlZmluaXRpb25dO1xuICB9XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGFnZW50cyk7XG59XG5cbi8qKiBGaWxsIGluIGEgZGVmYXVsdCBgaWRgIHdoZW4gdGhlIGNhbGxlciBkaWRuJ3Qgc3VwcGx5IG9uZS4gKi9cbmZ1bmN0aW9uIHdpdGhJZDxUIGV4dGVuZHMgeyBpZD86IHN0cmluZyB9Pih2YWx1ZTogVCwgZmFsbGJhY2s6IHN0cmluZyk6IFQge1xuICByZXR1cm4gdmFsdWUuaWQgPyB2YWx1ZSA6IHsgLi4udmFsdWUsIGlkOiBmYWxsYmFjayB9O1xufVxuIl19