@cogeotiff/core 7.0.0 → 7.1.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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,29 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [7.1.0](https://github.com/blacha/cogeotiff/compare/v7.0.0...v7.1.0) (2022-06-22)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **core:** load the ghost header bytes if requested ([b1f0116](https://github.com/blacha/cogeotiff/commit/b1f01164da1ad7deed7c3754e0106ccfea773338))
12
+
13
+
14
+ ### Features
15
+
16
+ * **core:** add hasTile function to determine if a tile exists in a sparse tiff ([e56a67c](https://github.com/blacha/cogeotiff/commit/e56a67cc078945c5d96ddd3e6aefbf2d773359a4))
17
+
18
+
19
+ ### Performance Improvements
20
+
21
+ * **core:** improve parsing of ghost options ([ffa7928](https://github.com/blacha/cogeotiff/commit/ffa79283a61efd6f9999bd43d222faa24cd5ced7))
22
+ * greatly increase the amount of tiles being read so nodejs startup time affects the timing less ([3e9c0f3](https://github.com/blacha/cogeotiff/commit/3e9c0f305584d95fd79e1fe094477f3589b235c6))
23
+ * **core:** improve lookup speed of ghost options ([7c5f37e](https://github.com/blacha/cogeotiff/commit/7c5f37e114a77a772ca588e62b6d22712d05b2bc))
24
+
25
+
26
+
27
+
28
+
6
29
  # [7.0.0](https://github.com/blacha/cogeotiff/compare/v6.1.1...v7.0.0) (2022-03-17)
7
30
 
8
31
 
@@ -1,9 +1,12 @@
1
+ import { SourceMemory } from '@chunkd/core';
2
+ import { readFile } from 'fs/promises';
1
3
  import { CogTiff } from '../cog.tiff.js';
2
- import { SourceFile } from '@chunkd/source-file';
3
4
  /** Read a tile from every image inside of a tiff 300 tiles read */
4
5
  async function main() {
5
- for (let i = 0; i < 50; i++) {
6
- const tiff = new CogTiff(new SourceFile(process.argv[process.argv.length - 1]));
6
+ const buf = await readFile(process.argv[process.argv.length - 1]);
7
+ const source = new SourceMemory('buf', buf);
8
+ for (let i = 0; i < 5000; i++) {
9
+ const tiff = new CogTiff(source);
7
10
  await tiff.init();
8
11
  // 6 images
9
12
  for (const img of tiff.images)
@@ -12,4 +15,4 @@ async function main() {
12
15
  }
13
16
  }
14
17
  main();
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLnJlYWQuYmVuY2htYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fYmVuY2htYXJrX18vY29nLnJlYWQuYmVuY2htYXJrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFakQsbUVBQW1FO0FBQ25FLEtBQUssVUFBVSxJQUFJO0lBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN6QixNQUFNLElBQUksR0FBRyxJQUFJLE9BQU8sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRixNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVsQixXQUFXO1FBQ1gsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkQsTUFBTSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDdEI7QUFDTCxDQUFDO0FBRUQsSUFBSSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb2dUaWZmIH0gZnJvbSAnLi4vY29nLnRpZmYuanMnO1xuaW1wb3J0IHsgU291cmNlRmlsZSB9IGZyb20gJ0BjaHVua2Qvc291cmNlLWZpbGUnO1xuXG4vKiogUmVhZCBhIHRpbGUgZnJvbSBldmVyeSBpbWFnZSBpbnNpZGUgb2YgYSB0aWZmIDMwMCB0aWxlcyByZWFkICovXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTA7IGkrKykge1xuICAgICAgICBjb25zdCB0aWZmID0gbmV3IENvZ1RpZmYobmV3IFNvdXJjZUZpbGUocHJvY2Vzcy5hcmd2W3Byb2Nlc3MuYXJndi5sZW5ndGggLSAxXSkpO1xuICAgICAgICBhd2FpdCB0aWZmLmluaXQoKTtcblxuICAgICAgICAvLyA2IGltYWdlc1xuICAgICAgICBmb3IgKGNvbnN0IGltZyBvZiB0aWZmLmltYWdlcykgYXdhaXQgaW1nLmdldFRpbGUoMCwgMCk7XG4gICAgICAgIGF3YWl0IHRpZmYuY2xvc2UoKTtcbiAgICB9XG59XG5cbm1haW4oKTtcbiJdfQ==
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLnJlYWQuYmVuY2htYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fYmVuY2htYXJrX18vY29nLnJlYWQuYmVuY2htYXJrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekMsbUVBQW1FO0FBQ25FLEtBQUssVUFBVSxJQUFJO0lBQ2YsTUFBTSxHQUFHLEdBQUcsTUFBTSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzVCLE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRWxCLFdBQVc7UUFDWCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2RCxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztLQUN0QjtBQUNMLENBQUM7QUFFRCxJQUFJLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNvdXJjZU1lbW9yeSB9IGZyb20gJ0BjaHVua2QvY29yZSc7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCB7IENvZ1RpZmYgfSBmcm9tICcuLi9jb2cudGlmZi5qcyc7XG5cbi8qKiBSZWFkIGEgdGlsZSBmcm9tIGV2ZXJ5IGltYWdlIGluc2lkZSBvZiBhIHRpZmYgMzAwIHRpbGVzIHJlYWQgKi9cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYnVmID0gYXdhaXQgcmVhZEZpbGUocHJvY2Vzcy5hcmd2W3Byb2Nlc3MuYXJndi5sZW5ndGggLSAxXSk7XG4gICAgY29uc3Qgc291cmNlID0gbmV3IFNvdXJjZU1lbW9yeSgnYnVmJywgYnVmKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDVfMDAwOyBpKyspIHtcbiAgICAgICAgY29uc3QgdGlmZiA9IG5ldyBDb2dUaWZmKHNvdXJjZSk7XG4gICAgICAgIGF3YWl0IHRpZmYuaW5pdCgpO1xuXG4gICAgICAgIC8vIDYgaW1hZ2VzXG4gICAgICAgIGZvciAoY29uc3QgaW1nIG9mIHRpZmYuaW1hZ2VzKSBhd2FpdCBpbWcuZ2V0VGlsZSgwLCAwKTtcbiAgICAgICAgYXdhaXQgdGlmZi5jbG9zZSgpO1xuICAgIH1cbn1cblxubWFpbigpO1xuIl19
@@ -5,7 +5,7 @@ import 'source-map-support/register.js';
5
5
  import { TestFileChunkSource } from '@chunkd/core/build/__test__/chunk.source.fake.js';
6
6
  import { CogTiff } from '../cog.tiff.js';
7
7
  import { TiffMimeType } from '../const/index.js';
8
- import { SourceMemory } from '@chunkd/core';
8
+ import { ByteSize, SourceMemory } from '@chunkd/core';
9
9
  import { fileURLToPath } from 'url';
10
10
  const __dirname = fileURLToPath(import.meta.url);
11
11
  // 900913 properties.
@@ -60,6 +60,14 @@ o.spec('CogTiled', () => {
60
60
  o(firstImage.stripCount).equals(0);
61
61
  o(firstImage.isTiled()).equals(true);
62
62
  });
63
+ o('should hasTile for every tile', async () => {
64
+ const [firstImage] = cog.images;
65
+ for (let x = 0; x < firstImage.tileCount.x; x++) {
66
+ for (let y = 0; y < firstImage.tileCount.y; y++) {
67
+ o(await firstImage.hasTile(x, y)).equals(true);
68
+ }
69
+ }
70
+ });
63
71
  });
64
72
  o.spec('Cog.Big', () => {
65
73
  o('should support reading from memory', async () => {
@@ -108,6 +116,8 @@ o.spec('Cog.Sparse', () => {
108
116
  o(tileCount).deepEquals({ x: 2, y: 2 });
109
117
  for (let x = 0; x < tileCount.x; x++) {
110
118
  for (let y = 0; y < tileCount.y; y++) {
119
+ const hasTile = await img.hasTile(x, y);
120
+ o(hasTile).equals(false);
111
121
  const tileXy = await img.getTile(x, y);
112
122
  const tileXyz = await cog.getTile(x, y, z);
113
123
  o(tileXy).equals(null)(`Tile x:${x} y:${y} should be empty`);
@@ -115,6 +125,20 @@ o.spec('Cog.Sparse', () => {
115
125
  }
116
126
  }
117
127
  });
128
+ o('should have ghost options', () => {
129
+ o(cog.options.options.size).equals(6);
130
+ o(cog.options.tileLeaderByteSize).equals(ByteSize.UInt32);
131
+ o(cog.options.isCogOptimized).equals(true);
132
+ const entries = [...cog.options.options.entries()];
133
+ o(entries).deepEquals([
134
+ ['GDAL_STRUCTURAL_METADATA_SIZE', '000140 bytes'],
135
+ ['LAYOUT', 'IFDS_BEFORE_DATA'],
136
+ ['BLOCK_ORDER', 'ROW_MAJOR'],
137
+ ['BLOCK_LEADER', 'SIZE_AS_UINT4'],
138
+ ['BLOCK_TRAILER', 'LAST_4_BYTES_REPEATED'],
139
+ ['KNOWN_INCOMPATIBLE_EDITION', 'NO'],
140
+ ]);
141
+ });
118
142
  });
119
143
  o.spec('CogStrip', () => {
120
144
  const cogSourceFile = new TestFileChunkSource(path.join(__dirname, '../../../data/rgba8_strip.tiff'));
@@ -152,4 +176,4 @@ o.spec('CogStrip', () => {
152
176
  o(stripB === null || stripB === void 0 ? void 0 : stripB.bytes.byteLength).equals(152);
153
177
  });
154
178
  });
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLmltYWdlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0X18vY29nLmltYWdlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxDQUFDLE1BQU0sT0FBTyxDQUFDO0FBQ3RCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxRQUFRLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXBDLE9BQU8sZ0NBQWdDLENBQUM7QUFFeEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDdkYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFcEMsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakQscUJBQXFCO0FBQ3JCLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUNwQixNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBRWxELFNBQVMsYUFBYSxDQUFDLElBQVk7SUFDL0IsT0FBTyxpQkFBaUIsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDO0FBQ3pDLENBQUM7QUFFRCxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7SUFDcEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUM7SUFDdEcsTUFB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QU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXhDLE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUMsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbyBmcm9tICdvc3BlYyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5cbmltcG9ydCAnc291cmNlLW1hcC1zdXBwb3J0L3JlZ2lzdGVyLmpzJztcblxuaW1wb3J0IHsgVGVzdEZpbGVDaHVua1NvdXJjZSB9IGZyb20gJ0BjaHVua2QvY29yZS9idWlsZC9fX3Rlc3RfXy9jaHVuay5zb3VyY2UuZmFrZS5qcyc7XG5pbXBvcnQgeyBDb2dUaWZmIH0gZnJvbSAnLi4vY29nLnRpZmYuanMnO1xuaW1wb3J0IHsgVGlmZk1pbWVUeXBlIH0gZnJvbSAnLi4vY29uc3QvaW5kZXguanMnO1xuaW1wb3J0IHsgU291cmNlTWVtb3J5IH0gZnJvbSAnQGNodW5rZC9jb3JlJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnO1xuXG5jb25zdCBfX2Rpcm5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG4vLyA5MDA5MTMgcHJvcGVydGllcy5cbmNvbnN0IEEgPSA2Mzc4MTM3LjA7XG5jb25zdCBJbml0aWFsUmVzb2x1dGlvbiA9ICgyICogTWF0aC5QSSAqIEEpIC8gMjU2O1xuXG5mdW5jdGlvbiBnZXRSZXNvbHV0aW9uKHpvb206IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIEluaXRpYWxSZXNvbHV0aW9uIC8gMiAqKiB6b29tO1xufVxuXG5vLnNwZWMoJ0NvZ1RpbGVkJywgKCkgPT4ge1xuICAgIGNvbnN0IGNvZ1NvdXJjZUZpbGUgPSBuZXcgVGVzdEZpbGVDaHVua1NvdXJjZShwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vLi4vZGF0YS9yZ2JhOF90aWxlZC50aWZmJykpO1xuICAgIGNvbnN0IGNvZyA9IG5ldyBDb2dUaWZmKGNvZ1NvdXJjZUZpbGUpO1xuXG4gICAgby5iZWZvcmVFYWNoKCgpID0+IGNvZy5pbml0KCkpO1xuXG4gICAgbygnc2hvdWxkIG1hdGNoIHJlc29sdXRpb25zIHRvIHdlYiBtZXJjYXRvciB6b29tIGxldmVscycsICgpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNDsgaSsrKSB7XG4gICAgICAgICAgICBvKGNvZy5nZXRJbWFnZUJ5UmVzb2x1dGlvbihnZXRSZXNvbHV0aW9uKGkpKS5pZCkuZXF1YWxzKDQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbyhjb2cuZ2V0SW1hZ2VCeVJlc29sdXRpb24oZ2V0UmVzb2x1dGlvbigxNCkpLmlkKS5lcXVhbHMoMyk7XG4gICAgICAgIG8oY29nLmdldEltYWdlQnlSZXNvbHV0aW9uKGdldFJlc29sdXRpb24oMTUpKS5pZCkuZXF1YWxzKDIpO1xuICAgICAgICBvKGNvZy5nZXRJbWFnZUJ5UmVzb2x1dGlvbihnZXRSZXNvbHV0aW9uKDE2KSkuaWQpLmVxdWFscygxKTtcbiAgICAgICAgbyhjb2cuZ2V0SW1hZ2VCeVJlc29sdXRpb24oZ2V0UmVzb2x1dGlvbigxNykpLmlkKS5lcXVhbHMoMCk7XG4gICAgICAgIG8oY29nLmdldEltYWdlQnlSZXNvbHV0aW9uKGdldFJlc29sdXRpb24oMTgpKS5pZCkuZXF1YWxzKDApO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAxOTsgaSA8IDMyOyBpKyspIHtcbiAgICAgICAgICAgIG8oY29nLmdldEltYWdlQnlSZXNvbHV0aW9uKGdldFJlc29sdXRpb24oaSkpLmlkKS5lcXVhbHMoMCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIG8oJ3Nob3VsZCBnZXQgb3JpZ2luIGZyb20gYWxsIGltYWdlcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgYmFzZU9yaWdpbiA9IGNvZy5pbWFnZXNbMF0ub3JpZ2luO1xuICAgICAgICBmb3IgKGNvbnN0IGltZyBvZiBjb2cuaW1hZ2VzKSB7XG4gICAgICAgICAgICBvKGltZy5vcmlnaW4pLmRlZXBFcXVhbHMoYmFzZU9yaWdpbik7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIG8oJ3Nob3VsZCBnZXQgYm91bmRpbmcgYm94IGZyb20gYWxsIGltYWdlcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgYmFzZU9yaWdpbiA9IGNvZy5pbWFnZXNbMF0uYmJveDtcbiAgICAgICAgZm9yIChjb25zdCBpbWcgb2YgY29nLmltYWdlcykge1xuICAgICAgICAgICAgbyhpbWcuYmJveCkuZGVlcEVxdWFscyhiYXNlT3JpZ2luKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgbygnc2hvdWxkIGJlIGdlb2xvY2F0ZWQnLCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgaW1nIG9mIGNvZy5pbWFnZXMpIG8oaW1nLmlzR2VvTG9jYXRlZCkuZXF1YWxzKHRydWUpO1xuICAgIH0pO1xuXG4gICAgbygnc2hvdWxkIHNjYWxlIGltYWdlIHJlc29sdXRpb24gZm9yIGFsbCBpbWFnZXMnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IFtyZXNYLCByZXNZLCByZXNaXSA9IGNvZy5pbWFnZXNbMF0ucmVzb2x1dGlvbjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2cuaW1hZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpbWcgPSBjb2cuaW1hZ2VzW2ldO1xuICAgICAgICAgICAgY29uc3Qgc2NhbGUgPSAyICoqIGk7IC8vIFRoaXMgdGlmZiBpcyBzY2FsZWQgYXQgYSBmYWN0b3Igb2YgdHdvIHBlciB6b29tIGxldmVsXG4gICAgICAgICAgICBvKGltZy5yZXNvbHV0aW9uKS5kZWVwRXF1YWxzKFtyZXNYICogc2NhbGUsIHJlc1kgKiBzY2FsZSwgcmVzWl0pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBvKCdzaG91bGQgaGF2ZSB0aWxlIGluZm9ybWF0aW9uJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBbZmlyc3RJbWFnZV0gPSBjb2cuaW1hZ2VzO1xuICAgICAgICBvKGZpcnN0SW1hZ2Uuc3RyaXBDb3VudCkuZXF1YWxzKDApO1xuICAgICAgICBvKGZpcnN0SW1hZ2UuaXNUaWxlZCgpKS5lcXVhbHModHJ1ZSk7XG4gICAgfSk7XG59KTtcblxuby5zcGVjKCdDb2cuQmlnJywgKCkgPT4ge1xuICAgIG8oJ3Nob3VsZCBzdXBwb3J0IHJlYWRpbmcgZnJvbSBtZW1vcnknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZ1bGxTb3VyY2UgPSBuZXcgVGVzdEZpbGVDaHVua1NvdXJjZShwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vLi4vZGF0YS9zcGFyc2UudGlmZicpKTtcbiAgICAgICAgZnVsbFNvdXJjZS5jaHVua1NpemUgPSAyNzkwMjtcbiAgICAgICAgYXdhaXQgZnVsbFNvdXJjZS5sb2FkQnl0ZXMoMCwgMjc5MDIpO1xuICAgICAgICBjb25zdCBjb2cgPSBuZXcgQ29nVGlmZihmdWxsU291cmNlKTtcbiAgICAgICAgYXdhaXQgY29nLmluaXQoKTtcblxuICAgICAgICBvKGZ1bGxTb3VyY2UuY2h1bmtTaXplKS5lcXVhbHMoMjc5MDIpO1xuICAgICAgICBvKGZ1bGxTb3VyY2UuY2h1bmtzLnNpemUpLmVxdWFscygxKTtcbiAgICAgICAgY29uc3QgW2ZpcnN0SW1hZ2VdID0gY29nLmltYWdlcztcbiAgICAgICAgbyhmaXJzdEltYWdlLnN0cmlwQ291bnQpLmVxdWFscygwKTtcbiAgICAgICAgbyhmaXJzdEltYWdlLmlzVGlsZWQoKSkuZXF1YWxzKHRydWUpO1xuXG4gICAgICAgIGNvbnN0IGltZyA9IGNvZy5nZXRJbWFnZSg0KTtcbiAgICAgICAgbyhpbWcudGlsZUNvdW50KS5kZWVwRXF1YWxzKHsgeDogMiwgeTogMiB9KTtcbiAgICB9KTtcblxuICAgIG8oJ3Nob3VsZCByZWFkIHVzaW5nIGEgbWVtb3J5IHNvdXJjZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnl0ZXMgPSBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vLi4vZGF0YS9zcGFyc2UudGlmZicpKTtcbiAgICAgICAgY29uc3Qgc291cmNlID0gbmV3IFNvdXJjZU1lbW9yeSgnU3BhcnNlLnRpZmYnLCBieXRlcy5idWZmZXIpO1xuICAgICAgICBjb25zdCBjb2cgPSBuZXcgQ29nVGlmZihzb3VyY2UpO1xuICAgICAgICBhd2FpdCBjb2cuaW5pdCgpO1xuXG4gICAgICAgIG8oc291cmNlLmNodW5rU2l6ZSkuZXF1YWxzKDI3OTAyKTtcbiAgICAgICAgbyhzb3VyY2UuY2h1bmtzLnNpemUpLmVxdWFscygxKTtcbiAgICAgICAgY29uc3QgW2ZpcnN0SW1hZ2VdID0gY29nLmltYWdlcztcbiAgICAgICAgbyhmaXJzdEltYWdlLnN0cmlwQ291bnQpLmVxdWFscygwKTtcbiAgICAgICAgbyhmaXJzdEltYWdlLmlzVGlsZWQoKSkuZXF1YWxzKHRydWUpO1xuXG4gICAgICAgIGNvbnN0IGltZyA9IGNvZy5nZXRJbWFnZSg0KTtcbiAgICAgICAgbyhpbWcudGlsZUNvdW50KS5kZWVwRXF1YWxzKHsgeDogMiwgeTogMiB9KTtcbiAgICB9KTtcbn0pO1xuXG5vLnNwZWMoJ0NvZy5TcGFyc2UnLCAoKSA9PiB7XG4gICAgY29uc3QgY29nU291cmNlRmlsZSA9IG5ldyBUZXN0RmlsZUNodW5rU291cmNlKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi8uLi9kYXRhL3NwYXJzZS50aWZmJykpO1xuICAgIGNvbnN0IGNvZyA9IG5ldyBDb2dUaWZmKGNvZ1NvdXJjZUZpbGUpO1xuICAgIG8uYmVmb3JlRWFjaCgoKSA9PiBjb2cuaW5pdCh0cnVlKSk7XG5cbiAgICBvKCdzaG91bGQgcmVhZCBtZXRhZGF0YScsICgpID0+IHtcbiAgICAgICAgbyhjb2cuZ2V0SW1hZ2UoMCkuZXBzZykuZXF1YWxzKDIxOTMpO1xuICAgIH0pO1xuXG4gICAgbygnc2hvdWxkIGJlIGdlb2xvY2F0ZWQnLCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgaW1nIG9mIGNvZy5pbWFnZXMpIG8oaW1nLmlzR2VvTG9jYXRlZCkuZXF1YWxzKHRydWUpO1xuICAgIH0pO1xuXG4gICAgbygnc2hvdWxkIHN1cHBvcnQgc3BhcnNlIGNvZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHogPSA0O1xuICAgICAgICBjb25zdCBpbWcgPSBjb2cuZ2V0SW1hZ2Uoeik7XG5cbiAgICAgICAgY29uc3QgeyB0aWxlQ291bnQgfSA9IGltZztcbiAgICAgICAgbyh0aWxlQ291bnQpLmRlZXBFcXVhbHMoeyB4OiAyLCB5OiAyIH0pO1xuXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGlsZUNvdW50Lng7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aWxlQ291bnQueTsgeSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZVh5ID0gYXdhaXQgaW1nLmdldFRpbGUoeCwgeSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZVh5eiA9IGF3YWl0IGNvZy5nZXRUaWxlKHgsIHksIHopO1xuICAgICAgICAgICAgICAgIG8odGlsZVh5KS5lcXVhbHMobnVsbCkoYFRpbGUgeDoke3h9IHk6JHt5fSBzaG91bGQgYmUgZW1wdHlgKTtcbiAgICAgICAgICAgICAgICBvKHRpbGVYeXopLmVxdWFscyhudWxsKShgVGlsZSB4OiR7eH0geToke3l9IHo6ICR7en0gc2hvdWxkIGJlIGVtcHR5YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuXG5vLnNwZWMoJ0NvZ1N0cmlwJywgKCkgPT4ge1xuICAgIGNvbnN0IGNvZ1NvdXJjZUZpbGUgPSBuZXcgVGVzdEZpbGVDaHVua1NvdXJjZShwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vLi4vZGF0YS9yZ2JhOF9zdHJpcC50aWZmJykpO1xuICAgIGNvbnN0IGNvZyA9IG5ldyBDb2dUaWZmKGNvZ1NvdXJjZUZpbGUpO1xuXG4gICAgby5iZWZvcmVFYWNoKCgpID0+IGNvZy5pbml0KCkpO1xuXG4gICAgbygnc2hvdWxkIGdldCBvcmlnaW4gZnJvbSBhbGwgaW1hZ2VzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBiYXNlT3JpZ2luID0gY29nLmltYWdlc1swXS5vcmlnaW47XG4gICAgICAgIGZvciAoY29uc3QgaW1nIG9mIGNvZy5pbWFnZXMpIHtcbiAgICAgICAgICAgIG8oaW1nLm9yaWdpbikuZGVlcEVxdWFscyhiYXNlT3JpZ2luKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgbygnc2hvdWxkIGdldCBib3VuZGluZyBib3ggZnJvbSBhbGwgaW1hZ2VzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBiYXNlT3JpZ2luID0gY29nLmltYWdlc1swXS5iYm94O1xuICAgICAgICBmb3IgKGNvbnN0IGltZyBvZiBjb2cuaW1hZ2VzKSB7XG4gICAgICAgICAgICBvKGltZy5iYm94KS5kZWVwRXF1YWxzKGJhc2VPcmlnaW4pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBvKCdzaG91bGQgc2NhbGUgaW1hZ2UgcmVzb2x1dGlvbiBmb3IgYWxsIGltYWdlcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgW3Jlc1gsIHJlc1ksIHJlc1pdID0gY29nLmltYWdlc1swXS5yZXNvbHV0aW9uO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZy5pbWFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGltZyA9IGNvZy5pbWFnZXNbaV07XG4gICAgICAgICAgICBjb25zdCBzY2FsZSA9IDIgKiogaTsgLy8gVGhpcyB0aWZmIGlzIHNjYWxlZCBhdCBhIGZhY3RvciBvZiB0d28gcGVyIHpvb20gbGV2ZWxcbiAgICAgICAgICAgIG8oaW1nLnJlc29sdXRpb24pLmRlZXBFcXVhbHMoW3Jlc1ggKiBzY2FsZSwgcmVzWSAqIHNjYWxlLCByZXNaXSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIG8oJ3Nob3VsZCBoYXZlIHN0cmlwIGluZm9ybWF0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBbZmlyc3RJbWFnZV0gPSBjb2cuaW1hZ2VzO1xuICAgICAgICBvKGZpcnN0SW1hZ2UuaXNUaWxlZCgpKS5lcXVhbHMoZmFsc2UpO1xuICAgICAgICBvKGZpcnN0SW1hZ2Uuc3RyaXBDb3VudCkuZXF1YWxzKDIpO1xuXG4gICAgICAgIGNvbnN0IHN0cmlwQSA9IGF3YWl0IGZpcnN0SW1hZ2UuZ2V0U3RyaXAoMCk7XG4gICAgICAgIG8oc3RyaXBBPy5taW1lVHlwZSkuZXF1YWxzKFRpZmZNaW1lVHlwZS5XRUJQKTtcbiAgICAgICAgbyhzdHJpcEE/LmJ5dGVzLmJ5dGVMZW5ndGgpLmVxdWFscygxNTIpO1xuXG4gICAgICAgIGNvbnN0IHN0cmlwQiA9IGF3YWl0IGZpcnN0SW1hZ2UuZ2V0U3RyaXAoMSk7XG4gICAgICAgIG8oc3RyaXBCPy5taW1lVHlwZSkuZXF1YWxzKFRpZmZNaW1lVHlwZS5XRUJQKTtcbiAgICAgICAgbyhzdHJpcEI/LmJ5dGVzLmJ5dGVMZW5ndGgpLmVxdWFscygxNTIpO1xuICAgIH0pO1xufSk7XG4iXX0=
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLmltYWdlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0X18vY29nLmltYWdlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxDQUFDLE1BQU0sT0FBTyxDQUFDO0FBQ3RCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxRQUFRLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXBDLE9BQU8sZ0NBQWdDLENBQUM7QUFFeEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDdkYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXBDLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pELHFCQUFxQjtBQUNyQixNQUFNLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDcEIsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUVsRCxTQUFTLGFBQWEsQ0FBQyxJQUFZO0lBQy9CLE9BQU8saUJBQWlCLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUN6QyxDQUFDO0FBRUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO0lBQ3BCLE1BQU0sYUFBYSxHQUFHLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQyxDQUFD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QUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkMsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFeEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBvIGZyb20gJ29zcGVjJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ2ZzJztcblxuaW1wb3J0ICdzb3VyY2UtbWFwLXN1cHBvcnQvcmVnaXN0ZXIuanMnO1xuXG5pbXBvcnQgeyBUZXN0RmlsZUNodW5rU291cmNlIH0gZnJvbSAnQGNodW5rZC9jb3JlL2J1aWxkL19fdGVzdF9fL2NodW5rLnNvdXJjZS5mYWtlLmpzJztcbmltcG9ydCB7IENvZ1RpZmYgfSBmcm9tICcuLi9jb2cudGlmZi5qcyc7XG5pbXBvcnQgeyBUaWZmTWltZVR5cGUgfSBmcm9tICcuLi9jb25zdC9pbmRleC5qcyc7XG5pbXBvcnQgeyBCeXRlU2l6ZSwgU291cmNlTWVtb3J5IH0gZnJvbSAnQGNodW5rZC9jb3JlJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnO1xuXG5jb25zdCBfX2Rpcm5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG4vLyA5MDA5MTMgcHJvcGVydGllcy5cbmNvbnN0IEEgPSA2Mzc4MTM3LjA7XG5jb25zdCBJbml0aWFsUmVzb2x1dGlvbiA9ICgyICogTWF0aC5QSSAqIEEpIC8gMjU2O1xuXG5mdW5jdGlvbiBnZXRSZXNvbHV0aW9uKHpvb206IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIEluaXRpYWxSZXNvbHV0aW9uIC8gMiAqKiB6b29tO1xufVxuXG5vLnNwZWMoJ0NvZ1RpbGVkJywgKCkgPT4ge1xuICAgIGNvbnN0IGNvZ1NvdXJjZUZpbGUgPSBuZXcgVGVzdEZpbGVDaHVua1NvdXJjZShwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vLi4vZGF0YS9yZ2JhOF90aWxlZC50aWZmJykpO1xuICAgIGNvbnN0IGNvZyA9IG5ldyBDb2dUaWZmKGNvZ1NvdXJjZUZpbGUpO1xuXG4gICAgby5iZWZvcmVFYWNoKCgpID0+IGNvZy5pbml0KCkpO1xuXG4gICAgbygnc2hvdWxkIG1hdGNoIHJlc29sdXRpb25zIHRvIHdlYiBtZXJjYXRvciB6b29tIGxldmVscycsICgpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNDsgaSsrKSB7XG4gICAgICAgICAgICBvKGNvZy5nZXRJbWFnZUJ5UmVzb2x1dGlvbihnZXRSZXNvbHV0aW9uKGkpKS5pZCkuZXF1YWxzKDQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbyhjb2cuZ2V0SW1hZ2VCeVJlc29sdXRpb24oZ2V0UmVzb2x1dGlvbigxNCkpLmlkKS5lcXVhbHMoMyk7XG4gICAgICAgIG8oY29nLmdldEltYWdlQnlSZXNvbHV0aW9uKGdldFJlc29sdXRpb24oMTUpKS5pZCkuZXF1YWxzKDIpO1xuICAgICAgICBvKGNvZy5nZXRJbWFnZUJ5UmVzb2x1dGlvbihnZXRSZXNvbHV0aW9uKDE2KSkuaWQpLmVxdWFscygxKTtcbiAgICAgICAgbyhjb2cuZ2V0SW1hZ2VCeVJlc29sdXRpb24oZ2V0UmVzb2x1dGlvbigxNykpLmlkKS5lcXVhbHMoMCk7XG4gICAgICAgIG8oY29nLmdldEltYWdlQnlSZXNvbHV0aW9uKGdldFJlc29sdXRpb24oMTgpKS5pZCkuZXF1YWxzKDApO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAxOTsgaSA8IDMyOyBpKyspIHtcbiAgICAgICAgICAgIG8oY29nLmdldEltYWdlQnlSZXNvbHV0aW9uKGdldFJlc29sdXRpb24oaSkpLmlkKS5lcXVhbHMoMCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIG8oJ3Nob3VsZCBnZXQgb3JpZ2luIGZyb20gYWxsIGltYWdlcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgYmFzZU9yaWdpbiA9IGNvZy5pbWFnZXNbMF0ub3JpZ2luO1xuICAgICAgICBmb3IgKGNvbnN0IGltZyBvZiBjb2cuaW1hZ2VzKSB7XG4gICAgICAgICAgICBvKGltZy5vcmlnaW4pLmRlZXBFcXVhbHMoYmFzZU9yaWdpbik7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIG8oJ3Nob3VsZCBnZXQgYm91bmRpbmcgYm94IGZyb20gYWxsIGltYWdlcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgYmFzZU9yaWdpbiA9IGNvZy5pbWFnZXNbMF0uYmJveDtcbiAgICAgICAgZm9yIChjb25zdCBpbWcgb2YgY29nLmltYWdlcykge1xuICAgICAgICAgICAgbyhpbWcuYmJveCkuZGVlcEVxdWFscyhiYXNlT3JpZ2luKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgbygnc2hvdWxkIGJlIGdlb2xvY2F0ZWQnLCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgaW1nIG9mIGNvZy5pbWFnZXMpIG8oaW1nLmlzR2VvTG9jYXRlZCkuZXF1YWxzKHRydWUpO1xuICAgIH0pO1xuXG4gICAgbygnc2hvdWxkIHNjYWxlIGltYWdlIHJlc29sdXRpb24gZm9yIGFsbCBpbWFnZXMnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IFtyZXNYLCByZXNZLCByZXNaXSA9IGNvZy5pbWFnZXNbMF0ucmVzb2x1dGlvbjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2cuaW1hZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpbWcgPSBjb2cuaW1hZ2VzW2ldO1xuICAgICAgICAgICAgY29uc3Qgc2NhbGUgPSAyICoqIGk7IC8vIFRoaXMgdGlmZiBpcyBzY2FsZWQgYXQgYSBmYWN0b3Igb2YgdHdvIHBlciB6b29tIGxldmVsXG4gICAgICAgICAgICBvKGltZy5yZXNvbHV0aW9uKS5kZWVwRXF1YWxzKFtyZXNYICogc2NhbGUsIHJlc1kgKiBzY2FsZSwgcmVzWl0pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBvKCdzaG91bGQgaGF2ZSB0aWxlIGluZm9ybWF0aW9uJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBbZmlyc3RJbWFnZV0gPSBjb2cuaW1hZ2VzO1xuICAgICAgICBvKGZpcnN0SW1hZ2Uuc3RyaXBDb3VudCkuZXF1YWxzKDApO1xuICAgICAgICBvKGZpcnN0SW1hZ2UuaXNUaWxlZCgpKS5lcXVhbHModHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBvKCdzaG91bGQgaGFzVGlsZSBmb3IgZXZlcnkgdGlsZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgW2ZpcnN0SW1hZ2VdID0gY29nLmltYWdlcztcblxuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGZpcnN0SW1hZ2UudGlsZUNvdW50Lng7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBmaXJzdEltYWdlLnRpbGVDb3VudC55OyB5KyspIHtcbiAgICAgICAgICAgICAgICBvKGF3YWl0IGZpcnN0SW1hZ2UuaGFzVGlsZSh4LCB5KSkuZXF1YWxzKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59KTtcblxuby5zcGVjKCdDb2cuQmlnJywgKCkgPT4ge1xuICAgIG8oJ3Nob3VsZCBzdXBwb3J0IHJlYWRpbmcgZnJvbSBtZW1vcnknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZ1bGxTb3VyY2UgPSBuZXcgVGVzdEZpbGVDaHVua1NvdXJjZShwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vLi4vZGF0YS9zcGFyc2UudGlmZicpKTtcbiAgICAgICAgZnVsbFNvdXJjZS5jaHVua1NpemUgPSAyNzkwMjtcbiAgICAgICAgYXdhaXQgZnVsbFNvdXJjZS5sb2FkQnl0ZXMoMCwgMjc5MDIpO1xuICAgICAgICBjb25zdCBjb2cgPSBuZXcgQ29nVGlmZihmdWxsU291cmNlKTtcbiAgICAgICAgYXdhaXQgY29nLmluaXQoKTtcblxuICAgICAgICBvKGZ1bGxTb3VyY2UuY2h1bmtTaXplKS5lcXVhbHMoMjc5MDIpO1xuICAgICAgICBvKGZ1bGxTb3VyY2UuY2h1bmtzLnNpemUpLmVxdWFscygxKTtcbiAgICAgICAgY29uc3QgW2ZpcnN0SW1hZ2VdID0gY29nLmltYWdlcztcbiAgICAgICAgbyhmaXJzdEltYWdlLnN0cmlwQ291bnQpLmVxdWFscygwKTtcbiAgICAgICAgbyhmaXJzdEltYWdlLmlzVGlsZWQoKSkuZXF1YWxzKHRydWUpO1xuXG4gICAgICAgIGNvbnN0IGltZyA9IGNvZy5nZXRJbWFnZSg0KTtcbiAgICAgICAgbyhpbWcudGlsZUNvdW50KS5kZWVwRXF1YWxzKHsgeDogMiwgeTogMiB9KTtcbiAgICB9KTtcblxuICAgIG8oJ3Nob3VsZCByZWFkIHVzaW5nIGEgbWVtb3J5IHNvdXJjZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnl0ZXMgPSBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vLi4vZGF0YS9zcGFyc2UudGlmZicpKTtcbiAgICAgICAgY29uc3Qgc291cmNlID0gbmV3IFNvdXJjZU1lbW9yeSgnU3BhcnNlLnRpZmYnLCBieXRlcy5idWZmZXIpO1xuICAgICAgICBjb25zdCBjb2cgPSBuZXcgQ29nVGlmZihzb3VyY2UpO1xuICAgICAgICBhd2FpdCBjb2cuaW5pdCgpO1xuXG4gICAgICAgIG8oc291cmNlLmNodW5rU2l6ZSkuZXF1YWxzKDI3OTAyKTtcbiAgICAgICAgbyhzb3VyY2UuY2h1bmtzLnNpemUpLmVxdWFscygxKTtcbiAgICAgICAgY29uc3QgW2ZpcnN0SW1hZ2VdID0gY29nLmltYWdlcztcbiAgICAgICAgbyhmaXJzdEltYWdlLnN0cmlwQ291bnQpLmVxdWFscygwKTtcbiAgICAgICAgbyhmaXJzdEltYWdlLmlzVGlsZWQoKSkuZXF1YWxzKHRydWUpO1xuXG4gICAgICAgIGNvbnN0IGltZyA9IGNvZy5nZXRJbWFnZSg0KTtcbiAgICAgICAgbyhpbWcudGlsZUNvdW50KS5kZWVwRXF1YWxzKHsgeDogMiwgeTogMiB9KTtcbiAgICB9KTtcbn0pO1xuXG5vLnNwZWMoJ0NvZy5TcGFyc2UnLCAoKSA9PiB7XG4gICAgY29uc3QgY29nU291cmNlRmlsZSA9IG5ldyBUZXN0RmlsZUNodW5rU291cmNlKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi8uLi9kYXRhL3NwYXJzZS50aWZmJykpO1xuICAgIGNvbnN0IGNvZyA9IG5ldyBDb2dUaWZmKGNvZ1NvdXJjZUZpbGUpO1xuICAgIG8uYmVmb3JlRWFjaCgoKSA9PiBjb2cuaW5pdCh0cnVlKSk7XG5cbiAgICBvKCdzaG91bGQgcmVhZCBtZXRhZGF0YScsICgpID0+IHtcbiAgICAgICAgbyhjb2cuZ2V0SW1hZ2UoMCkuZXBzZykuZXF1YWxzKDIxOTMpO1xuICAgIH0pO1xuXG4gICAgbygnc2hvdWxkIGJlIGdlb2xvY2F0ZWQnLCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgaW1nIG9mIGNvZy5pbWFnZXMpIG8oaW1nLmlzR2VvTG9jYXRlZCkuZXF1YWxzKHRydWUpO1xuICAgIH0pO1xuXG4gICAgbygnc2hvdWxkIHN1cHBvcnQgc3BhcnNlIGNvZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHogPSA0O1xuICAgICAgICBjb25zdCBpbWcgPSBjb2cuZ2V0SW1hZ2Uoeik7XG5cbiAgICAgICAgY29uc3QgeyB0aWxlQ291bnQgfSA9IGltZztcbiAgICAgICAgbyh0aWxlQ291bnQpLmRlZXBFcXVhbHMoeyB4OiAyLCB5OiAyIH0pO1xuXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGlsZUNvdW50Lng7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aWxlQ291bnQueTsgeSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzVGlsZSA9IGF3YWl0IGltZy5oYXNUaWxlKHgsIHkpO1xuICAgICAgICAgICAgICAgIG8oaGFzVGlsZSkuZXF1YWxzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlWHkgPSBhd2FpdCBpbWcuZ2V0VGlsZSh4LCB5KTtcbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlWHl6ID0gYXdhaXQgY29nLmdldFRpbGUoeCwgeSwgeik7XG4gICAgICAgICAgICAgICAgbyh0aWxlWHkpLmVxdWFscyhudWxsKShgVGlsZSB4OiR7eH0geToke3l9IHNob3VsZCBiZSBlbXB0eWApO1xuICAgICAgICAgICAgICAgIG8odGlsZVh5eikuZXF1YWxzKG51bGwpKGBUaWxlIHg6JHt4fSB5OiR7eX0gejogJHt6fSBzaG91bGQgYmUgZW1wdHlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgbygnc2hvdWxkIGhhdmUgZ2hvc3Qgb3B0aW9ucycsICgpID0+IHtcbiAgICAgICAgbyhjb2cub3B0aW9ucy5vcHRpb25zLnNpemUpLmVxdWFscyg2KTtcbiAgICAgICAgbyhjb2cub3B0aW9ucy50aWxlTGVhZGVyQnl0ZVNpemUpLmVxdWFscyhCeXRlU2l6ZS5VSW50MzIpO1xuICAgICAgICBvKGNvZy5vcHRpb25zLmlzQ29nT3B0aW1pemVkKS5lcXVhbHModHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgZW50cmllcyA9IFsuLi5jb2cub3B0aW9ucy5vcHRpb25zLmVudHJpZXMoKV07XG4gICAgICAgIG8oZW50cmllcykuZGVlcEVxdWFscyhbXG4gICAgICAgICAgICBbJ0dEQUxfU1RSVUNUVVJBTF9NRVRBREFUQV9TSVpFJywgJzAwMDE0MCBieXRlcyddLFxuICAgICAgICAgICAgWydMQVlPVVQnLCAnSUZEU19CRUZPUkVfREFUQSddLFxuICAgICAgICAgICAgWydCTE9DS19PUkRFUicsICdST1dfTUFKT1InXSxcbiAgICAgICAgICAgIFsnQkxPQ0tfTEVBREVSJywgJ1NJWkVfQVNfVUlOVDQnXSxcbiAgICAgICAgICAgIFsnQkxPQ0tfVFJBSUxFUicsICdMQVNUXzRfQllURVNfUkVQRUFURUQnXSxcbiAgICAgICAgICAgIFsnS05PV05fSU5DT01QQVRJQkxFX0VESVRJT04nLCAnTk8nXSxcbiAgICAgICAgXSk7XG4gICAgfSk7XG59KTtcblxuby5zcGVjKCdDb2dTdHJpcCcsICgpID0+IHtcbiAgICBjb25zdCBjb2dTb3VyY2VGaWxlID0gbmV3IFRlc3RGaWxlQ2h1bmtTb3VyY2UocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uLy4uL2RhdGEvcmdiYThfc3RyaXAudGlmZicpKTtcbiAgICBjb25zdCBjb2cgPSBuZXcgQ29nVGlmZihjb2dTb3VyY2VGaWxlKTtcblxuICAgIG8uYmVmb3JlRWFjaCgoKSA9PiBjb2cuaW5pdCgpKTtcblxuICAgIG8oJ3Nob3VsZCBnZXQgb3JpZ2luIGZyb20gYWxsIGltYWdlcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgYmFzZU9yaWdpbiA9IGNvZy5pbWFnZXNbMF0ub3JpZ2luO1xuICAgICAgICBmb3IgKGNvbnN0IGltZyBvZiBjb2cuaW1hZ2VzKSB7XG4gICAgICAgICAgICBvKGltZy5vcmlnaW4pLmRlZXBFcXVhbHMoYmFzZU9yaWdpbik7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIG8oJ3Nob3VsZCBnZXQgYm91bmRpbmcgYm94IGZyb20gYWxsIGltYWdlcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgYmFzZU9yaWdpbiA9IGNvZy5pbWFnZXNbMF0uYmJveDtcbiAgICAgICAgZm9yIChjb25zdCBpbWcgb2YgY29nLmltYWdlcykge1xuICAgICAgICAgICAgbyhpbWcuYmJveCkuZGVlcEVxdWFscyhiYXNlT3JpZ2luKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgbygnc2hvdWxkIHNjYWxlIGltYWdlIHJlc29sdXRpb24gZm9yIGFsbCBpbWFnZXMnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IFtyZXNYLCByZXNZLCByZXNaXSA9IGNvZy5pbWFnZXNbMF0ucmVzb2x1dGlvbjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2cuaW1hZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpbWcgPSBjb2cuaW1hZ2VzW2ldO1xuICAgICAgICAgICAgY29uc3Qgc2NhbGUgPSAyICoqIGk7IC8vIFRoaXMgdGlmZiBpcyBzY2FsZWQgYXQgYSBmYWN0b3Igb2YgdHdvIHBlciB6b29tIGxldmVsXG4gICAgICAgICAgICBvKGltZy5yZXNvbHV0aW9uKS5kZWVwRXF1YWxzKFtyZXNYICogc2NhbGUsIHJlc1kgKiBzY2FsZSwgcmVzWl0pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBvKCdzaG91bGQgaGF2ZSBzdHJpcCBpbmZvcm1hdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgW2ZpcnN0SW1hZ2VdID0gY29nLmltYWdlcztcbiAgICAgICAgbyhmaXJzdEltYWdlLmlzVGlsZWQoKSkuZXF1YWxzKGZhbHNlKTtcbiAgICAgICAgbyhmaXJzdEltYWdlLnN0cmlwQ291bnQpLmVxdWFscygyKTtcblxuICAgICAgICBjb25zdCBzdHJpcEEgPSBhd2FpdCBmaXJzdEltYWdlLmdldFN0cmlwKDApO1xuICAgICAgICBvKHN0cmlwQT8ubWltZVR5cGUpLmVxdWFscyhUaWZmTWltZVR5cGUuV0VCUCk7XG4gICAgICAgIG8oc3RyaXBBPy5ieXRlcy5ieXRlTGVuZ3RoKS5lcXVhbHMoMTUyKTtcblxuICAgICAgICBjb25zdCBzdHJpcEIgPSBhd2FpdCBmaXJzdEltYWdlLmdldFN0cmlwKDEpO1xuICAgICAgICBvKHN0cmlwQj8ubWltZVR5cGUpLmVxdWFscyhUaWZmTWltZVR5cGUuV0VCUCk7XG4gICAgICAgIG8oc3RyaXBCPy5ieXRlcy5ieXRlTGVuZ3RoKS5lcXVhbHMoMTUyKTtcbiAgICB9KTtcbn0pO1xuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"cog.tiff.d.ts","sourceRoot":"","sources":["../src/cog.tiff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAmC,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAK3F,qBAAa,OAAO;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,cAAoB;IAC3B,MAAM,EAAE,YAAY,EAAE,CAAM;IAC5B,OAAO,qBAA4B;IAEnC,OAAO,CAAC,MAAM,CAAkB;IAChC,SAAS,EAAE,aAAa,CAAiB;gBAE7B,MAAM,EAAE,WAAW;IAK/B,sCAAsC;IACtC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpD,6BAA6B;IAC7B,aAAa,UAAS;IAEtB,YAAY,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC;;;;OAIG;IACH,IAAI,CAAC,WAAW,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;YAM7B,MAAM;YAWN,QAAQ;IAkCtB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY;IAIjC;;;;OAIG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY;IAoBtD;;;;;;;;OAQG;IACG,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;YAQ7F,UAAU;YASV,OAAO;IAqBrB,gDAAgD;IAC1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
1
+ {"version":3,"file":"cog.tiff.d.ts","sourceRoot":"","sources":["../src/cog.tiff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAmC,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAK3F,qBAAa,OAAO;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,cAAoB;IAC3B,MAAM,EAAE,YAAY,EAAE,CAAM;IAC5B,OAAO,qBAA4B;IAEnC,OAAO,CAAC,MAAM,CAAkB;IAChC,SAAS,EAAE,aAAa,CAAiB;gBAE7B,MAAM,EAAE,WAAW;IAK/B,sCAAsC;IACtC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpD,6BAA6B;IAC7B,aAAa,UAAS;IAEtB,YAAY,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC;;;;OAIG;IACH,IAAI,CAAC,WAAW,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;YAM7B,MAAM;YAWN,QAAQ;IA4BtB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY;IAIjC;;;;OAIG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY;IAoBtD;;;;;;;;OAQG;IACG,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;YAQ7F,UAAU;YAOV,OAAO;IAsBrB,gDAAgD;IAC1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
@@ -163,6 +163,16 @@ export declare class CogTiffImage {
163
163
  mimeType: TiffMimeType;
164
164
  bytes: Uint8Array;
165
165
  } | null>;
166
+ /**
167
+ * Does this tile exist in the tiff and does it actually have a value
168
+ *
169
+ * Sparse tiffs can have a lot of empty tiles, this checks to see if the tile actually has data.
170
+ *
171
+ * @param x Tile x offset
172
+ * @param y Tile y offset
173
+ * @returns if the tile exists and has data
174
+ */
175
+ hasTile(x: number, y: number): Promise<boolean>;
166
176
  protected getTileSize(index: number): Promise<{
167
177
  offset: number;
168
178
  imageSize: number;
@@ -1 +1 @@
1
- {"version":3,"file":"cog.tiff.image.d.ts","sourceRoot":"","sources":["../src/cog.tiff.image.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cog.tiff.image.d.ts","sourceRoot":"","sources":["../src/cog.tiff.image.ts"],"names":[],"mappings":"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"}
@@ -376,15 +376,38 @@ export class CogTiffImage {
376
376
  const { offset, imageSize } = await this.getTileSize(idx);
377
377
  return this.getBytes(offset, imageSize);
378
378
  }
379
+ /**
380
+ * Does this tile exist in the tiff and does it actually have a value
381
+ *
382
+ * Sparse tiffs can have a lot of empty tiles, this checks to see if the tile actually has data.
383
+ *
384
+ * @param x Tile x offset
385
+ * @param y Tile y offset
386
+ * @returns if the tile exists and has data
387
+ */
388
+ async hasTile(x, y) {
389
+ const tiles = this.tileSize;
390
+ const size = this.size;
391
+ if (tiles == null)
392
+ throw new Error('Tiff is not tiled');
393
+ // TODO support GhostOptionTileOrder
394
+ const nyTiles = Math.ceil(size.height / tiles.height);
395
+ const nxTiles = Math.ceil(size.width / tiles.width);
396
+ if (x >= nxTiles || y >= nyTiles)
397
+ return false;
398
+ const idx = y * nxTiles + x;
399
+ const ret = await this.getTileSize(idx);
400
+ return ret.offset > 0;
401
+ }
379
402
  async getTileSize(index) {
380
403
  // GDAL optimizes tiles by storing the size of the tile in
381
404
  // the few bytes leading up to the tile
382
- if (this.tif.options.tileLeaderByteSize) {
405
+ const leaderBytes = this.tif.options.tileLeaderByteSize;
406
+ if (leaderBytes) {
383
407
  const offset = await this.getTileOffset(index);
384
408
  // Sparse COG no data found
385
409
  if (offset === 0)
386
410
  return { offset: 0, imageSize: 0 };
387
- const leaderBytes = this.tif.options.tileLeaderByteSize;
388
411
  // This fetch will generally load in the bytes needed for the image too
389
412
  // provided the image size is less than the size of a chunk
390
413
  await this.tif.source.loadBytes(offset - leaderBytes, leaderBytes);
@@ -398,4 +421,4 @@ export class CogTiffImage {
398
421
  return { offset, imageSize };
399
422
  }
400
423
  }
401
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLnRpZmYuaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29nLnRpZmYuaW1hZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHaEQsd0JBQXdCO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQztBQXNCM0MsTUFBTSxPQUFPLFlBQVk7SUFjckIsWUFBWSxHQUFZLEVBQUUsRUFBVSxFQUFFLElBQWtDO1FBTHhFLHNDQUFzQztRQUM5QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUM5QixpREFBaUQ7UUFDakQsWUFBTyxHQUFxQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBR2xELElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUs7UUFDMUIsTUFBTSxZQUFZLEdBQUc7WUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO1lBQ25DLElBQUks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LE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ2pDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvZ1RpZmYgfSBmcm9tICcuL2NvZy50aWZmLmpzJztcbmltcG9ydCB7IFRpZmZDb21wcmVzc2lvbiwgVGlmZk1pbWVUeXBlIH0gZnJvbSAnLi9jb25zdC90aWZmLm1pbWUuanMnO1xuaW1wb3J0IHsgVGlmZlRhZywgVGlmZlRhZ0dlbyB9IGZyb20gJy4vY29uc3QvdGlmZi50YWcuaWQuanMnO1xuaW1wb3J0IHsgQ29nVGlmZlRhZ0Jhc2UgfSBmcm9tICcuL3JlYWQvdGFnL3RpZmYudGFnLmJhc2UuanMnO1xuaW1wb3J0IHsgQ29nVGlmZlRhZ0xhenkgfSBmcm9tICcuL3JlYWQvdGFnL3RpZmYudGFnLmxhenkuanMnO1xuaW1wb3J0IHsgQ29nVGlmZlRhZ09mZnNldCB9IGZyb20gJy4vcmVhZC90YWcvdGlmZi50YWcub2Zmc2V0LmpzJztcbmltcG9ydCB7IENvZ1RpZmZUYWcgfSBmcm9tICcuL3JlYWQvdGlmZi50YWcuanMnO1xuaW1wb3J0IHsgQm91bmRpbmdCb3gsIFNpemUgfSBmcm9tICcuL3ZlY3Rvci5qcyc7XG5cbi8qKiBJbnZhbGlkIEVQU0cgY29kZSAqL1xuZXhwb3J0IGNvbnN0IEludmFsaWRQcm9qZWN0aW9uQ29kZSA9IDMyNzY3O1xuXG4vKipcbiAqIE51bWJlciBvZiB0aWxlcyB1c2VkIGluc2lkZSB0aGlzIGltYWdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29nVGlmZkltYWdlVGlsZWRDb3VudCB7XG4gICAgLyoqIE51bWJlciBvZiB0aWxlcyBvbiB0aGUgeCBheGlzICovXG4gICAgeDogbnVtYmVyO1xuICAgIC8qKiBOdW1iZXIgb2YgdGlsZXMgb24gdGhlIHkgYXhpcyAqL1xuICAgIHk6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBTaXplIG9mIGEgaW5kaXZpZHVhbCB0aWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29nVGlmZkltYWdlVGlsZVNpemUge1xuICAgIC8qKiBUaWxlIHdpZHRoIChwaXhlbHMpICovXG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICAvKiogVGlsZSBoZWlnaHQgKHBpeGVscykgKi9cbiAgICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIENvZ1RpZmZJbWFnZSB7XG4gICAgLyoqIEFsbCBJRkQgdGFncyB0aGF0IGhhdmUgYmVlbiByZWFkIGZvciB0aGUgaW1hZ2UgKi9cbiAgICB0YWdzOiBNYXA8VGlmZlRhZywgQ29nVGlmZlRhZ0Jhc2U+O1xuXG4gICAgLyoqIElkIG9mIHRoZSB0aWYgaW1hZ2UsIGdlbmVyYWxseSB0aGUgaW1hZ2UgaW5kZXggaW5zaWRlIHRoZSB0aWYgKi9cbiAgICBpZDogbnVtYmVyO1xuXG4gICAgdGlmOiBDb2dUaWZmO1xuXG4gICAgLyoqIEhhcyBsb2FkR2VvVGlmZlRhZ3MgYmVlbiBjYWxsZWQgKi9cbiAgICBwcml2YXRlIHRhZ3NHZW9Mb2FkZWQgPSBmYWxzZTtcbiAgICAvKiogU3ViIHRhZ3Mgc3RvcmVkIGluIFRpZmZUYWcuR2VvS2V5RGlyZWN0b3J5ICovXG4gICAgdGFnc0dlbzogTWFwPFRpZmZUYWdHZW8sIHN0cmluZyB8IG51bWJlcj4gPSBuZXcgTWFwKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcih0aWY6IENvZ1RpZmYsIGlkOiBudW1iZXIsIHRhZ3M6IE1hcDxUaWZmVGFnLCBDb2dUaWZmVGFnQmFzZT4pIHtcbiAgICAgICAgdGhpcy50aWYgPSB0aWY7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy50YWdzID0gdGFncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZSBsb2FkaW5nIG9mIGltcG9ydGFudCB0YWdzIGlmIHRoZXkgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAqXG4gICAgICogQHBhcmFtIGxvYWRHZW9UYWdzIFdoZXRoZXIgdG8gbG9hZCB0aGUgR2VvS2V5RGlyZWN0b3J5IGFuZCB1bnBhY2sgaXRcbiAgICAgKi9cbiAgICBhc3luYyBpbml0KGxvYWRHZW9UYWdzID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVxdWlyZWRUYWdzID0gW1xuICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLkNvbXByZXNzaW9uKSxcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5JbWFnZUhlaWdodCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuSW1hZ2VXaWR0aCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuTW9kZWxQaXhlbFNjYWxlKSxcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5Nb2RlbFRpZVBvaW50KSxcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5Nb2RlbFRyYW5zZm9ybWF0aW9uKSxcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5UaWxlSGVpZ2h0KSxcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5UaWxlV2lkdGgpLFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChsb2FkR2VvVGFncykge1xuICAgICAgICAgICAgcmVxdWlyZWRUYWdzLnB1c2godGhpcy5mZXRjaChUaWZmVGFnLkdlb0tleURpcmVjdG9yeSkpO1xuICAgICAgICAgICAgcmVxdWlyZWRUYWdzLnB1c2godGhpcy5mZXRjaChUaWZmVGFnLkdlb0FzY2lpUGFyYW1zKSk7XG4gICAgICAgICAgICByZXF1aXJlZFRhZ3MucHVzaCh0aGlzLmZldGNoKFRpZmZUYWcuR2VvRG91YmxlUGFyYW1zKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChyZXF1aXJlZFRhZ3MpO1xuICAgICAgICBpZiAobG9hZEdlb1RhZ3MpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZEdlb1RpZmZUYWdzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGEgVGlmZlRhZyBpZiBpdCBleGlzdHMgbnVsbCBvdGhlcndpc2VcbiAgICAgKi9cbiAgICB2YWx1ZTxUPih0YWc6IFRpZmZUYWcpOiBUIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHNvdXJjZVRhZyA9IHRoaXMudGFncy5nZXQodGFnKTtcbiAgICAgICAgaWYgKHNvdXJjZVRhZyA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVRhZy52YWx1ZSBhcyBUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgYW5kIHVucGFjayB0aGUgR2VvS2V5RGlyZWN0b3J5XG4gICAgICovXG4gICAgYXN5bmMgbG9hZEdlb1RpZmZUYWdzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBBbHJlYWR5IGxvYWRlZFxuICAgICAgICBpZiAodGhpcy50YWdzR2VvTG9hZGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNvdXJjZVRhZyA9IHRoaXMudGFncy5nZXQoVGlmZlRhZy5HZW9LZXlEaXJlY3RvcnkpO1xuICAgICAgICBpZiAoc291cmNlVGFnID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudGFnc0dlb0xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzb3VyY2VUYWcuaXNSZWFkeSAmJiBzb3VyY2VUYWcgaW5zdGFuY2VvZiBDb2dUaWZmVGFnTGF6eSkge1xuICAgICAgICAgICAgLy8gTG9hZCBhbGwgdGhlIHJlcXVpcmVkIGtleXNcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuR2VvS2V5RGlyZWN0b3J5KSxcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuR2VvQXNjaWlQYXJhbXMpLFxuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5HZW9Eb3VibGVQYXJhbXMpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWdzR2VvTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHNvdXJjZVRhZy52YWx1ZSA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdlb1RhZ3MgPSBzb3VyY2VUYWcudmFsdWU7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShnZW9UYWdzKSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdlbyB0YWdzIGZvdW5kJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSA0OyBpIDw9IGdlb1RhZ3NbM10gKiA0OyBpICs9IDQpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGdlb1RhZ3NbaV0gYXMgVGlmZlRhZ0dlbztcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gZ2VvVGFnc1tpICsgMV07XG5cbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGdlb1RhZ3NbaSArIDNdO1xuXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ3NHZW8uc2V0KGtleSwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHRoaXMudGFncy5nZXQobG9jYXRpb24pO1xuICAgICAgICAgICAgaWYgKHRhZyA9PSBudWxsIHx8IHRhZy52YWx1ZSA9PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gZ2VvVGFnc1tpICsgMl07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YWcudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzR2VvLnNldChrZXksIHRhZy52YWx1ZVtvZmZzZXQgKyBjb3VudCAtIDFdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRhZy52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ3NHZW8uc2V0KGtleSwgdGFnLnZhbHVlLnN1YnN0cihvZmZzZXQsIG9mZnNldCArIGNvdW50IC0gMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYXNzb2NpYXRlZCBHZW9UaWZmVGFnc1xuICAgICAqL1xuICAgIHZhbHVlR2VvKHRhZzogVGlmZlRhZ0dlbyk6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLnRhZ3NHZW9Mb2FkZWQgPT09IGZhbHNlKSB0aHJvdyBuZXcgRXJyb3IoJ2xvYWRHZW9UaWZmVGFncygpIGhhcyBub3QgYmVlbiBjYWxsZWQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFnc0dlby5nZXQodGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgdGFnLCBpZiBpdCBpcyBub3QgY3VycmVudGx5IGxvYWRlZCwgZmV0Y2ggdGhlIHJlcXVpcmVkIGRhdGEgZm9yIHRoZSB0YWcuXG4gICAgICogQHBhcmFtIHRhZyB0YWcgdG8gZmV0Y2hcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZmV0Y2g8VD4odGFnOiBUaWZmVGFnKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBzb3VyY2VUYWcgPSB0aGlzLnRhZ3MuZ2V0KHRhZyk7XG4gICAgICAgIGlmIChzb3VyY2VUYWcgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChDb2dUaWZmVGFnLmlzTGF6eShzb3VyY2VUYWcpKSByZXR1cm4gc291cmNlVGFnLmZldGNoKCkgYXMgYW55O1xuICAgICAgICByZXR1cm4gc291cmNlVGFnLnZhbHVlIGFzIFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBvcmlnaW4gcG9pbnQgZm9yIHRoZSBpbWFnZVxuICAgICAqXG4gICAgICogQHJldHVybnMgb3JpZ2luIHBvaW50IG9mIHRoZSBpbWFnZVxuICAgICAqL1xuICAgIGdldCBvcmlnaW4oKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgY29uc3QgdGllUG9pbnRzOiBudW1iZXJbXSB8IG51bGwgPSB0aGlzLnZhbHVlPG51bWJlcltdPihUaWZmVGFnLk1vZGVsVGllUG9pbnQpO1xuICAgICAgICBpZiAodGllUG9pbnRzICE9IG51bGwgJiYgdGllUG9pbnRzLmxlbmd0aCA9PT0gNikge1xuICAgICAgICAgICAgcmV0dXJuIFt0aWVQb2ludHNbM10sIHRpZVBvaW50c1s0XSwgdGllUG9pbnRzWzVdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vZGVsVHJhbnNmb3JtYXRpb24gPSB0aGlzLnZhbHVlPG51bWJlcltdPihUaWZmVGFnLk1vZGVsVHJhbnNmb3JtYXRpb24pO1xuICAgICAgICBpZiAobW9kZWxUcmFuc2Zvcm1hdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW21vZGVsVHJhbnNmb3JtYXRpb25bM10sIG1vZGVsVHJhbnNmb3JtYXRpb25bN10sIG1vZGVsVHJhbnNmb3JtYXRpb25bMTFdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBzdWIgaW1hZ2UsIHVzZSB0aGUgb3JpZ2luIGZyb20gdGhlIHRvcCBsZXZlbCBpbWFnZVxuICAgICAgICBpZiAodGhpcy52YWx1ZShUaWZmVGFnLk5ld1N1YkZpbGVUeXBlKSA9PT0gMSAmJiB0aGlzLmlkICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aWYuaW1hZ2VzWzBdLm9yaWdpbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW1hZ2UgZG9lcyBub3QgaGF2ZSBhIGdlbyB0cmFuc2Zvcm1hdGlvbi4nKTtcbiAgICB9XG5cbiAgICAvKiogSXMgdGhlcmUgZW5vdWdoIGdlbyBpbmZvcm1hdGlvbiBvbiB0aGlzIGltYWdlIHRvIGZpZ3VyZSBvdXQgd2hlcmUgaXRzIGFjdHVhbGx5IGxvY2F0ZWQgKi9cbiAgICBnZXQgaXNHZW9Mb2NhdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpc0ltYWdlTG9jYXRlZCA9XG4gICAgICAgICAgICB0aGlzLnZhbHVlKFRpZmZUYWcuTW9kZWxQaXhlbFNjYWxlKSAhPSBudWxsIHx8IHRoaXMudmFsdWUoVGlmZlRhZy5Nb2RlbFRyYW5zZm9ybWF0aW9uKSAhPSBudWxsO1xuICAgICAgICBpZiAoaXNJbWFnZUxvY2F0ZWQpIHJldHVybiB0cnVlO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3ViIGltYWdlLCB1c2UgdGhlIGlzR2VvTG9jYXRlZCBmcm9tIHRoZSB0b3AgbGV2ZWwgaW1hZ2VcbiAgICAgICAgaWYgKHRoaXMudmFsdWUoVGlmZlRhZy5OZXdTdWJGaWxlVHlwZSkgPT09IDEgJiYgdGhpcy5pZCAhPT0gMCkgcmV0dXJuIHRoaXMudGlmLmltYWdlc1swXS5pc0dlb0xvY2F0ZWQ7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJlc29sdXRpb24gb2YgdGhlIGltYWdlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBbeCx5LHpdIHBpeGVsIHNjYWxlXG4gICAgICovXG4gICAgZ2V0IHJlc29sdXRpb24oKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgY29uc3QgbW9kZWxQaXhlbFNjYWxlOiBudW1iZXJbXSB8IG51bGwgPSB0aGlzLnZhbHVlKFRpZmZUYWcuTW9kZWxQaXhlbFNjYWxlKTtcbiAgICAgICAgaWYgKG1vZGVsUGl4ZWxTY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW21vZGVsUGl4ZWxTY2FsZVswXSwgLW1vZGVsUGl4ZWxTY2FsZVsxXSwgbW9kZWxQaXhlbFNjYWxlWzJdXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtb2RlbFRyYW5zZm9ybWF0aW9uOiBudW1iZXJbXSB8IG51bGwgPSB0aGlzLnZhbHVlKFRpZmZUYWcuTW9kZWxUcmFuc2Zvcm1hdGlvbik7XG4gICAgICAgIGlmIChtb2RlbFRyYW5zZm9ybWF0aW9uICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbbW9kZWxUcmFuc2Zvcm1hdGlvblswXSwgbW9kZWxUcmFuc2Zvcm1hdGlvbls1XSwgbW9kZWxUcmFuc2Zvcm1hdGlvblsxMF1dO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN1YiBpbWFnZSwgdXNlIHRoZSByZXNvbHV0aW9uIGZyb20gdGhlIHRvcCBsZXZlbCBpbWFnZVxuICAgICAgICBpZiAodGhpcy52YWx1ZShUaWZmVGFnLk5ld1N1YkZpbGVUeXBlKSA9PT0gMSAmJiB0aGlzLmlkICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdEltZyA9IHRoaXMudGlmLmltYWdlc1swXTtcbiAgICAgICAgICAgIGNvbnN0IFtyZXNYLCByZXNZLCByZXNaXSA9IGZpcnN0SW1nLnJlc29sdXRpb247XG4gICAgICAgICAgICBjb25zdCBmaXJzdEltZ1NpemUgPSBmaXJzdEltZy5zaXplO1xuICAgICAgICAgICAgY29uc3QgaW1nU2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgICAgICAgIC8vIHNjYWxlIHJlc29sdXRpb24gYmFzZWQgb24gdGhlIHNpemUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gaW1hZ2VzXG4gICAgICAgICAgICByZXR1cm4gWyhyZXNYICogZmlyc3RJbWdTaXplLndpZHRoKSAvIGltZ1NpemUud2lkdGgsIChyZXNZICogZmlyc3RJbWdTaXplLmhlaWdodCkgLyBpbWdTaXplLmhlaWdodCwgcmVzWl07XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltYWdlIGRvZXMgbm90IGhhdmUgYSBnZW8gdHJhbnNmb3JtYXRpb24uJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQm91bmRpbmcgYm94IG9mIHRoZSBpbWFnZVxuICAgICAqXG4gICAgICogQHJldHVybnMgW21pblgsIG1pblksIG1heFgsIG1heFldIGJvdW5kaW5nIGJveFxuICAgICAqL1xuICAgIGdldCBiYm94KCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gdGhpcy5vcmlnaW47XG4gICAgICAgIGNvbnN0IHJlc29sdXRpb24gPSB0aGlzLnJlc29sdXRpb247XG5cbiAgICAgICAgaWYgKG9yaWdpbiA9PSBudWxsIHx8IHNpemUgPT0gbnVsbCB8fCByZXNvbHV0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGNhbGN1bGF0ZSBib3VuZGluZyBib3gnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHgxID0gb3JpZ2luWzBdO1xuICAgICAgICBjb25zdCB5MSA9IG9yaWdpblsxXTtcblxuICAgICAgICBjb25zdCB4MiA9IHgxICsgcmVzb2x1dGlvblswXSAqIHNpemUud2lkdGg7XG4gICAgICAgIGNvbnN0IHkyID0geTEgKyByZXNvbHV0aW9uWzFdICogc2l6ZS5oZWlnaHQ7XG5cbiAgICAgICAgcmV0dXJuIFtNYXRoLm1pbih4MSwgeDIpLCBNYXRoLm1pbih5MSwgeTIpLCBNYXRoLm1heCh4MSwgeDIpLCBNYXRoLm1heCh5MSwgeTIpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGNvbXByZXNzaW9uIHVzZWQgYnkgdGhlIHRpbGVcbiAgICAgKlxuICAgICAqIEBzZWUgVGlmZkNvbXByZXNzaW9uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBDb21wcmVzc2lvbiB0eXBlIGVnIHdlYnBcbiAgICAgKi9cbiAgICBnZXQgY29tcHJlc3Npb24oKTogVGlmZk1pbWVUeXBlIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGNvbXByZXNzaW9uID0gdGhpcy52YWx1ZShUaWZmVGFnLkNvbXByZXNzaW9uKTtcbiAgICAgICAgaWYgKGNvbXByZXNzaW9uID09IG51bGwgfHwgdHlwZW9mIGNvbXByZXNzaW9uICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpZmZDb21wcmVzc2lvbltjb21wcmVzc2lvbl07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0ZW1wdCB0byByZWFkIHRoZSBFUFNHIENvZGUgZnJvbSBUaWZmR2VvVGFnc1xuICAgICAqXG4gICAgICogQHJldHVybnMgRVBTRyBDb2RlIGlmIGl0IGV4aXN0c1xuICAgICAqL1xuICAgIGdldCBlcHNnKCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uID0gdGhpcy52YWx1ZUdlbyhUaWZmVGFnR2VvLlByb2plY3RlZENTVHlwZUdlb0tleSkgYXMgbnVtYmVyO1xuICAgICAgICBpZiAocHJvamVjdGlvbiA9PT0gSW52YWxpZFByb2plY3Rpb25Db2RlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHByb2plY3Rpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzaXplIG9mIHRoZSBpbWFnZVxuICAgICAqXG4gICAgICogQHJldHVybnMgU2l6ZSBpbiBwaXhlbHNcbiAgICAgKi9cbiAgICBnZXQgc2l6ZSgpOiBTaXplIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnZhbHVlPG51bWJlcj4oVGlmZlRhZy5JbWFnZVdpZHRoKSBhcyBudW1iZXIsXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMudmFsdWU8bnVtYmVyPihUaWZmVGFnLkltYWdlSGVpZ2h0KSBhcyBudW1iZXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBsaXN0IG9mIElGRCB0YWdzIHRoYXQgd2VyZSByZWFkXG4gICAgICovXG4gICAgZ2V0IHRhZ0xpc3QoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMudGFncy5rZXlzKCldLm1hcCgoYykgPT4gVGlmZlRhZ1tjXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIGlmIHRoaXMgaW1hZ2UgaXMgdGlsZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNUaWxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUoVGlmZlRhZy5UaWxlV2lkdGgpICE9PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzaXplIG9mIGluZGl2aWR1YWwgdGlsZXNcbiAgICAgKi9cbiAgICBnZXQgdGlsZVNpemUoKTogQ29nVGlmZkltYWdlVGlsZVNpemUge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2lkdGg6IHRoaXMudmFsdWU8bnVtYmVyPihUaWZmVGFnLlRpbGVXaWR0aCkgYXMgbnVtYmVyLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnZhbHVlPG51bWJlcj4oVGlmZlRhZy5UaWxlSGVpZ2h0KSBhcyBudW1iZXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHRpbGVzIHVzZWQgdG8gY3JlYXRlIHRoaXMgaW1hZ2VcbiAgICAgKi9cbiAgICBnZXQgdGlsZUNvdW50KCk6IENvZ1RpZmZJbWFnZVRpbGVkQ291bnQge1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5zaXplO1xuICAgICAgICBjb25zdCB0aWxlU2l6ZSA9IHRoaXMudGlsZVNpemU7XG4gICAgICAgIGNvbnN0IHggPSBNYXRoLmNlaWwoc2l6ZS53aWR0aCAvIHRpbGVTaXplLndpZHRoKTtcbiAgICAgICAgY29uc3QgeSA9IE1hdGguY2VpbChzaXplLmhlaWdodCAvIHRpbGVTaXplLmhlaWdodCk7XG4gICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBvaW50ZXIgdG8gd2hlcmUgdGhlIHRpbGVzIHN0YXJ0IGluIHRoZSBUaWZmIGZpbGVcbiAgICAgKlxuICAgICAqIEByZW1hcmtzIFVzZWQgdG8gcmVhZCB0aWxlZCB0aWZmc1xuICAgICAqXG4gICAgICogQHJldHVybnMgZmlsZSBvZmZzZXQgdG8gd2hlcmUgdGhlIHRpZmZzIGFyZSBzdG9yZWRcbiAgICAgKi9cbiAgICBnZXQgdGlsZU9mZnNldCgpOiBDb2dUaWZmVGFnT2Zmc2V0IHtcbiAgICAgICAgY29uc3QgdGlsZU9mZnNldCA9IHRoaXMudGFncy5nZXQoVGlmZlRhZy5UaWxlT2Zmc2V0cykgYXMgQ29nVGlmZlRhZ09mZnNldDtcbiAgICAgICAgaWYgKHRpbGVPZmZzZXQgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdObyB0aWxlIG9mZnNldHMgZm91bmQnKTtcbiAgICAgICAgcmV0dXJuIHRpbGVPZmZzZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBudW1iZXIgb2Ygc3RyaXAncyBpbnNpZGUgdGhpcyB0aWZmXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBVc2VkIHRvIHJlYWQgc3RyaXBlZCB0aWZmc1xuICAgICAqXG4gICAgICogQHJldHVybnMgbnVtYmVyIG9mIHN0cmlwcyBwcmVzZW50XG4gICAgICovXG4gICAgZ2V0IHN0cmlwQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdGlsZU9mZnNldCA9IHRoaXMudGFncy5nZXQoVGlmZlRhZy5TdHJpcEJ5dGVDb3VudHMpIGFzIENvZ1RpZmZUYWdPZmZzZXQ7XG4gICAgICAgIGlmICh0aWxlT2Zmc2V0ID09IG51bGwpIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gdGlsZU9mZnNldC5kYXRhQ291bnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgcG9pbnRlciB0byBhIHNwZWNpZmljIHRpbGUgaW5zaWRlIHRoZSB0aWZmIGZpbGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCB0aWxlIGluZGV4XG4gICAgICogQHJldHVybnMgZmlsZSBvZmZzZXQgb2YgdGhlIHNwZWNpZmllZCB0aWxlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIGdldFRpbGVPZmZzZXQoaW5kZXg6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IHRpbGVPZmZzZXQgPSB0aGlzLnRpbGVPZmZzZXQ7XG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiB0aWxlT2Zmc2V0LmRhdGFDb3VudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaWxlIG9mZnNldDogJHtpbmRleH0gb3V0IG9mIHJhbmdlOiAwIC0+ICR7dGlsZU9mZnNldC5kYXRhQ291bnR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGZXRjaCBvbmx5IHRoZSBwYXJ0IG9mIHRoZSBvZmZzZXRzIHRoYXQgYXJlIG5lZWRlZFxuICAgICAgICByZXR1cm4gdGlsZU9mZnNldC5nZXRWYWx1ZUF0KGluZGV4KTtcbiAgICB9XG5cbiAgICAvLyBDbGFtcCB0aGUgYm91bmRzIG9mIHRoZSBvdXRwdXQgaW1hZ2UgdG8gdGhlIHNpemUgb2YgdGhlIGltYWdlLCBhcyBzb21ldGltZXMgdGhlIGVkZ2UgdGlsZXMgYXJlIG5vdCBmdWxsIHRpbGVzXG4gICAgZ2V0VGlsZUJvdW5kcyh4OiBudW1iZXIsIHk6IG51bWJlcik6IEJvdW5kaW5nQm94IHtcbiAgICAgICAgY29uc3QgeyBzaXplLCB0aWxlU2l6ZSB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgdG9wID0geSAqIHRpbGVTaXplLmhlaWdodDtcbiAgICAgICAgY29uc3QgbGVmdCA9IHggKiB0aWxlU2l6ZS53aWR0aDtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBsZWZ0ICsgdGlsZVNpemUud2lkdGggPj0gc2l6ZS53aWR0aCA/IHNpemUud2lkdGggLSBsZWZ0IDogdGlsZVNpemUud2lkdGg7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRvcCArIHRpbGVTaXplLmhlaWdodCA+PSBzaXplLmhlaWdodCA/IHNpemUuaGVpZ2h0IC0gdG9wIDogdGlsZVNpemUuaGVpZ2h0O1xuICAgICAgICByZXR1cm4geyB4OiBsZWZ0LCB5OiB0b3AsIHdpZHRoLCBoZWlnaHQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgc3RyaXAgaW50byBhIHVpbnQ4IGFycmF5XG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXggU3RyaXAgaW5kZXggdG8gcmVhZFxuICAgICAqL1xuICAgIGFzeW5jIGdldFN0cmlwKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPHsgbWltZVR5cGU6IFRpZmZNaW1lVHlwZTsgYnl0ZXM6IFVpbnQ4QXJyYXkgfSB8IG51bGw+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNUaWxlZCgpKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHN0cmlwZXMsIHRpZmYgaXMgdGlsZWQnKTtcblxuICAgICAgICBjb25zdCBieXRlQ291bnRzID0gdGhpcy50YWdzLmdldChUaWZmVGFnLlN0cmlwQnl0ZUNvdW50cykgYXMgQ29nVGlmZlRhZ09mZnNldDtcbiAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IHRoaXMudGFncy5nZXQoVGlmZlRhZy5TdHJpcE9mZnNldHMpIGFzIENvZ1RpZmZUYWdPZmZzZXQ7XG5cbiAgICAgICAgaWYgKGluZGV4ID49IGJ5dGVDb3VudHMuZGF0YUNvdW50KSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHN0cmlwLCBpbmRleCBvdXQgb2YgYm91bmRzJyk7XG5cbiAgICAgICAgY29uc3QgW2J5dGVDb3VudCwgb2Zmc2V0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtvZmZzZXRzLmdldFZhbHVlQXQoaW5kZXgpLCBieXRlQ291bnRzLmdldFZhbHVlQXQoaW5kZXgpXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ5dGVzKGJ5dGVDb3VudCwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvKiogVGhlIGpwZWcgaGVhZGVyIGlzIHN0b3JlZCBpbiB0aGUgSUZELCByZWFkIHRoZSBKUEVHIGhlYWRlciBhbmQgYWRqdXN0IHRoZSBieXRlIGFycmF5IHRvIGluY2x1ZGUgaXQgKi9cbiAgICBwcml2YXRlIGdldEpwZWdIZWFkZXIoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgICAgICAgLy8gQm90aCB0aGUgSlBFR1RhYmxlIGFuZCB0aGUgQnl0ZXMgd2l0aCBoYXZlIHRoZSBzdGFydCBvZiBpbWFnZSBhbmQgZW5kIG9mIGltYWdlIG1hcmtlcnNcbiAgICAgICAgLy8gU3RhcnRPZkltYWdlIDB4ZmZkOCBFbmRPZkltYWdlIDB4ZmZkOVxuICAgICAgICBjb25zdCB0YWJsZXMgPSB0aGlzLnZhbHVlPG51bWJlcltdPihUaWZmVGFnLkpQRUdUYWJsZXMpO1xuICAgICAgICBpZiAodGFibGVzID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgSnBlZyBoZWFkZXInKTtcblxuICAgICAgICAvLyBSZW1vdmUgRW5kT2ZJbWFnZSBtYXJrZXJcbiAgICAgICAgY29uc3QgdGFibGVEYXRhID0gdGFibGVzLnNsaWNlKDAsIHRhYmxlcy5sZW5ndGggLSAyKTtcbiAgICAgICAgY29uc3QgYWN0dWFsQnl0ZXMgPSBuZXcgVWludDhBcnJheShieXRlcy5ieXRlTGVuZ3RoICsgdGFibGVEYXRhLmxlbmd0aCAtIDIpO1xuICAgICAgICBhY3R1YWxCeXRlcy5zZXQodGFibGVEYXRhLCAwKTtcbiAgICAgICAgYWN0dWFsQnl0ZXMuc2V0KGJ5dGVzLnNsaWNlKDIpLCB0YWJsZURhdGEubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIGFjdHVhbEJ5dGVzO1xuICAgIH1cblxuICAgIC8qKiBSZWFkIGltYWdlIGJ5dGVzIGF0IHRoZSBnaXZlbiBvZmZzZXQgKi9cbiAgICBwcml2YXRlIGFzeW5jIGdldEJ5dGVzKFxuICAgICAgICBvZmZzZXQ6IG51bWJlcixcbiAgICAgICAgYnl0ZUNvdW50OiBudW1iZXIsXG4gICAgKTogUHJvbWlzZTx7IG1pbWVUeXBlOiBUaWZmTWltZVR5cGU7IGJ5dGVzOiBVaW50OEFycmF5IH0gfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IG1pbWVUeXBlID0gdGhpcy5jb21wcmVzc2lvbjtcbiAgICAgICAgaWYgKG1pbWVUeXBlID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY29tcHJlc3Npb246ICcgKyB0aGlzLnZhbHVlKFRpZmZUYWcuQ29tcHJlc3Npb24pKTtcbiAgICAgICAgaWYgKGJ5dGVDb3VudCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgYXdhaXQgdGhpcy50aWYuc291cmNlLmxvYWRCeXRlcyhvZmZzZXQsIGJ5dGVDb3VudCk7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gdGhpcy50aWYuc291cmNlLmJ5dGVzKG9mZnNldCwgYnl0ZUNvdW50KTtcblxuICAgICAgICBpZiAodGhpcy5jb21wcmVzc2lvbiA9PT0gVGlmZk1pbWVUeXBlLkpQRUcpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1pbWVUeXBlLCBieXRlczogdGhpcy5nZXRKcGVnSGVhZGVyKGJ5dGVzKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1pbWVUeXBlLCBieXRlcyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgdGhlIHRpbGUgYnVmZmVyLCB0aGlzIHdvcmtzIGJlc3Qgd2l0aCB3ZWJwXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYWxzbyBhcHBseSB0aGUgSlBFRyBjb21wcmVzc2lvbiB0YWJsZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRpbGUgeCBvZmZzZXRcbiAgICAgKiBAcGFyYW0geSBUaWxlIHkgb2Zmc2V0XG4gICAgICovXG4gICAgYXN5bmMgZ2V0VGlsZSh4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8eyBtaW1lVHlwZTogVGlmZk1pbWVUeXBlOyBieXRlczogVWludDhBcnJheSB9IHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBtaW1lVHlwZSA9IHRoaXMuY29tcHJlc3Npb247XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIGNvbnN0IHRpbGVzID0gdGhpcy50aWxlU2l6ZTtcblxuICAgICAgICBpZiAodGlsZXMgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdUaWZmIGlzIG5vdCB0aWxlZCcpO1xuICAgICAgICBpZiAobWltZVR5cGUgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBjb21wcmVzc2lvbjogJyArIHRoaXMudmFsdWUoVGlmZlRhZy5Db21wcmVzc2lvbikpO1xuXG4gICAgICAgIC8vIFRPRE8gc3VwcG9ydCBHaG9zdE9wdGlvblRpbGVPcmRlclxuICAgICAgICBjb25zdCBueVRpbGVzID0gTWF0aC5jZWlsKHNpemUuaGVpZ2h0IC8gdGlsZXMuaGVpZ2h0KTtcbiAgICAgICAgY29uc3QgbnhUaWxlcyA9IE1hdGguY2VpbChzaXplLndpZHRoIC8gdGlsZXMud2lkdGgpO1xuXG4gICAgICAgIGlmICh4ID49IG54VGlsZXMgfHwgeSA+PSBueVRpbGVzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbGUgaW5kZXggaXMgb3V0c2lkZSBvZiByYW5nZSB4OiR7eH0gPj0gJHtueFRpbGVzfSBvciB5OiR7eX0gPj0gJHtueVRpbGVzfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWR4ID0geSAqIG54VGlsZXMgKyB4O1xuICAgICAgICBjb25zdCB0b3RhbFRpbGVzID0gbnhUaWxlcyAqIG55VGlsZXM7XG4gICAgICAgIGlmIChpZHggPj0gdG90YWxUaWxlcykgdGhyb3cgbmV3IEVycm9yKGBUaWxlIGluZGV4IGlzIG91dHNpZGUgb2YgdGlsZSByYW5nZTogJHtpZHh9ID49ICR7dG90YWxUaWxlc31gKTtcblxuICAgICAgICBjb25zdCB7IG9mZnNldCwgaW1hZ2VTaXplIH0gPSBhd2FpdCB0aGlzLmdldFRpbGVTaXplKGlkeCk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ5dGVzKG9mZnNldCwgaW1hZ2VTaXplKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VGlsZVNpemUoaW5kZXg6IG51bWJlcik6IFByb21pc2U8eyBvZmZzZXQ6IG51bWJlcjsgaW1hZ2VTaXplOiBudW1iZXIgfT4ge1xuICAgICAgICAvLyBHREFMIG9wdGltaXplcyB0aWxlcyBieSBzdG9yaW5nIHRoZSBzaXplIG9mIHRoZSB0aWxlIGluXG4gICAgICAgIC8vIHRoZSBmZXcgYnl0ZXMgbGVhZGluZyB1cCB0byB0aGUgdGlsZVxuICAgICAgICBpZiAodGhpcy50aWYub3B0aW9ucy50aWxlTGVhZGVyQnl0ZVNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGF3YWl0IHRoaXMuZ2V0VGlsZU9mZnNldChpbmRleCk7XG4gICAgICAgICAgICAvLyBTcGFyc2UgQ09HIG5vIGRhdGEgZm91bmRcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHJldHVybiB7IG9mZnNldDogMCwgaW1hZ2VTaXplOiAwIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGxlYWRlckJ5dGVzID0gdGhpcy50aWYub3B0aW9ucy50aWxlTGVhZGVyQnl0ZVNpemU7XG4gICAgICAgICAgICAvLyBUaGlzIGZldGNoIHdpbGwgZ2VuZXJhbGx5IGxvYWQgaW4gdGhlIGJ5dGVzIG5lZWRlZCBmb3IgdGhlIGltYWdlIHRvb1xuICAgICAgICAgICAgLy8gcHJvdmlkZWQgdGhlIGltYWdlIHNpemUgaXMgbGVzcyB0aGFuIHRoZSBzaXplIG9mIGEgY2h1bmtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudGlmLnNvdXJjZS5sb2FkQnl0ZXMob2Zmc2V0IC0gbGVhZGVyQnl0ZXMsIGxlYWRlckJ5dGVzKTtcbiAgICAgICAgICAgIHJldHVybiB7IG9mZnNldCwgaW1hZ2VTaXplOiB0aGlzLnRpZi5zb3VyY2UuZ2V0VWludChvZmZzZXQgLSBsZWFkZXJCeXRlcywgbGVhZGVyQnl0ZXMpIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBieXRlQ291bnRzID0gdGhpcy50YWdzLmdldChUaWZmVGFnLlRpbGVCeXRlQ291bnRzKSBhcyBDb2dUaWZmVGFnT2Zmc2V0O1xuICAgICAgICBpZiAoYnl0ZUNvdW50cyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRpbGUgYnl0ZSBjb3VudHMgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBbb2Zmc2V0LCBpbWFnZVNpemVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0VGlsZU9mZnNldChpbmRleCksIGJ5dGVDb3VudHMuZ2V0VmFsdWVBdChpbmRleCldKTtcbiAgICAgICAgcmV0dXJuIHsgb2Zmc2V0LCBpbWFnZVNpemUgfTtcbiAgICB9XG59XG4iXX0=
424
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLnRpZmYuaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29nLnRpZmYuaW1hZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHaEQsd0JBQXdCO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQztBQXNCM0MsTUFBTSxPQUFPLFlBQVk7SUFjckIsWUFBWSxHQUFZLEVBQUUsRUFBVSxFQUFFLElBQWtDO1FBTHhFLHNDQUFzQztRQUM5QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUM5QixpREFBaUQ7UUFDakQsWUFBTyxHQUFxQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBR2xELElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUs7UUFDMUIsTUFBTSxZQUFZLEdBQUc7WUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO1lBQ25DLElBQUks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QyxrQkFBa0IsQ0FBQztRQUN4RCxJQUFJLFdBQVcsRUFBRTtZQUNiLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQywyQkFBMkI7WUFDM0IsSUFBSSxNQUFNLEtBQUssQ0FBQztnQkFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFFckQsdUVBQXVFO1lBQ3ZFLDJEQUEyRDtZQUMzRCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ25FLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsV0FBVyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUM7U0FDNUY7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFxQixDQUFDO1FBQzdFLElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7U0FDaEQ7UUFDRCxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekcsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb2dUaWZmIH0gZnJvbSAnLi9jb2cudGlmZi5qcyc7XG5pbXBvcnQgeyBUaWZmQ29tcHJlc3Npb24sIFRpZmZNaW1lVHlwZSB9IGZyb20gJy4vY29uc3QvdGlmZi5taW1lLmpzJztcbmltcG9ydCB7IFRpZmZUYWcsIFRpZmZUYWdHZW8gfSBmcm9tICcuL2NvbnN0L3RpZmYudGFnLmlkLmpzJztcbmltcG9ydCB7IENvZ1RpZmZUYWdCYXNlIH0gZnJvbSAnLi9yZWFkL3RhZy90aWZmLnRhZy5iYXNlLmpzJztcbmltcG9ydCB7IENvZ1RpZmZUYWdMYXp5IH0gZnJvbSAnLi9yZWFkL3RhZy90aWZmLnRhZy5sYXp5LmpzJztcbmltcG9ydCB7IENvZ1RpZmZUYWdPZmZzZXQgfSBmcm9tICcuL3JlYWQvdGFnL3RpZmYudGFnLm9mZnNldC5qcyc7XG5pbXBvcnQgeyBDb2dUaWZmVGFnIH0gZnJvbSAnLi9yZWFkL3RpZmYudGFnLmpzJztcbmltcG9ydCB7IEJvdW5kaW5nQm94LCBTaXplIH0gZnJvbSAnLi92ZWN0b3IuanMnO1xuXG4vKiogSW52YWxpZCBFUFNHIGNvZGUgKi9cbmV4cG9ydCBjb25zdCBJbnZhbGlkUHJvamVjdGlvbkNvZGUgPSAzMjc2NztcblxuLyoqXG4gKiBOdW1iZXIgb2YgdGlsZXMgdXNlZCBpbnNpZGUgdGhpcyBpbWFnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZ1RpZmZJbWFnZVRpbGVkQ291bnQge1xuICAgIC8qKiBOdW1iZXIgb2YgdGlsZXMgb24gdGhlIHggYXhpcyAqL1xuICAgIHg6IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIHRpbGVzIG9uIHRoZSB5IGF4aXMgKi9cbiAgICB5OiBudW1iZXI7XG59XG5cbi8qKlxuICogU2l6ZSBvZiBhIGluZGl2aWR1YWwgdGlsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZ1RpZmZJbWFnZVRpbGVTaXplIHtcbiAgICAvKiogVGlsZSB3aWR0aCAocGl4ZWxzKSAqL1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgLyoqIFRpbGUgaGVpZ2h0IChwaXhlbHMpICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBDb2dUaWZmSW1hZ2Uge1xuICAgIC8qKiBBbGwgSUZEIHRhZ3MgdGhhdCBoYXZlIGJlZW4gcmVhZCBmb3IgdGhlIGltYWdlICovXG4gICAgdGFnczogTWFwPFRpZmZUYWcsIENvZ1RpZmZUYWdCYXNlPjtcblxuICAgIC8qKiBJZCBvZiB0aGUgdGlmIGltYWdlLCBnZW5lcmFsbHkgdGhlIGltYWdlIGluZGV4IGluc2lkZSB0aGUgdGlmICovXG4gICAgaWQ6IG51bWJlcjtcblxuICAgIHRpZjogQ29nVGlmZjtcblxuICAgIC8qKiBIYXMgbG9hZEdlb1RpZmZUYWdzIGJlZW4gY2FsbGVkICovXG4gICAgcHJpdmF0ZSB0YWdzR2VvTG9hZGVkID0gZmFsc2U7XG4gICAgLyoqIFN1YiB0YWdzIHN0b3JlZCBpbiBUaWZmVGFnLkdlb0tleURpcmVjdG9yeSAqL1xuICAgIHRhZ3NHZW86IE1hcDxUaWZmVGFnR2VvLCBzdHJpbmcgfCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3RydWN0b3IodGlmOiBDb2dUaWZmLCBpZDogbnVtYmVyLCB0YWdzOiBNYXA8VGlmZlRhZywgQ29nVGlmZlRhZ0Jhc2U+KSB7XG4gICAgICAgIHRoaXMudGlmID0gdGlmO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMudGFncyA9IHRhZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yY2UgbG9hZGluZyBvZiBpbXBvcnRhbnQgdGFncyBpZiB0aGV5IGhhdmUgbm90IGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsb2FkR2VvVGFncyBXaGV0aGVyIHRvIGxvYWQgdGhlIEdlb0tleURpcmVjdG9yeSBhbmQgdW5wYWNrIGl0XG4gICAgICovXG4gICAgYXN5bmMgaW5pdChsb2FkR2VvVGFncyA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkVGFncyA9IFtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5Db21wcmVzc2lvbiksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuSW1hZ2VIZWlnaHQpLFxuICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLkltYWdlV2lkdGgpLFxuICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLk1vZGVsUGl4ZWxTY2FsZSksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuTW9kZWxUaWVQb2ludCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuTW9kZWxUcmFuc2Zvcm1hdGlvbiksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuVGlsZUhlaWdodCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuVGlsZVdpZHRoKSxcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAobG9hZEdlb1RhZ3MpIHtcbiAgICAgICAgICAgIHJlcXVpcmVkVGFncy5wdXNoKHRoaXMuZmV0Y2goVGlmZlRhZy5HZW9LZXlEaXJlY3RvcnkpKTtcbiAgICAgICAgICAgIHJlcXVpcmVkVGFncy5wdXNoKHRoaXMuZmV0Y2goVGlmZlRhZy5HZW9Bc2NpaVBhcmFtcykpO1xuICAgICAgICAgICAgcmVxdWlyZWRUYWdzLnB1c2godGhpcy5mZXRjaChUaWZmVGFnLkdlb0RvdWJsZVBhcmFtcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocmVxdWlyZWRUYWdzKTtcbiAgICAgICAgaWYgKGxvYWRHZW9UYWdzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRHZW9UaWZmVGFncygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBvZiBhIFRpZmZUYWcgaWYgaXQgZXhpc3RzIG51bGwgb3RoZXJ3aXNlXG4gICAgICovXG4gICAgdmFsdWU8VD4odGFnOiBUaWZmVGFnKTogVCB8IG51bGwge1xuICAgICAgICBjb25zdCBzb3VyY2VUYWcgPSB0aGlzLnRhZ3MuZ2V0KHRhZyk7XG4gICAgICAgIGlmIChzb3VyY2VUYWcgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBzb3VyY2VUYWcudmFsdWUgYXMgVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGFuZCB1bnBhY2sgdGhlIEdlb0tleURpcmVjdG9yeVxuICAgICAqL1xuICAgIGFzeW5jIGxvYWRHZW9UaWZmVGFncygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gQWxyZWFkeSBsb2FkZWRcbiAgICAgICAgaWYgKHRoaXMudGFnc0dlb0xvYWRlZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzb3VyY2VUYWcgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuR2VvS2V5RGlyZWN0b3J5KTtcbiAgICAgICAgaWYgKHNvdXJjZVRhZyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnRhZ3NHZW9Mb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc291cmNlVGFnLmlzUmVhZHkgJiYgc291cmNlVGFnIGluc3RhbmNlb2YgQ29nVGlmZlRhZ0xhenkpIHtcbiAgICAgICAgICAgIC8vIExvYWQgYWxsIHRoZSByZXF1aXJlZCBrZXlzXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLkdlb0tleURpcmVjdG9yeSksXG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLkdlb0FzY2lpUGFyYW1zKSxcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuR2VvRG91YmxlUGFyYW1zKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFnc0dlb0xvYWRlZCA9IHRydWU7XG4gICAgICAgIGlmIChzb3VyY2VUYWcudmFsdWUgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnZW9UYWdzID0gc291cmNlVGFnLnZhbHVlO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZ2VvVGFncykpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBnZW8gdGFncyBmb3VuZCcpO1xuICAgICAgICBmb3IgKGxldCBpID0gNDsgaSA8PSBnZW9UYWdzWzNdICogNDsgaSArPSA0KSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBnZW9UYWdzW2ldIGFzIFRpZmZUYWdHZW87XG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGdlb1RhZ3NbaSArIDFdO1xuXG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBnZW9UYWdzW2kgKyAzXTtcblxuICAgICAgICAgICAgaWYgKGxvY2F0aW9uID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzR2VvLnNldChrZXksIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0YWcgPSB0aGlzLnRhZ3MuZ2V0KGxvY2F0aW9uKTtcbiAgICAgICAgICAgIGlmICh0YWcgPT0gbnVsbCB8fCB0YWcudmFsdWUgPT0gbnVsbCkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBjb3VudCA9IGdlb1RhZ3NbaSArIDJdO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFnLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudGFnc0dlby5zZXQoa2V5LCB0YWcudmFsdWVbb2Zmc2V0ICsgY291bnQgLSAxXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0YWcudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzR2VvLnNldChrZXksIHRhZy52YWx1ZS5zdWJzdHIob2Zmc2V0LCBvZmZzZXQgKyBjb3VudCAtIDEpLnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGFzc29jaWF0ZWQgR2VvVGlmZlRhZ3NcbiAgICAgKi9cbiAgICB2YWx1ZUdlbyh0YWc6IFRpZmZUYWdHZW8pOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodGhpcy50YWdzR2VvTG9hZGVkID09PSBmYWxzZSkgdGhyb3cgbmV3IEVycm9yKCdsb2FkR2VvVGlmZlRhZ3MoKSBoYXMgbm90IGJlZW4gY2FsbGVkJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnRhZ3NHZW8uZ2V0KHRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIHRhZywgaWYgaXQgaXMgbm90IGN1cnJlbnRseSBsb2FkZWQsIGZldGNoIHRoZSByZXF1aXJlZCBkYXRhIGZvciB0aGUgdGFnLlxuICAgICAqIEBwYXJhbSB0YWcgdGFnIHRvIGZldGNoXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KHRhZzogVGlmZlRhZyk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICAgICAgY29uc3Qgc291cmNlVGFnID0gdGhpcy50YWdzLmdldCh0YWcpO1xuICAgICAgICBpZiAoc291cmNlVGFnID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoQ29nVGlmZlRhZy5pc0xhenkoc291cmNlVGFnKSkgcmV0dXJuIHNvdXJjZVRhZy5mZXRjaCgpIGFzIGFueTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVRhZy52YWx1ZSBhcyBUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgb3JpZ2luIHBvaW50IGZvciB0aGUgaW1hZ2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIG9yaWdpbiBwb2ludCBvZiB0aGUgaW1hZ2VcbiAgICAgKi9cbiAgICBnZXQgb3JpZ2luKCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IHRpZVBvaW50czogbnVtYmVyW10gfCBudWxsID0gdGhpcy52YWx1ZTxudW1iZXJbXT4oVGlmZlRhZy5Nb2RlbFRpZVBvaW50KTtcbiAgICAgICAgaWYgKHRpZVBvaW50cyAhPSBudWxsICYmIHRpZVBvaW50cy5sZW5ndGggPT09IDYpIHtcbiAgICAgICAgICAgIHJldHVybiBbdGllUG9pbnRzWzNdLCB0aWVQb2ludHNbNF0sIHRpZVBvaW50c1s1XV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb2RlbFRyYW5zZm9ybWF0aW9uID0gdGhpcy52YWx1ZTxudW1iZXJbXT4oVGlmZlRhZy5Nb2RlbFRyYW5zZm9ybWF0aW9uKTtcbiAgICAgICAgaWYgKG1vZGVsVHJhbnNmb3JtYXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFttb2RlbFRyYW5zZm9ybWF0aW9uWzNdLCBtb2RlbFRyYW5zZm9ybWF0aW9uWzddLCBtb2RlbFRyYW5zZm9ybWF0aW9uWzExXV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3ViIGltYWdlLCB1c2UgdGhlIG9yaWdpbiBmcm9tIHRoZSB0b3AgbGV2ZWwgaW1hZ2VcbiAgICAgICAgaWYgKHRoaXMudmFsdWUoVGlmZlRhZy5OZXdTdWJGaWxlVHlwZSkgPT09IDEgJiYgdGhpcy5pZCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGlmLmltYWdlc1swXS5vcmlnaW47XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltYWdlIGRvZXMgbm90IGhhdmUgYSBnZW8gdHJhbnNmb3JtYXRpb24uJyk7XG4gICAgfVxuXG4gICAgLyoqIElzIHRoZXJlIGVub3VnaCBnZW8gaW5mb3JtYXRpb24gb24gdGhpcyBpbWFnZSB0byBmaWd1cmUgb3V0IHdoZXJlIGl0cyBhY3R1YWxseSBsb2NhdGVkICovXG4gICAgZ2V0IGlzR2VvTG9jYXRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXNJbWFnZUxvY2F0ZWQgPVxuICAgICAgICAgICAgdGhpcy52YWx1ZShUaWZmVGFnLk1vZGVsUGl4ZWxTY2FsZSkgIT0gbnVsbCB8fCB0aGlzLnZhbHVlKFRpZmZUYWcuTW9kZWxUcmFuc2Zvcm1hdGlvbikgIT0gbnVsbDtcbiAgICAgICAgaWYgKGlzSW1hZ2VMb2NhdGVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN1YiBpbWFnZSwgdXNlIHRoZSBpc0dlb0xvY2F0ZWQgZnJvbSB0aGUgdG9wIGxldmVsIGltYWdlXG4gICAgICAgIGlmICh0aGlzLnZhbHVlKFRpZmZUYWcuTmV3U3ViRmlsZVR5cGUpID09PSAxICYmIHRoaXMuaWQgIT09IDApIHJldHVybiB0aGlzLnRpZi5pbWFnZXNbMF0uaXNHZW9Mb2NhdGVkO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByZXNvbHV0aW9uIG9mIHRoZSBpbWFnZVxuICAgICAqXG4gICAgICogQHJldHVybnMgW3gseSx6XSBwaXhlbCBzY2FsZVxuICAgICAqL1xuICAgIGdldCByZXNvbHV0aW9uKCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IG1vZGVsUGl4ZWxTY2FsZTogbnVtYmVyW10gfCBudWxsID0gdGhpcy52YWx1ZShUaWZmVGFnLk1vZGVsUGl4ZWxTY2FsZSk7XG4gICAgICAgIGlmIChtb2RlbFBpeGVsU2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFttb2RlbFBpeGVsU2NhbGVbMF0sIC1tb2RlbFBpeGVsU2NhbGVbMV0sIG1vZGVsUGl4ZWxTY2FsZVsyXV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9kZWxUcmFuc2Zvcm1hdGlvbjogbnVtYmVyW10gfCBudWxsID0gdGhpcy52YWx1ZShUaWZmVGFnLk1vZGVsVHJhbnNmb3JtYXRpb24pO1xuICAgICAgICBpZiAobW9kZWxUcmFuc2Zvcm1hdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW21vZGVsVHJhbnNmb3JtYXRpb25bMF0sIG1vZGVsVHJhbnNmb3JtYXRpb25bNV0sIG1vZGVsVHJhbnNmb3JtYXRpb25bMTBdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBzdWIgaW1hZ2UsIHVzZSB0aGUgcmVzb2x1dGlvbiBmcm9tIHRoZSB0b3AgbGV2ZWwgaW1hZ2VcbiAgICAgICAgaWYgKHRoaXMudmFsdWUoVGlmZlRhZy5OZXdTdWJGaWxlVHlwZSkgPT09IDEgJiYgdGhpcy5pZCAhPT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RJbWcgPSB0aGlzLnRpZi5pbWFnZXNbMF07XG4gICAgICAgICAgICBjb25zdCBbcmVzWCwgcmVzWSwgcmVzWl0gPSBmaXJzdEltZy5yZXNvbHV0aW9uO1xuICAgICAgICAgICAgY29uc3QgZmlyc3RJbWdTaXplID0gZmlyc3RJbWcuc2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IGltZ1NpemUgPSB0aGlzLnNpemU7XG4gICAgICAgICAgICAvLyBzY2FsZSByZXNvbHV0aW9uIGJhc2VkIG9uIHRoZSBzaXplIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGltYWdlc1xuICAgICAgICAgICAgcmV0dXJuIFsocmVzWCAqIGZpcnN0SW1nU2l6ZS53aWR0aCkgLyBpbWdTaXplLndpZHRoLCAocmVzWSAqIGZpcnN0SW1nU2l6ZS5oZWlnaHQpIC8gaW1nU2l6ZS5oZWlnaHQsIHJlc1pdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbWFnZSBkb2VzIG5vdCBoYXZlIGEgZ2VvIHRyYW5zZm9ybWF0aW9uLicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJvdW5kaW5nIGJveCBvZiB0aGUgaW1hZ2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSBib3VuZGluZyBib3hcbiAgICAgKi9cbiAgICBnZXQgYmJveCgpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMub3JpZ2luO1xuICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gdGhpcy5yZXNvbHV0aW9uO1xuXG4gICAgICAgIGlmIChvcmlnaW4gPT0gbnVsbCB8fCBzaXplID09IG51bGwgfHwgcmVzb2x1dGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBjYWxjdWxhdGUgYm91bmRpbmcgYm94Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB4MSA9IG9yaWdpblswXTtcbiAgICAgICAgY29uc3QgeTEgPSBvcmlnaW5bMV07XG5cbiAgICAgICAgY29uc3QgeDIgPSB4MSArIHJlc29sdXRpb25bMF0gKiBzaXplLndpZHRoO1xuICAgICAgICBjb25zdCB5MiA9IHkxICsgcmVzb2x1dGlvblsxXSAqIHNpemUuaGVpZ2h0O1xuXG4gICAgICAgIHJldHVybiBbTWF0aC5taW4oeDEsIHgyKSwgTWF0aC5taW4oeTEsIHkyKSwgTWF0aC5tYXgoeDEsIHgyKSwgTWF0aC5tYXgoeTEsIHkyKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjb21wcmVzc2lvbiB1c2VkIGJ5IHRoZSB0aWxlXG4gICAgICpcbiAgICAgKiBAc2VlIFRpZmZDb21wcmVzc2lvblxuICAgICAqXG4gICAgICogQHJldHVybnMgQ29tcHJlc3Npb24gdHlwZSBlZyB3ZWJwXG4gICAgICovXG4gICAgZ2V0IGNvbXByZXNzaW9uKCk6IFRpZmZNaW1lVHlwZSB8IG51bGwge1xuICAgICAgICBjb25zdCBjb21wcmVzc2lvbiA9IHRoaXMudmFsdWUoVGlmZlRhZy5Db21wcmVzc2lvbik7XG4gICAgICAgIGlmIChjb21wcmVzc2lvbiA9PSBudWxsIHx8IHR5cGVvZiBjb21wcmVzc2lvbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWZmQ29tcHJlc3Npb25bY29tcHJlc3Npb25dO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGVtcHQgdG8gcmVhZCB0aGUgRVBTRyBDb2RlIGZyb20gVGlmZkdlb1RhZ3NcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEVQU0cgQ29kZSBpZiBpdCBleGlzdHNcbiAgICAgKi9cbiAgICBnZXQgZXBzZygpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbiA9IHRoaXMudmFsdWVHZW8oVGlmZlRhZ0dlby5Qcm9qZWN0ZWRDU1R5cGVHZW9LZXkpIGFzIG51bWJlcjtcbiAgICAgICAgaWYgKHByb2plY3Rpb24gPT09IEludmFsaWRQcm9qZWN0aW9uQ29kZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBwcm9qZWN0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNpemUgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgZ2V0IHNpemUoKTogU2l6ZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3aWR0aDogdGhpcy52YWx1ZTxudW1iZXI+KFRpZmZUYWcuSW1hZ2VXaWR0aCkgYXMgbnVtYmVyLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnZhbHVlPG51bWJlcj4oVGlmZlRhZy5JbWFnZUhlaWdodCkgYXMgbnVtYmVyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbGlzdCBvZiBJRkQgdGFncyB0aGF0IHdlcmUgcmVhZFxuICAgICAqL1xuICAgIGdldCB0YWdMaXN0KCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLnRhZ3Mua2V5cygpXS5tYXAoKGMpID0+IFRpZmZUYWdbY10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZSBpZiB0aGlzIGltYWdlIGlzIHRpbGVkXG4gICAgICovXG4gICAgcHVibGljIGlzVGlsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlKFRpZmZUYWcuVGlsZVdpZHRoKSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc2l6ZSBvZiBpbmRpdmlkdWFsIHRpbGVzXG4gICAgICovXG4gICAgZ2V0IHRpbGVTaXplKCk6IENvZ1RpZmZJbWFnZVRpbGVTaXplIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnZhbHVlPG51bWJlcj4oVGlmZlRhZy5UaWxlV2lkdGgpIGFzIG51bWJlcixcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy52YWx1ZTxudW1iZXI+KFRpZmZUYWcuVGlsZUhlaWdodCkgYXMgbnVtYmVyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiB0aWxlcyB1c2VkIHRvIGNyZWF0ZSB0aGlzIGltYWdlXG4gICAgICovXG4gICAgZ2V0IHRpbGVDb3VudCgpOiBDb2dUaWZmSW1hZ2VUaWxlZENvdW50IHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgICAgY29uc3QgdGlsZVNpemUgPSB0aGlzLnRpbGVTaXplO1xuICAgICAgICBjb25zdCB4ID0gTWF0aC5jZWlsKHNpemUud2lkdGggLyB0aWxlU2l6ZS53aWR0aCk7XG4gICAgICAgIGNvbnN0IHkgPSBNYXRoLmNlaWwoc2l6ZS5oZWlnaHQgLyB0aWxlU2l6ZS5oZWlnaHQpO1xuICAgICAgICByZXR1cm4geyB4LCB5IH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwb2ludGVyIHRvIHdoZXJlIHRoZSB0aWxlcyBzdGFydCBpbiB0aGUgVGlmZiBmaWxlXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBVc2VkIHRvIHJlYWQgdGlsZWQgdGlmZnNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGZpbGUgb2Zmc2V0IHRvIHdoZXJlIHRoZSB0aWZmcyBhcmUgc3RvcmVkXG4gICAgICovXG4gICAgZ2V0IHRpbGVPZmZzZXQoKTogQ29nVGlmZlRhZ09mZnNldCB7XG4gICAgICAgIGNvbnN0IHRpbGVPZmZzZXQgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuVGlsZU9mZnNldHMpIGFzIENvZ1RpZmZUYWdPZmZzZXQ7XG4gICAgICAgIGlmICh0aWxlT2Zmc2V0ID09IG51bGwpIHRocm93IG5ldyBFcnJvcignTm8gdGlsZSBvZmZzZXRzIGZvdW5kJyk7XG4gICAgICAgIHJldHVybiB0aWxlT2Zmc2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHN0cmlwJ3MgaW5zaWRlIHRoaXMgdGlmZlxuICAgICAqXG4gICAgICogQHJlbWFya3MgVXNlZCB0byByZWFkIHN0cmlwZWQgdGlmZnNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIG51bWJlciBvZiBzdHJpcHMgcHJlc2VudFxuICAgICAqL1xuICAgIGdldCBzdHJpcENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRpbGVPZmZzZXQgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuU3RyaXBCeXRlQ291bnRzKSBhcyBDb2dUaWZmVGFnT2Zmc2V0O1xuICAgICAgICBpZiAodGlsZU9mZnNldCA9PSBudWxsKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHRpbGVPZmZzZXQuZGF0YUNvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHBvaW50ZXIgdG8gYSBzcGVjaWZpYyB0aWxlIGluc2lkZSB0aGUgdGlmZiBmaWxlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXggdGlsZSBpbmRleFxuICAgICAqIEByZXR1cm5zIGZpbGUgb2Zmc2V0IG9mIHRoZSBzcGVjaWZpZWQgdGlsZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3luYyBnZXRUaWxlT2Zmc2V0KGluZGV4OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCB0aWxlT2Zmc2V0ID0gdGhpcy50aWxlT2Zmc2V0O1xuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gdGlsZU9mZnNldC5kYXRhQ291bnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGlsZSBvZmZzZXQ6ICR7aW5kZXh9IG91dCBvZiByYW5nZTogMCAtPiAke3RpbGVPZmZzZXQuZGF0YUNvdW50fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmV0Y2ggb25seSB0aGUgcGFydCBvZiB0aGUgb2Zmc2V0cyB0aGF0IGFyZSBuZWVkZWRcbiAgICAgICAgcmV0dXJuIHRpbGVPZmZzZXQuZ2V0VmFsdWVBdChpbmRleCk7XG4gICAgfVxuXG4gICAgLy8gQ2xhbXAgdGhlIGJvdW5kcyBvZiB0aGUgb3V0cHV0IGltYWdlIHRvIHRoZSBzaXplIG9mIHRoZSBpbWFnZSwgYXMgc29tZXRpbWVzIHRoZSBlZGdlIHRpbGVzIGFyZSBub3QgZnVsbCB0aWxlc1xuICAgIGdldFRpbGVCb3VuZHMoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBCb3VuZGluZ0JveCB7XG4gICAgICAgIGNvbnN0IHsgc2l6ZSwgdGlsZVNpemUgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHRvcCA9IHkgKiB0aWxlU2l6ZS5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IGxlZnQgPSB4ICogdGlsZVNpemUud2lkdGg7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gbGVmdCArIHRpbGVTaXplLndpZHRoID49IHNpemUud2lkdGggPyBzaXplLndpZHRoIC0gbGVmdCA6IHRpbGVTaXplLndpZHRoO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0b3AgKyB0aWxlU2l6ZS5oZWlnaHQgPj0gc2l6ZS5oZWlnaHQgPyBzaXplLmhlaWdodCAtIHRvcCA6IHRpbGVTaXplLmhlaWdodDtcbiAgICAgICAgcmV0dXJuIHsgeDogbGVmdCwgeTogdG9wLCB3aWR0aCwgaGVpZ2h0IH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhZCBhIHN0cmlwIGludG8gYSB1aW50OCBhcnJheVxuICAgICAqXG4gICAgICogQHBhcmFtIGluZGV4IFN0cmlwIGluZGV4IHRvIHJlYWRcbiAgICAgKi9cbiAgICBhc3luYyBnZXRTdHJpcChpbmRleDogbnVtYmVyKTogUHJvbWlzZTx7IG1pbWVUeXBlOiBUaWZmTWltZVR5cGU7IGJ5dGVzOiBVaW50OEFycmF5IH0gfCBudWxsPiB7XG4gICAgICAgIGlmICh0aGlzLmlzVGlsZWQoKSkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBzdHJpcGVzLCB0aWZmIGlzIHRpbGVkJyk7XG5cbiAgICAgICAgY29uc3QgYnl0ZUNvdW50cyA9IHRoaXMudGFncy5nZXQoVGlmZlRhZy5TdHJpcEJ5dGVDb3VudHMpIGFzIENvZ1RpZmZUYWdPZmZzZXQ7XG4gICAgICAgIGNvbnN0IG9mZnNldHMgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuU3RyaXBPZmZzZXRzKSBhcyBDb2dUaWZmVGFnT2Zmc2V0O1xuXG4gICAgICAgIGlmIChpbmRleCA+PSBieXRlQ291bnRzLmRhdGFDb3VudCkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBzdHJpcCwgaW5kZXggb3V0IG9mIGJvdW5kcycpO1xuXG4gICAgICAgIGNvbnN0IFtieXRlQ291bnQsIG9mZnNldF0gPSBhd2FpdCBQcm9taXNlLmFsbChbb2Zmc2V0cy5nZXRWYWx1ZUF0KGluZGV4KSwgYnl0ZUNvdW50cy5nZXRWYWx1ZUF0KGluZGV4KV0pO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCeXRlcyhieXRlQ291bnQsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBqcGVnIGhlYWRlciBpcyBzdG9yZWQgaW4gdGhlIElGRCwgcmVhZCB0aGUgSlBFRyBoZWFkZXIgYW5kIGFkanVzdCB0aGUgYnl0ZSBhcnJheSB0byBpbmNsdWRlIGl0ICovXG4gICAgcHJpdmF0ZSBnZXRKcGVnSGVhZGVyKGJ5dGVzOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgICAgIC8vIEJvdGggdGhlIEpQRUdUYWJsZSBhbmQgdGhlIEJ5dGVzIHdpdGggaGF2ZSB0aGUgc3RhcnQgb2YgaW1hZ2UgYW5kIGVuZCBvZiBpbWFnZSBtYXJrZXJzXG4gICAgICAgIC8vIFN0YXJ0T2ZJbWFnZSAweGZmZDggRW5kT2ZJbWFnZSAweGZmZDlcbiAgICAgICAgY29uc3QgdGFibGVzID0gdGhpcy52YWx1ZTxudW1iZXJbXT4oVGlmZlRhZy5KUEVHVGFibGVzKTtcbiAgICAgICAgaWYgKHRhYmxlcyA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIEpwZWcgaGVhZGVyJyk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIEVuZE9mSW1hZ2UgbWFya2VyXG4gICAgICAgIGNvbnN0IHRhYmxlRGF0YSA9IHRhYmxlcy5zbGljZSgwLCB0YWJsZXMubGVuZ3RoIC0gMik7XG4gICAgICAgIGNvbnN0IGFjdHVhbEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMuYnl0ZUxlbmd0aCArIHRhYmxlRGF0YS5sZW5ndGggLSAyKTtcbiAgICAgICAgYWN0dWFsQnl0ZXMuc2V0KHRhYmxlRGF0YSwgMCk7XG4gICAgICAgIGFjdHVhbEJ5dGVzLnNldChieXRlcy5zbGljZSgyKSwgdGFibGVEYXRhLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiBhY3R1YWxCeXRlcztcbiAgICB9XG5cbiAgICAvKiogUmVhZCBpbWFnZSBieXRlcyBhdCB0aGUgZ2l2ZW4gb2Zmc2V0ICovXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRCeXRlcyhcbiAgICAgICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgICAgIGJ5dGVDb3VudDogbnVtYmVyLFxuICAgICk6IFByb21pc2U8eyBtaW1lVHlwZTogVGlmZk1pbWVUeXBlOyBieXRlczogVWludDhBcnJheSB9IHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBtaW1lVHlwZSA9IHRoaXMuY29tcHJlc3Npb247XG4gICAgICAgIGlmIChtaW1lVHlwZSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGNvbXByZXNzaW9uOiAnICsgdGhpcy52YWx1ZShUaWZmVGFnLkNvbXByZXNzaW9uKSk7XG4gICAgICAgIGlmIChieXRlQ291bnQgPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICAgIGF3YWl0IHRoaXMudGlmLnNvdXJjZS5sb2FkQnl0ZXMob2Zmc2V0LCBieXRlQ291bnQpO1xuICAgICAgICBjb25zdCBieXRlcyA9IHRoaXMudGlmLnNvdXJjZS5ieXRlcyhvZmZzZXQsIGJ5dGVDb3VudCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcHJlc3Npb24gPT09IFRpZmZNaW1lVHlwZS5KUEVHKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtaW1lVHlwZSwgYnl0ZXM6IHRoaXMuZ2V0SnBlZ0hlYWRlcihieXRlcykgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBtaW1lVHlwZSwgYnl0ZXMgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIHRoZSB0aWxlIGJ1ZmZlciwgdGhpcyB3b3JrcyBiZXN0IHdpdGggd2VicFxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGFsc28gYXBwbHkgdGhlIEpQRUcgY29tcHJlc3Npb24gdGFibGVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBUaWxlIHggb2Zmc2V0XG4gICAgICogQHBhcmFtIHkgVGlsZSB5IG9mZnNldFxuICAgICAqL1xuICAgIGFzeW5jIGdldFRpbGUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQcm9taXNlPHsgbWltZVR5cGU6IFRpZmZNaW1lVHlwZTsgYnl0ZXM6IFVpbnQ4QXJyYXkgfSB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgbWltZVR5cGUgPSB0aGlzLmNvbXByZXNzaW9uO1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5zaXplO1xuICAgICAgICBjb25zdCB0aWxlcyA9IHRoaXMudGlsZVNpemU7XG5cbiAgICAgICAgaWYgKHRpbGVzID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVGlmZiBpcyBub3QgdGlsZWQnKTtcbiAgICAgICAgaWYgKG1pbWVUeXBlID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY29tcHJlc3Npb246ICcgKyB0aGlzLnZhbHVlKFRpZmZUYWcuQ29tcHJlc3Npb24pKTtcblxuICAgICAgICAvLyBUT0RPIHN1cHBvcnQgR2hvc3RPcHRpb25UaWxlT3JkZXJcbiAgICAgICAgY29uc3QgbnlUaWxlcyA9IE1hdGguY2VpbChzaXplLmhlaWdodCAvIHRpbGVzLmhlaWdodCk7XG4gICAgICAgIGNvbnN0IG54VGlsZXMgPSBNYXRoLmNlaWwoc2l6ZS53aWR0aCAvIHRpbGVzLndpZHRoKTtcblxuICAgICAgICBpZiAoeCA+PSBueFRpbGVzIHx8IHkgPj0gbnlUaWxlcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaWxlIGluZGV4IGlzIG91dHNpZGUgb2YgcmFuZ2UgeDoke3h9ID49ICR7bnhUaWxlc30gb3IgeToke3l9ID49ICR7bnlUaWxlc31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlkeCA9IHkgKiBueFRpbGVzICsgeDtcbiAgICAgICAgY29uc3QgdG90YWxUaWxlcyA9IG54VGlsZXMgKiBueVRpbGVzO1xuICAgICAgICBpZiAoaWR4ID49IHRvdGFsVGlsZXMpIHRocm93IG5ldyBFcnJvcihgVGlsZSBpbmRleCBpcyBvdXRzaWRlIG9mIHRpbGUgcmFuZ2U6ICR7aWR4fSA+PSAke3RvdGFsVGlsZXN9YCk7XG5cbiAgICAgICAgY29uc3QgeyBvZmZzZXQsIGltYWdlU2l6ZSB9ID0gYXdhaXQgdGhpcy5nZXRUaWxlU2l6ZShpZHgpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCeXRlcyhvZmZzZXQsIGltYWdlU2l6ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG9lcyB0aGlzIHRpbGUgZXhpc3QgaW4gdGhlIHRpZmYgYW5kIGRvZXMgaXQgYWN0dWFsbHkgaGF2ZSBhIHZhbHVlXG4gICAgICpcbiAgICAgKiBTcGFyc2UgdGlmZnMgY2FuIGhhdmUgYSBsb3Qgb2YgZW1wdHkgdGlsZXMsIHRoaXMgY2hlY2tzIHRvIHNlZSBpZiB0aGUgdGlsZSBhY3R1YWxseSBoYXMgZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRpbGUgeCBvZmZzZXRcbiAgICAgKiBAcGFyYW0geSBUaWxlIHkgb2Zmc2V0XG4gICAgICogQHJldHVybnMgaWYgdGhlIHRpbGUgZXhpc3RzIGFuZCBoYXMgZGF0YVxuICAgICAqL1xuICAgIGFzeW5jIGhhc1RpbGUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgdGlsZXMgPSB0aGlzLnRpbGVTaXplO1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5zaXplO1xuXG4gICAgICAgIGlmICh0aWxlcyA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ1RpZmYgaXMgbm90IHRpbGVkJyk7XG5cbiAgICAgICAgLy8gVE9ETyBzdXBwb3J0IEdob3N0T3B0aW9uVGlsZU9yZGVyXG4gICAgICAgIGNvbnN0IG55VGlsZXMgPSBNYXRoLmNlaWwoc2l6ZS5oZWlnaHQgLyB0aWxlcy5oZWlnaHQpO1xuICAgICAgICBjb25zdCBueFRpbGVzID0gTWF0aC5jZWlsKHNpemUud2lkdGggLyB0aWxlcy53aWR0aCk7XG4gICAgICAgIGlmICh4ID49IG54VGlsZXMgfHwgeSA+PSBueVRpbGVzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGlkeCA9IHkgKiBueFRpbGVzICsgeDtcbiAgICAgICAgY29uc3QgcmV0ID0gYXdhaXQgdGhpcy5nZXRUaWxlU2l6ZShpZHgpO1xuICAgICAgICByZXR1cm4gcmV0Lm9mZnNldCA+IDA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGdldFRpbGVTaXplKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPHsgb2Zmc2V0OiBudW1iZXI7IGltYWdlU2l6ZTogbnVtYmVyIH0+IHtcbiAgICAgICAgLy8gR0RBTCBvcHRpbWl6ZXMgdGlsZXMgYnkgc3RvcmluZyB0aGUgc2l6ZSBvZiB0aGUgdGlsZSBpblxuICAgICAgICAvLyB0aGUgZmV3IGJ5dGVzIGxlYWRpbmcgdXAgdG8gdGhlIHRpbGVcbiAgICAgICAgY29uc3QgbGVhZGVyQnl0ZXMgPSB0aGlzLnRpZi5vcHRpb25zLnRpbGVMZWFkZXJCeXRlU2l6ZTtcbiAgICAgICAgaWYgKGxlYWRlckJ5dGVzKSB7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBhd2FpdCB0aGlzLmdldFRpbGVPZmZzZXQoaW5kZXgpO1xuICAgICAgICAgICAgLy8gU3BhcnNlIENPRyBubyBkYXRhIGZvdW5kXG4gICAgICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSByZXR1cm4geyBvZmZzZXQ6IDAsIGltYWdlU2l6ZTogMCB9O1xuXG4gICAgICAgICAgICAvLyBUaGlzIGZldGNoIHdpbGwgZ2VuZXJhbGx5IGxvYWQgaW4gdGhlIGJ5dGVzIG5lZWRlZCBmb3IgdGhlIGltYWdlIHRvb1xuICAgICAgICAgICAgLy8gcHJvdmlkZWQgdGhlIGltYWdlIHNpemUgaXMgbGVzcyB0aGFuIHRoZSBzaXplIG9mIGEgY2h1bmtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudGlmLnNvdXJjZS5sb2FkQnl0ZXMob2Zmc2V0IC0gbGVhZGVyQnl0ZXMsIGxlYWRlckJ5dGVzKTtcbiAgICAgICAgICAgIHJldHVybiB7IG9mZnNldCwgaW1hZ2VTaXplOiB0aGlzLnRpZi5zb3VyY2UuZ2V0VWludChvZmZzZXQgLSBsZWFkZXJCeXRlcywgbGVhZGVyQnl0ZXMpIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBieXRlQ291bnRzID0gdGhpcy50YWdzLmdldChUaWZmVGFnLlRpbGVCeXRlQ291bnRzKSBhcyBDb2dUaWZmVGFnT2Zmc2V0O1xuICAgICAgICBpZiAoYnl0ZUNvdW50cyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRpbGUgYnl0ZSBjb3VudHMgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBbb2Zmc2V0LCBpbWFnZVNpemVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0VGlsZU9mZnNldChpbmRleCksIGJ5dGVDb3VudHMuZ2V0VmFsdWVBdChpbmRleCldKTtcbiAgICAgICAgcmV0dXJuIHsgb2Zmc2V0LCBpbWFnZVNpemUgfTtcbiAgICB9XG59XG4iXX0=
package/build/cog.tiff.js CHANGED
@@ -68,13 +68,8 @@ export class CogTiff {
68
68
  }
69
69
  const ghostSize = nextOffsetIfd - this.cursor.currentOffset;
70
70
  // GDAL now stores metadata between the IFD inside a ghost storage area
71
- if (ghostSize > 0 && ghostSize < 16 * 1024) {
72
- // logger?.debug(
73
- // { offset: toHexString(this.cursor.currentOffset), length: toHexString(ghostSize) },
74
- // 'GhostOptions',
75
- // );
76
- // this.options.process(this.source, view.currentOffset, ghostSize);
77
- }
71
+ if (ghostSize > 0 && ghostSize < 16 * 1024)
72
+ this.options.process(view.bytes(ghostSize));
78
73
  return this.processIfd(nextOffsetIfd);
79
74
  }
80
75
  getImage(z) {
@@ -120,16 +115,14 @@ export class CogTiff {
120
115
  return image.getTile(x, y);
121
116
  }
122
117
  async processIfd(offset) {
123
- if (!this.source.hasBytes(offset, 4096))
124
- await this.source.loadBytes(offset, 4096);
125
118
  const { image, nextOffset } = await this.readIfd(offset);
126
119
  this.images.push(image);
127
120
  if (nextOffset)
128
121
  await this.processIfd(nextOffset);
129
122
  }
130
123
  async readIfd(offset) {
131
- if (!this.source.hasBytes(offset, 1024))
132
- await this.source.loadBytes(offset, this.source.chunkSize);
124
+ if (!this.source.hasBytes(offset, 4096))
125
+ await this.source.loadBytes(offset, 4096);
133
126
  const view = this.cursor.seekTo(offset);
134
127
  const tagCount = view.offset();
135
128
  const byteStart = offset + this.ifdConfig.offset;
@@ -152,4 +145,4 @@ export class CogTiff {
152
145
  await ((_b = (_a = this.source) === null || _a === void 0 ? void 0 : _a.close) === null || _b === void 0 ? void 0 : _b.call(_a));
153
146
  }
154
147
  }
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLnRpZmYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29nLnRpZmYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBaUIsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRCxNQUFNLE9BQU8sT0FBTztJQVNoQixZQUFZLE1BQW1CO1FBUC9CLFlBQU8sR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQzNCLFdBQU0sR0FBbUIsRUFBRSxDQUFDO1FBQzVCLFlBQU8sR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFHbkMsY0FBUyxHQUFrQixhQUFhLENBQUM7UUFZekMsNkJBQTZCO1FBQzdCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBVmxCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQW1CO1FBQzdCLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQU1EOzs7O09BSUc7SUFD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QUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0IsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDekMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFFaEIsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUk7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDakYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ3pCO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9ELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELGdEQUFnRDtJQUNoRCxLQUFLLENBQUMsS0FBSzs7UUFDUCxNQUFNLENBQUEsTUFBQSxNQUFBLElBQUksQ0FBQyxNQUFNLDBDQUFFLEtBQUssa0RBQUksQ0FBQSxDQUFDO0lBQ2pDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENodW5rU291cmNlIH0gZnJvbSAnQGNodW5rZC9jb3JlJztcbmltcG9ydCB7IENvZ1RpZmZJbWFnZSB9IGZyb20gJy4vY29nLnRpZmYuaW1hZ2UuanMnO1xuaW1wb3J0IHsgVGlmZkVuZGlhbiB9IGZyb20gJy4vY29uc3QvdGlmZi5lbmRpYW4uanMnO1xuaW1wb3J0IHsgVGlmZlRhZyB9IGZyb20gJy4vY29uc3QvdGlmZi50YWcuaWQuanMnO1xuaW1wb3J0IHsgVGlmZlZlcnNpb24gfSBmcm9tICcuL2NvbnN0L3RpZmYudmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBDb2dUaWZmVGFnQmFzZSB9IGZyb20gJy4vcmVhZC90YWcvdGlmZi50YWcuYmFzZS5qcyc7XG5pbXBvcnQgeyBDb2dUaWZHaG9zdE9wdGlvbnMgfSBmcm9tICcuL3JlYWQvdGlmZi5nZGFsLmpzJztcbmltcG9ydCB7IFRhZ1RpZmZCaWdDb25maWcsIFRhZ1RpZmZDb25maWcsIFRpZmZJZmRDb25maWcgfSBmcm9tICcuL3JlYWQvdGlmZi5pZmQuY29uZmlnLmpzJztcbmltcG9ydCB7IENvZ1RpZmZUYWcgfSBmcm9tICcuL3JlYWQvdGlmZi50YWcuanMnO1xuaW1wb3J0IHsgQ29nU291cmNlQ3Vyc29yIH0gZnJvbSAnLi9zb3VyY2UvY29nLnNvdXJjZS52aWV3LmpzJztcbmltcG9ydCB7IHRvSGV4U3RyaW5nIH0gZnJvbSAnLi91dGlsL3V0aWwuaGV4LmpzJztcblxuZXhwb3J0IGNsYXNzIENvZ1RpZmYge1xuICAgIHNvdXJjZTogQ2h1bmtTb3VyY2U7XG4gICAgdmVyc2lvbiA9IFRpZmZWZXJzaW9uLlRpZmY7XG4gICAgaW1hZ2VzOiBDb2dUaWZmSW1hZ2VbXSA9IFtdO1xuICAgIG9wdGlvbnMgPSBuZXcgQ29nVGlmR2hvc3RPcHRpb25zKCk7XG5cbiAgICBwcml2YXRlIGN1cnNvcjogQ29nU291cmNlQ3Vyc29yO1xuICAgIGlmZENvbmZpZzogVGlmZklmZENvbmZpZyA9IFRhZ1RpZmZDb25maWc7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2U6IENodW5rU291cmNlKSB7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLmN1cnNvciA9IG5ldyBDb2dTb3VyY2VDdXJzb3IodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIENvZ1RpZmYgKi9cbiAgICBzdGF0aWMgY3JlYXRlKHNvdXJjZTogQ2h1bmtTb3VyY2UpOiBQcm9taXNlPENvZ1RpZmY+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2dUaWZmKHNvdXJjZSkuaW5pdCgpO1xuICAgIH1cblxuICAgIC8qKiBIYXMgaW5pdCgpIGJlZW4gY2FsbGVkICovXG4gICAgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgX2luaXRQcm9taXNlPzogUHJvbWlzZTxDb2dUaWZmPjtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBDT0cgbG9hZGluZyBpbiB0aGUgaGVhZGVyIGFuZCBhbGwgaW1hZ2UgaGVhZGVyc1xuICAgICAqXG4gICAgICogQHBhcmFtIGxvYWRHZW9LZXlzIFdoZXRoZXIgdG8gYWxzbyBpbml0aWFsaXplIHRoZSBHZW9LZXlEaXJlY3RvcnlcbiAgICAgKi9cbiAgICBpbml0KGxvYWRHZW9LZXlzID0gZmFsc2UpOiBQcm9taXNlPENvZ1RpZmY+IHtcbiAgICAgICAgaWYgKHRoaXMuX2luaXRQcm9taXNlKSByZXR1cm4gdGhpcy5faW5pdFByb21pc2U7XG4gICAgICAgIHRoaXMuX2luaXRQcm9taXNlID0gdGhpcy5kb0luaXQobG9hZEdlb0tleXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5faW5pdFByb21pc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkb0luaXQobG9hZEdlb0tleXMgPSBmYWxzZSk6IFByb21pc2U8Q29nVGlmZj4ge1xuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSByZXR1cm4gdGhpcztcbiAgICAgICAgLy8gTG9hZCB0aGUgZmlyc3QgZmV3IEtCIGluLCBtb3JlIGxvYWRzIHdpbGwgcnVuIGFzIG1vcmUgZGF0YSBpcyByZXF1aXJlZFxuICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZS5sb2FkQnl0ZXMoMCwgdGhpcy5zb3VyY2UuY2h1bmtTaXplKTtcbiAgICAgICAgYXdhaXQgdGhpcy5mZXRjaElmZCgpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmltYWdlcy5tYXAoKGMpID0+IGMuaW5pdChsb2FkR2VvS2V5cykpKTtcblxuICAgICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGZldGNoSWZkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy5jdXJzb3Iuc2Vla1RvKDApO1xuICAgICAgICBjb25zdCBlbmRpYW4gPSB2aWV3LnVpbnQxNigpO1xuICAgICAgICB0aGlzLnNvdXJjZS5pc0xpdHRsZUVuZGlhbiA9IGVuZGlhbiA9PT0gVGlmZkVuZGlhbi5MaXR0bGU7XG4gICAgICAgIGlmICghdGhpcy5zb3VyY2UuaXNMaXR0bGVFbmRpYW4pIHRocm93IG5ldyBFcnJvcignT25seSBsaXR0bGUgZW5kaWFuIGlzIHN1cHBvcnRlZCcpO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB2aWV3LnVpbnQxNigpO1xuXG4gICAgICAgIGxldCBuZXh0T2Zmc2V0SWZkOiBudW1iZXI7XG4gICAgICAgIGlmICh0aGlzLnZlcnNpb24gPT09IFRpZmZWZXJzaW9uLkJpZ1RpZmYpIHtcbiAgICAgICAgICAgIHRoaXMuaWZkQ29uZmlnID0gVGFnVGlmZkJpZ0NvbmZpZztcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ZXJTaXplID0gdmlldy51aW50MTYoKTtcbiAgICAgICAgICAgIGlmIChwb2ludGVyU2l6ZSAhPT0gOCkgdGhyb3cgbmV3IEVycm9yKCdPbmx5IDhieXRlIHBvaW50ZXJzIGFyZSBzdXBwb3J0ZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHplcm9zID0gdmlldy51aW50MTYoKTtcbiAgICAgICAgICAgIGlmICh6ZXJvcyAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJpZyB0aWZmIGhlYWRlcicpO1xuICAgICAgICAgICAgbmV4dE9mZnNldElmZCA9IHZpZXcucG9pbnRlcigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmVyc2lvbiA9PT0gVGlmZlZlcnNpb24uVGlmZikge1xuICAgICAgICAgICAgbmV4dE9mZnNldElmZCA9IHZpZXcucG9pbnRlcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPbmx5IHRpZmYgc3VwcG9ydGVkIHZlcnNpb246JHt0aGlzLnZlcnNpb259YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBnaG9zdFNpemUgPSBuZXh0T2Zmc2V0SWZkIC0gdGhpcy5jdXJzb3IuY3VycmVudE9mZnNldDtcbiAgICAgICAgLy8gR0RBTCBub3cgc3RvcmVzIG1ldGFkYXRhIGJldHdlZW4gdGhlIElGRCBpbnNpZGUgYSBnaG9zdCBzdG9yYWdlIGFyZWFcbiAgICAgICAgaWYgKGdob3N0U2l6ZSA+IDAgJiYgZ2hvc3RTaXplIDwgMTYgKiAxMDI0KSB7XG4gICAgICAgICAgICAvLyBsb2dnZXI/LmRlYnVnKFxuICAgICAgICAgICAgLy8gICAgIHsgb2Zmc2V0OiB0b0hleFN0cmluZyh0aGlzLmN1cnNvci5jdXJyZW50T2Zmc2V0KSwgbGVuZ3RoOiB0b0hleFN0cmluZyhnaG9zdFNpemUpIH0sXG4gICAgICAgICAgICAvLyAgICAgJ0dob3N0T3B0aW9ucycsXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgLy8gdGhpcy5vcHRpb25zLnByb2Nlc3ModGhpcy5zb3VyY2UsIHZpZXcuY3VycmVudE9mZnNldCwgZ2hvc3RTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NJZmQobmV4dE9mZnNldElmZCk7XG4gICAgfVxuXG4gICAgZ2V0SW1hZ2UoejogbnVtYmVyKTogQ29nVGlmZkltYWdlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzW3pdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgYSBpbWFnZSB3aGljaCBoYXMgYSByZXNvbHV0aW9uIHNpbWlsYXIgdG8gdGhlIHByb3ZpZGVkIHJlc29sdXRpb25cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXNvbHV0aW9uIHJlc29sdXRpb24gdG8gZmluZFxuICAgICAqL1xuICAgIGdldEltYWdlQnlSZXNvbHV0aW9uKHJlc29sdXRpb246IG51bWJlcik6IENvZ1RpZmZJbWFnZSB7XG4gICAgICAgIGNvbnN0IGZpcnN0SW1hZ2UgPSB0aGlzLmltYWdlc1swXTtcbiAgICAgICAgY29uc3QgZmlyc3RJbWFnZVNpemUgPSBmaXJzdEltYWdlLnNpemU7XG4gICAgICAgIGNvbnN0IFtyZWZYXSA9IGZpcnN0SW1hZ2UucmVzb2x1dGlvbjtcblxuICAgICAgICBjb25zdCByZXNvbHV0aW9uQmFzZVggPSByZWZYICogZmlyc3RJbWFnZVNpemUud2lkdGg7XG4gICAgICAgIC8vIGNvbnN0IHJlc29sdXRpb25CYXNlWSA9IHJlZlkgKiBmaXJzdEltYWdlU2l6ZS5oZWlnaHQ7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmltYWdlcy5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBpbWcgPSB0aGlzLmltYWdlc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGltZ1NpemUgPSBpbWcuc2l6ZTtcblxuICAgICAgICAgICAgY29uc3QgaW1nUmVzb2x1dGlvblggPSByZXNvbHV0aW9uQmFzZVggLyBpbWdTaXplLndpZHRoO1xuICAgICAgICAgICAgLy8gVE9ETyBkbyB3ZSBjYXJlIGFib3V0IHkgcmVzb2x1dGlvblxuICAgICAgICAgICAgLy8gY29uc3QgaW1nUmVzb2x1dGlvblkgPSByZXNvbHV0aW9uQmFzZVkgLyBpbWdTaXplLmhlaWdodDtcblxuICAgICAgICAgICAgaWYgKGltZ1Jlc29sdXRpb25YIC0gcmVzb2x1dGlvbiA8PSAwLjAxKSByZXR1cm4gaW1nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaXJzdEltYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcmF3IGJ5dGVzIGZvciBhIHRpbGUgYXQgYSBnaXZlbiB4LHksIGluZGV4LlxuICAgICAqXG4gICAgICogVGhpcyBtYXkgcmV0dXJuIG51bGwgaWYgdGhlIHRpbGUgZG9lcyBub3QgZXhpc3QgZWcgU3BhcnNlIGNvZ3MsXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCB0aWxlIHggaW5kZXhcbiAgICAgKiBAcGFyYW0geSB0aWxlIHkgaW5kZXhcbiAgICAgKiBAcGFyYW0gaW5kZXggaW1hZ2UgaW5kZXhcbiAgICAgKi9cbiAgICBhc3luYyBnZXRUaWxlKHg6IG51bWJlciwgeTogbnVtYmVyLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTx7IG1pbWVUeXBlOiBzdHJpbmc7IGJ5dGVzOiBVaW50OEFycmF5IH0gfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5nZXRJbWFnZShpbmRleCk7XG4gICAgICAgIGlmIChpbWFnZSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgejogJHtpbmRleH1gKTtcbiAgICAgICAgaWYgKCFpbWFnZS5pc1RpbGVkKCkpIHRocm93IG5ldyBFcnJvcignVGlmIGlzIG5vdCB0aWxlZCcpO1xuXG4gICAgICAgIHJldHVybiBpbWFnZS5nZXRUaWxlKHgsIHkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0lmZChvZmZzZXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuc291cmNlLmhhc0J5dGVzKG9mZnNldCwgNDA5NikpIGF3YWl0IHRoaXMuc291cmNlLmxvYWRCeXRlcyhvZmZzZXQsIDQwOTYpO1xuXG4gICAgICAgIGNvbnN0IHsgaW1hZ2UsIG5leHRPZmZzZXQgfSA9IGF3YWl0IHRoaXMucmVhZElmZChvZmZzZXQpO1xuICAgICAgICB0aGlzLmltYWdlcy5wdXNoKGltYWdlKTtcblxuICAgICAgICBpZiAobmV4dE9mZnNldCkgYXdhaXQgdGhpcy5wcm9jZXNzSWZkKG5leHRPZmZzZXQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVhZElmZChvZmZzZXQ6IG51bWJlcik6IFByb21pc2U8eyBuZXh0T2Zmc2V0OiBudW1iZXI7IGltYWdlOiBDb2dUaWZmSW1hZ2UgfT4ge1xuICAgICAgICBpZiAoIXRoaXMuc291cmNlLmhhc0J5dGVzKG9mZnNldCwgMTAyNCkpIGF3YWl0IHRoaXMuc291cmNlLmxvYWRCeXRlcyhvZmZzZXQsIHRoaXMuc291cmNlLmNodW5rU2l6ZSk7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLmN1cnNvci5zZWVrVG8ob2Zmc2V0KTtcbiAgICAgICAgY29uc3QgdGFnQ291bnQgPSB2aWV3Lm9mZnNldCgpO1xuICAgICAgICBjb25zdCBieXRlU3RhcnQgPSBvZmZzZXQgKyB0aGlzLmlmZENvbmZpZy5vZmZzZXQ7XG4gICAgICAgIGNvbnN0IHRhZ3M6IE1hcDxUaWZmVGFnLCBDb2dUaWZmVGFnQmFzZT4gPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgbGV0IHBvcyA9IGJ5dGVTdGFydDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSBDb2dUaWZmVGFnLmNyZWF0ZSh0aGlzLCBwb3MpO1xuICAgICAgICAgICAgcG9zICs9IHRhZy5zaXplO1xuXG4gICAgICAgICAgICBpZiAodGFnLm5hbWUgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIElGRCBUYWc6ICcgKyB0b0hleFN0cmluZyh0YWcuaWQpKTtcbiAgICAgICAgICAgIHRhZ3Muc2V0KHRhZy5pZCwgdGFnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGltYWdlID0gbmV3IENvZ1RpZmZJbWFnZSh0aGlzLCB0aGlzLmltYWdlcy5sZW5ndGgsIHRhZ3MpO1xuICAgICAgICBjb25zdCBuZXh0T2Zmc2V0ID0gdGhpcy5zb3VyY2UuZ2V0VWludChwb3MsIHRoaXMuaWZkQ29uZmlnLnBvaW50ZXIpO1xuICAgICAgICByZXR1cm4geyBuZXh0T2Zmc2V0LCBpbWFnZSB9O1xuICAgIH1cblxuICAgIC8qKiBDbG9zZSB0aGUgZmlsZSBzb3VyY2UgaWYgaXQgbmVlZHMgY2xvc2luZyAqL1xuICAgIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZT8uY2xvc2U/LigpO1xuICAgIH1cbn1cbiJdfQ==
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLnRpZmYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29nLnRpZmYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBaUIsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRCxNQUFNLE9BQU8sT0FBTztJQVNoQixZQUFZLE1BQW1CO1FBUC9CLFlBQU8sR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQzNCLFdBQU0sR0FBbUIsRUFBRSxDQUFDO1FBQzVCLFlBQU8sR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFHbkMsY0FBUyxHQUFrQixhQUFhLENBQUM7UUFZekMsNkJBQTZCO1FBQzdCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBVmxCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQW1CO1FBQzdCLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQU1EOzs7O09BSUc7SUFD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QUksQ0FBQztZQUVoQixJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSTtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNqRixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDekI7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsZ0RBQWdEO0lBQ2hELEtBQUssQ0FBQyxLQUFLOztRQUNQLE1BQU0sQ0FBQSxNQUFBLE1BQUEsSUFBSSxDQUFDLE1BQU0sMENBQUUsS0FBSyxrREFBSSxDQUFBLENBQUM7SUFDakMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2h1bmtTb3VyY2UgfSBmcm9tICdAY2h1bmtkL2NvcmUnO1xuaW1wb3J0IHsgQ29nVGlmZkltYWdlIH0gZnJvbSAnLi9jb2cudGlmZi5pbWFnZS5qcyc7XG5pbXBvcnQgeyBUaWZmRW5kaWFuIH0gZnJvbSAnLi9jb25zdC90aWZmLmVuZGlhbi5qcyc7XG5pbXBvcnQgeyBUaWZmVGFnIH0gZnJvbSAnLi9jb25zdC90aWZmLnRhZy5pZC5qcyc7XG5pbXBvcnQgeyBUaWZmVmVyc2lvbiB9IGZyb20gJy4vY29uc3QvdGlmZi52ZXJzaW9uLmpzJztcbmltcG9ydCB7IENvZ1RpZmZUYWdCYXNlIH0gZnJvbSAnLi9yZWFkL3RhZy90aWZmLnRhZy5iYXNlLmpzJztcbmltcG9ydCB7IENvZ1RpZkdob3N0T3B0aW9ucyB9IGZyb20gJy4vcmVhZC90aWZmLmdkYWwuanMnO1xuaW1wb3J0IHsgVGFnVGlmZkJpZ0NvbmZpZywgVGFnVGlmZkNvbmZpZywgVGlmZklmZENvbmZpZyB9IGZyb20gJy4vcmVhZC90aWZmLmlmZC5jb25maWcuanMnO1xuaW1wb3J0IHsgQ29nVGlmZlRhZyB9IGZyb20gJy4vcmVhZC90aWZmLnRhZy5qcyc7XG5pbXBvcnQgeyBDb2dTb3VyY2VDdXJzb3IgfSBmcm9tICcuL3NvdXJjZS9jb2cuc291cmNlLnZpZXcuanMnO1xuaW1wb3J0IHsgdG9IZXhTdHJpbmcgfSBmcm9tICcuL3V0aWwvdXRpbC5oZXguanMnO1xuXG5leHBvcnQgY2xhc3MgQ29nVGlmZiB7XG4gICAgc291cmNlOiBDaHVua1NvdXJjZTtcbiAgICB2ZXJzaW9uID0gVGlmZlZlcnNpb24uVGlmZjtcbiAgICBpbWFnZXM6IENvZ1RpZmZJbWFnZVtdID0gW107XG4gICAgb3B0aW9ucyA9IG5ldyBDb2dUaWZHaG9zdE9wdGlvbnMoKTtcblxuICAgIHByaXZhdGUgY3Vyc29yOiBDb2dTb3VyY2VDdXJzb3I7XG4gICAgaWZkQ29uZmlnOiBUaWZmSWZkQ29uZmlnID0gVGFnVGlmZkNvbmZpZztcblxuICAgIGNvbnN0cnVjdG9yKHNvdXJjZTogQ2h1bmtTb3VyY2UpIHtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gbmV3IENvZ1NvdXJjZUN1cnNvcih0aGlzKTtcbiAgICB9XG5cbiAgICAvKiogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgQ29nVGlmZiAqL1xuICAgIHN0YXRpYyBjcmVhdGUoc291cmNlOiBDaHVua1NvdXJjZSk6IFByb21pc2U8Q29nVGlmZj4ge1xuICAgICAgICByZXR1cm4gbmV3IENvZ1RpZmYoc291cmNlKS5pbml0KCk7XG4gICAgfVxuXG4gICAgLyoqIEhhcyBpbml0KCkgYmVlbiBjYWxsZWQgKi9cbiAgICBpc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICBfaW5pdFByb21pc2U/OiBQcm9taXNlPENvZ1RpZmY+O1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIENPRyBsb2FkaW5nIGluIHRoZSBoZWFkZXIgYW5kIGFsbCBpbWFnZSBoZWFkZXJzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbG9hZEdlb0tleXMgV2hldGhlciB0byBhbHNvIGluaXRpYWxpemUgdGhlIEdlb0tleURpcmVjdG9yeVxuICAgICAqL1xuICAgIGluaXQobG9hZEdlb0tleXMgPSBmYWxzZSk6IFByb21pc2U8Q29nVGlmZj4ge1xuICAgICAgICBpZiAodGhpcy5faW5pdFByb21pc2UpIHJldHVybiB0aGlzLl9pbml0UHJvbWlzZTtcbiAgICAgICAgdGhpcy5faW5pdFByb21pc2UgPSB0aGlzLmRvSW5pdChsb2FkR2VvS2V5cyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbml0UHJvbWlzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGRvSW5pdChsb2FkR2VvS2V5cyA9IGZhbHNlKTogUHJvbWlzZTxDb2dUaWZmPiB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHJldHVybiB0aGlzO1xuICAgICAgICAvLyBMb2FkIHRoZSBmaXJzdCBmZXcgS0IgaW4sIG1vcmUgbG9hZHMgd2lsbCBydW4gYXMgbW9yZSBkYXRhIGlzIHJlcXVpcmVkXG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlLmxvYWRCeXRlcygwLCB0aGlzLnNvdXJjZS5jaHVua1NpemUpO1xuICAgICAgICBhd2FpdCB0aGlzLmZldGNoSWZkKCk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuaW1hZ2VzLm1hcCgoYykgPT4gYy5pbml0KGxvYWRHZW9LZXlzKSkpO1xuXG4gICAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZmV0Y2hJZmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLmN1cnNvci5zZWVrVG8oMCk7XG4gICAgICAgIGNvbnN0IGVuZGlhbiA9IHZpZXcudWludDE2KCk7XG4gICAgICAgIHRoaXMuc291cmNlLmlzTGl0dGxlRW5kaWFuID0gZW5kaWFuID09PSBUaWZmRW5kaWFuLkxpdHRsZTtcbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZS5pc0xpdHRsZUVuZGlhbikgdGhyb3cgbmV3IEVycm9yKCdPbmx5IGxpdHRsZSBlbmRpYW4gaXMgc3VwcG9ydGVkJyk7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZpZXcudWludDE2KCk7XG5cbiAgICAgICAgbGV0IG5leHRPZmZzZXRJZmQ6IG51bWJlcjtcbiAgICAgICAgaWYgKHRoaXMudmVyc2lvbiA9PT0gVGlmZlZlcnNpb24uQmlnVGlmZikge1xuICAgICAgICAgICAgdGhpcy5pZmRDb25maWcgPSBUYWdUaWZmQmlnQ29uZmlnO1xuICAgICAgICAgICAgY29uc3QgcG9pbnRlclNpemUgPSB2aWV3LnVpbnQxNigpO1xuICAgICAgICAgICAgaWYgKHBvaW50ZXJTaXplICE9PSA4KSB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgOGJ5dGUgcG9pbnRlcnMgYXJlIHN1cHBvcnRlZCcpO1xuICAgICAgICAgICAgY29uc3QgemVyb3MgPSB2aWV3LnVpbnQxNigpO1xuICAgICAgICAgICAgaWYgKHplcm9zICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmlnIHRpZmYgaGVhZGVyJyk7XG4gICAgICAgICAgICBuZXh0T2Zmc2V0SWZkID0gdmlldy5wb2ludGVyKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52ZXJzaW9uID09PSBUaWZmVmVyc2lvbi5UaWZmKSB7XG4gICAgICAgICAgICBuZXh0T2Zmc2V0SWZkID0gdmlldy5wb2ludGVyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9ubHkgdGlmZiBzdXBwb3J0ZWQgdmVyc2lvbjoke3RoaXMudmVyc2lvbn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdob3N0U2l6ZSA9IG5leHRPZmZzZXRJZmQgLSB0aGlzLmN1cnNvci5jdXJyZW50T2Zmc2V0O1xuICAgICAgICAvLyBHREFMIG5vdyBzdG9yZXMgbWV0YWRhdGEgYmV0d2VlbiB0aGUgSUZEIGluc2lkZSBhIGdob3N0IHN0b3JhZ2UgYXJlYVxuICAgICAgICBpZiAoZ2hvc3RTaXplID4gMCAmJiBnaG9zdFNpemUgPCAxNiAqIDEwMjQpIHRoaXMub3B0aW9ucy5wcm9jZXNzKHZpZXcuYnl0ZXMoZ2hvc3RTaXplKSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0lmZChuZXh0T2Zmc2V0SWZkKTtcbiAgICB9XG5cbiAgICBnZXRJbWFnZSh6OiBudW1iZXIpOiBDb2dUaWZmSW1hZ2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXNbel07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCBhIGltYWdlIHdoaWNoIGhhcyBhIHJlc29sdXRpb24gc2ltaWxhciB0byB0aGUgcHJvdmlkZWQgcmVzb2x1dGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc29sdXRpb24gcmVzb2x1dGlvbiB0byBmaW5kXG4gICAgICovXG4gICAgZ2V0SW1hZ2VCeVJlc29sdXRpb24ocmVzb2x1dGlvbjogbnVtYmVyKTogQ29nVGlmZkltYWdlIHtcbiAgICAgICAgY29uc3QgZmlyc3RJbWFnZSA9IHRoaXMuaW1hZ2VzWzBdO1xuICAgICAgICBjb25zdCBmaXJzdEltYWdlU2l6ZSA9IGZpcnN0SW1hZ2Uuc2l6ZTtcbiAgICAgICAgY29uc3QgW3JlZlhdID0gZmlyc3RJbWFnZS5yZXNvbHV0aW9uO1xuXG4gICAgICAgIGNvbnN0IHJlc29sdXRpb25CYXNlWCA9IHJlZlggKiBmaXJzdEltYWdlU2l6ZS53aWR0aDtcbiAgICAgICAgLy8gY29uc3QgcmVzb2x1dGlvbkJhc2VZID0gcmVmWSAqIGZpcnN0SW1hZ2VTaXplLmhlaWdodDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaW1hZ2VzLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IGltZyA9IHRoaXMuaW1hZ2VzW2ldO1xuICAgICAgICAgICAgY29uc3QgaW1nU2l6ZSA9IGltZy5zaXplO1xuXG4gICAgICAgICAgICBjb25zdCBpbWdSZXNvbHV0aW9uWCA9IHJlc29sdXRpb25CYXNlWCAvIGltZ1NpemUud2lkdGg7XG4gICAgICAgICAgICAvLyBUT0RPIGRvIHdlIGNhcmUgYWJvdXQgeSByZXNvbHV0aW9uXG4gICAgICAgICAgICAvLyBjb25zdCBpbWdSZXNvbHV0aW9uWSA9IHJlc29sdXRpb25CYXNlWSAvIGltZ1NpemUuaGVpZ2h0O1xuXG4gICAgICAgICAgICBpZiAoaW1nUmVzb2x1dGlvblggLSByZXNvbHV0aW9uIDw9IDAuMDEpIHJldHVybiBpbWc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpcnN0SW1hZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByYXcgYnl0ZXMgZm9yIGEgdGlsZSBhdCBhIGdpdmVuIHgseSwgaW5kZXguXG4gICAgICpcbiAgICAgKiBUaGlzIG1heSByZXR1cm4gbnVsbCBpZiB0aGUgdGlsZSBkb2VzIG5vdCBleGlzdCBlZyBTcGFyc2UgY29ncyxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IHRpbGUgeCBpbmRleFxuICAgICAqIEBwYXJhbSB5IHRpbGUgeSBpbmRleFxuICAgICAqIEBwYXJhbSBpbmRleCBpbWFnZSBpbmRleFxuICAgICAqL1xuICAgIGFzeW5jIGdldFRpbGUoeDogbnVtYmVyLCB5OiBudW1iZXIsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPHsgbWltZVR5cGU6IHN0cmluZzsgYnl0ZXM6IFVpbnQ4QXJyYXkgfSB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmdldEltYWdlKGluZGV4KTtcbiAgICAgICAgaWYgKGltYWdlID09IG51bGwpIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyB6OiAke2luZGV4fWApO1xuICAgICAgICBpZiAoIWltYWdlLmlzVGlsZWQoKSkgdGhyb3cgbmV3IEVycm9yKCdUaWYgaXMgbm90IHRpbGVkJyk7XG5cbiAgICAgICAgcmV0dXJuIGltYWdlLmdldFRpbGUoeCwgeSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzSWZkKG9mZnNldDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgaW1hZ2UsIG5leHRPZmZzZXQgfSA9IGF3YWl0IHRoaXMucmVhZElmZChvZmZzZXQpO1xuICAgICAgICB0aGlzLmltYWdlcy5wdXNoKGltYWdlKTtcblxuICAgICAgICBpZiAobmV4dE9mZnNldCkgYXdhaXQgdGhpcy5wcm9jZXNzSWZkKG5leHRPZmZzZXQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVhZElmZChvZmZzZXQ6IG51bWJlcik6IFByb21pc2U8eyBuZXh0T2Zmc2V0OiBudW1iZXI7IGltYWdlOiBDb2dUaWZmSW1hZ2UgfT4ge1xuICAgICAgICBpZiAoIXRoaXMuc291cmNlLmhhc0J5dGVzKG9mZnNldCwgNDA5NikpIGF3YWl0IHRoaXMuc291cmNlLmxvYWRCeXRlcyhvZmZzZXQsIDQwOTYpO1xuXG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLmN1cnNvci5zZWVrVG8ob2Zmc2V0KTtcbiAgICAgICAgY29uc3QgdGFnQ291bnQgPSB2aWV3Lm9mZnNldCgpO1xuICAgICAgICBjb25zdCBieXRlU3RhcnQgPSBvZmZzZXQgKyB0aGlzLmlmZENvbmZpZy5vZmZzZXQ7XG4gICAgICAgIGNvbnN0IHRhZ3M6IE1hcDxUaWZmVGFnLCBDb2dUaWZmVGFnQmFzZT4gPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgbGV0IHBvcyA9IGJ5dGVTdGFydDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSBDb2dUaWZmVGFnLmNyZWF0ZSh0aGlzLCBwb3MpO1xuICAgICAgICAgICAgcG9zICs9IHRhZy5zaXplO1xuXG4gICAgICAgICAgICBpZiAodGFnLm5hbWUgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIElGRCBUYWc6ICcgKyB0b0hleFN0cmluZyh0YWcuaWQpKTtcbiAgICAgICAgICAgIHRhZ3Muc2V0KHRhZy5pZCwgdGFnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGltYWdlID0gbmV3IENvZ1RpZmZJbWFnZSh0aGlzLCB0aGlzLmltYWdlcy5sZW5ndGgsIHRhZ3MpO1xuICAgICAgICBjb25zdCBuZXh0T2Zmc2V0ID0gdGhpcy5zb3VyY2UuZ2V0VWludChwb3MsIHRoaXMuaWZkQ29uZmlnLnBvaW50ZXIpO1xuICAgICAgICByZXR1cm4geyBuZXh0T2Zmc2V0LCBpbWFnZSB9O1xuICAgIH1cblxuICAgIC8qKiBDbG9zZSB0aGUgZmlsZSBzb3VyY2UgaWYgaXQgbmVlZHMgY2xvc2luZyAqL1xuICAgIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZT8uY2xvc2U/LigpO1xuICAgIH1cbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"tiff.tag.base.d.ts","sourceRoot":"","sources":["../../../src/read/tag/tiff.tag.base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAK5C,8BAAsB,cAAc,CAAC,CAAC,GAAG,OAAO;IAC5C;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAEzB,sDAAsD;IACtD,OAAO,CAAC,UAAU,CAAS;IAE3B,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IAEb,4BAA4B;IAC5B,EAAE,EAAE,MAAM,CAAC;IAEX,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IAEjB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAElB,IAAI,EAAE,OAAO,CAAC;gBAEF,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;IAarD;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;;;;OAMG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB,uCAAuC;IACvC,IAAI,YAAY,IAAI,MAAM,CAIzB;IAED,8BAA8B;IAC9B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,4EAA4E;IAC5E,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,4CAA4C;IAC5C,SAAS,IAAI,CAAC;IAoBd,oDAAoD;IACpD,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAUpC"}
1
+ {"version":3,"file":"tiff.tag.base.d.ts","sourceRoot":"","sources":["../../../src/read/tag/tiff.tag.base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAK5C,8BAAsB,cAAc,CAAC,CAAC,GAAG,OAAO;IAC5C;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAEzB,sDAAsD;IACtD,OAAO,CAAC,UAAU,CAAS;IAE3B,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IAEb,4BAA4B;IAC5B,EAAE,EAAE,MAAM,CAAC;IAEX,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IAEjB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAElB,IAAI,EAAE,OAAO,CAAC;gBAEF,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;IAYrD;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;;;;OAMG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB,uCAAuC;IACvC,IAAI,YAAY,IAAI,MAAM,CAIzB;IAED,8BAA8B;IAC9B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,4EAA4E;IAC5E,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,4CAA4C;IAC5C,SAAS,IAAI,CAAC;IAoBd,oDAAoD;IACpD,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAUpC"}
@@ -76,4 +76,4 @@ export class CogTiffTagBase {
76
76
  };
77
77
  }
78
78
  }
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlmZi50YWcuYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZWFkL3RhZy90aWZmLnRhZy5iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEYsTUFBTSxPQUFnQixjQUFjO0lBdUJoQyxZQUFZLEVBQVUsRUFBRSxJQUFhLEVBQUUsTUFBYztRQUNqRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQztRQUV6QixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUU3QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRixJQUFJLENBQUMsWUFBWSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQVdEOzs7T0FHRztJQUNILElBQUksWUFBWTtRQUNaLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFPRCx1Q0FBdUM7SUFDdkMsSUFBSSxZQUFZO1FBQ1osTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7UUFDNUQsSUFBSSxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7UUFDN0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixJQUFJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztJQUNuQyxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLElBQUksYUFBYTtRQUNiLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDMUQsQ0FBQztJQUVELDRDQUE0QztJQUM1QyxTQUFTO1FBQ0wsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNqQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzdCLE1BQU0sVUFBVSxHQUFHLEtBQUssR0FBRyxZQUFZLENBQUM7UUFFeEMsSUFBSSxLQUFLLEtBQUssQ0FBQztZQUFFLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBaUIsQ0FBQztRQUUxRSxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLElBQUksWUFBWSxFQUFFO1lBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3REO1FBRUQsK0JBQStCO1FBQy9CLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLO1lBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBa0IsQ0FBQztRQUU1RixPQUFPLE1BQXNCLENBQUM7SUFDbEMsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCxNQUFNO1FBQ0YsT0FBTztZQUNILEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztTQUNwQixDQUFDO0lBQ04sQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29nVGlmZiB9IGZyb20gJy4uLy4uL2NvZy50aWZmLmpzJztcbmltcG9ydCB7IFRpZmZUYWcgfSBmcm9tICcuLi8uLi9jb25zdC90aWZmLnRhZy5pZC5qcyc7XG5pbXBvcnQgeyBUaWZmVGFnVmFsdWVUeXBlIH0gZnJvbSAnLi4vLi4vY29uc3QvdGlmZi50YWcudmFsdWUuanMnO1xuaW1wb3J0IHsgZ2V0VGlmZlRhZ1NpemUsIGdldFRpZmZUYWdWYWx1ZVJlYWRlciB9IGZyb20gJy4uL3RpZmYudmFsdWUucmVhZGVyLmpzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvZ1RpZmZUYWdCYXNlPFQgPSB1bmtub3duPiB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgdGhlIHRpZmYgdGFnLCBtYXkgYmUgbnVsbCBpZiB0aGUgdmFsdWUgaGFzIG5vdCBiZWVuIHJlYWRcbiAgICAgKi9cbiAgICBhYnN0cmFjdCB2YWx1ZTogVCB8IG51bGw7XG5cbiAgICAvKiogUmF3IG9mZnNldCBmb3Igd2hlcmUgaW4gdGhlIHRpZiB0aGlzIHRhZyBzdGFydHMgKi9cbiAgICBwcml2YXRlIGJ5dGVPZmZzZXQ6IG51bWJlcjtcblxuICAgIC8qKiBOYW1lIG9mIHRoZSB0YWcgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKiogVGlmVGFnSWQgQHNlZSBUaWZmVGFnICovXG4gICAgaWQ6IG51bWJlcjtcblxuICAgIC8qKiBUeXBlIG9mIGRhdGEgaW5zaWRlIHRoZSByZWNvcmQgQHNlZSB0aGlzLmRhdGFUeXBlTmFtZSAqL1xuICAgIGRhdGFUeXBlOiBudW1iZXI7XG5cbiAgICAvKiogTnVtYmVyIG9mIHJlY29yZHMgaW5zaWRlIHRoZSB0YWcgKi9cbiAgICBkYXRhQ291bnQ6IG51bWJlcjtcblxuICAgIHRpZmY6IENvZ1RpZmY7XG5cbiAgICBjb25zdHJ1Y3RvcihpZDogbnVtYmVyLCB0aWZmOiBDb2dUaWZmLCBvZmZzZXQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnRpZmYgPSB0aWZmO1xuICAgICAgICB0aGlzLmJ5dGVPZmZzZXQgPSBvZmZzZXQ7XG5cbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLm5hbWUgPSBUaWZmVGFnW3RoaXMuaWRdO1xuXG4gICAgICAgIHRoaXMuZGF0YVR5cGUgPSB0aGlzLnRpZmYuc291cmNlLmdldFVpbnQxNihvZmZzZXQgKyAyKTtcbiAgICAgICAgdGhpcy5kYXRhQ291bnQgPSB0aGlzLnRpZmYuc291cmNlLmdldFVpbnQob2Zmc2V0ICsgNCwgdGhpcy50aWZmLmlmZENvbmZpZy5wb2ludGVyKTtcbiAgICAgICAgdGhpcy5kYXRhVHlwZVNpemUgPSBnZXRUaWZmVGFnU2l6ZSh0aGlzLmRhdGFUeXBlKTtcbiAgICAgICAgdGhpcy5kYXRhTGVuZ3RoID0gdGhpcy5kYXRhVHlwZVNpemUgKiB0aGlzLmRhdGFDb3VudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYXZlIHRoZSBieXRlcyBmb3IgdGhlIHRhZyBiZWVuIGxvYWRlZCwgb3IgaXMgYSBmZXRjaCByZXF1aXJlZCB0byByZWFkIHRoZSB0YWdcbiAgICAgKi9cbiAgICBnZXQgaGFzQnl0ZXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpZmYuc291cmNlLmhhc0J5dGVzKHRoaXMudmFsdWVQb2ludGVyLCB0aGlzLmRhdGFMZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGlzIHRoZSB0YWcgcmVhZHkgdG8gYmUgcmVhZFxuICAgICAqL1xuICAgIGdldCBpc1JlYWR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhlIGRhdGEgdHlwZVxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIGlzIG9ubHkgdGhlIHNpemUgb2Ygb25lIGluc3RhbmNlIG9mIHRoZSBkYXRhIEBzZWUgdGhpcy5kYXRhTGVuZ3RoIGZvciB0b3RhbCBieXRlIHNpemVcbiAgICAgKlxuICAgICAqL1xuICAgIGRhdGFUeXBlU2l6ZTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogR2V0IGEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgYSBkYXRhdHlwZVxuICAgICAqXG4gICAgICovXG4gICAgZ2V0IGRhdGFUeXBlTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gVGlmZlRhZ1ZhbHVlVHlwZVt0aGlzLmRhdGFUeXBlXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyB1c2VkIGZvciB0aGUgYWxsIG9mIHRoZSBkYXRhXG4gICAgICovXG4gICAgZGF0YUxlbmd0aDogbnVtYmVyO1xuXG4gICAgLyoqIGFic29sdXRlIG9mZnNldCBvZiB0aGUgVGFnIHZhbHVlICovXG4gICAgZ2V0IHZhbHVlUG9pbnRlcigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZU9mZnNldCA9IHRoaXMuc2l6ZSAtIHRoaXMudGlmZi5pZmRDb25maWcucG9pbnRlcjtcbiAgICAgICAgaWYgKHRoaXMuaXNWYWx1ZUlubGluZSkgcmV0dXJuIHRoaXMuYnl0ZU9mZnNldCArIHZhbHVlT2Zmc2V0O1xuICAgICAgICByZXR1cm4gdGhpcy50aWZmLnNvdXJjZS5nZXRVaW50KHRoaXMuYnl0ZU9mZnNldCArIHZhbHVlT2Zmc2V0LCB0aGlzLnRpZmYuaWZkQ29uZmlnLnBvaW50ZXIpO1xuICAgIH1cblxuICAgIC8qKiBTaXplIG9mIHRoZSBJRkQgKGJ5dGVzKSAqL1xuICAgIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpZmYuaWZkQ29uZmlnLmlmZDtcbiAgICB9XG5cbiAgICAvKiogSXMgdGhlIHZhbHVlIG9mIHRoaXMgdGFnIGlubGluZSwgb3IgaXMgaXQgYSBwb2ludGVyIHRvIHRoZSByZWFsIHZhbHVlICovXG4gICAgZ2V0IGlzVmFsdWVJbmxpbmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFMZW5ndGggPD0gdGhpcy50aWZmLmlmZENvbmZpZy5wb2ludGVyO1xuICAgIH1cblxuICAgIC8qKiBSZWFkIHRoZSB2YWx1ZSBpbiBmcm9tIHRoZSBieXRlIGFycmF5ICovXG4gICAgcmVhZFZhbHVlKCk6IFQge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLnZhbHVlUG9pbnRlcjtcbiAgICAgICAgY29uc3QgZGF0YVR5cGVTaXplID0gdGhpcy5kYXRhVHlwZVNpemU7XG4gICAgICAgIGNvbnN0IGNvbnZlcnQgPSBnZXRUaWZmVGFnVmFsdWVSZWFkZXIodGhpcy5kYXRhVHlwZSk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5kYXRhQ291bnQ7XG4gICAgICAgIGNvbnN0IGRhdGFMZW5ndGggPSBjb3VudCAqIGRhdGFUeXBlU2l6ZTtcblxuICAgICAgICBpZiAoY291bnQgPT09IDEpIHJldHVybiBjb252ZXJ0KHRoaXMudGlmZi5zb3VyY2UsIG9mZnNldCkgYXMgdW5rbm93biBhcyBUO1xuXG4gICAgICAgIGNvbnN0IG91dHB1dCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFMZW5ndGg7IGkgKz0gZGF0YVR5cGVTaXplKSB7XG4gICAgICAgICAgICBvdXRwdXQucHVzaChjb252ZXJ0KHRoaXMudGlmZi5zb3VyY2UsIG9mZnNldCArIGkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgdG8gYSBzdHJpbmcgaWYgYXNjaWlcbiAgICAgICAgaWYgKHRoaXMuZGF0YVR5cGUgPT09IFRpZmZUYWdWYWx1ZVR5cGUuQVNDSUkpIHJldHVybiBvdXRwdXQuam9pbignJykudHJpbSgpIGFzIHVua25vd24gYXMgVDtcblxuICAgICAgICByZXR1cm4gb3V0cHV0IGFzIHVua25vd24gYXMgVDtcbiAgICB9XG5cbiAgICAvKiogR2V0IGEgaHVtYW4oaXNoKSBmcmllbmRseSBvdXRwdXQgZm9yIHRoZSB0YWdzICovXG4gICAgdG9KU09OKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgICBpc1JlYWR5OiB0aGlzLmlzUmVhZHksXG4gICAgICAgICAgICB0eXBlOiB0aGlzLmRhdGFUeXBlTmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgICB9O1xuICAgIH1cbn1cbiJdfQ==
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlmZi50YWcuYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZWFkL3RhZy90aWZmLnRhZy5iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEYsTUFBTSxPQUFnQixjQUFjO0lBdUJoQyxZQUFZLEVBQVUsRUFBRSxJQUFhLEVBQUUsTUFBYztRQUNqRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQztRQUV6QixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRixJQUFJLENBQUMsWUFBWSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQVdEOzs7T0FHRztJQUNILElBQUksWUFBWTtRQUNaLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFPRCx1Q0FBdUM7SUFDdkMsSUFBSSxZQUFZO1FBQ1osTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7UUFDNUQsSUFBSSxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7UUFDN0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixJQUFJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztJQUNuQyxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLElBQUksYUFBYTtRQUNiLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDMUQsQ0FBQztJQUVELDRDQUE0QztJQUM1QyxTQUFTO1FBQ0wsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNqQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzdCLE1BQU0sVUFBVSxHQUFHLEtBQUssR0FBRyxZQUFZLENBQUM7UUFFeEMsSUFBSSxLQUFLLEtBQUssQ0FBQztZQUFFLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBaUIsQ0FBQztRQUUxRSxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLElBQUksWUFBWSxFQUFFO1lBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3REO1FBRUQsK0JBQStCO1FBQy9CLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLO1lBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBa0IsQ0FBQztRQUU1RixPQUFPLE1BQXNCLENBQUM7SUFDbEMsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCxNQUFNO1FBQ0YsT0FBTztZQUNILEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztTQUNwQixDQUFDO0lBQ04sQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29nVGlmZiB9IGZyb20gJy4uLy4uL2NvZy50aWZmLmpzJztcbmltcG9ydCB7IFRpZmZUYWcgfSBmcm9tICcuLi8uLi9jb25zdC90aWZmLnRhZy5pZC5qcyc7XG5pbXBvcnQgeyBUaWZmVGFnVmFsdWVUeXBlIH0gZnJvbSAnLi4vLi4vY29uc3QvdGlmZi50YWcudmFsdWUuanMnO1xuaW1wb3J0IHsgZ2V0VGlmZlRhZ1NpemUsIGdldFRpZmZUYWdWYWx1ZVJlYWRlciB9IGZyb20gJy4uL3RpZmYudmFsdWUucmVhZGVyLmpzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvZ1RpZmZUYWdCYXNlPFQgPSB1bmtub3duPiB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgdGhlIHRpZmYgdGFnLCBtYXkgYmUgbnVsbCBpZiB0aGUgdmFsdWUgaGFzIG5vdCBiZWVuIHJlYWRcbiAgICAgKi9cbiAgICBhYnN0cmFjdCB2YWx1ZTogVCB8IG51bGw7XG5cbiAgICAvKiogUmF3IG9mZnNldCBmb3Igd2hlcmUgaW4gdGhlIHRpZiB0aGlzIHRhZyBzdGFydHMgKi9cbiAgICBwcml2YXRlIGJ5dGVPZmZzZXQ6IG51bWJlcjtcblxuICAgIC8qKiBOYW1lIG9mIHRoZSB0YWcgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKiogVGlmVGFnSWQgQHNlZSBUaWZmVGFnICovXG4gICAgaWQ6IG51bWJlcjtcblxuICAgIC8qKiBUeXBlIG9mIGRhdGEgaW5zaWRlIHRoZSByZWNvcmQgQHNlZSB0aGlzLmRhdGFUeXBlTmFtZSAqL1xuICAgIGRhdGFUeXBlOiBudW1iZXI7XG5cbiAgICAvKiogTnVtYmVyIG9mIHJlY29yZHMgaW5zaWRlIHRoZSB0YWcgKi9cbiAgICBkYXRhQ291bnQ6IG51bWJlcjtcblxuICAgIHRpZmY6IENvZ1RpZmY7XG5cbiAgICBjb25zdHJ1Y3RvcihpZDogbnVtYmVyLCB0aWZmOiBDb2dUaWZmLCBvZmZzZXQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnRpZmYgPSB0aWZmO1xuICAgICAgICB0aGlzLmJ5dGVPZmZzZXQgPSBvZmZzZXQ7XG5cbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLm5hbWUgPSBUaWZmVGFnW3RoaXMuaWRdO1xuICAgICAgICB0aGlzLmRhdGFUeXBlID0gdGhpcy50aWZmLnNvdXJjZS5nZXRVaW50MTYob2Zmc2V0ICsgMik7XG4gICAgICAgIHRoaXMuZGF0YUNvdW50ID0gdGhpcy50aWZmLnNvdXJjZS5nZXRVaW50KG9mZnNldCArIDQsIHRoaXMudGlmZi5pZmRDb25maWcucG9pbnRlcik7XG4gICAgICAgIHRoaXMuZGF0YVR5cGVTaXplID0gZ2V0VGlmZlRhZ1NpemUodGhpcy5kYXRhVHlwZSk7XG4gICAgICAgIHRoaXMuZGF0YUxlbmd0aCA9IHRoaXMuZGF0YVR5cGVTaXplICogdGhpcy5kYXRhQ291bnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGF2ZSB0aGUgYnl0ZXMgZm9yIHRoZSB0YWcgYmVlbiBsb2FkZWQsIG9yIGlzIGEgZmV0Y2ggcmVxdWlyZWQgdG8gcmVhZCB0aGUgdGFnXG4gICAgICovXG4gICAgZ2V0IGhhc0J5dGVzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50aWZmLnNvdXJjZS5oYXNCeXRlcyh0aGlzLnZhbHVlUG9pbnRlciwgdGhpcy5kYXRhTGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBpcyB0aGUgdGFnIHJlYWR5IHRvIGJlIHJlYWRcbiAgICAgKi9cbiAgICBnZXQgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzaXplIG9mIHRoZSBkYXRhIHR5cGVcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBpcyBvbmx5IHRoZSBzaXplIG9mIG9uZSBpbnN0YW5jZSBvZiB0aGUgZGF0YSBAc2VlIHRoaXMuZGF0YUxlbmd0aCBmb3IgdG90YWwgYnl0ZSBzaXplXG4gICAgICpcbiAgICAgKi9cbiAgICBkYXRhVHlwZVNpemU6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEdldCBhIGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIGEgZGF0YXR5cGVcbiAgICAgKlxuICAgICAqL1xuICAgIGdldCBkYXRhVHlwZU5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFRpZmZUYWdWYWx1ZVR5cGVbdGhpcy5kYXRhVHlwZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBmb3IgdGhlIGFsbCBvZiB0aGUgZGF0YVxuICAgICAqL1xuICAgIGRhdGFMZW5ndGg6IG51bWJlcjtcblxuICAgIC8qKiBhYnNvbHV0ZSBvZmZzZXQgb2YgdGhlIFRhZyB2YWx1ZSAqL1xuICAgIGdldCB2YWx1ZVBvaW50ZXIoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWVPZmZzZXQgPSB0aGlzLnNpemUgLSB0aGlzLnRpZmYuaWZkQ29uZmlnLnBvaW50ZXI7XG4gICAgICAgIGlmICh0aGlzLmlzVmFsdWVJbmxpbmUpIHJldHVybiB0aGlzLmJ5dGVPZmZzZXQgKyB2YWx1ZU9mZnNldDtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlmZi5zb3VyY2UuZ2V0VWludCh0aGlzLmJ5dGVPZmZzZXQgKyB2YWx1ZU9mZnNldCwgdGhpcy50aWZmLmlmZENvbmZpZy5wb2ludGVyKTtcbiAgICB9XG5cbiAgICAvKiogU2l6ZSBvZiB0aGUgSUZEIChieXRlcykgKi9cbiAgICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy50aWZmLmlmZENvbmZpZy5pZmQ7XG4gICAgfVxuXG4gICAgLyoqIElzIHRoZSB2YWx1ZSBvZiB0aGlzIHRhZyBpbmxpbmUsIG9yIGlzIGl0IGEgcG9pbnRlciB0byB0aGUgcmVhbCB2YWx1ZSAqL1xuICAgIGdldCBpc1ZhbHVlSW5saW5lKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhTGVuZ3RoIDw9IHRoaXMudGlmZi5pZmRDb25maWcucG9pbnRlcjtcbiAgICB9XG5cbiAgICAvKiogUmVhZCB0aGUgdmFsdWUgaW4gZnJvbSB0aGUgYnl0ZSBhcnJheSAqL1xuICAgIHJlYWRWYWx1ZSgpOiBUIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy52YWx1ZVBvaW50ZXI7XG4gICAgICAgIGNvbnN0IGRhdGFUeXBlU2l6ZSA9IHRoaXMuZGF0YVR5cGVTaXplO1xuICAgICAgICBjb25zdCBjb252ZXJ0ID0gZ2V0VGlmZlRhZ1ZhbHVlUmVhZGVyKHRoaXMuZGF0YVR5cGUpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMuZGF0YUNvdW50O1xuICAgICAgICBjb25zdCBkYXRhTGVuZ3RoID0gY291bnQgKiBkYXRhVHlwZVNpemU7XG5cbiAgICAgICAgaWYgKGNvdW50ID09PSAxKSByZXR1cm4gY29udmVydCh0aGlzLnRpZmYuc291cmNlLCBvZmZzZXQpIGFzIHVua25vd24gYXMgVDtcblxuICAgICAgICBjb25zdCBvdXRwdXQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyBpICs9IGRhdGFUeXBlU2l6ZSkge1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goY29udmVydCh0aGlzLnRpZmYuc291cmNlLCBvZmZzZXQgKyBpKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IHRvIGEgc3RyaW5nIGlmIGFzY2lpXG4gICAgICAgIGlmICh0aGlzLmRhdGFUeXBlID09PSBUaWZmVGFnVmFsdWVUeXBlLkFTQ0lJKSByZXR1cm4gb3V0cHV0LmpvaW4oJycpLnRyaW0oKSBhcyB1bmtub3duIGFzIFQ7XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dCBhcyB1bmtub3duIGFzIFQ7XG4gICAgfVxuXG4gICAgLyoqIEdldCBhIGh1bWFuKGlzaCkgZnJpZW5kbHkgb3V0cHV0IGZvciB0aGUgdGFncyAqL1xuICAgIHRvSlNPTigpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIG9mZnNldDogdGhpcy5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgaXNSZWFkeTogdGhpcy5pc1JlYWR5LFxuICAgICAgICAgICAgdHlwZTogdGhpcy5kYXRhVHlwZU5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iXX0=
@@ -1,4 +1,5 @@
1
- import { ByteSize, ChunkSource } from '@chunkd/core';
1
+ import { ByteSize } from '@chunkd/core';
2
+ import { CogTiff } from '../cog.tiff.js';
2
3
  export declare enum GhostOption {
3
4
  GDAL_STRUCTURAL_METADATA_SIZE = "GDAL_STRUCTURAL_METADATA_SIZE",
4
5
  LAYOUT = "LAYOUT",
@@ -14,15 +15,13 @@ export declare enum GhostOptionTileOrder {
14
15
  export declare enum GhostOptionTileLeader {
15
16
  uint32 = "SIZE_AS_UINT4"
16
17
  }
17
- export declare const GhostOptionTileLeaderSize: {
18
- [key: string]: ByteSize;
19
- };
20
18
  /**
21
19
  * GDAL has made a ghost set of options for Tif files
22
20
  * this class represents the optimizations that can be used
23
21
  */
24
22
  export declare class CogTifGhostOptions {
25
- options: Map<GhostOption, string>;
23
+ options: Map<string, string>;
24
+ source: CogTiff;
26
25
  /**
27
26
  * Has GDAL optimized this tif
28
27
  */
@@ -31,23 +30,11 @@ export declare class CogTifGhostOptions {
31
30
  * Has GDAL determined this tif is now broken
32
31
  */
33
32
  get isBroken(): boolean;
34
- private set;
35
33
  /**
36
34
  * Load the ghost options from a source
37
- * @param source Source to load from
38
- * @param offset Byte offset to start reading
39
- * @param length max number of bytes to read
35
+ * @param bytes the ghost header bytes
40
36
  */
41
- process(source: ChunkSource, offset: number, length: number): void;
42
- private _getReverse;
43
- /**
44
- * The ordering of tiles inside the tif
45
- */
46
- get tileOrder(): GhostOptionTileOrder | null;
47
- /**
48
- * Are tiles stored with the file size immediately before the tile
49
- */
50
- get tileLeader(): GhostOptionTileLeader | null;
37
+ process(bytes: Uint8Array): void;
51
38
  /**
52
39
  * If the tile leader is set, how many bytes are allocated to the tile size
53
40
  */
@@ -1 +1 @@
1
- {"version":3,"file":"tiff.gdal.d.ts","sourceRoot":"","sources":["../../src/read/tiff.gdal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAUrD,oBAAY,WAAW;IACnB,6BAA6B,kCAAkC;IAC/D,MAAM,WAAW;IACjB,WAAW,gBAAgB;IAC3B,YAAY,iBAAiB;IAC7B,aAAa,kBAAkB;IAC/B,0BAA0B,+BAA+B;IACzD,6BAA6B,kCAAkC;CAClE;AAED,oBAAY,oBAAoB;IAC5B,QAAQ,cAAc;CACzB;AAED,oBAAY,qBAAqB;IAC7B,MAAM,kBAAkB;CAC3B;AACD,eAAO,MAAM,yBAAyB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAA;CAEhE,CAAC;AAEF;;;GAGG;AACH,qBAAa,kBAAkB;IAC3B,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAa;IAE9C;;OAEG;IACH,IAAI,cAAc,IAAI,OAAO,CAG5B;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,OAAO,CAAC,GAAG;IAIX;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAmBlE,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,IAAI,SAAS,IAAI,oBAAoB,GAAG,IAAI,CAE3C;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,qBAAqB,GAAG,IAAI,CAE7C;IAED;;OAEG;IACH,IAAI,kBAAkB,IAAI,QAAQ,GAAG,IAAI,CAGxC;IAED,IAAI,iBAAiB,IAAI,OAAO,CAE/B;CACJ"}
1
+ {"version":3,"file":"tiff.gdal.d.ts","sourceRoot":"","sources":["../../src/read/tiff.gdal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,oBAAY,WAAW;IACnB,6BAA6B,kCAAkC;IAC/D,MAAM,WAAW;IACjB,WAAW,gBAAgB;IAC3B,YAAY,iBAAiB;IAC7B,aAAa,kBAAkB;IAC/B,0BAA0B,+BAA+B;IACzD,6BAA6B,kCAAkC;CAClE;AAED,oBAAY,oBAAoB;IAC5B,QAAQ,cAAc;CACzB;AAED,oBAAY,qBAAqB;IAC7B,MAAM,kBAAkB;CAC3B;AAED;;;GAGG;AACH,qBAAa,kBAAkB;IAC3B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;IACzC,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,IAAI,cAAc,IAAI,OAAO,CAG5B;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAuBhC;;OAEG;IACH,IAAI,kBAAkB,IAAI,QAAQ,GAAG,IAAI,CAOxC;IAED,IAAI,iBAAiB,IAAI,OAAO,CAE/B;CACJ"}
@@ -1,11 +1,4 @@
1
1
  import { ByteSize } from '@chunkd/core';
2
- import { getReverseEnumValue } from '../util/util.enum.js';
3
- // GDAL_STRUCTURAL_METADATA_SIZE: '000140 bytes',
4
- // LAYOUT: 'IFDS_BEFORE_DATA',
5
- // BLOCK_ORDER: 'ROW_MAJOR',
6
- // BLOCK_LEADER: 'SIZE_AS_UINT4',
7
- // BLOCK_TRAILER: 'LAST_4_BYTES_REPEATED',
8
- // KNOWN_INCOMPATIBLE_EDITION: 'NO'
9
2
  export var GhostOption;
10
3
  (function (GhostOption) {
11
4
  GhostOption["GDAL_STRUCTURAL_METADATA_SIZE"] = "GDAL_STRUCTURAL_METADATA_SIZE";
@@ -24,9 +17,6 @@ export var GhostOptionTileLeader;
24
17
  (function (GhostOptionTileLeader) {
25
18
  GhostOptionTileLeader["uint32"] = "SIZE_AS_UINT4";
26
19
  })(GhostOptionTileLeader || (GhostOptionTileLeader = {}));
27
- export const GhostOptionTileLeaderSize = {
28
- uint32: ByteSize.UInt32,
29
- };
30
20
  /**
31
21
  * GDAL has made a ghost set of options for Tif files
32
22
  * this class represents the optimizations that can be used
@@ -49,60 +39,49 @@ export class CogTifGhostOptions {
49
39
  get isBroken() {
50
40
  return this.options.get(GhostOption.KNOWN_INCOMPATIBLE_EDITION) === 'YES';
51
41
  }
52
- set(key, val) {
53
- this.options.set(key, val);
54
- }
55
42
  /**
56
43
  * Load the ghost options from a source
57
- * @param source Source to load from
58
- * @param offset Byte offset to start reading
59
- * @param length max number of bytes to read
44
+ * @param bytes the ghost header bytes
60
45
  */
61
- process(source, offset, length) {
62
- const chars = [];
63
- for (let i = offset; i < offset + length; i++) {
64
- const char = source.getUint8(i);
65
- if (char === 0)
66
- continue;
67
- chars.push(String.fromCharCode(char));
68
- }
69
- const keyValPairs = chars
70
- .join('')
71
- .trim()
72
- .split('\n')
73
- .map((c) => c.split('='));
74
- for (const [key, value] of keyValPairs) {
75
- this.options.set(GhostOption[key], value);
46
+ process(bytes) {
47
+ let key = '';
48
+ let value = '';
49
+ let setValue = false;
50
+ for (let i = 0; i < bytes.length; i++) {
51
+ const charCode = bytes[i];
52
+ if (charCode === 0)
53
+ break;
54
+ const char = String.fromCharCode(charCode);
55
+ if (char === '\n') {
56
+ this.options.set(key, value);
57
+ key = '';
58
+ value = '';
59
+ setValue = false;
60
+ }
61
+ else if (char === '=') {
62
+ setValue = true;
63
+ }
64
+ else {
65
+ if (setValue)
66
+ value += char;
67
+ else
68
+ key += char;
69
+ }
76
70
  }
77
71
  }
78
- _getReverse(e, key) {
79
- const opt = this.options.get(key);
80
- if (opt == null)
81
- return null;
82
- return getReverseEnumValue(e, opt);
83
- }
84
- /**
85
- * The ordering of tiles inside the tif
86
- */
87
- get tileOrder() {
88
- return this._getReverse(GhostOptionTileOrder, GhostOption.BLOCK_ORDER);
89
- }
90
- /**
91
- * Are tiles stored with the file size immediately before the tile
92
- */
93
- get tileLeader() {
94
- return this._getReverse(GhostOptionTileLeader, GhostOption.BLOCK_LEADER);
95
- }
96
72
  /**
97
73
  * If the tile leader is set, how many bytes are allocated to the tile size
98
74
  */
99
75
  get tileLeaderByteSize() {
100
- if (this.tileLeader == null)
101
- return null;
102
- return GhostOptionTileLeaderSize[this.tileLeader];
76
+ switch (this.options.get(GhostOption.BLOCK_LEADER)) {
77
+ case GhostOptionTileLeader.uint32:
78
+ return ByteSize.UInt32;
79
+ default:
80
+ return null;
81
+ }
103
82
  }
104
83
  get isMaskInterleaved() {
105
84
  return this.options.get(GhostOption.MASK_INTERLEAVED_WITH_IMAGERY) === 'YES';
106
85
  }
107
86
  }
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlmZi5nZGFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlYWQvdGlmZi5nZGFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQWUsTUFBTSxjQUFjLENBQUM7QUFDckQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFM0QsbURBQW1EO0FBQ25ELGdDQUFnQztBQUNoQyw4QkFBOEI7QUFDOUIsbUNBQW1DO0FBQ25DLDRDQUE0QztBQUM1QyxxQ0FBcUM7QUFFckMsTUFBTSxDQUFOLElBQVksV0FRWDtBQVJELFdBQVksV0FBVztJQUNuQiw4RUFBK0QsQ0FBQTtJQUMvRCxnQ0FBaUIsQ0FBQTtJQUNqQiwwQ0FBMkIsQ0FBQTtJQUMzQiw0Q0FBNkIsQ0FBQTtJQUM3Qiw4Q0FBK0IsQ0FBQTtJQUMvQix3RUFBeUQsQ0FBQTtJQUN6RCw4RUFBK0QsQ0FBQTtBQUNuRSxDQUFDLEVBUlcsV0FBVyxLQUFYLFdBQVcsUUFRdEI7QUFFRCxNQUFNLENBQU4sSUFBWSxvQkFFWDtBQUZELFdBQVksb0JBQW9CO0lBQzVCLDhDQUFzQixDQUFBO0FBQzFCLENBQUMsRUFGVyxvQkFBb0IsS0FBcEIsb0JBQW9CLFFBRS9CO0FBRUQsTUFBTSxDQUFOLElBQVkscUJBRVg7QUFGRCxXQUFZLHFCQUFxQjtJQUM3QixpREFBd0IsQ0FBQTtBQUM1QixDQUFDLEVBRlcscUJBQXFCLEtBQXJCLHFCQUFxQixRQUVoQztBQUNELE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFnQztJQUNsRSxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07Q0FDMUIsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFBL0I7UUFDSSxZQUFPLEdBQTZCLElBQUksR0FBRyxFQUFFLENBQUM7SUE2RWxELENBQUM7SUEzRUc7O09BRUc7SUFDSCxJQUFJLGNBQWM7UUFDZCxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDaEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssa0JBQWtCLENBQUM7SUFDdkUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsMEJBQTBCLENBQUMsS0FBSyxLQUFLLENBQUM7SUFDOUUsQ0FBQztJQUVPLEdBQUcsQ0FBQyxHQUFnQixFQUFFLEdBQVc7UUFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE9BQU8sQ0FBQyxNQUFtQixFQUFFLE1BQWMsRUFBRSxNQUFjO1FBQ3ZELE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztRQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksSUFBSSxLQUFLLENBQUM7Z0JBQUUsU0FBUztZQUN6QixLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN6QztRQUVELE1BQU0sV0FBVyxHQUFHLEtBQUs7YUFDcEIsSUFBSSxDQUFDLEVBQUUsQ0FBQzthQUNSLElBQUksRUFBRTthQUNOLEtBQUssQ0FBQyxJQUFJLENBQUM7YUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUU5QixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksV0FBVyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFrQixDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDNUQ7SUFDTCxDQUFDO0lBRU8sV0FBVyxDQUFJLENBQXNCLEVBQUUsR0FBZ0I7UUFDM0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsSUFBSSxHQUFHLElBQUksSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzdCLE9BQU8sbUJBQW1CLENBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksU0FBUztRQUNULE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixFQUFFLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLGtCQUFrQjtRQUNsQixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3pDLE9BQU8seUJBQXlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNqQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLEtBQUssQ0FBQztJQUNqRixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCeXRlU2l6ZSwgQ2h1bmtTb3VyY2UgfSBmcm9tICdAY2h1bmtkL2NvcmUnO1xuaW1wb3J0IHsgZ2V0UmV2ZXJzZUVudW1WYWx1ZSB9IGZyb20gJy4uL3V0aWwvdXRpbC5lbnVtLmpzJztcblxuLy8gICBHREFMX1NUUlVDVFVSQUxfTUVUQURBVEFfU0laRTogJzAwMDE0MCBieXRlcycsXG4vLyAgIExBWU9VVDogJ0lGRFNfQkVGT1JFX0RBVEEnLFxuLy8gICBCTE9DS19PUkRFUjogJ1JPV19NQUpPUicsXG4vLyAgIEJMT0NLX0xFQURFUjogJ1NJWkVfQVNfVUlOVDQnLFxuLy8gICBCTE9DS19UUkFJTEVSOiAnTEFTVF80X0JZVEVTX1JFUEVBVEVEJyxcbi8vICAgS05PV05fSU5DT01QQVRJQkxFX0VESVRJT046ICdOTydcblxuZXhwb3J0IGVudW0gR2hvc3RPcHRpb24ge1xuICAgIEdEQUxfU1RSVUNUVVJBTF9NRVRBREFUQV9TSVpFID0gJ0dEQUxfU1RSVUNUVVJBTF9NRVRBREFUQV9TSVpFJyxcbiAgICBMQVlPVVQgPSAnTEFZT1VUJyxcbiAgICBCTE9DS19PUkRFUiA9ICdCTE9DS19PUkRFUicsXG4gICAgQkxPQ0tfTEVBREVSID0gJ0JMT0NLX0xFQURFUicsXG4gICAgQkxPQ0tfVFJBSUxFUiA9ICdCTE9DS19UUkFJTEVSJyxcbiAgICBLTk9XTl9JTkNPTVBBVElCTEVfRURJVElPTiA9ICdLTk9XTl9JTkNPTVBBVElCTEVfRURJVElPTicsXG4gICAgTUFTS19JTlRFUkxFQVZFRF9XSVRIX0lNQUdFUlkgPSAnTUFTS19JTlRFUkxFQVZFRF9XSVRIX0lNQUdFUlknLFxufVxuXG5leHBvcnQgZW51bSBHaG9zdE9wdGlvblRpbGVPcmRlciB7XG4gICAgUm93TWFqb3IgPSAnUk9XX01BSk9SJyxcbn1cblxuZXhwb3J0IGVudW0gR2hvc3RPcHRpb25UaWxlTGVhZGVyIHtcbiAgICB1aW50MzIgPSAnU0laRV9BU19VSU5UNCcsXG59XG5leHBvcnQgY29uc3QgR2hvc3RPcHRpb25UaWxlTGVhZGVyU2l6ZTogeyBba2V5OiBzdHJpbmddOiBCeXRlU2l6ZSB9ID0ge1xuICAgIHVpbnQzMjogQnl0ZVNpemUuVUludDMyLFxufTtcblxuLyoqXG4gKiBHREFMIGhhcyBtYWRlIGEgZ2hvc3Qgc2V0IG9mIG9wdGlvbnMgZm9yIFRpZiBmaWxlc1xuICogdGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcHRpbWl6YXRpb25zIHRoYXQgY2FuIGJlIHVzZWRcbiAqL1xuZXhwb3J0IGNsYXNzIENvZ1RpZkdob3N0T3B0aW9ucyB7XG4gICAgb3B0aW9uczogTWFwPEdob3N0T3B0aW9uLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuXG4gICAgLyoqXG4gICAgICogSGFzIEdEQUwgb3B0aW1pemVkIHRoaXMgdGlmXG4gICAgICovXG4gICAgZ2V0IGlzQ29nT3B0aW1pemVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5pc0Jyb2tlbikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmdldChHaG9zdE9wdGlvbi5MQVlPVVQpID09PSAnSUZEU19CRUZPUkVfREFUQSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFzIEdEQUwgZGV0ZXJtaW5lZCB0aGlzIHRpZiBpcyBub3cgYnJva2VuXG4gICAgICovXG4gICAgZ2V0IGlzQnJva2VuKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmdldChHaG9zdE9wdGlvbi5LTk9XTl9JTkNPTVBBVElCTEVfRURJVElPTikgPT09ICdZRVMnO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0KGtleTogR2hvc3RPcHRpb24sIHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5zZXQoa2V5LCB2YWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgdGhlIGdob3N0IG9wdGlvbnMgZnJvbSBhIHNvdXJjZVxuICAgICAqIEBwYXJhbSBzb3VyY2UgU291cmNlIHRvIGxvYWQgZnJvbVxuICAgICAqIEBwYXJhbSBvZmZzZXQgQnl0ZSBvZmZzZXQgdG8gc3RhcnQgcmVhZGluZ1xuICAgICAqIEBwYXJhbSBsZW5ndGggbWF4IG51bWJlciBvZiBieXRlcyB0byByZWFkXG4gICAgICovXG4gICAgcHJvY2Vzcyhzb3VyY2U6IENodW5rU291cmNlLCBvZmZzZXQ6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2hhcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCBvZmZzZXQgKyBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2hhciA9IHNvdXJjZS5nZXRVaW50OChpKTtcbiAgICAgICAgICAgIGlmIChjaGFyID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNoYXJzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBrZXlWYWxQYWlycyA9IGNoYXJzXG4gICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgIC5tYXAoKGMpID0+IGMuc3BsaXQoJz0nKSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Yga2V5VmFsUGFpcnMpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zZXQoR2hvc3RPcHRpb25ba2V5IGFzIEdob3N0T3B0aW9uXSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0UmV2ZXJzZTxUPihlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBrZXk6IEdob3N0T3B0aW9uKTogVCB8IG51bGwge1xuICAgICAgICBjb25zdCBvcHQgPSB0aGlzLm9wdGlvbnMuZ2V0KGtleSk7XG4gICAgICAgIGlmIChvcHQgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBnZXRSZXZlcnNlRW51bVZhbHVlPFQ+KGUsIG9wdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9yZGVyaW5nIG9mIHRpbGVzIGluc2lkZSB0aGUgdGlmXG4gICAgICovXG4gICAgZ2V0IHRpbGVPcmRlcigpOiBHaG9zdE9wdGlvblRpbGVPcmRlciB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UmV2ZXJzZShHaG9zdE9wdGlvblRpbGVPcmRlciwgR2hvc3RPcHRpb24uQkxPQ0tfT1JERVIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFyZSB0aWxlcyBzdG9yZWQgd2l0aCB0aGUgZmlsZSBzaXplIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgdGlsZVxuICAgICAqL1xuICAgIGdldCB0aWxlTGVhZGVyKCk6IEdob3N0T3B0aW9uVGlsZUxlYWRlciB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UmV2ZXJzZShHaG9zdE9wdGlvblRpbGVMZWFkZXIsIEdob3N0T3B0aW9uLkJMT0NLX0xFQURFUik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHRpbGUgbGVhZGVyIGlzIHNldCwgaG93IG1hbnkgYnl0ZXMgYXJlIGFsbG9jYXRlZCB0byB0aGUgdGlsZSBzaXplXG4gICAgICovXG4gICAgZ2V0IHRpbGVMZWFkZXJCeXRlU2l6ZSgpOiBCeXRlU2l6ZSB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy50aWxlTGVhZGVyID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gR2hvc3RPcHRpb25UaWxlTGVhZGVyU2l6ZVt0aGlzLnRpbGVMZWFkZXJdO1xuICAgIH1cblxuICAgIGdldCBpc01hc2tJbnRlcmxlYXZlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5nZXQoR2hvc3RPcHRpb24uTUFTS19JTlRFUkxFQVZFRF9XSVRIX0lNQUdFUlkpID09PSAnWUVTJztcbiAgICB9XG59XG4iXX0=
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlmZi5nZGFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlYWQvdGlmZi5nZGFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHeEMsTUFBTSxDQUFOLElBQVksV0FRWDtBQVJELFdBQVksV0FBVztJQUNuQiw4RUFBK0QsQ0FBQTtJQUMvRCxnQ0FBaUIsQ0FBQTtJQUNqQiwwQ0FBMkIsQ0FBQTtJQUMzQiw0Q0FBNkIsQ0FBQTtJQUM3Qiw4Q0FBK0IsQ0FBQTtJQUMvQix3RUFBeUQsQ0FBQTtJQUN6RCw4RUFBK0QsQ0FBQTtBQUNuRSxDQUFDLEVBUlcsV0FBVyxLQUFYLFdBQVcsUUFRdEI7QUFFRCxNQUFNLENBQU4sSUFBWSxvQkFFWDtBQUZELFdBQVksb0JBQW9CO0lBQzVCLDhDQUFzQixDQUFBO0FBQzFCLENBQUMsRUFGVyxvQkFBb0IsS0FBcEIsb0JBQW9CLFFBRS9CO0FBRUQsTUFBTSxDQUFOLElBQVkscUJBRVg7QUFGRCxXQUFZLHFCQUFxQjtJQUM3QixpREFBd0IsQ0FBQTtBQUM1QixDQUFDLEVBRlcscUJBQXFCLEtBQXJCLHFCQUFxQixRQUVoQztBQUVEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFBL0I7UUFDSSxZQUFPLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7SUE0RDdDLENBQUM7SUF6REc7O09BRUc7SUFDSCxJQUFJLGNBQWM7UUFDZCxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDaEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssa0JBQWtCLENBQUM7SUFDdkUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsMEJBQTBCLENBQUMsS0FBSyxLQUFLLENBQUM7SUFDOUUsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU8sQ0FBQyxLQUFpQjtRQUNyQixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbkMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksUUFBUSxLQUFLLENBQUM7Z0JBQUUsTUFBTTtZQUUxQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNDLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtnQkFDZixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzdCLEdBQUcsR0FBRyxFQUFFLENBQUM7Z0JBQ1QsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDWCxRQUFRLEdBQUcsS0FBSyxDQUFDO2FBQ3BCO2lCQUFNLElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRTtnQkFDckIsUUFBUSxHQUFHLElBQUksQ0FBQzthQUNuQjtpQkFBTTtnQkFDSCxJQUFJLFFBQVE7b0JBQUUsS0FBSyxJQUFJLElBQUksQ0FBQzs7b0JBQ3ZCLEdBQUcsSUFBSSxJQUFJLENBQUM7YUFDcEI7U0FDSjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksa0JBQWtCO1FBQ2xCLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ2hELEtBQUsscUJBQXFCLENBQUMsTUFBTTtnQkFDN0IsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQzNCO2dCQUNJLE9BQU8sSUFBSSxDQUFDO1NBQ25CO0lBQ0wsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLDZCQUE2QixDQUFDLEtBQUssS0FBSyxDQUFDO0lBQ2pGLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ5dGVTaXplIH0gZnJvbSAnQGNodW5rZC9jb3JlJztcbmltcG9ydCB7IENvZ1RpZmYgfSBmcm9tICcuLi9jb2cudGlmZi5qcyc7XG5cbmV4cG9ydCBlbnVtIEdob3N0T3B0aW9uIHtcbiAgICBHREFMX1NUUlVDVFVSQUxfTUVUQURBVEFfU0laRSA9ICdHREFMX1NUUlVDVFVSQUxfTUVUQURBVEFfU0laRScsXG4gICAgTEFZT1VUID0gJ0xBWU9VVCcsXG4gICAgQkxPQ0tfT1JERVIgPSAnQkxPQ0tfT1JERVInLFxuICAgIEJMT0NLX0xFQURFUiA9ICdCTE9DS19MRUFERVInLFxuICAgIEJMT0NLX1RSQUlMRVIgPSAnQkxPQ0tfVFJBSUxFUicsXG4gICAgS05PV05fSU5DT01QQVRJQkxFX0VESVRJT04gPSAnS05PV05fSU5DT01QQVRJQkxFX0VESVRJT04nLFxuICAgIE1BU0tfSU5URVJMRUFWRURfV0lUSF9JTUFHRVJZID0gJ01BU0tfSU5URVJMRUFWRURfV0lUSF9JTUFHRVJZJyxcbn1cblxuZXhwb3J0IGVudW0gR2hvc3RPcHRpb25UaWxlT3JkZXIge1xuICAgIFJvd01ham9yID0gJ1JPV19NQUpPUicsXG59XG5cbmV4cG9ydCBlbnVtIEdob3N0T3B0aW9uVGlsZUxlYWRlciB7XG4gICAgdWludDMyID0gJ1NJWkVfQVNfVUlOVDQnLFxufVxuXG4vKipcbiAqIEdEQUwgaGFzIG1hZGUgYSBnaG9zdCBzZXQgb2Ygb3B0aW9ucyBmb3IgVGlmIGZpbGVzXG4gKiB0aGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9wdGltaXphdGlvbnMgdGhhdCBjYW4gYmUgdXNlZFxuICovXG5leHBvcnQgY2xhc3MgQ29nVGlmR2hvc3RPcHRpb25zIHtcbiAgICBvcHRpb25zOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuICAgIHNvdXJjZTogQ29nVGlmZjtcblxuICAgIC8qKlxuICAgICAqIEhhcyBHREFMIG9wdGltaXplZCB0aGlzIHRpZlxuICAgICAqL1xuICAgIGdldCBpc0NvZ09wdGltaXplZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuaXNCcm9rZW4pIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5nZXQoR2hvc3RPcHRpb24uTEFZT1VUKSA9PT0gJ0lGRFNfQkVGT1JFX0RBVEEnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhcyBHREFMIGRldGVybWluZWQgdGhpcyB0aWYgaXMgbm93IGJyb2tlblxuICAgICAqL1xuICAgIGdldCBpc0Jyb2tlbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5nZXQoR2hvc3RPcHRpb24uS05PV05fSU5DT01QQVRJQkxFX0VESVRJT04pID09PSAnWUVTJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIHRoZSBnaG9zdCBvcHRpb25zIGZyb20gYSBzb3VyY2VcbiAgICAgKiBAcGFyYW0gYnl0ZXMgdGhlIGdob3N0IGhlYWRlciBieXRlc1xuICAgICAqL1xuICAgIHByb2Nlc3MoYnl0ZXM6IFVpbnQ4QXJyYXkpOiB2b2lkIHtcbiAgICAgICAgbGV0IGtleSA9ICcnO1xuICAgICAgICBsZXQgdmFsdWUgPSAnJztcbiAgICAgICAgbGV0IHNldFZhbHVlID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXJDb2RlID0gYnl0ZXNbaV07XG4gICAgICAgICAgICBpZiAoY2hhckNvZGUgPT09IDApIGJyZWFrO1xuXG4gICAgICAgICAgICBjb25zdCBjaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gICAgICAgICAgICBpZiAoY2hhciA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGtleSA9ICcnO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgc2V0VmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJz0nKSB7XG4gICAgICAgICAgICAgICAgc2V0VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoc2V0VmFsdWUpIHZhbHVlICs9IGNoYXI7XG4gICAgICAgICAgICAgICAgZWxzZSBrZXkgKz0gY2hhcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoZSB0aWxlIGxlYWRlciBpcyBzZXQsIGhvdyBtYW55IGJ5dGVzIGFyZSBhbGxvY2F0ZWQgdG8gdGhlIHRpbGUgc2l6ZVxuICAgICAqL1xuICAgIGdldCB0aWxlTGVhZGVyQnl0ZVNpemUoKTogQnl0ZVNpemUgfCBudWxsIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMuZ2V0KEdob3N0T3B0aW9uLkJMT0NLX0xFQURFUikpIHtcbiAgICAgICAgICAgIGNhc2UgR2hvc3RPcHRpb25UaWxlTGVhZGVyLnVpbnQzMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gQnl0ZVNpemUuVUludDMyO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBpc01hc2tJbnRlcmxlYXZlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5nZXQoR2hvc3RPcHRpb24uTUFTS19JTlRFUkxFQVZFRF9XSVRIX0lNQUdFUlkpID09PSAnWUVTJztcbiAgICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cogeotiff/core",
3
- "version": "7.0.0",
3
+ "version": "7.1.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/blacha/cogeotiff.git",
@@ -22,11 +22,11 @@
22
22
  "ieee754": "^1.1.13"
23
23
  },
24
24
  "devDependencies": {
25
- "@types/node": "^14.14.22",
25
+ "@types/node": "^18.0.0",
26
26
  "@types/ospec": "^4.0.3"
27
27
  },
28
28
  "publishConfig": {
29
29
  "access": "public"
30
30
  },
31
- "gitHead": "a2352ec8df0f0eb5f5dddacc0f3cdea855dceda3"
31
+ "gitHead": "cae47cd4ac669e2b8e2031cb701378b4f8fc92dc"
32
32
  }
@@ -1,10 +1,13 @@
1
+ import { SourceMemory } from '@chunkd/core';
2
+ import { readFile } from 'fs/promises';
1
3
  import { CogTiff } from '../cog.tiff.js';
2
- import { SourceFile } from '@chunkd/source-file';
3
4
 
4
5
  /** Read a tile from every image inside of a tiff 300 tiles read */
5
6
  async function main(): Promise<void> {
6
- for (let i = 0; i < 50; i++) {
7
- const tiff = new CogTiff(new SourceFile(process.argv[process.argv.length - 1]));
7
+ const buf = await readFile(process.argv[process.argv.length - 1]);
8
+ const source = new SourceMemory('buf', buf);
9
+ for (let i = 0; i < 5_000; i++) {
10
+ const tiff = new CogTiff(source);
8
11
  await tiff.init();
9
12
 
10
13
  // 6 images
@@ -7,7 +7,7 @@ import 'source-map-support/register.js';
7
7
  import { TestFileChunkSource } from '@chunkd/core/build/__test__/chunk.source.fake.js';
8
8
  import { CogTiff } from '../cog.tiff.js';
9
9
  import { TiffMimeType } from '../const/index.js';
10
- import { SourceMemory } from '@chunkd/core';
10
+ import { ByteSize, SourceMemory } from '@chunkd/core';
11
11
  import { fileURLToPath } from 'url';
12
12
 
13
13
  const __dirname = fileURLToPath(import.meta.url);
@@ -73,6 +73,16 @@ o.spec('CogTiled', () => {
73
73
  o(firstImage.stripCount).equals(0);
74
74
  o(firstImage.isTiled()).equals(true);
75
75
  });
76
+
77
+ o('should hasTile for every tile', async () => {
78
+ const [firstImage] = cog.images;
79
+
80
+ for (let x = 0; x < firstImage.tileCount.x; x++) {
81
+ for (let y = 0; y < firstImage.tileCount.y; y++) {
82
+ o(await firstImage.hasTile(x, y)).equals(true);
83
+ }
84
+ }
85
+ });
76
86
  });
77
87
 
78
88
  o.spec('Cog.Big', () => {
@@ -132,6 +142,8 @@ o.spec('Cog.Sparse', () => {
132
142
 
133
143
  for (let x = 0; x < tileCount.x; x++) {
134
144
  for (let y = 0; y < tileCount.y; y++) {
145
+ const hasTile = await img.hasTile(x, y);
146
+ o(hasTile).equals(false);
135
147
  const tileXy = await img.getTile(x, y);
136
148
  const tileXyz = await cog.getTile(x, y, z);
137
149
  o(tileXy).equals(null)(`Tile x:${x} y:${y} should be empty`);
@@ -139,6 +151,22 @@ o.spec('Cog.Sparse', () => {
139
151
  }
140
152
  }
141
153
  });
154
+
155
+ o('should have ghost options', () => {
156
+ o(cog.options.options.size).equals(6);
157
+ o(cog.options.tileLeaderByteSize).equals(ByteSize.UInt32);
158
+ o(cog.options.isCogOptimized).equals(true);
159
+
160
+ const entries = [...cog.options.options.entries()];
161
+ o(entries).deepEquals([
162
+ ['GDAL_STRUCTURAL_METADATA_SIZE', '000140 bytes'],
163
+ ['LAYOUT', 'IFDS_BEFORE_DATA'],
164
+ ['BLOCK_ORDER', 'ROW_MAJOR'],
165
+ ['BLOCK_LEADER', 'SIZE_AS_UINT4'],
166
+ ['BLOCK_TRAILER', 'LAST_4_BYTES_REPEATED'],
167
+ ['KNOWN_INCOMPATIBLE_EDITION', 'NO'],
168
+ ]);
169
+ });
142
170
  });
143
171
 
144
172
  o.spec('CogStrip', () => {
@@ -443,15 +443,39 @@ export class CogTiffImage {
443
443
  return this.getBytes(offset, imageSize);
444
444
  }
445
445
 
446
+ /**
447
+ * Does this tile exist in the tiff and does it actually have a value
448
+ *
449
+ * Sparse tiffs can have a lot of empty tiles, this checks to see if the tile actually has data.
450
+ *
451
+ * @param x Tile x offset
452
+ * @param y Tile y offset
453
+ * @returns if the tile exists and has data
454
+ */
455
+ async hasTile(x: number, y: number): Promise<boolean> {
456
+ const tiles = this.tileSize;
457
+ const size = this.size;
458
+
459
+ if (tiles == null) throw new Error('Tiff is not tiled');
460
+
461
+ // TODO support GhostOptionTileOrder
462
+ const nyTiles = Math.ceil(size.height / tiles.height);
463
+ const nxTiles = Math.ceil(size.width / tiles.width);
464
+ if (x >= nxTiles || y >= nyTiles) return false;
465
+ const idx = y * nxTiles + x;
466
+ const ret = await this.getTileSize(idx);
467
+ return ret.offset > 0;
468
+ }
469
+
446
470
  protected async getTileSize(index: number): Promise<{ offset: number; imageSize: number }> {
447
471
  // GDAL optimizes tiles by storing the size of the tile in
448
472
  // the few bytes leading up to the tile
449
- if (this.tif.options.tileLeaderByteSize) {
473
+ const leaderBytes = this.tif.options.tileLeaderByteSize;
474
+ if (leaderBytes) {
450
475
  const offset = await this.getTileOffset(index);
451
476
  // Sparse COG no data found
452
477
  if (offset === 0) return { offset: 0, imageSize: 0 };
453
478
 
454
- const leaderBytes = this.tif.options.tileLeaderByteSize;
455
479
  // This fetch will generally load in the bytes needed for the image too
456
480
  // provided the image size is less than the size of a chunk
457
481
  await this.tif.source.loadBytes(offset - leaderBytes, leaderBytes);
package/src/cog.tiff.ts CHANGED
@@ -78,13 +78,7 @@ export class CogTiff {
78
78
 
79
79
  const ghostSize = nextOffsetIfd - this.cursor.currentOffset;
80
80
  // GDAL now stores metadata between the IFD inside a ghost storage area
81
- if (ghostSize > 0 && ghostSize < 16 * 1024) {
82
- // logger?.debug(
83
- // { offset: toHexString(this.cursor.currentOffset), length: toHexString(ghostSize) },
84
- // 'GhostOptions',
85
- // );
86
- // this.options.process(this.source, view.currentOffset, ghostSize);
87
- }
81
+ if (ghostSize > 0 && ghostSize < 16 * 1024) this.options.process(view.bytes(ghostSize));
88
82
 
89
83
  return this.processIfd(nextOffsetIfd);
90
84
  }
@@ -136,8 +130,6 @@ export class CogTiff {
136
130
  }
137
131
 
138
132
  private async processIfd(offset: number): Promise<void> {
139
- if (!this.source.hasBytes(offset, 4096)) await this.source.loadBytes(offset, 4096);
140
-
141
133
  const { image, nextOffset } = await this.readIfd(offset);
142
134
  this.images.push(image);
143
135
 
@@ -145,7 +137,8 @@ export class CogTiff {
145
137
  }
146
138
 
147
139
  private async readIfd(offset: number): Promise<{ nextOffset: number; image: CogTiffImage }> {
148
- if (!this.source.hasBytes(offset, 1024)) await this.source.loadBytes(offset, this.source.chunkSize);
140
+ if (!this.source.hasBytes(offset, 4096)) await this.source.loadBytes(offset, 4096);
141
+
149
142
  const view = this.cursor.seekTo(offset);
150
143
  const tagCount = view.offset();
151
144
  const byteStart = offset + this.ifdConfig.offset;
@@ -32,7 +32,6 @@ export abstract class CogTiffTagBase<T = unknown> {
32
32
 
33
33
  this.id = id;
34
34
  this.name = TiffTag[this.id];
35
-
36
35
  this.dataType = this.tiff.source.getUint16(offset + 2);
37
36
  this.dataCount = this.tiff.source.getUint(offset + 4, this.tiff.ifdConfig.pointer);
38
37
  this.dataTypeSize = getTiffTagSize(this.dataType);
@@ -1,12 +1,5 @@
1
- import { ByteSize, ChunkSource } from '@chunkd/core';
2
- import { getReverseEnumValue } from '../util/util.enum.js';
3
-
4
- // GDAL_STRUCTURAL_METADATA_SIZE: '000140 bytes',
5
- // LAYOUT: 'IFDS_BEFORE_DATA',
6
- // BLOCK_ORDER: 'ROW_MAJOR',
7
- // BLOCK_LEADER: 'SIZE_AS_UINT4',
8
- // BLOCK_TRAILER: 'LAST_4_BYTES_REPEATED',
9
- // KNOWN_INCOMPATIBLE_EDITION: 'NO'
1
+ import { ByteSize } from '@chunkd/core';
2
+ import { CogTiff } from '../cog.tiff.js';
10
3
 
11
4
  export enum GhostOption {
12
5
  GDAL_STRUCTURAL_METADATA_SIZE = 'GDAL_STRUCTURAL_METADATA_SIZE',
@@ -25,16 +18,14 @@ export enum GhostOptionTileOrder {
25
18
  export enum GhostOptionTileLeader {
26
19
  uint32 = 'SIZE_AS_UINT4',
27
20
  }
28
- export const GhostOptionTileLeaderSize: { [key: string]: ByteSize } = {
29
- uint32: ByteSize.UInt32,
30
- };
31
21
 
32
22
  /**
33
23
  * GDAL has made a ghost set of options for Tif files
34
24
  * this class represents the optimizations that can be used
35
25
  */
36
26
  export class CogTifGhostOptions {
37
- options: Map<GhostOption, string> = new Map();
27
+ options: Map<string, string> = new Map();
28
+ source: CogTiff;
38
29
 
39
30
  /**
40
31
  * Has GDAL optimized this tif
@@ -51,61 +42,43 @@ export class CogTifGhostOptions {
51
42
  return this.options.get(GhostOption.KNOWN_INCOMPATIBLE_EDITION) === 'YES';
52
43
  }
53
44
 
54
- private set(key: GhostOption, val: string): void {
55
- this.options.set(key, val);
56
- }
57
-
58
45
  /**
59
46
  * Load the ghost options from a source
60
- * @param source Source to load from
61
- * @param offset Byte offset to start reading
62
- * @param length max number of bytes to read
47
+ * @param bytes the ghost header bytes
63
48
  */
64
- process(source: ChunkSource, offset: number, length: number): void {
65
- const chars: string[] = [];
66
- for (let i = offset; i < offset + length; i++) {
67
- const char = source.getUint8(i);
68
- if (char === 0) continue;
69
- chars.push(String.fromCharCode(char));
49
+ process(bytes: Uint8Array): void {
50
+ let key = '';
51
+ let value = '';
52
+ let setValue = false;
53
+ for (let i = 0; i < bytes.length; i++) {
54
+ const charCode = bytes[i];
55
+ if (charCode === 0) break;
56
+
57
+ const char = String.fromCharCode(charCode);
58
+ if (char === '\n') {
59
+ this.options.set(key, value);
60
+ key = '';
61
+ value = '';
62
+ setValue = false;
63
+ } else if (char === '=') {
64
+ setValue = true;
65
+ } else {
66
+ if (setValue) value += char;
67
+ else key += char;
68
+ }
70
69
  }
71
-
72
- const keyValPairs = chars
73
- .join('')
74
- .trim()
75
- .split('\n')
76
- .map((c) => c.split('='));
77
-
78
- for (const [key, value] of keyValPairs) {
79
- this.options.set(GhostOption[key as GhostOption], value);
80
- }
81
- }
82
-
83
- private _getReverse<T>(e: Record<string, any>, key: GhostOption): T | null {
84
- const opt = this.options.get(key);
85
- if (opt == null) return null;
86
- return getReverseEnumValue<T>(e, opt);
87
- }
88
-
89
- /**
90
- * The ordering of tiles inside the tif
91
- */
92
- get tileOrder(): GhostOptionTileOrder | null {
93
- return this._getReverse(GhostOptionTileOrder, GhostOption.BLOCK_ORDER);
94
- }
95
-
96
- /**
97
- * Are tiles stored with the file size immediately before the tile
98
- */
99
- get tileLeader(): GhostOptionTileLeader | null {
100
- return this._getReverse(GhostOptionTileLeader, GhostOption.BLOCK_LEADER);
101
70
  }
102
71
 
103
72
  /**
104
73
  * If the tile leader is set, how many bytes are allocated to the tile size
105
74
  */
106
75
  get tileLeaderByteSize(): ByteSize | null {
107
- if (this.tileLeader == null) return null;
108
- return GhostOptionTileLeaderSize[this.tileLeader];
76
+ switch (this.options.get(GhostOption.BLOCK_LEADER)) {
77
+ case GhostOptionTileLeader.uint32:
78
+ return ByteSize.UInt32;
79
+ default:
80
+ return null;
81
+ }
109
82
  }
110
83
 
111
84
  get isMaskInterleaved(): boolean {