@cogeotiff/core 7.2.1 → 8.0.2
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 +5 -502
- package/README.md +23 -11
- package/build/__benchmark__/cog.read.benchmark.d.ts +0 -1
- package/build/__benchmark__/cog.read.benchmark.js +6 -4
- package/build/__benchmark__/cog.read.benchmark.js.map +1 -0
- package/build/__benchmark__/source.file.d.ts +9 -0
- package/build/__benchmark__/source.file.js +29 -0
- package/build/__benchmark__/source.file.js.map +1 -0
- package/build/__benchmark__/source.memory.d.ts +9 -0
- package/build/__benchmark__/source.memory.js +32 -0
- package/build/__benchmark__/source.memory.js.map +1 -0
- package/build/__test__/cog.image.test.d.ts +1 -2
- package/build/__test__/cog.image.test.js +82 -90
- package/build/__test__/cog.image.test.js.map +1 -0
- package/build/__test__/cog.read.test.d.ts +1 -2
- package/build/__test__/cog.read.test.js +37 -55
- package/build/__test__/cog.read.test.js.map +1 -0
- package/build/__test__/example.d.ts +1 -0
- package/build/__test__/example.js +27 -0
- package/build/__test__/example.js.map +1 -0
- package/build/cog.tiff.d.ts +22 -28
- package/build/cog.tiff.image.d.ts +11 -23
- package/build/cog.tiff.image.js +108 -62
- package/build/cog.tiff.image.js.map +1 -0
- package/build/cog.tiff.js +141 -97
- package/build/cog.tiff.js.map +1 -0
- package/build/const/index.d.ts +1 -2
- package/build/const/index.js +2 -2
- package/build/const/index.js.map +1 -0
- package/build/const/tiff.endian.d.ts +0 -1
- package/build/const/tiff.endian.js +1 -1
- package/build/const/tiff.endian.js.map +1 -0
- package/build/const/tiff.mime.d.ts +10 -11
- package/build/const/tiff.mime.js +22 -22
- package/build/const/tiff.mime.js.map +1 -0
- package/build/const/tiff.tag.id.d.ts +3 -3
- package/build/const/tiff.tag.id.js +4 -3
- package/build/const/tiff.tag.id.js.map +1 -0
- package/build/const/tiff.tag.value.d.ts +15 -16
- package/build/const/tiff.tag.value.js +16 -16
- package/build/const/tiff.tag.value.js.map +1 -0
- package/build/const/tiff.version.d.ts +0 -1
- package/build/const/tiff.version.js +1 -1
- package/build/const/tiff.version.js.map +1 -0
- package/build/index.d.ts +11 -6
- package/build/index.js +9 -5
- package/build/index.js.map +1 -0
- package/build/read/data.view.offset.d.ts +15 -0
- package/build/read/data.view.offset.js +19 -0
- package/build/read/data.view.offset.js.map +1 -0
- package/build/read/tiff.gdal.d.ts +9 -12
- package/build/read/tiff.gdal.js +22 -17
- package/build/read/tiff.gdal.js.map +1 -0
- package/build/read/tiff.ifd.config.d.ts +6 -4
- package/build/read/tiff.ifd.config.js +2 -2
- package/build/read/tiff.ifd.config.js.map +1 -0
- package/build/read/tiff.tag.d.ts +40 -20
- package/build/read/tiff.tag.factory.d.ts +16 -0
- package/build/read/tiff.tag.factory.js +130 -0
- package/build/read/tiff.tag.factory.js.map +1 -0
- package/build/read/tiff.tag.js +2 -37
- package/build/read/tiff.tag.js.map +1 -0
- package/build/read/tiff.value.reader.d.ts +2 -6
- package/build/read/tiff.value.reader.js +16 -54
- package/build/read/tiff.value.reader.js.map +1 -0
- package/build/source.d.ts +5 -0
- package/build/source.js +2 -0
- package/build/source.js.map +1 -0
- package/build/util/bytes.d.ts +17 -0
- package/build/util/bytes.js +42 -0
- package/build/util/bytes.js.map +1 -0
- package/build/util/util.hex.d.ts +2 -3
- package/build/util/util.hex.js +4 -5
- package/build/util/util.hex.js.map +1 -0
- package/build/vector.d.ts +0 -1
- package/build/vector.js +1 -1
- package/build/vector.js.map +1 -0
- package/package.json +25 -30
- package/src/__benchmark__/cog.read.benchmark.ts +12 -10
- package/src/__benchmark__/source.file.ts +23 -0
- package/src/__benchmark__/source.memory.ts +23 -0
- package/src/__test__/cog.image.test.ts +188 -197
- package/src/__test__/cog.read.test.ts +50 -72
- package/src/__test__/example.ts +31 -0
- package/src/cog.tiff.image.ts +456 -447
- package/src/cog.tiff.ts +142 -145
- package/src/const/index.ts +1 -1
- package/src/const/tiff.endian.ts +2 -2
- package/src/const/tiff.mime.ts +21 -21
- package/src/const/tiff.tag.id.ts +157 -156
- package/src/const/tiff.tag.value.ts +16 -16
- package/src/const/tiff.version.ts +11 -11
- package/src/index.ts +11 -5
- package/src/read/data.view.offset.ts +23 -0
- package/src/read/tiff.gdal.ts +61 -63
- package/src/read/tiff.ifd.config.ts +35 -31
- package/src/read/tiff.tag.factory.ts +163 -0
- package/src/read/tiff.tag.ts +40 -38
- package/src/read/tiff.value.reader.ts +25 -73
- package/src/source.ts +5 -0
- package/src/util/bytes.ts +44 -0
- package/src/util/util.hex.ts +5 -7
- package/src/vector.ts +5 -5
- package/tsconfig.json +8 -8
- package/build/__benchmark__/cog.read.benchmark.d.ts.map +0 -1
- package/build/__test__/cog.image.test.d.ts.map +0 -1
- package/build/__test__/cog.read.test.d.ts.map +0 -1
- package/build/cog.tiff.d.ts.map +0 -1
- package/build/cog.tiff.image.d.ts.map +0 -1
- package/build/const/index.d.ts.map +0 -1
- package/build/const/tiff.endian.d.ts.map +0 -1
- package/build/const/tiff.mime.d.ts.map +0 -1
- package/build/const/tiff.tag.id.d.ts.map +0 -1
- package/build/const/tiff.tag.value.d.ts.map +0 -1
- package/build/const/tiff.version.d.ts.map +0 -1
- package/build/index.d.ts.map +0 -1
- package/build/read/tag/__test__/tag.test.d.ts +0 -2
- package/build/read/tag/__test__/tag.test.d.ts.map +0 -1
- package/build/read/tag/__test__/tag.test.js +0 -23
- package/build/read/tag/tiff.tag.base.d.ts +0 -55
- package/build/read/tag/tiff.tag.base.d.ts.map +0 -1
- package/build/read/tag/tiff.tag.base.js +0 -79
- package/build/read/tag/tiff.tag.lazy.d.ts +0 -7
- package/build/read/tag/tiff.tag.lazy.d.ts.map +0 -1
- package/build/read/tag/tiff.tag.lazy.js +0 -18
- package/build/read/tag/tiff.tag.offset.d.ts +0 -21
- package/build/read/tag/tiff.tag.offset.d.ts.map +0 -1
- package/build/read/tag/tiff.tag.offset.js +0 -54
- package/build/read/tag/tiff.tag.static.d.ts +0 -8
- package/build/read/tag/tiff.tag.static.d.ts.map +0 -1
- package/build/read/tag/tiff.tag.static.js +0 -17
- package/build/read/tiff.gdal.d.ts.map +0 -1
- package/build/read/tiff.ifd.config.d.ts.map +0 -1
- package/build/read/tiff.tag.d.ts.map +0 -1
- package/build/read/tiff.value.reader.d.ts.map +0 -1
- package/build/source/cog.source.view.d.ts +0 -33
- package/build/source/cog.source.view.d.ts.map +0 -1
- package/build/source/cog.source.view.js +0 -65
- package/build/util/util.hex.d.ts.map +0 -1
- package/build/vector.d.ts.map +0 -1
- package/src/@types/ieee754.d.ts +0 -18
- package/src/read/tag/__test__/tag.test.ts +0 -27
- package/src/read/tag/tiff.tag.base.ts +0 -126
- package/src/read/tag/tiff.tag.lazy.ts +0 -17
- package/src/read/tag/tiff.tag.offset.ts +0 -61
- package/src/read/tag/tiff.tag.static.ts +0 -15
- package/src/source/cog.source.view.ts +0 -77
package/build/cog.tiff.d.ts
CHANGED
|
@@ -1,52 +1,46 @@
|
|
|
1
|
-
import { ChunkSource } from '@chunkd/core';
|
|
2
1
|
import { CogTiffImage } from './cog.tiff.image.js';
|
|
3
2
|
import { TiffVersion } from './const/tiff.version.js';
|
|
4
3
|
import { CogTifGhostOptions } from './read/tiff.gdal.js';
|
|
5
4
|
import { TiffIfdConfig } from './read/tiff.ifd.config.js';
|
|
5
|
+
import { Source } from './source.js';
|
|
6
6
|
export declare class CogTiff {
|
|
7
|
-
|
|
7
|
+
/** Read 16KB blocks at a time */
|
|
8
|
+
defaultReadSize: number;
|
|
9
|
+
/** Where this cog is fetching its data from */
|
|
10
|
+
source: Source;
|
|
11
|
+
/** Big or small Tiff */
|
|
8
12
|
version: TiffVersion;
|
|
13
|
+
/** List of images, o is the base image */
|
|
9
14
|
images: CogTiffImage[];
|
|
10
|
-
options
|
|
11
|
-
|
|
15
|
+
/** Ghost header options */
|
|
16
|
+
options?: CogTifGhostOptions;
|
|
17
|
+
/** Configuration for the size of the IFD */
|
|
12
18
|
ifdConfig: TiffIfdConfig;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
static create(source: ChunkSource): Promise<CogTiff>;
|
|
19
|
+
/** Is the tiff being read is little Endian */
|
|
20
|
+
isLittleEndian: boolean;
|
|
16
21
|
/** Has init() been called */
|
|
17
22
|
isInitialized: boolean;
|
|
18
|
-
_initPromise
|
|
23
|
+
private _initPromise?;
|
|
24
|
+
constructor(source: Source);
|
|
25
|
+
/** Create a COG and initialize it by reading the COG headers */
|
|
26
|
+
static create(source: Source): Promise<CogTiff>;
|
|
19
27
|
/**
|
|
20
28
|
* Initialize the COG loading in the header and all image headers
|
|
21
|
-
*
|
|
22
|
-
* @param loadGeoKeys Whether to also initialize the GeoKeyDirectory
|
|
23
29
|
*/
|
|
24
|
-
init(
|
|
25
|
-
private doInit;
|
|
26
|
-
private fetchIfd;
|
|
27
|
-
getImage(z: number): CogTiffImage;
|
|
30
|
+
init(): Promise<CogTiff>;
|
|
28
31
|
/**
|
|
29
32
|
* Find a image which has a resolution similar to the provided resolution
|
|
30
33
|
*
|
|
31
34
|
* @param resolution resolution to find
|
|
32
35
|
*/
|
|
33
36
|
getImageByResolution(resolution: number): CogTiffImage;
|
|
37
|
+
/** Read the Starting header and all Image headers from the source */
|
|
38
|
+
private readHeader;
|
|
34
39
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* This may return null if the tile does not exist eg Sparse cogs,
|
|
40
|
+
* Read a IFD at a the provided offset
|
|
38
41
|
*
|
|
39
|
-
* @param
|
|
40
|
-
* @param
|
|
41
|
-
* @param index image index
|
|
42
|
+
* @param offset file offset to read the header from
|
|
43
|
+
* @param view offset that contains the bytes for the header
|
|
42
44
|
*/
|
|
43
|
-
getTile(x: number, y: number, index: number): Promise<{
|
|
44
|
-
mimeType: string;
|
|
45
|
-
bytes: Uint8Array;
|
|
46
|
-
} | null>;
|
|
47
|
-
private processIfd;
|
|
48
45
|
private readIfd;
|
|
49
|
-
/** Close the file source if it needs closing */
|
|
50
|
-
close(): Promise<void>;
|
|
51
46
|
}
|
|
52
|
-
//# sourceMappingURL=cog.tiff.d.ts.map
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { CogTiff } from './cog.tiff.js';
|
|
2
2
|
import { TiffMimeType } from './const/tiff.mime.js';
|
|
3
3
|
import { TiffTag, TiffTagGeo } from './const/tiff.tag.id.js';
|
|
4
|
-
import {
|
|
5
|
-
import { CogTiffTagOffset } from './read/tag/tiff.tag.offset.js';
|
|
4
|
+
import { Tag, TagOffset } from './read/tiff.tag.js';
|
|
6
5
|
import { BoundingBox, Size } from './vector.js';
|
|
7
|
-
/** Invalid EPSG code */
|
|
8
6
|
export declare const InvalidProjectionCode = 32767;
|
|
9
7
|
/**
|
|
10
8
|
* Number of tiles used inside this image
|
|
@@ -15,6 +13,8 @@ export interface CogTiffImageTiledCount {
|
|
|
15
13
|
/** Number of tiles on the y axis */
|
|
16
14
|
y: number;
|
|
17
15
|
}
|
|
16
|
+
/** Tags that are commonly accessed for geotiffs */
|
|
17
|
+
export declare const ImportantTags: Set<TiffTag>;
|
|
18
18
|
/**
|
|
19
19
|
* Size of a individual tile
|
|
20
20
|
*/
|
|
@@ -26,15 +26,15 @@ export interface CogTiffImageTileSize {
|
|
|
26
26
|
}
|
|
27
27
|
export declare class CogTiffImage {
|
|
28
28
|
/** All IFD tags that have been read for the image */
|
|
29
|
-
tags: Map<TiffTag,
|
|
29
|
+
tags: Map<TiffTag, Tag>;
|
|
30
30
|
/** Id of the tif image, generally the image index inside the tif */
|
|
31
31
|
id: number;
|
|
32
|
-
|
|
32
|
+
tiff: CogTiff;
|
|
33
33
|
/** Has loadGeoTiffTags been called */
|
|
34
|
-
|
|
34
|
+
isGeoTagsLoaded: boolean;
|
|
35
35
|
/** Sub tags stored in TiffTag.GeoKeyDirectory */
|
|
36
36
|
tagsGeo: Map<TiffTagGeo, string | number>;
|
|
37
|
-
constructor(
|
|
37
|
+
constructor(tiff: CogTiff, id: number, tags: Map<TiffTag, Tag>);
|
|
38
38
|
/**
|
|
39
39
|
* Force loading of important tags if they have not already been loaded
|
|
40
40
|
*
|
|
@@ -98,10 +98,6 @@ export declare class CogTiffImage {
|
|
|
98
98
|
* @returns Size in pixels
|
|
99
99
|
*/
|
|
100
100
|
get size(): Size;
|
|
101
|
-
/**
|
|
102
|
-
* Get the list of IFD tags that were read
|
|
103
|
-
*/
|
|
104
|
-
get tagList(): string[];
|
|
105
101
|
/**
|
|
106
102
|
* Determine if this image is tiled
|
|
107
103
|
*/
|
|
@@ -121,7 +117,7 @@ export declare class CogTiffImage {
|
|
|
121
117
|
*
|
|
122
118
|
* @returns file offset to where the tiffs are stored
|
|
123
119
|
*/
|
|
124
|
-
get tileOffset():
|
|
120
|
+
get tileOffset(): TagOffset;
|
|
125
121
|
/**
|
|
126
122
|
* Get the number of strip's inside this tiff
|
|
127
123
|
*
|
|
@@ -130,13 +126,6 @@ export declare class CogTiffImage {
|
|
|
130
126
|
* @returns number of strips present
|
|
131
127
|
*/
|
|
132
128
|
get stripCount(): number;
|
|
133
|
-
/**
|
|
134
|
-
* Get a pointer to a specific tile inside the tiff file
|
|
135
|
-
*
|
|
136
|
-
* @param index tile index
|
|
137
|
-
* @returns file offset of the specified tile
|
|
138
|
-
*/
|
|
139
|
-
protected getTileOffset(index: number): Promise<number>;
|
|
140
129
|
getTileBounds(x: number, y: number): BoundingBox;
|
|
141
130
|
/**
|
|
142
131
|
* Read a strip into a uint8 array
|
|
@@ -145,7 +134,7 @@ export declare class CogTiffImage {
|
|
|
145
134
|
*/
|
|
146
135
|
getStrip(index: number): Promise<{
|
|
147
136
|
mimeType: TiffMimeType;
|
|
148
|
-
bytes:
|
|
137
|
+
bytes: ArrayBuffer;
|
|
149
138
|
} | null>;
|
|
150
139
|
/** The jpeg header is stored in the IFD, read the JPEG header and adjust the byte array to include it */
|
|
151
140
|
private getJpegHeader;
|
|
@@ -161,7 +150,7 @@ export declare class CogTiffImage {
|
|
|
161
150
|
*/
|
|
162
151
|
getTile(x: number, y: number): Promise<{
|
|
163
152
|
mimeType: TiffMimeType;
|
|
164
|
-
bytes:
|
|
153
|
+
bytes: ArrayBuffer;
|
|
165
154
|
} | null>;
|
|
166
155
|
/**
|
|
167
156
|
* Does this tile exist in the tiff and does it actually have a value
|
|
@@ -173,9 +162,8 @@ export declare class CogTiffImage {
|
|
|
173
162
|
* @returns if the tile exists and has data
|
|
174
163
|
*/
|
|
175
164
|
hasTile(x: number, y: number): Promise<boolean>;
|
|
176
|
-
|
|
165
|
+
getTileSize(index: number): Promise<{
|
|
177
166
|
offset: number;
|
|
178
167
|
imageSize: number;
|
|
179
168
|
}>;
|
|
180
169
|
}
|
|
181
|
-
//# sourceMappingURL=cog.tiff.image.d.ts.map
|
package/build/cog.tiff.image.js
CHANGED
|
@@ -1,16 +1,61 @@
|
|
|
1
|
+
import { getUint } from './util/bytes.js';
|
|
1
2
|
import { TiffCompression, TiffMimeType } from './const/tiff.mime.js';
|
|
2
3
|
import { TiffTag, TiffTagGeo } from './const/tiff.tag.id.js';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
/** Invalid EPSG code */
|
|
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
|
+
TiffTag.Compression,
|
|
10
|
+
TiffTag.ImageHeight,
|
|
11
|
+
TiffTag.ImageWidth,
|
|
12
|
+
TiffTag.ModelPixelScale,
|
|
13
|
+
TiffTag.ModelTiePoint,
|
|
14
|
+
TiffTag.ModelTransformation,
|
|
15
|
+
TiffTag.TileHeight,
|
|
16
|
+
TiffTag.TileWidth,
|
|
17
|
+
TiffTag.GeoKeyDirectory,
|
|
18
|
+
TiffTag.GeoAsciiParams,
|
|
19
|
+
TiffTag.GeoDoubleParams,
|
|
20
|
+
TiffTag.TileOffsets,
|
|
21
|
+
]);
|
|
7
22
|
export class CogTiffImage {
|
|
8
|
-
constructor(
|
|
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
|
|
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
|
|
13
|
-
|
|
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,7 +64,7 @@ export class CogTiffImage {
|
|
|
19
64
|
*
|
|
20
65
|
* @param loadGeoTags Whether to load the GeoKeyDirectory and unpack it
|
|
21
66
|
*/
|
|
22
|
-
async init(loadGeoTags =
|
|
67
|
+
async init(loadGeoTags = true) {
|
|
23
68
|
const requiredTags = [
|
|
24
69
|
this.fetch(TiffTag.Compression),
|
|
25
70
|
this.fetch(TiffTag.ImageHeight),
|
|
@@ -36,9 +81,8 @@ export class CogTiffImage {
|
|
|
36
81
|
requiredTags.push(this.fetch(TiffTag.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,14 +100,14 @@ export class CogTiffImage {
|
|
|
54
100
|
*/
|
|
55
101
|
async loadGeoTiffTags() {
|
|
56
102
|
// Already loaded
|
|
57
|
-
if (this.
|
|
103
|
+
if (this.isGeoTagsLoaded)
|
|
58
104
|
return;
|
|
59
105
|
const sourceTag = this.tags.get(TiffTag.GeoKeyDirectory);
|
|
60
106
|
if (sourceTag == null) {
|
|
61
|
-
this.
|
|
107
|
+
this.isGeoTagsLoaded = true;
|
|
62
108
|
return;
|
|
63
109
|
}
|
|
64
|
-
if (
|
|
110
|
+
if (sourceTag.type === 'lazy' && sourceTag.value == null) {
|
|
65
111
|
// Load all the required keys
|
|
66
112
|
await Promise.all([
|
|
67
113
|
this.fetch(TiffTag.GeoKeyDirectory),
|
|
@@ -69,11 +115,11 @@ export class CogTiffImage {
|
|
|
69
115
|
this.fetch(TiffTag.GeoDoubleParams),
|
|
70
116
|
]);
|
|
71
117
|
}
|
|
72
|
-
this.
|
|
118
|
+
this.isGeoTagsLoaded = true;
|
|
73
119
|
if (sourceTag.value == null)
|
|
74
120
|
return;
|
|
75
121
|
const geoTags = sourceTag.value;
|
|
76
|
-
if (
|
|
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.
|
|
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.
|
|
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 (
|
|
115
|
-
return sourceTag.
|
|
116
|
-
|
|
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
|
|
@@ -131,7 +181,7 @@ export class CogTiffImage {
|
|
|
131
181
|
}
|
|
132
182
|
// If this is a sub image, use the origin from the top level image
|
|
133
183
|
if (this.value(TiffTag.NewSubFileType) === 1 && this.id !== 0) {
|
|
134
|
-
return this.
|
|
184
|
+
return this.tiff.images[0].origin;
|
|
135
185
|
}
|
|
136
186
|
throw new Error('Image does not have a geo transformation.');
|
|
137
187
|
}
|
|
@@ -142,7 +192,7 @@ export class CogTiffImage {
|
|
|
142
192
|
return true;
|
|
143
193
|
// If this is a sub image, use the isGeoLocated from the top level image
|
|
144
194
|
if (this.value(TiffTag.NewSubFileType) === 1 && this.id !== 0)
|
|
145
|
-
return this.
|
|
195
|
+
return this.tiff.images[0].isGeoLocated;
|
|
146
196
|
return false;
|
|
147
197
|
}
|
|
148
198
|
/**
|
|
@@ -161,7 +211,7 @@ export class CogTiffImage {
|
|
|
161
211
|
}
|
|
162
212
|
// If this is a sub image, use the resolution from the top level image
|
|
163
213
|
if (this.value(TiffTag.NewSubFileType) === 1 && this.id !== 0) {
|
|
164
|
-
const firstImg = this.
|
|
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;
|
|
@@ -197,9 +247,8 @@ export class CogTiffImage {
|
|
|
197
247
|
*/
|
|
198
248
|
get compression() {
|
|
199
249
|
const compression = this.value(TiffTag.Compression);
|
|
200
|
-
if (compression == null || typeof compression !== 'number')
|
|
250
|
+
if (compression == null || typeof compression !== 'number')
|
|
201
251
|
return null;
|
|
202
|
-
}
|
|
203
252
|
return TiffCompression[compression];
|
|
204
253
|
}
|
|
205
254
|
/**
|
|
@@ -224,12 +273,6 @@ export class CogTiffImage {
|
|
|
224
273
|
height: this.value(TiffTag.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
|
*/
|
|
@@ -279,21 +322,7 @@ export class CogTiffImage {
|
|
|
279
322
|
const tileOffset = this.tags.get(TiffTag.StripByteCounts);
|
|
280
323
|
if (tileOffset == null)
|
|
281
324
|
return 0;
|
|
282
|
-
return tileOffset.
|
|
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,12 +340,15 @@ 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');
|
|
343
|
+
throw new Error('Cannot read stripes, tiff is tiled: ' + index);
|
|
315
344
|
const byteCounts = this.tags.get(TiffTag.StripByteCounts);
|
|
316
345
|
const offsets = this.tags.get(TiffTag.StripOffsets);
|
|
317
|
-
if (index >= byteCounts.
|
|
346
|
+
if (index >= byteCounts.count)
|
|
318
347
|
throw new Error('Cannot read strip, index out of bounds');
|
|
319
|
-
const [byteCount, offset] = await Promise.all([
|
|
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 */
|
|
@@ -330,7 +362,7 @@ export class CogTiffImage {
|
|
|
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 */
|
|
@@ -340,11 +372,12 @@ export class CogTiffImage {
|
|
|
340
372
|
throw new Error('Unsupported compression: ' + this.value(TiffTag.Compression));
|
|
341
373
|
if (byteCount === 0)
|
|
342
374
|
return null;
|
|
343
|
-
await this.
|
|
344
|
-
|
|
345
|
-
|
|
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
|
/**
|
|
@@ -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.
|
|
439
|
+
const leaderBytes = this.tiff.options?.tileLeaderByteSize;
|
|
406
440
|
if (leaderBytes) {
|
|
407
|
-
const offset = await this.
|
|
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.
|
|
414
|
-
return { offset, imageSize:
|
|
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
450
|
const byteCounts = this.tags.get(TiffTag.TileByteCounts);
|
|
417
|
-
if (byteCounts == null)
|
|
451
|
+
if (byteCounts == null)
|
|
418
452
|
throw new Error('No tile byte counts found');
|
|
419
|
-
|
|
420
|
-
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAG7D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAEnE,2BAA2B;AAC3B,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAY3C,mDAAmD;AACnD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IACnC,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,WAAW;CACpB,CAAC,CAAC;AAYH,MAAM,OAAO,YAAY;IAcvB,YAAY,IAAa,EAAE,EAAU,EAAE,IAAuB;QAb9D,qDAAqD;QACrD;;;;;WAAwB;QAExB,oEAAoE;QACpE;;;;;WAAW;QAEX;;;;;WAAc;QAEd,sCAAsC;QACtC;;;;mBAAkB,KAAK;WAAC;QACxB,iDAAiD;QACjD;;;;mBAA4C,IAAI,GAAG,EAAE;WAAC;QAGpD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI;QAC3B,MAAM,YAAY,GAAG;YACnB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;SAC9B,CAAC;QAEF,IAAI,WAAW,EAAE;YACf,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;YACvD,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;YACtD,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;SACxD;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAChC,IAAI,WAAW;YAAE,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,KAAK,CAAI,GAAY;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,SAAS,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QACnC,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,QAAQ,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QAC7E,OAAO,SAAS,CAAC,KAAU,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,iBAAiB;QACjB,IAAI,IAAI,CAAC,eAAe;YAAE,OAAO;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACzD,IAAI,SAAS,IAAI,IAAI,EAAE;YACrB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,OAAO;SACR;QACD,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,IAAI,SAAS,CAAC,KAAK,IAAI,IAAI,EAAE;YACxD,6BAA6B;YAC7B,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC;gBACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;gBAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC;aACpC,CAAC,CAAC;SACJ;QACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,SAAS,CAAC,KAAK,IAAI,IAAI;YAAE,OAAO;QACpC,MAAM,OAAO,GAAG,SAAS,CAAC,KAAoB,CAAC;QAC/C,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC3E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;YAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAe,CAAC;YACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAEhC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAE9B,IAAI,QAAQ,KAAK,CAAC,EAAE;gBAClB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC9B,SAAS;aACV;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACpC,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI,IAAI;gBAAE,SAAS;YAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;aACtD;iBAAM,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE;gBACxC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aAC3E;SACF;IACH,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,GAAe;QACtB,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC7F,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,KAAK,CAAI,GAAY;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,SAAS,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QACnC,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC,KAAqB,CAAC;QACxE,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAiB,CAAC;QACtF,IAAI,SAAS,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC,KAAqB,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC;IACzC,CAAC;IAED;;;;OAIG;IACH,IAAI,MAAM;QACR,MAAM,SAAS,GAAoB,IAAI,CAAC,KAAK,CAAW,OAAO,CAAC,aAAa,CAAC,CAAC;QAC/E,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YAC/C,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;SACnD;QAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAW,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC9E,IAAI,mBAAmB,IAAI,IAAI,EAAE;YAC/B,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC;SAClF;QAED,kEAAkE;QAClE,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,CAAC,EAAE;YAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;SACnC;QAED,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,6FAA6F;IAC7F,IAAI,YAAY;QACd,MAAM,cAAc,GAClB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC;QACjG,IAAI,cAAc;YAAE,OAAO,IAAI,CAAC;QAChC,wEAAwE;QACxE,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;QACvG,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACH,IAAI,UAAU;QACZ,MAAM,eAAe,GAAoB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC7E,IAAI,eAAe,IAAI,IAAI,EAAE;YAC3B,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;SACtE;QACD,MAAM,mBAAmB,GAAoB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACrF,IAAI,mBAAmB,IAAI,IAAI,EAAE;YAC/B,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC;SAClF;QAED,sEAAsE;QACtE,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,CAAC,EAAE;YAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC;YAC/C,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;YAC1B,uEAAuE;YACvE,OAAO,CAAC,CAAC,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;SAC3G;QAED,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED;;;;OAIG;IACH,IAAI,IAAI;QACN,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAEnC,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,EAAE;YACxD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;SACrD;QAED,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAErB,MAAM,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3C,MAAM,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QAE5C,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAClF,CAAC;IAED;;;;;;OAMG;IACH,IAAI,WAAW;QACb,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,WAAW,IAAI,IAAI,IAAI,OAAO,WAAW,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACxE,OAAO,eAAe,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACH,IAAI,IAAI;QACN,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,qBAAqB,CAAW,CAAC;QAC7E,IAAI,UAAU,KAAK,qBAAqB;YAAE,OAAO,IAAI,CAAC;QACtD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;;OAIG;IACH,IAAI,IAAI;QACN,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK,CAAS,OAAO,CAAC,UAAU,CAAW;YACvD,MAAM,EAAE,IAAI,CAAC,KAAK,CAAS,OAAO,CAAC,WAAW,CAAW;SAC1D,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,OAAO;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACV,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK,CAAS,OAAO,CAAC,SAAS,CAAW;YACtD,MAAM,EAAE,IAAI,CAAC,KAAK,CAAS,OAAO,CAAC,UAAU,CAAW;SACzD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,IAAI,SAAS;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnD,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACH,IAAI,UAAU;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAc,CAAC;QACnE,IAAI,UAAU,IAAI,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACjE,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;;;;OAMG;IACH,IAAI,UAAU;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAc,CAAC;QACvE,IAAI,UAAU,IAAI,IAAI;YAAE,OAAO,CAAC,CAAC;QACjC,OAAO,UAAU,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,gHAAgH;IAChH,aAAa,CAAC,CAAS,EAAE,CAAS;QAChC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAChC,MAAM,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;QAChC,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,GAAG,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvF,MAAM,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC1F,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,KAAa;QAC1B,IAAI,IAAI,CAAC,OAAO,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,KAAK,CAAC,CAAC;QAEpF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAc,CAAC;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAc,CAAC;QAEjE,IAAI,KAAK,IAAI,UAAU,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAEzF,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC5C,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC;YACpC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC;SACxC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,yGAAyG;IACjG,aAAa,CAAC,KAAkB;QACtC,yFAAyF;QACzF,wCAAwC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAW,OAAO,CAAC,UAAU,CAAC,CAAC;QACxD,IAAI,MAAM,IAAI,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAElE,2BAA2B;QAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC5E,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC9B,WAAW,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAClE,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,2CAA2C;IACnC,KAAK,CAAC,QAAQ,CACpB,MAAc,EACd,SAAiB;QAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC;QAClC,IAAI,QAAQ,IAAI,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QACrG,IAAI,SAAS,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEjC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC9D,IAAI,KAAK,CAAC,UAAU,GAAG,SAAS,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,WAAW,SAAS,QAAQ,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;SAC5G;QACD,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,CAAC,IAAI;YAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAClG,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,OAAO,CAAC,CAAS,EAAE,CAAS;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE5B,IAAI,KAAK,IAAI,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACxD,IAAI,QAAQ,IAAI,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QAErG,oCAAoC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAEpD,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,OAAO,OAAO,SAAS,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;SAChG;QAED,MAAM,GAAG,GAAG,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;QAC5B,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;QACrC,IAAI,GAAG,IAAI,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,GAAG,OAAO,UAAU,EAAE,CAAC,CAAC;QAEvG,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1D,4CAA4C;QAE5C,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,OAAO,CAAC,CAAS,EAAE,CAAS;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEvB,IAAI,KAAK,IAAI,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAExD,oCAAoC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO;YAAE,OAAO,KAAK,CAAC;QAC/C,MAAM,GAAG,GAAG,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,0DAA0D;QAC1D,uCAAuC;QACvC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC;QAC1D,IAAI,WAAW,EAAE;YACf,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAClE,2BAA2B;YAC3B,IAAI,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;YAErD,uEAAuE;YACvE,2DAA2D;YAC3D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,WAAW,EAAE,WAAW,CAAC,CAAC;YAC9E,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;SACtG;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAc,CAAC;QACtE,IAAI,UAAU,IAAI,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACrE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC5C,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC;YAC5C,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC;SACxC,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;CACF;AAED,SAAS,SAAS,CAChB,IAAa,EACb,CAA2C,EAC3C,KAAa;IAEb,IAAI,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC;IACrG,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE;QACvB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,CAAW,CAAC;QAC5D,OAAO,CAAC,CAAC,KAAe,CAAC;KAC1B;IACD,OAAO,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC"}
|