@jax-data-science/sci-image-visualizer 0.11.0 → 0.12.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.
Files changed (32) hide show
  1. package/esm2022/index.mjs +4 -1
  2. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  3. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +70 -2
  4. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +2 -2
  5. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +11 -1
  6. package/esm2022/lib/region-editor/region-editor.component.mjs +46 -41
  7. package/esm2022/lib/region-import/label-volume.mjs +35 -4
  8. package/esm2022/lib/region-import/ome-zarr-labels.mjs +253 -0
  9. package/esm2022/lib/region-import/open-annotations.mjs +289 -0
  10. package/esm2022/lib/region-import/zarr-codecs.mjs +167 -0
  11. package/esm2022/lib/region-import/zip.mjs +157 -0
  12. package/esm2022/lib/routing-visualizer.service.mjs +20 -7
  13. package/esm2022/lib/visualizer/region-load.mjs +16 -1
  14. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-a68Hw5rw.mjs} +1050 -50
  15. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-a68Hw5rw.mjs.map +1 -0
  16. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-CvadfzjS.mjs} +4 -2
  17. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-CvadfzjS.mjs.map} +1 -1
  18. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +3 -1
  19. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  20. package/index.d.ts +6 -0
  21. package/lib/contracts/image.contract.d.ts +7 -0
  22. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +40 -1
  23. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +5 -0
  24. package/lib/region-editor/region-editor.component.d.ts +5 -4
  25. package/lib/region-import/label-volume.d.ts +4 -0
  26. package/lib/region-import/ome-zarr-labels.d.ts +36 -0
  27. package/lib/region-import/open-annotations.d.ts +73 -0
  28. package/lib/region-import/zarr-codecs.d.ts +14 -0
  29. package/lib/region-import/zip.d.ts +31 -0
  30. package/lib/routing-visualizer.service.d.ts +9 -1
  31. package/package.json +2 -1
  32. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs.map +0 -1
@@ -38,6 +38,21 @@ export function applyImageRois(info, target, z, minSourceChars = REGION_SOURCE_M
38
38
  const load = (loads.get(target) ?? 0) + 1;
39
39
  loads.set(target, load);
40
40
  const asSource = (json) => !!attach && !!json && json.length >= minSourceChars;
41
+ if (info.regionSlices && attach) {
42
+ // An image built from annotations: its regions are its own sources, one per slice.
43
+ if (info.isStack) {
44
+ target.enterStackMode(new Map(), z, 'per-slice-file');
45
+ for (const [s, open] of info.regionSlices)
46
+ attach(open, { slice: s });
47
+ return;
48
+ }
49
+ target.setRegions([]);
50
+ target.resetUndoHistory();
51
+ const first = info.regionSlices.get(0) ?? info.regionSlices.values().next().value;
52
+ if (first)
53
+ attach(first, { slice: 0 });
54
+ return;
55
+ }
41
56
  if (info.isStack && info.tiled === false) {
42
57
  const perSlice = info.roiJsonStrs;
43
58
  const sliceCount = info.urls?.length ?? perSlice?.length ?? 0;
@@ -120,4 +135,4 @@ function bySlice(regions) {
120
135
  }
121
136
  return slices;
122
137
  }
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLWxvYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Zpc3VhbGl6ZXIvcmVnaW9uLWxvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHVCQUF1QixFQUFnQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBaUJoRiw4R0FBOEc7QUFDOUcsTUFBTSxLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQTRCLENBQUM7QUFFdEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsSUFBZ0IsRUFDaEIsTUFBd0IsRUFDeEIsQ0FBUyxFQUNULGNBQWMsR0FBRyx1QkFBdUIsRUFDeEMsSUFBaUI7SUFFakIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2RCxNQUFNLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hCLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBK0IsRUFBa0IsRUFBRSxDQUNuRSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxjQUFjLENBQUM7SUFFdEQsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDekMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNsQyxNQUFNLFVB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O0lBQ0QsSUFBSSxPQUFPO1FBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDOUQsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7QUFDNUIsQ0FBQztBQUVELDZFQUE2RTtBQUM3RSxTQUFTLE9BQU8sQ0FBQyxPQUFpQjtJQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztJQUMzQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsSUFBSSxNQUFNO1lBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFDdEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBJUmVnaW9uU3RvcmUgfSBmcm9tICcuLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBSZWdpb24gfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IG9wZW5IdHRwUmVnaW9uU291cmNlIH0gZnJvbSAnLi4vcmVnaW9uLXNvdXJjZS9odHRwLXJlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHsgUkVHSU9OX1NPVVJDRV9NSU5fQ0hBUlMsIFJlZ2lvblNvdXJjZSB9IGZyb20gJy4uL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXNvdXJjZSc7XG5pbXBvcnQgeyBvcGVuR2VvSnNvblJlZ2lvblNvdXJjZSB9IGZyb20gJy4uL3JlZ2lvbi1zb3VyY2Uvd29ya2VyLXJlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25Tb3VyY2VPcGVuZXIsIFJlZ2lvblNvdXJjZVNsaWNlcyB9IGZyb20gJy4uL3N0b3JlL3JlZ2lvbi1zb3VyY2Utc2NvcGUnO1xuXG4vKiogVGhlIHJlZ2lvbi1zdG9yZSBtZW1iZXJzIHtAbGluayBhcHBseUltYWdlUm9pc30gd3JpdGVzIHRocm91Z2guIEEgdGFyZ2V0IHdpdGhvdXRcbiAqICBgYXR0YWNoUmVnaW9uU291cmNlYCBsb2FkcyBldmVyeSBST0kgZmlsZSBhcyByZWdpb25zLiAqL1xuZXhwb3J0IHR5cGUgUmVnaW9uTG9hZFRhcmdldCA9IFBpY2s8XG4gIElSZWdpb25TdG9yZSxcbiAgJ2ltcG9ydFJlZ2lvbnMnIHwgJ2VudGVyU3RhY2tNb2RlJyB8ICdzZXRSZWdpb25zJyB8ICdyZXNldFVuZG9IaXN0b3J5J1xuPiAmIHtcbiAgYXR0YWNoUmVnaW9uU291cmNlPyhzb3VyY2U6IFJlZ2lvblNvdXJjZSB8IFJlZ2lvblNvdXJjZU9wZW5lciwgc2xpY2VzPzogUmVnaW9uU291cmNlU2xpY2VzKTogdm9pZDtcbiAgLyoqIFRoZSBzbGljZSBzaG93biBub3cgKHdoYXQgYSBzdGFjaydzIHNvdXJjZSwgbGFpZCBvdXQgb25jZSBpdCBvcGVucywgbWFrZXMgbGl2ZSkuICovXG4gIGdldERpc3BsYXlTbGljZT8oKTogbnVtYmVyO1xuICAvKiogUmVjb3JkIHRoZSBzbGljZSBzaG93biAob3V0c2lkZSBzdGFjayBtb2RlIGl0IG9ubHkgcmVjb3JkcyBpdCk6IHNlZSB7QGxpbmsgYXBwbHlJbWFnZVJvaXN9LiAqL1xuICBzZXREaXNwbGF5U2xpY2U/KHo6IG51bWJlcik6IHZvaWQ7XG4gIGlzU3RhY2tNb2RlPygpOiBib29sZWFuO1xufTtcblxuLyoqIFBlciB0YXJnZXQsIHRoZSBsYXRlc3Qge0BsaW5rIGFwcGx5SW1hZ2VSb2lzfTogYSBzdGFjayBzb3VyY2UgdGhhdCBvcGVucyBhZnRlciBhIGxhdGVyIGxvYWQgaXMgZHJvcHBlZC4gKi9cbmNvbnN0IGxvYWRzID0gbmV3IFdlYWtNYXA8UmVnaW9uTG9hZFRhcmdldCwgbnVtYmVyPigpO1xuXG4vKipcbiAqIEFwcGx5IGFuIGltYWdlJ3Mgc2F2ZWQgUk9JcyBvbmNlIGl0cyByZW5kZXIgaGFzIGxhbmRlZCwgY2hvb3NpbmcgdGhlIHJlZ2lvblxuICogbGF5b3V0IGZyb20gdGhlIGltYWdlJ3Mgc2hhcGU6XG4gKlxuICogIC0gKipGb2xkZXIgc3RhY2sqKiAoYGlzU3RhY2sgJiYgdGlsZWQgPT09IGZhbHNlYCwgc2VlIGxvYWRTZXJpZXNBc1N0YWNrKTogYSBzdGFja1xuICogICAgb2Ygc2VsZi1jb250YWluZWQgcGVyLXNsaWNlIGZpbGVzLiBFYWNoIHNsaWNlLWZpbGUgbWF5IGNhcnJ5IGl0cyBvd24gc2libGluZ1xuICogICAgYDxzdGVtPi5nZW9qc29uYCAoYHJvaUpzb25TdHJzW3pdYCksIGJ1dCBhIGZyZXNoIGZvbGRlciB3aXRoIG5vbmUgeWV0IGxlYXZlc1xuICogICAgYHJvaUpzb25TdHJzYCB1bmRlZmluZWQg4oCUIHNvIHRoaXMga2V5cyBvZmYgYHRpbGVkID09PSBmYWxzZWAsIE5PVCBgcm9pSnNvblN0cnNgLFxuICogICAgYW5kIGFuIHVuYW5ub3RhdGVkIGZvbGRlciBzdGFjayBzdGlsbCBlbnRlcnMgdGhlIHBlci1zbGljZS1maWxlIGxheW91dCAoc2F2aW5nXG4gKiAgICBiYWNrIG9uZSBnZW9qc29uIHBlciBzbGljZS1maWxlKSByYXRoZXIgdGhhbiB0aGUgY29tYmluZWQgb25lIChqaXQtdWkjOTMpLlxuICogIC0gKipTaW5nbGUtZmlsZSB6LXN0YWNrKio6IG9uZSBzaWJsaW5nIGdlb2pzb24gaG9sZGluZyBldmVyeSBzbGljZSdzIHJlZ2lvbnMsXG4gKiAgICBpbmRleGVkIGJ5IFF1UGF0aCdzIGBnZW9tZXRyeS5wbGFuZS56YC4gUGVyLXNsaWNlIChjb21iaW5lZCkgbW9kZSBpcyBlbnRlcmVkIHdoZW5cbiAqICAgIHRoZSBnZW9qc29uIGFjdHVhbGx5IGNhcnJpZXMgc2xpY2UgaW5kaWNlcywgb3Igd2hlbiB0aGVyZSBpcyBub3RoaW5nIHlldCB0b1xuICogICAgYXV0aG9yIGFnYWluc3QuIEEgbGVnYWN5IGdlb2pzb24gd2hvc2UgcmVnaW9ucyBhcmUgYWxsIG9uIHRoZSBkZWZhdWx0IHBsYW5lXG4gKiAgICBzdGF5cyBnbG9iYWwgKHNob3duIG9uIGV2ZXJ5IHNsaWNlKSwgc28gZXhpc3Rpbmcgc2luZ2xlLXBsYW5lIGFubm90YXRpb25zIGFyZVxuICogICAgbm90IGNvbmZpbmVkIHRvIHNsaWNlIDAuXG4gKiAgLSAqKlNpbmdsZSBwbGFuZSoqIChvciB0aGF0IGxlZ2FjeSBnbG9iYWwgc3RhY2spOiBvbmUgcmVnaW9uIHNldCBmb3IgdGhlIGltYWdlLlxuICogICAgTG9hZGluZyBzYXZlZCBST0lzIGlzIG5vdCBhIHVzZXIgZWRpdCwgc28gdGhlIHVuZG8gaGlzdG9yeSBzdGFydHMgZnJlc2ggYW5kIHRoZVxuICogICAgZmlyc3QgdW5kbyBjYW5ub3Qgd2lwZSB0aGVtIChqaXQtdWkjODUpLlxuICpcbiAqIExhcmdlIFJPSSBmaWxlcyAoYG1pblNvdXJjZUNoYXJzYCBhbmQgdXApIGFuZCBhIHNlcnZlci1zaWRlIHNvdXJjZSAoYHJlZ2lvblNvdXJjZVVybGApXG4gKiBiZWNvbWUgdGlsZWQgcmVnaW9uIHNvdXJjZXMgaW5zdGVhZCBvZiByZWdpb25zOyBhIHotaW5kZXhlZCBvbmUgc2VydmVzIGVhY2ggc2xpY2UgaXRzIG93blxuICogcGxhbmUuIE9uIGEgc2luZ2xlLWZpbGUgc3RhY2sgdGhlIHNvdXJjZSBpcyBvcGVuZWQgZmlyc3QsIHRvIHRlbGwgd2hpY2g6IG9uZSBvbiB0aGUgZGVmYXVsdFxuICogcGxhbmUgb25seSBzdGF5cyBnbG9iYWwsIGFzIGl0cyByZWdpb25zIHdvdWxkLiBBIGZvbGRlciBzdGFjaydzIHNvdXJjZXMgb3BlbiBsYXppbHksIHRoZSBmaXJzdFxuICogdGltZSB0aGVpciBzbGljZSBpcyBzaG93bi5cbiAqXG4gKiBgemAgaXMgdGhlIHNsaWNlIHNob3duIG5vdzsgZW50ZXJpbmcgc3RhY2sgbW9kZSBtYWtlcyBpdCBsaXZlIGFuZCByZXNldHMgdW5kby4gYGh0dHBgLCB0aGVcbiAqIGhvc3QncyBgSHR0cENsaWVudGAsIGNhcnJpZXMgYSBzZXJ2ZXItc2lkZSBzb3VyY2UncyByZXF1ZXN0cywgc28gdGhlIGhvc3QncyBpbnRlcmNlcHRvcnMgKGl0c1xuICogYXV0aCkgYXBwbHkgdG8gdGhlbSBhcyB0byB0aGUgaW1hZ2UgdGlsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUltYWdlUm9pcyhcbiAgaW5mbzogSUltYWdlSW5mbyxcbiAgdGFyZ2V0OiBSZWdpb25Mb2FkVGFyZ2V0LFxuICB6OiBudW1iZXIsXG4gIG1pblNvdXJjZUNoYXJzID0gUkVHSU9OX1NPVVJDRV9NSU5fQ0hBUlMsXG4gIGh0dHA/OiBIdHRwQ2xpZW50LFxuKTogdm9pZCB7XG4gIGNvbnN0IGF0dGFjaCA9IHRhcmdldC5hdHRhY2hSZWdpb25Tb3VyY2U/LmJpbmQodGFyZ2V0KTtcbiAgY29uc3QgbG9hZCA9IChsb2Fkcy5nZXQodGFyZ2V0KSA/PyAwKSArIDE7XG4gIGxvYWRzLnNldCh0YXJnZXQsIGxvYWQpO1xuICBjb25zdCBhc1NvdXJjZSA9IChqc29uOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKToganNvbiBpcyBzdHJpbmcgPT5cbiAgICAhIWF0dGFjaCAmJiAhIWpzb24gJiYganNvbi5sZW5ndGggPj0gbWluU291cmNlQ2hhcnM7XG5cbiAgaWYgKGluZm8uaXNTdGFjayAmJiBpbmZvLnRpbGVkID09PSBmYWxzZSkge1xuICAgIGNvbnN0IHBlclNsaWNlID0gaW5mby5yb2lKc29uU3RycztcbiAgICBjb25zdCBzbGljZUNvdW50ID0gaW5mby51cmxzPy5sZW5ndGggPz8gcGVyU2xpY2U/Lmxlbmd0aCA/PyAwO1xuICAgIGNvbnN0IHNsaWNlcyA9IG5ldyBNYXA8bnVtYmVyLCBSZWdpb25bXT4oKTtcbiAgICBjb25zdCBzb3VyY2VkOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IHMgPSAwOyBzIDwgc2xpY2VDb3VudDsgcysrKSB7XG4gICAgICBjb25zdCBqc29uID0gcGVyU2xpY2U/LltzXSA/PyBudWxsO1xuICAgICAgaWYgKGFzU291cmNlKGpzb24pKSBzb3VyY2VkLnB1c2gocyk7XG4gICAgICBzbGljZXMuc2V0KHMsIGpzb24gJiYgIWFzU291cmNlKGpzb24pID8gdGFyZ2V0LmltcG9ydFJlZ2lvbnMoanNvbikgOiBbXSk7XG4gICAgfVxuICAgIHRhcmdldC5lbnRlclN0YWNrTW9kZShzbGljZXMsIHosICdwZXItc2xpY2UtZmlsZScpO1xuICAgIGZvciAoY29uc3QgcyBvZiBzb3VyY2VkKSBhdHRhY2g/LigoKSA9PiBvcGVuR2VvSnNvblJlZ2lvblNvdXJjZShwZXJTbGljZT8uW3NdIGFzIHN0cmluZyksIHsgc2xpY2U6IHMgfSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgcm9pSnNvbiA9IGluZm8ucm9pSnNvblN0cjtcbiAgaWYgKGF0dGFjaCAmJiAoaW5mby5yZWdpb25Tb3VyY2VVcmwgfHwgYXNTb3VyY2Uocm9pSnNvbikpKSB7XG4gICAgY29uc3QgdXJsID0gaW5mby5yZWdpb25Tb3VyY2VVcmw7XG4gICAgY29uc3Qgb3BlbjogUmVnaW9uU291cmNlT3BlbmVyID0gdXJsXG4gICAgICA/ICgpID0+IG9wZW5IdHRwUmVnaW9uU291cmNlKHVybCwgeyBodHRwIH0pXG4gICAgICA6ICgpID0+IG9wZW5HZW9Kc29uUmVnaW9uU291cmNlKHJvaUpzb24gYXMgc3RyaW5nKTtcbiAgICAvLyBBcyBsb2FkaW5nIGEgZmlsZSBvZiByZWdpb25zIHJlcGxhY2VzIHRoZSByZWdpb25zLCBhIHNvdXJjZSBzdGFydHMgdGhlIGltYWdlIGFmcmVzaC5cbiAgICB0YXJnZXQuc2V0UmVnaW9ucyhbXSk7XG4gICAgdGFyZ2V0LnJlc2V0VW5kb0hpc3RvcnkoKTtcbiAgICBpZiAoIWluZm8uaXNTdGFjaykge1xuICAgICAgYXR0YWNoKG9wZW4sIHsgc2xpY2U6IDAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEEgc3RhY2s6IHBlciBzbGljZSB3aGVuIHRoZSBzb3VyY2UgaXMgei1pbmRleGVkLCBlbHNlIGdsb2JhbCAoYXMgaXRzIHJlZ2lvbnMgd291bGQgYmUpLlxuICAgIC8vIFRoZSBzdG9yZSBsZWFybnMgdGhlIHNsaWNlIHRoZSBpbWFnZSBvcGVuZWQgb24gKGEgaG9zdCBtYXkgb3BlbiBhIHN0YWNrIG9uIGFueSBzbGljZSksIHNvXG4gICAgLy8gdGhlIHNvdXJjZSwgbGFpZCBvdXQgb24gdGhlIHN0b3JlJ3Mgc2xpY2Ugb25jZSBpdCBvcGVucywgc2hvd3MgdGhhdCBvbmU7IGEgc2NydWIgbWVhbndoaWxlXG4gICAgLy8gcmVjb3JkcyBpdHMgb3duLCB3aGljaCB0aGVuIHdpbnMuXG4gICAgaWYgKCF0YXJnZXQuaXNTdGFja01vZGU/LigpKSB0YXJnZXQuc2V0RGlzcGxheVNsaWNlPy4oeik7XG4gICAgbGV0IGZpcnN0OiBQcm9taXNlPFJlZ2lvblNvdXJjZT4gfCBudWxsID0gb3BlbigpO1xuICAgIGNvbnN0IHJldXNlOiBSZWdpb25Tb3VyY2VPcGVuZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBvcGVuaW5nID0gZmlyc3Q7XG4gICAgICBmaXJzdCA9IG51bGw7XG4gICAgICByZXR1cm4gb3BlbmluZyA/PyBvcGVuKCk7XG4gICAgfTtcbiAgICBjb25zdCBsYXkgPSAoekluZGV4ZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmIChsb2Fkcy5nZXQodGFyZ2V0KSAhPT0gbG9hZCkge1xuICAgICAgICB2b2lkIGZpcnN0Py50aGVuKFxuICAgICAgICAgIChzb3VyY2UpID0+IHNvdXJjZS5kaXNwb3NlKCksXG4gICAgICAgICAgKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoekluZGV4ZWQpIHtcbiAgICAgICAgdGFyZ2V0LmVudGVyU3RhY2tNb2RlKG5ldyBNYXAoKSwgdGFyZ2V0LmdldERpc3BsYXlTbGljZT8uKCkgPz8geiwgJ2NvbWJpbmVkJyk7XG4gICAgICAgIGF0dGFjaChyZXVzZSwgJ3BsYW5lcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXR0YWNoKHJldXNlLCB7IHNsaWNlOiAwIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgLy8gT25lIHRoYXQgY2Fubm90IGJlIG9wZW5lZCBpcyBhdHRhY2hlZCBhcyBhIHNpbmdsZSBwbGFuZSAoaXRzIHNsaWNlIHJlcG9ydHMgdGhlIGZhaWx1cmUpLlxuICAgIGZpcnN0LnRoZW4oXG4gICAgICAoc291cmNlKSA9PiBsYXkoc291cmNlLmluZm8ucGxhbmVzLnNvbWUoKHApID0+IHAgIT09IDApKSxcbiAgICAgICgpID0+IGxheShmYWxzZSksXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGluZm8uaXNTdGFjaykge1xuICAgIGNvbnN0IHJlZ2lvbnMgPSByb2lKc29uID8gdGFyZ2V0LmltcG9ydFJlZ2lvbnMocm9pSnNvbikgOiBbXTtcbiAgICBpZiAoIXJvaUpzb24gfHwgcmVnaW9ucy5zb21lKChyKSA9PiAoci56ID8/IDApICE9PSAwKSkge1xuICAgICAgdGFyZ2V0LmVudGVyU3RhY2tNb2RlKGJ5U2xpY2UocmVnaW9ucyksIHosICdjb21iaW5lZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBpZiAocm9pSnNvbikgdGFyZ2V0LnNldFJlZ2lvbnModGFyZ2V0LmltcG9ydFJlZ2lvbnMocm9pSnNvbikpO1xuICB0YXJnZXQucmVzZXRVbmRvSGlzdG9yeSgpO1xufVxuXG4vKiogQnVja2V0IHJlZ2lvbnMgYnkgdGhlaXIgemVyby1iYXNlZCB7QGxpbmsgUmVnaW9uLnp9ICh1bnNldCA9IHNsaWNlIDApLiAqL1xuZnVuY3Rpb24gYnlTbGljZShyZWdpb25zOiBSZWdpb25bXSk6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiB7XG4gIGNvbnN0IHNsaWNlcyA9IG5ldyBNYXA8bnVtYmVyLCBSZWdpb25bXT4oKTtcbiAgZm9yIChjb25zdCByIG9mIHJlZ2lvbnMpIHtcbiAgICBjb25zdCB6ID0gci56ID8/IDA7XG4gICAgY29uc3QgYnVja2V0ID0gc2xpY2VzLmdldCh6KTtcbiAgICBpZiAoYnVja2V0KSBidWNrZXQucHVzaChyKTtcbiAgICBlbHNlIHNsaWNlcy5zZXQoeiwgW3JdKTtcbiAgfVxuICByZXR1cm4gc2xpY2VzO1xufVxuIl19
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLWxvYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Zpc3VhbGl6ZXIvcmVnaW9uLWxvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHVCQUF1QixFQUFnQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBaUJoRiw4R0FBOEc7QUFDOUcsTUFBTSxLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQTRCLENBQUM7QUFFdEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsSUFBZ0IsRUFDaEIsTUFBd0IsRUFDeEIsQ0FBUyxFQUNULGNBQWMsR0FBRyx1QkFBdUIsRUFDeEMsSUFBaUI7SUFFakIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2RCxNQUFNLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hCLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBK0IsRUFBa0IsRUFBRSxDQUNuRSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxjQUFjLENBQUM7SUFFdEQsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ2hDLG1GQUFtRjtRQUNuRixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixNQUFNLENBQUMsY0FBYyxDQUFD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QUFDO1FBQ25CLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsSUFBSSxNQUFNO1lBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFDdEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBJUmVnaW9uU3RvcmUgfSBmcm9tICcuLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBSZWdpb24gfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IG9wZW5IdHRwUmVnaW9uU291cmNlIH0gZnJvbSAnLi4vcmVnaW9uLXNvdXJjZS9odHRwLXJlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHsgUkVHSU9OX1NPVVJDRV9NSU5fQ0hBUlMsIFJlZ2lvblNvdXJjZSB9IGZyb20gJy4uL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXNvdXJjZSc7XG5pbXBvcnQgeyBvcGVuR2VvSnNvblJlZ2lvblNvdXJjZSB9IGZyb20gJy4uL3JlZ2lvbi1zb3VyY2Uvd29ya2VyLXJlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25Tb3VyY2VPcGVuZXIsIFJlZ2lvblNvdXJjZVNsaWNlcyB9IGZyb20gJy4uL3N0b3JlL3JlZ2lvbi1zb3VyY2Utc2NvcGUnO1xuXG4vKiogVGhlIHJlZ2lvbi1zdG9yZSBtZW1iZXJzIHtAbGluayBhcHBseUltYWdlUm9pc30gd3JpdGVzIHRocm91Z2guIEEgdGFyZ2V0IHdpdGhvdXRcbiAqICBgYXR0YWNoUmVnaW9uU291cmNlYCBsb2FkcyBldmVyeSBST0kgZmlsZSBhcyByZWdpb25zLiAqL1xuZXhwb3J0IHR5cGUgUmVnaW9uTG9hZFRhcmdldCA9IFBpY2s8XG4gIElSZWdpb25TdG9yZSxcbiAgJ2ltcG9ydFJlZ2lvbnMnIHwgJ2VudGVyU3RhY2tNb2RlJyB8ICdzZXRSZWdpb25zJyB8ICdyZXNldFVuZG9IaXN0b3J5J1xuPiAmIHtcbiAgYXR0YWNoUmVnaW9uU291cmNlPyhzb3VyY2U6IFJlZ2lvblNvdXJjZSB8IFJlZ2lvblNvdXJjZU9wZW5lciwgc2xpY2VzPzogUmVnaW9uU291cmNlU2xpY2VzKTogdm9pZDtcbiAgLyoqIFRoZSBzbGljZSBzaG93biBub3cgKHdoYXQgYSBzdGFjaydzIHNvdXJjZSwgbGFpZCBvdXQgb25jZSBpdCBvcGVucywgbWFrZXMgbGl2ZSkuICovXG4gIGdldERpc3BsYXlTbGljZT8oKTogbnVtYmVyO1xuICAvKiogUmVjb3JkIHRoZSBzbGljZSBzaG93biAob3V0c2lkZSBzdGFjayBtb2RlIGl0IG9ubHkgcmVjb3JkcyBpdCk6IHNlZSB7QGxpbmsgYXBwbHlJbWFnZVJvaXN9LiAqL1xuICBzZXREaXNwbGF5U2xpY2U/KHo6IG51bWJlcik6IHZvaWQ7XG4gIGlzU3RhY2tNb2RlPygpOiBib29sZWFuO1xufTtcblxuLyoqIFBlciB0YXJnZXQsIHRoZSBsYXRlc3Qge0BsaW5rIGFwcGx5SW1hZ2VSb2lzfTogYSBzdGFjayBzb3VyY2UgdGhhdCBvcGVucyBhZnRlciBhIGxhdGVyIGxvYWQgaXMgZHJvcHBlZC4gKi9cbmNvbnN0IGxvYWRzID0gbmV3IFdlYWtNYXA8UmVnaW9uTG9hZFRhcmdldCwgbnVtYmVyPigpO1xuXG4vKipcbiAqIEFwcGx5IGFuIGltYWdlJ3Mgc2F2ZWQgUk9JcyBvbmNlIGl0cyByZW5kZXIgaGFzIGxhbmRlZCwgY2hvb3NpbmcgdGhlIHJlZ2lvblxuICogbGF5b3V0IGZyb20gdGhlIGltYWdlJ3Mgc2hhcGU6XG4gKlxuICogIC0gKipGb2xkZXIgc3RhY2sqKiAoYGlzU3RhY2sgJiYgdGlsZWQgPT09IGZhbHNlYCwgc2VlIGxvYWRTZXJpZXNBc1N0YWNrKTogYSBzdGFja1xuICogICAgb2Ygc2VsZi1jb250YWluZWQgcGVyLXNsaWNlIGZpbGVzLiBFYWNoIHNsaWNlLWZpbGUgbWF5IGNhcnJ5IGl0cyBvd24gc2libGluZ1xuICogICAgYDxzdGVtPi5nZW9qc29uYCAoYHJvaUpzb25TdHJzW3pdYCksIGJ1dCBhIGZyZXNoIGZvbGRlciB3aXRoIG5vbmUgeWV0IGxlYXZlc1xuICogICAgYHJvaUpzb25TdHJzYCB1bmRlZmluZWQg4oCUIHNvIHRoaXMga2V5cyBvZmYgYHRpbGVkID09PSBmYWxzZWAsIE5PVCBgcm9pSnNvblN0cnNgLFxuICogICAgYW5kIGFuIHVuYW5ub3RhdGVkIGZvbGRlciBzdGFjayBzdGlsbCBlbnRlcnMgdGhlIHBlci1zbGljZS1maWxlIGxheW91dCAoc2F2aW5nXG4gKiAgICBiYWNrIG9uZSBnZW9qc29uIHBlciBzbGljZS1maWxlKSByYXRoZXIgdGhhbiB0aGUgY29tYmluZWQgb25lIChqaXQtdWkjOTMpLlxuICogIC0gKipTaW5nbGUtZmlsZSB6LXN0YWNrKio6IG9uZSBzaWJsaW5nIGdlb2pzb24gaG9sZGluZyBldmVyeSBzbGljZSdzIHJlZ2lvbnMsXG4gKiAgICBpbmRleGVkIGJ5IFF1UGF0aCdzIGBnZW9tZXRyeS5wbGFuZS56YC4gUGVyLXNsaWNlIChjb21iaW5lZCkgbW9kZSBpcyBlbnRlcmVkIHdoZW5cbiAqICAgIHRoZSBnZW9qc29uIGFjdHVhbGx5IGNhcnJpZXMgc2xpY2UgaW5kaWNlcywgb3Igd2hlbiB0aGVyZSBpcyBub3RoaW5nIHlldCB0b1xuICogICAgYXV0aG9yIGFnYWluc3QuIEEgbGVnYWN5IGdlb2pzb24gd2hvc2UgcmVnaW9ucyBhcmUgYWxsIG9uIHRoZSBkZWZhdWx0IHBsYW5lXG4gKiAgICBzdGF5cyBnbG9iYWwgKHNob3duIG9uIGV2ZXJ5IHNsaWNlKSwgc28gZXhpc3Rpbmcgc2luZ2xlLXBsYW5lIGFubm90YXRpb25zIGFyZVxuICogICAgbm90IGNvbmZpbmVkIHRvIHNsaWNlIDAuXG4gKiAgLSAqKlNpbmdsZSBwbGFuZSoqIChvciB0aGF0IGxlZ2FjeSBnbG9iYWwgc3RhY2spOiBvbmUgcmVnaW9uIHNldCBmb3IgdGhlIGltYWdlLlxuICogICAgTG9hZGluZyBzYXZlZCBST0lzIGlzIG5vdCBhIHVzZXIgZWRpdCwgc28gdGhlIHVuZG8gaGlzdG9yeSBzdGFydHMgZnJlc2ggYW5kIHRoZVxuICogICAgZmlyc3QgdW5kbyBjYW5ub3Qgd2lwZSB0aGVtIChqaXQtdWkjODUpLlxuICpcbiAqIExhcmdlIFJPSSBmaWxlcyAoYG1pblNvdXJjZUNoYXJzYCBhbmQgdXApIGFuZCBhIHNlcnZlci1zaWRlIHNvdXJjZSAoYHJlZ2lvblNvdXJjZVVybGApXG4gKiBiZWNvbWUgdGlsZWQgcmVnaW9uIHNvdXJjZXMgaW5zdGVhZCBvZiByZWdpb25zOyBhIHotaW5kZXhlZCBvbmUgc2VydmVzIGVhY2ggc2xpY2UgaXRzIG93blxuICogcGxhbmUuIE9uIGEgc2luZ2xlLWZpbGUgc3RhY2sgdGhlIHNvdXJjZSBpcyBvcGVuZWQgZmlyc3QsIHRvIHRlbGwgd2hpY2g6IG9uZSBvbiB0aGUgZGVmYXVsdFxuICogcGxhbmUgb25seSBzdGF5cyBnbG9iYWwsIGFzIGl0cyByZWdpb25zIHdvdWxkLiBBIGZvbGRlciBzdGFjaydzIHNvdXJjZXMgb3BlbiBsYXppbHksIHRoZSBmaXJzdFxuICogdGltZSB0aGVpciBzbGljZSBpcyBzaG93bi5cbiAqXG4gKiBgemAgaXMgdGhlIHNsaWNlIHNob3duIG5vdzsgZW50ZXJpbmcgc3RhY2sgbW9kZSBtYWtlcyBpdCBsaXZlIGFuZCByZXNldHMgdW5kby4gYGh0dHBgLCB0aGVcbiAqIGhvc3QncyBgSHR0cENsaWVudGAsIGNhcnJpZXMgYSBzZXJ2ZXItc2lkZSBzb3VyY2UncyByZXF1ZXN0cywgc28gdGhlIGhvc3QncyBpbnRlcmNlcHRvcnMgKGl0c1xuICogYXV0aCkgYXBwbHkgdG8gdGhlbSBhcyB0byB0aGUgaW1hZ2UgdGlsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUltYWdlUm9pcyhcbiAgaW5mbzogSUltYWdlSW5mbyxcbiAgdGFyZ2V0OiBSZWdpb25Mb2FkVGFyZ2V0LFxuICB6OiBudW1iZXIsXG4gIG1pblNvdXJjZUNoYXJzID0gUkVHSU9OX1NPVVJDRV9NSU5fQ0hBUlMsXG4gIGh0dHA/OiBIdHRwQ2xpZW50LFxuKTogdm9pZCB7XG4gIGNvbnN0IGF0dGFjaCA9IHRhcmdldC5hdHRhY2hSZWdpb25Tb3VyY2U/LmJpbmQodGFyZ2V0KTtcbiAgY29uc3QgbG9hZCA9IChsb2Fkcy5nZXQodGFyZ2V0KSA/PyAwKSArIDE7XG4gIGxvYWRzLnNldCh0YXJnZXQsIGxvYWQpO1xuICBjb25zdCBhc1NvdXJjZSA9IChqc29uOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKToganNvbiBpcyBzdHJpbmcgPT5cbiAgICAhIWF0dGFjaCAmJiAhIWpzb24gJiYganNvbi5sZW5ndGggPj0gbWluU291cmNlQ2hhcnM7XG5cbiAgaWYgKGluZm8ucmVnaW9uU2xpY2VzICYmIGF0dGFjaCkge1xuICAgIC8vIEFuIGltYWdlIGJ1aWx0IGZyb20gYW5ub3RhdGlvbnM6IGl0cyByZWdpb25zIGFyZSBpdHMgb3duIHNvdXJjZXMsIG9uZSBwZXIgc2xpY2UuXG4gICAgaWYgKGluZm8uaXNTdGFjaykge1xuICAgICAgdGFyZ2V0LmVudGVyU3RhY2tNb2RlKG5ldyBNYXAoKSwgeiwgJ3Blci1zbGljZS1maWxlJyk7XG4gICAgICBmb3IgKGNvbnN0IFtzLCBvcGVuXSBvZiBpbmZvLnJlZ2lvblNsaWNlcykgYXR0YWNoKG9wZW4sIHsgc2xpY2U6IHMgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRhcmdldC5zZXRSZWdpb25zKFtdKTtcbiAgICB0YXJnZXQucmVzZXRVbmRvSGlzdG9yeSgpO1xuICAgIGNvbnN0IGZpcnN0ID0gaW5mby5yZWdpb25TbGljZXMuZ2V0KDApID8/IGluZm8ucmVnaW9uU2xpY2VzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICBpZiAoZmlyc3QpIGF0dGFjaChmaXJzdCwgeyBzbGljZTogMCB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaW5mby5pc1N0YWNrICYmIGluZm8udGlsZWQgPT09IGZhbHNlKSB7XG4gICAgY29uc3QgcGVyU2xpY2UgPSBpbmZvLnJvaUpzb25TdHJzO1xuICAgIGNvbnN0IHNsaWNlQ291bnQgPSBpbmZvLnVybHM/Lmxlbmd0aCA/PyBwZXJTbGljZT8ubGVuZ3RoID8/IDA7XG4gICAgY29uc3Qgc2xpY2VzID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgIGNvbnN0IHNvdXJjZWQ6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgcyA9IDA7IHMgPCBzbGljZUNvdW50OyBzKyspIHtcbiAgICAgIGNvbnN0IGpzb24gPSBwZXJTbGljZT8uW3NdID8/IG51bGw7XG4gICAgICBpZiAoYXNTb3VyY2UoanNvbikpIHNvdXJjZWQucHVzaChzKTtcbiAgICAgIHNsaWNlcy5zZXQocywganNvbiAmJiAhYXNTb3VyY2UoanNvbikgPyB0YXJnZXQuaW1wb3J0UmVnaW9ucyhqc29uKSA6IFtdKTtcbiAgICB9XG4gICAgdGFyZ2V0LmVudGVyU3RhY2tNb2RlKHNsaWNlcywgeiwgJ3Blci1zbGljZS1maWxlJyk7XG4gICAgZm9yIChjb25zdCBzIG9mIHNvdXJjZWQpIGF0dGFjaD8uKCgpID0+IG9wZW5HZW9Kc29uUmVnaW9uU291cmNlKHBlclNsaWNlPy5bc10gYXMgc3RyaW5nKSwgeyBzbGljZTogcyB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByb2lKc29uID0gaW5mby5yb2lKc29uU3RyO1xuICBpZiAoYXR0YWNoICYmIChpbmZvLnJlZ2lvblNvdXJjZVVybCB8fCBhc1NvdXJjZShyb2lKc29uKSkpIHtcbiAgICBjb25zdCB1cmwgPSBpbmZvLnJlZ2lvblNvdXJjZVVybDtcbiAgICBjb25zdCBvcGVuOiBSZWdpb25Tb3VyY2VPcGVuZXIgPSB1cmxcbiAgICAgID8gKCkgPT4gb3Blbkh0dHBSZWdpb25Tb3VyY2UodXJsLCB7IGh0dHAgfSlcbiAgICAgIDogKCkgPT4gb3Blbkdlb0pzb25SZWdpb25Tb3VyY2Uocm9pSnNvbiBhcyBzdHJpbmcpO1xuICAgIC8vIEFzIGxvYWRpbmcgYSBmaWxlIG9mIHJlZ2lvbnMgcmVwbGFjZXMgdGhlIHJlZ2lvbnMsIGEgc291cmNlIHN0YXJ0cyB0aGUgaW1hZ2UgYWZyZXNoLlxuICAgIHRhcmdldC5zZXRSZWdpb25zKFtdKTtcbiAgICB0YXJnZXQucmVzZXRVbmRvSGlzdG9yeSgpO1xuICAgIGlmICghaW5mby5pc1N0YWNrKSB7XG4gICAgICBhdHRhY2gob3BlbiwgeyBzbGljZTogMCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQSBzdGFjazogcGVyIHNsaWNlIHdoZW4gdGhlIHNvdXJjZSBpcyB6LWluZGV4ZWQsIGVsc2UgZ2xvYmFsIChhcyBpdHMgcmVnaW9ucyB3b3VsZCBiZSkuXG4gICAgLy8gVGhlIHN0b3JlIGxlYXJucyB0aGUgc2xpY2UgdGhlIGltYWdlIG9wZW5lZCBvbiAoYSBob3N0IG1heSBvcGVuIGEgc3RhY2sgb24gYW55IHNsaWNlKSwgc29cbiAgICAvLyB0aGUgc291cmNlLCBsYWlkIG91dCBvbiB0aGUgc3RvcmUncyBzbGljZSBvbmNlIGl0IG9wZW5zLCBzaG93cyB0aGF0IG9uZTsgYSBzY3J1YiBtZWFud2hpbGVcbiAgICAvLyByZWNvcmRzIGl0cyBvd24sIHdoaWNoIHRoZW4gd2lucy5cbiAgICBpZiAoIXRhcmdldC5pc1N0YWNrTW9kZT8uKCkpIHRhcmdldC5zZXREaXNwbGF5U2xpY2U/Lih6KTtcbiAgICBsZXQgZmlyc3Q6IFByb21pc2U8UmVnaW9uU291cmNlPiB8IG51bGwgPSBvcGVuKCk7XG4gICAgY29uc3QgcmV1c2U6IFJlZ2lvblNvdXJjZU9wZW5lciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IG9wZW5pbmcgPSBmaXJzdDtcbiAgICAgIGZpcnN0ID0gbnVsbDtcbiAgICAgIHJldHVybiBvcGVuaW5nID8/IG9wZW4oKTtcbiAgICB9O1xuICAgIGNvbnN0IGxheSA9ICh6SW5kZXhlZDogYm9vbGVhbikgPT4ge1xuICAgICAgaWYgKGxvYWRzLmdldCh0YXJnZXQpICE9PSBsb2FkKSB7XG4gICAgICAgIHZvaWQgZmlyc3Q/LnRoZW4oXG4gICAgICAgICAgKHNvdXJjZSkgPT4gc291cmNlLmRpc3Bvc2UoKSxcbiAgICAgICAgICAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh6SW5kZXhlZCkge1xuICAgICAgICB0YXJnZXQuZW50ZXJTdGFja01vZGUobmV3IE1hcCgpLCB0YXJnZXQuZ2V0RGlzcGxheVNsaWNlPy4oKSA/PyB6LCAnY29tYmluZWQnKTtcbiAgICAgICAgYXR0YWNoKHJldXNlLCAncGxhbmVzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdHRhY2gocmV1c2UsIHsgc2xpY2U6IDAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyBPbmUgdGhhdCBjYW5ub3QgYmUgb3BlbmVkIGlzIGF0dGFjaGVkIGFzIGEgc2luZ2xlIHBsYW5lIChpdHMgc2xpY2UgcmVwb3J0cyB0aGUgZmFpbHVyZSkuXG4gICAgZmlyc3QudGhlbihcbiAgICAgIChzb3VyY2UpID0+IGxheShzb3VyY2UuaW5mby5wbGFuZXMuc29tZSgocCkgPT4gcCAhPT0gMCkpLFxuICAgICAgKCkgPT4gbGF5KGZhbHNlKSxcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaW5mby5pc1N0YWNrKSB7XG4gICAgY29uc3QgcmVnaW9ucyA9IHJvaUpzb24gPyB0YXJnZXQuaW1wb3J0UmVnaW9ucyhyb2lKc29uKSA6IFtdO1xuICAgIGlmICghcm9pSnNvbiB8fCByZWdpb25zLnNvbWUoKHIpID0+IChyLnogPz8gMCkgIT09IDApKSB7XG4gICAgICB0YXJnZXQuZW50ZXJTdGFja01vZGUoYnlTbGljZShyZWdpb25zKSwgeiwgJ2NvbWJpbmVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIGlmIChyb2lKc29uKSB0YXJnZXQuc2V0UmVnaW9ucyh0YXJnZXQuaW1wb3J0UmVnaW9ucyhyb2lKc29uKSk7XG4gIHRhcmdldC5yZXNldFVuZG9IaXN0b3J5KCk7XG59XG5cbi8qKiBCdWNrZXQgcmVnaW9ucyBieSB0aGVpciB6ZXJvLWJhc2VkIHtAbGluayBSZWdpb24uen0gKHVuc2V0ID0gc2xpY2UgMCkuICovXG5mdW5jdGlvbiBieVNsaWNlKHJlZ2lvbnM6IFJlZ2lvbltdKTogTWFwPG51bWJlciwgUmVnaW9uW10+IHtcbiAgY29uc3Qgc2xpY2VzID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICBmb3IgKGNvbnN0IHIgb2YgcmVnaW9ucykge1xuICAgIGNvbnN0IHogPSByLnogPz8gMDtcbiAgICBjb25zdCBidWNrZXQgPSBzbGljZXMuZ2V0KHopO1xuICAgIGlmIChidWNrZXQpIGJ1Y2tldC5wdXNoKHIpO1xuICAgIGVsc2Ugc2xpY2VzLnNldCh6LCBbcl0pO1xuICB9XG4gIHJldHVybiBzbGljZXM7XG59XG4iXX0=