@dbx-tools/appkit-mastra 0.9.74 → 0.9.79

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.
@@ -1,194 +1,251 @@
1
1
  /**
2
- * AppKit-backed caching for Databricks workspace skill mounts.
2
+ * User-scoped workspace skill catalogues cached as one semantic record.
3
3
  *
4
4
  * @module
5
5
  */
6
- import { randomUUID } from "node:crypto";
7
6
  import { CacheManager } from "@databricks/appkit";
8
- import { hash, object } from "@dbx-tools/shared-core";
9
- import { filesystems } from "./filesystems.js";
10
- const CACHE_NAMESPACE = "mastra:workspace-skills";
11
- const DEFAULT_MAX_SCOPED_MOUNTS = 256;
12
- const scopedMounts = new Map();
13
- /** Default remote skill metadata and content cache lifetime. */
7
+ import { errorUtils, log, object } from "@dbx-tools/shared-core";
8
+ import { posixPath } from "@dbx-tools/shared-fs";
9
+ import { LRUCache } from "lru-cache";
10
+ import { parse as parseYaml } from "yaml";
11
+ import { z } from "zod";
12
+ const CACHE_NAMESPACE = "mastra:workspace-skill-catalogue";
13
+ const CATALOGUE_VERSION = 1;
14
+ const MAX_SCOPED_CATALOGUES = 256;
15
+ const logger = log.logger("mastra/skill-cache");
16
+ const SkillCatalogueEntrySchema = z
17
+ .object({
18
+ name: z.string().describe("Unique skill name from SKILL.md frontmatter."),
19
+ description: z.string().describe("Skill description from SKILL.md frontmatter."),
20
+ instructions: z.string().describe("Markdown instructions below SKILL.md frontmatter."),
21
+ sourceId: z.string().describe("Identity of the mounted source that owns this skill."),
22
+ sourcePath: z.string().describe("Path to SKILL.md relative to its source root."),
23
+ signature: z
24
+ .string()
25
+ .optional()
26
+ .describe("Stable metadata signature used to retain unchanged instructions."),
27
+ })
28
+ .describe("One parsed skill in a materialized workspace catalogue.");
29
+ const SkillCatalogueSchema = z
30
+ .object({
31
+ version: z.literal(CATALOGUE_VERSION).describe("Persisted catalogue schema version."),
32
+ generatedAt: z.string().datetime().describe("Time the catalogue was last refreshed."),
33
+ roots: z.array(z.string()).describe("Ordered source identities included in the catalogue."),
34
+ skills: z
35
+ .array(SkillCatalogueEntrySchema)
36
+ .describe("Parsed skills after ordered duplicate-name precedence is applied."),
37
+ })
38
+ .describe("One user-scoped materialized workspace skill catalogue.");
39
+ const scopedCatalogues = new LRUCache({
40
+ max: MAX_SCOPED_CATALOGUES,
41
+ });
42
+ /** Default lifetime for one complete workspace skill catalogue. */
14
43
  export const DEFAULT_WORKSPACE_SKILL_CACHE_TTL_MS = 5 * 60 * 1000;
15
- /**
16
- * Cache read-only filesystem operations through AppKit while delegating
17
- * mutations to the current request's source.
18
- */
19
- export class AppKitCachedFileSystem {
20
- backend = "appkit-cache";
21
- id;
22
- readOnly;
23
- root;
24
- source;
44
+ /** Materialized catalogue with one AppKit cache record and fresh auxiliary reads. */
45
+ export class WorkspaceSkillCatalogue {
46
+ options;
47
+ cacheKey;
25
48
  host;
26
- ttlSec;
27
49
  userKey;
50
+ lastValid;
51
+ ttlMs;
52
+ sources;
28
53
  constructor(options) {
54
+ this.options = options;
29
55
  this.host = options.host;
30
- this.source = options.source;
31
- this.root = options.source.root;
32
- this.readOnly = options.source.readOnly;
33
- this.ttlSec = cacheTtlSec(options.ttlMs);
34
56
  this.userKey = options.userKey;
35
- this.id = `appkit-skill-cache-${hash.fnvHash(this.host, this.userKey, this.root)}`;
57
+ this.sources = options.sources;
58
+ this.ttlMs = positiveTtl(options.ttlMs);
59
+ this.cacheKey = object.toStableKey({
60
+ host: options.host,
61
+ roots: options.sources.map(({ id }) => id),
62
+ userKey: options.userKey,
63
+ version: CATALOGUE_VERSION,
64
+ });
36
65
  }
37
- /** Rebind cache misses and writes to the current request's OBO filesystem. */
38
- bind(source) {
39
- if (source.root !== this.root || source.readOnly !== this.readOnly) {
40
- throw new Error("Cannot rebind a workspace skill cache to a different filesystem scope");
66
+ /** Rebind refreshes and lazy reads to the current request's filesystem clients. */
67
+ bind(sources) {
68
+ const identities = sources.map(({ id }) => id);
69
+ if (object.toStableKey(identities) !== object.toStableKey(this.sources.map(({ id }) => id))) {
70
+ throw new Error("Cannot rebind a skill catalogue to a different ordered root set");
71
+ }
72
+ this.sources = sources;
73
+ }
74
+ /** Return the cached catalogue, refreshing all roots once on cache miss. */
75
+ async get(signal) {
76
+ const cache = CacheManager.getInstanceSync();
77
+ try {
78
+ const catalogue = SkillCatalogueSchema.parse(await cache.getOrExecute([CACHE_NAMESPACE, CATALOGUE_VERSION, this.options.host, this.rootKey()], () => this.refresh(), this.options.userKey, {
79
+ ttl: Math.max(1, Math.ceil(this.ttlMs / 1000)),
80
+ callerSignal: signal,
81
+ }));
82
+ this.lastValid = catalogue;
83
+ return catalogue;
84
+ }
85
+ catch (error) {
86
+ if (!this.lastValid)
87
+ throw error;
88
+ logger.warn("skill catalogue refresh failed; retaining last valid catalogue", {
89
+ error: errorUtils.errorMessage(error),
90
+ roots: this.sources.map(({ id }) => id),
91
+ });
92
+ return this.lastValid;
41
93
  }
42
- this.source = source;
43
- }
44
- async init() {
45
- await this.source.init();
46
- }
47
- /** Keep the shared scope alive when one request releases its workspace view. */
48
- close() {
49
- return Promise.resolve();
50
- }
51
- resolvePath(inputPath) {
52
- return this.source.resolvePath(inputPath);
53
- }
54
- async readFile(inputPath, options) {
55
- const value = await this.cached("readFile", inputPath, undefined, async (source) => ({
56
- base64: Buffer.from(await source.readFile(inputPath)).toString("base64"),
57
- }));
58
- const bytes = Buffer.from(value.base64, "base64");
59
- return options?.encoding ? bytes.toString(options.encoding) : bytes;
60
- }
61
- async writeFile(inputPath, content, options) {
62
- await this.mutate((source) => source.writeFile(inputPath, content, options));
63
- }
64
- async appendFile(inputPath, content) {
65
- await this.mutate((source) => source.appendFile(inputPath, content));
66
- }
67
- async deleteFile(inputPath, options) {
68
- await this.mutate((source) => source.deleteFile(inputPath, options));
69
- }
70
- async copyFile(sourcePath, destinationPath, options) {
71
- await this.mutate((source) => source.copyFile(sourcePath, destinationPath, options));
72
- }
73
- async moveFile(sourcePath, destinationPath, options) {
74
- await this.mutate((source) => source.moveFile(sourcePath, destinationPath, options));
75
- }
76
- async mkdir(inputPath, options) {
77
- await this.mutate((source) => source.mkdir(inputPath, options));
78
- }
79
- async rmdir(inputPath, options) {
80
- await this.mutate((source) => source.rmdir(inputPath, options));
81
- }
82
- async readdir(inputPath, options) {
83
- return this.cached("readdir", inputPath, options, (source) => source.readdir(inputPath, options));
84
- }
85
- async exists(inputPath) {
86
- return this.cached("exists", inputPath, undefined, (source) => source.exists(inputPath));
87
- }
88
- async stat(inputPath) {
89
- const value = await this.cached("stat", inputPath, undefined, async (source) => serializeStat(await source.stat(inputPath)));
90
- return deserializeStat(value);
91
94
  }
92
- /** Rotate this scope's cache generation so the next read reloads it. */
95
+ /** Expire this complete catalogue without touching unrelated cache entries. */
93
96
  async invalidate() {
94
- const cache = await CacheManager.getInstance();
95
- await cache.set(this.generationKey(cache), randomUUID(), {
96
- ttl: this.ttlSec * 2,
97
+ const cache = CacheManager.getInstanceSync();
98
+ await cache.delete(this.persistentKey(cache));
99
+ }
100
+ /** Read one selected skill's auxiliary file directly from its current source. */
101
+ async readSkillFile(skillName, inputPath, signal) {
102
+ signal?.throwIfAborted();
103
+ const catalogue = await this.get(signal);
104
+ const skill = catalogue.skills.find(({ name }) => name === skillName);
105
+ if (!skill)
106
+ throw new Error(`Unknown skill: ${skillName}`);
107
+ const normalized = posixPath.normalize(inputPath);
108
+ if (!normalized.ok ||
109
+ normalized.path === "/" ||
110
+ inputPath.split("/").some((segment) => segment === "..")) {
111
+ throw new Error(`Invalid skill file path: ${inputPath}`);
112
+ }
113
+ const source = this.sources.find(({ id }) => id === skill.sourceId);
114
+ if (!source)
115
+ throw new Error(`Skill source is no longer mounted: ${skill.sourceId}`);
116
+ const parent = skill.sourcePath.split("/").slice(0, -1).join("/");
117
+ const path = [parent, normalized.path.replace(/^\/+/, "")].filter(Boolean).join("/");
118
+ return source.read(path);
119
+ }
120
+ async refresh() {
121
+ const previous = new Map(this.lastValid?.skills.map((skill) => [`${skill.sourceId}\0${skill.sourcePath}`, skill]) ?? []);
122
+ const selected = new Map();
123
+ for (const source of this.sources) {
124
+ for (const candidate of await discoverSkillFiles(source)) {
125
+ const prior = previous.get(`${source.id}\0${candidate.path}`);
126
+ const signature = fileSignature(candidate.entry);
127
+ let parsed;
128
+ if (signature && prior?.signature === signature) {
129
+ parsed = prior;
130
+ }
131
+ else {
132
+ parsed = parseSkill(await source.read(candidate.path), candidate.path);
133
+ }
134
+ if (!parsed || selected.has(parsed.name))
135
+ continue;
136
+ selected.set(parsed.name, {
137
+ ...parsed,
138
+ sourceId: source.id,
139
+ sourcePath: candidate.path,
140
+ ...(signature ? { signature } : {}),
141
+ });
142
+ }
143
+ }
144
+ return SkillCatalogueSchema.parse({
145
+ version: CATALOGUE_VERSION,
146
+ generatedAt: new Date().toISOString(),
147
+ roots: this.sources.map(({ id }) => id),
148
+ skills: [...selected.values()],
97
149
  });
98
150
  }
99
- async cached(operation, inputPath, options, load) {
100
- const source = this.source;
101
- const cache = await CacheManager.getInstance();
102
- const generation = await this.generation(cache);
103
- return cache.getOrExecute([
104
- CACHE_NAMESPACE,
105
- this.host,
106
- this.root,
107
- generation,
108
- operation,
109
- source.resolvePath(inputPath),
110
- object.toStableKey(options ?? {}),
111
- ], () => load(source), this.userKey, { ttl: this.ttlSec });
112
- }
113
- async generation(cache) {
114
- return cache.getOrExecute([CACHE_NAMESPACE, "generation", this.host, this.root], async () => randomUUID(), this.userKey, { ttl: this.ttlSec * 2 });
115
- }
116
- generationKey(cache) {
117
- return cache.generateKey([CACHE_NAMESPACE, "generation", this.host, this.root], this.userKey);
151
+ rootKey() {
152
+ return object.toStableKey(this.sources.map(({ id }) => id));
118
153
  }
119
- async mutate(run) {
120
- const source = this.source;
121
- await run(source);
122
- await this.invalidate();
154
+ persistentKey(cache) {
155
+ return cache.generateKey([CACHE_NAMESPACE, CATALOGUE_VERSION, this.options.host, this.rootKey()], this.options.userKey);
123
156
  }
124
157
  }
125
- /** Return one stable Mastra mount per resolved user, host, and source root. */
126
- export function cachedWorkspaceSkillMount(options) {
127
- const cacheKey = object.toStableKey({
158
+ /** Return one stable catalogue owner for a user, host, and ordered root set. */
159
+ export function workspaceSkillCatalogue(options) {
160
+ const key = object.toStableKey({
128
161
  host: options.host,
129
- readOnly: options.source.readOnly,
130
- root: options.source.root,
162
+ roots: options.sources.map(({ id }) => id),
131
163
  userKey: options.userKey,
132
164
  });
133
- const existing = scopedMounts.get(cacheKey);
165
+ const existing = scopedCatalogues.get(key);
134
166
  if (existing) {
135
- existing.cache.bind(options.source);
136
- scopedMounts.delete(cacheKey);
137
- scopedMounts.set(cacheKey, existing);
138
- return { cacheKey, filesystem: existing.adapter };
167
+ existing.bind(options.sources);
168
+ return existing;
139
169
  }
140
- const cache = new AppKitCachedFileSystem(options);
141
- const entry = {
142
- adapter: filesystems(cache, {
143
- id: cache.id,
144
- readOnly: options.source.readOnly,
145
- }),
146
- cache,
147
- host: options.host,
148
- root: options.source.root,
149
- userKey: options.userKey,
150
- };
151
- scopedMounts.set(cacheKey, entry);
152
- trimScopedMounts();
153
- return { cacheKey, filesystem: entry.adapter };
170
+ const catalogue = new WorkspaceSkillCatalogue(options);
171
+ scopedCatalogues.set(key, catalogue);
172
+ return catalogue;
154
173
  }
155
- /** Invalidate one user's cached workspace skill scope. */
174
+ /** Invalidate matching complete catalogues and retain their stable owners. */
156
175
  export async function clearWorkspaceSkillCache(options) {
157
- const matches = [...scopedMounts.entries()].filter(([, entry]) => entry.host === options.host &&
158
- entry.userKey === options.userKey &&
159
- (options.root === undefined || entry.root === options.root));
160
- await Promise.all(matches.map(([, entry]) => entry.cache.invalidate()));
176
+ const matches = [...scopedCatalogues.values()].filter((catalogue) => catalogue.host === options.host &&
177
+ (options.userKey === undefined || catalogue.userKey === options.userKey));
178
+ await Promise.all(matches.map((catalogue) => catalogue.invalidate()));
161
179
  }
162
- function cacheTtlSec(ttlMs = DEFAULT_WORKSPACE_SKILL_CACHE_TTL_MS) {
163
- if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
164
- throw new Error("Workspace skill cache ttlMs must be a positive finite number");
165
- }
166
- return Math.max(1, Math.ceil(ttlMs / 1000));
180
+ async function discoverSkillFiles(source) {
181
+ let rootEntries;
182
+ try {
183
+ rootEntries = await source.list(".");
184
+ }
185
+ catch (error) {
186
+ if (errorUtils.errorContext(error).notAccessible)
187
+ return [];
188
+ throw error;
189
+ }
190
+ const candidates = [];
191
+ const rootSkill = rootEntries.find(({ name, type }) => name.toLowerCase() === "skill.md" && type === "file");
192
+ if (rootSkill)
193
+ candidates.push({ entry: rootSkill, path: rootSkill.name });
194
+ await Promise.all(rootEntries
195
+ .filter(({ type }) => type === "directory")
196
+ .map(async (directory) => {
197
+ const entries = await source.list(directory.name);
198
+ const skill = entries.find(({ name, type }) => name.toLowerCase() === "skill.md" && type === "file");
199
+ if (skill)
200
+ candidates.push({ entry: skill, path: posixPath.join(directory.name, skill.name) });
201
+ }));
202
+ return candidates.sort((left, right) => left.path.localeCompare(right.path));
167
203
  }
168
- function serializeStat(value) {
169
- const { accessedAt, createdAt, modifiedAt, ...stat } = value;
204
+ function parseSkill(source, path) {
205
+ const match = /^---\s*\r?\n([\s\S]*?)\r?\n---\s*(?:\r?\n|$)([\s\S]*)$/.exec(source);
206
+ if (!match) {
207
+ logger.warn("skill skipped (missing YAML frontmatter)", { path });
208
+ return undefined;
209
+ }
210
+ const metadata = parseYaml(match[1]);
211
+ if (!object.isRecord(metadata)) {
212
+ logger.warn("skill skipped (invalid YAML frontmatter)", { path });
213
+ return undefined;
214
+ }
215
+ const parsed = z
216
+ .object({
217
+ name: z.string().trim().min(1),
218
+ description: z.string().trim().min(1),
219
+ })
220
+ .safeParse(metadata);
221
+ if (!parsed.success) {
222
+ logger.warn("skill skipped (invalid metadata)", {
223
+ path,
224
+ error: parsed.error.message,
225
+ });
226
+ return undefined;
227
+ }
170
228
  return {
171
- ...stat,
172
- ...(accessedAt ? { accessedAt: accessedAt.getTime() } : {}),
173
- ...(createdAt ? { createdAt: createdAt.getTime() } : {}),
174
- ...(modifiedAt ? { modifiedAt: modifiedAt.getTime() } : {}),
229
+ name: parsed.data.name,
230
+ description: parsed.data.description,
231
+ instructions: match[2].trim(),
175
232
  };
176
233
  }
177
- function deserializeStat(value) {
178
- const { accessedAt, createdAt, modifiedAt, ...stat } = value;
179
- return {
180
- ...stat,
181
- ...(accessedAt !== undefined ? { accessedAt: new Date(accessedAt) } : {}),
182
- ...(createdAt !== undefined ? { createdAt: new Date(createdAt) } : {}),
183
- ...(modifiedAt !== undefined ? { modifiedAt: new Date(modifiedAt) } : {}),
234
+ function fileSignature(entry) {
235
+ const metadata = object.isRecord(entry.metadata) ? entry.metadata : {};
236
+ const values = {
237
+ modifiedAt: metadata.modifiedAt,
238
+ objectId: metadata.objectId,
239
+ size: entry.size,
184
240
  };
241
+ return Object.values(values).some((value) => value !== undefined)
242
+ ? object.toStableKey(values)
243
+ : undefined;
185
244
  }
186
- function trimScopedMounts() {
187
- while (scopedMounts.size > DEFAULT_MAX_SCOPED_MOUNTS) {
188
- const oldest = scopedMounts.keys().next().value;
189
- if (oldest === undefined)
190
- return;
191
- scopedMounts.delete(oldest);
245
+ function positiveTtl(value = DEFAULT_WORKSPACE_SKILL_CACHE_TTL_MS) {
246
+ if (!Number.isFinite(value) || value <= 0) {
247
+ throw new RangeError("Workspace skill catalogue ttlMs must be a positive finite number");
192
248
  }
249
+ return value;
193
250
  }
194
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tpbGwtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2tpbGwtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFjdEQsT0FBTyxFQUFFLFdBQVcsRUFBZ0MsTUFBTSxrQkFBa0IsQ0FBQztBQUU3RSxNQUFNLGVBQWUsR0FBRyx5QkFBeUIsQ0FBQztBQUNsRCxNQUFNLHlCQUF5QixHQUFHLEdBQUcsQ0FBQztBQWdCdEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7QUFFekQsZ0VBQWdFO0FBQ2hFLE1BQU0sQ0FBQyxNQUFNLG9DQUFvQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBZ0JsRTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sc0JBQXNCO0lBQ3hCLE9BQU8sR0FBRyxjQUF1QixDQUFDO0lBQ2xDLEVBQUUsQ0FBUztJQUNYLFFBQVEsQ0FBVTtJQUNsQixJQUFJLENBQVM7SUFFZCxNQUFNLENBQWE7SUFDVixJQUFJLENBQVM7SUFDYixNQUFNLENBQVM7SUFDZixPQUFPLENBQVM7SUFFakMsWUFBWSxPQUFzQztRQUNoRCxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN4QyxJQUFJLENBQUMs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QUM5QixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0LWJhY2tlZCBjYWNoaW5nIGZvciBEYXRhYnJpY2tzIHdvcmtzcGFjZSBza2lsbCBtb3VudHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IENhY2hlTWFuYWdlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGhhc2gsIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvcHlPcHRpb25zLFxuICBGaWxlQ29udGVudCxcbiAgRmlsZUVudHJ5LFxuICBGaWxlU3RhdCxcbiAgRmlsZVN5c3RlbSxcbiAgTGlzdE9wdGlvbnMsXG4gIE1ha2VEaXJlY3RvcnlPcHRpb25zLFxuICBSZWFkRmlsZU9wdGlvbnMsXG4gIFJlbW92ZU9wdGlvbnMsXG4gIFdyaXRlRmlsZU9wdGlvbnMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuXG5pbXBvcnQgeyBmaWxlc3lzdGVtcywgdHlwZSBNYXN0cmFGaWxlU3lzdGVtQWRhcHRlciB9IGZyb20gXCIuL2ZpbGVzeXN0ZW1zLnRzXCI7XG5cbmNvbnN0IENBQ0hFX05BTUVTUEFDRSA9IFwibWFzdHJhOndvcmtzcGFjZS1za2lsbHNcIjtcbmNvbnN0IERFRkFVTFRfTUFYX1NDT1BFRF9NT1VOVFMgPSAyNTY7XG5cbmludGVyZmFjZSBDYWNoZWRGaWxlU3RhdCBleHRlbmRzIE9taXQ8RmlsZVN0YXQsIFwiYWNjZXNzZWRBdFwiIHwgXCJjcmVhdGVkQXRcIiB8IFwibW9kaWZpZWRBdFwiPiB7XG4gIGFjY2Vzc2VkQXQ/OiBudW1iZXI7XG4gIGNyZWF0ZWRBdD86IG51bWJlcjtcbiAgbW9kaWZpZWRBdD86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFNjb3BlZE1vdW50RW50cnkge1xuICBhZGFwdGVyOiBNYXN0cmFGaWxlU3lzdGVtQWRhcHRlcjtcbiAgY2FjaGU6IEFwcEtpdENhY2hlZEZpbGVTeXN0ZW07XG4gIGhvc3Q6IHN0cmluZztcbiAgcm9vdDogc3RyaW5nO1xuICB1c2VyS2V5OiBzdHJpbmc7XG59XG5cbmNvbnN0IHNjb3BlZE1vdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBTY29wZWRNb3VudEVudHJ5PigpO1xuXG4vKiogRGVmYXVsdCByZW1vdGUgc2tpbGwgbWV0YWRhdGEgYW5kIGNvbnRlbnQgY2FjaGUgbGlmZXRpbWUuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9XT1JLU1BBQ0VfU0tJTExfQ0FDSEVfVFRMX01TID0gNSAqIDYwICogMTAwMDtcblxuLyoqIE9wdGlvbnMgZm9yIG9uZSBBcHBLaXQtY2FjaGVkIHdvcmtzcGFjZSBza2lsbCBmaWxlc3lzdGVtLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBLaXRDYWNoZWRGaWxlU3lzdGVtT3B0aW9ucyB7XG4gIGhvc3Q6IHN0cmluZztcbiAgc291cmNlOiBGaWxlU3lzdGVtO1xuICB0dGxNcz86IG51bWJlcjtcbiAgdXNlcktleTogc3RyaW5nO1xufVxuXG4vKiogU3RhYmxlIE1hc3RyYSBtb3VudCBwbHVzIHRoZSBpZGVudGl0eSBrZXkgdXNlZCBmb3Igc291cmNlIHJldXNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYWNoZWRXb3Jrc3BhY2VTa2lsbE1vdW50IHtcbiAgY2FjaGVLZXk6IHN0cmluZztcbiAgZmlsZXN5c3RlbTogTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXI7XG59XG5cbi8qKlxuICogQ2FjaGUgcmVhZC1vbmx5IGZpbGVzeXN0ZW0gb3BlcmF0aW9ucyB0aHJvdWdoIEFwcEtpdCB3aGlsZSBkZWxlZ2F0aW5nXG4gKiBtdXRhdGlvbnMgdG8gdGhlIGN1cnJlbnQgcmVxdWVzdCdzIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwcEtpdENhY2hlZEZpbGVTeXN0ZW0gaW1wbGVtZW50cyBGaWxlU3lzdGVtPFwiYXBwa2l0LWNhY2hlXCI+IHtcbiAgcmVhZG9ubHkgYmFja2VuZCA9IFwiYXBwa2l0LWNhY2hlXCIgYXMgY29uc3Q7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlYWRPbmx5OiBib29sZWFuO1xuICByZWFkb25seSByb290OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBzb3VyY2U6IEZpbGVTeXN0ZW07XG4gIHByaXZhdGUgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHR0bFNlYzogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJLZXk6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBBcHBLaXRDYWNoZWRGaWxlU3lzdGVtT3B0aW9ucykge1xuICAgIHRoaXMuaG9zdCA9IG9wdGlvbnMuaG9zdDtcbiAgICB0aGlzLnNvdXJjZSA9IG9wdGlvbnMuc291cmNlO1xuICAgIHRoaXMucm9vdCA9IG9wdGlvbnMuc291cmNlLnJvb3Q7XG4gICAgdGhpcy5yZWFkT25seSA9IG9wdGlvbnMuc291cmNlLnJlYWRPbmx5O1xuICAgIHRoaXMudHRsU2VjID0gY2FjaGVUdGxTZWMob3B0aW9ucy50dGxNcyk7XG4gICAgdGhpcy51c2VyS2V5ID0gb3B0aW9ucy51c2VyS2V5O1xuICAgIHRoaXMuaWQgPSBgYXBwa2l0LXNraWxsLWNhY2hlLSR7aGFzaC5mbnZIYXNoKHRoaXMuaG9zdCwgdGhpcy51c2VyS2V5LCB0aGlzLnJvb3QpfWA7XG4gIH1cblxuICAvKiogUmViaW5kIGNhY2hlIG1pc3NlcyBhbmQgd3JpdGVzIHRvIHRoZSBjdXJyZW50IHJlcXVlc3QncyBPQk8gZmlsZXN5c3RlbS4gKi9cbiAgYmluZChzb3VyY2U6IEZpbGVTeXN0ZW0pOiB2b2lkIHtcbiAgICBpZiAoc291cmNlLnJvb3QgIT09IHRoaXMucm9vdCB8fCBzb3VyY2UucmVhZE9ubHkgIT09IHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZWJpbmQgYSB3b3Jrc3BhY2Ugc2tpbGwgY2FjaGUgdG8gYSBkaWZmZXJlbnQgZmlsZXN5c3RlbSBzY29wZVwiKTtcbiAgICB9XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gIH1cblxuICBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc291cmNlLmluaXQoKTtcbiAgfVxuXG4gIC8qKiBLZWVwIHRoZSBzaGFyZWQgc2NvcGUgYWxpdmUgd2hlbiBvbmUgcmVxdWVzdCByZWxlYXNlcyBpdHMgd29ya3NwYWNlIHZpZXcuICovXG4gIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIHJlc29sdmVQYXRoKGlucHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2UucmVzb2x2ZVBhdGgoaW5wdXRQYXRoKTtcbiAgfVxuXG4gIGFzeW5jIHJlYWRGaWxlKGlucHV0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxVaW50OEFycmF5PjtcbiAgYXN5bmMgcmVhZEZpbGUoXG4gICAgaW5wdXRQYXRoOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUmVhZEZpbGVPcHRpb25zICYgeyBlbmNvZGluZzogc3RyaW5nIH0sXG4gICk6IFByb21pc2U8c3RyaW5nPjtcbiAgYXN5bmMgcmVhZEZpbGUoaW5wdXRQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZWFkRmlsZU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZyB8IFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuY2FjaGVkKFwicmVhZEZpbGVcIiwgaW5wdXRQYXRoLCB1bmRlZmluZWQsIGFzeW5jIChzb3VyY2UpID0+ICh7XG4gICAgICBiYXNlNjQ6IEJ1ZmZlci5mcm9tKGF3YWl0IHNvdXJjZS5yZWFkRmlsZShpbnB1dFBhdGgpKS50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICB9KSk7XG4gICAgY29uc3QgYnl0ZXMgPSBCdWZmZXIuZnJvbSh2YWx1ZS5iYXNlNjQsIFwiYmFzZTY0XCIpO1xuICAgIHJldHVybiBvcHRpb25zPy5lbmNvZGluZyA/IGJ5dGVzLnRvU3RyaW5nKG9wdGlvbnMuZW5jb2RpbmcgYXMgQnVmZmVyRW5jb2RpbmcpIDogYnl0ZXM7XG4gIH1cblxuICBhc3luYyB3cml0ZUZpbGUoXG4gICAgaW5wdXRQYXRoOiBzdHJpbmcsXG4gICAgY29udGVudDogRmlsZUNvbnRlbnQsXG4gICAgb3B0aW9ucz86IFdyaXRlRmlsZU9wdGlvbnMsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubXV0YXRlKChzb3VyY2UpID0+IHNvdXJjZS53cml0ZUZpbGUoaW5wdXRQYXRoLCBjb250ZW50LCBvcHRpb25zKSk7XG4gIH1cblxuICBhc3luYyBhcHBlbmRGaWxlKGlucHV0UGF0aDogc3RyaW5nLCBjb250ZW50OiBGaWxlQ29udGVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubXV0YXRlKChzb3VyY2UpID0+IHNvdXJjZS5hcHBlbmRGaWxlKGlucHV0UGF0aCwgY29udGVudCkpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlRmlsZShpbnB1dFBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlbW92ZU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm11dGF0ZSgoc291cmNlKSA9PiBzb3VyY2UuZGVsZXRlRmlsZShpbnB1dFBhdGgsIG9wdGlvbnMpKTtcbiAgfVxuXG4gIGFzeW5jIGNvcHlGaWxlKFxuICAgIHNvdXJjZVBhdGg6IHN0cmluZyxcbiAgICBkZXN0aW5hdGlvblBhdGg6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29weU9wdGlvbnMsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubXV0YXRlKChzb3VyY2UpID0+IHNvdXJjZS5jb3B5RmlsZShzb3VyY2VQYXRoLCBkZXN0aW5hdGlvblBhdGgsIG9wdGlvbnMpKTtcbiAgfVxuXG4gIGFzeW5jIG1vdmVGaWxlKFxuICAgIHNvdXJjZVBhdGg6IHN0cmluZyxcbiAgICBkZXN0aW5hdGlvblBhdGg6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29weU9wdGlvbnMsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubXV0YXRlKChzb3VyY2UpID0+IHNvdXJjZS5tb3ZlRmlsZShzb3VyY2VQYXRoLCBkZXN0aW5hdGlvblBhdGgsIG9wdGlvbnMpKTtcbiAgfVxuXG4gIGFzeW5jIG1rZGlyKGlucHV0UGF0aDogc3RyaW5nLCBvcHRpb25zPzogTWFrZURpcmVjdG9yeU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm11dGF0ZSgoc291cmNlKSA9PiBzb3VyY2UubWtkaXIoaW5wdXRQYXRoLCBvcHRpb25zKSk7XG4gIH1cblxuICBhc3luYyBybWRpcihpbnB1dFBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlbW92ZU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm11dGF0ZSgoc291cmNlKSA9PiBzb3VyY2Uucm1kaXIoaW5wdXRQYXRoLCBvcHRpb25zKSk7XG4gIH1cblxuICBhc3luYyByZWFkZGlyKGlucHV0UGF0aDogc3RyaW5nLCBvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPEZpbGVFbnRyeVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkKFwicmVhZGRpclwiLCBpbnB1dFBhdGgsIG9wdGlvbnMsIChzb3VyY2UpID0+XG4gICAgICBzb3VyY2UucmVhZGRpcihpbnB1dFBhdGgsIG9wdGlvbnMpLFxuICAgICk7XG4gIH1cblxuICBhc3luYyBleGlzdHMoaW5wdXRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWQoXCJleGlzdHNcIiwgaW5wdXRQYXRoLCB1bmRlZmluZWQsIChzb3VyY2UpID0+IHNvdXJjZS5leGlzdHMoaW5wdXRQYXRoKSk7XG4gIH1cblxuICBhc3luYyBzdGF0KGlucHV0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxGaWxlU3RhdD4ge1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5jYWNoZWQoXCJzdGF0XCIsIGlucHV0UGF0aCwgdW5kZWZpbmVkLCBhc3luYyAoc291cmNlKSA9PlxuICAgICAgc2VyaWFsaXplU3RhdChhd2FpdCBzb3VyY2Uuc3RhdChpbnB1dFBhdGgpKSxcbiAgICApO1xuICAgIHJldHVybiBkZXNlcmlhbGl6ZVN0YXQodmFsdWUpO1xuICB9XG5cbiAgLyoqIFJvdGF0ZSB0aGlzIHNjb3BlJ3MgY2FjaGUgZ2VuZXJhdGlvbiBzbyB0aGUgbmV4dCByZWFkIHJlbG9hZHMgaXQuICovXG4gIGFzeW5jIGludmFsaWRhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICBhd2FpdCBjYWNoZS5zZXQodGhpcy5nZW5lcmF0aW9uS2V5KGNhY2hlKSwgcmFuZG9tVVVJRCgpLCB7XG4gICAgICB0dGw6IHRoaXMudHRsU2VjICogMixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2FjaGVkPFQ+KFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIGlucHV0UGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHVua25vd24sXG4gICAgbG9hZDogKHNvdXJjZTogRmlsZVN5c3RlbSkgPT4gUHJvbWlzZTxUPixcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5zb3VyY2U7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gYXdhaXQgdGhpcy5nZW5lcmF0aW9uKGNhY2hlKTtcbiAgICByZXR1cm4gY2FjaGUuZ2V0T3JFeGVjdXRlKFxuICAgICAgW1xuICAgICAgICBDQUNIRV9OQU1FU1BBQ0UsXG4gICAgICAgIHRoaXMuaG9zdCxcbiAgICAgICAgdGhpcy5yb290LFxuICAgICAgICBnZW5lcmF0aW9uLFxuICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgIHNvdXJjZS5yZXNvbHZlUGF0aChpbnB1dFBhdGgpLFxuICAgICAgICBvYmplY3QudG9TdGFibGVLZXkob3B0aW9ucyA/PyB7fSksXG4gICAgICBdLFxuICAgICAgKCkgPT4gbG9hZChzb3VyY2UpLFxuICAgICAgdGhpcy51c2VyS2V5LFxuICAgICAgeyB0dGw6IHRoaXMudHRsU2VjIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGlvbihjYWNoZTogQ2FjaGVNYW5hZ2VyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gY2FjaGUuZ2V0T3JFeGVjdXRlKFxuICAgICAgW0NBQ0hFX05BTUVTUEFDRSwgXCJnZW5lcmF0aW9uXCIsIHRoaXMuaG9zdCwgdGhpcy5yb290XSxcbiAgICAgIGFzeW5jICgpID0+IHJhbmRvbVVVSUQoKSxcbiAgICAgIHRoaXMudXNlcktleSxcbiAgICAgIHsgdHRsOiB0aGlzLnR0bFNlYyAqIDIgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0aW9uS2V5KGNhY2hlOiBDYWNoZU1hbmFnZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBjYWNoZS5nZW5lcmF0ZUtleShbQ0FDSEVfTkFNRVNQQUNFLCBcImdlbmVyYXRpb25cIiwgdGhpcy5ob3N0LCB0aGlzLnJvb3RdLCB0aGlzLnVzZXJLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBtdXRhdGUocnVuOiAoc291cmNlOiBGaWxlU3lzdGVtKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5zb3VyY2U7XG4gICAgYXdhaXQgcnVuKHNvdXJjZSk7XG4gICAgYXdhaXQgdGhpcy5pbnZhbGlkYXRlKCk7XG4gIH1cbn1cblxuLyoqIFJldHVybiBvbmUgc3RhYmxlIE1hc3RyYSBtb3VudCBwZXIgcmVzb2x2ZWQgdXNlciwgaG9zdCwgYW5kIHNvdXJjZSByb290LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlZFdvcmtzcGFjZVNraWxsTW91bnQoXG4gIG9wdGlvbnM6IEFwcEtpdENhY2hlZEZpbGVTeXN0ZW1PcHRpb25zLFxuKTogQ2FjaGVkV29ya3NwYWNlU2tpbGxNb3VudCB7XG4gIGNvbnN0IGNhY2hlS2V5ID0gb2JqZWN0LnRvU3RhYmxlS2V5KHtcbiAgICBob3N0OiBvcHRpb25zLmhvc3QsXG4gICAgcmVhZE9ubHk6IG9wdGlvbnMuc291cmNlLnJlYWRPbmx5LFxuICAgIHJvb3Q6IG9wdGlvbnMuc291cmNlLnJvb3QsXG4gICAgdXNlcktleTogb3B0aW9ucy51c2VyS2V5LFxuICB9KTtcbiAgY29uc3QgZXhpc3RpbmcgPSBzY29wZWRNb3VudHMuZ2V0KGNhY2hlS2V5KTtcbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgZXhpc3RpbmcuY2FjaGUuYmluZChvcHRpb25zLnNvdXJjZSk7XG4gICAgc2NvcGVkTW91bnRzLmRlbGV0ZShjYWNoZUtleSk7XG4gICAgc2NvcGVkTW91bnRzLnNldChjYWNoZUtleSwgZXhpc3RpbmcpO1xuICAgIHJldHVybiB7IGNhY2hlS2V5LCBmaWxlc3lzdGVtOiBleGlzdGluZy5hZGFwdGVyIH07XG4gIH1cblxuICBjb25zdCBjYWNoZSA9IG5ldyBBcHBLaXRDYWNoZWRGaWxlU3lzdGVtKG9wdGlvbnMpO1xuICBjb25zdCBlbnRyeTogU2NvcGVkTW91bnRFbnRyeSA9IHtcbiAgICBhZGFwdGVyOiBmaWxlc3lzdGVtcyhjYWNoZSwge1xuICAgICAgaWQ6IGNhY2hlLmlkLFxuICAgICAgcmVhZE9ubHk6IG9wdGlvbnMuc291cmNlLnJlYWRPbmx5LFxuICAgIH0pLFxuICAgIGNhY2hlLFxuICAgIGhvc3Q6IG9wdGlvbnMuaG9zdCxcbiAgICByb290OiBvcHRpb25zLnNvdXJjZS5yb290LFxuICAgIHVzZXJLZXk6IG9wdGlvbnMudXNlcktleSxcbiAgfTtcbiAgc2NvcGVkTW91bnRzLnNldChjYWNoZUtleSwgZW50cnkpO1xuICB0cmltU2NvcGVkTW91bnRzKCk7XG4gIHJldHVybiB7IGNhY2hlS2V5LCBmaWxlc3lzdGVtOiBlbnRyeS5hZGFwdGVyIH07XG59XG5cbi8qKiBJbnZhbGlkYXRlIG9uZSB1c2VyJ3MgY2FjaGVkIHdvcmtzcGFjZSBza2lsbCBzY29wZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhcldvcmtzcGFjZVNraWxsQ2FjaGUob3B0aW9uczoge1xuICBob3N0OiBzdHJpbmc7XG4gIHJvb3Q/OiBzdHJpbmc7XG4gIHVzZXJLZXk6IHN0cmluZztcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbWF0Y2hlcyA9IFsuLi5zY29wZWRNb3VudHMuZW50cmllcygpXS5maWx0ZXIoXG4gICAgKFssIGVudHJ5XSkgPT5cbiAgICAgIGVudHJ5Lmhvc3QgPT09IG9wdGlvbnMuaG9zdCAmJlxuICAgICAgZW50cnkudXNlcktleSA9PT0gb3B0aW9ucy51c2VyS2V5ICYmXG4gICAgICAob3B0aW9ucy5yb290ID09PSB1bmRlZmluZWQgfHwgZW50cnkucm9vdCA9PT0gb3B0aW9ucy5yb290KSxcbiAgKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwobWF0Y2hlcy5tYXAoKFssIGVudHJ5XSkgPT4gZW50cnkuY2FjaGUuaW52YWxpZGF0ZSgpKSk7XG59XG5cbmZ1bmN0aW9uIGNhY2hlVHRsU2VjKHR0bE1zID0gREVGQVVMVF9XT1JLU1BBQ0VfU0tJTExfQ0FDSEVfVFRMX01TKTogbnVtYmVyIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodHRsTXMpIHx8IHR0bE1zIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJXb3Jrc3BhY2Ugc2tpbGwgY2FjaGUgdHRsTXMgbXVzdCBiZSBhIHBvc2l0aXZlIGZpbml0ZSBudW1iZXJcIik7XG4gIH1cbiAgcmV0dXJuIE1hdGgubWF4KDEsIE1hdGguY2VpbCh0dGxNcyAvIDEwMDApKTtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplU3RhdCh2YWx1ZTogRmlsZVN0YXQpOiBDYWNoZWRGaWxlU3RhdCB7XG4gIGNvbnN0IHsgYWNjZXNzZWRBdCwgY3JlYXRlZEF0LCBtb2RpZmllZEF0LCAuLi5zdGF0IH0gPSB2YWx1ZTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0LFxuICAgIC4uLihhY2Nlc3NlZEF0ID8geyBhY2Nlc3NlZEF0OiBhY2Nlc3NlZEF0LmdldFRpbWUoKSB9IDoge30pLFxuICAgIC4uLihjcmVhdGVkQXQgPyB7IGNyZWF0ZWRBdDogY3JlYXRlZEF0LmdldFRpbWUoKSB9IDoge30pLFxuICAgIC4uLihtb2RpZmllZEF0ID8geyBtb2RpZmllZEF0OiBtb2RpZmllZEF0LmdldFRpbWUoKSB9IDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZVN0YXQodmFsdWU6IENhY2hlZEZpbGVTdGF0KTogRmlsZVN0YXQge1xuICBjb25zdCB7IGFjY2Vzc2VkQXQsIGNyZWF0ZWRBdCwgbW9kaWZpZWRBdCwgLi4uc3RhdCB9ID0gdmFsdWU7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdCxcbiAgICAuLi4oYWNjZXNzZWRBdCAhPT0gdW5kZWZpbmVkID8geyBhY2Nlc3NlZEF0OiBuZXcgRGF0ZShhY2Nlc3NlZEF0KSB9IDoge30pLFxuICAgIC4uLihjcmVhdGVkQXQgIT09IHVuZGVmaW5lZCA/IHsgY3JlYXRlZEF0OiBuZXcgRGF0ZShjcmVhdGVkQXQpIH0gOiB7fSksXG4gICAgLi4uKG1vZGlmaWVkQXQgIT09IHVuZGVmaW5lZCA/IHsgbW9kaWZpZWRBdDogbmV3IERhdGUobW9kaWZpZWRBdCkgfSA6IHt9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHJpbVNjb3BlZE1vdW50cygpOiB2b2lkIHtcbiAgd2hpbGUgKHNjb3BlZE1vdW50cy5zaXplID4gREVGQVVMVF9NQVhfU0NPUEVEX01PVU5UUykge1xuICAgIGNvbnN0IG9sZGVzdCA9IHNjb3BlZE1vdW50cy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgIGlmIChvbGRlc3QgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHNjb3BlZE1vdW50cy5kZWxldGUob2xkZXN0KTtcbiAgfVxufVxuIl19
251
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tpbGwtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2tpbGwtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFakQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsS0FBSyxJQUFJLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE1BQU0sZUFBZSxHQUFHLGtDQUFrQyxDQUFDO0FBQzNELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUVoRCxNQUFNLHlCQUF5QixHQUFHLENBQUM7S0FDaEMsTUFBTSxDQUFDO0lBQ04sSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsOENBQThDLENBQUM7SUFDekUsV0FBVyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsOENBQThDLENBQUM7SUFDaEYsWUFBWSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsbURBQW1ELENBQUM7SUFDdEYsUUFBUSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsc0RBQXNELENBQUM7SUFDckYsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FB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O1FBQzNCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtLQUNqQixDQUFDO0lBQ0YsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQztRQUMvRCxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDNUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBSyxHQUFHLG9DQUFvQztJQUMvRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDMUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZXItc2NvcGVkIHdvcmtzcGFjZSBza2lsbCBjYXRhbG9ndWVzIGNhY2hlZCBhcyBvbmUgc2VtYW50aWMgcmVjb3JkLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBDYWNoZU1hbmFnZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2csIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBwb3NpeFBhdGggfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZnNcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgTFJVQ2FjaGUgfSBmcm9tIFwibHJ1LWNhY2hlXCI7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZVlhbWwgfSBmcm9tIFwieWFtbFwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuY29uc3QgQ0FDSEVfTkFNRVNQQUNFID0gXCJtYXN0cmE6d29ya3NwYWNlLXNraWxsLWNhdGFsb2d1ZVwiO1xuY29uc3QgQ0FUQUxPR1VFX1ZFUlNJT04gPSAxO1xuY29uc3QgTUFYX1NDT1BFRF9DQVRBTE9HVUVTID0gMjU2O1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9za2lsbC1jYWNoZVwiKTtcblxuY29uc3QgU2tpbGxDYXRhbG9ndWVFbnRyeVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgbmFtZTogei5zdHJpbmcoKS5kZXNjcmliZShcIlVuaXF1ZSBza2lsbCBuYW1lIGZyb20gU0tJTEwubWQgZnJvbnRtYXR0ZXIuXCIpLFxuICAgIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiU2tpbGwgZGVzY3JpcHRpb24gZnJvbSBTS0lMTC5tZCBmcm9udG1hdHRlci5cIiksXG4gICAgaW5zdHJ1Y3Rpb25zOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiTWFya2Rvd24gaW5zdHJ1Y3Rpb25zIGJlbG93IFNLSUxMLm1kIGZyb250bWF0dGVyLlwiKSxcbiAgICBzb3VyY2VJZDogei5zdHJpbmcoKS5kZXNjcmliZShcIklkZW50aXR5IG9mIHRoZSBtb3VudGVkIHNvdXJjZSB0aGF0IG93bnMgdGhpcyBza2lsbC5cIiksXG4gICAgc291cmNlUGF0aDogei5zdHJpbmcoKS5kZXNjcmliZShcIlBhdGggdG8gU0tJTEwubWQgcmVsYXRpdmUgdG8gaXRzIHNvdXJjZSByb290LlwiKSxcbiAgICBzaWduYXR1cmU6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIlN0YWJsZSBtZXRhZGF0YSBzaWduYXR1cmUgdXNlZCB0byByZXRhaW4gdW5jaGFuZ2VkIGluc3RydWN0aW9ucy5cIiksXG4gIH0pXG4gIC5kZXNjcmliZShcIk9uZSBwYXJzZWQgc2tpbGwgaW4gYSBtYXRlcmlhbGl6ZWQgd29ya3NwYWNlIGNhdGFsb2d1ZS5cIik7XG5cbmNvbnN0IFNraWxsQ2F0YWxvZ3VlU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICB2ZXJzaW9uOiB6LmxpdGVyYWwoQ0FUQUxPR1VFX1ZFUlNJT04pLmRlc2NyaWJlKFwiUGVyc2lzdGVkIGNhdGFsb2d1ZSBzY2hlbWEgdmVyc2lvbi5cIiksXG4gICAgZ2VuZXJhdGVkQXQ6IHouc3RyaW5nKCkuZGF0ZXRpbWUoKS5kZXNjcmliZShcIlRpbWUgdGhlIGNhdGFsb2d1ZSB3YXMgbGFzdCByZWZyZXNoZWQuXCIpLFxuICAgIHJvb3RzOiB6LmFycmF5KHouc3RyaW5nKCkpLmRlc2NyaWJlKFwiT3JkZXJlZCBzb3VyY2UgaWRlbnRpdGllcyBpbmNsdWRlZCBpbiB0aGUgY2F0YWxvZ3VlLlwiKSxcbiAgICBza2lsbHM6IHpcbiAgICAgIC5hcnJheShTa2lsbENhdGFsb2d1ZUVudHJ5U2NoZW1hKVxuICAgICAgLmRlc2NyaWJlKFwiUGFyc2VkIHNraWxscyBhZnRlciBvcmRlcmVkIGR1cGxpY2F0ZS1uYW1lIHByZWNlZGVuY2UgaXMgYXBwbGllZC5cIiksXG4gIH0pXG4gIC5kZXNjcmliZShcIk9uZSB1c2VyLXNjb3BlZCBtYXRlcmlhbGl6ZWQgd29ya3NwYWNlIHNraWxsIGNhdGFsb2d1ZS5cIik7XG5cbi8qKiBQYXJzZWQgc2tpbGwgcmV0YWluZWQgaW4gYSBtYXRlcmlhbGl6ZWQgd29ya3NwYWNlIGNhdGFsb2d1ZS4gKi9cbmV4cG9ydCB0eXBlIFNraWxsQ2F0YWxvZ3VlRW50cnkgPSB6LmluZmVyPHR5cGVvZiBTa2lsbENhdGFsb2d1ZUVudHJ5U2NoZW1hPjtcblxuLyoqIFZlcnNpb25lZCBwZXJzaXN0ZWQgc2tpbGwgY2F0YWxvZ3VlLiAqL1xuZXhwb3J0IHR5cGUgU2tpbGxDYXRhbG9ndWUgPSB6LmluZmVyPHR5cGVvZiBTa2lsbENhdGFsb2d1ZVNjaGVtYT47XG5cbi8qKiBPbmUgb3JkZXJlZCBmaWxlc3lzdGVtIHJvb3QgY29udHJpYnV0aW5nIHNraWxscyB0byBhIGNhdGFsb2d1ZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2tpbGxDYXRhbG9ndWVTb3VyY2Uge1xuICAvKiogU3RhYmxlIHNvdXJjZSBpZGVudGl0eSBpbmNsdWRpbmcgaXRzIG1vdW50IHByZWNlZGVuY2UuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBMaXN0IG9uZSBzb3VyY2UtcmVsYXRpdmUgZGlyZWN0b3J5IHdpdGggcHJvdmlkZXIgbWV0YWRhdGEgd2hlbiBhdmFpbGFibGUuICovXG4gIGxpc3QocGF0aDogc3RyaW5nKTogUHJvbWlzZTxTa2lsbENhdGFsb2d1ZUZpbGVFbnRyeVtdPjtcbiAgLyoqIFJlYWQgb25lIHNvdXJjZS1yZWxhdGl2ZSBmaWxlIGZyZXNoIGZyb20gaXRzIG93bmluZyBmaWxlc3lzdGVtLiAqL1xuICByZWFkKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbn1cblxuLyoqIE1pbmltYWwgZGlyZWN0b3J5IG1ldGFkYXRhIHVzZWQgdG8gY29tcGFyZSBvbmUgY2F0YWxvZ3VlIHJlZnJlc2guICovXG5leHBvcnQgaW50ZXJmYWNlIFNraWxsQ2F0YWxvZ3VlRmlsZUVudHJ5IHtcbiAgbWV0YWRhdGE/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIG5hbWU6IHN0cmluZztcbiAgc2l6ZT86IG51bWJlcjtcbiAgdHlwZTogXCJkaXJlY3RvcnlcIiB8IFwiZmlsZVwiO1xufVxuXG4vKiogT3B0aW9ucyBmb3Igb25lIHVzZXItc2NvcGVkIHdvcmtzcGFjZSBza2lsbCBjYXRhbG9ndWUuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtzcGFjZVNraWxsQ2F0YWxvZ3VlT3B0aW9ucyB7XG4gIGhvc3Q6IHN0cmluZztcbiAgc291cmNlczogcmVhZG9ubHkgU2tpbGxDYXRhbG9ndWVTb3VyY2VbXTtcbiAgdHRsTXM/OiBudW1iZXI7XG4gIHVzZXJLZXk6IHN0cmluZztcbn1cblxuLyoqIFJlcXVlc3Qgc3RhdGUgdXNlZCB0byByZXNvbHZlIG9uZSB1c2VyLXNjb3BlZCBjYXRhbG9ndWUgb3duZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFNraWxsQ2F0YWxvZ3VlUmVzb2x2ZUNvbnRleHQge1xuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xufVxuXG4vKiogUmVzb2x2ZSBvbmUgcmVxdWVzdCdzIGNvbXBsZXRlIHNraWxsIGNhdGFsb2d1ZS4gKi9cbmV4cG9ydCB0eXBlIFNraWxsQ2F0YWxvZ3VlUmVzb2x2ZXIgPSAoXG4gIGNvbnRleHQ6IFNraWxsQ2F0YWxvZ3VlUmVzb2x2ZUNvbnRleHQsXG4pID0+IFByb21pc2U8V29ya3NwYWNlU2tpbGxDYXRhbG9ndWU+O1xuXG5pbnRlcmZhY2UgUGFyc2VkU2tpbGwge1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBpbnN0cnVjdGlvbnM6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xufVxuXG5jb25zdCBzY29wZWRDYXRhbG9ndWVzID0gbmV3IExSVUNhY2hlPHN0cmluZywgV29ya3NwYWNlU2tpbGxDYXRhbG9ndWU+KHtcbiAgbWF4OiBNQVhfU0NPUEVEX0NBVEFMT0dVRVMsXG59KTtcblxuLyoqIERlZmF1bHQgbGlmZXRpbWUgZm9yIG9uZSBjb21wbGV0ZSB3b3Jrc3BhY2Ugc2tpbGwgY2F0YWxvZ3VlLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfV09SS1NQQUNFX1NLSUxMX0NBQ0hFX1RUTF9NUyA9IDUgKiA2MCAqIDEwMDA7XG5cbi8qKiBNYXRlcmlhbGl6ZWQgY2F0YWxvZ3VlIHdpdGggb25lIEFwcEtpdCBjYWNoZSByZWNvcmQgYW5kIGZyZXNoIGF1eGlsaWFyeSByZWFkcy4gKi9cbmV4cG9ydCBjbGFzcyBXb3Jrc3BhY2VTa2lsbENhdGFsb2d1ZSB7XG4gIHJlYWRvbmx5IGNhY2hlS2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgdXNlcktleTogc3RyaW5nO1xuXG4gIHByaXZhdGUgbGFzdFZhbGlkPzogU2tpbGxDYXRhbG9ndWU7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHRsTXM6IG51bWJlcjtcbiAgcHJpdmF0ZSBzb3VyY2VzOiByZWFkb25seSBTa2lsbENhdGFsb2d1ZVNvdXJjZVtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogV29ya3NwYWNlU2tpbGxDYXRhbG9ndWVPcHRpb25zKSB7XG4gICAgdGhpcy5ob3N0ID0gb3B0aW9ucy5ob3N0O1xuICAgIHRoaXMudXNlcktleSA9IG9wdGlvbnMudXNlcktleTtcbiAgICB0aGlzLnNvdXJjZXMgPSBvcHRpb25zLnNvdXJjZXM7XG4gICAgdGhpcy50dGxNcyA9IHBvc2l0aXZlVHRsKG9wdGlvbnMudHRsTXMpO1xuICAgIHRoaXMuY2FjaGVLZXkgPSBvYmplY3QudG9TdGFibGVLZXkoe1xuICAgICAgaG9zdDogb3B0aW9ucy5ob3N0LFxuICAgICAgcm9vdHM6IG9wdGlvbnMuc291cmNlcy5tYXAoKHsgaWQgfSkgPT4gaWQpLFxuICAgICAgdXNlcktleTogb3B0aW9ucy51c2VyS2V5LFxuICAgICAgdmVyc2lvbjogQ0FUQUxPR1VFX1ZFUlNJT04sXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmViaW5kIHJlZnJlc2hlcyBhbmQgbGF6eSByZWFkcyB0byB0aGUgY3VycmVudCByZXF1ZXN0J3MgZmlsZXN5c3RlbSBjbGllbnRzLiAqL1xuICBiaW5kKHNvdXJjZXM6IHJlYWRvbmx5IFNraWxsQ2F0YWxvZ3VlU291cmNlW10pOiB2b2lkIHtcbiAgICBjb25zdCBpZGVudGl0aWVzID0gc291cmNlcy5tYXAoKHsgaWQgfSkgPT4gaWQpO1xuICAgIGlmIChvYmplY3QudG9TdGFibGVLZXkoaWRlbnRpdGllcykgIT09IG9iamVjdC50b1N0YWJsZUtleSh0aGlzLnNvdXJjZXMubWFwKCh7IGlkIH0pID0+IGlkKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZWJpbmQgYSBza2lsbCBjYXRhbG9ndWUgdG8gYSBkaWZmZXJlbnQgb3JkZXJlZCByb290IHNldFwiKTtcbiAgICB9XG4gICAgdGhpcy5zb3VyY2VzID0gc291cmNlcztcbiAgfVxuXG4gIC8qKiBSZXR1cm4gdGhlIGNhY2hlZCBjYXRhbG9ndWUsIHJlZnJlc2hpbmcgYWxsIHJvb3RzIG9uY2Ugb24gY2FjaGUgbWlzcy4gKi9cbiAgYXN5bmMgZ2V0KHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxTa2lsbENhdGFsb2d1ZT4ge1xuICAgIGNvbnN0IGNhY2hlID0gQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYXRhbG9ndWUgPSBTa2lsbENhdGFsb2d1ZVNjaGVtYS5wYXJzZShcbiAgICAgICAgYXdhaXQgY2FjaGUuZ2V0T3JFeGVjdXRlKFxuICAgICAgICAgIFtDQUNIRV9OQU1FU1BBQ0UsIENBVEFMT0dVRV9WRVJTSU9OLCB0aGlzLm9wdGlvbnMuaG9zdCwgdGhpcy5yb290S2V5KCldLFxuICAgICAgICAgICgpID0+IHRoaXMucmVmcmVzaCgpLFxuICAgICAgICAgIHRoaXMub3B0aW9ucy51c2VyS2V5LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR0bDogTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRoaXMudHRsTXMgLyAxMDAwKSksXG4gICAgICAgICAgICBjYWxsZXJTaWduYWw6IHNpZ25hbCxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHRoaXMubGFzdFZhbGlkID0gY2F0YWxvZ3VlO1xuICAgICAgcmV0dXJuIGNhdGFsb2d1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCF0aGlzLmxhc3RWYWxpZCkgdGhyb3cgZXJyb3I7XG4gICAgICBsb2dnZXIud2FybihcInNraWxsIGNhdGFsb2d1ZSByZWZyZXNoIGZhaWxlZDsgcmV0YWluaW5nIGxhc3QgdmFsaWQgY2F0YWxvZ3VlXCIsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVycm9yKSxcbiAgICAgICAgcm9vdHM6IHRoaXMuc291cmNlcy5tYXAoKHsgaWQgfSkgPT4gaWQpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcy5sYXN0VmFsaWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIEV4cGlyZSB0aGlzIGNvbXBsZXRlIGNhdGFsb2d1ZSB3aXRob3V0IHRvdWNoaW5nIHVucmVsYXRlZCBjYWNoZSBlbnRyaWVzLiAqL1xuICBhc3luYyBpbnZhbGlkYXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNhY2hlID0gQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpO1xuICAgIGF3YWl0IGNhY2hlLmRlbGV0ZSh0aGlzLnBlcnNpc3RlbnRLZXkoY2FjaGUpKTtcbiAgfVxuXG4gIC8qKiBSZWFkIG9uZSBzZWxlY3RlZCBza2lsbCdzIGF1eGlsaWFyeSBmaWxlIGRpcmVjdGx5IGZyb20gaXRzIGN1cnJlbnQgc291cmNlLiAqL1xuICBhc3luYyByZWFkU2tpbGxGaWxlKFxuICAgIHNraWxsTmFtZTogc3RyaW5nLFxuICAgIGlucHV0UGF0aDogc3RyaW5nLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBjYXRhbG9ndWUgPSBhd2FpdCB0aGlzLmdldChzaWduYWwpO1xuICAgIGNvbnN0IHNraWxsID0gY2F0YWxvZ3VlLnNraWxscy5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gc2tpbGxOYW1lKTtcbiAgICBpZiAoIXNraWxsKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc2tpbGw6ICR7c2tpbGxOYW1lfWApO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBwb3NpeFBhdGgubm9ybWFsaXplKGlucHV0UGF0aCk7XG4gICAgaWYgKFxuICAgICAgIW5vcm1hbGl6ZWQub2sgfHxcbiAgICAgIG5vcm1hbGl6ZWQucGF0aCA9PT0gXCIvXCIgfHxcbiAgICAgIGlucHV0UGF0aC5zcGxpdChcIi9cIikuc29tZSgoc2VnbWVudCkgPT4gc2VnbWVudCA9PT0gXCIuLlwiKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNraWxsIGZpbGUgcGF0aDogJHtpbnB1dFBhdGh9YCk7XG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuc291cmNlcy5maW5kKCh7IGlkIH0pID0+IGlkID09PSBza2lsbC5zb3VyY2VJZCk7XG4gICAgaWYgKCFzb3VyY2UpIHRocm93IG5ldyBFcnJvcihgU2tpbGwgc291cmNlIGlzIG5vIGxvbmdlciBtb3VudGVkOiAke3NraWxsLnNvdXJjZUlkfWApO1xuICAgIGNvbnN0IHBhcmVudCA9IHNraWxsLnNvdXJjZVBhdGguc3BsaXQoXCIvXCIpLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKTtcbiAgICBjb25zdCBwYXRoID0gW3BhcmVudCwgbm9ybWFsaXplZC5wYXRoLnJlcGxhY2UoL15cXC8rLywgXCJcIildLmZpbHRlcihCb29sZWFuKS5qb2luKFwiL1wiKTtcbiAgICByZXR1cm4gc291cmNlLnJlYWQocGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2goKTogUHJvbWlzZTxTa2lsbENhdGFsb2d1ZT4ge1xuICAgIGNvbnN0IHByZXZpb3VzID0gbmV3IE1hcChcbiAgICAgIHRoaXMubGFzdFZhbGlkPy5za2lsbHMubWFwKChza2lsbCkgPT4gW2Ake3NraWxsLnNvdXJjZUlkfVxcMCR7c2tpbGwuc291cmNlUGF0aH1gLCBza2lsbF0pID8/IFtdLFxuICAgICk7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgTWFwPHN0cmluZywgU2tpbGxDYXRhbG9ndWVFbnRyeT4oKTtcbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiB0aGlzLnNvdXJjZXMpIHtcbiAgICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGF3YWl0IGRpc2NvdmVyU2tpbGxGaWxlcyhzb3VyY2UpKSB7XG4gICAgICAgIGNvbnN0IHByaW9yID0gcHJldmlvdXMuZ2V0KGAke3NvdXJjZS5pZH1cXDAke2NhbmRpZGF0ZS5wYXRofWApO1xuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBmaWxlU2lnbmF0dXJlKGNhbmRpZGF0ZS5lbnRyeSk7XG4gICAgICAgIGxldCBwYXJzZWQ6IFBhcnNlZFNraWxsIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoc2lnbmF0dXJlICYmIHByaW9yPy5zaWduYXR1cmUgPT09IHNpZ25hdHVyZSkge1xuICAgICAgICAgIHBhcnNlZCA9IHByaW9yO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcnNlZCA9IHBhcnNlU2tpbGwoXG4gICAgICAgICAgICBhd2FpdCBzb3VyY2UucmVhZChjYW5kaWRhdGUucGF0aCksXG4gICAgICAgICAgICBjYW5kaWRhdGUucGF0aCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFyc2VkIHx8IHNlbGVjdGVkLmhhcyhwYXJzZWQubmFtZSkpIGNvbnRpbnVlO1xuICAgICAgICBzZWxlY3RlZC5zZXQocGFyc2VkLm5hbWUsIHtcbiAgICAgICAgICAuLi5wYXJzZWQsXG4gICAgICAgICAgc291cmNlSWQ6IHNvdXJjZS5pZCxcbiAgICAgICAgICBzb3VyY2VQYXRoOiBjYW5kaWRhdGUucGF0aCxcbiAgICAgICAgICAuLi4oc2lnbmF0dXJlID8geyBzaWduYXR1cmUgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBTa2lsbENhdGFsb2d1ZVNjaGVtYS5wYXJzZSh7XG4gICAgICB2ZXJzaW9uOiBDQVRBTE9HVUVfVkVSU0lPTixcbiAgICAgIGdlbmVyYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICByb290czogdGhpcy5zb3VyY2VzLm1hcCgoeyBpZCB9KSA9PiBpZCksXG4gICAgICBza2lsbHM6IFsuLi5zZWxlY3RlZC52YWx1ZXMoKV0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJvb3RLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gb2JqZWN0LnRvU3RhYmxlS2V5KHRoaXMuc291cmNlcy5tYXAoKHsgaWQgfSkgPT4gaWQpKTtcbiAgfVxuXG4gIHByaXZhdGUgcGVyc2lzdGVudEtleShjYWNoZTogQ2FjaGVNYW5hZ2VyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY2FjaGUuZ2VuZXJhdGVLZXkoXG4gICAgICBbQ0FDSEVfTkFNRVNQQUNFLCBDQVRBTE9HVUVfVkVSU0lPTiwgdGhpcy5vcHRpb25zLmhvc3QsIHRoaXMucm9vdEtleSgpXSxcbiAgICAgIHRoaXMub3B0aW9ucy51c2VyS2V5LFxuICAgICk7XG4gIH1cbn1cblxuLyoqIFJldHVybiBvbmUgc3RhYmxlIGNhdGFsb2d1ZSBvd25lciBmb3IgYSB1c2VyLCBob3N0LCBhbmQgb3JkZXJlZCByb290IHNldC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3b3Jrc3BhY2VTa2lsbENhdGFsb2d1ZShcbiAgb3B0aW9uczogV29ya3NwYWNlU2tpbGxDYXRhbG9ndWVPcHRpb25zLFxuKTogV29ya3NwYWNlU2tpbGxDYXRhbG9ndWUge1xuICBjb25zdCBrZXkgPSBvYmplY3QudG9TdGFibGVLZXkoe1xuICAgIGhvc3Q6IG9wdGlvbnMuaG9zdCxcbiAgICByb290czogb3B0aW9ucy5zb3VyY2VzLm1hcCgoeyBpZCB9KSA9PiBpZCksXG4gICAgdXNlcktleTogb3B0aW9ucy51c2VyS2V5LFxuICB9KTtcbiAgY29uc3QgZXhpc3RpbmcgPSBzY29wZWRDYXRhbG9ndWVzLmdldChrZXkpO1xuICBpZiAoZXhpc3RpbmcpIHtcbiAgICBleGlzdGluZy5iaW5kKG9wdGlvbnMuc291cmNlcyk7XG4gICAgcmV0dXJuIGV4aXN0aW5nO1xuICB9XG4gIGNvbnN0IGNhdGFsb2d1ZSA9IG5ldyBXb3Jrc3BhY2VTa2lsbENhdGFsb2d1ZShvcHRpb25zKTtcbiAgc2NvcGVkQ2F0YWxvZ3Vlcy5zZXQoa2V5LCBjYXRhbG9ndWUpO1xuICByZXR1cm4gY2F0YWxvZ3VlO1xufVxuXG4vKiogSW52YWxpZGF0ZSBtYXRjaGluZyBjb21wbGV0ZSBjYXRhbG9ndWVzIGFuZCByZXRhaW4gdGhlaXIgc3RhYmxlIG93bmVycy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhcldvcmtzcGFjZVNraWxsQ2FjaGUob3B0aW9uczoge1xuICBob3N0OiBzdHJpbmc7XG4gIHVzZXJLZXk/OiBzdHJpbmc7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1hdGNoZXMgPSBbLi4uc2NvcGVkQ2F0YWxvZ3Vlcy52YWx1ZXMoKV0uZmlsdGVyKFxuICAgIChjYXRhbG9ndWUpID0+XG4gICAgICBjYXRhbG9ndWUuaG9zdCA9PT0gb3B0aW9ucy5ob3N0ICYmXG4gICAgICAob3B0aW9ucy51c2VyS2V5ID09PSB1bmRlZmluZWQgfHwgY2F0YWxvZ3VlLnVzZXJLZXkgPT09IG9wdGlvbnMudXNlcktleSksXG4gICk7XG4gIGF3YWl0IFByb21pc2UuYWxsKG1hdGNoZXMubWFwKChjYXRhbG9ndWUpID0+IGNhdGFsb2d1ZS5pbnZhbGlkYXRlKCkpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGlzY292ZXJTa2lsbEZpbGVzKFxuICBzb3VyY2U6IFNraWxsQ2F0YWxvZ3VlU291cmNlLFxuKTogUHJvbWlzZTxBcnJheTx7IGVudHJ5OiBTa2lsbENhdGFsb2d1ZUZpbGVFbnRyeTsgcGF0aDogc3RyaW5nIH0+PiB7XG4gIGxldCByb290RW50cmllczogU2tpbGxDYXRhbG9ndWVGaWxlRW50cnlbXTtcbiAgdHJ5IHtcbiAgICByb290RW50cmllcyA9IGF3YWl0IHNvdXJjZS5saXN0KFwiLlwiKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3JVdGlscy5lcnJvckNvbnRleHQoZXJyb3IpLm5vdEFjY2Vzc2libGUpIHJldHVybiBbXTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuICBjb25zdCBjYW5kaWRhdGVzOiBBcnJheTx7IGVudHJ5OiBTa2lsbENhdGFsb2d1ZUZpbGVFbnRyeTsgcGF0aDogc3RyaW5nIH0+ID0gW107XG4gIGNvbnN0IHJvb3RTa2lsbCA9IHJvb3RFbnRyaWVzLmZpbmQoXG4gICAgKHsgbmFtZSwgdHlwZSB9KSA9PiBuYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2tpbGwubWRcIiAmJiB0eXBlID09PSBcImZpbGVcIixcbiAgKTtcbiAgaWYgKHJvb3RTa2lsbCkgY2FuZGlkYXRlcy5wdXNoKHsgZW50cnk6IHJvb3RTa2lsbCwgcGF0aDogcm9vdFNraWxsLm5hbWUgfSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHJvb3RFbnRyaWVzXG4gICAgICAuZmlsdGVyKCh7IHR5cGUgfSkgPT4gdHlwZSA9PT0gXCJkaXJlY3RvcnlcIilcbiAgICAgIC5tYXAoYXN5bmMgKGRpcmVjdG9yeSkgPT4ge1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgc291cmNlLmxpc3QoZGlyZWN0b3J5Lm5hbWUpO1xuICAgICAgICBjb25zdCBza2lsbCA9IGVudHJpZXMuZmluZChcbiAgICAgICAgICAoeyBuYW1lLCB0eXBlIH0pID0+IG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJza2lsbC5tZFwiICYmIHR5cGUgPT09IFwiZmlsZVwiLFxuICAgICAgICApO1xuICAgICAgICBpZiAoc2tpbGwpIGNhbmRpZGF0ZXMucHVzaCh7IGVudHJ5OiBza2lsbCwgcGF0aDogcG9zaXhQYXRoLmpvaW4oZGlyZWN0b3J5Lm5hbWUsIHNraWxsLm5hbWUpIH0pO1xuICAgICAgfSksXG4gICk7XG4gIHJldHVybiBjYW5kaWRhdGVzLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LnBhdGgubG9jYWxlQ29tcGFyZShyaWdodC5wYXRoKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlU2tpbGwoc291cmNlOiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IFBhcnNlZFNraWxsIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2ggPSAvXi0tLVxccypcXHI/XFxuKFtcXHNcXFNdKj8pXFxyP1xcbi0tLVxccyooPzpcXHI/XFxufCQpKFtcXHNcXFNdKikkLy5leGVjKHNvdXJjZSk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICBsb2dnZXIud2FybihcInNraWxsIHNraXBwZWQgKG1pc3NpbmcgWUFNTCBmcm9udG1hdHRlcilcIiwgeyBwYXRoIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZVlhbWwobWF0Y2hbMV0hKSBhcyB1bmtub3duO1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChtZXRhZGF0YSkpIHtcbiAgICBsb2dnZXIud2FybihcInNraWxsIHNraXBwZWQgKGludmFsaWQgWUFNTCBmcm9udG1hdHRlcilcIiwgeyBwYXRoIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgcGFyc2VkID0gelxuICAgIC5vYmplY3Qoe1xuICAgICAgbmFtZTogei5zdHJpbmcoKS50cmltKCkubWluKDEpLFxuICAgICAgZGVzY3JpcHRpb246IHouc3RyaW5nKCkudHJpbSgpLm1pbigxKSxcbiAgICB9KVxuICAgIC5zYWZlUGFyc2UobWV0YWRhdGEpO1xuICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJza2lsbCBza2lwcGVkIChpbnZhbGlkIG1ldGFkYXRhKVwiLCB7XG4gICAgICBwYXRoLFxuICAgICAgZXJyb3I6IHBhcnNlZC5lcnJvci5tZXNzYWdlLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBwYXJzZWQuZGF0YS5uYW1lLFxuICAgIGRlc2NyaXB0aW9uOiBwYXJzZWQuZGF0YS5kZXNjcmlwdGlvbixcbiAgICBpbnN0cnVjdGlvbnM6IG1hdGNoWzJdIS50cmltKCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbGVTaWduYXR1cmUoZW50cnk6IFNraWxsQ2F0YWxvZ3VlRmlsZUVudHJ5KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWV0YWRhdGEgPSBvYmplY3QuaXNSZWNvcmQoZW50cnkubWV0YWRhdGEpID8gZW50cnkubWV0YWRhdGEgOiB7fTtcbiAgY29uc3QgdmFsdWVzID0ge1xuICAgIG1vZGlmaWVkQXQ6IG1ldGFkYXRhLm1vZGlmaWVkQXQsXG4gICAgb2JqZWN0SWQ6IG1ldGFkYXRhLm9iamVjdElkLFxuICAgIHNpemU6IGVudHJ5LnNpemUsXG4gIH07XG4gIHJldHVybiBPYmplY3QudmFsdWVzKHZhbHVlcykuc29tZSgodmFsdWUpID0+IHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgPyBvYmplY3QudG9TdGFibGVLZXkodmFsdWVzKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwb3NpdGl2ZVR0bCh2YWx1ZSA9IERFRkFVTFRfV09SS1NQQUNFX1NLSUxMX0NBQ0hFX1RUTF9NUyk6IG51bWJlciB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJXb3Jrc3BhY2Ugc2tpbGwgY2F0YWxvZ3VlIHR0bE1zIG11c3QgYmUgYSBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyXCIpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cbiJdfQ==
@@ -0,0 +1,30 @@
1
+ /**
2
+ * On-demand skill discovery backed by a materialized workspace catalogue.
3
+ *
4
+ * @module
5
+ */
6
+ import type { ProcessInputStepArgs, Processor } from "@mastra/core/processors";
7
+ import type { SkillCatalogueResolver } from "./skill-cache.ts";
8
+ /** Configuration for {@link CatalogueSkillSearchProcessor}. */
9
+ export interface CatalogueSkillSearchProcessorOptions {
10
+ minScore?: number;
11
+ resolve: SkillCatalogueResolver;
12
+ topK?: number;
13
+ ttlMs?: number;
14
+ }
15
+ /** Mastra-compatible search, load, and lazy-read tools over one cached catalogue. */
16
+ export declare class CatalogueSkillSearchProcessor implements Processor<"skill-catalogue-search"> {
17
+ readonly id = "skill-catalogue-search";
18
+ readonly name = "Skill Catalogue Search";
19
+ readonly providesSkillDiscovery: "on-demand";
20
+ private readonly minScore;
21
+ private readonly resolve;
22
+ private readonly states;
23
+ private readonly topK;
24
+ private readonly ttlMs;
25
+ constructor(options: CatalogueSkillSearchProcessorOptions);
26
+ processInputStep(args: ProcessInputStepArgs): Promise<{
27
+ tools: Record<string, unknown>;
28
+ }>;
29
+ private threadState;
30
+ }