@workflow/world-local 4.2.0 → 4.2.1

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/dist/fs.d.ts CHANGED
@@ -59,6 +59,16 @@ export declare function stripTag(fileId: string): string;
59
59
  * Untagged fileIds never match a tag-scoped lookup.
60
60
  */
61
61
  export declare function hasTag(fileId: string, tag: string): boolean;
62
+ /**
63
+ * Check whether a fileId carries no tag suffix at all.
64
+ * `wrun_ABC` → true, `wrun_ABC.vitest-0` → false.
65
+ *
66
+ * An untagged world's reads (`readJSONWithFallback`) can only resolve untagged
67
+ * files, so when it lists entities for recovery it must skip files tagged by
68
+ * other worlds (e.g. the vitest harness) sharing the same data directory —
69
+ * otherwise it would re-enqueue runs it cannot subsequently read back.
70
+ */
71
+ export declare function isUntagged(fileId: string): boolean;
62
72
  /**
63
73
  * Build the file path for an entity, with optional tag embedded in the filename.
64
74
  * `taggedPath('/data', 'runs', 'wrun_ABC', 'vitest-0')` → `/data/runs/wrun_ABC.vitest-0.json`
package/dist/fs.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"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"}
package/dist/fs.js CHANGED
@@ -139,6 +139,18 @@ export function stripTag(fileId) {
139
139
  export function hasTag(fileId, tag) {
140
140
  return fileId.endsWith(`.${tag}`);
141
141
  }
142
+ /**
143
+ * Check whether a fileId carries no tag suffix at all.
144
+ * `wrun_ABC` → true, `wrun_ABC.vitest-0` → false.
145
+ *
146
+ * An untagged world's reads (`readJSONWithFallback`) can only resolve untagged
147
+ * files, so when it lists entities for recovery it must skip files tagged by
148
+ * other worlds (e.g. the vitest harness) sharing the same data directory —
149
+ * otherwise it would re-enqueue runs it cannot subsequently read back.
150
+ */
151
+ export function isUntagged(fileId) {
152
+ return !TAG_PATTERN.test(fileId);
153
+ }
142
154
  /**
143
155
  * Build the file path for an entity, with optional tag embedded in the filename.
144
156
  * `taggedPath('/data', 'runs', 'wrun_ABC', 'vitest-0')` → `/data/runs/wrun_ABC.vitest-0.json`
@@ -515,4 +527,4 @@ export async function paginatedFileSystemQuery(config) {
515
527
  hasMore,
516
528
  };
517
529
  }
518
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRW5EOzs7OztHQUtHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFjO0lBQ3RDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2YsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGtCQUFrQjtJQUN6RCxZQUFZLElBQVksRUFBRSxLQUFhO1FBQ3JDLEtBQUssQ0FDSCxVQUFVLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsNkRBQTZELENBQ3hHLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDO0lBQ3BDLENBQUM7SUFF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RUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0lBQ2hFLE1BQU0sVUFBVSxHQUNkLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUNkLENBQUMsQ0FBQyxZQUFZLENBQ1YsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUNqQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUNqQztRQUNILENBQUMsQ0FBQyxJQUFJLENBQUM7SUFFWCxPQUFPO1FBQ0wsSUFBSSxFQUFFLEtBQUs7UUFDWCxNQUFNLEVBQUUsVUFBVTtRQUNsQixPQUFPO0tBQ1IsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IEVudGl0eUNvbmZsaWN0RXJyb3IsIFdvcmtmbG93V29ybGRFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBQYWdpbmF0ZWRSZXNwb25zZSB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuY29uc3QgdWxpZCA9IG1vbm90b25pY0ZhY3RvcnkoKCkgPT4gTWF0aC5yYW5kb20oKSk7XG5cbi8qKlxuICogVHJ1bmNhdGUgYSBwb3NzaWJseS11bnRydXN0ZWQgdmFsdWUgZm9yIGluY2x1c2lvbiBpbiBhbiBlcnJvciBtZXNzYWdlLlxuICogS2VlcHMgZXJyb3Igb3V0cHV0IGFjdGlvbmFibGUgZm9yIGRldmVsb3BlcnMgaW4gZGV2IG1vZGUgd2hpbGUgbGltaXRpbmdcbiAqIHRoZSBhbW91bnQgb2YgYXR0YWNrZXItY29udHJvbGxlZCBkYXRhIHJlZmxlY3RlZCBiYWNrIGlmIGEgYHdvcmxkLWxvY2FsYFxuICogYmFja2VuZCBpcyBldmVyIHJ1biBpbiBhIGNvbnRleHQgdGhhdCBzdXJmYWNlcyB0aGVzZSBtZXNzYWdlcyB0byBjbGllbnRzLlxuICovXG5mdW5jdGlvbiB0cnVuY2F0ZUZvckVycm9yKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgY29uc3QgcyA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSk7XG4gIGNvbnN0IE1BWCA9IDQ4O1xuICByZXR1cm4gcy5sZW5ndGggPiBNQVggPyBgJHtzLnNsaWNlKDAsIE1BWCl94oCmYCA6IHM7XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBjYWxsZXItc3VwcGxpZWQgZW50aXR5IElEIGNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdCB3b3VsZFxuICogZXNjYXBlIHRoZSBzdG9yYWdlIHJvb3QgKHBhdGggdHJhdmVyc2FsKSBvciBvdGhlcndpc2UgcHJvZHVjZSBhbiB1bnNhZmVcbiAqIGZpbGVuYW1lLiBFeHRlbmRzIHtAbGluayBXb3JrZmxvd1dvcmxkRXJyb3J9IHNvIHRoZSBwbGF0Zm9ybSdzIHN0YW5kYXJkXG4gKiBlcnJvci10by1IVFRQIG1hcHBpbmcgaGFuZGxlcyBpdCBhbG9uZ3NpZGUgb3RoZXIgd29ybGQtbGF5ZXIgZXJyb3JzLlxuICovXG5leHBvcnQgY2xhc3MgVW5zYWZlRW50aXR5SWRFcnJvciBleHRlbmRzIFdvcmtmbG93V29ybGRFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGtpbmQ6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgYFVuc2FmZSAke2tpbmR9IFwiJHt0cnVuY2F0ZUZvckVycm9yKHZhbHVlKX1cIjogbXVzdCBub3QgYmUgZW1wdHksIGNvbnRhaW4gXCIuXCIsIFwiL1wiLCBcIlxcXFxcIiwgb3IgbnVsbCBieXRlc2BcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdVbnNhZmVFbnRpdHlJZEVycm9yJztcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFVuc2FmZUVudGl0eUlkRXJyb3Ige1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEVycm9yICYmIHZhbHVlLm5hbWUgPT09ICdVbnNhZmVFbnRpdHlJZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBzdHJpbmcgaXMgc2FmZSB0byBlbWJlZCBpbiBhIGZpbGVzeXN0ZW0gcGF0aCBhcyBhIHNpbmdsZVxuICogcGF0aCBjb21wb25lbnQuIFJlamVjdHMgdmFsdWVzIHRoYXQgYXJlOlxuICogICAtIGVtcHR5XG4gKiAgIC0gc3RhcnRpbmcgd2l0aCBgLmAgKGJsb2NrcyBgLmAsIGAuLmAsIGAubG9ja3NgLCBgLnRtcGAsIGFuZCBvdGhlclxuICogICAgIGhpZGRlbiBvciByZXNlcnZlZCBmaWxlbmFtZXMpXG4gKiAgIC0gY29udGFpbmluZyBgLmAgKHdvdWxkIGNvbGxpZGUgd2l0aCB0aGUgYC50YWdgIC8gYC5qc29uYCBzdWZmaXggdGhlXG4gKiAgICAgdGFnZ2luZyBsb2dpYyBzdHJpcHMgZnJvbSBmaWxlbmFtZXM7IHNlZSB7QGxpbmsgc3RyaXBUYWd9IC9cbiAqICAgICB7QGxpbmsgZ2V0T2JqZWN0Q3JlYXRlZEF0fSlcbiAqICAgLSBjb250YWluaW5nIGAvYCwgYFxcYCwgb3IgYSBOVUwgYnl0ZVxuICpcbiAqIFRoaXMgaXMgdGhlIHByaW1hcnkgZGVmZW5zZSBhZ2FpbnN0IHBhdGgtdHJhdmVyc2FsIGF0dGFja3Mgd2hlcmUgYVxuICogcmVxdWVzdCBib2R5IHN1cHBsaWVzIGEgYHJ1bklkYCAvIGBzdGVwSWRgIC8gYGNvcnJlbGF0aW9uSWRgIGNvbnRhaW5pbmdcbiAqIGAuLi9gIHNlcXVlbmNlcyB0byByZWFkIG9yIHdyaXRlIGZpbGVzIG91dHNpZGUgdGhlIHN0b3JhZ2Ugcm9vdC5cbiAqIHtAbGluayByZXNvbHZlV2l0aGluQmFzZX0gcHJvdmlkZXMgYSBiZWx0LWFuZC1zdXNwZW5kZXJzIGNvbnRhaW5tZW50XG4gKiBjaGVjayBhdCB0aGUgcG9pbnQgb2YgYHBhdGguam9pbmAgZm9yIGRlZmVuc2UgaW4gZGVwdGguXG4gKlxuICogQHBhcmFtIGtpbmQgLSBIdW1hbi1yZWFkYWJsZSBsYWJlbCB1c2VkIGluIHRoZSBlcnJvciBtZXNzYWdlIChlLmcuIFwicnVuSWRcIilcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZTsgdGhyb3dzIHtAbGluayBVbnNhZmVFbnRpdHlJZEVycm9yfVxuICogICBpZiB0aGUgdmFsdWUgaXMgbm90IHNhZmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTYWZlRW50aXR5SWQoa2luZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChcbiAgICB2YWx1ZS5sZW5ndGggPT09IDAgfHxcbiAgICB2YWx1ZS5zdGFydHNXaXRoKCcuJykgfHxcbiAgICB2YWx1ZS5pbmNsdWRlcygnLycpIHx8XG4gICAgdmFsdWUuaW5jbHVkZXMoJ1xcXFwnKSB8fFxuICAgIHZhbHVlLmluY2x1ZGVzKCdcXDAnKSB8fFxuICAgIHZhbHVlLmluY2x1ZGVzKCcuJylcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFVuc2FmZUVudGl0eUlkRXJyb3Ioa2luZCwgdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogSm9pbiBgYmFzZWRpcmAgd2l0aCBhbiBlbnRpdHktcmVsYXRpdmUgcGF0aCBhbmQgYXNzZXJ0IHRoZSByZXN1bHQgc3RheXNcbiAqIGluc2lkZSBgYmFzZWRpcmAuIENvbXBsZW1lbnRzIHtAbGluayBhc3NlcnRTYWZlRW50aXR5SWR9OiBwZXItZW50cnktcG9pbnRcbiAqIHZhbGlkYXRpb24gaXMgdGhlIHByaW1hcnkgZGVmZW5zZSwgYW5kIHRoaXMgZmluYWwgY2hlY2sgY2F0Y2hlcyBhbnkgcGF0aFxuICogZXNjYXBlIHRoYXQgc2xpcHBlZCBwYXN0IChlLmcuIGEgbmV3IGNhbGwgc2l0ZSB0aGF0IGZvcmdvdCB0byB2YWxpZGF0ZSxcbiAqIG9yIGFuIHVudXN1YWwgY2hhcmFjdGVyIGNvbWJpbmF0aW9uIG9uIGEgZnV0dXJlIGZpbGVzeXN0ZW0pLiBUaHJvd3NcbiAqIHtAbGluayBVbnNhZmVFbnRpdHlJZEVycm9yfSBpZiB0aGUgam9pbmVkIHBhdGggZXNjYXBlcyBgYmFzZWRpcmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aGluQmFzZShcbiAgYmFzZWRpcjogc3RyaW5nLFxuICAuLi5zZWdtZW50czogc3RyaW5nW11cbik6IHN0cmluZyB7XG4gIGNvbnN0IHJlc29sdmVkQmFzZSA9IHBhdGgucmVzb2x2ZShiYXNlZGlyKTtcbiAgY29uc3Qgam9pbmVkID0gcGF0aC5yZXNvbHZlKGJhc2VkaXIsIC4uLnNlZ21lbnRzKTtcbiAgaWYgKGpvaW5lZCAhPT0gcmVzb2x2ZWRCYXNlICYmICFqb2luZWQuc3RhcnRzV2l0aChyZXNvbHZlZEJhc2UgKyBwYXRoLnNlcCkpIHtcbiAgICB0aHJvdyBuZXcgVW5zYWZlRW50aXR5SWRFcnJvcigncGF0aCcsIHNlZ21lbnRzLmpvaW4oJy8nKSk7XG4gIH1cbiAgcmV0dXJuIGpvaW5lZDtcbn1cblxuY29uc3QgaXNXaW5kb3dzID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcblxuLyoqXG4gKiBFeGVjdXRlIGEgZmlsZXN5c3RlbSBvcGVyYXRpb24gd2l0aCByZXRyeSBsb2dpYyBvbiBXaW5kb3dzLlxuICogT24gV2luZG93cywgZmlsZSBvcGVyYXRpb25zIGNhbiBmYWlsIHdpdGggRVBFUk0vRUJVU1kvRUFDQ0VTIHdoZW4gZmlsZXNcbiAqIGFyZSBicmllZmx5IGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3Mgb3IgYW50aXZpcnVzLiBUaGlzIHdyYXBwZXIgYWRkc1xuICogZXhwb25lbnRpYWwgYmFja29mZiByZXRyeSBsb2dpYy4gT24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLCBleGVjdXRlcyBkaXJlY3RseS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2l0aFdpbmRvd3NSZXRyeTxUPihcbiAgZm46ICgpID0+IFByb21pc2U8VD4sXG4gIG1heFJldHJpZXMgPSA1XG4pOiBQcm9taXNlPFQ+IHtcbiAgaWYgKCFpc1dpbmRvd3MpIHJldHVybiBmbigpO1xuXG4gIGNvbnN0IHJldHJ5YWJsZUVycm9ycyA9IFsnRVBFUk0nLCAnRUJVU1knLCAnRUFDQ0VTJ107XG4gIGNvbnN0IGJhc2VEZWxheU1zID0gMTA7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPD0gbWF4UmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnN0IGlzUmV0cnlhYmxlID1cbiAgICAgICAgYXR0ZW1wdCA8IG1heFJldHJpZXMgJiYgcmV0cnlhYmxlRXJyb3JzLmluY2x1ZGVzKGVycm9yLmNvZGUpO1xuICAgICAgaWYgKCFpc1JldHJ5YWJsZSkgdGhyb3cgZXJyb3I7XG4gICAgICAvLyBFeHBvbmVudGlhbCBiYWNrb2ZmIHdpdGggaml0dGVyXG4gICAgICBjb25zdCBkZWxheSA9IGJhc2VEZWxheU1zICogMiAqKiBhdHRlbXB0ICsgTWF0aC5yYW5kb20oKSAqIGJhc2VEZWxheU1zO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcbiAgICB9XG4gIH1cbiAgLy8gVHlwZVNjcmlwdDogdW5yZWFjaGFibGUsIGJ1dCBzYXRpc2ZpZXMgcmV0dXJuIHR5cGVcbiAgdGhyb3cgbmV3IEVycm9yKCdSZXRyeSBsb29wIGV4aXRlZCB1bmV4cGVjdGVkbHknKTtcbn1cblxuLy8gSW4tbWVtb3J5IGNhY2hlIG9mIGNyZWF0ZWQgZmlsZXMgdG8gYXZvaWQgZXhwZW5zaXZlIGZzLmFjY2VzcygpIGNhbGxzXG4vLyBUaGlzIGlzIHNhZmUgYmVjYXVzZSB3ZSBvbmx5IHdyaXRlIG9uY2UgcGVyIGZpbGUgcGF0aCAobm8gb3ZlcndyaXRlcyB3aXRob3V0IGV4cGxpY2l0IGZsYWcpXG5jb25zdCBjcmVhdGVkRmlsZXNDYWNoZSA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4vKipcbiAqIENsZWFyIHRoZSBjcmVhdGVkIGZpbGVzIGNhY2hlLiBVc2VmdWwgZm9yIHRlc3Rpbmcgb3Igd2hlbiBmaWxlcyBhcmUgZGVsZXRlZCBleHRlcm5hbGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDcmVhdGVkRmlsZXNDYWNoZSgpOiB2b2lkIHtcbiAgY3JlYXRlZEZpbGVzQ2FjaGUuY2xlYXIoKTtcbn1cblxuZXhwb3J0IHsgdWxpZFRvRGF0ZSB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5cbi8qKlxuICogUmVnZXggbWF0Y2hpbmcgYSB0YWcgc3VmZml4IG9uIGEgZmlsZUlkIChhZnRlciBgLmpzb25gIGhhcyBiZWVuIHN0cmlwcGVkKS5cbiAqIEUuZy4sIGB3cnVuX0FCQy52aXRlc3QtMGAg4oaSIHRoZSBgLnZpdGVzdC0wYCBwYXJ0LlxuICogVGFncyBzdGFydCB3aXRoIGEgbGV0dGVyIGFuZCBjb250YWluIGFscGhhbnVtZXJpYyBjaGFycyBhbmQgaHlwaGVucy5cbiAqIEVudGl0eSBJRHMgKFVMSURzLCBzdGVwX04sIGV0Yy4pIG5ldmVyIGNvbnRhaW4gZG90cywgc28gdGhlIGZpcnN0IGRvdFxuICogYWx3YXlzIG1hcmtzIHRoZSB0YWcgYm91bmRhcnkuXG4gKi9cbmNvbnN0IFRBR19QQVRURVJOID0gL1xcLlthLXpBLVpdW2EtekEtWjAtOS1dKiQvO1xuXG4vKipcbiAqIFN0cmlwIGEgdGFnIHN1ZmZpeCBmcm9tIGEgZmlsZUlkLlxuICogYHdydW5fQUJDLnZpdGVzdC0wYCDihpIgYHdydW5fQUJDYFxuICogYHdydW5fQUJDYCDihpIgYHdydW5fQUJDYCAobm8tb3AgaWYgbm8gdGFnKVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBUYWcoZmlsZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZmlsZUlkLnJlcGxhY2UoVEFHX1BBVFRFUk4sICcnKTtcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGEgZmlsZUlkIGJlbG9uZ3MgdG8gYSBzcGVjaWZpYyB0YWcuXG4gKiBgd3J1bl9BQkMudml0ZXN0LTBgIGJlbG9uZ3MgdG8gYHZpdGVzdC0wYC5cbiAqIFVudGFnZ2VkIGZpbGVJZHMgbmV2ZXIgbWF0Y2ggYSB0YWctc2NvcGVkIGxvb2t1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1RhZyhmaWxlSWQ6IHN0cmluZywgdGFnOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpbGVJZC5lbmRzV2l0aChgLiR7dGFnfWApO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBmaWxlIHBhdGggZm9yIGFuIGVudGl0eSwgd2l0aCBvcHRpb25hbCB0YWcgZW1iZWRkZWQgaW4gdGhlIGZpbGVuYW1lLlxuICogYHRhZ2dlZFBhdGgoJy9kYXRhJywgJ3J1bnMnLCAnd3J1bl9BQkMnLCAndml0ZXN0LTAnKWAg4oaSIGAvZGF0YS9ydW5zL3dydW5fQUJDLnZpdGVzdC0wLmpzb25gXG4gKiBgdGFnZ2VkUGF0aCgnL2RhdGEnLCAncnVucycsICd3cnVuX0FCQycpYCDihpIgYC9kYXRhL3J1bnMvd3J1bl9BQkMuanNvbmBcbiAqXG4gKiBUaGUgYGZpbGVJZGAgYW5kIGB0YWdgIGFyZSB2YWxpZGF0ZWQgd2l0aCB7QGxpbmsgYXNzZXJ0U2FmZUVudGl0eUlkfSBhbmRcbiAqIHRoZSByZXN1bHQgaXMgY29udGFpbm1lbnQtY2hlY2tlZCB3aXRoIHtAbGluayByZXNvbHZlV2l0aGluQmFzZX0gdG9cbiAqIHByZXZlbnQgcGF0aC10cmF2ZXJzYWwgYXR0YWNrcyB3aGVuIHZhbHVlcyBhcmUgZGVyaXZlZCBmcm9tIHVudHJ1c3RlZFxuICogcmVxdWVzdCBpbnB1dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhZ2dlZFBhdGgoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgZW50aXR5RGlyOiBzdHJpbmcsXG4gIGZpbGVJZDogc3RyaW5nLFxuICB0YWc/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGFzc2VydFNhZmVFbnRpdHlJZCgnZmlsZUlkJywgZmlsZUlkKTtcbiAgaWYgKHRhZyAhPT0gdW5kZWZpbmVkKSBhc3NlcnRTYWZlRW50aXR5SWQoJ3RhZycsIHRhZyk7XG4gIGNvbnN0IGZpbGVuYW1lID0gdGFnID8gYCR7ZmlsZUlkfS4ke3RhZ30uanNvbmAgOiBgJHtmaWxlSWR9Lmpzb25gO1xuICByZXR1cm4gcmVzb2x2ZVdpdGhpbkJhc2UoYmFzZWRpciwgZW50aXR5RGlyLCBmaWxlbmFtZSk7XG59XG5cbi8qKlxuICogUmVhZCBhIEpTT04gZW50aXR5IHdpdGggdGFnZ2VkIGZhbGxiYWNrLlxuICogV2hlbiBhIHRhZyBpcyBzZXQsIHRyaWVzIHRoZSB0YWdnZWQgcGF0aCBmaXJzdCwgdGhlbiBmYWxscyBiYWNrIHRvIHRoZVxuICogdW50YWdnZWQgcGF0aCAoc28gYSB0YWdnZWQgd29ybGQgY2FuIHJlYWQgZW50aXRpZXMgd3JpdHRlbiB3aXRob3V0IGEgdGFnKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRKU09OV2l0aEZhbGxiYWNrPFQ+KFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIGVudGl0eURpcjogc3RyaW5nLFxuICBmaWxlSWQ6IHN0cmluZyxcbiAgc2NoZW1hOiB6LlpvZFR5cGU8VD4sXG4gIHRhZz86IHN0cmluZ1xuKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICBhc3NlcnRTYWZlRW50aXR5SWQoJ2ZpbGVJZCcsIGZpbGVJZCk7XG4gIGlmICh0YWcgIT09IHVuZGVmaW5lZCkgYXNzZXJ0U2FmZUVudGl0eUlkKCd0YWcnLCB0YWcpO1xuICBpZiAodGFnKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZEpTT04oXG4gICAgICByZXNvbHZlV2l0aGluQmFzZShiYXNlZGlyLCBlbnRpdHlEaXIsIGAke2ZpbGVJZH0uJHt0YWd9Lmpzb25gKSxcbiAgICAgIHNjaGVtYVxuICAgICk7XG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICByZXR1cm4gcmVhZEpTT04oXG4gICAgcmVzb2x2ZVdpdGhpbkJhc2UoYmFzZWRpciwgZW50aXR5RGlyLCBgJHtmaWxlSWR9Lmpzb25gKSxcbiAgICBzY2hlbWFcbiAgKTtcbn1cblxuLyoqXG4gKiBMaXN0IGFsbCBmaWxlbmFtZXMgaW4gYSBkaXJlY3RvcnkgdGhhdCBoYXZlIGEgc3BlY2lmaWMgdGFnLlxuICogUmV0dXJucyBmdWxsIGZpbGVuYW1lcyAoZS5nLiwgYHdydW5fQUJDLnZpdGVzdC0wLmpzb25gKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RUYWdnZWRGaWxlcyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICB0YWc6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBzdWZmaXggPSBgLiR7dGFnfS5qc29uYDtcbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVzLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aChzdWZmaXgpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBbXTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIExpc3QgYWxsIGZpbGVuYW1lcyBpbiBhIGRpcmVjdG9yeSB0aGF0IGhhdmUgYSBzcGVjaWZpYyB0YWcgYW5kIGV4dGVuc2lvbi5cbiAqIFJldHVybnMgZnVsbCBmaWxlbmFtZXMgKGUuZy4sIGBzdHJlYW0tY2hua19BQkMudml0ZXN0LTAuYmluYCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0VGFnZ2VkRmlsZXNCeUV4dGVuc2lvbihcbiAgZGlyUGF0aDogc3RyaW5nLFxuICB0YWc6IHN0cmluZyxcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgc3VmZml4ID0gYC4ke3RhZ30ke2V4dGVuc2lvbn1gO1xuICB0cnkge1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihkaXJQYXRoKTtcbiAgICByZXR1cm4gZmlsZXMuZmlsdGVyKChmKSA9PiBmLmVuZHNXaXRoKHN1ZmZpeCkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVEaXIoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgIC8vIElnbm9yZSBpZiBhbHJlYWR5IGV4aXN0c1xuICB9XG59XG5cbmludGVyZmFjZSBXcml0ZU9wdGlvbnMge1xuICBvdmVyd3JpdGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEN1c3RvbSBKU09OIHJlcGxhY2VyIHRoYXQgZW5jb2RlcyBVaW50OEFycmF5IGFzIGJhc2U2NCBzdHJpbmdzLlxuICogRm9ybWF0OiB7IF9fdHlwZTogJ1VpbnQ4QXJyYXknLCBkYXRhOiAnPGJhc2U2ND4nIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25SZXBsYWNlcihfa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiAnVWludDhBcnJheScsXG4gICAgICBkYXRhOiBCdWZmZXIuZnJvbSh2YWx1ZSkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIEN1c3RvbSBKU09OIHJldml2ZXIgdGhhdCBkZWNvZGVzIGJhc2U2NCBzdHJpbmdzIGJhY2sgdG8gVWludDhBcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25SZXZpdmVyKF9rZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICh2YWx1ZSBhcyBhbnkpLl9fdHlwZSA9PT0gJ1VpbnQ4QXJyYXknICYmXG4gICAgdHlwZW9mICh2YWx1ZSBhcyBhbnkpLmRhdGEgPT09ICdzdHJpbmcnXG4gICkge1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSgodmFsdWUgYXMgYW55KS5kYXRhLCAnYmFzZTY0JykpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlSlNPTihcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZGF0YTogYW55LFxuICBvcHRzPzogV3JpdGVPcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHdyaXRlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShkYXRhLCBqc29uUmVwbGFjZXIsIDIpLCBvcHRzKTtcbn1cblxuLyoqXG4gKiBXcml0ZXMgZGF0YSB0byBhIGZpbGUgdXNpbmcgYXRvbWljIHdyaXRlLXJlbmFtZSBwYXR0ZXJuLlxuICpcbiAqIE5vdGU6IFdoaWxlIHRoaXMgZnVuY3Rpb24gdXNlcyB0ZW1wIGZpbGVzIHRvIGF2b2lkIHBhcnRpYWwgd3JpdGVzLFxuICogaXQgZG9lcyBub3QgcHJvdmlkZSBwcm90ZWN0aW9uIGFnYWluc3QgY29uY3VycmVudCB3cml0ZXMgZnJvbSBtdWx0aXBsZVxuICogcHJvY2Vzc2VzLiBJbiBhIG11bHRpLXdyaXRlciBzY2VuYXJpbywgdGhlIGxhc3Qgd3JpdGVyIHdpbnMuXG4gKiBGb3IgcHJvZHVjdGlvbiB1c2Ugd2l0aCBtdWx0aXBsZSB3cml0ZXJzLCBjb25zaWRlciB1c2luZyBhIHByb3BlclxuICogZGF0YWJhc2Ugb3IgbG9ja2luZyBtZWNoYW5pc20uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZGF0YTogc3RyaW5nIHwgQnVmZmVyLFxuICBvcHRzPzogV3JpdGVPcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFvcHRzPy5vdmVyd3JpdGUpIHtcbiAgICAvLyBGYXN0IHBhdGg6IGNoZWNrIGluLW1lbW9yeSBjYWNoZSBmaXJzdCB0byBhdm9pZCBleHBlbnNpdmUgZnMuYWNjZXNzKCkgY2FsbHNcbiAgICAvLyBUaGlzIHByb3ZpZGVzIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IHdoZW4gY3JlYXRpbmcgbWFueSBmaWxlc1xuICAgIGlmIChjcmVhdGVkRmlsZXNDYWNoZS5oYXMoZmlsZVBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgYEZpbGUgJHtmaWxlUGF0aH0gYWxyZWFkeSBleGlzdHMgYW5kICdvdmVyd3JpdGUnIGlzIGZhbHNlYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTbG93IHBhdGg6IGNoZWNrIGZpbGVzeXN0ZW0gZm9yIGZpbGVzIGNyZWF0ZWQgYmVmb3JlIHRoaXMgcHJvY2VzcyBzdGFydGVkXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICAvLyBGaWxlIGV4aXN0cyBvbiBkaXNrLCBhZGQgdG8gY2FjaGUgZm9yIGZ1dHVyZSBjaGVja3NcbiAgICAgIGNyZWF0ZWRGaWxlc0NhY2hlLmFkZChmaWxlUGF0aCk7XG4gICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgYEZpbGUgJHtmaWxlUGF0aH0gYWxyZWFkeSBleGlzdHMgYW5kICdvdmVyd3JpdGUnIGlzIGZhbHNlYFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBJZiBmaWxlIGRvZXNuJ3QgZXhpc3QgKEVOT0VOVCksIGNvbnRpbnVlIHdpdGggd3JpdGVcbiAgICAgIGlmIChlcnJvci5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB0ZW1wUGF0aCA9IGAke2ZpbGVQYXRofS50bXAuJHt1bGlkKCl9YDtcbiAgbGV0IHRlbXBGaWxlQ3JlYXRlZCA9IGZhbHNlO1xuICB0cnkge1xuICAgIGF3YWl0IGVuc3VyZURpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUodGVtcFBhdGgsIGRhdGEpO1xuICAgIHRlbXBGaWxlQ3JlYXRlZCA9IHRydWU7XG4gICAgYXdhaXQgd2l0aFdpbmRvd3NSZXRyeSgoKSA9PiBmcy5yZW5hbWUodGVtcFBhdGgsIGZpbGVQYXRoKSk7XG4gICAgLy8gVHJhY2sgdGhpcyBmaWxlIGluIGNhY2hlIHNvIGZ1dHVyZSB3cml0ZXMga25vdyBpdCBleGlzdHNcbiAgICBjcmVhdGVkRmlsZXNDYWNoZS5hZGQoZmlsZVBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIE9ubHkgdHJ5IHRvIGNsZWFuIHVwIHRlbXAgZmlsZSBpZiBpdCB3YXMgYWN0dWFsbHkgY3JlYXRlZFxuICAgIGlmICh0ZW1wRmlsZUNyZWF0ZWQpIHtcbiAgICAgIGF3YWl0IHdpdGhXaW5kb3dzUmV0cnkoKCkgPT4gZnMudW5saW5rKHRlbXBQYXRoKSwgMykuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEpTT048VD4oXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGRlY29kZXI6IHouWm9kVHlwZTxUPlxuKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgcmV0dXJuIGRlY29kZXIucGFyc2UoSlNPTi5wYXJzZShjb250ZW50LCBqc29uUmV2aXZlcikpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIG51bGw7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRCdWZmZXIoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gIHJldHVybiBjb250ZW50O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEZpcnN0Qnl0ZShcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZmlsZSA9IGF3YWl0IGZzLm9wZW4oZmlsZVBhdGgsICdyJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgYnl0ZSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgxKTtcbiAgICBjb25zdCB7IGJ5dGVzUmVhZCB9ID0gYXdhaXQgZmlsZS5yZWFkKGJ5dGUsIDAsIDEsIDApO1xuICAgIHJldHVybiBieXRlc1JlYWQgPT09IDAgPyB1bmRlZmluZWQgOiBieXRlWzBdO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZpbGUuY2xvc2UoKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlSlNPTihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMudW5saW5rKGZpbGVQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSAhPT0gJ0VOT0VOVCcpIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogQXRvbWljYWxseSBwdWJsaXNoIGEgZnVsbHktd3JpdHRlbiBmaWxlIHdpdGhvdXQgb3ZlcndyaXRpbmcgYW4gZXhpc3Rpbmcgb25lLlxuICpcbiAqIFdyaXRpbmcgZGlyZWN0bHkgd2l0aCBPX0NSRUFUIHwgT19FWENMIG1ha2VzIHRoZSBkZXN0aW5hdGlvbiB2aXNpYmxlIGJlZm9yZVxuICogaXRzIGNvbnRlbnRzIGFyZSBjb21wbGV0ZSwgc28gY29uY3VycmVudCByZWFkZXJzIGNhbiBvYnNlcnZlIGEgcGFydGlhbCBmaWxlLlxuICogSW5zdGVhZCwgd3JpdGUgdG8gYSB1bmlxdWUgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnksIHRoZW4gaGFyZC1saW5rIGl0IGludG9cbiAqIHBsYWNlLiBDcmVhdGluZyB0aGUgbGluayBpcyBhdG9taWMgYW5kIGZhaWxzIHdpdGggRUVYSVNUIGlmIGFub3RoZXIgd3JpdGVyXG4gKiBwdWJsaXNoZWQgdGhlIGRlc3RpbmF0aW9uIGZpcnN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVFeGNsdXNpdmUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGRhdGE6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGF3YWl0IGVuc3VyZURpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKTtcbiAgY29uc3QgdGVtcFBhdGggPSBgJHtmaWxlUGF0aH0udG1wLiR7dWxpZCgpfWA7XG4gIGxldCB0ZW1wRmlsZUNyZWF0ZWQgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0ZW1wUGF0aCwgZGF0YSwgeyBmbGFnOiAnd3gnIH0pO1xuICAgIHRlbXBGaWxlQ3JlYXRlZCA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2l0aFdpbmRvd3NSZXRyeSgoKSA9PiBmcy5saW5rKHRlbXBQYXRoLCBmaWxlUGF0aCkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdFRVhJU1QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAodGVtcEZpbGVDcmVhdGVkKSB7XG4gICAgICBhd2FpdCB3aXRoV2luZG93c1JldHJ5KCgpID0+IGZzLnVubGluayh0ZW1wUGF0aCksIDMpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RKU09ORmlsZXMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICByZXR1cm4gbGlzdEZpbGVzQnlFeHRlbnNpb24oZGlyUGF0aCwgJy5qc29uJyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0RmlsZXNCeUV4dGVuc2lvbihcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihkaXJQYXRoKTtcbiAgICByZXR1cm4gZmlsZXNcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoZXh0ZW5zaW9uKSlcbiAgICAgIC5tYXAoKGYpID0+IGYuc2xpY2UoMCwgLWV4dGVuc2lvbi5sZW5ndGgpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBbXTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5pbnRlcmZhY2UgUGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5Q29uZmlnPFQ+IHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIHNjaGVtYTogei5ab2RUeXBlPFQ+O1xuICBmaWxlUHJlZml4Pzogc3RyaW5nO1xuICBmaWxlSWRGaWx0ZXI/OiAoZmlsZUlkOiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIGZpbHRlcj86IChpdGVtOiBUKSA9PiBib29sZWFuO1xuICBzb3J0T3JkZXI/OiAnYXNjJyB8ICdkZXNjJztcbiAgbGltaXQ/OiBudW1iZXI7XG4gIGN1cnNvcj86IHN0cmluZztcbiAgZ2V0Q3JlYXRlZEF0KGZpbGVuYW1lOiBzdHJpbmcpOiBEYXRlIHwgbnVsbDtcbiAgZ2V0SWQ/KGl0ZW06IFQpOiBzdHJpbmc7XG59XG4vLyBDdXJzb3IgZm9ybWF0OiBcInRpbWVzdGFtcHxpZFwiIGZvciB0aWUtYnJlYWtpbmdcbmludGVyZmFjZSBQYXJzZWRDdXJzb3Ige1xuICB0aW1lc3RhbXA6IERhdGU7XG4gIGlkOiBzdHJpbmcgfCBudWxsO1xufVxuXG5mdW5jdGlvbiBwYXJzZUN1cnNvcihjdXJzb3I6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFBhcnNlZEN1cnNvciB8IG51bGwge1xuICBpZiAoIWN1cnNvcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcGFydHMgPSBjdXJzb3Iuc3BsaXQoJ3wnKTtcbiAgcmV0dXJuIHtcbiAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKHBhcnRzWzBdKSxcbiAgICBpZDogcGFydHNbMV0gfHwgbnVsbCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ3Vyc29yKHRpbWVzdGFtcDogRGF0ZSwgaWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBpZCA/IGAke3RpbWVzdGFtcC50b0lTT1N0cmluZygpfXwke2lkfWAgOiB0aW1lc3RhbXAudG9JU09TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeTxUIGV4dGVuZHMgeyBjcmVhdGVkQXQ6IERhdGUgfT4oXG4gIGNvbmZpZzogUGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5Q29uZmlnPFQ+XG4pOiBQcm9taXNlPFBhZ2luYXRlZFJlc3BvbnNlPFQ+PiB7XG4gIGNvbnN0IHtcbiAgICBkaXJlY3RvcnksXG4gICAgc2NoZW1hLFxuICAgIGZpbGVQcmVmaXgsXG4gICAgZmlsZUlkRmlsdGVyLFxuICAgIGZpbHRlcixcbiAgICBzb3J0T3JkZXIgPSAnZGVzYycsXG4gICAgbGltaXQgPSAyMCxcbiAgICBjdXJzb3IsXG4gICAgZ2V0Q3JlYXRlZEF0LFxuICAgIGdldElkLFxuICB9ID0gY29uZmlnO1xuXG4gIC8vIFZhbGlkYXRlIGZpbGVQcmVmaXggKHR5cGljYWxseSBgJHtydW5JZH0tYCkgc28gcmVxdWVzdC1kZXJpdmVkIHByZWZpeGVzXG4gIC8vIGNvbnNpc3RlbnRseSByZWplY3QgdW5zYWZlIGNoYXJhY3RlcnMuIGZpbGVQcmVmaXggaXMgb25seSB1c2VkIGJlbG93IHRvXG4gIC8vIGZpbHRlciByZWFkZGlyKCkgcmVzdWx0cyBieSBwcmVmaXgg4oCUIGl0IGRvZXNuJ3QgcGFydGljaXBhdGUgaW4gcGF0aFxuICAvLyBjb25zdHJ1Y3Rpb24g4oCUIGJ1dCBrZWVwaW5nIHRoZSB2YWxpZGF0aW9uIHJ1bGUgdW5pZm9ybSBhY3Jvc3MgdGhlXG4gIC8vIHN0b3JhZ2UgbGF5ZXIgYXZvaWRzIHNwZWNpYWwgY2FzZXMgYW5kIGNhdGNoZXMgYmFkIHZhbHVlcyBlYXJsaWVyLlxuICBpZiAoZmlsZVByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdmaWxlUHJlZml4JywgZmlsZVByZWZpeCk7XG4gIH1cblxuICAvLyAxLiBHZXQgYWxsIEpTT04gZmlsZXMgaW4gZGlyZWN0b3J5XG4gIGNvbnN0IGZpbGVJZHMgPSBhd2FpdCBsaXN0SlNPTkZpbGVzKGRpcmVjdG9yeSk7XG5cbiAgLy8gMi4gRmlsdGVyIGJ5IHByZWZpeCBpZiBwcm92aWRlZFxuICBjb25zdCByZWxldmFudEZpbGVJZHMgPSBmaWxlUHJlZml4XG4gICAgPyBmaWxlSWRzLmZpbHRlcigoZmlsZUlkKSA9PiBmaWxlSWQuc3RhcnRzV2l0aChmaWxlUHJlZml4KSlcbiAgICA6IGZpbGVJZHM7XG4gIGNvbnN0IGZpbHRlcmVkRmlsZUlkcyA9IGZpbGVJZEZpbHRlclxuICAgID8gcmVsZXZhbnRGaWxlSWRzLmZpbHRlcihmaWxlSWRGaWx0ZXIpXG4gICAgOiByZWxldmFudEZpbGVJZHM7XG5cbiAgLy8gMy4gVUxJRCBPcHRpbWl6YXRpb246IEZpbHRlciBieSBjdXJzb3IgdXNpbmcgZmlsZW5hbWUgdGltZXN0YW1wcyBiZWZvcmUgbG9hZGluZyBKU09OXG4gIGNvbnN0IHBhcnNlZEN1cnNvciA9IHBhcnNlQ3Vyc29yKGN1cnNvcik7XG4gIGxldCBjYW5kaWRhdGVGaWxlSWRzID0gZmlsdGVyZWRGaWxlSWRzO1xuXG4gIGlmIChwYXJzZWRDdXJzb3IpIHtcbiAgICBjYW5kaWRhdGVGaWxlSWRzID0gZmlsdGVyZWRGaWxlSWRzLmZpbHRlcigoZmlsZUlkKSA9PiB7XG4gICAgICBjb25zdCBmaWxlbmFtZURhdGUgPSBnZXRDcmVhdGVkQXQoYCR7ZmlsZUlkfS5qc29uYCk7XG4gICAgICBpZiAoZmlsZW5hbWVEYXRlKSB7XG4gICAgICAgIC8vIFVzZSBmaWxlbmFtZSB0aW1lc3RhbXAgZm9yIGN1cnNvciBmaWx0ZXJpbmdcbiAgICAgICAgLy8gV2UgbmVlZCB0byBiZSBjYXJlZnVsIGhlcmU6IGlmIHBhcnNlZEN1cnNvciBoYXMgYW4gSUQgKGZvciB0aWUtYnJlYWtpbmcpLFxuICAgICAgICAvLyB3ZSBuZWVkIHRvIGluY2x1ZGUgaXRlbXMgd2l0aCB0aGUgc2FtZSB0aW1lc3RhbXAgZm9yIGxhdGVyIElELWJhc2VkIGZpbHRlcmluZy5cbiAgICAgICAgLy8gSWYgbm8gSUQsIHdlIGNhbiB1c2Ugc3RyaWN0IGluZXF1YWxpdHkgZm9yIG9wdGltaXphdGlvbi5cbiAgICAgICAgY29uc3QgY3Vyc29yVGltZSA9IHBhcnNlZEN1cnNvci50aW1lc3RhbXAuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBmaWxlVGltZSA9IGZpbGVuYW1lRGF0ZS5nZXRUaW1lKCk7XG5cbiAgICAgICAgaWYgKHBhcnNlZEN1cnNvci5pZCkge1xuICAgICAgICAgIC8vIFRpZS1icmVha2luZyBtb2RlOiBpbmNsdWRlIGl0ZW1zIGF0IG9yIG5lYXIgY3Vyc29yIHRpbWVzdGFtcFxuICAgICAgICAgIHJldHVybiBzb3J0T3JkZXIgPT09ICdkZXNjJ1xuICAgICAgICAgICAgPyBmaWxlVGltZSA8PSBjdXJzb3JUaW1lXG4gICAgICAgICAgICA6IGZpbGVUaW1lID49IGN1cnNvclRpbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm8gdGllLWJyZWFraW5nOiBzdHJpY3QgaW5lcXVhbGl0eVxuICAgICAgICAgIHJldHVybiBzb3J0T3JkZXIgPT09ICdkZXNjJ1xuICAgICAgICAgICAgPyBmaWxlVGltZSA8IGN1cnNvclRpbWVcbiAgICAgICAgICAgIDogZmlsZVRpbWUgPiBjdXJzb3JUaW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDYW4ndCBleHRyYWN0IHRpbWVzdGFtcCBmcm9tIGZpbGVuYW1lIChlLmcuLCBzdGVwcyB1c2Ugc2VxdWVudGlhbCBJRHMpLlxuICAgICAgLy8gSW5jbHVkZSB0aGUgZmlsZSBhbmQgZGVmZXIgdG8gSlNPTi1iYXNlZCBmaWx0ZXJpbmcgYmVsb3cuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIDQuIExvYWQgZmlsZXMgaW5kaXZpZHVhbGx5IGFuZCBjb2xsZWN0IHZhbGlkIGl0ZW1zXG4gIGNvbnN0IHZhbGlkSXRlbXM6IFRbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZmlsZUlkIG9mIGNhbmRpZGF0ZUZpbGVJZHMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJlY3RvcnksIGAke2ZpbGVJZH0uanNvbmApO1xuICAgIGxldCBpdGVtOiBUIHwgbnVsbCA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGl0ZW0gPSBhd2FpdCByZWFkSlNPTihmaWxlUGF0aCwgc2NoZW1hKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gV2UgZG9uJ3QgZXhwZWN0IHpvZCBlcnJvcnMgdG8gaGFwcGVuLCBidXQgaWYgdGhlIEpTT04gZG9lcyBnZXQgbWFsZm9ybWVkLFxuICAgICAgLy8gd2Ugc2tpcCB0aGUgaXRlbS4gUHJlZmVyYWJseSwgd2UnZCBoYXZlIGEgd2F5IHRvIG1hcmsgaXRlbXMgYXMgbWFsZm9ybWVkLFxuICAgICAgLy8gc28gdGhhdCB0aGUgVUkgY2FuIGRpc3BsYXkgdGhlbSBhcyBzdWNoLCB3aXRoIHJpY2hlciBtZXNzYWdpbmcuIEluIHRoZSBtZWFudGltZSxcbiAgICAgIC8vIHdlIGp1c3QgbG9nIGEgd2FybmluZyBhbmQgc2tpcCB0aGUgaXRlbS5cbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIHouWm9kRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBTa2lwcGluZyBpdGVtICR7ZmlsZUlkfSBkdWUgdG8gbWFsZm9ybWVkIEpTT046ICR7ZXJyb3IubWVzc2FnZX1gXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIC8vIEFwcGx5IGN1c3RvbSBmaWx0ZXIgZWFybHkgaWYgcHJvdmlkZWRcbiAgICAgIGlmIChmaWx0ZXIgJiYgIWZpbHRlcihpdGVtKSkgY29udGludWU7XG5cbiAgICAgIC8vIERvdWJsZS1jaGVjayBjdXJzb3IgZmlsdGVyaW5nIHdpdGggYWN0dWFsIGNyZWF0ZWRBdCBmcm9tIEpTT05cbiAgICAgIC8vIChpbiBjYXNlIFVMSUQgdGltZXN0YW1wIGRpZmZlcnMgZnJvbSBzdG9yZWQgY3JlYXRlZEF0KVxuICAgICAgaWYgKHBhcnNlZEN1cnNvcikge1xuICAgICAgICBjb25zdCBpdGVtVGltZSA9IGl0ZW0uY3JlYXRlZEF0LmdldFRpbWUoKTtcbiAgICAgICAgY29uc3QgY3Vyc29yVGltZSA9IHBhcnNlZEN1cnNvci50aW1lc3RhbXAuZ2V0VGltZSgpO1xuXG4gICAgICAgIGlmIChzb3J0T3JkZXIgPT09ICdkZXNjJykge1xuICAgICAgICAgIC8vIEZvciBkZXNjZW5kaW5nIG9yZGVyLCBza2lwIGl0ZW1zID49IGN1cnNvclxuICAgICAgICAgIGlmIChpdGVtVGltZSA+IGN1cnNvclRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgIC8vIElmIHRpbWVzdGFtcHMgYXJlIGVxdWFsLCB1c2UgSUQgZm9yIHRpZS1icmVha2luZyAoc2tpcCBpZiBJRCA+PSBjdXJzb3JJZClcbiAgICAgICAgICBpZiAoaXRlbVRpbWUgPT09IGN1cnNvclRpbWUgJiYgcGFyc2VkQ3Vyc29yLmlkICYmIGdldElkKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtSWQgPSBnZXRJZChpdGVtKTtcbiAgICAgICAgICAgIGlmIChpdGVtSWQgPj0gcGFyc2VkQ3Vyc29yLmlkKSBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRm9yIGFzY2VuZGluZyBvcmRlciwgc2tpcCBpdGVtcyA8PSBjdXJzb3JcbiAgICAgICAgICBpZiAoaXRlbVRpbWUgPCBjdXJzb3JUaW1lKSBjb250aW51ZTtcbiAgICAgICAgICAvLyBJZiB0aW1lc3RhbXBzIGFyZSBlcXVhbCwgdXNlIElEIGZvciB0aWUtYnJlYWtpbmcgKHNraXAgaWYgSUQgPD0gY3Vyc29ySWQpXG4gICAgICAgICAgaWYgKGl0ZW1UaW1lID09PSBjdXJzb3JUaW1lICYmIHBhcnNlZEN1cnNvci5pZCAmJiBnZXRJZCkge1xuICAgICAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SWQoaXRlbSk7XG4gICAgICAgICAgICBpZiAoaXRlbUlkIDw9IHBhcnNlZEN1cnNvci5pZCkgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhbGlkSXRlbXMucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cblxuICAvLyA1LiBTb3J0IGJ5IGNyZWF0ZWRBdCAoYW5kIGJ5IElEIGZvciB0aWUtYnJlYWtpbmcgaWYgZ2V0SWQgaXMgcHJvdmlkZWQpXG4gIHZhbGlkSXRlbXMuc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IGFUaW1lID0gYS5jcmVhdGVkQXQuZ2V0VGltZSgpO1xuICAgIGNvbnN0IGJUaW1lID0gYi5jcmVhdGVkQXQuZ2V0VGltZSgpO1xuICAgIGNvbnN0IHRpbWVDb21wYXJpc29uID0gc29ydE9yZGVyID09PSAnYXNjJyA/IGFUaW1lIC0gYlRpbWUgOiBiVGltZSAtIGFUaW1lO1xuXG4gICAgLy8gSWYgdGltZXN0YW1wcyBhcmUgZXF1YWwgYW5kIHdlIGhhdmUgZ2V0SWQsIHVzZSBJRCBmb3Igc3RhYmxlIHNvcnRpbmdcbiAgICBpZiAodGltZUNvbXBhcmlzb24gPT09IDAgJiYgZ2V0SWQpIHtcbiAgICAgIGNvbnN0IGFJZCA9IGdldElkKGEpO1xuICAgICAgY29uc3QgYklkID0gZ2V0SWQoYik7XG4gICAgICByZXR1cm4gc29ydE9yZGVyID09PSAnYXNjJ1xuICAgICAgICA/IGFJZC5sb2NhbGVDb21wYXJlKGJJZClcbiAgICAgICAgOiBiSWQubG9jYWxlQ29tcGFyZShhSWQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aW1lQ29tcGFyaXNvbjtcbiAgfSk7XG5cbiAgLy8gNi4gQXBwbHkgcGFnaW5hdGlvblxuICBjb25zdCBoYXNNb3JlID0gdmFsaWRJdGVtcy5sZW5ndGggPiBsaW1pdDtcbiAgY29uc3QgaXRlbXMgPSBoYXNNb3JlID8gdmFsaWRJdGVtcy5zbGljZSgwLCBsaW1pdCkgOiB2YWxpZEl0ZW1zO1xuICBjb25zdCBuZXh0Q3Vyc29yID1cbiAgICBpdGVtcy5sZW5ndGggPiAwXG4gICAgICA/IGNyZWF0ZUN1cnNvcihcbiAgICAgICAgICBpdGVtc1tpdGVtcy5sZW5ndGggLSAxXS5jcmVhdGVkQXQsXG4gICAgICAgICAgZ2V0SWQ/LihpdGVtc1tpdGVtcy5sZW5ndGggLSAxXSlcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgZGF0YTogaXRlbXMsXG4gICAgY3Vyc29yOiBuZXh0Q3Vyc29yLFxuICAgIGhhc01vcmUsXG4gIH07XG59XG4iXX0=
530
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRW5EOzs7OztHQUtHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFjO0lBQ3RDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2YsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGtCQUFrQjtJQUN6RCxZQUFZLElBQVksRUFBRSxLQUFhO1FBQ3JDLEtBQUssQ0FDSCxVQUFVLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsNkRBQTZELENBQ3hHLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDO0lBQ3BDLENBQUM7SUFF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QU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQzFDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztJQUNoRSxNQUFNLFVBQVUsR0FDZCxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7UUFDZCxDQUFDLENBQUMsWUFBWSxDQUNWLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDakMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FDakM7UUFDSCxDQUFDLENBQUMsSUFBSSxDQUFDO0lBRVgsT0FBTztRQUNMLElBQUksRUFBRSxLQUFLO1FBQ1gsTUFBTSxFQUFFLFVBQVU7UUFDbEIsT0FBTztLQUNSLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBFbnRpdHlDb25mbGljdEVycm9yLCBXb3JrZmxvd1dvcmxkRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGFnaW5hdGVkUmVzcG9uc2UgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmNvbnN0IHVsaWQgPSBtb25vdG9uaWNGYWN0b3J5KCgpID0+IE1hdGgucmFuZG9tKCkpO1xuXG4vKipcbiAqIFRydW5jYXRlIGEgcG9zc2libHktdW50cnVzdGVkIHZhbHVlIGZvciBpbmNsdXNpb24gaW4gYW4gZXJyb3IgbWVzc2FnZS5cbiAqIEtlZXBzIGVycm9yIG91dHB1dCBhY3Rpb25hYmxlIGZvciBkZXZlbG9wZXJzIGluIGRldiBtb2RlIHdoaWxlIGxpbWl0aW5nXG4gKiB0aGUgYW1vdW50IG9mIGF0dGFja2VyLWNvbnRyb2xsZWQgZGF0YSByZWZsZWN0ZWQgYmFjayBpZiBhIGB3b3JsZC1sb2NhbGBcbiAqIGJhY2tlbmQgaXMgZXZlciBydW4gaW4gYSBjb250ZXh0IHRoYXQgc3VyZmFjZXMgdGhlc2UgbWVzc2FnZXMgdG8gY2xpZW50cy5cbiAqL1xuZnVuY3Rpb24gdHJ1bmNhdGVGb3JFcnJvcih2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGNvbnN0IHMgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBTdHJpbmcodmFsdWUpO1xuICBjb25zdCBNQVggPSA0ODtcbiAgcmV0dXJuIHMubGVuZ3RoID4gTUFYID8gYCR7cy5zbGljZSgwLCBNQVgpfeKApmAgOiBzO1xufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgY2FsbGVyLXN1cHBsaWVkIGVudGl0eSBJRCBjb250YWlucyBjaGFyYWN0ZXJzIHRoYXQgd291bGRcbiAqIGVzY2FwZSB0aGUgc3RvcmFnZSByb290IChwYXRoIHRyYXZlcnNhbCkgb3Igb3RoZXJ3aXNlIHByb2R1Y2UgYW4gdW5zYWZlXG4gKiBmaWxlbmFtZS4gRXh0ZW5kcyB7QGxpbmsgV29ya2Zsb3dXb3JsZEVycm9yfSBzbyB0aGUgcGxhdGZvcm0ncyBzdGFuZGFyZFxuICogZXJyb3ItdG8tSFRUUCBtYXBwaW5nIGhhbmRsZXMgaXQgYWxvbmdzaWRlIG90aGVyIHdvcmxkLWxheWVyIGVycm9ycy5cbiAqL1xuZXhwb3J0IGNsYXNzIFVuc2FmZUVudGl0eUlkRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd1dvcmxkRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihraW5kOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIGBVbnNhZmUgJHtraW5kfSBcIiR7dHJ1bmNhdGVGb3JFcnJvcih2YWx1ZSl9XCI6IG11c3Qgbm90IGJlIGVtcHR5LCBjb250YWluIFwiLlwiLCBcIi9cIiwgXCJcXFxcXCIsIG9yIG51bGwgYnl0ZXNgXG4gICAgKTtcbiAgICB0aGlzLm5hbWUgPSAnVW5zYWZlRW50aXR5SWRFcnJvcic7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBVbnNhZmVFbnRpdHlJZEVycm9yIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBFcnJvciAmJiB2YWx1ZS5uYW1lID09PSAnVW5zYWZlRW50aXR5SWRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGEgc3RyaW5nIGlzIHNhZmUgdG8gZW1iZWQgaW4gYSBmaWxlc3lzdGVtIHBhdGggYXMgYSBzaW5nbGVcbiAqIHBhdGggY29tcG9uZW50LiBSZWplY3RzIHZhbHVlcyB0aGF0IGFyZTpcbiAqICAgLSBlbXB0eVxuICogICAtIHN0YXJ0aW5nIHdpdGggYC5gIChibG9ja3MgYC5gLCBgLi5gLCBgLmxvY2tzYCwgYC50bXBgLCBhbmQgb3RoZXJcbiAqICAgICBoaWRkZW4gb3IgcmVzZXJ2ZWQgZmlsZW5hbWVzKVxuICogICAtIGNvbnRhaW5pbmcgYC5gICh3b3VsZCBjb2xsaWRlIHdpdGggdGhlIGAudGFnYCAvIGAuanNvbmAgc3VmZml4IHRoZVxuICogICAgIHRhZ2dpbmcgbG9naWMgc3RyaXBzIGZyb20gZmlsZW5hbWVzOyBzZWUge0BsaW5rIHN0cmlwVGFnfSAvXG4gKiAgICAge0BsaW5rIGdldE9iamVjdENyZWF0ZWRBdH0pXG4gKiAgIC0gY29udGFpbmluZyBgL2AsIGBcXGAsIG9yIGEgTlVMIGJ5dGVcbiAqXG4gKiBUaGlzIGlzIHRoZSBwcmltYXJ5IGRlZmVuc2UgYWdhaW5zdCBwYXRoLXRyYXZlcnNhbCBhdHRhY2tzIHdoZXJlIGFcbiAqIHJlcXVlc3QgYm9keSBzdXBwbGllcyBhIGBydW5JZGAgLyBgc3RlcElkYCAvIGBjb3JyZWxhdGlvbklkYCBjb250YWluaW5nXG4gKiBgLi4vYCBzZXF1ZW5jZXMgdG8gcmVhZCBvciB3cml0ZSBmaWxlcyBvdXRzaWRlIHRoZSBzdG9yYWdlIHJvb3QuXG4gKiB7QGxpbmsgcmVzb2x2ZVdpdGhpbkJhc2V9IHByb3ZpZGVzIGEgYmVsdC1hbmQtc3VzcGVuZGVycyBjb250YWlubWVudFxuICogY2hlY2sgYXQgdGhlIHBvaW50IG9mIGBwYXRoLmpvaW5gIGZvciBkZWZlbnNlIGluIGRlcHRoLlxuICpcbiAqIEBwYXJhbSBraW5kIC0gSHVtYW4tcmVhZGFibGUgbGFiZWwgdXNlZCBpbiB0aGUgZXJyb3IgbWVzc2FnZSAoZS5nLiBcInJ1bklkXCIpXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGU7IHRocm93cyB7QGxpbmsgVW5zYWZlRW50aXR5SWRFcnJvcn1cbiAqICAgaWYgdGhlIHZhbHVlIGlzIG5vdCBzYWZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U2FmZUVudGl0eUlkKGtpbmQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoXG4gICAgdmFsdWUubGVuZ3RoID09PSAwIHx8XG4gICAgdmFsdWUuc3RhcnRzV2l0aCgnLicpIHx8XG4gICAgdmFsdWUuaW5jbHVkZXMoJy8nKSB8fFxuICAgIHZhbHVlLmluY2x1ZGVzKCdcXFxcJykgfHxcbiAgICB2YWx1ZS5pbmNsdWRlcygnXFwwJykgfHxcbiAgICB2YWx1ZS5pbmNsdWRlcygnLicpXG4gICkge1xuICAgIHRocm93IG5ldyBVbnNhZmVFbnRpdHlJZEVycm9yKGtpbmQsIHZhbHVlKTtcbiAgfVxufVxuXG4vKipcbiAqIEpvaW4gYGJhc2VkaXJgIHdpdGggYW4gZW50aXR5LXJlbGF0aXZlIHBhdGggYW5kIGFzc2VydCB0aGUgcmVzdWx0IHN0YXlzXG4gKiBpbnNpZGUgYGJhc2VkaXJgLiBDb21wbGVtZW50cyB7QGxpbmsgYXNzZXJ0U2FmZUVudGl0eUlkfTogcGVyLWVudHJ5LXBvaW50XG4gKiB2YWxpZGF0aW9uIGlzIHRoZSBwcmltYXJ5IGRlZmVuc2UsIGFuZCB0aGlzIGZpbmFsIGNoZWNrIGNhdGNoZXMgYW55IHBhdGhcbiAqIGVzY2FwZSB0aGF0IHNsaXBwZWQgcGFzdCAoZS5nLiBhIG5ldyBjYWxsIHNpdGUgdGhhdCBmb3Jnb3QgdG8gdmFsaWRhdGUsXG4gKiBvciBhbiB1bnVzdWFsIGNoYXJhY3RlciBjb21iaW5hdGlvbiBvbiBhIGZ1dHVyZSBmaWxlc3lzdGVtKS4gVGhyb3dzXG4gKiB7QGxpbmsgVW5zYWZlRW50aXR5SWRFcnJvcn0gaWYgdGhlIGpvaW5lZCBwYXRoIGVzY2FwZXMgYGJhc2VkaXJgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgLi4uc2VnbWVudHM6IHN0cmluZ1tdXG4pOiBzdHJpbmcge1xuICBjb25zdCByZXNvbHZlZEJhc2UgPSBwYXRoLnJlc29sdmUoYmFzZWRpcik7XG4gIGNvbnN0IGpvaW5lZCA9IHBhdGgucmVzb2x2ZShiYXNlZGlyLCAuLi5zZWdtZW50cyk7XG4gIGlmIChqb2luZWQgIT09IHJlc29sdmVkQmFzZSAmJiAham9pbmVkLnN0YXJ0c1dpdGgocmVzb2x2ZWRCYXNlICsgcGF0aC5zZXApKSB7XG4gICAgdGhyb3cgbmV3IFVuc2FmZUVudGl0eUlkRXJyb3IoJ3BhdGgnLCBzZWdtZW50cy5qb2luKCcvJykpO1xuICB9XG4gIHJldHVybiBqb2luZWQ7XG59XG5cbmNvbnN0IGlzV2luZG93cyA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG5cbi8qKlxuICogRXhlY3V0ZSBhIGZpbGVzeXN0ZW0gb3BlcmF0aW9uIHdpdGggcmV0cnkgbG9naWMgb24gV2luZG93cy5cbiAqIE9uIFdpbmRvd3MsIGZpbGUgb3BlcmF0aW9ucyBjYW4gZmFpbCB3aXRoIEVQRVJNL0VCVVNZL0VBQ0NFUyB3aGVuIGZpbGVzXG4gKiBhcmUgYnJpZWZseSBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzIG9yIGFudGl2aXJ1cy4gVGhpcyB3cmFwcGVyIGFkZHNcbiAqIGV4cG9uZW50aWFsIGJhY2tvZmYgcmV0cnkgbG9naWMuIE9uIG5vbi1XaW5kb3dzIHBsYXRmb3JtcywgZXhlY3V0ZXMgZGlyZWN0bHkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdpdGhXaW5kb3dzUmV0cnk8VD4oXG4gIGZuOiAoKSA9PiBQcm9taXNlPFQ+LFxuICBtYXhSZXRyaWVzID0gNVxuKTogUHJvbWlzZTxUPiB7XG4gIGlmICghaXNXaW5kb3dzKSByZXR1cm4gZm4oKTtcblxuICBjb25zdCByZXRyeWFibGVFcnJvcnMgPSBbJ0VQRVJNJywgJ0VCVVNZJywgJ0VBQ0NFUyddO1xuICBjb25zdCBiYXNlRGVsYXlNcyA9IDEwO1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IG1heFJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zdCBpc1JldHJ5YWJsZSA9XG4gICAgICAgIGF0dGVtcHQgPCBtYXhSZXRyaWVzICYmIHJldHJ5YWJsZUVycm9ycy5pbmNsdWRlcyhlcnJvci5jb2RlKTtcbiAgICAgIGlmICghaXNSZXRyeWFibGUpIHRocm93IGVycm9yO1xuICAgICAgLy8gRXhwb25lbnRpYWwgYmFja29mZiB3aXRoIGppdHRlclxuICAgICAgY29uc3QgZGVsYXkgPSBiYXNlRGVsYXlNcyAqIDIgKiogYXR0ZW1wdCArIE1hdGgucmFuZG9tKCkgKiBiYXNlRGVsYXlNcztcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgfVxuICB9XG4gIC8vIFR5cGVTY3JpcHQ6IHVucmVhY2hhYmxlLCBidXQgc2F0aXNmaWVzIHJldHVybiB0eXBlXG4gIHRocm93IG5ldyBFcnJvcignUmV0cnkgbG9vcCBleGl0ZWQgdW5leHBlY3RlZGx5Jyk7XG59XG5cbi8vIEluLW1lbW9yeSBjYWNoZSBvZiBjcmVhdGVkIGZpbGVzIHRvIGF2b2lkIGV4cGVuc2l2ZSBmcy5hY2Nlc3MoKSBjYWxsc1xuLy8gVGhpcyBpcyBzYWZlIGJlY2F1c2Ugd2Ugb25seSB3cml0ZSBvbmNlIHBlciBmaWxlIHBhdGggKG5vIG92ZXJ3cml0ZXMgd2l0aG91dCBleHBsaWNpdCBmbGFnKVxuY29uc3QgY3JlYXRlZEZpbGVzQ2FjaGUgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuLyoqXG4gKiBDbGVhciB0aGUgY3JlYXRlZCBmaWxlcyBjYWNoZS4gVXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gZmlsZXMgYXJlIGRlbGV0ZWQgZXh0ZXJuYWxseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyQ3JlYXRlZEZpbGVzQ2FjaGUoKTogdm9pZCB7XG4gIGNyZWF0ZWRGaWxlc0NhY2hlLmNsZWFyKCk7XG59XG5cbmV4cG9ydCB7IHVsaWRUb0RhdGUgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vKipcbiAqIFJlZ2V4IG1hdGNoaW5nIGEgdGFnIHN1ZmZpeCBvbiBhIGZpbGVJZCAoYWZ0ZXIgYC5qc29uYCBoYXMgYmVlbiBzdHJpcHBlZCkuXG4gKiBFLmcuLCBgd3J1bl9BQkMudml0ZXN0LTBgIOKGkiB0aGUgYC52aXRlc3QtMGAgcGFydC5cbiAqIFRhZ3Mgc3RhcnQgd2l0aCBhIGxldHRlciBhbmQgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcnMgYW5kIGh5cGhlbnMuXG4gKiBFbnRpdHkgSURzIChVTElEcywgc3RlcF9OLCBldGMuKSBuZXZlciBjb250YWluIGRvdHMsIHNvIHRoZSBmaXJzdCBkb3RcbiAqIGFsd2F5cyBtYXJrcyB0aGUgdGFnIGJvdW5kYXJ5LlxuICovXG5jb25zdCBUQUdfUEFUVEVSTiA9IC9cXC5bYS16QS1aXVthLXpBLVowLTktXSokLztcblxuLyoqXG4gKiBTdHJpcCBhIHRhZyBzdWZmaXggZnJvbSBhIGZpbGVJZC5cbiAqIGB3cnVuX0FCQy52aXRlc3QtMGAg4oaSIGB3cnVuX0FCQ2BcbiAqIGB3cnVuX0FCQ2Ag4oaSIGB3cnVuX0FCQ2AgKG5vLW9wIGlmIG5vIHRhZylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwVGFnKGZpbGVJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZpbGVJZC5yZXBsYWNlKFRBR19QQVRURVJOLCAnJyk7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhIGZpbGVJZCBiZWxvbmdzIHRvIGEgc3BlY2lmaWMgdGFnLlxuICogYHdydW5fQUJDLnZpdGVzdC0wYCBiZWxvbmdzIHRvIGB2aXRlc3QtMGAuXG4gKiBVbnRhZ2dlZCBmaWxlSWRzIG5ldmVyIG1hdGNoIGEgdGFnLXNjb3BlZCBsb29rdXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNUYWcoZmlsZUlkOiBzdHJpbmcsIHRhZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaWxlSWQuZW5kc1dpdGgoYC4ke3RhZ31gKTtcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGEgZmlsZUlkIGNhcnJpZXMgbm8gdGFnIHN1ZmZpeCBhdCBhbGwuXG4gKiBgd3J1bl9BQkNgIOKGkiB0cnVlLCBgd3J1bl9BQkMudml0ZXN0LTBgIOKGkiBmYWxzZS5cbiAqXG4gKiBBbiB1bnRhZ2dlZCB3b3JsZCdzIHJlYWRzIChgcmVhZEpTT05XaXRoRmFsbGJhY2tgKSBjYW4gb25seSByZXNvbHZlIHVudGFnZ2VkXG4gKiBmaWxlcywgc28gd2hlbiBpdCBsaXN0cyBlbnRpdGllcyBmb3IgcmVjb3ZlcnkgaXQgbXVzdCBza2lwIGZpbGVzIHRhZ2dlZCBieVxuICogb3RoZXIgd29ybGRzIChlLmcuIHRoZSB2aXRlc3QgaGFybmVzcykgc2hhcmluZyB0aGUgc2FtZSBkYXRhIGRpcmVjdG9yeSDigJRcbiAqIG90aGVyd2lzZSBpdCB3b3VsZCByZS1lbnF1ZXVlIHJ1bnMgaXQgY2Fubm90IHN1YnNlcXVlbnRseSByZWFkIGJhY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1VudGFnZ2VkKGZpbGVJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhVEFHX1BBVFRFUk4udGVzdChmaWxlSWQpO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBmaWxlIHBhdGggZm9yIGFuIGVudGl0eSwgd2l0aCBvcHRpb25hbCB0YWcgZW1iZWRkZWQgaW4gdGhlIGZpbGVuYW1lLlxuICogYHRhZ2dlZFBhdGgoJy9kYXRhJywgJ3J1bnMnLCAnd3J1bl9BQkMnLCAndml0ZXN0LTAnKWAg4oaSIGAvZGF0YS9ydW5zL3dydW5fQUJDLnZpdGVzdC0wLmpzb25gXG4gKiBgdGFnZ2VkUGF0aCgnL2RhdGEnLCAncnVucycsICd3cnVuX0FCQycpYCDihpIgYC9kYXRhL3J1bnMvd3J1bl9BQkMuanNvbmBcbiAqXG4gKiBUaGUgYGZpbGVJZGAgYW5kIGB0YWdgIGFyZSB2YWxpZGF0ZWQgd2l0aCB7QGxpbmsgYXNzZXJ0U2FmZUVudGl0eUlkfSBhbmRcbiAqIHRoZSByZXN1bHQgaXMgY29udGFpbm1lbnQtY2hlY2tlZCB3aXRoIHtAbGluayByZXNvbHZlV2l0aGluQmFzZX0gdG9cbiAqIHByZXZlbnQgcGF0aC10cmF2ZXJzYWwgYXR0YWNrcyB3aGVuIHZhbHVlcyBhcmUgZGVyaXZlZCBmcm9tIHVudHJ1c3RlZFxuICogcmVxdWVzdCBpbnB1dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhZ2dlZFBhdGgoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgZW50aXR5RGlyOiBzdHJpbmcsXG4gIGZpbGVJZDogc3RyaW5nLFxuICB0YWc/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGFzc2VydFNhZmVFbnRpdHlJZCgnZmlsZUlkJywgZmlsZUlkKTtcbiAgaWYgKHRhZyAhPT0gdW5kZWZpbmVkKSBhc3NlcnRTYWZlRW50aXR5SWQoJ3RhZycsIHRhZyk7XG4gIGNvbnN0IGZpbGVuYW1lID0gdGFnID8gYCR7ZmlsZUlkfS4ke3RhZ30uanNvbmAgOiBgJHtmaWxlSWR9Lmpzb25gO1xuICByZXR1cm4gcmVzb2x2ZVdpdGhpbkJhc2UoYmFzZWRpciwgZW50aXR5RGlyLCBmaWxlbmFtZSk7XG59XG5cbi8qKlxuICogUmVhZCBhIEpTT04gZW50aXR5IHdpdGggdGFnZ2VkIGZhbGxiYWNrLlxuICogV2hlbiBhIHRhZyBpcyBzZXQsIHRyaWVzIHRoZSB0YWdnZWQgcGF0aCBmaXJzdCwgdGhlbiBmYWxscyBiYWNrIHRvIHRoZVxuICogdW50YWdnZWQgcGF0aCAoc28gYSB0YWdnZWQgd29ybGQgY2FuIHJlYWQgZW50aXRpZXMgd3JpdHRlbiB3aXRob3V0IGEgdGFnKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRKU09OV2l0aEZhbGxiYWNrPFQ+KFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIGVudGl0eURpcjogc3RyaW5nLFxuICBmaWxlSWQ6IHN0cmluZyxcbiAgc2NoZW1hOiB6LlpvZFR5cGU8VD4sXG4gIHRhZz86IHN0cmluZ1xuKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICBhc3NlcnRTYWZlRW50aXR5SWQoJ2ZpbGVJZCcsIGZpbGVJZCk7XG4gIGlmICh0YWcgIT09IHVuZGVmaW5lZCkgYXNzZXJ0U2FmZUVudGl0eUlkKCd0YWcnLCB0YWcpO1xuICBpZiAodGFnKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZEpTT04oXG4gICAgICByZXNvbHZlV2l0aGluQmFzZShiYXNlZGlyLCBlbnRpdHlEaXIsIGAke2ZpbGVJZH0uJHt0YWd9Lmpzb25gKSxcbiAgICAgIHNjaGVtYVxuICAgICk7XG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICByZXR1cm4gcmVhZEpTT04oXG4gICAgcmVzb2x2ZVdpdGhpbkJhc2UoYmFzZWRpciwgZW50aXR5RGlyLCBgJHtmaWxlSWR9Lmpzb25gKSxcbiAgICBzY2hlbWFcbiAgKTtcbn1cblxuLyoqXG4gKiBMaXN0IGFsbCBmaWxlbmFtZXMgaW4gYSBkaXJlY3RvcnkgdGhhdCBoYXZlIGEgc3BlY2lmaWMgdGFnLlxuICogUmV0dXJucyBmdWxsIGZpbGVuYW1lcyAoZS5nLiwgYHdydW5fQUJDLnZpdGVzdC0wLmpzb25gKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RUYWdnZWRGaWxlcyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICB0YWc6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBzdWZmaXggPSBgLiR7dGFnfS5qc29uYDtcbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVzLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aChzdWZmaXgpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBbXTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIExpc3QgYWxsIGZpbGVuYW1lcyBpbiBhIGRpcmVjdG9yeSB0aGF0IGhhdmUgYSBzcGVjaWZpYyB0YWcgYW5kIGV4dGVuc2lvbi5cbiAqIFJldHVybnMgZnVsbCBmaWxlbmFtZXMgKGUuZy4sIGBzdHJlYW0tY2hua19BQkMudml0ZXN0LTAuYmluYCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0VGFnZ2VkRmlsZXNCeUV4dGVuc2lvbihcbiAgZGlyUGF0aDogc3RyaW5nLFxuICB0YWc6IHN0cmluZyxcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgc3VmZml4ID0gYC4ke3RhZ30ke2V4dGVuc2lvbn1gO1xuICB0cnkge1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihkaXJQYXRoKTtcbiAgICByZXR1cm4gZmlsZXMuZmlsdGVyKChmKSA9PiBmLmVuZHNXaXRoKHN1ZmZpeCkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVEaXIoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgIC8vIElnbm9yZSBpZiBhbHJlYWR5IGV4aXN0c1xuICB9XG59XG5cbmludGVyZmFjZSBXcml0ZU9wdGlvbnMge1xuICBvdmVyd3JpdGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEN1c3RvbSBKU09OIHJlcGxhY2VyIHRoYXQgZW5jb2RlcyBVaW50OEFycmF5IGFzIGJhc2U2NCBzdHJpbmdzLlxuICogRm9ybWF0OiB7IF9fdHlwZTogJ1VpbnQ4QXJyYXknLCBkYXRhOiAnPGJhc2U2ND4nIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25SZXBsYWNlcihfa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiAnVWludDhBcnJheScsXG4gICAgICBkYXRhOiBCdWZmZXIuZnJvbSh2YWx1ZSkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIEN1c3RvbSBKU09OIHJldml2ZXIgdGhhdCBkZWNvZGVzIGJhc2U2NCBzdHJpbmdzIGJhY2sgdG8gVWludDhBcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25SZXZpdmVyKF9rZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICh2YWx1ZSBhcyBhbnkpLl9fdHlwZSA9PT0gJ1VpbnQ4QXJyYXknICYmXG4gICAgdHlwZW9mICh2YWx1ZSBhcyBhbnkpLmRhdGEgPT09ICdzdHJpbmcnXG4gICkge1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSgodmFsdWUgYXMgYW55KS5kYXRhLCAnYmFzZTY0JykpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlSlNPTihcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZGF0YTogYW55LFxuICBvcHRzPzogV3JpdGVPcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHdyaXRlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShkYXRhLCBqc29uUmVwbGFjZXIsIDIpLCBvcHRzKTtcbn1cblxuLyoqXG4gKiBXcml0ZXMgZGF0YSB0byBhIGZpbGUgdXNpbmcgYXRvbWljIHdyaXRlLXJlbmFtZSBwYXR0ZXJuLlxuICpcbiAqIE5vdGU6IFdoaWxlIHRoaXMgZnVuY3Rpb24gdXNlcyB0ZW1wIGZpbGVzIHRvIGF2b2lkIHBhcnRpYWwgd3JpdGVzLFxuICogaXQgZG9lcyBub3QgcHJvdmlkZSBwcm90ZWN0aW9uIGFnYWluc3QgY29uY3VycmVudCB3cml0ZXMgZnJvbSBtdWx0aXBsZVxuICogcHJvY2Vzc2VzLiBJbiBhIG11bHRpLXdyaXRlciBzY2VuYXJpbywgdGhlIGxhc3Qgd3JpdGVyIHdpbnMuXG4gKiBGb3IgcHJvZHVjdGlvbiB1c2Ugd2l0aCBtdWx0aXBsZSB3cml0ZXJzLCBjb25zaWRlciB1c2luZyBhIHByb3BlclxuICogZGF0YWJhc2Ugb3IgbG9ja2luZyBtZWNoYW5pc20uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZGF0YTogc3RyaW5nIHwgQnVmZmVyLFxuICBvcHRzPzogV3JpdGVPcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFvcHRzPy5vdmVyd3JpdGUpIHtcbiAgICAvLyBGYXN0IHBhdGg6IGNoZWNrIGluLW1lbW9yeSBjYWNoZSBmaXJzdCB0byBhdm9pZCBleHBlbnNpdmUgZnMuYWNjZXNzKCkgY2FsbHNcbiAgICAvLyBUaGlzIHByb3ZpZGVzIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IHdoZW4gY3JlYXRpbmcgbWFueSBmaWxlc1xuICAgIGlmIChjcmVhdGVkRmlsZXNDYWNoZS5oYXMoZmlsZVBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgYEZpbGUgJHtmaWxlUGF0aH0gYWxyZWFkeSBleGlzdHMgYW5kICdvdmVyd3JpdGUnIGlzIGZhbHNlYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTbG93IHBhdGg6IGNoZWNrIGZpbGVzeXN0ZW0gZm9yIGZpbGVzIGNyZWF0ZWQgYmVmb3JlIHRoaXMgcHJvY2VzcyBzdGFydGVkXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICAvLyBGaWxlIGV4aXN0cyBvbiBkaXNrLCBhZGQgdG8gY2FjaGUgZm9yIGZ1dHVyZSBjaGVja3NcbiAgICAgIGNyZWF0ZWRGaWxlc0NhY2hlLmFkZChmaWxlUGF0aCk7XG4gICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgYEZpbGUgJHtmaWxlUGF0aH0gYWxyZWFkeSBleGlzdHMgYW5kICdvdmVyd3JpdGUnIGlzIGZhbHNlYFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBJZiBmaWxlIGRvZXNuJ3QgZXhpc3QgKEVOT0VOVCksIGNvbnRpbnVlIHdpdGggd3JpdGVcbiAgICAgIGlmIChlcnJvci5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB0ZW1wUGF0aCA9IGAke2ZpbGVQYXRofS50bXAuJHt1bGlkKCl9YDtcbiAgbGV0IHRlbXBGaWxlQ3JlYXRlZCA9IGZhbHNlO1xuICB0cnkge1xuICAgIGF3YWl0IGVuc3VyZURpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUodGVtcFBhdGgsIGRhdGEpO1xuICAgIHRlbXBGaWxlQ3JlYXRlZCA9IHRydWU7XG4gICAgYXdhaXQgd2l0aFdpbmRvd3NSZXRyeSgoKSA9PiBmcy5yZW5hbWUodGVtcFBhdGgsIGZpbGVQYXRoKSk7XG4gICAgLy8gVHJhY2sgdGhpcyBmaWxlIGluIGNhY2hlIHNvIGZ1dHVyZSB3cml0ZXMga25vdyBpdCBleGlzdHNcbiAgICBjcmVhdGVkRmlsZXNDYWNoZS5hZGQoZmlsZVBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIE9ubHkgdHJ5IHRvIGNsZWFuIHVwIHRlbXAgZmlsZSBpZiBpdCB3YXMgYWN0dWFsbHkgY3JlYXRlZFxuICAgIGlmICh0ZW1wRmlsZUNyZWF0ZWQpIHtcbiAgICAgIGF3YWl0IHdpdGhXaW5kb3dzUmV0cnkoKCkgPT4gZnMudW5saW5rKHRlbXBQYXRoKSwgMykuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEpTT048VD4oXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGRlY29kZXI6IHouWm9kVHlwZTxUPlxuKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgcmV0dXJuIGRlY29kZXIucGFyc2UoSlNPTi5wYXJzZShjb250ZW50LCBqc29uUmV2aXZlcikpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIG51bGw7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRCdWZmZXIoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gIHJldHVybiBjb250ZW50O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEZpcnN0Qnl0ZShcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZmlsZSA9IGF3YWl0IGZzLm9wZW4oZmlsZVBhdGgsICdyJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgYnl0ZSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgxKTtcbiAgICBjb25zdCB7IGJ5dGVzUmVhZCB9ID0gYXdhaXQgZmlsZS5yZWFkKGJ5dGUsIDAsIDEsIDApO1xuICAgIHJldHVybiBieXRlc1JlYWQgPT09IDAgPyB1bmRlZmluZWQgOiBieXRlWzBdO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZpbGUuY2xvc2UoKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlSlNPTihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMudW5saW5rKGZpbGVQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSAhPT0gJ0VOT0VOVCcpIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogQXRvbWljYWxseSBwdWJsaXNoIGEgZnVsbHktd3JpdHRlbiBmaWxlIHdpdGhvdXQgb3ZlcndyaXRpbmcgYW4gZXhpc3Rpbmcgb25lLlxuICpcbiAqIFdyaXRpbmcgZGlyZWN0bHkgd2l0aCBPX0NSRUFUIHwgT19FWENMIG1ha2VzIHRoZSBkZXN0aW5hdGlvbiB2aXNpYmxlIGJlZm9yZVxuICogaXRzIGNvbnRlbnRzIGFyZSBjb21wbGV0ZSwgc28gY29uY3VycmVudCByZWFkZXJzIGNhbiBvYnNlcnZlIGEgcGFydGlhbCBmaWxlLlxuICogSW5zdGVhZCwgd3JpdGUgdG8gYSB1bmlxdWUgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnksIHRoZW4gaGFyZC1saW5rIGl0IGludG9cbiAqIHBsYWNlLiBDcmVhdGluZyB0aGUgbGluayBpcyBhdG9taWMgYW5kIGZhaWxzIHdpdGggRUVYSVNUIGlmIGFub3RoZXIgd3JpdGVyXG4gKiBwdWJsaXNoZWQgdGhlIGRlc3RpbmF0aW9uIGZpcnN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVFeGNsdXNpdmUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGRhdGE6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGF3YWl0IGVuc3VyZURpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKTtcbiAgY29uc3QgdGVtcFBhdGggPSBgJHtmaWxlUGF0aH0udG1wLiR7dWxpZCgpfWA7XG4gIGxldCB0ZW1wRmlsZUNyZWF0ZWQgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0ZW1wUGF0aCwgZGF0YSwgeyBmbGFnOiAnd3gnIH0pO1xuICAgIHRlbXBGaWxlQ3JlYXRlZCA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2l0aFdpbmRvd3NSZXRyeSgoKSA9PiBmcy5saW5rKHRlbXBQYXRoLCBmaWxlUGF0aCkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdFRVhJU1QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAodGVtcEZpbGVDcmVhdGVkKSB7XG4gICAgICBhd2FpdCB3aXRoV2luZG93c1JldHJ5KCgpID0+IGZzLnVubGluayh0ZW1wUGF0aCksIDMpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RKU09ORmlsZXMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICByZXR1cm4gbGlzdEZpbGVzQnlFeHRlbnNpb24oZGlyUGF0aCwgJy5qc29uJyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0RmlsZXNCeUV4dGVuc2lvbihcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihkaXJQYXRoKTtcbiAgICByZXR1cm4gZmlsZXNcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoZXh0ZW5zaW9uKSlcbiAgICAgIC5tYXAoKGYpID0+IGYuc2xpY2UoMCwgLWV4dGVuc2lvbi5sZW5ndGgpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBbXTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5pbnRlcmZhY2UgUGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5Q29uZmlnPFQ+IHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIHNjaGVtYTogei5ab2RUeXBlPFQ+O1xuICBmaWxlUHJlZml4Pzogc3RyaW5nO1xuICBmaWxlSWRGaWx0ZXI/OiAoZmlsZUlkOiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIGZpbHRlcj86IChpdGVtOiBUKSA9PiBib29sZWFuO1xuICBzb3J0T3JkZXI/OiAnYXNjJyB8ICdkZXNjJztcbiAgbGltaXQ/OiBudW1iZXI7XG4gIGN1cnNvcj86IHN0cmluZztcbiAgZ2V0Q3JlYXRlZEF0KGZpbGVuYW1lOiBzdHJpbmcpOiBEYXRlIHwgbnVsbDtcbiAgZ2V0SWQ/KGl0ZW06IFQpOiBzdHJpbmc7XG59XG4vLyBDdXJzb3IgZm9ybWF0OiBcInRpbWVzdGFtcHxpZFwiIGZvciB0aWUtYnJlYWtpbmdcbmludGVyZmFjZSBQYXJzZWRDdXJzb3Ige1xuICB0aW1lc3RhbXA6IERhdGU7XG4gIGlkOiBzdHJpbmcgfCBudWxsO1xufVxuXG5mdW5jdGlvbiBwYXJzZUN1cnNvcihjdXJzb3I6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFBhcnNlZEN1cnNvciB8IG51bGwge1xuICBpZiAoIWN1cnNvcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcGFydHMgPSBjdXJzb3Iuc3BsaXQoJ3wnKTtcbiAgcmV0dXJuIHtcbiAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKHBhcnRzWzBdKSxcbiAgICBpZDogcGFydHNbMV0gfHwgbnVsbCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ3Vyc29yKHRpbWVzdGFtcDogRGF0ZSwgaWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBpZCA/IGAke3RpbWVzdGFtcC50b0lTT1N0cmluZygpfXwke2lkfWAgOiB0aW1lc3RhbXAudG9JU09TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeTxUIGV4dGVuZHMgeyBjcmVhdGVkQXQ6IERhdGUgfT4oXG4gIGNvbmZpZzogUGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5Q29uZmlnPFQ+XG4pOiBQcm9taXNlPFBhZ2luYXRlZFJlc3BvbnNlPFQ+PiB7XG4gIGNvbnN0IHtcbiAgICBkaXJlY3RvcnksXG4gICAgc2NoZW1hLFxuICAgIGZpbGVQcmVmaXgsXG4gICAgZmlsZUlkRmlsdGVyLFxuICAgIGZpbHRlcixcbiAgICBzb3J0T3JkZXIgPSAnZGVzYycsXG4gICAgbGltaXQgPSAyMCxcbiAgICBjdXJzb3IsXG4gICAgZ2V0Q3JlYXRlZEF0LFxuICAgIGdldElkLFxuICB9ID0gY29uZmlnO1xuXG4gIC8vIFZhbGlkYXRlIGZpbGVQcmVmaXggKHR5cGljYWxseSBgJHtydW5JZH0tYCkgc28gcmVxdWVzdC1kZXJpdmVkIHByZWZpeGVzXG4gIC8vIGNvbnNpc3RlbnRseSByZWplY3QgdW5zYWZlIGNoYXJhY3RlcnMuIGZpbGVQcmVmaXggaXMgb25seSB1c2VkIGJlbG93IHRvXG4gIC8vIGZpbHRlciByZWFkZGlyKCkgcmVzdWx0cyBieSBwcmVmaXgg4oCUIGl0IGRvZXNuJ3QgcGFydGljaXBhdGUgaW4gcGF0aFxuICAvLyBjb25zdHJ1Y3Rpb24g4oCUIGJ1dCBrZWVwaW5nIHRoZSB2YWxpZGF0aW9uIHJ1bGUgdW5pZm9ybSBhY3Jvc3MgdGhlXG4gIC8vIHN0b3JhZ2UgbGF5ZXIgYXZvaWRzIHNwZWNpYWwgY2FzZXMgYW5kIGNhdGNoZXMgYmFkIHZhbHVlcyBlYXJsaWVyLlxuICBpZiAoZmlsZVByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdmaWxlUHJlZml4JywgZmlsZVByZWZpeCk7XG4gIH1cblxuICAvLyAxLiBHZXQgYWxsIEpTT04gZmlsZXMgaW4gZGlyZWN0b3J5XG4gIGNvbnN0IGZpbGVJZHMgPSBhd2FpdCBsaXN0SlNPTkZpbGVzKGRpcmVjdG9yeSk7XG5cbiAgLy8gMi4gRmlsdGVyIGJ5IHByZWZpeCBpZiBwcm92aWRlZFxuICBjb25zdCByZWxldmFudEZpbGVJZHMgPSBmaWxlUHJlZml4XG4gICAgPyBmaWxlSWRzLmZpbHRlcigoZmlsZUlkKSA9PiBmaWxlSWQuc3RhcnRzV2l0aChmaWxlUHJlZml4KSlcbiAgICA6IGZpbGVJZHM7XG4gIGNvbnN0IGZpbHRlcmVkRmlsZUlkcyA9IGZpbGVJZEZpbHRlclxuICAgID8gcmVsZXZhbnRGaWxlSWRzLmZpbHRlcihmaWxlSWRGaWx0ZXIpXG4gICAgOiByZWxldmFudEZpbGVJZHM7XG5cbiAgLy8gMy4gVUxJRCBPcHRpbWl6YXRpb246IEZpbHRlciBieSBjdXJzb3IgdXNpbmcgZmlsZW5hbWUgdGltZXN0YW1wcyBiZWZvcmUgbG9hZGluZyBKU09OXG4gIGNvbnN0IHBhcnNlZEN1cnNvciA9IHBhcnNlQ3Vyc29yKGN1cnNvcik7XG4gIGxldCBjYW5kaWRhdGVGaWxlSWRzID0gZmlsdGVyZWRGaWxlSWRzO1xuXG4gIGlmIChwYXJzZWRDdXJzb3IpIHtcbiAgICBjYW5kaWRhdGVGaWxlSWRzID0gZmlsdGVyZWRGaWxlSWRzLmZpbHRlcigoZmlsZUlkKSA9PiB7XG4gICAgICBjb25zdCBmaWxlbmFtZURhdGUgPSBnZXRDcmVhdGVkQXQoYCR7ZmlsZUlkfS5qc29uYCk7XG4gICAgICBpZiAoZmlsZW5hbWVEYXRlKSB7XG4gICAgICAgIC8vIFVzZSBmaWxlbmFtZSB0aW1lc3RhbXAgZm9yIGN1cnNvciBmaWx0ZXJpbmdcbiAgICAgICAgLy8gV2UgbmVlZCB0byBiZSBjYXJlZnVsIGhlcmU6IGlmIHBhcnNlZEN1cnNvciBoYXMgYW4gSUQgKGZvciB0aWUtYnJlYWtpbmcpLFxuICAgICAgICAvLyB3ZSBuZWVkIHRvIGluY2x1ZGUgaXRlbXMgd2l0aCB0aGUgc2FtZSB0aW1lc3RhbXAgZm9yIGxhdGVyIElELWJhc2VkIGZpbHRlcmluZy5cbiAgICAgICAgLy8gSWYgbm8gSUQsIHdlIGNhbiB1c2Ugc3RyaWN0IGluZXF1YWxpdHkgZm9yIG9wdGltaXphdGlvbi5cbiAgICAgICAgY29uc3QgY3Vyc29yVGltZSA9IHBhcnNlZEN1cnNvci50aW1lc3RhbXAuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBmaWxlVGltZSA9IGZpbGVuYW1lRGF0ZS5nZXRUaW1lKCk7XG5cbiAgICAgICAgaWYgKHBhcnNlZEN1cnNvci5pZCkge1xuICAgICAgICAgIC8vIFRpZS1icmVha2luZyBtb2RlOiBpbmNsdWRlIGl0ZW1zIGF0IG9yIG5lYXIgY3Vyc29yIHRpbWVzdGFtcFxuICAgICAgICAgIHJldHVybiBzb3J0T3JkZXIgPT09ICdkZXNjJ1xuICAgICAgICAgICAgPyBmaWxlVGltZSA8PSBjdXJzb3JUaW1lXG4gICAgICAgICAgICA6IGZpbGVUaW1lID49IGN1cnNvclRpbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm8gdGllLWJyZWFraW5nOiBzdHJpY3QgaW5lcXVhbGl0eVxuICAgICAgICAgIHJldHVybiBzb3J0T3JkZXIgPT09ICdkZXNjJ1xuICAgICAgICAgICAgPyBmaWxlVGltZSA8IGN1cnNvclRpbWVcbiAgICAgICAgICAgIDogZmlsZVRpbWUgPiBjdXJzb3JUaW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDYW4ndCBleHRyYWN0IHRpbWVzdGFtcCBmcm9tIGZpbGVuYW1lIChlLmcuLCBzdGVwcyB1c2Ugc2VxdWVudGlhbCBJRHMpLlxuICAgICAgLy8gSW5jbHVkZSB0aGUgZmlsZSBhbmQgZGVmZXIgdG8gSlNPTi1iYXNlZCBmaWx0ZXJpbmcgYmVsb3cuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIDQuIExvYWQgZmlsZXMgaW5kaXZpZHVhbGx5IGFuZCBjb2xsZWN0IHZhbGlkIGl0ZW1zXG4gIGNvbnN0IHZhbGlkSXRlbXM6IFRbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZmlsZUlkIG9mIGNhbmRpZGF0ZUZpbGVJZHMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJlY3RvcnksIGAke2ZpbGVJZH0uanNvbmApO1xuICAgIGxldCBpdGVtOiBUIHwgbnVsbCA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGl0ZW0gPSBhd2FpdCByZWFkSlNPTihmaWxlUGF0aCwgc2NoZW1hKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gV2UgZG9uJ3QgZXhwZWN0IHpvZCBlcnJvcnMgdG8gaGFwcGVuLCBidXQgaWYgdGhlIEpTT04gZG9lcyBnZXQgbWFsZm9ybWVkLFxuICAgICAgLy8gd2Ugc2tpcCB0aGUgaXRlbS4gUHJlZmVyYWJseSwgd2UnZCBoYXZlIGEgd2F5IHRvIG1hcmsgaXRlbXMgYXMgbWFsZm9ybWVkLFxuICAgICAgLy8gc28gdGhhdCB0aGUgVUkgY2FuIGRpc3BsYXkgdGhlbSBhcyBzdWNoLCB3aXRoIHJpY2hlciBtZXNzYWdpbmcuIEluIHRoZSBtZWFudGltZSxcbiAgICAgIC8vIHdlIGp1c3QgbG9nIGEgd2FybmluZyBhbmQgc2tpcCB0aGUgaXRlbS5cbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIHouWm9kRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBTa2lwcGluZyBpdGVtICR7ZmlsZUlkfSBkdWUgdG8gbWFsZm9ybWVkIEpTT046ICR7ZXJyb3IubWVzc2FnZX1gXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIC8vIEFwcGx5IGN1c3RvbSBmaWx0ZXIgZWFybHkgaWYgcHJvdmlkZWRcbiAgICAgIGlmIChmaWx0ZXIgJiYgIWZpbHRlcihpdGVtKSkgY29udGludWU7XG5cbiAgICAgIC8vIERvdWJsZS1jaGVjayBjdXJzb3IgZmlsdGVyaW5nIHdpdGggYWN0dWFsIGNyZWF0ZWRBdCBmcm9tIEpTT05cbiAgICAgIC8vIChpbiBjYXNlIFVMSUQgdGltZXN0YW1wIGRpZmZlcnMgZnJvbSBzdG9yZWQgY3JlYXRlZEF0KVxuICAgICAgaWYgKHBhcnNlZEN1cnNvcikge1xuICAgICAgICBjb25zdCBpdGVtVGltZSA9IGl0ZW0uY3JlYXRlZEF0LmdldFRpbWUoKTtcbiAgICAgICAgY29uc3QgY3Vyc29yVGltZSA9IHBhcnNlZEN1cnNvci50aW1lc3RhbXAuZ2V0VGltZSgpO1xuXG4gICAgICAgIGlmIChzb3J0T3JkZXIgPT09ICdkZXNjJykge1xuICAgICAgICAgIC8vIEZvciBkZXNjZW5kaW5nIG9yZGVyLCBza2lwIGl0ZW1zID49IGN1cnNvclxuICAgICAgICAgIGlmIChpdGVtVGltZSA+IGN1cnNvclRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgIC8vIElmIHRpbWVzdGFtcHMgYXJlIGVxdWFsLCB1c2UgSUQgZm9yIHRpZS1icmVha2luZyAoc2tpcCBpZiBJRCA+PSBjdXJzb3JJZClcbiAgICAgICAgICBpZiAoaXRlbVRpbWUgPT09IGN1cnNvclRpbWUgJiYgcGFyc2VkQ3Vyc29yLmlkICYmIGdldElkKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtSWQgPSBnZXRJZChpdGVtKTtcbiAgICAgICAgICAgIGlmIChpdGVtSWQgPj0gcGFyc2VkQ3Vyc29yLmlkKSBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRm9yIGFzY2VuZGluZyBvcmRlciwgc2tpcCBpdGVtcyA8PSBjdXJzb3JcbiAgICAgICAgICBpZiAoaXRlbVRpbWUgPCBjdXJzb3JUaW1lKSBjb250aW51ZTtcbiAgICAgICAgICAvLyBJZiB0aW1lc3RhbXBzIGFyZSBlcXVhbCwgdXNlIElEIGZvciB0aWUtYnJlYWtpbmcgKHNraXAgaWYgSUQgPD0gY3Vyc29ySWQpXG4gICAgICAgICAgaWYgKGl0ZW1UaW1lID09PSBjdXJzb3JUaW1lICYmIHBhcnNlZEN1cnNvci5pZCAmJiBnZXRJZCkge1xuICAgICAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SWQoaXRlbSk7XG4gICAgICAgICAgICBpZiAoaXRlbUlkIDw9IHBhcnNlZEN1cnNvci5pZCkgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhbGlkSXRlbXMucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cblxuICAvLyA1LiBTb3J0IGJ5IGNyZWF0ZWRBdCAoYW5kIGJ5IElEIGZvciB0aWUtYnJlYWtpbmcgaWYgZ2V0SWQgaXMgcHJvdmlkZWQpXG4gIHZhbGlkSXRlbXMuc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IGFUaW1lID0gYS5jcmVhdGVkQXQuZ2V0VGltZSgpO1xuICAgIGNvbnN0IGJUaW1lID0gYi5jcmVhdGVkQXQuZ2V0VGltZSgpO1xuICAgIGNvbnN0IHRpbWVDb21wYXJpc29uID0gc29ydE9yZGVyID09PSAnYXNjJyA/IGFUaW1lIC0gYlRpbWUgOiBiVGltZSAtIGFUaW1lO1xuXG4gICAgLy8gSWYgdGltZXN0YW1wcyBhcmUgZXF1YWwgYW5kIHdlIGhhdmUgZ2V0SWQsIHVzZSBJRCBmb3Igc3RhYmxlIHNvcnRpbmdcbiAgICBpZiAodGltZUNvbXBhcmlzb24gPT09IDAgJiYgZ2V0SWQpIHtcbiAgICAgIGNvbnN0IGFJZCA9IGdldElkKGEpO1xuICAgICAgY29uc3QgYklkID0gZ2V0SWQoYik7XG4gICAgICByZXR1cm4gc29ydE9yZGVyID09PSAnYXNjJ1xuICAgICAgICA/IGFJZC5sb2NhbGVDb21wYXJlKGJJZClcbiAgICAgICAgOiBiSWQubG9jYWxlQ29tcGFyZShhSWQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aW1lQ29tcGFyaXNvbjtcbiAgfSk7XG5cbiAgLy8gNi4gQXBwbHkgcGFnaW5hdGlvblxuICBjb25zdCBoYXNNb3JlID0gdmFsaWRJdGVtcy5sZW5ndGggPiBsaW1pdDtcbiAgY29uc3QgaXRlbXMgPSBoYXNNb3JlID8gdmFsaWRJdGVtcy5zbGljZSgwLCBsaW1pdCkgOiB2YWxpZEl0ZW1zO1xuICBjb25zdCBuZXh0Q3Vyc29yID1cbiAgICBpdGVtcy5sZW5ndGggPiAwXG4gICAgICA/IGNyZWF0ZUN1cnNvcihcbiAgICAgICAgICBpdGVtc1tpdGVtcy5sZW5ndGggLSAxXS5jcmVhdGVkQXQsXG4gICAgICAgICAgZ2V0SWQ/LihpdGVtc1tpdGVtcy5sZW5ndGggLSAxXSlcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgZGF0YTogaXRlbXMsXG4gICAgY3Vyc29yOiBuZXh0Q3Vyc29yLFxuICAgIGhhc01vcmUsXG4gIH07XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAY1C,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAM7D,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,KAAK,aAAa,EAClB,YAAY,GACb,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG;IAC/B,+EAA+E;IAC/E,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACnE,qEAAqE;IACrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,UAAU,CA6GnE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAa1C,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAM7D,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,KAAK,aAAa,EAClB,YAAY,GACb,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG;IAC/B,+EAA+E;IAC/E,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACnE,qEAAqE;IACrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,UAAU,CA+HnE"}
package/dist/index.js CHANGED
@@ -3,11 +3,11 @@ import { rm } from 'node:fs/promises';
3
3
  import path from 'node:path';
4
4
  import { reenqueueActiveRuns, SPEC_VERSION_CURRENT } from '@workflow/world';
5
5
  import { config } from './config.js';
6
- import { clearCreatedFilesCache, deleteJSON, hasTag, listTaggedFiles, listTaggedFilesByExtension, readJSON, } from './fs.js';
6
+ import { clearCreatedFilesCache, deleteJSON, hasTag, isUntagged, listTaggedFiles, listTaggedFilesByExtension, readJSON, } from './fs.js';
7
7
  import { initDataDir } from './init.js';
8
8
  import { instrumentObject } from './instrumentObject.js';
9
9
  import { createQueue } from './queue.js';
10
- import { hashToken } from './storage/helpers.js';
10
+ import { hashToken, hookRecoveryMarkerPath } from './storage/helpers.js';
11
11
  import { createStorage } from './storage.js';
12
12
  import { createStreamer } from './streamer.js';
13
13
  // Re-export init types and utilities for consumers
@@ -49,15 +49,23 @@ export function createLocalWorld(args) {
49
49
  if (!recoverActiveRuns) {
50
50
  return;
51
51
  }
52
- const recoveryRuns = tag
53
- ? {
54
- ...storage.runs,
55
- list: ((params) => storage.runs.list({
56
- ...params,
57
- fileIdFilter: (fileId) => hasTag(fileId, tag),
58
- })),
59
- }
60
- : storage.runs;
52
+ // Scope recovery to this world's own files. A tagged world recovers only
53
+ // its tag; an untagged world recovers only untagged files. Without the
54
+ // untagged filter, an untagged dev server sharing the data directory with
55
+ // the vitest harness would list tagged runs (list enumerates every file)
56
+ // and re-enqueue them, but run_started's tagged-or-untagged read can't
57
+ // resolve a foreign tag — yielding "did not return the run entity" 500s
58
+ // on startup until the message exhausts its deliveries.
59
+ const fileIdFilter = tag
60
+ ? (fileId) => hasTag(fileId, tag)
61
+ : isUntagged;
62
+ const recoveryRuns = {
63
+ ...storage.runs,
64
+ list: ((params) => storage.runs.list({
65
+ ...params,
66
+ fileIdFilter,
67
+ })),
68
+ };
61
69
  await reenqueueActiveRuns(recoveryRuns, queue.queue, 'world-local');
62
70
  },
63
71
  async close() {
@@ -67,10 +75,12 @@ export function createLocalWorld(args) {
67
75
  if (tag) {
68
76
  // Selectively delete only files matching this tag
69
77
  const basedir = mergedConfig.dataDir;
70
- // Delete hook token constraint files BEFORE deleting the hooks,
71
- // since we need to read each hook to extract its token hash.
72
- // Constraint files are untagged ({sha256}.json) so listTaggedFiles
73
- // won't find them we must resolve them via the hook data.
78
+ // Delete hook token constraint files (and recovery markers,
79
+ // for disk hygiene) BEFORE deleting the hooks, since we need
80
+ // to read each hook to extract its token hash. Constraint
81
+ // files and markers are untagged (`{sha256}.json` and
82
+ // `{sha256}.recovery.json`) so listTaggedFiles won't find
83
+ // them — we must resolve them via the hook data.
74
84
  const hooksDir = path.join(basedir, 'hooks');
75
85
  const taggedHookFiles = await listTaggedFiles(hooksDir, tag);
76
86
  const { HookSchema } = await import('@workflow/world');
@@ -78,6 +88,7 @@ export function createLocalWorld(args) {
78
88
  const hook = await readJSON(path.join(hooksDir, hookFile), HookSchema);
79
89
  if (hook?.token) {
80
90
  await deleteJSON(path.join(hooksDir, 'tokens', `${hashToken(hook.token)}.json`));
91
+ await deleteJSON(hookRecoveryMarkerPath(basedir, hook.token, hook.runId, hook.hookId));
81
92
  }
82
93
  }));
83
94
  // Delete tagged entity files across all directories
@@ -112,4 +123,4 @@ export function createLocalWorld(args) {
112
123
  },
113
124
  };
114
125
  }
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUU3QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLE1BQU0sRUFDTixlQUFlLEVBQ2YsMEJBQTBCLEVBQzFCLFFBQVEsR0FDVCxNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxXQUFXLEVBQXNCLE1BQU0sWUFBWSxDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0MsbURBQW1EO0FBQ25ELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLGFBQWEsRUFDYixXQUFXLEVBRVgsWUFBWSxHQUNiLE1BQU0sV0FBVyxDQUFDO0FBV25COzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxJQUFzQjtJQUNyRCxNQUFNLFdBQVcsR0FBRyxJQUFJO1FBQ3RCLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUNoQixNQUFNLENBQUMs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QztnQkFDMUQsTUFBTSxjQUFjLEdBQUcsTUFBTSwwQkFBMEIsQ0FDckQsU0FBUyxFQUNULEdBQUcsRUFDSCxNQUFNLENBQ1AsQ0FBQztnQkFDRixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3ZCLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQ25ELENBQ0YsQ0FBQztnQkFDRixpRUFBaUU7Z0JBQ2pFLHNCQUFzQixFQUFFLENBQUM7WUFDM0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxNQUFNLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBybSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB0eXBlIHsgUXVldWVQcmVmaXgsIFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IHJlZW5xdWV1ZUFjdGl2ZVJ1bnMsIFNQRUNfVkVSU0lPTl9DVVJSRU5UIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcuanMnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi9jb25maWcuanMnO1xuaW1wb3J0IHtcbiAgY2xlYXJDcmVhdGVkRmlsZXNDYWNoZSxcbiAgZGVsZXRlSlNPTixcbiAgaGFzVGFnLFxuICBsaXN0VGFnZ2VkRmlsZXMsXG4gIGxpc3RUYWdnZWRGaWxlc0J5RXh0ZW5zaW9uLFxuICByZWFkSlNPTixcbn0gZnJvbSAnLi9mcy5qcyc7XG5pbXBvcnQgeyBpbml0RGF0YURpciB9IGZyb20gJy4vaW5pdC5qcyc7XG5pbXBvcnQgeyBpbnN0cnVtZW50T2JqZWN0IH0gZnJvbSAnLi9pbnN0cnVtZW50T2JqZWN0LmpzJztcbmltcG9ydCB7IGNyZWF0ZVF1ZXVlLCB0eXBlIERpcmVjdEhhbmRsZXIgfSBmcm9tICcuL3F1ZXVlLmpzJztcbmltcG9ydCB7IGhhc2hUb2tlbiB9IGZyb20gJy4vc3RvcmFnZS9oZWxwZXJzLmpzJztcbmltcG9ydCB7IGNyZWF0ZVN0b3JhZ2UgfSBmcm9tICcuL3N0b3JhZ2UuanMnO1xuaW1wb3J0IHsgY3JlYXRlU3RyZWFtZXIgfSBmcm9tICcuL3N0cmVhbWVyLmpzJztcblxuLy8gUmUtZXhwb3J0IGluaXQgdHlwZXMgYW5kIHV0aWxpdGllcyBmb3IgY29uc3VtZXJzXG5leHBvcnQge1xuICBEYXRhRGlyQWNjZXNzRXJyb3IsXG4gIERhdGFEaXJWZXJzaW9uRXJyb3IsXG4gIGVuc3VyZURhdGFEaXIsXG4gIGluaXREYXRhRGlyLFxuICB0eXBlIFBhcnNlZFZlcnNpb24sXG4gIHBhcnNlVmVyc2lvbixcbn0gZnJvbSAnLi9pbml0LmpzJztcblxuZXhwb3J0IHR5cGUgeyBEaXJlY3RIYW5kbGVyIH0gZnJvbSAnLi9xdWV1ZS5qcyc7XG5cbmV4cG9ydCB0eXBlIExvY2FsV29ybGQgPSBXb3JsZCAmIHtcbiAgLyoqIFJlZ2lzdGVyIGEgZGlyZWN0IGluLXByb2Nlc3MgaGFuZGxlciBmb3IgYSBxdWV1ZSBwcmVmaXgsIGJ5cGFzc2luZyBIVFRQLiAqL1xuICByZWdpc3RlckhhbmRsZXIocHJlZml4OiBRdWV1ZVByZWZpeCwgaGFuZGxlcjogRGlyZWN0SGFuZGxlcik6IHZvaWQ7XG4gIC8qKiBDbGVhciBhbGwgd29ya2Zsb3cgZGF0YSAocnVucywgc3RlcHMsIGV2ZW50cywgaG9va3MsIHN0cmVhbXMpLiAqL1xuICBjbGVhcigpOiBQcm9taXNlPHZvaWQ+O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbG9jYWwgd29ybGQgaW5zdGFuY2UgdGhhdCBjb21iaW5lcyBxdWV1ZSwgc3RvcmFnZSwgYW5kIHN0cmVhbWVyIGZ1bmN0aW9uYWxpdGllcy5cbiAqXG4gKiBAcGFyYW0gYXJncyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0gYXJncy5kYXRhRGlyIC0gRGlyZWN0b3J5IGZvciBzdG9yaW5nIHdvcmtmbG93IGRhdGEgKGRlZmF1bHQ6IGAud29ya2Zsb3ctZGF0YS9gKVxuICogQHBhcmFtIGFyZ3MucG9ydCAtIFBvcnQgb3ZlcnJpZGUgZm9yIHF1ZXVlIHRyYW5zcG9ydCAoZGVmYXVsdDogYXV0by1kZXRlY3RlZClcbiAqIEBwYXJhbSBhcmdzLmJhc2VVcmwgLSBGdWxsIGJhc2UgVVJMIG92ZXJyaWRlIGZvciBxdWV1ZSB0cmFuc3BvcnQgKGRlZmF1bHQ6IGBodHRwOi8vbG9jYWxob3N0Ontwb3J0fWApXG4gKiBAcGFyYW0gYXJncy5yZWNvdmVyQWN0aXZlUnVucyAtIFdoZXRoZXIgYHN0YXJ0KClgIHNob3VsZCByZS1lbnF1ZXVlIHBlbmRpbmcvcnVubmluZyBydW5zIGZyb20gc3RvcmFnZSAoZGVmYXVsdDogYHRydWVgKVxuICogQHBhcmFtIGFyZ3MudGFnIC0gT3B0aW9uYWwgdGFnIHRvIHNjb3BlIGZpbGVzIChlLmcuLCBgdml0ZXN0LTBgKS4gV2hlbiBzZXQsIGZpbGVzIGFyZSB3cml0dGVuXG4gKiAgIGFzIGB7aWR9Lnt0YWd9Lmpzb25gIGFuZCBgY2xlYXIoKWAgb25seSBkZWxldGVzIGZpbGVzIG1hdGNoaW5nIHRoaXMgdGFnLlxuICogQHRocm93cyB7RGF0YURpckFjY2Vzc0Vycm9yfSBJZiB0aGUgZGF0YSBkaXJlY3RvcnkgY2Fubm90IGJlIGNyZWF0ZWQgb3IgYWNjZXNzZWRcbiAqIEB0aHJvd3Mge0RhdGFEaXJWZXJzaW9uRXJyb3J9IElmIHRoZSBkYXRhIGRpcmVjdG9yeSB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTG9jYWxXb3JsZChhcmdzPzogUGFydGlhbDxDb25maWc+KTogTG9jYWxXb3JsZCB7XG4gIGNvbnN0IGRlZmluZWRBcmdzID0gYXJnc1xuICAgID8gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhhcmdzKS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgIClcbiAgICA6IHt9O1xuICBjb25zdCBtZXJnZWRDb25maWcgPSB7IC4uLmNvbmZpZy52YWx1ZSwgLi4uZGVmaW5lZEFyZ3MgfTtcbiAgY29uc3QgdGFnID0gbWVyZ2VkQ29uZmlnLnRhZztcbiAgY29uc3QgcXVldWUgPSBjcmVhdGVRdWV1ZShtZXJnZWRDb25maWcpO1xuICBjb25zdCBzdG9yYWdlID0gY3JlYXRlU3RvcmFnZShtZXJnZWRDb25maWcuZGF0YURpciwgdGFnKTtcbiAgY29uc3QgcmVjb3ZlckFjdGl2ZVJ1bnMgPSBtZXJnZWRDb25maWcucmVjb3ZlckFjdGl2ZVJ1bnMgPz8gdHJ1ZTtcbiAgcmV0dXJuIHtcbiAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgLi4ucXVldWUsXG4gICAgLi4uc3RvcmFnZSxcbiAgICAuLi5pbnN0cnVtZW50T2JqZWN0KCd3b3JsZC5zdHJlYW1zJywge1xuICAgICAgLi4uY3JlYXRlU3RyZWFtZXIobWVyZ2VkQ29uZmlnLmRhdGFEaXIsIHRhZyksXG4gICAgICAuLi4obWVyZ2VkQ29uZmlnLnN0cmVhbUZsdXNoSW50ZXJ2YWxNcyAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgc3RyZWFtRmx1c2hJbnRlcnZhbE1zOiBtZXJnZWRDb25maWcuc3RyZWFtRmx1c2hJbnRlcnZhbE1zLFxuICAgICAgfSksXG4gICAgfSksXG4gICAgYXN5bmMgc3RhcnQoKSB7XG4gICAgICBhd2FpdCBpbml0RGF0YURpcihtZXJnZWRDb25maWcuZGF0YURpcik7XG4gICAgICBpZiAoIXJlY292ZXJBY3RpdmVSdW5zKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY292ZXJ5UnVucyA9IHRhZ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnN0b3JhZ2UucnVucyxcbiAgICAgICAgICAgIGxpc3Q6ICgocGFyYW1zKSA9PlxuICAgICAgICAgICAgICBzdG9yYWdlLnJ1bnMubGlzdCh7XG4gICAgICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgICAgIGZpbGVJZEZpbHRlcjogKGZpbGVJZCkgPT4gaGFzVGFnKGZpbGVJZCwgdGFnKSxcbiAgICAgICAgICAgICAgfSkpIGFzIHR5cGVvZiBzdG9yYWdlLnJ1bnMubGlzdCxcbiAgICAgICAgICB9XG4gICAgICAgIDogc3RvcmFnZS5ydW5zO1xuICAgICAgYXdhaXQgcmVlbnF1ZXVlQWN0aXZlUnVucyhyZWNvdmVyeVJ1bnMsIHF1ZXVlLnF1ZXVlLCAnd29ybGQtbG9jYWwnKTtcbiAgICB9LFxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgYXdhaXQgcXVldWUuY2xvc2UoKTtcbiAgICB9LFxuICAgIGFzeW5jIGNsZWFyKCkge1xuICAgICAgaWYgKHRhZykge1xuICAgICAgICAvLyBTZWxlY3RpdmVseSBkZWxldGUgb25seSBmaWxlcyBtYXRjaGluZyB0aGlzIHRhZ1xuICAgICAgICBjb25zdCBiYXNlZGlyID0gbWVyZ2VkQ29uZmlnLmRhdGFEaXI7XG5cbiAgICAgICAgLy8gRGVsZXRlIGhvb2sgdG9rZW4gY29uc3RyYWludCBmaWxlcyBCRUZPUkUgZGVsZXRpbmcgdGhlIGhvb2tzLFxuICAgICAgICAvLyBzaW5jZSB3ZSBuZWVkIHRvIHJlYWQgZWFjaCBob29rIHRvIGV4dHJhY3QgaXRzIHRva2VuIGhhc2guXG4gICAgICAgIC8vIENvbnN0cmFpbnQgZmlsZXMgYXJlIHVudGFnZ2VkICh7c2hhMjU2fS5qc29uKSBzbyBsaXN0VGFnZ2VkRmlsZXNcbiAgICAgICAgLy8gd29uJ3QgZmluZCB0aGVtIOKAlCB3ZSBtdXN0IHJlc29sdmUgdGhlbSB2aWEgdGhlIGhvb2sgZGF0YS5cbiAgICAgICAgY29uc3QgaG9va3NEaXIgPSBwYXRoLmpvaW4oYmFzZWRpciwgJ2hvb2tzJyk7XG4gICAgICAgIGNvbnN0IHRhZ2dlZEhvb2tGaWxlcyA9IGF3YWl0IGxpc3RUYWdnZWRGaWxlcyhob29rc0RpciwgdGFnKTtcbiAgICAgICAgY29uc3QgeyBIb29rU2NoZW1hIH0gPSBhd2FpdCBpbXBvcnQoJ0B3b3JrZmxvdy93b3JsZCcpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICB0YWdnZWRIb29rRmlsZXMubWFwKGFzeW5jIChob29rRmlsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaG9vayA9IGF3YWl0IHJlYWRKU09OKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oaG9va3NEaXIsIGhvb2tGaWxlKSxcbiAgICAgICAgICAgICAgSG9va1NjaGVtYVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChob29rPy50b2tlbikge1xuICAgICAgICAgICAgICBhd2FpdCBkZWxldGVKU09OKFxuICAgICAgICAgICAgICAgIHBhdGguam9pbihob29rc0RpciwgJ3Rva2VucycsIGAke2hhc2hUb2tlbihob29rLnRva2VuKX0uanNvbmApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBEZWxldGUgdGFnZ2VkIGVudGl0eSBmaWxlcyBhY3Jvc3MgYWxsIGRpcmVjdG9yaWVzXG4gICAgICAgIGNvbnN0IGVudGl0eURpcnMgPSBbXG4gICAgICAgICAgJ3J1bnMnLFxuICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgJ2V2ZW50cycsXG4gICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICdzdHJlYW1zL3J1bnMnLFxuICAgICAgICBdO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBlbnRpdHlEaXJzLm1hcChhc3luYyAoZGlyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmdWxsRGlyID0gcGF0aC5qb2luKGJhc2VkaXIsIGRpcik7XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGxpc3RUYWdnZWRGaWxlcyhmdWxsRGlyLCB0YWcpO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgIGZpbGVzLm1hcCgoZikgPT4gZGVsZXRlSlNPTihwYXRoLmpvaW4oZnVsbERpciwgZikpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICAvLyBDbGVhbiB1cCBsb2NrIGZpbGVzIHVzZWQgZm9yIGF0b21pYyB0ZXJtaW5hbC1zdGF0ZSBndWFyZHNcbiAgICAgICAgYXdhaXQgZnNcbiAgICAgICAgICAucm0ocGF0aC5qb2luKGJhc2VkaXIsICcubG9ja3MnKSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gICAgICAgICAgLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgLy8gRGVsZXRlIHRhZ2dlZCBzdHJlYW0gY2h1bmtzICgue3RhZ30uYmluIGZpbGVzKVxuICAgICAgICBjb25zdCBjaHVua3NEaXIgPSBwYXRoLmpvaW4oYmFzZWRpciwgJ3N0cmVhbXMnLCAnY2h1bmtzJyk7XG4gICAgICAgIGNvbnN0IHRhZ2dlZEJpbkZpbGVzID0gYXdhaXQgbGlzdFRhZ2dlZEZpbGVzQnlFeHRlbnNpb24oXG4gICAgICAgICAgY2h1bmtzRGlyLFxuICAgICAgICAgIHRhZyxcbiAgICAgICAgICAnLmJpbidcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdGFnZ2VkQmluRmlsZXMubWFwKChmKSA9PlxuICAgICAgICAgICAgZnMudW5saW5rKHBhdGguam9pbihjaHVua3NEaXIsIGYpKS5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIC8vIENsZWFyIHRoZSBpbi1tZW1vcnkgd3JpdGUgY2FjaGUgc28gZGVsZXRlZCBwYXRocyBhcmUgZm9yZ290dGVuXG4gICAgICAgIGNsZWFyQ3JlYXRlZEZpbGVzQ2FjaGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHJtKG1lcmdlZENvbmZpZy5kYXRhRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IGluaXREYXRhRGlyKG1lcmdlZENvbmZpZy5kYXRhRGlyKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuIl19
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUU3QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLE1BQU0sRUFDTixVQUFVLEVBQ1YsZUFBZSxFQUNmLDBCQUEwQixFQUMxQixRQUFRLEdBQ1QsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFzQixNQUFNLFlBQVksQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9DLG1EQUFtRDtBQUNuRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsV0FBVyxFQUVYLFlBQVksR0FDYixNQUFNLFdBQVcsQ0FBQztBQVduQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBc0I7SUFDckQsTUFBTSxXQUFXLEdBQUcsSUFBSTtRQUN0QixDQUFDLENBQUMsTUFBTSxDQUFD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Z0JBQzVELE1BQU0sRUFBRTtxQkFDTCxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztxQkFDbEUsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixpREFBaUQ7Z0JBQ2pELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDMUQsTUFBTSxjQUFjLEdBQUcsTUFBTSwwQkFBMEIsQ0FDckQsU0FBUyxFQUNULEdBQUcsRUFDSCxNQUFNLENBQ1AsQ0FBQztnQkFDRixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3ZCLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQ25ELENBQ0YsQ0FBQztnQkFDRixpRUFBaUU7Z0JBQ2pFLHNCQUFzQixFQUFFLENBQUM7WUFDM0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxNQUFNLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBybSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB0eXBlIHsgUXVldWVQcmVmaXgsIFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IHJlZW5xdWV1ZUFjdGl2ZVJ1bnMsIFNQRUNfVkVSU0lPTl9DVVJSRU5UIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcuanMnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi9jb25maWcuanMnO1xuaW1wb3J0IHtcbiAgY2xlYXJDcmVhdGVkRmlsZXNDYWNoZSxcbiAgZGVsZXRlSlNPTixcbiAgaGFzVGFnLFxuICBpc1VudGFnZ2VkLFxuICBsaXN0VGFnZ2VkRmlsZXMsXG4gIGxpc3RUYWdnZWRGaWxlc0J5RXh0ZW5zaW9uLFxuICByZWFkSlNPTixcbn0gZnJvbSAnLi9mcy5qcyc7XG5pbXBvcnQgeyBpbml0RGF0YURpciB9IGZyb20gJy4vaW5pdC5qcyc7XG5pbXBvcnQgeyBpbnN0cnVtZW50T2JqZWN0IH0gZnJvbSAnLi9pbnN0cnVtZW50T2JqZWN0LmpzJztcbmltcG9ydCB7IGNyZWF0ZVF1ZXVlLCB0eXBlIERpcmVjdEhhbmRsZXIgfSBmcm9tICcuL3F1ZXVlLmpzJztcbmltcG9ydCB7IGhhc2hUb2tlbiwgaG9va1JlY292ZXJ5TWFya2VyUGF0aCB9IGZyb20gJy4vc3RvcmFnZS9oZWxwZXJzLmpzJztcbmltcG9ydCB7IGNyZWF0ZVN0b3JhZ2UgfSBmcm9tICcuL3N0b3JhZ2UuanMnO1xuaW1wb3J0IHsgY3JlYXRlU3RyZWFtZXIgfSBmcm9tICcuL3N0cmVhbWVyLmpzJztcblxuLy8gUmUtZXhwb3J0IGluaXQgdHlwZXMgYW5kIHV0aWxpdGllcyBmb3IgY29uc3VtZXJzXG5leHBvcnQge1xuICBEYXRhRGlyQWNjZXNzRXJyb3IsXG4gIERhdGFEaXJWZXJzaW9uRXJyb3IsXG4gIGVuc3VyZURhdGFEaXIsXG4gIGluaXREYXRhRGlyLFxuICB0eXBlIFBhcnNlZFZlcnNpb24sXG4gIHBhcnNlVmVyc2lvbixcbn0gZnJvbSAnLi9pbml0LmpzJztcblxuZXhwb3J0IHR5cGUgeyBEaXJlY3RIYW5kbGVyIH0gZnJvbSAnLi9xdWV1ZS5qcyc7XG5cbmV4cG9ydCB0eXBlIExvY2FsV29ybGQgPSBXb3JsZCAmIHtcbiAgLyoqIFJlZ2lzdGVyIGEgZGlyZWN0IGluLXByb2Nlc3MgaGFuZGxlciBmb3IgYSBxdWV1ZSBwcmVmaXgsIGJ5cGFzc2luZyBIVFRQLiAqL1xuICByZWdpc3RlckhhbmRsZXIocHJlZml4OiBRdWV1ZVByZWZpeCwgaGFuZGxlcjogRGlyZWN0SGFuZGxlcik6IHZvaWQ7XG4gIC8qKiBDbGVhciBhbGwgd29ya2Zsb3cgZGF0YSAocnVucywgc3RlcHMsIGV2ZW50cywgaG9va3MsIHN0cmVhbXMpLiAqL1xuICBjbGVhcigpOiBQcm9taXNlPHZvaWQ+O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbG9jYWwgd29ybGQgaW5zdGFuY2UgdGhhdCBjb21iaW5lcyBxdWV1ZSwgc3RvcmFnZSwgYW5kIHN0cmVhbWVyIGZ1bmN0aW9uYWxpdGllcy5cbiAqXG4gKiBAcGFyYW0gYXJncyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0gYXJncy5kYXRhRGlyIC0gRGlyZWN0b3J5IGZvciBzdG9yaW5nIHdvcmtmbG93IGRhdGEgKGRlZmF1bHQ6IGAud29ya2Zsb3ctZGF0YS9gKVxuICogQHBhcmFtIGFyZ3MucG9ydCAtIFBvcnQgb3ZlcnJpZGUgZm9yIHF1ZXVlIHRyYW5zcG9ydCAoZGVmYXVsdDogYXV0by1kZXRlY3RlZClcbiAqIEBwYXJhbSBhcmdzLmJhc2VVcmwgLSBGdWxsIGJhc2UgVVJMIG92ZXJyaWRlIGZvciBxdWV1ZSB0cmFuc3BvcnQgKGRlZmF1bHQ6IGBodHRwOi8vbG9jYWxob3N0Ontwb3J0fWApXG4gKiBAcGFyYW0gYXJncy5yZWNvdmVyQWN0aXZlUnVucyAtIFdoZXRoZXIgYHN0YXJ0KClgIHNob3VsZCByZS1lbnF1ZXVlIHBlbmRpbmcvcnVubmluZyBydW5zIGZyb20gc3RvcmFnZSAoZGVmYXVsdDogYHRydWVgKVxuICogQHBhcmFtIGFyZ3MudGFnIC0gT3B0aW9uYWwgdGFnIHRvIHNjb3BlIGZpbGVzIChlLmcuLCBgdml0ZXN0LTBgKS4gV2hlbiBzZXQsIGZpbGVzIGFyZSB3cml0dGVuXG4gKiAgIGFzIGB7aWR9Lnt0YWd9Lmpzb25gIGFuZCBgY2xlYXIoKWAgb25seSBkZWxldGVzIGZpbGVzIG1hdGNoaW5nIHRoaXMgdGFnLlxuICogQHRocm93cyB7RGF0YURpckFjY2Vzc0Vycm9yfSBJZiB0aGUgZGF0YSBkaXJlY3RvcnkgY2Fubm90IGJlIGNyZWF0ZWQgb3IgYWNjZXNzZWRcbiAqIEB0aHJvd3Mge0RhdGFEaXJWZXJzaW9uRXJyb3J9IElmIHRoZSBkYXRhIGRpcmVjdG9yeSB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTG9jYWxXb3JsZChhcmdzPzogUGFydGlhbDxDb25maWc+KTogTG9jYWxXb3JsZCB7XG4gIGNvbnN0IGRlZmluZWRBcmdzID0gYXJnc1xuICAgID8gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhhcmdzKS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgIClcbiAgICA6IHt9O1xuICBjb25zdCBtZXJnZWRDb25maWcgPSB7IC4uLmNvbmZpZy52YWx1ZSwgLi4uZGVmaW5lZEFyZ3MgfTtcbiAgY29uc3QgdGFnID0gbWVyZ2VkQ29uZmlnLnRhZztcbiAgY29uc3QgcXVldWUgPSBjcmVhdGVRdWV1ZShtZXJnZWRDb25maWcpO1xuICBjb25zdCBzdG9yYWdlID0gY3JlYXRlU3RvcmFnZShtZXJnZWRDb25maWcuZGF0YURpciwgdGFnKTtcbiAgY29uc3QgcmVjb3ZlckFjdGl2ZVJ1bnMgPSBtZXJnZWRDb25maWcucmVjb3ZlckFjdGl2ZVJ1bnMgPz8gdHJ1ZTtcbiAgcmV0dXJuIHtcbiAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgLi4ucXVldWUsXG4gICAgLi4uc3RvcmFnZSxcbiAgICAuLi5pbnN0cnVtZW50T2JqZWN0KCd3b3JsZC5zdHJlYW1zJywge1xuICAgICAgLi4uY3JlYXRlU3RyZWFtZXIobWVyZ2VkQ29uZmlnLmRhdGFEaXIsIHRhZyksXG4gICAgICAuLi4obWVyZ2VkQ29uZmlnLnN0cmVhbUZsdXNoSW50ZXJ2YWxNcyAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgc3RyZWFtRmx1c2hJbnRlcnZhbE1zOiBtZXJnZWRDb25maWcuc3RyZWFtRmx1c2hJbnRlcnZhbE1zLFxuICAgICAgfSksXG4gICAgfSksXG4gICAgYXN5bmMgc3RhcnQoKSB7XG4gICAgICBhd2FpdCBpbml0RGF0YURpcihtZXJnZWRDb25maWcuZGF0YURpcik7XG4gICAgICBpZiAoIXJlY292ZXJBY3RpdmVSdW5zKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFNjb3BlIHJlY292ZXJ5IHRvIHRoaXMgd29ybGQncyBvd24gZmlsZXMuIEEgdGFnZ2VkIHdvcmxkIHJlY292ZXJzIG9ubHlcbiAgICAgIC8vIGl0cyB0YWc7IGFuIHVudGFnZ2VkIHdvcmxkIHJlY292ZXJzIG9ubHkgdW50YWdnZWQgZmlsZXMuIFdpdGhvdXQgdGhlXG4gICAgICAvLyB1bnRhZ2dlZCBmaWx0ZXIsIGFuIHVudGFnZ2VkIGRldiBzZXJ2ZXIgc2hhcmluZyB0aGUgZGF0YSBkaXJlY3Rvcnkgd2l0aFxuICAgICAgLy8gdGhlIHZpdGVzdCBoYXJuZXNzIHdvdWxkIGxpc3QgdGFnZ2VkIHJ1bnMgKGxpc3QgZW51bWVyYXRlcyBldmVyeSBmaWxlKVxuICAgICAgLy8gYW5kIHJlLWVucXVldWUgdGhlbSwgYnV0IHJ1bl9zdGFydGVkJ3MgdGFnZ2VkLW9yLXVudGFnZ2VkIHJlYWQgY2FuJ3RcbiAgICAgIC8vIHJlc29sdmUgYSBmb3JlaWduIHRhZyDigJQgeWllbGRpbmcgXCJkaWQgbm90IHJldHVybiB0aGUgcnVuIGVudGl0eVwiIDUwMHNcbiAgICAgIC8vIG9uIHN0YXJ0dXAgdW50aWwgdGhlIG1lc3NhZ2UgZXhoYXVzdHMgaXRzIGRlbGl2ZXJpZXMuXG4gICAgICBjb25zdCBmaWxlSWRGaWx0ZXIgPSB0YWdcbiAgICAgICAgPyAoZmlsZUlkOiBzdHJpbmcpID0+IGhhc1RhZyhmaWxlSWQsIHRhZylcbiAgICAgICAgOiBpc1VudGFnZ2VkO1xuICAgICAgY29uc3QgcmVjb3ZlcnlSdW5zID0ge1xuICAgICAgICAuLi5zdG9yYWdlLnJ1bnMsXG4gICAgICAgIGxpc3Q6ICgocGFyYW1zKSA9PlxuICAgICAgICAgIHN0b3JhZ2UucnVucy5saXN0KHtcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgIGZpbGVJZEZpbHRlcixcbiAgICAgICAgICB9KSkgYXMgdHlwZW9mIHN0b3JhZ2UucnVucy5saXN0LFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHJlZW5xdWV1ZUFjdGl2ZVJ1bnMocmVjb3ZlcnlSdW5zLCBxdWV1ZS5xdWV1ZSwgJ3dvcmxkLWxvY2FsJyk7XG4gICAgfSxcbiAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgIGF3YWl0IHF1ZXVlLmNsb3NlKCk7XG4gICAgfSxcbiAgICBhc3luYyBjbGVhcigpIHtcbiAgICAgIGlmICh0YWcpIHtcbiAgICAgICAgLy8gU2VsZWN0aXZlbHkgZGVsZXRlIG9ubHkgZmlsZXMgbWF0Y2hpbmcgdGhpcyB0YWdcbiAgICAgICAgY29uc3QgYmFzZWRpciA9IG1lcmdlZENvbmZpZy5kYXRhRGlyO1xuXG4gICAgICAgIC8vIERlbGV0ZSBob29rIHRva2VuIGNvbnN0cmFpbnQgZmlsZXMgKGFuZCByZWNvdmVyeSBtYXJrZXJzLFxuICAgICAgICAvLyBmb3IgZGlzayBoeWdpZW5lKSBCRUZPUkUgZGVsZXRpbmcgdGhlIGhvb2tzLCBzaW5jZSB3ZSBuZWVkXG4gICAgICAgIC8vIHRvIHJlYWQgZWFjaCBob29rIHRvIGV4dHJhY3QgaXRzIHRva2VuIGhhc2guIENvbnN0cmFpbnRcbiAgICAgICAgLy8gZmlsZXMgYW5kIG1hcmtlcnMgYXJlIHVudGFnZ2VkIChge3NoYTI1Nn0uanNvbmAgYW5kXG4gICAgICAgIC8vIGB7c2hhMjU2fS5yZWNvdmVyeS5qc29uYCkgc28gbGlzdFRhZ2dlZEZpbGVzIHdvbid0IGZpbmRcbiAgICAgICAgLy8gdGhlbSDigJQgd2UgbXVzdCByZXNvbHZlIHRoZW0gdmlhIHRoZSBob29rIGRhdGEuXG4gICAgICAgIGNvbnN0IGhvb2tzRGlyID0gcGF0aC5qb2luKGJhc2VkaXIsICdob29rcycpO1xuICAgICAgICBjb25zdCB0YWdnZWRIb29rRmlsZXMgPSBhd2FpdCBsaXN0VGFnZ2VkRmlsZXMoaG9va3NEaXIsIHRhZyk7XG4gICAgICAgIGNvbnN0IHsgSG9va1NjaGVtYSB9ID0gYXdhaXQgaW1wb3J0KCdAd29ya2Zsb3cvd29ybGQnKTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdGFnZ2VkSG9va0ZpbGVzLm1hcChhc3luYyAoaG9va0ZpbGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhvb2sgPSBhd2FpdCByZWFkSlNPTihcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGhvb2tzRGlyLCBob29rRmlsZSksXG4gICAgICAgICAgICAgIEhvb2tTY2hlbWFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoaG9vaz8udG9rZW4pIHtcbiAgICAgICAgICAgICAgYXdhaXQgZGVsZXRlSlNPTihcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4oaG9va3NEaXIsICd0b2tlbnMnLCBgJHtoYXNoVG9rZW4oaG9vay50b2tlbil9Lmpzb25gKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBhd2FpdCBkZWxldGVKU09OKFxuICAgICAgICAgICAgICAgIGhvb2tSZWNvdmVyeU1hcmtlclBhdGgoXG4gICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgaG9vay50b2tlbixcbiAgICAgICAgICAgICAgICAgIGhvb2sucnVuSWQsXG4gICAgICAgICAgICAgICAgICBob29rLmhvb2tJZFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIERlbGV0ZSB0YWdnZWQgZW50aXR5IGZpbGVzIGFjcm9zcyBhbGwgZGlyZWN0b3JpZXNcbiAgICAgICAgY29uc3QgZW50aXR5RGlycyA9IFtcbiAgICAgICAgICAncnVucycsXG4gICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAnZXZlbnRzJyxcbiAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICd3YWl0cycsXG4gICAgICAgICAgJ3N0cmVhbXMvcnVucycsXG4gICAgICAgIF07XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGVudGl0eURpcnMubWFwKGFzeW5jIChkaXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxEaXIgPSBwYXRoLmpvaW4oYmFzZWRpciwgZGlyKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgbGlzdFRhZ2dlZEZpbGVzKGZ1bGxEaXIsIHRhZyk7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgZmlsZXMubWFwKChmKSA9PiBkZWxldGVKU09OKHBhdGguam9pbihmdWxsRGlyLCBmKSkpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIC8vIENsZWFuIHVwIGxvY2sgZmlsZXMgdXNlZCBmb3IgYXRvbWljIHRlcm1pbmFsLXN0YXRlIGd1YXJkc1xuICAgICAgICBhd2FpdCBmc1xuICAgICAgICAgIC5ybShwYXRoLmpvaW4oYmFzZWRpciwgJy5sb2NrcycpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICAgICAgICAuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAvLyBEZWxldGUgdGFnZ2VkIHN0cmVhbSBjaHVua3MgKC57dGFnfS5iaW4gZmlsZXMpXG4gICAgICAgIGNvbnN0IGNodW5rc0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnc3RyZWFtcycsICdjaHVua3MnKTtcbiAgICAgICAgY29uc3QgdGFnZ2VkQmluRmlsZXMgPSBhd2FpdCBsaXN0VGFnZ2VkRmlsZXNCeUV4dGVuc2lvbihcbiAgICAgICAgICBjaHVua3NEaXIsXG4gICAgICAgICAgdGFnLFxuICAgICAgICAgICcuYmluJ1xuICAgICAgICApO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICB0YWdnZWRCaW5GaWxlcy5tYXAoKGYpID0+XG4gICAgICAgICAgICBmcy51bmxpbmsocGF0aC5qb2luKGNodW5rc0RpciwgZikpLmNhdGNoKCgpID0+IHt9KVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGluLW1lbW9yeSB3cml0ZSBjYWNoZSBzbyBkZWxldGVkIHBhdGhzIGFyZSBmb3Jnb3R0ZW5cbiAgICAgICAgY2xlYXJDcmVhdGVkRmlsZXNDYWNoZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgcm0obWVyZ2VkQ29uZmlnLmRhdGFEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgaW5pdERhdGFEaXIobWVyZ2VkQ29uZmlnLmRhdGFEaXIpO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentObject.d.ts","sourceRoot":"","sources":["../src/instrumentObject.ts"],"names":[],"mappings":"AAkCA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAsC1E"}
1
+ {"version":3,"file":"instrumentObject.d.ts","sourceRoot":"","sources":["../src/instrumentObject.ts"],"names":[],"mappings":"AAgHA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CA4C1E"}
@@ -2,13 +2,25 @@
2
2
  * Utility to instrument object methods with tracing.
3
3
  * This mirrors world-vercel's implementation for consistent observability.
4
4
  */
5
- import { trace, getSpanKind, PeerService, RpcSystem, RpcService, RpcMethod, } from './telemetry.js';
5
+ import { getSpanKind, PeerService, RpcMethod, RpcService, RpcSystem, StepId, trace, WorkflowRunId, } from './telemetry.js';
6
6
  /** Configuration for peer service attribution */
7
7
  const WORLD_LOCAL_SERVICE = {
8
8
  peerService: 'world-local',
9
9
  rpcSystem: 'local',
10
10
  rpcService: 'world-local',
11
11
  };
12
+ const RUN_ID_ARG_INDEX_BY_METHOD = {
13
+ 'world.runs.get': 0,
14
+ 'world.runs.experimentalSetAttributes': 0,
15
+ 'world.steps.get': 0,
16
+ 'world.events.create': 0,
17
+ 'world.events.get': 0,
18
+ };
19
+ const RUN_ID_PARAM_METHODS = new Set([
20
+ 'world.steps.list',
21
+ 'world.events.list',
22
+ 'world.hooks.list',
23
+ ]);
12
24
  /**
13
25
  * Extracts the event type from arguments for events.create calls.
14
26
  * The event data is the second argument and contains eventType.
@@ -22,6 +34,54 @@ function extractEventType(args) {
22
34
  }
23
35
  return undefined;
24
36
  }
37
+ function getStringArg(args, index) {
38
+ return typeof args[index] === 'string' ? args[index] : undefined;
39
+ }
40
+ function getRunIdFromParams(params) {
41
+ if (typeof params !== 'object' || params === null) {
42
+ return undefined;
43
+ }
44
+ const runId = params.runId;
45
+ return typeof runId === 'string' ? runId : undefined;
46
+ }
47
+ function getRunIdFromResult(result) {
48
+ if (typeof result !== 'object' || result === null) {
49
+ return undefined;
50
+ }
51
+ const record = result;
52
+ if (typeof record.runId === 'string') {
53
+ return record.runId;
54
+ }
55
+ for (const key of ['run', 'step', 'hook', 'wait']) {
56
+ const entity = record[key];
57
+ if (typeof entity === 'object' && entity !== null) {
58
+ const runId = entity.runId;
59
+ if (typeof runId === 'string') {
60
+ return runId;
61
+ }
62
+ }
63
+ }
64
+ return undefined;
65
+ }
66
+ function extractWorkflowAttributes(prefix, methodName, args) {
67
+ const methodKey = `${prefix}.${methodName}`;
68
+ const attributes = {};
69
+ const runIdArgIndex = RUN_ID_ARG_INDEX_BY_METHOD[methodKey];
70
+ const runId = runIdArgIndex === undefined
71
+ ? RUN_ID_PARAM_METHODS.has(methodKey)
72
+ ? getRunIdFromParams(args[0])
73
+ : undefined
74
+ : getStringArg(args, runIdArgIndex);
75
+ if (runId) {
76
+ Object.assign(attributes, WorkflowRunId(runId));
77
+ }
78
+ if (methodKey === 'world.steps.get') {
79
+ const stepId = getStringArg(args, 1);
80
+ if (stepId)
81
+ Object.assign(attributes, StepId(stepId));
82
+ }
83
+ return attributes;
84
+ }
25
85
  /**
26
86
  * Wraps all methods of an object with tracing spans.
27
87
  * @param prefix - Prefix for span names (e.g., "world.runs")
@@ -55,12 +115,18 @@ export function instrumentObject(prefix, o) {
55
115
  ...RpcSystem(WORLD_LOCAL_SERVICE.rpcSystem),
56
116
  ...RpcService(WORLD_LOCAL_SERVICE.rpcService),
57
117
  ...RpcMethod(spanName),
118
+ ...extractWorkflowAttributes(prefix, methodName, args),
58
119
  });
59
- return f(...args);
120
+ const result = await f(...args);
121
+ const resultRunId = getRunIdFromResult(result);
122
+ if (resultRunId) {
123
+ span?.setAttributes(WorkflowRunId(resultRunId));
124
+ }
125
+ return result;
60
126
  });
61
127
  };
62
128
  }
63
129
  }
64
130
  return handlers;
65
131
  }
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudE9iamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbnN0cnVtZW50T2JqZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE9BQU8sRUFDTCxLQUFLLEVBQ0wsV0FBVyxFQUNYLFdBQVcsRUFDWCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFNBQVMsR0FDVixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLGlEQUFpRDtBQUNqRCxNQUFNLG1CQUFtQixHQUFHO0lBQzFCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLFVBQVUsRUFBRSxhQUFhO0NBQzFCLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLElBQWU7SUFDdkMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3hFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQTRCLENBQUM7UUFDaEQsSUFBSSxPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdkMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFtQixNQUFjLEVBQUUsQ0FBSTtJQUNyRSxNQUFNLFFBQVEsR0FBRyxFQUFPLENBQUM7SUFDekIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBZ0IsRUFBRSxDQUFDO1FBQ2hELElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDakMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0IsK0NBQStDO1lBQy9DLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxJQUFlLEVBQUUsRUFBRTtnQkFDM0MsOERBQThEO2dCQUM5RCxJQUFJLFFBQVEsR0FBRyxHQUFHLE1BQU0sSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxNQUFNLEtBQUssY0FBYyxJQUFJLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDekQsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3pDLElBQUksU0FBUyxFQUFFLENBQUM7d0JBQ2QsUUFBUSxHQUFHLEdBQUcsTUFBTSxJQUFJLFVBQVUsSUFBSSxTQUFTLEVBQUUsQ0FBQztvQkFDcEQsQ0FBQztnQkFDSCxDQUFDO2dCQUVELE9BQU8sS0FBSyxDQUNWLFFBQVEsRUFDUixFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUN2QyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUU7b0JBQ2IsK0NBQStDO29CQUMvQyxzRUFBc0U7b0JBQ3RFLElBQUksRUFBRSxhQUFhLENBQUM7d0JBQ2xCLEdBQUcsV0FBVyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQzt3QkFDL0MsR0FBRyxTQUFTLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDO3dCQUMzQyxHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUM7d0JBQzdDLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztxQkFDdkIsQ0FBQyxDQUFDO29CQUNILE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ3BCLENBQUMsQ0FDRixDQUFDO1lBQ0osQ0FBQyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVdGlsaXR5IHRvIGluc3RydW1lbnQgb2JqZWN0IG1ldGhvZHMgd2l0aCB0cmFjaW5nLlxuICogVGhpcyBtaXJyb3JzIHdvcmxkLXZlcmNlbCdzIGltcGxlbWVudGF0aW9uIGZvciBjb25zaXN0ZW50IG9ic2VydmFiaWxpdHkuXG4gKi9cbmltcG9ydCB7XG4gIHRyYWNlLFxuICBnZXRTcGFuS2luZCxcbiAgUGVlclNlcnZpY2UsXG4gIFJwY1N5c3RlbSxcbiAgUnBjU2VydmljZSxcbiAgUnBjTWV0aG9kLFxufSBmcm9tICcuL3RlbGVtZXRyeS5qcyc7XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciBwZWVyIHNlcnZpY2UgYXR0cmlidXRpb24gKi9cbmNvbnN0IFdPUkxEX0xPQ0FMX1NFUlZJQ0UgPSB7XG4gIHBlZXJTZXJ2aWNlOiAnd29ybGQtbG9jYWwnLFxuICBycGNTeXN0ZW06ICdsb2NhbCcsXG4gIHJwY1NlcnZpY2U6ICd3b3JsZC1sb2NhbCcsXG59O1xuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBldmVudCB0eXBlIGZyb20gYXJndW1lbnRzIGZvciBldmVudHMuY3JlYXRlIGNhbGxzLlxuICogVGhlIGV2ZW50IGRhdGEgaXMgdGhlIHNlY29uZCBhcmd1bWVudCBhbmQgY29udGFpbnMgZXZlbnRUeXBlLlxuICovXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRUeXBlKGFyZ3M6IHVua25vd25bXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChhcmdzLmxlbmd0aCA+PSAyICYmIHR5cGVvZiBhcmdzWzFdID09PSAnb2JqZWN0JyAmJiBhcmdzWzFdICE9PSBudWxsKSB7XG4gICAgY29uc3QgZGF0YSA9IGFyZ3NbMV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKHR5cGVvZiBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBkYXRhLmV2ZW50VHlwZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXcmFwcyBhbGwgbWV0aG9kcyBvZiBhbiBvYmplY3Qgd2l0aCB0cmFjaW5nIHNwYW5zLlxuICogQHBhcmFtIHByZWZpeCAtIFByZWZpeCBmb3Igc3BhbiBuYW1lcyAoZS5nLiwgXCJ3b3JsZC5ydW5zXCIpXG4gKiBAcGFyYW0gbyAtIE9iamVjdCB3aXRoIG1ldGhvZHMgdG8gaW5zdHJ1bWVudFxuICogQHJldHVybnMgSW5zdHJ1bWVudGVkIG9iamVjdCB3aXRoIHNhbWUgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0cnVtZW50T2JqZWN0PFQgZXh0ZW5kcyBvYmplY3Q+KHByZWZpeDogc3RyaW5nLCBvOiBUKTogVCB7XG4gIGNvbnN0IGhhbmRsZXJzID0ge30gYXMgVDtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobykgYXMgKGtleW9mIFQpW10pIHtcbiAgICBpZiAodHlwZW9mIG9ba2V5XSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaGFuZGxlcnNba2V5XSA9IG9ba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZiA9IG9ba2V5XTtcbiAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBTdHJpbmcoa2V5KTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBkeW5hbWljIGZ1bmN0aW9uIHdyYXBwaW5nXG4gICAgICBoYW5kbGVyc1trZXldID0gYXN5bmMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAvLyBCdWlsZCBzcGFuIG5hbWUgLSBmb3IgZXZlbnRzLmNyZWF0ZSwgaW5jbHVkZSB0aGUgZXZlbnQgdHlwZVxuICAgICAgICBsZXQgc3Bhbk5hbWUgPSBgJHtwcmVmaXh9LiR7bWV0aG9kTmFtZX1gO1xuICAgICAgICBpZiAocHJlZml4ID09PSAnd29ybGQuZXZlbnRzJyAmJiBtZXRob2ROYW1lID09PSAnY3JlYXRlJykge1xuICAgICAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IGV4dHJhY3RFdmVudFR5cGUoYXJncyk7XG4gICAgICAgICAgaWYgKGV2ZW50VHlwZSkge1xuICAgICAgICAgICAgc3Bhbk5hbWUgPSBgJHtwcmVmaXh9LiR7bWV0aG9kTmFtZX0gJHtldmVudFR5cGV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJhY2UoXG4gICAgICAgICAgc3Bhbk5hbWUsXG4gICAgICAgICAgeyBraW5kOiBhd2FpdCBnZXRTcGFuS2luZCgnSU5URVJOQUwnKSB9LFxuICAgICAgICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICAgICAgICAvLyBBZGQgcGVlciBzZXJ2aWNlIGF0dHJpYnV0ZXMgZm9yIHNlcnZpY2UgbWFwc1xuICAgICAgICAgICAgLy8gVXNlIHNwYW5OYW1lIGZvciBycGMubWV0aG9kIHNvIERhdGFkb2cgc2hvd3MgZXZlbnQgdHlwZSBpbiByZXNvdXJjZVxuICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIC4uLlBlZXJTZXJ2aWNlKFdPUkxEX0xPQ0FMX1NFUlZJQ0UucGVlclNlcnZpY2UpLFxuICAgICAgICAgICAgICAuLi5ScGNTeXN0ZW0oV09STERfTE9DQUxfU0VSVklDRS5ycGNTeXN0ZW0pLFxuICAgICAgICAgICAgICAuLi5ScGNTZXJ2aWNlKFdPUkxEX0xPQ0FMX1NFUlZJQ0UucnBjU2VydmljZSksXG4gICAgICAgICAgICAgIC4uLlJwY01ldGhvZChzcGFuTmFtZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBmKC4uLmFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJldHVybiBoYW5kbGVycztcbn1cbiJdfQ==
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudE9iamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbnN0cnVtZW50T2JqZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE9BQU8sRUFDTCxXQUFXLEVBQ1gsV0FBVyxFQUNYLFNBQVMsRUFDVCxVQUFVLEVBQ1YsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBQ0wsYUFBYSxHQUNkLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsaURBQWlEO0FBQ2pELE1BQU0sbUJBQW1CLEdBQUc7SUFDMUIsV0FBVyxFQUFFLGFBQWE7SUFDMUIsU0FBUyxFQUFFLE9BQU87SUFDbEIsVUFBVSxFQUFFLGFBQWE7Q0FDMUIsQ0FBQztBQUVGLE1BQU0sMEJBQTBCLEdBQTJCO0lBQ3pELGdCQUFnQixFQUFFLENBQUM7SUFDbkIsc0NBQXNDLEVBQUUsQ0FBQztJQUN6QyxpQkFBaUIsRUFBRSxDQUFDO0lBQ3BCLHFCQUFxQixFQUFFLENBQUM7SUFDeEIsa0JBQWtCLEVBQUUsQ0FBQztDQUN0QixDQUFDO0FBRUYsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNuQyxrQkFBa0I7SUFDbEIsbUJBQW1CO0lBQ25CLGtCQUFrQjtDQUNuQixDQUFDLENBQUM7QUFFSDs7O0dBR0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLElBQWU7SUFDdkMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3hFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQTRCLENBQUM7UUFDaEQsSUFBSSxPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdkMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3hCLENBQUM7SUFD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QkFBbUIsQ0FBQyxTQUFTLENBQUM7d0JBQzNDLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQzt3QkFDN0MsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO3dCQUN0QixHQUFHLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDO3FCQUN2RCxDQUFDLENBQUM7b0JBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztvQkFDaEMsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQy9DLElBQUksV0FBVyxFQUFFLENBQUM7d0JBQ2hCLElBQUksRUFBRSxhQUFhLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7b0JBQ2xELENBQUM7b0JBQ0QsT0FBTyxNQUFNLENBQUM7Z0JBQ2hCLENBQUMsQ0FDRixDQUFDO1lBQ0osQ0FBQyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVdGlsaXR5IHRvIGluc3RydW1lbnQgb2JqZWN0IG1ldGhvZHMgd2l0aCB0cmFjaW5nLlxuICogVGhpcyBtaXJyb3JzIHdvcmxkLXZlcmNlbCdzIGltcGxlbWVudGF0aW9uIGZvciBjb25zaXN0ZW50IG9ic2VydmFiaWxpdHkuXG4gKi9cbmltcG9ydCB7XG4gIGdldFNwYW5LaW5kLFxuICBQZWVyU2VydmljZSxcbiAgUnBjTWV0aG9kLFxuICBScGNTZXJ2aWNlLFxuICBScGNTeXN0ZW0sXG4gIFN0ZXBJZCxcbiAgdHJhY2UsXG4gIFdvcmtmbG93UnVuSWQsXG59IGZyb20gJy4vdGVsZW1ldHJ5LmpzJztcblxuLyoqIENvbmZpZ3VyYXRpb24gZm9yIHBlZXIgc2VydmljZSBhdHRyaWJ1dGlvbiAqL1xuY29uc3QgV09STERfTE9DQUxfU0VSVklDRSA9IHtcbiAgcGVlclNlcnZpY2U6ICd3b3JsZC1sb2NhbCcsXG4gIHJwY1N5c3RlbTogJ2xvY2FsJyxcbiAgcnBjU2VydmljZTogJ3dvcmxkLWxvY2FsJyxcbn07XG5cbmNvbnN0IFJVTl9JRF9BUkdfSU5ERVhfQllfTUVUSE9EOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge1xuICAnd29ybGQucnVucy5nZXQnOiAwLFxuICAnd29ybGQucnVucy5leHBlcmltZW50YWxTZXRBdHRyaWJ1dGVzJzogMCxcbiAgJ3dvcmxkLnN0ZXBzLmdldCc6IDAsXG4gICd3b3JsZC5ldmVudHMuY3JlYXRlJzogMCxcbiAgJ3dvcmxkLmV2ZW50cy5nZXQnOiAwLFxufTtcblxuY29uc3QgUlVOX0lEX1BBUkFNX01FVEhPRFMgPSBuZXcgU2V0KFtcbiAgJ3dvcmxkLnN0ZXBzLmxpc3QnLFxuICAnd29ybGQuZXZlbnRzLmxpc3QnLFxuICAnd29ybGQuaG9va3MubGlzdCcsXG5dKTtcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZXZlbnQgdHlwZSBmcm9tIGFyZ3VtZW50cyBmb3IgZXZlbnRzLmNyZWF0ZSBjYWxscy5cbiAqIFRoZSBldmVudCBkYXRhIGlzIHRoZSBzZWNvbmQgYXJndW1lbnQgYW5kIGNvbnRhaW5zIGV2ZW50VHlwZS5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEV2ZW50VHlwZShhcmdzOiB1bmtub3duW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoYXJncy5sZW5ndGggPj0gMiAmJiB0eXBlb2YgYXJnc1sxXSA9PT0gJ29iamVjdCcgJiYgYXJnc1sxXSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGRhdGEgPSBhcmdzWzFdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmICh0eXBlb2YgZGF0YS5ldmVudFR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZGF0YS5ldmVudFR5cGU7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFN0cmluZ0FyZyhhcmdzOiB1bmtub3duW10sIGluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIGFyZ3NbaW5kZXhdID09PSAnc3RyaW5nJyA/IGFyZ3NbaW5kZXhdIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRSdW5JZEZyb21QYXJhbXMocGFyYW1zOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdvYmplY3QnIHx8IHBhcmFtcyA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgcnVuSWQgPSAocGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5ydW5JZDtcbiAgcmV0dXJuIHR5cGVvZiBydW5JZCA9PT0gJ3N0cmluZycgPyBydW5JZCA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0UnVuSWRGcm9tUmVzdWx0KHJlc3VsdDogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAnb2JqZWN0JyB8fCByZXN1bHQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgcmVjb3JkID0gcmVzdWx0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAodHlwZW9mIHJlY29yZC5ydW5JZCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcmVjb3JkLnJ1bklkO1xuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgWydydW4nLCAnc3RlcCcsICdob29rJywgJ3dhaXQnXSkge1xuICAgIGNvbnN0IGVudGl0eSA9IHJlY29yZFtrZXldO1xuICAgIGlmICh0eXBlb2YgZW50aXR5ID09PSAnb2JqZWN0JyAmJiBlbnRpdHkgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHJ1bklkID0gKGVudGl0eSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikucnVuSWQ7XG4gICAgICBpZiAodHlwZW9mIHJ1bklkID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gcnVuSWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFdvcmtmbG93QXR0cmlidXRlcyhcbiAgcHJlZml4OiBzdHJpbmcsXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgYXJnczogdW5rbm93bltdXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgbWV0aG9kS2V5ID0gYCR7cHJlZml4fS4ke21ldGhvZE5hbWV9YDtcbiAgY29uc3QgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGNvbnN0IHJ1bklkQXJnSW5kZXggPSBSVU5fSURfQVJHX0lOREVYX0JZX01FVEhPRFttZXRob2RLZXldO1xuICBjb25zdCBydW5JZCA9XG4gICAgcnVuSWRBcmdJbmRleCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IFJVTl9JRF9QQVJBTV9NRVRIT0RTLmhhcyhtZXRob2RLZXkpXG4gICAgICAgID8gZ2V0UnVuSWRGcm9tUGFyYW1zKGFyZ3NbMF0pXG4gICAgICAgIDogdW5kZWZpbmVkXG4gICAgICA6IGdldFN0cmluZ0FyZyhhcmdzLCBydW5JZEFyZ0luZGV4KTtcbiAgaWYgKHJ1bklkKSB7XG4gICAgT2JqZWN0LmFzc2lnbihhdHRyaWJ1dGVzLCBXb3JrZmxvd1J1bklkKHJ1bklkKSk7XG4gIH1cblxuICBpZiAobWV0aG9kS2V5ID09PSAnd29ybGQuc3RlcHMuZ2V0Jykge1xuICAgIGNvbnN0IHN0ZXBJZCA9IGdldFN0cmluZ0FyZyhhcmdzLCAxKTtcbiAgICBpZiAoc3RlcElkKSBPYmplY3QuYXNzaWduKGF0dHJpYnV0ZXMsIFN0ZXBJZChzdGVwSWQpKTtcbiAgfVxuXG4gIHJldHVybiBhdHRyaWJ1dGVzO1xufVxuXG4vKipcbiAqIFdyYXBzIGFsbCBtZXRob2RzIG9mIGFuIG9iamVjdCB3aXRoIHRyYWNpbmcgc3BhbnMuXG4gKiBAcGFyYW0gcHJlZml4IC0gUHJlZml4IGZvciBzcGFuIG5hbWVzIChlLmcuLCBcIndvcmxkLnJ1bnNcIilcbiAqIEBwYXJhbSBvIC0gT2JqZWN0IHdpdGggbWV0aG9kcyB0byBpbnN0cnVtZW50XG4gKiBAcmV0dXJucyBJbnN0cnVtZW50ZWQgb2JqZWN0IHdpdGggc2FtZSBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RydW1lbnRPYmplY3Q8VCBleHRlbmRzIG9iamVjdD4ocHJlZml4OiBzdHJpbmcsIG86IFQpOiBUIHtcbiAgY29uc3QgaGFuZGxlcnMgPSB7fSBhcyBUO1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvKSBhcyAoa2V5b2YgVClbXSkge1xuICAgIGlmICh0eXBlb2Ygb1trZXldICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBoYW5kbGVyc1trZXldID0gb1trZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmID0gb1trZXldO1xuICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IFN0cmluZyhrZXkpO1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGR5bmFtaWMgZnVuY3Rpb24gd3JhcHBpbmdcbiAgICAgIGhhbmRsZXJzW2tleV0gPSBhc3luYyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIC8vIEJ1aWxkIHNwYW4gbmFtZSAtIGZvciBldmVudHMuY3JlYXRlLCBpbmNsdWRlIHRoZSBldmVudCB0eXBlXG4gICAgICAgIGxldCBzcGFuTmFtZSA9IGAke3ByZWZpeH0uJHttZXRob2ROYW1lfWA7XG4gICAgICAgIGlmIChwcmVmaXggPT09ICd3b3JsZC5ldmVudHMnICYmIG1ldGhvZE5hbWUgPT09ICdjcmVhdGUnKSB7XG4gICAgICAgICAgY29uc3QgZXZlbnRUeXBlID0gZXh0cmFjdEV2ZW50VHlwZShhcmdzKTtcbiAgICAgICAgICBpZiAoZXZlbnRUeXBlKSB7XG4gICAgICAgICAgICBzcGFuTmFtZSA9IGAke3ByZWZpeH0uJHttZXRob2ROYW1lfSAke2V2ZW50VHlwZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cmFjZShcbiAgICAgICAgICBzcGFuTmFtZSxcbiAgICAgICAgICB7IGtpbmQ6IGF3YWl0IGdldFNwYW5LaW5kKCdJTlRFUk5BTCcpIH0sXG4gICAgICAgICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgICAgIC8vIEFkZCBwZWVyIHNlcnZpY2UgYXR0cmlidXRlcyBmb3Igc2VydmljZSBtYXBzXG4gICAgICAgICAgICAvLyBVc2Ugc3Bhbk5hbWUgZm9yIHJwYy5tZXRob2Qgc28gRGF0YWRvZyBzaG93cyBldmVudCB0eXBlIGluIHJlc291cmNlXG4gICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgLi4uUGVlclNlcnZpY2UoV09STERfTE9DQUxfU0VSVklDRS5wZWVyU2VydmljZSksXG4gICAgICAgICAgICAgIC4uLlJwY1N5c3RlbShXT1JMRF9MT0NBTF9TRVJWSUNFLnJwY1N5c3RlbSksXG4gICAgICAgICAgICAgIC4uLlJwY1NlcnZpY2UoV09STERfTE9DQUxfU0VSVklDRS5ycGNTZXJ2aWNlKSxcbiAgICAgICAgICAgICAgLi4uUnBjTWV0aG9kKHNwYW5OYW1lKSxcbiAgICAgICAgICAgICAgLi4uZXh0cmFjdFdvcmtmbG93QXR0cmlidXRlcyhwcmVmaXgsIG1ldGhvZE5hbWUsIGFyZ3MpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmKC4uLmFyZ3MpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0UnVuSWQgPSBnZXRSdW5JZEZyb21SZXN1bHQocmVzdWx0KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHRSdW5JZCkge1xuICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKFdvcmtmbG93UnVuSWQocmVzdWx0UnVuSWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhhbmRsZXJzO1xufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"events-storage.d.ts","sourceRoot":"","sources":["../../src/storage/events-storage.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAMV,OAAO,EAGR,MAAM,iBAAiB,CAAC;AAsEzB;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CA2/BnB"}
1
+ {"version":3,"file":"events-storage.d.ts","sourceRoot":"","sources":["../../src/storage/events-storage.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAMV,OAAO,EAGR,MAAM,iBAAiB,CAAC;AA2TzB;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CA2yCnB"}