footprintjs 9.24.0 → 9.25.0

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.
@@ -221,4 +221,14 @@ export declare function supersededByNextSet(rows: readonly {
221
221
  * here; there is no second replay loop to keep in step.
222
222
  */
223
223
  export declare function applySmartMerge(base: any, updates: MemoryPatch, overwrite: MemoryPatch, trace: TraceEntry[]): any;
224
+ /**
225
+ * The same replay, INTO `target` — the one verb switch, no clone of its own.
226
+ * For a caller that already holds a private working copy (the read-side fold
227
+ * in `time-travel/stateAt.ts`, which clones its base ONCE and then applies
228
+ * every bundle here), so a fold over N bundles costs N row applications, not
229
+ * N clones of the whole state. Never hand it committed state: it mutates.
230
+ * The values it writes are its own (`set`/`append` clone the recorded value;
231
+ * `merge` builds new containers), so `target` never aliases the log.
232
+ */
233
+ export declare function applySmartMergeInto(target: any, updates: MemoryPatch, overwrite: MemoryPatch, trace: TraceEntry[]): any;
224
234
  export {};
@@ -416,7 +416,19 @@ export function supersededByNextSet(rows, i) {
416
416
  * here; there is no second replay loop to keep in step.
417
417
  */
418
418
  export function applySmartMerge(base, updates, overwrite, trace) {
419
- const out = structuredClone(base);
419
+ return applySmartMergeInto(structuredClone(base), updates, overwrite, trace);
420
+ }
421
+ /**
422
+ * The same replay, INTO `target` — the one verb switch, no clone of its own.
423
+ * For a caller that already holds a private working copy (the read-side fold
424
+ * in `time-travel/stateAt.ts`, which clones its base ONCE and then applies
425
+ * every bundle here), so a fold over N bundles costs N row applications, not
426
+ * N clones of the whole state. Never hand it committed state: it mutates.
427
+ * The values it writes are its own (`set`/`append` clone the recorded value;
428
+ * `merge` builds new containers), so `target` never aliases the log.
429
+ */
430
+ export function applySmartMergeInto(target, updates, overwrite, trace) {
431
+ const out = target;
420
432
  for (let i = 0; i < trace.length; i++) {
421
433
  if (supersededByNextSet(trace, i))
422
434
  continue;
@@ -440,4 +452,4 @@ export function applySmartMerge(base, updates, overwrite, trace) {
440
452
  }
441
453
  return out;
442
454
  }
443
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBRSxTQUFTLElBQUksSUFBSSxFQUFFLFNBQVMsSUFBSSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHckc7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUM7QUFJOUI7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEtBQWMsRUFBRSxPQUE0QixFQUFFO0lBQ2pGLE9BQU87UUFDTCxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNyRCxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsR0FBaUIsRUFDakIsS0FBYSxFQUNiLEtBQWUsRUFDZixLQUFhLEVBQ2IsS0FBUSxFQUNSLGFBQXVCO0lBRXZCLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25FLE1BQU0sSUFBSSxHQUFHLE9BQU8sSUFBSSxVQUFVLENBQUM7SUFDbkMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzNCLElBQUksT0FBTyxHQUFpQixHQUFHLENBQUM7SUFDaEMsT0FBTyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzNCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxLQUFL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RyxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB1dGlscy50cyDigJQgSGVscGVyIGZ1bmN0aW9ucyBmb3IgbmVzdGVkIG9iamVjdCBtYW5pcHVsYXRpb25cbiAqXG4gKiBQcm92aWRlcyBjb25zaXN0ZW50IHBhdGggdHJhdmVyc2FsIGFuZCB2YWx1ZSBtYW5pcHVsYXRpb24gZm9yIHRoZSBtZW1vcnkgc3lzdGVtLlxuICogWmVybyBleHRlcm5hbCBkZXBlbmRlbmNpZXMuXG4gKi9cblxuaW1wb3J0IHsgbmF0aXZlRGVsZXRlLCBuYXRpdmVHZXQgYXMgX2dldCwgbmF0aXZlSGFzIGFzIF9oYXMsIG5hdGl2ZVNldCBhcyBfc2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2gsIFRyYWNlRW50cnkgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqXG4gKiBUaGUgc2VwYXJhdG9yIHRoYXQgam9pbnMgcGF0aCBTRUdNRU5UUyBpbnRvIGEgYFRyYWNlRW50cnkucGF0aGAuXG4gKlxuICogV0hZIE5PVCBgJy4nYCDigJQgdGhlIGFtYmlndWl0eSB0aGlzIGV4aXN0cyB0byBwcmV2ZW50OiBhIHN0YXRlIGtleSBtYXkgaXRzZWxmXG4gKiBDT05UQUlOIGEgZG90LCBhbmQgdGhpcyBsaWJyYXJ5IGNyZWF0ZXMgc3VjaCBrZXlzIHJvdXRpbmVseS4gYCRzZXRWYWx1ZWBcbiAqIHRha2VzIGEgS0VZLCBub3QgYSBwYXRoLCBzbyBgJHNldFZhbHVlKCdhLmInLCB2KWAgbWFrZXMgb25lIHRvcC1sZXZlbCBrZXlcbiAqIGxpdGVyYWxseSBuYW1lZCBgYS5iYC4gV2l0aCBhIGRvdCBzZXBhcmF0b3IgdGhhdCBrZXkncyBwYXRoIGFuZCB0aGUgbmVzdGVkXG4gKiBwYXRoIGBbJ2EnLCAnYiddYCB3b3VsZCBib3RoIGVuY29kZSBhcyBgXCJhLmJcImAsIGFuZCBldmVyeSByZWFkZXIgb2YgdGhlXG4gKiBjb21taXQgbG9nIOKAlCBgYXBwbHlTbWFydE1lcmdlYCwgYGNvbW1pdFZhbHVlQXRgLCBgcmVkYWN0UGF0Y2hgLFxuICogYGZpbmRMYXN0V3JpdGVyYCwgdGhlIHNsaWNlIGxheWVyIOKAlCB3b3VsZCBoYXZlIHRvIGd1ZXNzIHdoaWNoIG9uZSBhIGJ1bmRsZVxuICogbWVhbnQuIFNwbGl0dGluZyB0aGUgd3Jvbmcgd2F5IHdyaXRlcyBpbnRvIChvciByZWFkcyBmcm9tKSB0aGUgd3JvbmcgcGxhY2UuXG4gKlxuICogQVNDSUkgVW5pdC1TZXBhcmF0b3IgaXMgdGhlIGNob2ljZSBiZWNhdXNlIGl0IGNhbm5vdCBhcHBlYXIgaW4gYSBKU1xuICogaWRlbnRpZmllciBhbmQgaXMgdmFuaXNoaW5nbHkgdW5saWtlbHkgaW4gYSBoYW5kLXdyaXR0ZW4ga2V5LCBzbyB0aGVcbiAqIGVuY29kaW5nIHN0YXlzIHVuYW1iaWd1b3VzLiBJdCBpcyBOT1QgYSBkaXNwbGF5IGNoYXJhY3RlcjogYSBwYXRoIHJlbmRlcmVkXG4gKiBzdHJhaWdodCB0byBhIFVJIG9yIGEgbG9nIGxvb2tzIGxpa2Ugb25lIGJyb2tlbiB3b3JkLiBTcGxpdCBpdCB3aXRoXG4gKiB7QGxpbmsgcGF0aFNlZ21lbnRzfSDigJQgdGhhdCwgbm90IHRoaXMgY29uc3RhbnQsIGlzIHRoZSBjb250cmFjdCBjb25zdW1lcnNcbiAqIHNob3VsZCBob2xkLlxuICovXG5leHBvcnQgY29uc3QgREVMSU0gPSAnXFx1MDAxRic7XG5cbnR5cGUgTmVzdGVkT2JqZWN0ID0geyBba2V5OiBzdHJpbmddOiBhbnkgfTtcblxuLyoqXG4gKiBSZXNvbHZlcyBydW4tbmFtZXNwYWNlZCBhbmQgZ2xvYmFsIHBhdGhzLlxuICogRWFjaCBmbG93Y2hhcnQgZXhlY3V0aW9uIChydW4pIHN0b3JlcyBkYXRhIHVuZGVyIGBydW5zL3tpZH0vYCB0byBwcmV2ZW50IGNvbGxpc2lvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdW5BbmRHbG9iYWxQYXRocyhydW5JZD86IHN0cmluZywgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSA9IFtdKSB7XG4gIHJldHVybiB7XG4gICAgcnVuUGF0aDogcnVuSWQgPyBbJ3J1bnMnLCBydW5JZCwgLi4ucGF0aF0gOiB1bmRlZmluZWQsXG4gICAgZ2xvYmFsUGF0aDogWy4uLnBhdGhdLFxuICB9O1xufVxuXG4vKipcbiAqIFNldHMgYSB2YWx1ZSBhdCBhIG5lc3RlZCBwYXRoLCBjcmVhdGluZyBpbnRlcm1lZGlhdGUgb2JqZWN0cyBhcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXROZXN0ZWRWYWx1ZTxUPihcbiAgb2JqOiBOZXN0ZWRPYmplY3QsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIF9wYXRoOiBzdHJpbmdbXSxcbiAgZmllbGQ6IHN0cmluZyxcbiAgdmFsdWU6IFQsXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogTmVzdGVkT2JqZWN0IHtcbiAgY29uc3QgeyBydW5QYXRoLCBnbG9iYWxQYXRoIH0gPSBnZXRSdW5BbmRHbG9iYWxQYXRocyhydW5JZCwgX3BhdGgpO1xuICBjb25zdCBwYXRoID0gcnVuUGF0aCB8fCBnbG9iYWxQYXRoO1xuICBjb25zdCBwYXRoQ29weSA9IFsuLi5wYXRoXTtcbiAgbGV0IGN1cnJlbnQ6IE5lc3RlZE9iamVjdCA9IG9iajtcbiAgd2hpbGUgKHBhdGhDb3B5Lmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBrZXkgPSBwYXRoQ29weS5zaGlmdCgpIGFzIHN0cmluZztcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSBrZXkgPT09IHJ1bklkICYmIGRlZmF1bHRWYWx1ZXMgPyBkZWZhdWx0VmFsdWVzIDoge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cbiAgY3VycmVudFtmaWVsZF0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBEZWVwLW1lcmdlcyBhIHZhbHVlIGludG8gdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKiAtIEFycmF5czogY29uY2F0ZW5hdGVcbiAqIC0gT2JqZWN0czogc2hhbGxvdyBtZXJnZSBhdCBlYWNoIGxldmVsXG4gKiAtIFByaW1pdGl2ZXM6IHJlcGxhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZU5lc3RlZFZhbHVlPFQ+KFxuICBvYmo6IGFueSxcbiAgcnVuSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgX3BhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sXG4gIGZpZWxkOiBzdHJpbmcgfCBudW1iZXIsXG4gIHZhbHVlOiBULFxuICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbik6IGFueSB7XG4gIGNvbnN0IHsgcnVuUGF0aCwgZ2xvYmFsUGF0aCB9ID0gZ2V0UnVuQW5kR2xvYmFsUGF0aHMocnVuSWQsIF9wYXRoKTtcbiAgY29uc3QgcGF0aCA9IHJ1blBhdGggfHwgZ2xvYmFsUGF0aDtcbiAgY29uc3QgcGF0aENvcHkgPSBbLi4ucGF0aF07XG4gIGxldCBjdXJyZW50OiBOZXN0ZWRPYmplY3QgPSBvYmo7XG4gIHdoaWxlIChwYXRoQ29weS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qga2V5ID0gcGF0aENvcHkuc2hpZnQoKSBhcyBzdHJpbmc7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudCwga2V5KSkge1xuICAgICAgY3VycmVudFtrZXldID0ga2V5ID09PSBydW5JZCAmJiBkZWZhdWx0VmFsdWVzID8gZGVmYXVsdFZhbHVlcyA6IHt9O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG4gIHVwZGF0ZVZhbHVlKGN1cnJlbnQsIGZpZWxkLCB2YWx1ZSk7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogSW4tcGxhY2UgdmFsdWUgdXBkYXRlIHdpdGggbWVyZ2Ugc2VtYW50aWNzLlxuICogLSBBcnJheXMgKG5vbi1lbXB0eSk6IGNvbmNhdGVuYXRlIG9udG8gZXhpc3RpbmdcbiAqIC0gQXJyYXlzIChlbXB0eSk6ICAgICBkaXJlY3QgcmVwbGFjZSDigJQgd3JpdGluZyBgW11gIGNsZWFycyB0aGUgZmllbGRcbiAqIC0gT2JqZWN0cyAobm9uLWVtcHR5KTogc2hhbGxvdyBtZXJnZSAoc3ByZWFkKVxuICogLSBPYmplY3RzIChlbXB0eSk6ICAgIGRpcmVjdCByZXBsYWNlIOKAlCB3cml0aW5nIGB7fWAgY2xlYXJzIHRoZSBmaWVsZFxuICogLSBQcmltaXRpdmVzOiBkaXJlY3QgYXNzaWdubWVudFxuICpcbiAqIE5vdGUgb24gZW1wdHkgYXJyYXlzOiBib3RoIGB2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKWAgYW5kXG4gKiBgQXJyYXkuaXNBcnJheSh2YWx1ZSlgIGV2YWx1YXRlIHRoZSBzYW1lIGZvciBhcnJheXMg4oCUIGBbXWAgaXMgdHJ1dGh5IGluXG4gKiBKYXZhU2NyaXB0LCBzbyB0aGUgYCYmYCBndWFyZCB3YXMgbmV2ZXIgdGhlIGlzc3VlLiBUaGUgYWN0dWFsIGJ1ZyB3YXMgdGhlXG4gKiBjb25jYXQgcGF0aDogYFsuLi5jdXIsIC4uLltdXWAgc2lsZW50bHkgcmV0dXJuZWQgYGN1cmAgdW5jaGFuZ2VkIHdoZW4gYHZhbHVlYFxuICogd2FzIGBbXWAsIG1ha2luZyBgdXBkYXRlVmFsdWUob2JqLCAndGFncycsIFtdKWAgYSBuby1vcCBpbnN0ZWFkIG9mIGEgY2xlYXIuXG4gKiBUaGUgZml4IGlzIHRoZSBleHBsaWNpdCBgdmFsdWUubGVuZ3RoID09PSAwYCBlYXJseS1yZXR1cm4gYnJhbmNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlVmFsdWUob2JqZWN0OiBhbnksIGtleTogc3RyaW5nIHwgbnVtYmVyLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7IC8vIGNsZWFyOiBbXSByZXBsYWNlcyB3aGF0ZXZlciB3YXMgdGhlcmVcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VyID0gb2JqZWN0W2tleV0gYXMgYW55O1xuICAgICAgb2JqZWN0W2tleV0gPSBjdXIgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogWy4uLmN1ciwgLi4udmFsdWVdO1xuICAgIH1cbiAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpIHtcbiAgICBjb25zdCBjdXIgPSBvYmplY3Rba2V5XSBhcyBhbnk7XG4gICAgb2JqZWN0W2tleV0gPSBjdXIgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogeyAuLi5jdXIsIC4uLnZhbHVlIH07XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgYSB2YWx1ZSBhdCBhIG5lc3RlZCBwYXRoIHdpdGggcHJvdG90eXBlLXBvbGx1dGlvbiBwcm90ZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkVmFsdWUocm9vdDogYW55LCBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBmaWVsZD86IHN0cmluZyB8IG51bWJlcik6IGFueSB7XG4gIGNvbnN0IG5vZGUgPSBwYXRoICYmIHBhdGgubGVuZ3RoID4gMCA/IF9nZXQocm9vdCwgcGF0aCkgOiByb290O1xuICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCBub2RlID09PSB1bmRlZmluZWQpIHJldHVybiBub2RlO1xuICBpZiAobm9kZSAhPT0gbnVsbCAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5vZGUsIGZpZWxkKSkge1xuICAgIHJldHVybiBub2RlW2ZpZWxkXTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlZGFjdHMgc2Vuc2l0aXZlIHZhbHVlcyBpbiBhIHBhdGNoIGZvciBsb2dnaW5nL2RlYnVnZ2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZGFjdFBhdGNoKHBhdGNoOiBNZW1vcnlQYXRjaCwgcmVkYWN0ZWRTZXQ6IFNldDxzdHJpbmc+KTogTWVtb3J5UGF0Y2gge1xuICBjb25zdCBvdXQgPSBzdHJ1Y3R1cmVkQ2xvbmUocGF0Y2gpO1xuICBmb3IgKGNvbnN0IGZsYXQgb2YgcmVkYWN0ZWRTZXQpIHtcbiAgICBjb25zdCBwYXRoQXJyID0gZmxhdC5zcGxpdChERUxJTSk7XG4gICAgaWYgKF9oYXMob3V0LCBwYXRoQXJyKSkge1xuICAgICAgY29uc3QgY3VyciA9IF9nZXQob3V0LCBwYXRoQXJyKTtcbiAgICAgIGlmICh0eXBlb2YgY3VyciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgX3NldChvdXQsIHBhdGhBcnIsICdSRURBQ1RFRCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE5vcm1hbGlzZXMgYW4gYXJyYXkgcGF0aCBpbnRvIGEgc3RhYmxlIHN0cmluZyBrZXkgdXNpbmcgREVMSU0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpc2VQYXRoKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5tYXAoU3RyaW5nKS5qb2luKERFTElNKTtcbn1cblxuLyoqXG4gKiBUaGUgaW52ZXJzZSBvZiB7QGxpbmsgbm9ybWFsaXNlUGF0aH06IHRoZSBTRUdNRU5UUyBvZiBhIGBUcmFjZUVudHJ5LnBhdGhgLlxuICpcbiAqIEEgcGF0aCBpbiB0aGUgY29tbWl0IGxvZyBpcyBERUxJTS1qb2luZWQgKHNlZSB7QGxpbmsgREVMSU19KSwgd2hpY2ggaXMgbm90IGFcbiAqIGRpc3BsYXkgZW5jb2Rpbmcg4oCUIHByaW50aW5nIG9uZSB2ZXJiYXRpbSBzaG93cyBhIHNpbmdsZSBicm9rZW4tbG9va2luZyB3b3JkLFxuICogYXMgYSBjb25zdW1lciByZW5kZXJpbmcgYSBwYXRoIGRpc2NvdmVyZWQuIFRoaXMgaXMgdGhlIHN1cHBvcnRlZCB3YXkgdG8gdGFrZVxuICogaXQgYXBhcnQ7IHRoZSBkZWxpbWl0ZXIgaXRzZWxmIHN0YXlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgc28gYSBwYXRoIGNhblxuICogYmUgcmVhZCwgcmVuZGVyZWQgb3IgcmUtam9pbmVkIHdpdGhvdXQgYW55b25lIGhhcmQtY29kaW5nIGEgY29udHJvbFxuICogY2hhcmFjdGVyLlxuICpcbiAqIEEgc2luZ2xlLXNlZ21lbnQgcGF0aCAodGhlIGNvbW1vbiBjYXNlIOKAlCBhIHRvcC1sZXZlbCBzdGF0ZSBrZXkpIHJldHVybnMgYVxuICogb25lLWVsZW1lbnQgYXJyYXksIHNvIGNhbGxlcnMgbmVlZCBubyBzcGVjaWFsIGNhc2UuXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHBhdGhTZWdtZW50cyB9IGZyb20gJ2Zvb3RwcmludGpzL3RyYWNlJztcbiAqXG4gKiBmb3IgKGNvbnN0IGVudHJ5IG9mIGJ1bmRsZS50cmFjZSkge1xuICogICBjb25zb2xlLmxvZyhwYXRoU2VnbWVudHMoZW50cnkucGF0aCkuam9pbignIOKAuiAnKSk7IC8vICdvcmRlciDigLogbGluZXMnXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGhTZWdtZW50cyhwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBwYXRoLnNwbGl0KERFTElNKTtcbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIGRlZXAgZXF1YWxpdHkgZm9yIGNvbW1pdHRlZC1zdGF0ZSB2YWx1ZXMuXG4gKlxuICogVXNlZCBieSB7QGxpbmsgVHJhbnNhY3Rpb25CdWZmZXJ9IHRvIGRlY2lkZSB3aGV0aGVyIGEgc3RhZ2UgYWN0dWFsbHkgQ0hBTkdFRFxuICogYSBwYXRoIG9yIG1lcmVseSByZS13cm90ZSAvIHJldmVydGVkIGl0IHRvIHRoZSB2YWx1ZSBpdCBhbHJlYWR5IGhlbGQgKGFcbiAqIFwibm8tb3Agd3JpdGVcIiksIGFuZCBieSBgYm9ycm93ZWRNdXRhdGlvbi5maXJzdERpZmZlcmluZ1BhdGhgIHRvIGZpbmQgd2hlcmUgYVxuICogYm9ycm93ZWQgcmVhZCBtb3ZlZC4gQ29tbWl0dGVkIHN0YXRlIG11c3Qgc3Vydml2ZSBgc3RydWN0dXJlZENsb25lYCwgYW5kXG4gKiBgc3RydWN0dXJlZENsb25lYCBrZWVwcyBgRGF0ZWAsIGBNYXBgIGFuZCBgU2V0YCDigJQgc28gdGhvc2UgYXJlIGxlZ2FsIHN0YXRlXG4gKiB2YWx1ZXMgKGEgYCRzZXRWYWx1ZWAgYnlwYXNzZXMgdGhlIHByb3h5J3MgSlNPTiByb3VuZC10cmlwKSBhbmQgdGhpcyBtdXN0XG4gKiB0ZWxsIHR3byBvZiB0aGVtIGFwYXJ0LiBCZWZvcmUgOS4yMi4wIGl0IGNvbXBhcmVkIHRoZW0gYXMgcGxhaW4gb2JqZWN0cywgYW5kXG4gKiBhIGBEYXRlYC9gTWFwYC9gU2V0YCBoYXMgbm8gb3duIGVudW1lcmFibGUga2V5czogZXZlcnkgcGFpciB3YXMgXCJlcXVhbFwiLCBzb1xuICogYCRzZXRWYWx1ZSgnaycsIG5ldyBEYXRlKDE5OTkpKWAgb3ZlciBhIDIwMjAgZGF0ZSB3YXMgZHJvcHBlZCBhcyBhIG5vLW9wIOKAlFxuICogbm8gdHJhY2Ugcm93LCBzdGF0ZSB1bmNoYW5nZWQg4oCUIGFuZCBhIGBzZXRGdWxsWWVhcmAgaW4gcGxhY2Ugc2xpcHBlZCBwYXN0XG4gKiB0aGUgZGV2LW1vZGUgZ3VhcmQuXG4gKlxuICogU2VtYW50aWNzOlxuICogICAtIHJlZmVyZW5jZSAvIGlkZW50aWNhbC1wcmltaXRpdmUgc2hvcnQtY2lyY3VpdHMgZmlyc3QgKGNoZWFwIGZhc3QgcGF0aClcbiAqICAgLSBgTmFOYCBlcXVhbHMgYE5hTmAgKHByaW1pdGl2ZSBjb21wYXJlIGZhbGxzIGJhY2sgdG8gYE9iamVjdC5pc2ApXG4gKiAgIC0gYERhdGVgOiBzYW1lIGBnZXRUaW1lKClgICh0d28gaW52YWxpZCBkYXRlcyBhcmUgZXF1YWwpXG4gKiAgIC0gYE1hcGA6IHNhbWUgc2l6ZSBBTkQsIHBlciBrZXkgb2YgYGFgLCBgYmAgaG9sZHMgYSBkZWVwLWVxdWFsIHZhbHVlIOKAlFxuICogICAgIGtleXMgYnkgYE1hcGAgaWRlbnRpdHkgKGBTYW1lVmFsdWVaZXJvYCksIHZhbHVlcyBkZWVwXG4gKiAgIC0gYFNldGA6IHNhbWUgc2l6ZSBBTkQgZXZlcnkgbWVtYmVyIG9mIGBhYCBpcyBkZWVwLWVxdWFsIHRvIFNPTUUgbWVtYmVyXG4gKiAgICAgb2YgYGJgIChvcmRlci1pbnNlbnNpdGl2ZSDigJQgYSBTZXQgaGFzIG5vIG9yZGVyIHRvIGNvbXBhcmUgYnkpXG4gKiAgIC0gYSB0eXBlZCB2YWx1ZSBhZ2FpbnN0IGEgcGxhaW4gdmFsdWUsIG9yIHR3byBkaWZmZXJlbnQgdHlwZWQga2luZHMg4oaSIG5vdFxuICogICAgIGVxdWFsIChhIGBEYXRlYCBpcyBuZXZlciBge31gKVxuICogICAtIGFycmF5czogZXF1YWwgbGVuZ3RoIEFORCBkZWVwLWVxdWFsIGVsZW1lbnQtd2lzZSAob3JkZXItc2Vuc2l0aXZlKVxuICogICAtIG9iamVjdHM6IGlkZW50aWNhbCBzZXQgb2Yga2V5cyB0aGF0IEhPTEQgYSB2YWx1ZSBBTkQgZGVlcC1lcXVhbCBwZXIga2V5LlxuICogICAgIEFuIG93biBrZXkgd2hvc2UgdmFsdWUgaXMgYHVuZGVmaW5lZGAgY291bnRzIGFzIEFCU0VOVDogaXQgaXMgdGhpc1xuICogICAgIGxpYnJhcnkncyBvdGhlciBzcGVsbGluZyBvZiBhIGRlbGV0ZWQga2V5IChgJ2Z1bGwnYCBtb2RlIGZsYXR0ZW5zXG4gKiAgICAgYGRlbGV0ZWAgaW50byBga2V5OiB1bmRlZmluZWRgOyBgJ2RlbHRhJ2AgbW9kZSdzIGBkZWxldGVgIHZlcmIgcmVtb3Zlc1xuICogICAgIHRoZSBrZXkpLCBhbmQgZXZlcnkgY29uc3VtZXIg4oCUIEpTT04sIHRoZSBmb2xkLCBgY29tbWl0VmFsdWVBdGAsIHRoZVxuICogICAgIG1pcnJvciDigJQgcmVhZHMgdGhlIHR3byBzcGVsbGluZ3MgYXMgb25lIHN0YXRlLiBTbyBtdXN0IHRoZSBuZXQtY2hhbmdlXG4gKiAgICAgZmlsdGVyICg5LjE5LjEpOiBge31gIGFuZCBgeyBrOiB1bmRlZmluZWQgfWAgYXJlIG5vdCBhIGNoYW5nZS4gQXJyYXlzXG4gKiAgICAgYXJlIHVudG91Y2hlZCDigJQgYSBzbG90IGhvbGRpbmcgYHVuZGVmaW5lZGAgaXMgc3RpbGwgYSBzbG90LlxuICogICAtIG1pc21hdGNoZWQga2luZHMgKGFycmF5IHZzIG9iamVjdCwgb2JqZWN0IHZzIG51bGwpIOKGkiBub3QgZXF1YWxcbiAqXG4gKiBDb3N0ICYgc2FmZXR5OlxuICogICAtIEFsbG9jYXRlcyBOT1RISU5HIGJ1dCB0cmFuc2llbnQgYE9iamVjdC5rZXlzYCBhcnJheXMg4oCUIG5vIGNsb25lcy4gSXQgaXNcbiAqICAgICBzdHJpY3RseSBjaGVhcGVyIHRoYW4gdGhlIGBzdHJ1Y3R1cmVkQ2xvbmVgIHRoZSBjb21taXQgYWxyZWFkeSBwZXJmb3Jtcy5cbiAqICAgLSBQcmltaXRpdmUgY29tcGFyaXNvbnMgKHRoZSBidWxrIG9mIHN0YXRlKSBhcmUgTygxKSB2aWEgdGhlIGA9PT1gIC9cbiAqICAgICBgT2JqZWN0LmlzYCBmYXN0IHBhdGhzOyBvbmx5IG5lc3RlZCBvYmplY3RzL2FycmF5cyBpbmN1ciBhIHdhbGssIGJvdW5kZWRcbiAqICAgICBieSB0aGUgdmFsdWUncyBvd24gc2l6ZS5cbiAqICAgLSBUZXJtaW5hdGVzIG9uIENZQ0xJQyB2YWx1ZXMgKDkuMTguMSk6IGEgc3RhdGUgdmFsdWUgbXVzdCBzdXJ2aXZlXG4gKiAgICAgYHN0cnVjdHVyZWRDbG9uZWAsIGFuZCBgc3RydWN0dXJlZENsb25lYCBwcmVzZXJ2ZXMgY3ljbGVzIOKAlCBzbyBhXG4gKiAgICAgc2VsZi1yZWZlcmVuY2luZyB2YWx1ZSBpcyBhIGxlZ2FsIHZhbHVlLCBub3QgYW4gb3V0LW9mLWNvbnRyYWN0IG9uZS4gQVxuICogICAgIHBhaXIgb2Ygb2JqZWN0cyBhbHJlYWR5IHVuZGVyIGNvbXBhcmlzb24gaXMgdHJlYXRlZCBhcyBlcXVhbCAodGhlXG4gKiAgICAgc3RydWN0dXJhbCBhbnN3ZXIsIGxvZGFzaCBgaXNFcXVhbGAgc2VtYW50aWNzKTsgYWN5Y2xpYyBpbnB1dHMgc2VlIG5vXG4gKiAgICAgY2hhbmdlLiBEZXYgbW9kZSBzdGlsbCB3YXJucyBhYm91dCBjeWNsZXMgYXQgd3JpdGUgdGltZVxuICogICAgIChgU2NvcGVGYWNhZGUuc2V0VmFsdWVgKSBiZWNhdXNlIHRoZXkgc3VycHJpc2UgbmFycmF0aXZlIGFuZCBKU09OLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFsKGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBlcXVhbFBhaXJzKGEsIGIsIHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogT2JqZWN0IHBhaXJzIG1ldCBzbyBmYXIsIGtleWVkIGBhIOKGkiB0aGUgYidzIGl0IGhhcyBiZWVuIHBhaXJlZCB3aXRoYC4gQ3JlYXRlZFxuICogbGF6aWx5IGJ5IHRoZSBmaXJzdCBvYmplY3QgcGFpciwgc28gcHJpbWl0aXZlIGNvbXBhcmVzIGFsbG9jYXRlIG5vdGhpbmcuXG4gKiBOZXZlciBwcnVuZWQ6IGV2ZXJ5IGBmYWxzZWAgcmV0dXJucyBzdHJhaWdodCB1cCB0byB0aGUgY2FsbGVyIChlYWNoIHJlY3Vyc2l2ZVxuICogY2FsbCBzaG9ydC1jaXJjdWl0cyBvbiBpdCksIHNvIG5vdGhpbmcgaXMgbG9va2VkIHVwIGFmdGVyIGEgbWlzbWF0Y2gg4oCUIGFcbiAqIHN0b3JlZCBwYWlyIGlzIGVpdGhlciBzdGlsbCB1bmRlciBjb21wYXJpc29uIG9yIGFscmVhZHkga25vd24gZXF1YWwuXG4gKi9cbnR5cGUgU2VlblBhaXJzID0gV2Vha01hcDxvYmplY3QsIFdlYWtTZXQ8b2JqZWN0Pj47XG5cbmZ1bmN0aW9uIGVxdWFsUGFpcnMoYTogYW55LCBiOiBhbnksIHNlZW46IFNlZW5QYWlycyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7IC8vIHNhbWUgcmVmZXJlbmNlIG9yIGlkZW50aWNhbCBwcmltaXRpdmVcbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgcmV0dXJuIGZhbHNlO1xuICBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsKSByZXR1cm4gYSA9PT0gYjsgLy8gb25lIGlzIG51bGwsIHRoZSBvdGhlciBpc24ndFxuICBpZiAodHlwZW9mIGEgIT09ICdvYmplY3QnKSByZXR1cm4gT2JqZWN0LmlzKGEsIGIpOyAvLyBOYU4tc2FmZSBwcmltaXRpdmUgY29tcGFyZVxuXG4gIC8vIFR5cGVkIGFybXMgZmlyc3Qg4oCUIGEgRGF0ZS9NYXAvU2V0IGhhcyBubyBvd24gZW51bWVyYWJsZSBrZXlzLCBzbyB0aGVcbiAgLy8gcGxhaW4tb2JqZWN0IHdhbGsgYmVsb3cgd291bGQgY2FsbCBhbnkgdHdvIG9mIHRoZW0gZXF1YWwuXG4gIGNvbnN0IGFLaW5kID0gdHlwZWRLaW5kKGEpO1xuICBpZiAoYUtpbmQgIT09IHR5cGVkS2luZChiKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYUtpbmQgPT09ICdkYXRlJykgcmV0dXJuIE9iamVjdC5pcyhhLmdldFRpbWUoKSwgYi5nZXRUaW1lKCkpO1xuXG4gIGNvbnN0IGFJc0FycmF5ID0gQXJyYXkuaXNBcnJheShhKTtcbiAgaWYgKGFJc0FycmF5ICE9PSBBcnJheS5pc0FycmF5KGIpKSByZXR1cm4gZmFsc2U7IC8vIGFycmF5IHZzIHBsYWluIG9iamVjdFxuXG4gIC8vIEN5Y2xlIGd1YXJkIOKAlCBhIHBhaXIgd2UgYXJlIGFscmVhZHkgaW5zaWRlIGlzIGVxdWFsIGJ5IGFzc3VtcHRpb24uXG4gIHNlZW4gPz89IG5ldyBXZWFrTWFwKCk7XG4gIGxldCBwYXJ0bmVycyA9IHNlZW4uZ2V0KGEpO1xuICBpZiAocGFydG5lcnM/LmhhcyhiKSkgcmV0dXJuIHRydWU7XG4gIGlmICghcGFydG5lcnMpIHNlZW4uc2V0KGEsIChwYXJ0bmVycyA9IG5ldyBXZWFrU2V0KCkpKTtcbiAgcGFydG5lcnMuYWRkKGIpO1xuXG4gIGlmIChhS2luZCA9PT0gJ21hcCcpIHJldHVybiBlcXVhbE1hcHMoYSwgYiwgc2Vlbik7XG4gIGlmIChhS2luZCA9PT0gJ3NldCcpIHJldHVybiBlcXVhbFNldHMoYSwgYiwgc2Vlbik7XG5cbiAgaWYgKGFJc0FycmF5KSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFlcXVhbFBhaXJzKGFbaV0sIGJbaV0sIHNlZW4pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gT2JqZWN0czogb25seSBrZXlzIHRoYXQgSE9MRCBhIHZhbHVlIHRha2UgcGFydCDigJQgYW4gb3duIGB1bmRlZmluZWRgIGlzIGFcbiAgLy8gZGVsZXRlZCBrZXksIHRoZSBzYW1lIHN0YXRlIGFzIGFuIGFic2VudCBvbmUgKHNlZSB0aGUgY29udHJhY3QgYWJvdmUpLlxuICBsZXQgYUhlbGQgPSAwO1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhhKSkge1xuICAgIGlmIChhW2tleV0gPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgYUhlbGQrKztcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFlcXVhbFBhaXJzKGFba2V5XSwgYltrZXldLCBzZWVuKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGxldCBiSGVsZCA9IDA7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGIpKSBpZiAoYltrZXldICE9PSB1bmRlZmluZWQpIGJIZWxkKys7XG4gIHJldHVybiBhSGVsZCA9PT0gYkhlbGQ7XG59XG5cbi8qKiBUaGUgdHlwZWQgc3RhdGUgdmFsdWVzIGBzdHJ1Y3R1cmVkQ2xvbmVgIGtlZXBzIGFuZCBhIGtleSB3YWxrIGNhbm5vdCBzZWUuICovXG5mdW5jdGlvbiB0eXBlZEtpbmQodmFsdWU6IG9iamVjdCk6ICdkYXRlJyB8ICdtYXAnIHwgJ3NldCcgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gJ2RhdGUnO1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHJldHVybiAnbWFwJztcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSByZXR1cm4gJ3NldCc7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGVxdWFsTWFwcyhhOiBNYXA8dW5rbm93biwgdW5rbm93bj4sIGI6IE1hcDx1bmtub3duLCB1bmtub3duPiwgc2VlbjogU2VlblBhaXJzKTogYm9vbGVhbiB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhKSB7XG4gICAgaWYgKCFiLmhhcyhrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFlcXVhbFBhaXJzKHZhbHVlLCBiLmdldChrZXkpLCBzZWVuKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIE9yZGVyLWluc2Vuc2l0aXZlLCBkZWVwIHBlciBtZW1iZXIuIFF1YWRyYXRpYyBpbiB0aGUgd29yc3QgY2FzZSBmb3Igc2V0cyBvZlxuICogb2JqZWN0cyDigJQgYSBzZXQgb2YgcHJpbWl0aXZlcyAodGhlIGNvbW1vbiBzaGFwZSkgaXMgb25lIGBoYXNgIHBlciBtZW1iZXIuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsU2V0cyhhOiBTZXQ8dW5rbm93bj4sIGI6IFNldDx1bmtub3duPiwgc2VlbjogU2VlblBhaXJzKTogYm9vbGVhbiB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB1bm1hdGNoZWQgPSBbLi4uYl07XG4gIGZvciAoY29uc3QgbWVtYmVyIG9mIGEpIHtcbiAgICAvLyBTYW1lVmFsdWVaZXJvIGZpcnN0IOKAlCBwcmltaXRpdmVzIGFuZCBzaGFyZWQgcmVmZXJlbmNlcywgb25lIGBoYXNgLlxuICAgIC8vIEVhY2ggbWF0Y2ggcmV0aXJlcyBpdHMgc2xvdCBzbyB0d28gc3RydWN0dXJhbGx5LWVxdWFsIG1lbWJlcnMgb2YgYGFgXG4gICAgLy8gY2Fubm90IGJvdGggY2xhaW0gdGhlIHNhbWUgbWVtYmVyIG9mIGBiYC5cbiAgICBjb25zdCBhdCA9IHVubWF0Y2hlZC5pbmRleE9mKG1lbWJlcik7XG4gICAgY29uc3QgZm91bmQgPSBhdCA+PSAwID8gYXQgOiB1bm1hdGNoZWQuZmluZEluZGV4KChjYW5kaWRhdGUpID0+IGVxdWFsUGFpcnMobWVtYmVyLCBjYW5kaWRhdGUsIHNlZW4pKTtcbiAgICBpZiAoZm91bmQgPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgdW5tYXRjaGVkLnNwbGljZShmb3VuZCwgMSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogRGVlcCB1bmlvbiBtZXJnZSBoZWxwZXIuXG4gKiAtIEFycmF5cyAobm9uLWVtcHR5KTogdW5pb24gd2l0aG91dCBkdXBsaWNhdGVzIChlbmNvdW50ZXIgb3JkZXIgcHJlc2VydmVkKVxuICogLSBBcnJheXMgKGVtcHR5KTogICAgIHJlcGxhY2Ug4oCUIHNyYyBgW11gIGNsZWFycyB0aGUgZGVzdGluYXRpb24gYXJyYXkuXG4gKiAgIFJhdGlvbmFsZTogd3JpdGluZyBgc2NvcGUudGFncyA9IFtdYCBtZWFucyBcImNsZWFyIHRhZ3NcIiwgbm90IFwiYXBwZW5kIG5vdGhpbmdcIi5cbiAqICAgV2l0aG91dCB0aGlzIHJ1bGUsIGFuIGVtcHR5LWFycmF5IHdyaXRlIHNpbGVudGx5IGJlY29tZXMgYSBuby1vcCB3aGljaCBpc1xuICogICBpbXBvc3NpYmxlIHRvIGRpc3Rpbmd1aXNoIGZyb20gYSBidWcuXG4gKiAtIE9iamVjdHM6IHJlY3Vyc2l2ZSBtZXJnZVxuICogLSBQcmltaXRpdmVzOiBzb3VyY2Ugd2luc1xuICpcbiAqIFRlcm1pbmF0ZXMgb24gYSBDWUNMSUMgYHNyY2AgKDkuMTguMSwgc2FtZSBsYXcgYXMge0BsaW5rIGRlZXBFcXVhbH06IGFcbiAqIHN0YXRlIHZhbHVlIHN1cnZpdmVzIGBzdHJ1Y3R1cmVkQ2xvbmVgLCB3aGljaCBwcmVzZXJ2ZXMgY3ljbGVzKS4gQSBgc3JjYFxuICogb2JqZWN0IHJlLWVudGVyZWQgd2hpbGUgaXQgaXMgc3RpbGwgYmVpbmcgbWVyZ2VkIGhpZ2hlciB1cCB0aGUgc3RhY2sgaGFuZHNcbiAqIGJhY2sgdGhlIG91dHB1dCBiZWluZyBidWlsdCBmb3IgaXQsIHNvIHRoZSBtZXJnZWQgdmFsdWUgbWlycm9ycyB0aGUgY3ljbGVcbiAqIGluc3RlYWQgb2YgdW5yb2xsaW5nIGl0IGZvcmV2ZXIuIE9ubHkgdGhlIGFuY2VzdG9ycyBvbiB0aGUgc3RhY2sgYXJlXG4gKiBndWFyZGVkIOKAlCBhIHNoYXJlZCAoYWN5Y2xpYykgYHNyY2AgcmVmZXJlbmNlIG1ldCBhZ2FpbiBhdCBhIGRpZmZlcmVudFxuICogYGRzdGAgbWVyZ2VzIGFnYWluc3QgVEhBVCBgZHN0YCwgZXhhY3RseSBhcyBiZWZvcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwU21hcnRNZXJnZShkc3Q6IGFueSwgc3JjOiBhbnkpOiBhbnkge1xuICByZXR1cm4gbWVyZ2VHdWFyZGVkKGRzdCwgc3JjLCB1bmRlZmluZWQpO1xufVxuXG5mdW5jdGlvbiBtZXJnZUd1YXJkZWQoZHN0OiBhbnksIHNyYzogYW55LCBpbkZsaWdodDogV2Vha01hcDxvYmplY3QsIGFueT4gfCB1bmRlZmluZWQpOiBhbnkge1xuICBpZiAoc3JjID09PSBudWxsIHx8IHR5cGVvZiBzcmMgIT09ICdvYmplY3QnKSByZXR1cm4gc3JjO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHNyYykpIHtcbiAgICBpZiAoc3JjLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdOyAvLyBlbXB0eSBzcmMgPSBjbGVhciwgbm90IG5vLW9wXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZHN0KSkgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5kc3QsIC4uLnNyY10pXTtcbiAgICByZXR1cm4gWy4uLnNyY107XG4gIH1cblxuICBpZiAoaW5GbGlnaHQ/LmhhcyhzcmMpKSByZXR1cm4gaW5GbGlnaHQuZ2V0KHNyYyk7IC8vIGN5Y2xlIOKAlCByZS1lbnRlciB0aGUgdmFsdWUgYmVpbmcgYnVpbHRcblxuICBjb25zdCBvdXQ6IGFueSA9IHsgLi4uKGRzdCAmJiB0eXBlb2YgZHN0ID09PSAnb2JqZWN0JyA/IGRzdCA6IHt9KSB9O1xuICAoaW5GbGlnaHQgPz89IG5ldyBXZWFrTWFwKCkpLnNldChzcmMsIG91dCk7XG4gIC8vIE9iamVjdC5rZXlzKCkgaXMgb3duLWVudW1lcmFibGUtb25seSBieSBzcGVjIOKAlCBubyBERU5JRUQgY2hlY2sgbmVlZGVkIGhlcmUuXG4gIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhzcmMpKSB7XG4gICAgb3V0W2tdID0gbWVyZ2VHdWFyZGVkKG91dFtrXSwgc3JjW2tdLCBpbkZsaWdodCk7XG4gIH1cbiAgaW5GbGlnaHQuZGVsZXRlKHNyYyk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogSXMgcm93IGBpYCBhIGBzZXRgIHRoYXQgdGhlIE5FWFQgcm93IHNldHMgYWdhaW4g4oCUIHNhbWUgcGF0aCwgc2FtZSB2ZXJiIOKAlCBzb1xuICogdGhhdCBhcHBseWluZyBpdCBpcyB3b3JrIHRoZSBuZXh0IHJvdyByZWRvZXM/XG4gKlxuICogVGhlIG9uZSBza2lwIGV2ZXJ5IHJlcGxheSBpdGVyYXRvciBzaGFyZXMgKDkuMjIuMSkuIEEgYHNldGAgcm93IHdyaXRlcyBhXG4gKiBjbG9uZSBvZiB0aGUgcmVjb3JkZWQgdmFsdWUgYXQgaXRzIHBhdGg7IHRoZSBuZXh0IHJvdywgYSBgc2V0YCBvZiB0aGUgc2FtZVxuICogcGF0aCwgd3JpdGVzIGEgY2xvbmUgb2YgdGhlIFNBTUUgcmVjb3JkZWQgdmFsdWUgb3ZlciBpdCAodGhlIGJ1bmRsZSdzIHBhdGNoXG4gKiB0cmVlIGlzIGZpeGVkKSwgYW5kIG5vdGhpbmcgcnVucyBpbiBiZXR3ZWVuIOKAlCBzbyB0aGUgZmlyc3Qgd3JpdGUgaXNcbiAqIHVub2JzZXJ2YWJsZSwgY29udGFpbmVyIGNyZWF0aW9uIGFuZCBrZXkgb3JkZXIgaW5jbHVkZWQuIE9ubHkgQ09OU0VDVVRJVkVcbiAqIHJvd3MgcXVhbGlmeTogYSByb3cgaW4gYmV0d2VlbiAoYW4gYW5jZXN0b3IgYG1lcmdlYCwgYSBzaWJsaW5nIGBzZXRgIHRoYXRcbiAqIGNyZWF0ZXMgYSBjb250YWluZXIpIGNhbiBzZWUgdGhlIGludGVybWVkaWF0ZSB2YWx1ZSwgYW5kIGEgYG1lcmdlYCxcbiAqIGBhcHBlbmRgIG9yIGBkZWxldGVgIG5leHQgcm93IGRlcGVuZHMgb24gd2hhdCBpcyB0aGVyZS4gUm93cyBhcmUgbmV2ZXJcbiAqIGRyb3BwZWQgZnJvbSB0aGUgbG9nIOKAlCB0aGUgOS4yMi4wIGVsZW1lbnQtd3JpdGUgZnVubmVsIHJlY29yZHMgTlxuICogd2hvbGUtYXJyYXkgYHNldGAgcm93cyBvbiBvbmUgcGF0aCwgYW5kIHRoaXMgaXMgd2hhdCBtYWtlcyByZXBsYXlpbmcgdGhlbVxuICogTyhOKSBpbnN0ZWFkIG9mIE8oTiDDlyByb3dzKS5cbiAqXG4gKiBTaGFyZWQgYnkge0BsaW5rIGFwcGx5U21hcnRNZXJnZX0gKGxpdmUgc3RhdGUsIGBFdmVudExvZy5tYXRlcmlhbGlzZWAsXG4gKiBgc3RhdGVBdGAsIHRoZSByZWRhY3RlZCBtaXJyb3IpIGFuZCBgVHJhbnNhY3Rpb25CdWZmZXIucmVwbGF5RmFtaWx5VmVyYnNgXG4gKiAodGhlIGRlbHRhIGVuY29kZXIncyBwZXItZmFtaWx5IGZvbGQpIOKAlCB0aGUgdHdvIGxvb3BzIHRoYXQgY2xvbmUgcGVyIHJvdy5cbiAqIGBjb21taXRWYWx1ZUF0YCBuZWVkcyBubyBza2lwOiBpdCBhbmNob3JzIGF0IHRoZSBMQVNUIGBzZXRgIGJ5IGNvbnN0cnVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cGVyc2VkZWRCeU5leHRTZXQocm93czogcmVhZG9ubHkgeyBwYXRoOiBzdHJpbmc7IHZlcmI6IHN0cmluZyB9W10sIGk6IG51bWJlcik6IGJvb2xlYW4ge1xuICBjb25zdCByb3cgPSByb3dzW2ldO1xuICBpZiAocm93LnZlcmIgIT09ICdzZXQnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IG5leHQgPSByb3dzW2kgKyAxXTtcbiAgcmV0dXJuIG5leHQgIT09IHVuZGVmaW5lZCAmJiBuZXh0LnZlcmIgPT09ICdzZXQnICYmIG5leHQucGF0aCA9PT0gcm93LnBhdGg7XG59XG5cbi8qKlxuICogQXBwbGllcyBhIGNvbW1pdCBidW5kbGUgdG8gYSBiYXNlIHN0YXRlIGJ5IHJlcGxheWluZyBvcGVyYXRpb25zIGluIG9yZGVyLlxuICogR3VhcmFudGVlcyBcImxhc3Qgd3JpdGVyIHdpbnNcIiBzZW1hbnRpY3MuXG4gKlxuICogVGhlIHNpbmdsZSByZXBsYXkgcHJpbWl0aXZlIOKAlCB0aHJlZSBjb25zdW1lcnMgaW5oZXJpdCBldmVyeSB2ZXJiIGZyb20gaXQ6XG4gKiBsaXZlIHN0YXRlIChgU2hhcmVkTWVtb3J5LmFwcGx5UGF0Y2hgKSwgdGltZSB0cmF2ZWxcbiAqIChgRXZlbnRMb2cubWF0ZXJpYWxpc2VgKSwgYW5kIHRoZSByZWRhY3RlZCBtaXJyb3JcbiAqIChgU3RhZ2VDb250ZXh0LmNvbW1pdGAncyBzZWNvbmQgYGFwcGx5UGF0Y2hgKS5cbiAqXG4gKiBWZXJiIGFybXM6XG4gKiAgIC0gYCdzZXQnYCAgICDigJQgb3ZlcndyaXRlIHdpdGggYG92ZXJ3cml0ZVtwYXRoXWAgKHRoZSBmdWxsIGZpbmFsIHZhbHVlKS5cbiAqICAgLSBgJ21lcmdlJ2AgIOKAlCBgZGVlcFNtYXJ0TWVyZ2VgIHRoZSBhY2N1bXVsYXRlZCBgdXBkYXRlc1twYXRoXWAgZGVsdGEgaW4uXG4gKiAgIC0gYCdhcHBlbmQnYCDigJQgKCMxM2MtQiBkZWx0YSBtb2RlKSBgb3ZlcndyaXRlW3BhdGhdYCBob2xkcyBPTkxZIHRoZSB0YWlsO1xuICogICAgIHJlY29uc3RydWN0IGJ5IGNvbmNhdGVuYXRpbmcgaXQgb250byB0aGUgY3VycmVudCBhcnJheS4gV2hlbiB0aGVcbiAqICAgICBjdXJyZW50IHZhbHVlIG9yIHRoZSByZWNvcmRlZCB0YWlsIGlzIG5vdCBhbiBhcnJheSAob3V0LW9mLW9yZGVyXG4gKiAgICAgcmVwbGF5IGJhc2UsIG9yIGEgUkVEQUNURUQgdGFpbCDigJQgYHJlZGFjdFBhdGNoYCByZXBsYWNlcyBtYXRjaGVkXG4gKiAgICAgcGF5bG9hZHMgd2l0aCB0aGUgYCdSRURBQ1RFRCdgIHN0cmluZyksIGRlZ3JhZGUgdG8gYSBkaXJlY3Qgc2V0IG9mIHRoZVxuICogICAgIHJlY29yZGVkIHZhbHVlIOKAlCB0aGUgc2FtZSB0ZXJtaW5hbCB2YWx1ZSBhIHJlZGFjdGVkL2NvcnJ1cHQgYCdzZXQnYFxuICogICAgIHByb2R1Y2VzLlxuICogICAtIGAnZGVsZXRlJ2Ag4oCUICgjMTNjLUIgZGVsdGEgbW9kZSkgcmVtb3ZlIHRoZSBrZXkgKGBuYXRpdmVEZWxldGVgLFxuICogICAgIHByb3RvdHlwZS1wb2xsdXRpb24tc2FmZSkuIFRoZSBwYXRoIHN0YXlzIGVudW1lcmF0ZWQgaW4gYG92ZXJ3cml0ZWBcbiAqICAgICAodmFsdWUgYHVuZGVmaW5lZGApIGZvciBrZXktc2V0IGNvbnN1bWVyczsgcmVwbGF5IGlnbm9yZXMgdGhhdCB2YWx1ZS5cbiAqXG4gKiBXb3JrLCBub3QgYnl0ZXMgKDkuMjIuMSk6IGEgYHNldGAgcm93IHRoZSBORVhUIHJvdyByZS1zZXRzIGlzIHNraXBwZWRcbiAqICh7QGxpbmsgc3VwZXJzZWRlZEJ5TmV4dFNldH0pIOKAlCB0aGUgcm93cyBzdGF5IGluIHRoZSBsb2csIG9ubHkgdGhlIGNsb25lXG4gKiBlYWNoIHdvdWxkIGhhdmUgcGFpZCBpcyBub3QuIEV2ZXJ5IGNvbnN1bWVyIGFib3ZlIGluaGVyaXRzIHRoZSBza2lwIGZyb21cbiAqIGhlcmU7IHRoZXJlIGlzIG5vIHNlY29uZCByZXBsYXkgbG9vcCB0byBrZWVwIGluIHN0ZXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNtYXJ0TWVyZ2UoYmFzZTogYW55LCB1cGRhdGVzOiBNZW1vcnlQYXRjaCwgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaCwgdHJhY2U6IFRyYWNlRW50cnlbXSk6IGFueSB7XG4gIGNvbnN0IG91dCA9IHN0cnVjdHVyZWRDbG9uZShiYXNlKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFjZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdXBlcnNlZGVkQnlOZXh0U2V0KHRyYWNlLCBpKSkgY29udGludWU7XG4gICAgY29uc3QgeyBwYXRoLCB2ZXJiIH0gPSB0cmFjZVtpXTtcbiAgICBjb25zdCBzZWdzID0gcGF0aC5zcGxpdChERUxJTSk7XG4gICAgaWYgKHZlcmIgPT09ICdzZXQnKSB7XG4gICAgICBfc2V0KG91dCwgc2Vncywgc3RydWN0dXJlZENsb25lKF9nZXQob3ZlcndyaXRlLCBzZWdzKSkpO1xuICAgIH0gZWxzZSBpZiAodmVyYiA9PT0gJ2FwcGVuZCcpIHtcbiAgICAgIGNvbnN0IHRhaWwgPSBzdHJ1Y3R1cmVkQ2xvbmUoX2dldChvdmVyd3JpdGUsIHNlZ3MpKTtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBfZ2V0KG91dCwgc2Vncyk7XG4gICAgICBfc2V0KG91dCwgc2VncywgQXJyYXkuaXNBcnJheShjdXJyZW50KSAmJiBBcnJheS5pc0FycmF5KHRhaWwpID8gWy4uLmN1cnJlbnQsIC4uLnRhaWxdIDogdGFpbCk7XG4gICAgfSBlbHNlIGlmICh2ZXJiID09PSAnZGVsZXRlJykge1xuICAgICAgbmF0aXZlRGVsZXRlKG91dCwgc2Vncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBfZ2V0KG91dCwgc2VncykgPz8ge307XG4gICAgICBfc2V0KG91dCwgc2VncywgZGVlcFNtYXJ0TWVyZ2UoY3VycmVudCwgX2dldCh1cGRhdGVzLCBzZWdzKSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIl19
455
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBRSxTQUFTLElBQUksSUFBSSxFQUFFLFNBQVMsSUFBSSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHckc7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUM7QUFJOUI7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEtBQWMsRUFBRSxPQUE0QixFQUFFO0lBQ2pGLE9BQU87UUFDTCxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNyRCxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsR0FBaUIsRUFDakIsS0FBYSxFQUNiLEtBQWUsRUFDZixLQUFhLEVBQ2IsS0FBUSxFQUNSLGFBQXVCO0lBRXZCLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25FLE1BQU0sSUFBSSxHQUFHLE9BQU8sSUFBSSxVQUFVLENBQUM7SUFDbkMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzNCLElBQUksT0FBTyxHQUFpQixHQUFHLENBQUM7SUFDaEMsT0FBTyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzNCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQVksQ0FBQztRQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEtBQUssS0FBSyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckUsQ0FBQztRQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUNELE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdkIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLEdBQVEsRUFDUixLQUF5QixFQUN6QixLQUEwQixFQUMxQixLQUFzQixFQUN0QixLQUFRLEVBQ1IsYUFBdUI7SUFFdkIsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkUsTUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLFVBQVUsQ0FBQztJQUNuQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDM0IsSUFBSSxPQUFPLEdBQWlCLEdBQUcsQ0FBQztJQUNoQyxPQUFPLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxLQUFLLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBQ0QsV0FBVyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkMsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLE1BQVcsRUFBRSxHQUFvQixFQUFFLEtBQVU7SUFDdkUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyx3Q0FBd0M7UUFDL0QsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFRLENBQUM7WUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDSCxDQUFDO1NBQU0sSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0UsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBUSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUNqRSxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBUyxFQUFFLElBQXlCLEVBQUUsS0FBdUI7SUFDMUYsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0QsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBa0IsRUFBRSxXQUF3QjtJQUN0RSxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsS0FBSyxNQUFNLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUMvQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEMsSUFBSSxPQUFPLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQXlCO0lBQ3JELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBWTtJQUN2QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaURHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxDQUFNLEVBQUUsQ0FBTTtJQUN0QyxPQUFPLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFXRCxTQUFTLFVBQVUsQ0FBQyxDQUFNLEVBQUUsQ0FBTSxFQUFFLElBQTJCO0lBQzdELElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLHdDQUF3QztJQUNsRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLE9BQU8sQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSTtRQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLCtCQUErQjtJQUM3RSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsNkJBQTZCO0lBRWhGLHVFQUF1RTtJQUN2RSw0REFBNEQ7SUFDNUQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLElBQUksS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6QyxJQUFJLEtBQUssS0FBSyxNQUFNO1FBQUUsT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUVqRSxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLElBQUksUUFBUSxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyx3QkFBd0I7SUFFekUscUVBQXFFO0lBQ3JFLElBQUksS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ3ZCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0IsSUFBSSxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ2xDLElBQUksQ0FBQyxRQUFRO1FBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoQixJQUFJLEtBQUssS0FBSyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsRCxJQUFJLEtBQUssS0FBSyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUVsRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2xELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UseUVBQXlFO0lBQ3pFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVM7WUFBRSxTQUFTO1FBQ25DLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDaEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3RELENBQUM7SUFDRCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUztZQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3BFLE9BQU8sS0FBSyxLQUFLLEtBQUssQ0FBQztBQUN6QixDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLFNBQVMsU0FBUyxDQUFDLEtBQWE7SUFDOUIsSUFBSSxLQUFLLFlBQVksSUFBSTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3pDLElBQUksS0FBSyxZQUFZLEdBQUc7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN2QyxJQUFJLEtBQUssWUFBWSxHQUFHO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdkMsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLENBQXdCLEVBQUUsQ0FBd0IsRUFBRSxJQUFlO0lBQ3BGLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3BDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3pELENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxDQUFlLEVBQUUsQ0FBZSxFQUFFLElBQWU7SUFDbEUsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDcEMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDdkIscUVBQXFFO1FBQ3JFLHVFQUF1RTtRQUN2RSw0Q0FBNEM7UUFDNUMsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxNQUFNLEtBQUssR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckcsSUFBSSxLQUFLLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQVEsRUFBRSxHQUFRO0lBQy9DLE9BQU8sWUFBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEdBQVEsRUFBRSxHQUFRLEVBQUUsUUFBMEM7SUFDbEYsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUV4RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsK0JBQStCO1FBQ2hFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLFFBQVEsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMseUNBQXlDO0lBRTNGLE1BQU0sR0FBRyxHQUFRLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNwRSxDQUFDLFFBQVEsS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzQyw4RUFBOEU7SUFDOUUsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRCxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxJQUErQyxFQUFFLENBQVM7SUFDNUYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxLQUFLO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDckMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6QixPQUFPLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQzdFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFTLEVBQUUsT0FBb0IsRUFBRSxTQUFzQixFQUFFLEtBQW1CO0lBQzFHLE9BQU8sbUJBQW1CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxNQUFXLEVBQ1gsT0FBb0IsRUFDcEIsU0FBc0IsRUFDdEIsS0FBbUI7SUFFbkIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDO0lBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdEMsSUFBSSxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQUUsU0FBUztRQUM1QyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxDQUFDO2FBQU0sSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNwRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRyxDQUFDO2FBQU0sSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0IsWUFBWSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHV0aWxzLnRzIOKAlCBIZWxwZXIgZnVuY3Rpb25zIGZvciBuZXN0ZWQgb2JqZWN0IG1hbmlwdWxhdGlvblxuICpcbiAqIFByb3ZpZGVzIGNvbnNpc3RlbnQgcGF0aCB0cmF2ZXJzYWwgYW5kIHZhbHVlIG1hbmlwdWxhdGlvbiBmb3IgdGhlIG1lbW9yeSBzeXN0ZW0uXG4gKiBaZXJvIGV4dGVybmFsIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVEZWxldGUsIG5hdGl2ZUdldCBhcyBfZ2V0LCBuYXRpdmVIYXMgYXMgX2hhcywgbmF0aXZlU2V0IGFzIF9zZXQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlQYXRjaCwgVHJhY2VFbnRyeSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFRoZSBzZXBhcmF0b3IgdGhhdCBqb2lucyBwYXRoIFNFR01FTlRTIGludG8gYSBgVHJhY2VFbnRyeS5wYXRoYC5cbiAqXG4gKiBXSFkgTk9UIGAnLidgIOKAlCB0aGUgYW1iaWd1aXR5IHRoaXMgZXhpc3RzIHRvIHByZXZlbnQ6IGEgc3RhdGUga2V5IG1heSBpdHNlbGZcbiAqIENPTlRBSU4gYSBkb3QsIGFuZCB0aGlzIGxpYnJhcnkgY3JlYXRlcyBzdWNoIGtleXMgcm91dGluZWx5LiBgJHNldFZhbHVlYFxuICogdGFrZXMgYSBLRVksIG5vdCBhIHBhdGgsIHNvIGAkc2V0VmFsdWUoJ2EuYicsIHYpYCBtYWtlcyBvbmUgdG9wLWxldmVsIGtleVxuICogbGl0ZXJhbGx5IG5hbWVkIGBhLmJgLiBXaXRoIGEgZG90IHNlcGFyYXRvciB0aGF0IGtleSdzIHBhdGggYW5kIHRoZSBuZXN0ZWRcbiAqIHBhdGggYFsnYScsICdiJ11gIHdvdWxkIGJvdGggZW5jb2RlIGFzIGBcImEuYlwiYCwgYW5kIGV2ZXJ5IHJlYWRlciBvZiB0aGVcbiAqIGNvbW1pdCBsb2cg4oCUIGBhcHBseVNtYXJ0TWVyZ2VgLCBgY29tbWl0VmFsdWVBdGAsIGByZWRhY3RQYXRjaGAsXG4gKiBgZmluZExhc3RXcml0ZXJgLCB0aGUgc2xpY2UgbGF5ZXIg4oCUIHdvdWxkIGhhdmUgdG8gZ3Vlc3Mgd2hpY2ggb25lIGEgYnVuZGxlXG4gKiBtZWFudC4gU3BsaXR0aW5nIHRoZSB3cm9uZyB3YXkgd3JpdGVzIGludG8gKG9yIHJlYWRzIGZyb20pIHRoZSB3cm9uZyBwbGFjZS5cbiAqXG4gKiBBU0NJSSBVbml0LVNlcGFyYXRvciBpcyB0aGUgY2hvaWNlIGJlY2F1c2UgaXQgY2Fubm90IGFwcGVhciBpbiBhIEpTXG4gKiBpZGVudGlmaWVyIGFuZCBpcyB2YW5pc2hpbmdseSB1bmxpa2VseSBpbiBhIGhhbmQtd3JpdHRlbiBrZXksIHNvIHRoZVxuICogZW5jb2Rpbmcgc3RheXMgdW5hbWJpZ3VvdXMuIEl0IGlzIE5PVCBhIGRpc3BsYXkgY2hhcmFjdGVyOiBhIHBhdGggcmVuZGVyZWRcbiAqIHN0cmFpZ2h0IHRvIGEgVUkgb3IgYSBsb2cgbG9va3MgbGlrZSBvbmUgYnJva2VuIHdvcmQuIFNwbGl0IGl0IHdpdGhcbiAqIHtAbGluayBwYXRoU2VnbWVudHN9IOKAlCB0aGF0LCBub3QgdGhpcyBjb25zdGFudCwgaXMgdGhlIGNvbnRyYWN0IGNvbnN1bWVyc1xuICogc2hvdWxkIGhvbGQuXG4gKi9cbmV4cG9ydCBjb25zdCBERUxJTSA9ICdcXHUwMDFGJztcblxudHlwZSBOZXN0ZWRPYmplY3QgPSB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG4vKipcbiAqIFJlc29sdmVzIHJ1bi1uYW1lc3BhY2VkIGFuZCBnbG9iYWwgcGF0aHMuXG4gKiBFYWNoIGZsb3djaGFydCBleGVjdXRpb24gKHJ1bikgc3RvcmVzIGRhdGEgdW5kZXIgYHJ1bnMve2lkfS9gIHRvIHByZXZlbnQgY29sbGlzaW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bkFuZEdsb2JhbFBhdGhzKHJ1bklkPzogc3RyaW5nLCBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW10pIHtcbiAgcmV0dXJuIHtcbiAgICBydW5QYXRoOiBydW5JZCA/IFsncnVucycsIHJ1bklkLCAuLi5wYXRoXSA6IHVuZGVmaW5lZCxcbiAgICBnbG9iYWxQYXRoOiBbLi4ucGF0aF0sXG4gIH07XG59XG5cbi8qKlxuICogU2V0cyBhIHZhbHVlIGF0IGEgbmVzdGVkIHBhdGgsIGNyZWF0aW5nIGludGVybWVkaWF0ZSBvYmplY3RzIGFzIG5lZWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE5lc3RlZFZhbHVlPFQ+KFxuICBvYmo6IE5lc3RlZE9iamVjdCxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgX3BhdGg6IHN0cmluZ1tdLFxuICBmaWVsZDogc3RyaW5nLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBOZXN0ZWRPYmplY3Qge1xuICBjb25zdCB7IHJ1blBhdGgsIGdsb2JhbFBhdGggfSA9IGdldFJ1bkFuZEdsb2JhbFBhdGhzKHJ1bklkLCBfcGF0aCk7XG4gIGNvbnN0IHBhdGggPSBydW5QYXRoIHx8IGdsb2JhbFBhdGg7XG4gIGNvbnN0IHBhdGhDb3B5ID0gWy4uLnBhdGhdO1xuICBsZXQgY3VycmVudDogTmVzdGVkT2JqZWN0ID0gb2JqO1xuICB3aGlsZSAocGF0aENvcHkubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGtleSA9IHBhdGhDb3B5LnNoaWZ0KCkgYXMgc3RyaW5nO1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSkpIHtcbiAgICAgIGN1cnJlbnRba2V5XSA9IGtleSA9PT0gcnVuSWQgJiYgZGVmYXVsdFZhbHVlcyA/IGRlZmF1bHRWYWx1ZXMgOiB7fTtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuICBjdXJyZW50W2ZpZWxkXSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIERlZXAtbWVyZ2VzIGEgdmFsdWUgaW50byB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgcGF0aC5cbiAqIC0gQXJyYXlzOiBjb25jYXRlbmF0ZVxuICogLSBPYmplY3RzOiBzaGFsbG93IG1lcmdlIGF0IGVhY2ggbGV2ZWxcbiAqIC0gUHJpbWl0aXZlczogcmVwbGFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTmVzdGVkVmFsdWU8VD4oXG4gIG9iajogYW55LFxuICBydW5JZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBfcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgZmllbGQ6IHN0cmluZyB8IG51bWJlcixcbiAgdmFsdWU6IFQsXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogYW55IHtcbiAgY29uc3QgeyBydW5QYXRoLCBnbG9iYWxQYXRoIH0gPSBnZXRSdW5BbmRHbG9iYWxQYXRocyhydW5JZCwgX3BhdGgpO1xuICBjb25zdCBwYXRoID0gcnVuUGF0aCB8fCBnbG9iYWxQYXRoO1xuICBjb25zdCBwYXRoQ29weSA9IFsuLi5wYXRoXTtcbiAgbGV0IGN1cnJlbnQ6IE5lc3RlZE9iamVjdCA9IG9iajtcbiAgd2hpbGUgKHBhdGhDb3B5Lmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBrZXkgPSBwYXRoQ29weS5zaGlmdCgpIGFzIHN0cmluZztcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSBrZXkgPT09IHJ1bklkICYmIGRlZmF1bHRWYWx1ZXMgPyBkZWZhdWx0VmFsdWVzIDoge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cbiAgdXBkYXRlVmFsdWUoY3VycmVudCwgZmllbGQsIHZhbHVlKTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJbi1wbGFjZSB2YWx1ZSB1cGRhdGUgd2l0aCBtZXJnZSBzZW1hbnRpY3MuXG4gKiAtIEFycmF5cyAobm9uLWVtcHR5KTogY29uY2F0ZW5hdGUgb250byBleGlzdGluZ1xuICogLSBBcnJheXMgKGVtcHR5KTogICAgIGRpcmVjdCByZXBsYWNlIOKAlCB3cml0aW5nIGBbXWAgY2xlYXJzIHRoZSBmaWVsZFxuICogLSBPYmplY3RzIChub24tZW1wdHkpOiBzaGFsbG93IG1lcmdlIChzcHJlYWQpXG4gKiAtIE9iamVjdHMgKGVtcHR5KTogICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYHt9YCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIFByaW1pdGl2ZXM6IGRpcmVjdCBhc3NpZ25tZW50XG4gKlxuICogTm90ZSBvbiBlbXB0eSBhcnJheXM6IGJvdGggYHZhbHVlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpYCBhbmRcbiAqIGBBcnJheS5pc0FycmF5KHZhbHVlKWAgZXZhbHVhdGUgdGhlIHNhbWUgZm9yIGFycmF5cyDigJQgYFtdYCBpcyB0cnV0aHkgaW5cbiAqIEphdmFTY3JpcHQsIHNvIHRoZSBgJiZgIGd1YXJkIHdhcyBuZXZlciB0aGUgaXNzdWUuIFRoZSBhY3R1YWwgYnVnIHdhcyB0aGVcbiAqIGNvbmNhdCBwYXRoOiBgWy4uLmN1ciwgLi4uW11dYCBzaWxlbnRseSByZXR1cm5lZCBgY3VyYCB1bmNoYW5nZWQgd2hlbiBgdmFsdWVgXG4gKiB3YXMgYFtdYCwgbWFraW5nIGB1cGRhdGVWYWx1ZShvYmosICd0YWdzJywgW10pYCBhIG5vLW9wIGluc3RlYWQgb2YgYSBjbGVhci5cbiAqIFRoZSBmaXggaXMgdGhlIGV4cGxpY2l0IGB2YWx1ZS5sZW5ndGggPT09IDBgIGVhcmx5LXJldHVybiBicmFuY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVWYWx1ZShvYmplY3Q6IGFueSwga2V5OiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTsgLy8gY2xlYXI6IFtdIHJlcGxhY2VzIHdoYXRldmVyIHdhcyB0aGVyZVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXIgPSBvYmplY3Rba2V5XSBhcyBhbnk7XG4gICAgICBvYmplY3Rba2V5XSA9IGN1ciA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiBbLi4uY3VyLCAuLi52YWx1ZV07XG4gICAgfVxuICB9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCkge1xuICAgIGNvbnN0IGN1ciA9IG9iamVjdFtrZXldIGFzIGFueTtcbiAgICBvYmplY3Rba2V5XSA9IGN1ciA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7IC4uLmN1ciwgLi4udmFsdWUgfTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyBhIHZhbHVlIGF0IGEgbmVzdGVkIHBhdGggd2l0aCBwcm90b3R5cGUtcG9sbHV0aW9uIHByb3RlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXN0ZWRWYWx1ZShyb290OiBhbnksIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGZpZWxkPzogc3RyaW5nIHwgbnVtYmVyKTogYW55IHtcbiAgY29uc3Qgbm9kZSA9IHBhdGggJiYgcGF0aC5sZW5ndGggPiAwID8gX2dldChyb290LCBwYXRoKSA6IHJvb3Q7XG4gIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8IG5vZGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG5vZGU7XG4gIGlmIChub2RlICE9PSBudWxsICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobm9kZSwgZmllbGQpKSB7XG4gICAgcmV0dXJuIG5vZGVbZmllbGRdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVkYWN0cyBzZW5zaXRpdmUgdmFsdWVzIGluIGEgcGF0Y2ggZm9yIGxvZ2dpbmcvZGVidWdnaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVkYWN0UGF0Y2gocGF0Y2g6IE1lbW9yeVBhdGNoLCByZWRhY3RlZFNldDogU2V0PHN0cmluZz4pOiBNZW1vcnlQYXRjaCB7XG4gIGNvbnN0IG91dCA9IHN0cnVjdHVyZWRDbG9uZShwYXRjaCk7XG4gIGZvciAoY29uc3QgZmxhdCBvZiByZWRhY3RlZFNldCkge1xuICAgIGNvbnN0IHBhdGhBcnIgPSBmbGF0LnNwbGl0KERFTElNKTtcbiAgICBpZiAoX2hhcyhvdXQsIHBhdGhBcnIpKSB7XG4gICAgICBjb25zdCBjdXJyID0gX2dldChvdXQsIHBhdGhBcnIpO1xuICAgICAgaWYgKHR5cGVvZiBjdXJyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBfc2V0KG91dCwgcGF0aEFyciwgJ1JFREFDVEVEJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogTm9ybWFsaXNlcyBhbiBhcnJheSBwYXRoIGludG8gYSBzdGFibGUgc3RyaW5nIGtleSB1c2luZyBERUxJTS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGlzZVBhdGgocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLm1hcChTdHJpbmcpLmpvaW4oREVMSU0pO1xufVxuXG4vKipcbiAqIFRoZSBpbnZlcnNlIG9mIHtAbGluayBub3JtYWxpc2VQYXRofTogdGhlIFNFR01FTlRTIG9mIGEgYFRyYWNlRW50cnkucGF0aGAuXG4gKlxuICogQSBwYXRoIGluIHRoZSBjb21taXQgbG9nIGlzIERFTElNLWpvaW5lZCAoc2VlIHtAbGluayBERUxJTX0pLCB3aGljaCBpcyBub3QgYVxuICogZGlzcGxheSBlbmNvZGluZyDigJQgcHJpbnRpbmcgb25lIHZlcmJhdGltIHNob3dzIGEgc2luZ2xlIGJyb2tlbi1sb29raW5nIHdvcmQsXG4gKiBhcyBhIGNvbnN1bWVyIHJlbmRlcmluZyBhIHBhdGggZGlzY292ZXJlZC4gVGhpcyBpcyB0aGUgc3VwcG9ydGVkIHdheSB0byB0YWtlXG4gKiBpdCBhcGFydDsgdGhlIGRlbGltaXRlciBpdHNlbGYgc3RheXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLCBzbyBhIHBhdGggY2FuXG4gKiBiZSByZWFkLCByZW5kZXJlZCBvciByZS1qb2luZWQgd2l0aG91dCBhbnlvbmUgaGFyZC1jb2RpbmcgYSBjb250cm9sXG4gKiBjaGFyYWN0ZXIuXG4gKlxuICogQSBzaW5nbGUtc2VnbWVudCBwYXRoICh0aGUgY29tbW9uIGNhc2Ug4oCUIGEgdG9wLWxldmVsIHN0YXRlIGtleSkgcmV0dXJucyBhXG4gKiBvbmUtZWxlbWVudCBhcnJheSwgc28gY2FsbGVycyBuZWVkIG5vIHNwZWNpYWwgY2FzZS5cbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgcGF0aFNlZ21lbnRzIH0gZnJvbSAnZm9vdHByaW50anMvdHJhY2UnO1xuICpcbiAqIGZvciAoY29uc3QgZW50cnkgb2YgYnVuZGxlLnRyYWNlKSB7XG4gKiAgIGNvbnNvbGUubG9nKHBhdGhTZWdtZW50cyhlbnRyeS5wYXRoKS5qb2luKCcg4oC6ICcpKTsgLy8gJ29yZGVyIOKAuiBsaW5lcydcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0aFNlZ21lbnRzKHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoREVMSU0pO1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWwgZGVlcCBlcXVhbGl0eSBmb3IgY29tbWl0dGVkLXN0YXRlIHZhbHVlcy5cbiAqXG4gKiBVc2VkIGJ5IHtAbGluayBUcmFuc2FjdGlvbkJ1ZmZlcn0gdG8gZGVjaWRlIHdoZXRoZXIgYSBzdGFnZSBhY3R1YWxseSBDSEFOR0VEXG4gKiBhIHBhdGggb3IgbWVyZWx5IHJlLXdyb3RlIC8gcmV2ZXJ0ZWQgaXQgdG8gdGhlIHZhbHVlIGl0IGFscmVhZHkgaGVsZCAoYVxuICogXCJuby1vcCB3cml0ZVwiKSwgYW5kIGJ5IGBib3Jyb3dlZE11dGF0aW9uLmZpcnN0RGlmZmVyaW5nUGF0aGAgdG8gZmluZCB3aGVyZSBhXG4gKiBib3Jyb3dlZCByZWFkIG1vdmVkLiBDb21taXR0ZWQgc3RhdGUgbXVzdCBzdXJ2aXZlIGBzdHJ1Y3R1cmVkQ2xvbmVgLCBhbmRcbiAqIGBzdHJ1Y3R1cmVkQ2xvbmVgIGtlZXBzIGBEYXRlYCwgYE1hcGAgYW5kIGBTZXRgIOKAlCBzbyB0aG9zZSBhcmUgbGVnYWwgc3RhdGVcbiAqIHZhbHVlcyAoYSBgJHNldFZhbHVlYCBieXBhc3NlcyB0aGUgcHJveHkncyBKU09OIHJvdW5kLXRyaXApIGFuZCB0aGlzIG11c3RcbiAqIHRlbGwgdHdvIG9mIHRoZW0gYXBhcnQuIEJlZm9yZSA5LjIyLjAgaXQgY29tcGFyZWQgdGhlbSBhcyBwbGFpbiBvYmplY3RzLCBhbmRcbiAqIGEgYERhdGVgL2BNYXBgL2BTZXRgIGhhcyBubyBvd24gZW51bWVyYWJsZSBrZXlzOiBldmVyeSBwYWlyIHdhcyBcImVxdWFsXCIsIHNvXG4gKiBgJHNldFZhbHVlKCdrJywgbmV3IERhdGUoMTk5OSkpYCBvdmVyIGEgMjAyMCBkYXRlIHdhcyBkcm9wcGVkIGFzIGEgbm8tb3Ag4oCUXG4gKiBubyB0cmFjZSByb3csIHN0YXRlIHVuY2hhbmdlZCDigJQgYW5kIGEgYHNldEZ1bGxZZWFyYCBpbiBwbGFjZSBzbGlwcGVkIHBhc3RcbiAqIHRoZSBkZXYtbW9kZSBndWFyZC5cbiAqXG4gKiBTZW1hbnRpY3M6XG4gKiAgIC0gcmVmZXJlbmNlIC8gaWRlbnRpY2FsLXByaW1pdGl2ZSBzaG9ydC1jaXJjdWl0cyBmaXJzdCAoY2hlYXAgZmFzdCBwYXRoKVxuICogICAtIGBOYU5gIGVxdWFscyBgTmFOYCAocHJpbWl0aXZlIGNvbXBhcmUgZmFsbHMgYmFjayB0byBgT2JqZWN0LmlzYClcbiAqICAgLSBgRGF0ZWA6IHNhbWUgYGdldFRpbWUoKWAgKHR3byBpbnZhbGlkIGRhdGVzIGFyZSBlcXVhbClcbiAqICAgLSBgTWFwYDogc2FtZSBzaXplIEFORCwgcGVyIGtleSBvZiBgYWAsIGBiYCBob2xkcyBhIGRlZXAtZXF1YWwgdmFsdWUg4oCUXG4gKiAgICAga2V5cyBieSBgTWFwYCBpZGVudGl0eSAoYFNhbWVWYWx1ZVplcm9gKSwgdmFsdWVzIGRlZXBcbiAqICAgLSBgU2V0YDogc2FtZSBzaXplIEFORCBldmVyeSBtZW1iZXIgb2YgYGFgIGlzIGRlZXAtZXF1YWwgdG8gU09NRSBtZW1iZXJcbiAqICAgICBvZiBgYmAgKG9yZGVyLWluc2Vuc2l0aXZlIOKAlCBhIFNldCBoYXMgbm8gb3JkZXIgdG8gY29tcGFyZSBieSlcbiAqICAgLSBhIHR5cGVkIHZhbHVlIGFnYWluc3QgYSBwbGFpbiB2YWx1ZSwgb3IgdHdvIGRpZmZlcmVudCB0eXBlZCBraW5kcyDihpIgbm90XG4gKiAgICAgZXF1YWwgKGEgYERhdGVgIGlzIG5ldmVyIGB7fWApXG4gKiAgIC0gYXJyYXlzOiBlcXVhbCBsZW5ndGggQU5EIGRlZXAtZXF1YWwgZWxlbWVudC13aXNlIChvcmRlci1zZW5zaXRpdmUpXG4gKiAgIC0gb2JqZWN0czogaWRlbnRpY2FsIHNldCBvZiBrZXlzIHRoYXQgSE9MRCBhIHZhbHVlIEFORCBkZWVwLWVxdWFsIHBlciBrZXkuXG4gKiAgICAgQW4gb3duIGtleSB3aG9zZSB2YWx1ZSBpcyBgdW5kZWZpbmVkYCBjb3VudHMgYXMgQUJTRU5UOiBpdCBpcyB0aGlzXG4gKiAgICAgbGlicmFyeSdzIG90aGVyIHNwZWxsaW5nIG9mIGEgZGVsZXRlZCBrZXkgKGAnZnVsbCdgIG1vZGUgZmxhdHRlbnNcbiAqICAgICBgZGVsZXRlYCBpbnRvIGBrZXk6IHVuZGVmaW5lZGA7IGAnZGVsdGEnYCBtb2RlJ3MgYGRlbGV0ZWAgdmVyYiByZW1vdmVzXG4gKiAgICAgdGhlIGtleSksIGFuZCBldmVyeSBjb25zdW1lciDigJQgSlNPTiwgdGhlIGZvbGQsIGBjb21taXRWYWx1ZUF0YCwgdGhlXG4gKiAgICAgbWlycm9yIOKAlCByZWFkcyB0aGUgdHdvIHNwZWxsaW5ncyBhcyBvbmUgc3RhdGUuIFNvIG11c3QgdGhlIG5ldC1jaGFuZ2VcbiAqICAgICBmaWx0ZXIgKDkuMTkuMSk6IGB7fWAgYW5kIGB7IGs6IHVuZGVmaW5lZCB9YCBhcmUgbm90IGEgY2hhbmdlLiBBcnJheXNcbiAqICAgICBhcmUgdW50b3VjaGVkIOKAlCBhIHNsb3QgaG9sZGluZyBgdW5kZWZpbmVkYCBpcyBzdGlsbCBhIHNsb3QuXG4gKiAgIC0gbWlzbWF0Y2hlZCBraW5kcyAoYXJyYXkgdnMgb2JqZWN0LCBvYmplY3QgdnMgbnVsbCkg4oaSIG5vdCBlcXVhbFxuICpcbiAqIENvc3QgJiBzYWZldHk6XG4gKiAgIC0gQWxsb2NhdGVzIE5PVEhJTkcgYnV0IHRyYW5zaWVudCBgT2JqZWN0LmtleXNgIGFycmF5cyDigJQgbm8gY2xvbmVzLiBJdCBpc1xuICogICAgIHN0cmljdGx5IGNoZWFwZXIgdGhhbiB0aGUgYHN0cnVjdHVyZWRDbG9uZWAgdGhlIGNvbW1pdCBhbHJlYWR5IHBlcmZvcm1zLlxuICogICAtIFByaW1pdGl2ZSBjb21wYXJpc29ucyAodGhlIGJ1bGsgb2Ygc3RhdGUpIGFyZSBPKDEpIHZpYSB0aGUgYD09PWAgL1xuICogICAgIGBPYmplY3QuaXNgIGZhc3QgcGF0aHM7IG9ubHkgbmVzdGVkIG9iamVjdHMvYXJyYXlzIGluY3VyIGEgd2FsaywgYm91bmRlZFxuICogICAgIGJ5IHRoZSB2YWx1ZSdzIG93biBzaXplLlxuICogICAtIFRlcm1pbmF0ZXMgb24gQ1lDTElDIHZhbHVlcyAoOS4xOC4xKTogYSBzdGF0ZSB2YWx1ZSBtdXN0IHN1cnZpdmVcbiAqICAgICBgc3RydWN0dXJlZENsb25lYCwgYW5kIGBzdHJ1Y3R1cmVkQ2xvbmVgIHByZXNlcnZlcyBjeWNsZXMg4oCUIHNvIGFcbiAqICAgICBzZWxmLXJlZmVyZW5jaW5nIHZhbHVlIGlzIGEgbGVnYWwgdmFsdWUsIG5vdCBhbiBvdXQtb2YtY29udHJhY3Qgb25lLiBBXG4gKiAgICAgcGFpciBvZiBvYmplY3RzIGFscmVhZHkgdW5kZXIgY29tcGFyaXNvbiBpcyB0cmVhdGVkIGFzIGVxdWFsICh0aGVcbiAqICAgICBzdHJ1Y3R1cmFsIGFuc3dlciwgbG9kYXNoIGBpc0VxdWFsYCBzZW1hbnRpY3MpOyBhY3ljbGljIGlucHV0cyBzZWUgbm9cbiAqICAgICBjaGFuZ2UuIERldiBtb2RlIHN0aWxsIHdhcm5zIGFib3V0IGN5Y2xlcyBhdCB3cml0ZSB0aW1lXG4gKiAgICAgKGBTY29wZUZhY2FkZS5zZXRWYWx1ZWApIGJlY2F1c2UgdGhleSBzdXJwcmlzZSBuYXJyYXRpdmUgYW5kIEpTT04uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWwoYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVxdWFsUGFpcnMoYSwgYiwgdW5kZWZpbmVkKTtcbn1cblxuLyoqXG4gKiBPYmplY3QgcGFpcnMgbWV0IHNvIGZhciwga2V5ZWQgYGEg4oaSIHRoZSBiJ3MgaXQgaGFzIGJlZW4gcGFpcmVkIHdpdGhgLiBDcmVhdGVkXG4gKiBsYXppbHkgYnkgdGhlIGZpcnN0IG9iamVjdCBwYWlyLCBzbyBwcmltaXRpdmUgY29tcGFyZXMgYWxsb2NhdGUgbm90aGluZy5cbiAqIE5ldmVyIHBydW5lZDogZXZlcnkgYGZhbHNlYCByZXR1cm5zIHN0cmFpZ2h0IHVwIHRvIHRoZSBjYWxsZXIgKGVhY2ggcmVjdXJzaXZlXG4gKiBjYWxsIHNob3J0LWNpcmN1aXRzIG9uIGl0KSwgc28gbm90aGluZyBpcyBsb29rZWQgdXAgYWZ0ZXIgYSBtaXNtYXRjaCDigJQgYVxuICogc3RvcmVkIHBhaXIgaXMgZWl0aGVyIHN0aWxsIHVuZGVyIGNvbXBhcmlzb24gb3IgYWxyZWFkeSBrbm93biBlcXVhbC5cbiAqL1xudHlwZSBTZWVuUGFpcnMgPSBXZWFrTWFwPG9iamVjdCwgV2Vha1NldDxvYmplY3Q+PjtcblxuZnVuY3Rpb24gZXF1YWxQYWlycyhhOiBhbnksIGI6IGFueSwgc2VlbjogU2VlblBhaXJzIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTsgLy8gc2FtZSByZWZlcmVuY2Ugb3IgaWRlbnRpY2FsIHByaW1pdGl2ZVxuICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSByZXR1cm4gZmFsc2U7XG4gIGlmIChhID09PSBudWxsIHx8IGIgPT09IG51bGwpIHJldHVybiBhID09PSBiOyAvLyBvbmUgaXMgbnVsbCwgdGhlIG90aGVyIGlzbid0XG4gIGlmICh0eXBlb2YgYSAhPT0gJ29iamVjdCcpIHJldHVybiBPYmplY3QuaXMoYSwgYik7IC8vIE5hTi1zYWZlIHByaW1pdGl2ZSBjb21wYXJlXG5cbiAgLy8gVHlwZWQgYXJtcyBmaXJzdCDigJQgYSBEYXRlL01hcC9TZXQgaGFzIG5vIG93biBlbnVtZXJhYmxlIGtleXMsIHNvIHRoZVxuICAvLyBwbGFpbi1vYmplY3Qgd2FsayBiZWxvdyB3b3VsZCBjYWxsIGFueSB0d28gb2YgdGhlbSBlcXVhbC5cbiAgY29uc3QgYUtpbmQgPSB0eXBlZEtpbmQoYSk7XG4gIGlmIChhS2luZCAhPT0gdHlwZWRLaW5kKGIpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChhS2luZCA9PT0gJ2RhdGUnKSByZXR1cm4gT2JqZWN0LmlzKGEuZ2V0VGltZSgpLCBiLmdldFRpbWUoKSk7XG5cbiAgY29uc3QgYUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGEpO1xuICBpZiAoYUlzQXJyYXkgIT09IEFycmF5LmlzQXJyYXkoYikpIHJldHVybiBmYWxzZTsgLy8gYXJyYXkgdnMgcGxhaW4gb2JqZWN0XG5cbiAgLy8gQ3ljbGUgZ3VhcmQg4oCUIGEgcGFpciB3ZSBhcmUgYWxyZWFkeSBpbnNpZGUgaXMgZXF1YWwgYnkgYXNzdW1wdGlvbi5cbiAgc2VlbiA/Pz0gbmV3IFdlYWtNYXAoKTtcbiAgbGV0IHBhcnRuZXJzID0gc2Vlbi5nZXQoYSk7XG4gIGlmIChwYXJ0bmVycz8uaGFzKGIpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFwYXJ0bmVycykgc2Vlbi5zZXQoYSwgKHBhcnRuZXJzID0gbmV3IFdlYWtTZXQoKSkpO1xuICBwYXJ0bmVycy5hZGQoYik7XG5cbiAgaWYgKGFLaW5kID09PSAnbWFwJykgcmV0dXJuIGVxdWFsTWFwcyhhLCBiLCBzZWVuKTtcbiAgaWYgKGFLaW5kID09PSAnc2V0JykgcmV0dXJuIGVxdWFsU2V0cyhhLCBiLCBzZWVuKTtcblxuICBpZiAoYUlzQXJyYXkpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWVxdWFsUGFpcnMoYVtpXSwgYltpXSwgc2VlbikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBPYmplY3RzOiBvbmx5IGtleXMgdGhhdCBIT0xEIGEgdmFsdWUgdGFrZSBwYXJ0IOKAlCBhbiBvd24gYHVuZGVmaW5lZGAgaXMgYVxuICAvLyBkZWxldGVkIGtleSwgdGhlIHNhbWUgc3RhdGUgYXMgYW4gYWJzZW50IG9uZSAoc2VlIHRoZSBjb250cmFjdCBhYm92ZSkuXG4gIGxldCBhSGVsZCA9IDA7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGEpKSB7XG4gICAgaWYgKGFba2V5XSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBhSGVsZCsrO1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIGtleSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWVxdWFsUGFpcnMoYVtrZXldLCBiW2tleV0sIHNlZW4pKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGJIZWxkID0gMDtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoYikpIGlmIChiW2tleV0gIT09IHVuZGVmaW5lZCkgYkhlbGQrKztcbiAgcmV0dXJuIGFIZWxkID09PSBiSGVsZDtcbn1cblxuLyoqIFRoZSB0eXBlZCBzdGF0ZSB2YWx1ZXMgYHN0cnVjdHVyZWRDbG9uZWAga2VlcHMgYW5kIGEga2V5IHdhbGsgY2Fubm90IHNlZS4gKi9cbmZ1bmN0aW9uIHR5cGVkS2luZCh2YWx1ZTogb2JqZWN0KTogJ2RhdGUnIHwgJ21hcCcgfCAnc2V0JyB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiAnZGF0ZSc7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCkgcmV0dXJuICdtYXAnO1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHJldHVybiAnc2V0JztcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXF1YWxNYXBzKGE6IE1hcDx1bmtub3duLCB1bmtub3duPiwgYjogTWFwPHVua25vd24sIHVua25vd24+LCBzZWVuOiBTZWVuUGFpcnMpOiBib29sZWFuIHtcbiAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGEpIHtcbiAgICBpZiAoIWIuaGFzKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWVxdWFsUGFpcnModmFsdWUsIGIuZ2V0KGtleSksIHNlZW4pKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogT3JkZXItaW5zZW5zaXRpdmUsIGRlZXAgcGVyIG1lbWJlci4gUXVhZHJhdGljIGluIHRoZSB3b3JzdCBjYXNlIGZvciBzZXRzIG9mXG4gKiBvYmplY3RzIOKAlCBhIHNldCBvZiBwcmltaXRpdmVzICh0aGUgY29tbW9uIHNoYXBlKSBpcyBvbmUgYGhhc2AgcGVyIG1lbWJlci5cbiAqL1xuZnVuY3Rpb24gZXF1YWxTZXRzKGE6IFNldDx1bmtub3duPiwgYjogU2V0PHVua25vd24+LCBzZWVuOiBTZWVuUGFpcnMpOiBib29sZWFuIHtcbiAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHVubWF0Y2hlZCA9IFsuLi5iXTtcbiAgZm9yIChjb25zdCBtZW1iZXIgb2YgYSkge1xuICAgIC8vIFNhbWVWYWx1ZVplcm8gZmlyc3Qg4oCUIHByaW1pdGl2ZXMgYW5kIHNoYXJlZCByZWZlcmVuY2VzLCBvbmUgYGhhc2AuXG4gICAgLy8gRWFjaCBtYXRjaCByZXRpcmVzIGl0cyBzbG90IHNvIHR3byBzdHJ1Y3R1cmFsbHktZXF1YWwgbWVtYmVycyBvZiBgYWBcbiAgICAvLyBjYW5ub3QgYm90aCBjbGFpbSB0aGUgc2FtZSBtZW1iZXIgb2YgYGJgLlxuICAgIGNvbnN0IGF0ID0gdW5tYXRjaGVkLmluZGV4T2YobWVtYmVyKTtcbiAgICBjb25zdCBmb3VuZCA9IGF0ID49IDAgPyBhdCA6IHVubWF0Y2hlZC5maW5kSW5kZXgoKGNhbmRpZGF0ZSkgPT4gZXF1YWxQYWlycyhtZW1iZXIsIGNhbmRpZGF0ZSwgc2VlbikpO1xuICAgIGlmIChmb3VuZCA8IDApIHJldHVybiBmYWxzZTtcbiAgICB1bm1hdGNoZWQuc3BsaWNlKGZvdW5kLCAxKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBEZWVwIHVuaW9uIG1lcmdlIGhlbHBlci5cbiAqIC0gQXJyYXlzIChub24tZW1wdHkpOiB1bmlvbiB3aXRob3V0IGR1cGxpY2F0ZXMgKGVuY291bnRlciBvcmRlciBwcmVzZXJ2ZWQpXG4gKiAtIEFycmF5cyAoZW1wdHkpOiAgICAgcmVwbGFjZSDigJQgc3JjIGBbXWAgY2xlYXJzIHRoZSBkZXN0aW5hdGlvbiBhcnJheS5cbiAqICAgUmF0aW9uYWxlOiB3cml0aW5nIGBzY29wZS50YWdzID0gW11gIG1lYW5zIFwiY2xlYXIgdGFnc1wiLCBub3QgXCJhcHBlbmQgbm90aGluZ1wiLlxuICogICBXaXRob3V0IHRoaXMgcnVsZSwgYW4gZW1wdHktYXJyYXkgd3JpdGUgc2lsZW50bHkgYmVjb21lcyBhIG5vLW9wIHdoaWNoIGlzXG4gKiAgIGltcG9zc2libGUgdG8gZGlzdGluZ3Vpc2ggZnJvbSBhIGJ1Zy5cbiAqIC0gT2JqZWN0czogcmVjdXJzaXZlIG1lcmdlXG4gKiAtIFByaW1pdGl2ZXM6IHNvdXJjZSB3aW5zXG4gKlxuICogVGVybWluYXRlcyBvbiBhIENZQ0xJQyBgc3JjYCAoOS4xOC4xLCBzYW1lIGxhdyBhcyB7QGxpbmsgZGVlcEVxdWFsfTogYVxuICogc3RhdGUgdmFsdWUgc3Vydml2ZXMgYHN0cnVjdHVyZWRDbG9uZWAsIHdoaWNoIHByZXNlcnZlcyBjeWNsZXMpLiBBIGBzcmNgXG4gKiBvYmplY3QgcmUtZW50ZXJlZCB3aGlsZSBpdCBpcyBzdGlsbCBiZWluZyBtZXJnZWQgaGlnaGVyIHVwIHRoZSBzdGFjayBoYW5kc1xuICogYmFjayB0aGUgb3V0cHV0IGJlaW5nIGJ1aWx0IGZvciBpdCwgc28gdGhlIG1lcmdlZCB2YWx1ZSBtaXJyb3JzIHRoZSBjeWNsZVxuICogaW5zdGVhZCBvZiB1bnJvbGxpbmcgaXQgZm9yZXZlci4gT25seSB0aGUgYW5jZXN0b3JzIG9uIHRoZSBzdGFjayBhcmVcbiAqIGd1YXJkZWQg4oCUIGEgc2hhcmVkIChhY3ljbGljKSBgc3JjYCByZWZlcmVuY2UgbWV0IGFnYWluIGF0IGEgZGlmZmVyZW50XG4gKiBgZHN0YCBtZXJnZXMgYWdhaW5zdCBUSEFUIGBkc3RgLCBleGFjdGx5IGFzIGJlZm9yZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBTbWFydE1lcmdlKGRzdDogYW55LCBzcmM6IGFueSk6IGFueSB7XG4gIHJldHVybiBtZXJnZUd1YXJkZWQoZHN0LCBzcmMsIHVuZGVmaW5lZCk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlR3VhcmRlZChkc3Q6IGFueSwgc3JjOiBhbnksIGluRmxpZ2h0OiBXZWFrTWFwPG9iamVjdCwgYW55PiB8IHVuZGVmaW5lZCk6IGFueSB7XG4gIGlmIChzcmMgPT09IG51bGwgfHwgdHlwZW9mIHNyYyAhPT0gJ29iamVjdCcpIHJldHVybiBzcmM7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc3JjKSkge1xuICAgIGlmIChzcmMubGVuZ3RoID09PSAwKSByZXR1cm4gW107IC8vIGVtcHR5IHNyYyA9IGNsZWFyLCBub3Qgbm8tb3BcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkc3QpKSByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLmRzdCwgLi4uc3JjXSldO1xuICAgIHJldHVybiBbLi4uc3JjXTtcbiAgfVxuXG4gIGlmIChpbkZsaWdodD8uaGFzKHNyYykpIHJldHVybiBpbkZsaWdodC5nZXQoc3JjKTsgLy8gY3ljbGUg4oCUIHJlLWVudGVyIHRoZSB2YWx1ZSBiZWluZyBidWlsdFxuXG4gIGNvbnN0IG91dDogYW55ID0geyAuLi4oZHN0ICYmIHR5cGVvZiBkc3QgPT09ICdvYmplY3QnID8gZHN0IDoge30pIH07XG4gIChpbkZsaWdodCA/Pz0gbmV3IFdlYWtNYXAoKSkuc2V0KHNyYywgb3V0KTtcbiAgLy8gT2JqZWN0LmtleXMoKSBpcyBvd24tZW51bWVyYWJsZS1vbmx5IGJ5IHNwZWMg4oCUIG5vIERFTklFRCBjaGVjayBuZWVkZWQgaGVyZS5cbiAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHNyYykpIHtcbiAgICBvdXRba10gPSBtZXJnZUd1YXJkZWQob3V0W2tdLCBzcmNba10sIGluRmxpZ2h0KTtcbiAgfVxuICBpbkZsaWdodC5kZWxldGUoc3JjKTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBJcyByb3cgYGlgIGEgYHNldGAgdGhhdCB0aGUgTkVYVCByb3cgc2V0cyBhZ2FpbiDigJQgc2FtZSBwYXRoLCBzYW1lIHZlcmIg4oCUIHNvXG4gKiB0aGF0IGFwcGx5aW5nIGl0IGlzIHdvcmsgdGhlIG5leHQgcm93IHJlZG9lcz9cbiAqXG4gKiBUaGUgb25lIHNraXAgZXZlcnkgcmVwbGF5IGl0ZXJhdG9yIHNoYXJlcyAoOS4yMi4xKS4gQSBgc2V0YCByb3cgd3JpdGVzIGFcbiAqIGNsb25lIG9mIHRoZSByZWNvcmRlZCB2YWx1ZSBhdCBpdHMgcGF0aDsgdGhlIG5leHQgcm93LCBhIGBzZXRgIG9mIHRoZSBzYW1lXG4gKiBwYXRoLCB3cml0ZXMgYSBjbG9uZSBvZiB0aGUgU0FNRSByZWNvcmRlZCB2YWx1ZSBvdmVyIGl0ICh0aGUgYnVuZGxlJ3MgcGF0Y2hcbiAqIHRyZWUgaXMgZml4ZWQpLCBhbmQgbm90aGluZyBydW5zIGluIGJldHdlZW4g4oCUIHNvIHRoZSBmaXJzdCB3cml0ZSBpc1xuICogdW5vYnNlcnZhYmxlLCBjb250YWluZXIgY3JlYXRpb24gYW5kIGtleSBvcmRlciBpbmNsdWRlZC4gT25seSBDT05TRUNVVElWRVxuICogcm93cyBxdWFsaWZ5OiBhIHJvdyBpbiBiZXR3ZWVuIChhbiBhbmNlc3RvciBgbWVyZ2VgLCBhIHNpYmxpbmcgYHNldGAgdGhhdFxuICogY3JlYXRlcyBhIGNvbnRhaW5lcikgY2FuIHNlZSB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlLCBhbmQgYSBgbWVyZ2VgLFxuICogYGFwcGVuZGAgb3IgYGRlbGV0ZWAgbmV4dCByb3cgZGVwZW5kcyBvbiB3aGF0IGlzIHRoZXJlLiBSb3dzIGFyZSBuZXZlclxuICogZHJvcHBlZCBmcm9tIHRoZSBsb2cg4oCUIHRoZSA5LjIyLjAgZWxlbWVudC13cml0ZSBmdW5uZWwgcmVjb3JkcyBOXG4gKiB3aG9sZS1hcnJheSBgc2V0YCByb3dzIG9uIG9uZSBwYXRoLCBhbmQgdGhpcyBpcyB3aGF0IG1ha2VzIHJlcGxheWluZyB0aGVtXG4gKiBPKE4pIGluc3RlYWQgb2YgTyhOIMOXIHJvd3MpLlxuICpcbiAqIFNoYXJlZCBieSB7QGxpbmsgYXBwbHlTbWFydE1lcmdlfSAobGl2ZSBzdGF0ZSwgYEV2ZW50TG9nLm1hdGVyaWFsaXNlYCxcbiAqIGBzdGF0ZUF0YCwgdGhlIHJlZGFjdGVkIG1pcnJvcikgYW5kIGBUcmFuc2FjdGlvbkJ1ZmZlci5yZXBsYXlGYW1pbHlWZXJic2BcbiAqICh0aGUgZGVsdGEgZW5jb2RlcidzIHBlci1mYW1pbHkgZm9sZCkg4oCUIHRoZSB0d28gbG9vcHMgdGhhdCBjbG9uZSBwZXIgcm93LlxuICogYGNvbW1pdFZhbHVlQXRgIG5lZWRzIG5vIHNraXA6IGl0IGFuY2hvcnMgYXQgdGhlIExBU1QgYHNldGAgYnkgY29uc3RydWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwZXJzZWRlZEJ5TmV4dFNldChyb3dzOiByZWFkb25seSB7IHBhdGg6IHN0cmluZzsgdmVyYjogc3RyaW5nIH1bXSwgaTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJvdyA9IHJvd3NbaV07XG4gIGlmIChyb3cudmVyYiAhPT0gJ3NldCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbmV4dCA9IHJvd3NbaSArIDFdO1xuICByZXR1cm4gbmV4dCAhPT0gdW5kZWZpbmVkICYmIG5leHQudmVyYiA9PT0gJ3NldCcgJiYgbmV4dC5wYXRoID09PSByb3cucGF0aDtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgY29tbWl0IGJ1bmRsZSB0byBhIGJhc2Ugc3RhdGUgYnkgcmVwbGF5aW5nIG9wZXJhdGlvbnMgaW4gb3JkZXIuXG4gKiBHdWFyYW50ZWVzIFwibGFzdCB3cml0ZXIgd2luc1wiIHNlbWFudGljcy5cbiAqXG4gKiBUaGUgc2luZ2xlIHJlcGxheSBwcmltaXRpdmUg4oCUIHRocmVlIGNvbnN1bWVycyBpbmhlcml0IGV2ZXJ5IHZlcmIgZnJvbSBpdDpcbiAqIGxpdmUgc3RhdGUgKGBTaGFyZWRNZW1vcnkuYXBwbHlQYXRjaGApLCB0aW1lIHRyYXZlbFxuICogKGBFdmVudExvZy5tYXRlcmlhbGlzZWApLCBhbmQgdGhlIHJlZGFjdGVkIG1pcnJvclxuICogKGBTdGFnZUNvbnRleHQuY29tbWl0YCdzIHNlY29uZCBgYXBwbHlQYXRjaGApLlxuICpcbiAqIFZlcmIgYXJtczpcbiAqICAgLSBgJ3NldCdgICAgIOKAlCBvdmVyd3JpdGUgd2l0aCBgb3ZlcndyaXRlW3BhdGhdYCAodGhlIGZ1bGwgZmluYWwgdmFsdWUpLlxuICogICAtIGAnbWVyZ2UnYCAg4oCUIGBkZWVwU21hcnRNZXJnZWAgdGhlIGFjY3VtdWxhdGVkIGB1cGRhdGVzW3BhdGhdYCBkZWx0YSBpbi5cbiAqICAgLSBgJ2FwcGVuZCdgIOKAlCAoIzEzYy1CIGRlbHRhIG1vZGUpIGBvdmVyd3JpdGVbcGF0aF1gIGhvbGRzIE9OTFkgdGhlIHRhaWw7XG4gKiAgICAgcmVjb25zdHJ1Y3QgYnkgY29uY2F0ZW5hdGluZyBpdCBvbnRvIHRoZSBjdXJyZW50IGFycmF5LiBXaGVuIHRoZVxuICogICAgIGN1cnJlbnQgdmFsdWUgb3IgdGhlIHJlY29yZGVkIHRhaWwgaXMgbm90IGFuIGFycmF5IChvdXQtb2Ytb3JkZXJcbiAqICAgICByZXBsYXkgYmFzZSwgb3IgYSBSRURBQ1RFRCB0YWlsIOKAlCBgcmVkYWN0UGF0Y2hgIHJlcGxhY2VzIG1hdGNoZWRcbiAqICAgICBwYXlsb2FkcyB3aXRoIHRoZSBgJ1JFREFDVEVEJ2Agc3RyaW5nKSwgZGVncmFkZSB0byBhIGRpcmVjdCBzZXQgb2YgdGhlXG4gKiAgICAgcmVjb3JkZWQgdmFsdWUg4oCUIHRoZSBzYW1lIHRlcm1pbmFsIHZhbHVlIGEgcmVkYWN0ZWQvY29ycnVwdCBgJ3NldCdgXG4gKiAgICAgcHJvZHVjZXMuXG4gKiAgIC0gYCdkZWxldGUnYCDigJQgKCMxM2MtQiBkZWx0YSBtb2RlKSByZW1vdmUgdGhlIGtleSAoYG5hdGl2ZURlbGV0ZWAsXG4gKiAgICAgcHJvdG90eXBlLXBvbGx1dGlvbi1zYWZlKS4gVGhlIHBhdGggc3RheXMgZW51bWVyYXRlZCBpbiBgb3ZlcndyaXRlYFxuICogICAgICh2YWx1ZSBgdW5kZWZpbmVkYCkgZm9yIGtleS1zZXQgY29uc3VtZXJzOyByZXBsYXkgaWdub3JlcyB0aGF0IHZhbHVlLlxuICpcbiAqIFdvcmssIG5vdCBieXRlcyAoOS4yMi4xKTogYSBgc2V0YCByb3cgdGhlIE5FWFQgcm93IHJlLXNldHMgaXMgc2tpcHBlZFxuICogKHtAbGluayBzdXBlcnNlZGVkQnlOZXh0U2V0fSkg4oCUIHRoZSByb3dzIHN0YXkgaW4gdGhlIGxvZywgb25seSB0aGUgY2xvbmVcbiAqIGVhY2ggd291bGQgaGF2ZSBwYWlkIGlzIG5vdC4gRXZlcnkgY29uc3VtZXIgYWJvdmUgaW5oZXJpdHMgdGhlIHNraXAgZnJvbVxuICogaGVyZTsgdGhlcmUgaXMgbm8gc2Vjb25kIHJlcGxheSBsb29wIHRvIGtlZXAgaW4gc3RlcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U21hcnRNZXJnZShiYXNlOiBhbnksIHVwZGF0ZXM6IE1lbW9yeVBhdGNoLCBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLCB0cmFjZTogVHJhY2VFbnRyeVtdKTogYW55IHtcbiAgcmV0dXJuIGFwcGx5U21hcnRNZXJnZUludG8oc3RydWN0dXJlZENsb25lKGJhc2UpLCB1cGRhdGVzLCBvdmVyd3JpdGUsIHRyYWNlKTtcbn1cblxuLyoqXG4gKiBUaGUgc2FtZSByZXBsYXksIElOVE8gYHRhcmdldGAg4oCUIHRoZSBvbmUgdmVyYiBzd2l0Y2gsIG5vIGNsb25lIG9mIGl0cyBvd24uXG4gKiBGb3IgYSBjYWxsZXIgdGhhdCBhbHJlYWR5IGhvbGRzIGEgcHJpdmF0ZSB3b3JraW5nIGNvcHkgKHRoZSByZWFkLXNpZGUgZm9sZFxuICogaW4gYHRpbWUtdHJhdmVsL3N0YXRlQXQudHNgLCB3aGljaCBjbG9uZXMgaXRzIGJhc2UgT05DRSBhbmQgdGhlbiBhcHBsaWVzXG4gKiBldmVyeSBidW5kbGUgaGVyZSksIHNvIGEgZm9sZCBvdmVyIE4gYnVuZGxlcyBjb3N0cyBOIHJvdyBhcHBsaWNhdGlvbnMsIG5vdFxuICogTiBjbG9uZXMgb2YgdGhlIHdob2xlIHN0YXRlLiBOZXZlciBoYW5kIGl0IGNvbW1pdHRlZCBzdGF0ZTogaXQgbXV0YXRlcy5cbiAqIFRoZSB2YWx1ZXMgaXQgd3JpdGVzIGFyZSBpdHMgb3duIChgc2V0YC9gYXBwZW5kYCBjbG9uZSB0aGUgcmVjb3JkZWQgdmFsdWU7XG4gKiBgbWVyZ2VgIGJ1aWxkcyBuZXcgY29udGFpbmVycyksIHNvIGB0YXJnZXRgIG5ldmVyIGFsaWFzZXMgdGhlIGxvZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U21hcnRNZXJnZUludG8oXG4gIHRhcmdldDogYW55LFxuICB1cGRhdGVzOiBNZW1vcnlQYXRjaCxcbiAgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaCxcbiAgdHJhY2U6IFRyYWNlRW50cnlbXSxcbik6IGFueSB7XG4gIGNvbnN0IG91dCA9IHRhcmdldDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFjZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdXBlcnNlZGVkQnlOZXh0U2V0KHRyYWNlLCBpKSkgY29udGludWU7XG4gICAgY29uc3QgeyBwYXRoLCB2ZXJiIH0gPSB0cmFjZVtpXTtcbiAgICBjb25zdCBzZWdzID0gcGF0aC5zcGxpdChERUxJTSk7XG4gICAgaWYgKHZlcmIgPT09ICdzZXQnKSB7XG4gICAgICBfc2V0KG91dCwgc2Vncywgc3RydWN0dXJlZENsb25lKF9nZXQob3ZlcndyaXRlLCBzZWdzKSkpO1xuICAgIH0gZWxzZSBpZiAodmVyYiA9PT0gJ2FwcGVuZCcpIHtcbiAgICAgIGNvbnN0IHRhaWwgPSBzdHJ1Y3R1cmVkQ2xvbmUoX2dldChvdmVyd3JpdGUsIHNlZ3MpKTtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBfZ2V0KG91dCwgc2Vncyk7XG4gICAgICBfc2V0KG91dCwgc2VncywgQXJyYXkuaXNBcnJheShjdXJyZW50KSAmJiBBcnJheS5pc0FycmF5KHRhaWwpID8gWy4uLmN1cnJlbnQsIC4uLnRhaWxdIDogdGFpbCk7XG4gICAgfSBlbHNlIGlmICh2ZXJiID09PSAnZGVsZXRlJykge1xuICAgICAgbmF0aXZlRGVsZXRlKG91dCwgc2Vncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBfZ2V0KG91dCwgc2VncykgPz8ge307XG4gICAgICBfc2V0KG91dCwgc2VncywgZGVlcFNtYXJ0TWVyZ2UoY3VycmVudCwgX2dldCh1cGRhdGVzLCBzZWdzKSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIl19
@@ -35,6 +35,32 @@ export declare function readSource(source: FoldSource | undefined): ReadSource;
35
35
  * With a single leg this is the 9.17.0 fold, unchanged.
36
36
  */
37
37
  export declare function foldLegs(legs: readonly ReadSource[], legIdx: number, through: number): FoldedState;
38
+ /**
39
+ * What a fold leaves behind for the NEXT one (9.25.0): the private working
40
+ * copy and the facts accumulated so far. A cursor stepping forward on the
41
+ * same leg hands it back and only the bundles after `through` are applied —
42
+ * one bundle per step instead of a replay from the base. Any other ask (an
43
+ * earlier stop, another leg) folds from scratch; the memo is never a claim.
44
+ */
45
+ export interface FoldMemo {
46
+ readonly legIdx: number;
47
+ readonly through: number;
48
+ readonly out: Record<string, unknown>;
49
+ readonly based: boolean;
50
+ readonly redactedPaths: ReadonlySet<string>;
51
+ readonly skipped: readonly LogGap[] | undefined;
52
+ }
53
+ /**
54
+ * The fold, resumable. ONE clone per fold: the base is cloned once (or `{}`
55
+ * stands in), every bundle is applied INTO that copy, and the state handed
56
+ * out is one more clone, frozen — so the working copy stays private and a
57
+ * later step can continue from it. Same answer as the 9.17.0 fold, pinned by
58
+ * test/lib/time-travel/fold-memo.test.ts against a fresh fold at every stop.
59
+ */
60
+ export declare function foldLegsFrom(legs: readonly ReadSource[], legIdx: number, through: number, memo?: FoldMemo): {
61
+ readonly folded: FoldedState;
62
+ readonly memo: FoldMemo;
63
+ };
38
64
  /**
39
65
  * Fold `source`'s log from its base up to and including `commitIdx`.
40
66
  *
@@ -7,7 +7,7 @@
7
7
  * runs through `applySmartMerge`, the one verb switch the live commit itself
8
8
  * uses. There is deliberately no second implementation of the verbs here.
9
9
  */
10
- import { applySmartMerge } from '../memory/utils.js';
10
+ import { applySmartMergeInto } from '../memory/utils.js';
11
11
  import { readLog } from './bundles.js';
12
12
  /** Deeply freeze a POJO tree so a fold result cannot be mutated by its holder. */
13
13
  function freezeDeep(value) {
@@ -53,49 +53,65 @@ export function readSource(source) {
53
53
  * With a single leg this is the 9.17.0 fold, unchanged.
54
54
  */
55
55
  export function foldLegs(legs, legIdx, through) {
56
- let based = false;
57
- let out = {};
58
- const redactedPaths = new Set();
59
- let skipped;
60
- let lastThrough = -1;
61
- for (let leg = 0; leg <= legIdx && leg < legs.length; leg++) {
62
- const { log, gaps, base } = legs[leg];
63
- if (base && typeof base === 'object') {
64
- out = structuredClone(base);
65
- based = true;
66
- }
67
- const end = leg === legIdx ? Math.min(through, log.length - 1) : log.length - 1;
68
- if (leg === legIdx)
69
- lastThrough = end < -1 ? -1 : end;
70
- for (const gap of gaps) {
71
- if (gap.index <= end)
72
- (skipped ??= []).push(gap);
73
- }
74
- for (let i = 0; i <= end; i++) {
75
- const bundle = log[i];
76
- if (!bundle)
77
- continue;
78
- for (const path of bundle.redactedPaths ?? [])
79
- redactedPaths.add(path);
80
- out = applySmartMerge(out, bundle.updates, bundle.overwrite, bundle.trace);
56
+ return foldLegsFrom(legs, legIdx, through).folded;
57
+ }
58
+ /** Apply `log[from + 1 .. end]` of one leg into `out`, collecting the leg's facts. */
59
+ function applyLeg(out, leg, from, end, redactedPaths, skipped) {
60
+ for (const gap of leg.gaps) {
61
+ if (gap.index > from && gap.index <= end)
62
+ (skipped ??= []).push(gap);
63
+ }
64
+ for (let i = from + 1; i <= end; i++) {
65
+ const bundle = leg.log[i];
66
+ if (!bundle)
67
+ continue;
68
+ for (const path of bundle.redactedPaths ?? [])
69
+ redactedPaths.add(path);
70
+ applySmartMergeInto(out, bundle.updates, bundle.overwrite, bundle.trace);
71
+ }
72
+ return skipped;
73
+ }
74
+ /**
75
+ * The fold, resumable. ONE clone per fold: the base is cloned once (or `{}`
76
+ * stands in), every bundle is applied INTO that copy, and the state handed
77
+ * out is one more clone, frozen — so the working copy stays private and a
78
+ * later step can continue from it. Same answer as the 9.17.0 fold, pinned by
79
+ * test/lib/time-travel/fold-memo.test.ts against a fresh fold at every stop.
80
+ */
81
+ export function foldLegsFrom(legs, legIdx, through, memo) {
82
+ const last = legs[legIdx];
83
+ const endOnLeg = last ? Math.min(through, last.log.length - 1) : -1;
84
+ const lastThrough = endOnLeg < -1 ? -1 : endOnLeg;
85
+ const resumable = memo !== undefined && memo.legIdx === legIdx && lastThrough >= memo.through;
86
+ let based = resumable ? memo.based : false;
87
+ let out = resumable ? memo.out : {};
88
+ const redactedPaths = new Set(resumable ? memo.redactedPaths : []);
89
+ let skipped = resumable && memo.skipped ? [...memo.skipped] : undefined;
90
+ if (resumable) {
91
+ if (last)
92
+ skipped = applyLeg(out, last, memo.through, lastThrough, redactedPaths, skipped);
93
+ }
94
+ else {
95
+ for (let leg = 0; leg <= legIdx && leg < legs.length; leg++) {
96
+ const source = legs[leg];
97
+ if (source.base && typeof source.base === 'object') {
98
+ out = structuredClone(source.base);
99
+ based = true;
100
+ }
101
+ const end = leg === legIdx ? lastThrough : source.log.length - 1;
102
+ skipped = applyLeg(out, source, -1, end, redactedPaths, skipped);
81
103
  }
82
104
  }
83
105
  const basis = based ? 'initial+log' : 'log-only';
84
- return {
85
- // Law 3, both halves. `applySmartMerge` clones what it OVERWRITES, but the
86
- // merge arm's array union (`deepSmartMerge`) carries source element
87
- // REFERENCES out of `bundle.updates`. Freezing that directly would freeze
88
- // the engine's own recorded bundle — a read-only query mutating the
89
- // record. Cloning first detaches those leaves, and costs one clone of the
90
- // final state, not one per bundle.
106
+ const folded = {
91
107
  state: freezeDeep(structuredClone(out)),
92
108
  basis,
93
109
  redacted: redactedPaths.size > 0,
94
110
  redactedPaths: Object.freeze([...redactedPaths].sort()),
95
111
  throughCommitIdx: lastThrough,
96
- // ABSENT when clean: a fold over a live snapshot keeps the 9.17.0 shape.
97
112
  ...(skipped ? { skipped: Object.freeze(skipped) } : {}),
98
113
  };
114
+ return { folded, memo: { legIdx, through: lastThrough, out, based, redactedPaths, skipped } };
99
115
  }
100
116
  /**
101
117
  * Fold `source`'s log from its base up to and including `commitIdx`.
@@ -143,4 +159,4 @@ export function stateAt(source, commitIdx) {
143
159
  const asked = Number.isNaN(commitIdx) ? -1 : Math.floor(commitIdx);
144
160
  return foldLegs([readSource(source)], 0, asked);
145
161
  }
146
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVBdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdGltZS10cmF2ZWwvc3RhdGVBdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUdILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBR3ZDLGtGQUFrRjtBQUNsRixTQUFTLFVBQVUsQ0FBSSxLQUFRO0lBQzdCLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BELE1BQU0sS0FBSyxHQUFJLEtBQWlDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEQsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQVNEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLE1BQThCO0lBQ3ZELE1BQU0sSUFBSSxHQUFJLE1BQWlFLEVBQUUsWUFBWSxDQUFDO0lBQzlGLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNoRCxNQUFNLE9BQU8sR0FBRyxNQUE0QyxDQUFDO0lBQzdELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FB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QyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsS0FBSztRQUNMLFFBQVEsRUFBRSxhQUFhLENBQUMsSUFBSSxHQUFHLENBQUM7UUFDaEMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZELGdCQUFnQixFQUFFLFdBQVc7UUFDN0IseUVBQXlFO1FBQ3pFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3hELENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsTUFBOEIsRUFBRSxTQUFpQjtJQUN2RSwyRUFBMkU7SUFDM0UseUVBQXlFO0lBQ3pFLHVFQUF1RTtJQUN2RSwyRUFBMkU7SUFDM0UsZUFBZTtJQUNmLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ25FLE9BQU8sUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2xELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHN0YXRlQXQg4oCUIHRoZSBmb2xkIGF0IGEgc3RvcC5cbiAqXG4gKiBUaGUgY29tbWl0IGxvZyBzdG9yZXMgRElGRlMuIFJlcGxheWluZyB0aGVtIG9udG8gdGhlIHJ1bidzIGZvbGQgYmFzZVxuICogcmVwcm9kdWNlcyB0aGUgc3RhdGUgYXMgaXQgc3Rvb2QgYWZ0ZXIgYW55IGNvbW1pdCDigJQgYnl0ZS1mb3ItYnl0ZSB0aGUgc3RhdGVcbiAqIHRoZSBuZXh0IHN0YWdlIHNhdywgaW4gYm90aCBgY29tbWl0VmFsdWVzYCBlbmNvZGluZ3MsIGJlY2F1c2UgdGhlIHJlcGxheVxuICogcnVucyB0aHJvdWdoIGBhcHBseVNtYXJ0TWVyZ2VgLCB0aGUgb25lIHZlcmIgc3dpdGNoIHRoZSBsaXZlIGNvbW1pdCBpdHNlbGZcbiAqIHVzZXMuIFRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBzZWNvbmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHZlcmJzIGhlcmUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUsIE1lbW9yeVBhdGNoIH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcbmltcG9ydCB7IGFwcGx5U21hcnRNZXJnZSB9IGZyb20gJy4uL21lbW9yeS91dGlscy5qcyc7XG5pbXBvcnQgeyByZWFkTG9nIH0gZnJvbSAnLi9idW5kbGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRm9sZEJhc2lzLCBGb2xkZWRTdGF0ZSwgRm9sZFNvdXJjZSwgTG9nR2FwIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKiBEZWVwbHkgZnJlZXplIGEgUE9KTyB0cmVlIHNvIGEgZm9sZCByZXN1bHQgY2Fubm90IGJlIG11dGF0ZWQgYnkgaXRzIGhvbGRlci4gKi9cbmZ1bmN0aW9uIGZyZWV6ZURlZXA8VD4odmFsdWU6IFQpOiBUIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB2YWx1ZTtcbiAgT2JqZWN0LmZyZWV6ZSh2YWx1ZSk7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKSkge1xuICAgIGNvbnN0IGlubmVyID0gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgIGlmIChpbm5lciAmJiB0eXBlb2YgaW5uZXIgPT09ICdvYmplY3QnICYmICFPYmplY3QuaXNGcm96ZW4oaW5uZXIpKSBmcmVlemVEZWVwKGlubmVyKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKiBPbmUgc291cmNlLCByZWFkOiBpdHMgbG9nIChnYXBzIGhlbGQgaW4gcGxhY2UpIGFuZCBpdHMgZm9sZCBiYXNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWFkU291cmNlIHtcbiAgcmVhZG9ubHkgbG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXTtcbiAgcmVhZG9ubHkgZ2FwczogcmVhZG9ubHkgTG9nR2FwW107XG4gIHJlYWRvbmx5IGJhc2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlYWQgd2hpY2hldmVyIHNoYXBlIHRoZSBjYWxsZXIgaGFuZGVkIHVzIOKAlCBgY29tbWl0TG9nYCAoYSBydW4gc25hcHNob3QpIG9yXG4gKiBgaGlzdG9yeWAgKGEgc3ViZmxvdydzIG93biBsb2cpIOKAlCBuYXJyb3dpbmcgdGhlIHJvd3MgdG8gY29tbWl0IGJ1bmRsZXMgYXMgaXRcbiAqIGdvZXMgKHNlZSBgYnVuZGxlcy50c2A6IGEgcm93IHRoYXQgaXMgbm90IG9uZSBiZWNvbWVzIGFuIGluZGV4LWhvbGRpbmcgZ2FwKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRTb3VyY2Uoc291cmNlOiBGb2xkU291cmNlIHwgdW5kZWZpbmVkKTogUmVhZFNvdXJjZSB7XG4gIGNvbnN0IGJhc2UgPSAoc291cmNlIGFzIHsgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSB8IHVuZGVmaW5lZCk/LmluaXRpYWxTdGF0ZTtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiB7IGxvZzogW10sIGdhcHM6IFtdLCBiYXNlIH07XG4gIGNvbnN0IHdpdGhMb2cgPSBzb3VyY2UgYXMgeyBjb21taXRMb2c/OiByZWFkb25seSB1bmtub3duW10gfTtcbiAgY29uc3QgcmF3ID0gQXJyYXkuaXNBcnJheSh3aXRoTG9nLmNvbW1pdExvZylcbiAgICA/IHdpdGhMb2cuY29tbWl0TG9nXG4gICAgOiBBcnJheS5pc0FycmF5KChzb3VyY2UgYXMgeyBoaXN0b3J5PzogcmVhZG9ubHkgdW5rbm93bltdIH0pLmhpc3RvcnkpXG4gICAgPyAoc291cmNlIGFzIHsgaGlzdG9yeTogcmVhZG9ubHkgdW5rbm93bltdIH0pLmhpc3RvcnlcbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgeyBsb2csIGdhcHMgfSA9IHJlYWRMb2cocmF3KTtcbiAgcmV0dXJuIHsgbG9nLCBnYXBzLCBiYXNlIH07XG59XG5cbi8qKlxuICogRm9sZCBvbmUgY2hhaW4gb2YgbGVnczogZXZlcnkgbGVnIEJFRk9SRSBgbGVnSWR4YCBpbiBmdWxsLCB0aGVuIGBsZWdJZHhgXG4gKiB0aHJvdWdoIGB0aHJvdWdoYC5cbiAqXG4gKiBUSEUgTEVHIFJVTEUuIEEgbGVnIHRoYXQgY2FycmllcyBpdHMgb3duIGBpbml0aWFsU3RhdGVgIFJFU1RBUlRTIHRoZVxuICogYWNjdW11bGF0aW9uIGZyb20gaXQg4oCUIG9uIGEgcGF1c2UvcmVzdW1lIHRoYXQgYmFzZSBJUyB0aGUgc3RhdGUgYXQgdGhlXG4gKiBwYXVzZSwgcmVjb3JkZWQgYnkgdGhlIGVuZ2luZSwgYW5kIGlzIGF1dGhvcml0YXRpdmUgb3ZlciBhbnl0aGluZyB0aGVcbiAqIHByZXZpb3VzIGxlZydzIGxvZyByZWJ1aWx0LiBBIGxlZyB3aXRoIG5vIGJhc2UgKGEgcHJlLTkuMTcgc25hcHNob3QsIGFcbiAqIGhhbmQtYnVpbHQgbG9nKSBDT05USU5VRVMgZnJvbSB3aGF0IHRoZSBlYXJsaWVyIGxlZ3MgZm9sZGVkLCB3aGljaCBpcyB0aGVcbiAqIGJlc3QgaG9uZXN0IGFuc3dlciBhdmFpbGFibGUgYW5kIGlzIGV4YWN0bHkgd2hhdCBgYmFzaXNgIHRoZW4gcmVwb3J0cy5cbiAqXG4gKiBXaXRoIGEgc2luZ2xlIGxlZyB0aGlzIGlzIHRoZSA5LjE3LjAgZm9sZCwgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9sZExlZ3MobGVnczogcmVhZG9ubHkgUmVhZFNvdXJjZVtdLCBsZWdJZHg6IG51bWJlciwgdGhyb3VnaDogbnVtYmVyKTogRm9sZGVkU3RhdGUge1xuICBsZXQgYmFzZWQgPSBmYWxzZTtcbiAgbGV0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgY29uc3QgcmVkYWN0ZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBsZXQgc2tpcHBlZDogTG9nR2FwW10gfCB1bmRlZmluZWQ7XG4gIGxldCBsYXN0VGhyb3VnaCA9IC0xO1xuXG4gIGZvciAobGV0IGxlZyA9IDA7IGxlZyA8PSBsZWdJZHggJiYgbGVnIDwgbGVncy5sZW5ndGg7IGxlZysrKSB7XG4gICAgY29uc3QgeyBsb2csIGdhcHMsIGJhc2UgfSA9IGxlZ3NbbGVnXTtcbiAgICBpZiAoYmFzZSAmJiB0eXBlb2YgYmFzZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG91dCA9IHN0cnVjdHVyZWRDbG9uZShiYXNlKTtcbiAgICAgIGJhc2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgZW5kID0gbGVnID09PSBsZWdJZHggPyBNYXRoLm1pbih0aHJvdWdoLCBsb2cubGVuZ3RoIC0gMSkgOiBsb2cubGVuZ3RoIC0gMTtcbiAgICBpZiAobGVnID09PSBsZWdJZHgpIGxhc3RUaHJvdWdoID0gZW5kIDwgLTEgPyAtMSA6IGVuZDtcbiAgICBmb3IgKGNvbnN0IGdhcCBvZiBnYXBzKSB7XG4gICAgICBpZiAoZ2FwLmluZGV4IDw9IGVuZCkgKHNraXBwZWQgPz89IFtdKS5wdXNoKGdhcCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICBjb25zdCBidW5kbGUgPSBsb2dbaV07XG4gICAgICBpZiAoIWJ1bmRsZSkgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IHBhdGggb2YgYnVuZGxlLnJlZGFjdGVkUGF0aHMgPz8gW10pIHJlZGFjdGVkUGF0aHMuYWRkKHBhdGgpO1xuICAgICAgb3V0ID0gYXBwbHlTbWFydE1lcmdlKG91dCwgYnVuZGxlLnVwZGF0ZXMgYXMgTWVtb3J5UGF0Y2gsIGJ1bmRsZS5vdmVyd3JpdGUgYXMgTWVtb3J5UGF0Y2gsIGJ1bmRsZS50cmFjZSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYmFzaXM6IEZvbGRCYXNpcyA9IGJhc2VkID8gJ2luaXRpYWwrbG9nJyA6ICdsb2ctb25seSc7XG4gIHJldHVybiB7XG4gICAgLy8gTGF3IDMsIGJvdGggaGFsdmVzLiBgYXBwbHlTbWFydE1lcmdlYCBjbG9uZXMgd2hhdCBpdCBPVkVSV1JJVEVTLCBidXQgdGhlXG4gICAgLy8gbWVyZ2UgYXJtJ3MgYXJyYXkgdW5pb24gKGBkZWVwU21hcnRNZXJnZWApIGNhcnJpZXMgc291cmNlIGVsZW1lbnRcbiAgICAvLyBSRUZFUkVOQ0VTIG91dCBvZiBgYnVuZGxlLnVwZGF0ZXNgLiBGcmVlemluZyB0aGF0IGRpcmVjdGx5IHdvdWxkIGZyZWV6ZVxuICAgIC8vIHRoZSBlbmdpbmUncyBvd24gcmVjb3JkZWQgYnVuZGxlIOKAlCBhIHJlYWQtb25seSBxdWVyeSBtdXRhdGluZyB0aGVcbiAgICAvLyByZWNvcmQuIENsb25pbmcgZmlyc3QgZGV0YWNoZXMgdGhvc2UgbGVhdmVzLCBhbmQgY29zdHMgb25lIGNsb25lIG9mIHRoZVxuICAgIC8vIGZpbmFsIHN0YXRlLCBub3Qgb25lIHBlciBidW5kbGUuXG4gICAgc3RhdGU6IGZyZWV6ZURlZXAoc3RydWN0dXJlZENsb25lKG91dCkpLFxuICAgIGJhc2lzLFxuICAgIHJlZGFjdGVkOiByZWRhY3RlZFBhdGhzLnNpemUgPiAwLFxuICAgIHJlZGFjdGVkUGF0aHM6IE9iamVjdC5mcmVlemUoWy4uLnJlZGFjdGVkUGF0aHNdLnNvcnQoKSksXG4gICAgdGhyb3VnaENvbW1pdElkeDogbGFzdFRocm91Z2gsXG4gICAgLy8gQUJTRU5UIHdoZW4gY2xlYW46IGEgZm9sZCBvdmVyIGEgbGl2ZSBzbmFwc2hvdCBrZWVwcyB0aGUgOS4xNy4wIHNoYXBlLlxuICAgIC4uLihza2lwcGVkID8geyBza2lwcGVkOiBPYmplY3QuZnJlZXplKHNraXBwZWQpIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKlxuICogRm9sZCBgc291cmNlYCdzIGxvZyBmcm9tIGl0cyBiYXNlIHVwIHRvIGFuZCBpbmNsdWRpbmcgYGNvbW1pdElkeGAuXG4gKlxuICogQHBhcmFtIHNvdXJjZSAgICBBIHJ1biBzbmFwc2hvdCAoYGNvbW1pdExvZ2AgKyBgaW5pdGlhbFN0YXRlYCkgb3IgYSBzdWJmbG93XG4gKiAgICAgICAgICAgICAgICAgIHN1YnRyZWUgKGBoaXN0b3J5YCArIGBpbml0aWFsU3RhdGVgKS4gQm90aCBzcGVsbGluZ3Mgd29yayxcbiAqICAgICAgICAgICAgICAgICAgYW5kIHRoZSByb3dzIG1heSBiZSB1bnZhbGlkYXRlZCAoYHVua25vd25bXWApIOKAlCBhIHJvdyB0aGF0XG4gKiAgICAgICAgICAgICAgICAgIGlzIG5vdCBhIGNvbW1pdCBidW5kbGUgaXMgc2tpcHBlZCBhbmQgUkVQT1JURUQsIGJ5IGluZGV4LFxuICogICAgICAgICAgICAgICAgICBpbiB7QGxpbmsgRm9sZGVkU3RhdGUuc2tpcHBlZH0sIG5ldmVyIGNyYXNoZWQgb24uXG4gKiBAcGFyYW0gY29tbWl0SWR4IEFSUkFZIElOREVYIG9mIHRoZSBsYXN0IGJ1bmRsZSB0byBmb2xkLCBpbmNsdXNpdmUuIGAtMWBcbiAqICAgICAgICAgICAgICAgICAgKG9yIGFueSBuZWdhdGl2ZSkgZm9sZHMgbm90aGluZyBhbmQgcmV0dXJucyB0aGUgYmFzZSDigJRcbiAqICAgICAgICAgICAgICAgICAgdGhlIHN0YXRlIGJlZm9yZSB0aGUgcnVuJ3MgZmlyc3QgY29tbWl0LiBQYXN0IHRoZSBlbmRcbiAqICAgICAgICAgICAgICAgICAgY2xhbXBzIHRvIHRoZSBlbmQ7IHRoZSByZXN1bHQncyBgdGhyb3VnaENvbW1pdElkeGAgcmVwb3J0c1xuICogICAgICAgICAgICAgICAgICB3aGVyZSB0aGUgZm9sZCBhY3R1YWxseSBzdG9wcGVkLlxuICpcbiAqIEByZXR1cm5zIEEgZGV0YWNoZWQsIGRlZXBseSBmcm96ZW4gc3RhdGUgcGx1cyBob3cgaXQgd2FzIGRlcml2ZWQ6IGBiYXNpc2BcbiAqICAgc2F5cyB3aGV0aGVyIHRoZSByZWFsIGZvbGQgYmFzZSB3YXMgYXZhaWxhYmxlLCBgcmVkYWN0ZWRgIC9cbiAqICAgYHJlZGFjdGVkUGF0aHNgIHNheSB3aGVyZSB0aGUgbG9nIHdhcyBzY3J1YmJlZCBhdCB3cml0ZSB0aW1lLCBhbmRcbiAqICAgYHNraXBwZWRgIHNheXMgd2hpY2ggcm93cyBjb3VsZCBub3QgYmUgcmVhZC4gVGhlIGVuZ2luZSByZWRhY3RzIHZhbHVlcyBhc1xuICogICBpdCByZWNvcmRzIHRoZW0sIHNvIGEgcmVwbGF5IG9mIGEgcmVkYWN0ZWQgcnVuIHlpZWxkcyBgJ1JFREFDVEVEJ2AgaW5cbiAqICAgdGhvc2UgcGxhY2VzIOKAlCBjb3JyZWN0LCBhbmQgc2FpZCBvdXQgbG91ZCByYXRoZXIgdGhhbiBwcmVzZW50ZWQgYXMgdGhlXG4gKiAgIHJlYWwgdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHNuYXBzaG90ID0gZXhlY3V0b3IuZ2V0U25hcHNob3QoKTtcbiAqIGNvbnN0IHsgc3RhdGUsIGJhc2lzIH0gPSBzdGF0ZUF0KHNuYXBzaG90LCAzKTsgICAvLyBhZnRlciB0aGUgNHRoIGNvbW1pdFxuICogY29uc29sZS5sb2coYmFzaXMsIHN0YXRlKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyAnaW5pdGlhbCtsb2cnIHsgLi4uIH1cbiAqXG4gKiAvLyBBIHN1YmZsb3cncyBvd24gbG9nIGZvbGRzIGlkZW50aWNhbGx5OlxuICogY29uc3QgaW5uZXIgPSBnZXRTdWJ0cmVlU25hcHNob3Qoc25hcHNob3QsICdzZi1wYXltZW50JykhO1xuICogc3RhdGVBdChpbm5lciwgMCkuc3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZnRlciB0aGUgc3ViZmxvdydzIGZpcnN0IGNvbW1pdFxuICpcbiAqIC8vIEEgU1RPUkVEIHJlY29yZGluZyBuZWVkcyBubyBjYXN0IOKAlCBpdHMgcm93cyBhcmUgYHVua25vd25bXWA6XG4gKiBjb25zdCBzdG9yZWQgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGY4JykpO1xuICogc3RhdGVBdChzdG9yZWQsIDMpLnNraXBwZWQ7ICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlZmluZWQsIG9yIHRoZSBiYWQgcm93c1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGF0ZUF0KHNvdXJjZTogRm9sZFNvdXJjZSB8IHVuZGVmaW5lZCwgY29tbWl0SWR4OiBudW1iZXIpOiBGb2xkZWRTdGF0ZSB7XG4gIC8vIGBOYU5gIGlzIG91dCBvZiBjb250cmFjdDsgdHJlYXQgaXQgYXMgXCJmb2xkIG5vdGhpbmdcIiByYXRoZXIgdGhhbiBsZXR0aW5nXG4gIC8vIGl0IGZsb3cgdGhyb3VnaCB0aGUgYXJpdGhtZXRpYyBpbnRvIGB0aHJvdWdoQ29tbWl0SWR4YCwgd2hlcmUgaXQgd291bGRcbiAgLy8gc2VyaWFsaXplIGFzIGBudWxsYCBhbmQgdGVsbCBhIGNvbnN1bWVyIG5vdGhpbmcgYWJvdXQgd2hlcmUgdGhlIGZvbGRcbiAgLy8gc3RvcHBlZC4gKMKxSW5maW5pdHkgbmVlZHMgbm8gc3BlY2lhbCBjYXNlOiBpdCBjbGFtcHMgbGlrZSBhbnkgaW5kZXggcGFzdFxuICAvLyBlaXRoZXIgZW5kLilcbiAgY29uc3QgYXNrZWQgPSBOdW1iZXIuaXNOYU4oY29tbWl0SWR4KSA/IC0xIDogTWF0aC5mbG9vcihjb21taXRJZHgpO1xuICByZXR1cm4gZm9sZExlZ3MoW3JlYWRTb3VyY2Uoc291cmNlKV0sIDAsIGFza2VkKTtcbn1cbiJdfQ==
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVBdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdGltZS10cmF2ZWwvc3RhdGVBdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUdILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHdkMsa0ZBQWtGO0FBQ2xGLFNBQVMsVUFBVSxDQUFJLEtBQVE7SUFDN0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDcEQsTUFBTSxLQUFLLEdBQUksS0FBaUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0RCxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBU0Q7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsTUFBOEI7SUFDdkQsTUFBTSxJQUFJLEdBQUksTUFBaUUsRUFBRSxZQUFZLENBQUM7SUFDOUYsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2hELE1BQU0sT0FBTyxHQUFHLE1BQTRDLENBQUM7SUFDN0QsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxP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KiBzdGF0ZUF0IOKAlCB0aGUgZm9sZCBhdCBhIHN0b3AuXG4gKlxuICogVGhlIGNvbW1pdCBsb2cgc3RvcmVzIERJRkZTLiBSZXBsYXlpbmcgdGhlbSBvbnRvIHRoZSBydW4ncyBmb2xkIGJhc2VcbiAqIHJlcHJvZHVjZXMgdGhlIHN0YXRlIGFzIGl0IHN0b29kIGFmdGVyIGFueSBjb21taXQg4oCUIGJ5dGUtZm9yLWJ5dGUgdGhlIHN0YXRlXG4gKiB0aGUgbmV4dCBzdGFnZSBzYXcsIGluIGJvdGggYGNvbW1pdFZhbHVlc2AgZW5jb2RpbmdzLCBiZWNhdXNlIHRoZSByZXBsYXlcbiAqIHJ1bnMgdGhyb3VnaCBgYXBwbHlTbWFydE1lcmdlYCwgdGhlIG9uZSB2ZXJiIHN3aXRjaCB0aGUgbGl2ZSBjb21taXQgaXRzZWxmXG4gKiB1c2VzLiBUaGVyZSBpcyBkZWxpYmVyYXRlbHkgbm8gc2Vjb25kIGltcGxlbWVudGF0aW9uIG9mIHRoZSB2ZXJicyBoZXJlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlLCBNZW1vcnlQYXRjaCB9IGZyb20gJy4uL21lbW9yeS90eXBlcy5qcyc7XG5pbXBvcnQgeyBhcHBseVNtYXJ0TWVyZ2VJbnRvIH0gZnJvbSAnLi4vbWVtb3J5L3V0aWxzLmpzJztcbmltcG9ydCB7IHJlYWRMb2cgfSBmcm9tICcuL2J1bmRsZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBGb2xkQmFzaXMsIEZvbGRlZFN0YXRlLCBGb2xkU291cmNlLCBMb2dHYXAgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIERlZXBseSBmcmVlemUgYSBQT0pPIHRyZWUgc28gYSBmb2xkIHJlc3VsdCBjYW5ub3QgYmUgbXV0YXRlZCBieSBpdHMgaG9sZGVyLiAqL1xuZnVuY3Rpb24gZnJlZXplRGVlcDxUPih2YWx1ZTogVCk6IFQge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICBPYmplY3QuZnJlZXplKHZhbHVlKTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpKSB7XG4gICAgY29uc3QgaW5uZXIgPSAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgaWYgKGlubmVyICYmIHR5cGVvZiBpbm5lciA9PT0gJ29iamVjdCcgJiYgIU9iamVjdC5pc0Zyb3plbihpbm5lcikpIGZyZWV6ZURlZXAoaW5uZXIpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqIE9uZSBzb3VyY2UsIHJlYWQ6IGl0cyBsb2cgKGdhcHMgaGVsZCBpbiBwbGFjZSkgYW5kIGl0cyBmb2xkIGJhc2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRTb3VyY2Uge1xuICByZWFkb25seSBsb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdO1xuICByZWFkb25seSBnYXBzOiByZWFkb25seSBMb2dHYXBbXTtcbiAgcmVhZG9ubHkgYmFzZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVhZCB3aGljaGV2ZXIgc2hhcGUgdGhlIGNhbGxlciBoYW5kZWQgdXMg4oCUIGBjb21taXRMb2dgIChhIHJ1biBzbmFwc2hvdCkgb3JcbiAqIGBoaXN0b3J5YCAoYSBzdWJmbG93J3Mgb3duIGxvZykg4oCUIG5hcnJvd2luZyB0aGUgcm93cyB0byBjb21taXQgYnVuZGxlcyBhcyBpdFxuICogZ29lcyAoc2VlIGBidW5kbGVzLnRzYDogYSByb3cgdGhhdCBpcyBub3Qgb25lIGJlY29tZXMgYW4gaW5kZXgtaG9sZGluZyBnYXApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFNvdXJjZShzb3VyY2U6IEZvbGRTb3VyY2UgfCB1bmRlZmluZWQpOiBSZWFkU291cmNlIHtcbiAgY29uc3QgYmFzZSA9IChzb3VyY2UgYXMgeyBpbml0aWFsU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9IHwgdW5kZWZpbmVkKT8uaW5pdGlhbFN0YXRlO1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHsgbG9nOiBbXSwgZ2FwczogW10sIGJhc2UgfTtcbiAgY29uc3Qgd2l0aExvZyA9IHNvdXJjZSBhcyB7IGNvbW1pdExvZz86IHJlYWRvbmx5IHVua25vd25bXSB9O1xuICBjb25zdCByYXcgPSBBcnJheS5pc0FycmF5KHdpdGhMb2cuY29tbWl0TG9nKVxuICAgID8gd2l0aExvZy5jb21taXRMb2dcbiAgICA6IEFycmF5LmlzQXJyYXkoKHNvdXJjZSBhcyB7IGhpc3Rvcnk/OiByZWFkb25seSB1bmtub3duW10gfSkuaGlzdG9yeSlcbiAgICA/IChzb3VyY2UgYXMgeyBoaXN0b3J5OiByZWFkb25seSB1bmtub3duW10gfSkuaGlzdG9yeVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCB7IGxvZywgZ2FwcyB9ID0gcmVhZExvZyhyYXcpO1xuICByZXR1cm4geyBsb2csIGdhcHMsIGJhc2UgfTtcbn1cblxuLyoqXG4gKiBGb2xkIG9uZSBjaGFpbiBvZiBsZWdzOiBldmVyeSBsZWcgQkVGT1JFIGBsZWdJZHhgIGluIGZ1bGwsIHRoZW4gYGxlZ0lkeGBcbiAqIHRocm91Z2ggYHRocm91Z2hgLlxuICpcbiAqIFRIRSBMRUcgUlVMRS4gQSBsZWcgdGhhdCBjYXJyaWVzIGl0cyBvd24gYGluaXRpYWxTdGF0ZWAgUkVTVEFSVFMgdGhlXG4gKiBhY2N1bXVsYXRpb24gZnJvbSBpdCDigJQgb24gYSBwYXVzZS9yZXN1bWUgdGhhdCBiYXNlIElTIHRoZSBzdGF0ZSBhdCB0aGVcbiAqIHBhdXNlLCByZWNvcmRlZCBieSB0aGUgZW5naW5lLCBhbmQgaXMgYXV0aG9yaXRhdGl2ZSBvdmVyIGFueXRoaW5nIHRoZVxuICogcHJldmlvdXMgbGVnJ3MgbG9nIHJlYnVpbHQuIEEgbGVnIHdpdGggbm8gYmFzZSAoYSBwcmUtOS4xNyBzbmFwc2hvdCwgYVxuICogaGFuZC1idWlsdCBsb2cpIENPTlRJTlVFUyBmcm9tIHdoYXQgdGhlIGVhcmxpZXIgbGVncyBmb2xkZWQsIHdoaWNoIGlzIHRoZVxuICogYmVzdCBob25lc3QgYW5zd2VyIGF2YWlsYWJsZSBhbmQgaXMgZXhhY3RseSB3aGF0IGBiYXNpc2AgdGhlbiByZXBvcnRzLlxuICpcbiAqIFdpdGggYSBzaW5nbGUgbGVnIHRoaXMgaXMgdGhlIDkuMTcuMCBmb2xkLCB1bmNoYW5nZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb2xkTGVncyhsZWdzOiByZWFkb25seSBSZWFkU291cmNlW10sIGxlZ0lkeDogbnVtYmVyLCB0aHJvdWdoOiBudW1iZXIpOiBGb2xkZWRTdGF0ZSB7XG4gIHJldHVybiBmb2xkTGVnc0Zyb20obGVncywgbGVnSWR4LCB0aHJvdWdoKS5mb2xkZWQ7XG59XG5cbi8qKlxuICogV2hhdCBhIGZvbGQgbGVhdmVzIGJlaGluZCBmb3IgdGhlIE5FWFQgb25lICg5LjI1LjApOiB0aGUgcHJpdmF0ZSB3b3JraW5nXG4gKiBjb3B5IGFuZCB0aGUgZmFjdHMgYWNjdW11bGF0ZWQgc28gZmFyLiBBIGN1cnNvciBzdGVwcGluZyBmb3J3YXJkIG9uIHRoZVxuICogc2FtZSBsZWcgaGFuZHMgaXQgYmFjayBhbmQgb25seSB0aGUgYnVuZGxlcyBhZnRlciBgdGhyb3VnaGAgYXJlIGFwcGxpZWQg4oCUXG4gKiBvbmUgYnVuZGxlIHBlciBzdGVwIGluc3RlYWQgb2YgYSByZXBsYXkgZnJvbSB0aGUgYmFzZS4gQW55IG90aGVyIGFzayAoYW5cbiAqIGVhcmxpZXIgc3RvcCwgYW5vdGhlciBsZWcpIGZvbGRzIGZyb20gc2NyYXRjaDsgdGhlIG1lbW8gaXMgbmV2ZXIgYSBjbGFpbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb2xkTWVtbyB7XG4gIHJlYWRvbmx5IGxlZ0lkeDogbnVtYmVyO1xuICByZWFkb25seSB0aHJvdWdoOiBudW1iZXI7XG4gIHJlYWRvbmx5IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlYWRvbmx5IGJhc2VkOiBib29sZWFuO1xuICByZWFkb25seSByZWRhY3RlZFBhdGhzOiBSZWFkb25seVNldDxzdHJpbmc+O1xuICByZWFkb25seSBza2lwcGVkOiByZWFkb25seSBMb2dHYXBbXSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqIEFwcGx5IGBsb2dbZnJvbSArIDEgLi4gZW5kXWAgb2Ygb25lIGxlZyBpbnRvIGBvdXRgLCBjb2xsZWN0aW5nIHRoZSBsZWcncyBmYWN0cy4gKi9cbmZ1bmN0aW9uIGFwcGx5TGVnKFxuICBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBsZWc6IFJlYWRTb3VyY2UsXG4gIGZyb206IG51bWJlcixcbiAgZW5kOiBudW1iZXIsXG4gIHJlZGFjdGVkUGF0aHM6IFNldDxzdHJpbmc+LFxuICBza2lwcGVkOiBMb2dHYXBbXSB8IHVuZGVmaW5lZCxcbik6IExvZ0dhcFtdIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBnYXAgb2YgbGVnLmdhcHMpIHtcbiAgICBpZiAoZ2FwLmluZGV4ID4gZnJvbSAmJiBnYXAuaW5kZXggPD0gZW5kKSAoc2tpcHBlZCA/Pz0gW10pLnB1c2goZ2FwKTtcbiAgfVxuICBmb3IgKGxldCBpID0gZnJvbSArIDE7IGkgPD0gZW5kOyBpKyspIHtcbiAgICBjb25zdCBidW5kbGUgPSBsZWcubG9nW2ldO1xuICAgIGlmICghYnVuZGxlKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgYnVuZGxlLnJlZGFjdGVkUGF0aHMgPz8gW10pIHJlZGFjdGVkUGF0aHMuYWRkKHBhdGgpO1xuICAgIGFwcGx5U21hcnRNZXJnZUludG8ob3V0LCBidW5kbGUudXBkYXRlcyBhcyBNZW1vcnlQYXRjaCwgYnVuZGxlLm92ZXJ3cml0ZSBhcyBNZW1vcnlQYXRjaCwgYnVuZGxlLnRyYWNlKTtcbiAgfVxuICByZXR1cm4gc2tpcHBlZDtcbn1cblxuLyoqXG4gKiBUaGUgZm9sZCwgcmVzdW1hYmxlLiBPTkUgY2xvbmUgcGVyIGZvbGQ6IHRoZSBiYXNlIGlzIGNsb25lZCBvbmNlIChvciBge31gXG4gKiBzdGFuZHMgaW4pLCBldmVyeSBidW5kbGUgaXMgYXBwbGllZCBJTlRPIHRoYXQgY29weSwgYW5kIHRoZSBzdGF0ZSBoYW5kZWRcbiAqIG91dCBpcyBvbmUgbW9yZSBjbG9uZSwgZnJvemVuIOKAlCBzbyB0aGUgd29ya2luZyBjb3B5IHN0YXlzIHByaXZhdGUgYW5kIGFcbiAqIGxhdGVyIHN0ZXAgY2FuIGNvbnRpbnVlIGZyb20gaXQuIFNhbWUgYW5zd2VyIGFzIHRoZSA5LjE3LjAgZm9sZCwgcGlubmVkIGJ5XG4gKiB0ZXN0L2xpYi90aW1lLXRyYXZlbC9mb2xkLW1lbW8udGVzdC50cyBhZ2FpbnN0IGEgZnJlc2ggZm9sZCBhdCBldmVyeSBzdG9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9sZExlZ3NGcm9tKFxuICBsZWdzOiByZWFkb25seSBSZWFkU291cmNlW10sXG4gIGxlZ0lkeDogbnVtYmVyLFxuICB0aHJvdWdoOiBudW1iZXIsXG4gIG1lbW8/OiBGb2xkTWVtbyxcbik6IHsgcmVhZG9ubHkgZm9sZGVkOiBGb2xkZWRTdGF0ZTsgcmVhZG9ubHkgbWVtbzogRm9sZE1lbW8gfSB7XG4gIGNvbnN0IGxhc3QgPSBsZWdzW2xlZ0lkeF07XG4gIGNvbnN0IGVuZE9uTGVnID0gbGFzdCA/IE1hdGgubWluKHRocm91Z2gsIGxhc3QubG9nLmxlbmd0aCAtIDEpIDogLTE7XG4gIGNvbnN0IGxhc3RUaHJvdWdoID0gZW5kT25MZWcgPCAtMSA/IC0xIDogZW5kT25MZWc7XG4gIGNvbnN0IHJlc3VtYWJsZSA9IG1lbW8gIT09IHVuZGVmaW5lZCAmJiBtZW1vLmxlZ0lkeCA9PT0gbGVnSWR4ICYmIGxhc3RUaHJvdWdoID49IG1lbW8udGhyb3VnaDtcblxuICBsZXQgYmFzZWQgPSByZXN1bWFibGUgPyBtZW1vLmJhc2VkIDogZmFsc2U7XG4gIGxldCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gcmVzdW1hYmxlID8gbWVtby5vdXQgOiB7fTtcbiAgY29uc3QgcmVkYWN0ZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihyZXN1bWFibGUgPyBtZW1vLnJlZGFjdGVkUGF0aHMgOiBbXSk7XG4gIGxldCBza2lwcGVkOiBMb2dHYXBbXSB8IHVuZGVmaW5lZCA9IHJlc3VtYWJsZSAmJiBtZW1vLnNraXBwZWQgPyBbLi4ubWVtby5za2lwcGVkXSA6IHVuZGVmaW5lZDtcblxuICBpZiAocmVzdW1hYmxlKSB7XG4gICAgaWYgKGxhc3QpIHNraXBwZWQgPSBhcHBseUxlZyhvdXQsIGxhc3QsIG1lbW8udGhyb3VnaCwgbGFzdFRocm91Z2gsIHJlZGFjdGVkUGF0aHMsIHNraXBwZWQpO1xuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGxlZyA9IDA7IGxlZyA8PSBsZWdJZHggJiYgbGVnIDwgbGVncy5sZW5ndGg7IGxlZysrKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBsZWdzW2xlZ107XG4gICAgICBpZiAoc291cmNlLmJhc2UgJiYgdHlwZW9mIHNvdXJjZS5iYXNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBvdXQgPSBzdHJ1Y3R1cmVkQ2xvbmUoc291cmNlLmJhc2UpO1xuICAgICAgICBiYXNlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBlbmQgPSBsZWcgPT09IGxlZ0lkeCA/IGxhc3RUaHJvdWdoIDogc291cmNlLmxvZy5sZW5ndGggLSAxO1xuICAgICAgc2tpcHBlZCA9IGFwcGx5TGVnKG91dCwgc291cmNlLCAtMSwgZW5kLCByZWRhY3RlZFBhdGhzLCBza2lwcGVkKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBiYXNpczogRm9sZEJhc2lzID0gYmFzZWQgPyAnaW5pdGlhbCtsb2cnIDogJ2xvZy1vbmx5JztcbiAgY29uc3QgZm9sZGVkOiBGb2xkZWRTdGF0ZSA9IHtcbiAgICBzdGF0ZTogZnJlZXplRGVlcChzdHJ1Y3R1cmVkQ2xvbmUob3V0KSksXG4gICAgYmFzaXMsXG4gICAgcmVkYWN0ZWQ6IHJlZGFjdGVkUGF0aHMuc2l6ZSA+IDAsXG4gICAgcmVkYWN0ZWRQYXRoczogT2JqZWN0LmZyZWV6ZShbLi4ucmVkYWN0ZWRQYXRoc10uc29ydCgpKSxcbiAgICB0aHJvdWdoQ29tbWl0SWR4OiBsYXN0VGhyb3VnaCxcbiAgICAuLi4oc2tpcHBlZCA/IHsgc2tpcHBlZDogT2JqZWN0LmZyZWV6ZShza2lwcGVkKSB9IDoge30pLFxuICB9O1xuICByZXR1cm4geyBmb2xkZWQsIG1lbW86IHsgbGVnSWR4LCB0aHJvdWdoOiBsYXN0VGhyb3VnaCwgb3V0LCBiYXNlZCwgcmVkYWN0ZWRQYXRocywgc2tpcHBlZCB9IH07XG59XG5cbi8qKlxuICogRm9sZCBgc291cmNlYCdzIGxvZyBmcm9tIGl0cyBiYXNlIHVwIHRvIGFuZCBpbmNsdWRpbmcgYGNvbW1pdElkeGAuXG4gKlxuICogQHBhcmFtIHNvdXJjZSAgICBBIHJ1biBzbmFwc2hvdCAoYGNvbW1pdExvZ2AgKyBgaW5pdGlhbFN0YXRlYCkgb3IgYSBzdWJmbG93XG4gKiAgICAgICAgICAgICAgICAgIHN1YnRyZWUgKGBoaXN0b3J5YCArIGBpbml0aWFsU3RhdGVgKS4gQm90aCBzcGVsbGluZ3Mgd29yayxcbiAqICAgICAgICAgICAgICAgICAgYW5kIHRoZSByb3dzIG1heSBiZSB1bnZhbGlkYXRlZCAoYHVua25vd25bXWApIOKAlCBhIHJvdyB0aGF0XG4gKiAgICAgICAgICAgICAgICAgIGlzIG5vdCBhIGNvbW1pdCBidW5kbGUgaXMgc2tpcHBlZCBhbmQgUkVQT1JURUQsIGJ5IGluZGV4LFxuICogICAgICAgICAgICAgICAgICBpbiB7QGxpbmsgRm9sZGVkU3RhdGUuc2tpcHBlZH0sIG5ldmVyIGNyYXNoZWQgb24uXG4gKiBAcGFyYW0gY29tbWl0SWR4IEFSUkFZIElOREVYIG9mIHRoZSBsYXN0IGJ1bmRsZSB0byBmb2xkLCBpbmNsdXNpdmUuIGAtMWBcbiAqICAgICAgICAgICAgICAgICAgKG9yIGFueSBuZWdhdGl2ZSkgZm9sZHMgbm90aGluZyBhbmQgcmV0dXJucyB0aGUgYmFzZSDigJRcbiAqICAgICAgICAgICAgICAgICAgdGhlIHN0YXRlIGJlZm9yZSB0aGUgcnVuJ3MgZmlyc3QgY29tbWl0LiBQYXN0IHRoZSBlbmRcbiAqICAgICAgICAgICAgICAgICAgY2xhbXBzIHRvIHRoZSBlbmQ7IHRoZSByZXN1bHQncyBgdGhyb3VnaENvbW1pdElkeGAgcmVwb3J0c1xuICogICAgICAgICAgICAgICAgICB3aGVyZSB0aGUgZm9sZCBhY3R1YWxseSBzdG9wcGVkLlxuICpcbiAqIEByZXR1cm5zIEEgZGV0YWNoZWQsIGRlZXBseSBmcm96ZW4gc3RhdGUgcGx1cyBob3cgaXQgd2FzIGRlcml2ZWQ6IGBiYXNpc2BcbiAqICAgc2F5cyB3aGV0aGVyIHRoZSByZWFsIGZvbGQgYmFzZSB3YXMgYXZhaWxhYmxlLCBgcmVkYWN0ZWRgIC9cbiAqICAgYHJlZGFjdGVkUGF0aHNgIHNheSB3aGVyZSB0aGUgbG9nIHdhcyBzY3J1YmJlZCBhdCB3cml0ZSB0aW1lLCBhbmRcbiAqICAgYHNraXBwZWRgIHNheXMgd2hpY2ggcm93cyBjb3VsZCBub3QgYmUgcmVhZC4gVGhlIGVuZ2luZSByZWRhY3RzIHZhbHVlcyBhc1xuICogICBpdCByZWNvcmRzIHRoZW0sIHNvIGEgcmVwbGF5IG9mIGEgcmVkYWN0ZWQgcnVuIHlpZWxkcyBgJ1JFREFDVEVEJ2AgaW5cbiAqICAgdGhvc2UgcGxhY2VzIOKAlCBjb3JyZWN0LCBhbmQgc2FpZCBvdXQgbG91ZCByYXRoZXIgdGhhbiBwcmVzZW50ZWQgYXMgdGhlXG4gKiAgIHJlYWwgdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHNuYXBzaG90ID0gZXhlY3V0b3IuZ2V0U25hcHNob3QoKTtcbiAqIGNvbnN0IHsgc3RhdGUsIGJhc2lzIH0gPSBzdGF0ZUF0KHNuYXBzaG90LCAzKTsgICAvLyBhZnRlciB0aGUgNHRoIGNvbW1pdFxuICogY29uc29sZS5sb2coYmFzaXMsIHN0YXRlKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyAnaW5pdGlhbCtsb2cnIHsgLi4uIH1cbiAqXG4gKiAvLyBBIHN1YmZsb3cncyBvd24gbG9nIGZvbGRzIGlkZW50aWNhbGx5OlxuICogY29uc3QgaW5uZXIgPSBnZXRTdWJ0cmVlU25hcHNob3Qoc25hcHNob3QsICdzZi1wYXltZW50JykhO1xuICogc3RhdGVBdChpbm5lciwgMCkuc3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZnRlciB0aGUgc3ViZmxvdydzIGZpcnN0IGNvbW1pdFxuICpcbiAqIC8vIEEgU1RPUkVEIHJlY29yZGluZyBuZWVkcyBubyBjYXN0IOKAlCBpdHMgcm93cyBhcmUgYHVua25vd25bXWA6XG4gKiBjb25zdCBzdG9yZWQgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGY4JykpO1xuICogc3RhdGVBdChzdG9yZWQsIDMpLnNraXBwZWQ7ICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlZmluZWQsIG9yIHRoZSBiYWQgcm93c1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGF0ZUF0KHNvdXJjZTogRm9sZFNvdXJjZSB8IHVuZGVmaW5lZCwgY29tbWl0SWR4OiBudW1iZXIpOiBGb2xkZWRTdGF0ZSB7XG4gIC8vIGBOYU5gIGlzIG91dCBvZiBjb250cmFjdDsgdHJlYXQgaXQgYXMgXCJmb2xkIG5vdGhpbmdcIiByYXRoZXIgdGhhbiBsZXR0aW5nXG4gIC8vIGl0IGZsb3cgdGhyb3VnaCB0aGUgYXJpdGhtZXRpYyBpbnRvIGB0aHJvdWdoQ29tbWl0SWR4YCwgd2hlcmUgaXQgd291bGRcbiAgLy8gc2VyaWFsaXplIGFzIGBudWxsYCBhbmQgdGVsbCBhIGNvbnN1bWVyIG5vdGhpbmcgYWJvdXQgd2hlcmUgdGhlIGZvbGRcbiAgLy8gc3RvcHBlZC4gKMKxSW5maW5pdHkgbmVlZHMgbm8gc3BlY2lhbCBjYXNlOiBpdCBjbGFtcHMgbGlrZSBhbnkgaW5kZXggcGFzdFxuICAvLyBlaXRoZXIgZW5kLilcbiAgY29uc3QgYXNrZWQgPSBOdW1iZXIuaXNOYU4oY29tbWl0SWR4KSA/IC0xIDogTWF0aC5mbG9vcihjb21taXRJZHgpO1xuICByZXR1cm4gZm9sZExlZ3MoW3JlYWRTb3VyY2Uoc291cmNlKV0sIDAsIGFza2VkKTtcbn1cbiJdfQ==