@cogeotiff/core 7.2.0 → 8.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/CHANGELOG.md +3 -500
  2. package/README.md +28 -10
  3. package/build/__benchmark__/cog.read.benchmark.d.ts +0 -1
  4. package/build/__benchmark__/cog.read.benchmark.js +6 -4
  5. package/build/__benchmark__/cog.read.benchmark.js.map +1 -0
  6. package/build/__benchmark__/source.file.d.ts +9 -0
  7. package/build/__benchmark__/source.file.js +29 -0
  8. package/build/__benchmark__/source.file.js.map +1 -0
  9. package/build/__benchmark__/source.memory.d.ts +9 -0
  10. package/build/__benchmark__/source.memory.js +32 -0
  11. package/build/__benchmark__/source.memory.js.map +1 -0
  12. package/build/__test__/cog.image.test.d.ts +1 -2
  13. package/build/__test__/cog.image.test.js +82 -90
  14. package/build/__test__/cog.image.test.js.map +1 -0
  15. package/build/__test__/cog.read.test.d.ts +1 -2
  16. package/build/__test__/cog.read.test.js +37 -55
  17. package/build/__test__/cog.read.test.js.map +1 -0
  18. package/build/__test__/example.d.ts +1 -0
  19. package/build/__test__/example.js +27 -0
  20. package/build/__test__/example.js.map +1 -0
  21. package/build/cog.tiff.d.ts +22 -28
  22. package/build/cog.tiff.image.d.ts +16 -28
  23. package/build/cog.tiff.image.js +147 -101
  24. package/build/cog.tiff.image.js.map +1 -0
  25. package/build/cog.tiff.js +141 -97
  26. package/build/cog.tiff.js.map +1 -0
  27. package/build/const/index.d.ts +1 -2
  28. package/build/const/index.js +2 -2
  29. package/build/const/index.js.map +1 -0
  30. package/build/const/tiff.endian.d.ts +0 -1
  31. package/build/const/tiff.endian.js +1 -1
  32. package/build/const/tiff.endian.js.map +1 -0
  33. package/build/const/tiff.mime.d.ts +10 -11
  34. package/build/const/tiff.mime.js +22 -22
  35. package/build/const/tiff.mime.js.map +1 -0
  36. package/build/const/tiff.tag.id.d.ts +5 -5
  37. package/build/const/tiff.tag.id.js +155 -154
  38. package/build/const/tiff.tag.id.js.map +1 -0
  39. package/build/const/tiff.tag.value.d.ts +15 -16
  40. package/build/const/tiff.tag.value.js +16 -16
  41. package/build/const/tiff.tag.value.js.map +1 -0
  42. package/build/const/tiff.version.d.ts +0 -1
  43. package/build/const/tiff.version.js +1 -1
  44. package/build/const/tiff.version.js.map +1 -0
  45. package/build/index.d.ts +11 -6
  46. package/build/index.js +9 -5
  47. package/build/index.js.map +1 -0
  48. package/build/read/data.view.offset.d.ts +15 -0
  49. package/build/read/data.view.offset.js +19 -0
  50. package/build/read/data.view.offset.js.map +1 -0
  51. package/build/read/tiff.gdal.d.ts +9 -12
  52. package/build/read/tiff.gdal.js +22 -17
  53. package/build/read/tiff.gdal.js.map +1 -0
  54. package/build/read/tiff.ifd.config.d.ts +6 -4
  55. package/build/read/tiff.ifd.config.js +2 -2
  56. package/build/read/tiff.ifd.config.js.map +1 -0
  57. package/build/read/tiff.tag.d.ts +37 -20
  58. package/build/read/tiff.tag.factory.d.ts +16 -0
  59. package/build/read/tiff.tag.factory.js +130 -0
  60. package/build/read/tiff.tag.factory.js.map +1 -0
  61. package/build/read/tiff.tag.js +2 -37
  62. package/build/read/tiff.tag.js.map +1 -0
  63. package/build/read/tiff.value.reader.d.ts +2 -6
  64. package/build/read/tiff.value.reader.js +16 -54
  65. package/build/read/tiff.value.reader.js.map +1 -0
  66. package/build/source.d.ts +5 -0
  67. package/build/source.js +2 -0
  68. package/build/source.js.map +1 -0
  69. package/build/util/bytes.d.ts +17 -0
  70. package/build/util/bytes.js +42 -0
  71. package/build/util/bytes.js.map +1 -0
  72. package/build/util/util.hex.d.ts +2 -3
  73. package/build/util/util.hex.js +4 -5
  74. package/build/util/util.hex.js.map +1 -0
  75. package/build/vector.d.ts +0 -1
  76. package/build/vector.js +1 -1
  77. package/build/vector.js.map +1 -0
  78. package/package.json +25 -30
  79. package/src/__benchmark__/cog.read.benchmark.ts +12 -10
  80. package/src/__benchmark__/source.file.ts +23 -0
  81. package/src/__benchmark__/source.memory.ts +23 -0
  82. package/src/__test__/cog.image.test.ts +188 -197
  83. package/src/__test__/cog.read.test.ts +50 -72
  84. package/src/__test__/example.ts +31 -0
  85. package/src/cog.tiff.image.ts +456 -448
  86. package/src/cog.tiff.ts +143 -146
  87. package/src/const/index.ts +1 -1
  88. package/src/const/tiff.endian.ts +2 -2
  89. package/src/const/tiff.mime.ts +21 -21
  90. package/src/const/tiff.tag.id.ts +159 -158
  91. package/src/const/tiff.tag.value.ts +16 -16
  92. package/src/const/tiff.version.ts +11 -11
  93. package/src/index.ts +11 -5
  94. package/src/read/data.view.offset.ts +23 -0
  95. package/src/read/tiff.gdal.ts +61 -63
  96. package/src/read/tiff.ifd.config.ts +35 -31
  97. package/src/read/tiff.tag.factory.ts +163 -0
  98. package/src/read/tiff.tag.ts +38 -39
  99. package/src/read/tiff.value.reader.ts +25 -73
  100. package/src/source.ts +5 -0
  101. package/src/util/bytes.ts +44 -0
  102. package/src/util/util.hex.ts +5 -7
  103. package/src/vector.ts +5 -5
  104. package/tsconfig.json +8 -10
  105. package/build/__benchmark__/cog.read.benchmark.d.ts.map +0 -1
  106. package/build/__test__/cog.image.test.d.ts.map +0 -1
  107. package/build/__test__/cog.read.test.d.ts.map +0 -1
  108. package/build/cog.tiff.d.ts.map +0 -1
  109. package/build/cog.tiff.image.d.ts.map +0 -1
  110. package/build/const/index.d.ts.map +0 -1
  111. package/build/const/tiff.endian.d.ts.map +0 -1
  112. package/build/const/tiff.mime.d.ts.map +0 -1
  113. package/build/const/tiff.tag.id.d.ts.map +0 -1
  114. package/build/const/tiff.tag.value.d.ts.map +0 -1
  115. package/build/const/tiff.version.d.ts.map +0 -1
  116. package/build/index.d.ts.map +0 -1
  117. package/build/read/tag/__test__/tag.test.d.ts +0 -2
  118. package/build/read/tag/__test__/tag.test.d.ts.map +0 -1
  119. package/build/read/tag/__test__/tag.test.js +0 -23
  120. package/build/read/tag/tiff.tag.base.d.ts +0 -55
  121. package/build/read/tag/tiff.tag.base.d.ts.map +0 -1
  122. package/build/read/tag/tiff.tag.base.js +0 -79
  123. package/build/read/tag/tiff.tag.lazy.d.ts +0 -7
  124. package/build/read/tag/tiff.tag.lazy.d.ts.map +0 -1
  125. package/build/read/tag/tiff.tag.lazy.js +0 -18
  126. package/build/read/tag/tiff.tag.offset.d.ts +0 -21
  127. package/build/read/tag/tiff.tag.offset.d.ts.map +0 -1
  128. package/build/read/tag/tiff.tag.offset.js +0 -54
  129. package/build/read/tag/tiff.tag.static.d.ts +0 -8
  130. package/build/read/tag/tiff.tag.static.d.ts.map +0 -1
  131. package/build/read/tag/tiff.tag.static.js +0 -17
  132. package/build/read/tiff.gdal.d.ts.map +0 -1
  133. package/build/read/tiff.ifd.config.d.ts.map +0 -1
  134. package/build/read/tiff.tag.d.ts.map +0 -1
  135. package/build/read/tiff.value.reader.d.ts.map +0 -1
  136. package/build/source/cog.source.view.d.ts +0 -33
  137. package/build/source/cog.source.view.d.ts.map +0 -1
  138. package/build/source/cog.source.view.js +0 -65
  139. package/build/util/util.hex.d.ts.map +0 -1
  140. package/build/vector.d.ts.map +0 -1
  141. package/src/@types/ieee754.d.ts +0 -18
  142. package/src/read/tag/__test__/tag.test.ts +0 -27
  143. package/src/read/tag/tiff.tag.base.ts +0 -126
  144. package/src/read/tag/tiff.tag.lazy.ts +0 -17
  145. package/src/read/tag/tiff.tag.offset.ts +0 -61
  146. package/src/read/tag/tiff.tag.static.ts +0 -15
  147. package/src/source/cog.source.view.ts +0 -77
@@ -1,16 +1,61 @@
1
+ import { getUint } from './util/bytes.js';
1
2
  import { TiffCompression, TiffMimeType } from './const/tiff.mime.js';
2
- import { TiffTag, TiffTagGeo } from './const/tiff.tag.id.js';
3
- import { CogTiffTagLazy } from './read/tag/tiff.tag.lazy.js';
4
- import { CogTiffTag } from './read/tiff.tag.js';
5
- /** Invalid EPSG code */
3
+ import { TagId, TagGeoId } from './const/tiff.tag.id.js';
4
+ import { fetchLazy, getValueAt } from './read/tiff.tag.factory.js';
5
+ // /** Invalid EPSG code */
6
6
  export const InvalidProjectionCode = 32767;
7
+ /** Tags that are commonly accessed for geotiffs */
8
+ export const ImportantTags = new Set([
9
+ TagId.Compression,
10
+ TagId.ImageHeight,
11
+ TagId.ImageWidth,
12
+ TagId.ModelPixelScale,
13
+ TagId.ModelTiePoint,
14
+ TagId.ModelTransformation,
15
+ TagId.TileHeight,
16
+ TagId.TileWidth,
17
+ TagId.GeoKeyDirectory,
18
+ TagId.GeoAsciiParams,
19
+ TagId.GeoDoubleParams,
20
+ TagId.TileOffsets,
21
+ ]);
7
22
  export class CogTiffImage {
8
- constructor(tif, id, tags) {
23
+ constructor(tiff, id, tags) {
24
+ /** All IFD tags that have been read for the image */
25
+ Object.defineProperty(this, "tags", {
26
+ enumerable: true,
27
+ configurable: true,
28
+ writable: true,
29
+ value: void 0
30
+ });
31
+ /** Id of the tif image, generally the image index inside the tif */
32
+ Object.defineProperty(this, "id", {
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true,
36
+ value: void 0
37
+ });
38
+ Object.defineProperty(this, "tiff", {
39
+ enumerable: true,
40
+ configurable: true,
41
+ writable: true,
42
+ value: void 0
43
+ });
9
44
  /** Has loadGeoTiffTags been called */
10
- this.tagsGeoLoaded = false;
45
+ Object.defineProperty(this, "isGeoTagsLoaded", {
46
+ enumerable: true,
47
+ configurable: true,
48
+ writable: true,
49
+ value: false
50
+ });
11
51
  /** Sub tags stored in TiffTag.GeoKeyDirectory */
12
- this.tagsGeo = new Map();
13
- this.tif = tif;
52
+ Object.defineProperty(this, "tagsGeo", {
53
+ enumerable: true,
54
+ configurable: true,
55
+ writable: true,
56
+ value: new Map()
57
+ });
58
+ this.tiff = tiff;
14
59
  this.id = id;
15
60
  this.tags = tags;
16
61
  }
@@ -19,26 +64,25 @@ export class CogTiffImage {
19
64
  *
20
65
  * @param loadGeoTags Whether to load the GeoKeyDirectory and unpack it
21
66
  */
22
- async init(loadGeoTags = false) {
67
+ async init(loadGeoTags = true) {
23
68
  const requiredTags = [
24
- this.fetch(TiffTag.Compression),
25
- this.fetch(TiffTag.ImageHeight),
26
- this.fetch(TiffTag.ImageWidth),
27
- this.fetch(TiffTag.ModelPixelScale),
28
- this.fetch(TiffTag.ModelTiePoint),
29
- this.fetch(TiffTag.ModelTransformation),
30
- this.fetch(TiffTag.TileHeight),
31
- this.fetch(TiffTag.TileWidth),
69
+ this.fetch(TagId.Compression),
70
+ this.fetch(TagId.ImageHeight),
71
+ this.fetch(TagId.ImageWidth),
72
+ this.fetch(TagId.ModelPixelScale),
73
+ this.fetch(TagId.ModelTiePoint),
74
+ this.fetch(TagId.ModelTransformation),
75
+ this.fetch(TagId.TileHeight),
76
+ this.fetch(TagId.TileWidth),
32
77
  ];
33
78
  if (loadGeoTags) {
34
- requiredTags.push(this.fetch(TiffTag.GeoKeyDirectory));
35
- requiredTags.push(this.fetch(TiffTag.GeoAsciiParams));
36
- requiredTags.push(this.fetch(TiffTag.GeoDoubleParams));
79
+ requiredTags.push(this.fetch(TagId.GeoKeyDirectory));
80
+ requiredTags.push(this.fetch(TagId.GeoAsciiParams));
81
+ requiredTags.push(this.fetch(TagId.GeoDoubleParams));
37
82
  }
38
83
  await Promise.all(requiredTags);
39
- if (loadGeoTags) {
84
+ if (loadGeoTags)
40
85
  await this.loadGeoTiffTags();
41
- }
42
86
  }
43
87
  /**
44
88
  * Get the value of a TiffTag if it exists null otherwise
@@ -47,6 +91,8 @@ export class CogTiffImage {
47
91
  const sourceTag = this.tags.get(tag);
48
92
  if (sourceTag == null)
49
93
  return null;
94
+ if (sourceTag.type === 'offset' && sourceTag.isLoaded === false)
95
+ return null;
50
96
  return sourceTag.value;
51
97
  }
52
98
  /**
@@ -54,26 +100,26 @@ export class CogTiffImage {
54
100
  */
55
101
  async loadGeoTiffTags() {
56
102
  // Already loaded
57
- if (this.tagsGeoLoaded)
103
+ if (this.isGeoTagsLoaded)
58
104
  return;
59
- const sourceTag = this.tags.get(TiffTag.GeoKeyDirectory);
105
+ const sourceTag = this.tags.get(TagId.GeoKeyDirectory);
60
106
  if (sourceTag == null) {
61
- this.tagsGeoLoaded = true;
107
+ this.isGeoTagsLoaded = true;
62
108
  return;
63
109
  }
64
- if (!sourceTag.isReady && sourceTag instanceof CogTiffTagLazy) {
110
+ if (sourceTag.type === 'lazy' && sourceTag.value == null) {
65
111
  // Load all the required keys
66
112
  await Promise.all([
67
- this.fetch(TiffTag.GeoKeyDirectory),
68
- this.fetch(TiffTag.GeoAsciiParams),
69
- this.fetch(TiffTag.GeoDoubleParams),
113
+ this.fetch(TagId.GeoKeyDirectory),
114
+ this.fetch(TagId.GeoAsciiParams),
115
+ this.fetch(TagId.GeoDoubleParams),
70
116
  ]);
71
117
  }
72
- this.tagsGeoLoaded = true;
118
+ this.isGeoTagsLoaded = true;
73
119
  if (sourceTag.value == null)
74
120
  return;
75
121
  const geoTags = sourceTag.value;
76
- if (!Array.isArray(geoTags))
122
+ if (typeof geoTags === 'number')
77
123
  throw new Error('Invalid geo tags found');
78
124
  for (let i = 4; i <= geoTags[3] * 4; i += 4) {
79
125
  const key = geoTags[i];
@@ -91,7 +137,7 @@ export class CogTiffImage {
91
137
  this.tagsGeo.set(key, tag.value[offset + count - 1]);
92
138
  }
93
139
  else if (typeof tag.value === 'string') {
94
- this.tagsGeo.set(key, tag.value.substr(offset, offset + count - 1).trim());
140
+ this.tagsGeo.set(key, tag.value.slice(offset, offset + count - 1).trim());
95
141
  }
96
142
  }
97
143
  }
@@ -99,7 +145,7 @@ export class CogTiffImage {
99
145
  * Get the associated GeoTiffTags
100
146
  */
101
147
  valueGeo(tag) {
102
- if (this.tagsGeoLoaded === false)
148
+ if (this.isGeoTagsLoaded === false)
103
149
  throw new Error('loadGeoTiffTags() has not been called');
104
150
  return this.tagsGeo.get(tag);
105
151
  }
@@ -111,9 +157,13 @@ export class CogTiffImage {
111
157
  const sourceTag = this.tags.get(tag);
112
158
  if (sourceTag == null)
113
159
  return null;
114
- if (CogTiffTag.isLazy(sourceTag))
115
- return sourceTag.fetch();
116
- return sourceTag.value;
160
+ if (sourceTag.type === 'inline')
161
+ return sourceTag.value;
162
+ if (sourceTag.type === 'lazy')
163
+ return fetchLazy(sourceTag, this.tiff);
164
+ if (sourceTag.isLoaded)
165
+ return sourceTag.value;
166
+ throw new Error('Cannot fetch:' + tag);
117
167
  }
118
168
  /**
119
169
  * Get the origin point for the image
@@ -121,28 +171,28 @@ export class CogTiffImage {
121
171
  * @returns origin point of the image
122
172
  */
123
173
  get origin() {
124
- const tiePoints = this.value(TiffTag.ModelTiePoint);
174
+ const tiePoints = this.value(TagId.ModelTiePoint);
125
175
  if (tiePoints != null && tiePoints.length === 6) {
126
176
  return [tiePoints[3], tiePoints[4], tiePoints[5]];
127
177
  }
128
- const modelTransformation = this.value(TiffTag.ModelTransformation);
178
+ const modelTransformation = this.value(TagId.ModelTransformation);
129
179
  if (modelTransformation != null) {
130
180
  return [modelTransformation[3], modelTransformation[7], modelTransformation[11]];
131
181
  }
132
182
  // If this is a sub image, use the origin from the top level image
133
- if (this.value(TiffTag.NewSubFileType) === 1 && this.id !== 0) {
134
- return this.tif.images[0].origin;
183
+ if (this.value(TagId.NewSubFileType) === 1 && this.id !== 0) {
184
+ return this.tiff.images[0].origin;
135
185
  }
136
186
  throw new Error('Image does not have a geo transformation.');
137
187
  }
138
188
  /** Is there enough geo information on this image to figure out where its actually located */
139
189
  get isGeoLocated() {
140
- const isImageLocated = this.value(TiffTag.ModelPixelScale) != null || this.value(TiffTag.ModelTransformation) != null;
190
+ const isImageLocated = this.value(TagId.ModelPixelScale) != null || this.value(TagId.ModelTransformation) != null;
141
191
  if (isImageLocated)
142
192
  return true;
143
193
  // If this is a sub image, use the isGeoLocated from the top level image
144
- if (this.value(TiffTag.NewSubFileType) === 1 && this.id !== 0)
145
- return this.tif.images[0].isGeoLocated;
194
+ if (this.value(TagId.NewSubFileType) === 1 && this.id !== 0)
195
+ return this.tiff.images[0].isGeoLocated;
146
196
  return false;
147
197
  }
148
198
  /**
@@ -151,17 +201,17 @@ export class CogTiffImage {
151
201
  * @returns [x,y,z] pixel scale
152
202
  */
153
203
  get resolution() {
154
- const modelPixelScale = this.value(TiffTag.ModelPixelScale);
204
+ const modelPixelScale = this.value(TagId.ModelPixelScale);
155
205
  if (modelPixelScale != null) {
156
206
  return [modelPixelScale[0], -modelPixelScale[1], modelPixelScale[2]];
157
207
  }
158
- const modelTransformation = this.value(TiffTag.ModelTransformation);
208
+ const modelTransformation = this.value(TagId.ModelTransformation);
159
209
  if (modelTransformation != null) {
160
210
  return [modelTransformation[0], modelTransformation[5], modelTransformation[10]];
161
211
  }
162
212
  // If this is a sub image, use the resolution from the top level image
163
- if (this.value(TiffTag.NewSubFileType) === 1 && this.id !== 0) {
164
- const firstImg = this.tif.images[0];
213
+ if (this.value(TagId.NewSubFileType) === 1 && this.id !== 0) {
214
+ const firstImg = this.tiff.images[0];
165
215
  const [resX, resY, resZ] = firstImg.resolution;
166
216
  const firstImgSize = firstImg.size;
167
217
  const imgSize = this.size;
@@ -196,10 +246,9 @@ export class CogTiffImage {
196
246
  * @returns Compression type eg webp
197
247
  */
198
248
  get compression() {
199
- const compression = this.value(TiffTag.Compression);
200
- if (compression == null || typeof compression !== 'number') {
249
+ const compression = this.value(TagId.Compression);
250
+ if (compression == null || typeof compression !== 'number')
201
251
  return null;
202
- }
203
252
  return TiffCompression[compression];
204
253
  }
205
254
  /**
@@ -208,7 +257,7 @@ export class CogTiffImage {
208
257
  * @returns EPSG Code if it exists
209
258
  */
210
259
  get epsg() {
211
- const projection = this.valueGeo(TiffTagGeo.ProjectedCSTypeGeoKey);
260
+ const projection = this.valueGeo(TagGeoId.ProjectedCSTypeGeoKey);
212
261
  if (projection === InvalidProjectionCode)
213
262
  return null;
214
263
  return projection;
@@ -220,29 +269,23 @@ export class CogTiffImage {
220
269
  */
221
270
  get size() {
222
271
  return {
223
- width: this.value(TiffTag.ImageWidth),
224
- height: this.value(TiffTag.ImageHeight),
272
+ width: this.value(TagId.ImageWidth),
273
+ height: this.value(TagId.ImageHeight),
225
274
  };
226
275
  }
227
- /**
228
- * Get the list of IFD tags that were read
229
- */
230
- get tagList() {
231
- return [...this.tags.keys()].map((c) => TiffTag[c]);
232
- }
233
276
  /**
234
277
  * Determine if this image is tiled
235
278
  */
236
279
  isTiled() {
237
- return this.value(TiffTag.TileWidth) !== null;
280
+ return this.value(TagId.TileWidth) !== null;
238
281
  }
239
282
  /**
240
283
  * Get size of individual tiles
241
284
  */
242
285
  get tileSize() {
243
286
  return {
244
- width: this.value(TiffTag.TileWidth),
245
- height: this.value(TiffTag.TileHeight),
287
+ width: this.value(TagId.TileWidth),
288
+ height: this.value(TagId.TileHeight),
246
289
  };
247
290
  }
248
291
  /**
@@ -263,7 +306,7 @@ export class CogTiffImage {
263
306
  * @returns file offset to where the tiffs are stored
264
307
  */
265
308
  get tileOffset() {
266
- const tileOffset = this.tags.get(TiffTag.TileOffsets);
309
+ const tileOffset = this.tags.get(TagId.TileOffsets);
267
310
  if (tileOffset == null)
268
311
  throw new Error('No tile offsets found');
269
312
  return tileOffset;
@@ -276,24 +319,10 @@ export class CogTiffImage {
276
319
  * @returns number of strips present
277
320
  */
278
321
  get stripCount() {
279
- const tileOffset = this.tags.get(TiffTag.StripByteCounts);
322
+ const tileOffset = this.tags.get(TagId.StripByteCounts);
280
323
  if (tileOffset == null)
281
324
  return 0;
282
- return tileOffset.dataCount;
283
- }
284
- /**
285
- * Get a pointer to a specific tile inside the tiff file
286
- *
287
- * @param index tile index
288
- * @returns file offset of the specified tile
289
- */
290
- async getTileOffset(index) {
291
- const tileOffset = this.tileOffset;
292
- if (index < 0 || index > tileOffset.dataCount) {
293
- throw new Error(`Tile offset: ${index} out of range: 0 -> ${tileOffset.dataCount}`);
294
- }
295
- // Fetch only the part of the offsets that are needed
296
- return tileOffset.getValueAt(index);
325
+ return tileOffset.count;
297
326
  }
298
327
  // Clamp the bounds of the output image to the size of the image, as sometimes the edge tiles are not full tiles
299
328
  getTileBounds(x, y) {
@@ -311,40 +340,44 @@ export class CogTiffImage {
311
340
  */
312
341
  async getStrip(index) {
313
342
  if (this.isTiled())
314
- throw new Error('Cannot read stripes, tiff is tiled');
315
- const byteCounts = this.tags.get(TiffTag.StripByteCounts);
316
- const offsets = this.tags.get(TiffTag.StripOffsets);
317
- if (index >= byteCounts.dataCount)
343
+ throw new Error('Cannot read stripes, tiff is tiled: ' + index);
344
+ const byteCounts = this.tags.get(TagId.StripByteCounts);
345
+ const offsets = this.tags.get(TagId.StripOffsets);
346
+ if (index >= byteCounts.count)
318
347
  throw new Error('Cannot read strip, index out of bounds');
319
- const [byteCount, offset] = await Promise.all([offsets.getValueAt(index), byteCounts.getValueAt(index)]);
348
+ const [byteCount, offset] = await Promise.all([
349
+ getOffset(this.tiff, offsets, index),
350
+ getOffset(this.tiff, byteCounts, index),
351
+ ]);
320
352
  return this.getBytes(byteCount, offset);
321
353
  }
322
354
  /** The jpeg header is stored in the IFD, read the JPEG header and adjust the byte array to include it */
323
355
  getJpegHeader(bytes) {
324
356
  // Both the JPEGTable and the Bytes with have the start of image and end of image markers
325
357
  // StartOfImage 0xffd8 EndOfImage 0xffd9
326
- const tables = this.value(TiffTag.JPEGTables);
358
+ const tables = this.value(TagId.JPEGTables);
327
359
  if (tables == null)
328
360
  throw new Error('Unable to find Jpeg header');
329
361
  // Remove EndOfImage marker
330
362
  const tableData = tables.slice(0, tables.length - 2);
331
363
  const actualBytes = new Uint8Array(bytes.byteLength + tableData.length - 2);
332
364
  actualBytes.set(tableData, 0);
333
- actualBytes.set(bytes.slice(2), tableData.length);
365
+ actualBytes.set(new Uint8Array(bytes).slice(2), tableData.length);
334
366
  return actualBytes;
335
367
  }
336
368
  /** Read image bytes at the given offset */
337
369
  async getBytes(offset, byteCount) {
338
370
  const mimeType = this.compression;
339
371
  if (mimeType == null)
340
- throw new Error('Unsupported compression: ' + this.value(TiffTag.Compression));
372
+ throw new Error('Unsupported compression: ' + this.value(TagId.Compression));
341
373
  if (byteCount === 0)
342
374
  return null;
343
- await this.tif.source.loadBytes(offset, byteCount);
344
- const bytes = this.tif.source.bytes(offset, byteCount);
345
- if (this.compression === TiffMimeType.JPEG) {
346
- return { mimeType, bytes: this.getJpegHeader(bytes) };
375
+ const bytes = await this.tiff.source.fetch(offset, byteCount);
376
+ if (bytes.byteLength < byteCount) {
377
+ throw new Error(`Failed to fetch bytes from offset:${offset} wanted:${byteCount} got:${bytes.byteLength}`);
347
378
  }
379
+ if (this.compression === TiffMimeType.Jpeg)
380
+ return { mimeType, bytes: this.getJpegHeader(bytes) };
348
381
  return { mimeType, bytes };
349
382
  }
350
383
  /**
@@ -362,7 +395,7 @@ export class CogTiffImage {
362
395
  if (tiles == null)
363
396
  throw new Error('Tiff is not tiled');
364
397
  if (mimeType == null)
365
- throw new Error('Unsupported compression: ' + this.value(TiffTag.Compression));
398
+ throw new Error('Unsupported compression: ' + this.value(TagId.Compression));
366
399
  // TODO support GhostOptionTileOrder
367
400
  const nyTiles = Math.ceil(size.height / tiles.height);
368
401
  const nxTiles = Math.ceil(size.width / tiles.width);
@@ -374,6 +407,7 @@ export class CogTiffImage {
374
407
  if (idx >= totalTiles)
375
408
  throw new Error(`Tile index is outside of tile range: ${idx} >= ${totalTiles}`);
376
409
  const { offset, imageSize } = await this.getTileSize(idx);
410
+ // console.log({ x, y, offset, imageSize });
377
411
  return this.getBytes(offset, imageSize);
378
412
  }
379
413
  /**
@@ -402,23 +436,35 @@ export class CogTiffImage {
402
436
  async getTileSize(index) {
403
437
  // GDAL optimizes tiles by storing the size of the tile in
404
438
  // the few bytes leading up to the tile
405
- const leaderBytes = this.tif.options.tileLeaderByteSize;
439
+ const leaderBytes = this.tiff.options?.tileLeaderByteSize;
406
440
  if (leaderBytes) {
407
- const offset = await this.getTileOffset(index);
441
+ const offset = await getOffset(this.tiff, this.tileOffset, index);
408
442
  // Sparse COG no data found
409
443
  if (offset === 0)
410
444
  return { offset: 0, imageSize: 0 };
411
445
  // This fetch will generally load in the bytes needed for the image too
412
446
  // provided the image size is less than the size of a chunk
413
- await this.tif.source.loadBytes(offset - leaderBytes, leaderBytes);
414
- return { offset, imageSize: this.tif.source.getUint(offset - leaderBytes, leaderBytes) };
447
+ const bytes = await this.tiff.source.fetch(offset - leaderBytes, leaderBytes);
448
+ return { offset, imageSize: getUint(new DataView(bytes), 0, leaderBytes, this.tiff.isLittleEndian) };
415
449
  }
416
- const byteCounts = this.tags.get(TiffTag.TileByteCounts);
417
- if (byteCounts == null) {
450
+ const byteCounts = this.tags.get(TagId.TileByteCounts);
451
+ if (byteCounts == null)
418
452
  throw new Error('No tile byte counts found');
419
- }
420
- const [offset, imageSize] = await Promise.all([this.getTileOffset(index), byteCounts.getValueAt(index)]);
453
+ const [offset, imageSize] = await Promise.all([
454
+ getOffset(this.tiff, this.tileOffset, index),
455
+ getOffset(this.tiff, byteCounts, index),
456
+ ]);
421
457
  return { offset, imageSize };
422
458
  }
423
459
  }
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=
460
+ function getOffset(tiff, x, index) {
461
+ if (index > x.count || index < 0)
462
+ throw new Error('TagIndex: out of bounds ' + x.id + ' @ ' + index);
463
+ if (x.type === 'inline') {
464
+ if (Array.isArray(x.value))
465
+ return x.value[index];
466
+ return x.value;
467
+ }
468
+ return getValueAt(tiff, x, index);
469
+ }
470
+ //# sourceMappingURL=cog.tiff.image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cog.tiff.image.js","sourceRoot":"","sources":["../src/cog.tiff.image.ts"],"names":[],"mappings":"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"}