@cogeotiff/core 6.0.2 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,39 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [7.0.0](https://github.com/blacha/cogeotiff/compare/v6.1.1...v7.0.0) (2022-03-17)
7
+
8
+
9
+ ### Features
10
+
11
+ * **core:** upgrade chunkd and remove logger for internal fetches ([#832](https://github.com/blacha/cogeotiff/issues/832)) ([71bd740](https://github.com/blacha/cogeotiff/commit/71bd7409706e4a82e6a29b2a3fc0e8b25221e9fc))
12
+
13
+
14
+
15
+
16
+
17
+ ## [6.1.1](https://github.com/blacha/cogeotiff/compare/v6.1.0...v6.1.1) (2022-01-26)
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * **core:** tag data count should be a uint32 for tiff not uint16 ([5e0f66c](https://github.com/blacha/cogeotiff/commit/5e0f66c213db265d83d976424b6a443be6afbe73))
23
+
24
+
25
+
26
+
27
+
28
+ # [6.1.0](https://github.com/blacha/cogeotiff/compare/v6.0.2...v6.1.0) (2021-09-30)
29
+
30
+
31
+ ### Features
32
+
33
+ * **core:** support no compression ([f1f8762](https://github.com/blacha/cogeotiff/commit/f1f8762d6b5a4b2b8eae7f472bd70f0216138be8))
34
+
35
+
36
+
37
+
38
+
6
39
  ## [6.0.2](https://github.com/blacha/cogeotiff/compare/v6.0.1...v6.0.2) (2021-09-16)
7
40
 
8
41
 
@@ -1,4 +1,4 @@
1
- import { ChunkSource, LogType } from '@chunkd/core';
1
+ import { ChunkSource } from '@chunkd/core';
2
2
  import { CogTiffImage } from './cog.tiff.image.js';
3
3
  import { TiffVersion } from './const/tiff.version.js';
4
4
  import { CogTifGhostOptions } from './read/tiff.gdal.js';
@@ -21,7 +21,7 @@ export declare class CogTiff {
21
21
  *
22
22
  * @param loadGeoKeys Whether to also initialize the GeoKeyDirectory
23
23
  */
24
- init(loadGeoKeys?: boolean, logger?: LogType): Promise<CogTiff>;
24
+ init(loadGeoKeys?: boolean): Promise<CogTiff>;
25
25
  private doInit;
26
26
  private fetchIfd;
27
27
  getImage(z: number): CogTiffImage;
@@ -1 +1 @@
1
- {"version":3,"file":"cog.tiff.d.ts","sourceRoot":"","sources":["../src/cog.tiff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAmC,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAK3F,qBAAa,OAAO;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,cAAoB;IAC3B,MAAM,EAAE,YAAY,EAAE,CAAM;IAC5B,OAAO,qBAA4B;IAEnC,OAAO,CAAC,MAAM,CAAkB;IAChC,SAAS,EAAE,aAAa,CAAiB;gBAE7B,MAAM,EAAE,WAAW;IAK/B,sCAAsC;IACtC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpD,6BAA6B;IAC7B,aAAa,UAAS;IAEtB,YAAY,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC;;;;OAIG;IACH,IAAI,CAAC,WAAW,UAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAM/C,MAAM;YAWN,QAAQ;IAkCtB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY;IAIjC;;;;OAIG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY;IAoBtD;;;;;;;;OAQG;IACG,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;YAQ7F,UAAU;YA0BV,OAAO;IAgDrB,gDAAgD;IAC1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
1
+ {"version":3,"file":"cog.tiff.d.ts","sourceRoot":"","sources":["../src/cog.tiff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAmC,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAK3F,qBAAa,OAAO;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,cAAoB;IAC3B,MAAM,EAAE,YAAY,EAAE,CAAM;IAC5B,OAAO,qBAA4B;IAEnC,OAAO,CAAC,MAAM,CAAkB;IAChC,SAAS,EAAE,aAAa,CAAiB;gBAE7B,MAAM,EAAE,WAAW;IAK/B,sCAAsC;IACtC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpD,6BAA6B;IAC7B,aAAa,UAAS;IAEtB,YAAY,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC;;;;OAIG;IACH,IAAI,CAAC,WAAW,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;YAM7B,MAAM;YAWN,QAAQ;IAkCtB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY;IAIjC;;;;OAIG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY;IAoBtD;;;;;;;;OAQG;IACG,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;YAQ7F,UAAU;YASV,OAAO;IAqBrB,gDAAgD;IAC1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
@@ -1,4 +1,3 @@
1
- import { LogType } from '@chunkd/core';
2
1
  import { CogTiff } from './cog.tiff.js';
3
2
  import { TiffMimeType } from './const/tiff.mime.js';
4
3
  import { TiffTag, TiffTagGeo } from './const/tiff.tag.id.js';
@@ -41,7 +40,7 @@ export declare class CogTiffImage {
41
40
  *
42
41
  * @param loadGeoTags Whether to load the GeoKeyDirectory and unpack it
43
42
  */
44
- init(loadGeoTags?: boolean, l?: LogType): Promise<void>;
43
+ init(loadGeoTags?: boolean): Promise<void>;
45
44
  /**
46
45
  * Get the value of a TiffTag if it exists null otherwise
47
46
  */
@@ -49,7 +48,7 @@ export declare class CogTiffImage {
49
48
  /**
50
49
  * Load and unpack the GeoKeyDirectory
51
50
  */
52
- loadGeoTiffTags(l: LogType): Promise<void>;
51
+ loadGeoTiffTags(): Promise<void>;
53
52
  /**
54
53
  * Get the associated GeoTiffTags
55
54
  */
@@ -58,7 +57,7 @@ export declare class CogTiffImage {
58
57
  * Load a tag, if it is not currently loaded, fetch the required data for the tag.
59
58
  * @param tag tag to fetch
60
59
  */
61
- fetch<T>(tag: TiffTag, l: LogType): Promise<T | null>;
60
+ fetch<T>(tag: TiffTag): Promise<T | null>;
62
61
  /**
63
62
  * Get the origin point for the image
64
63
  *
@@ -137,7 +136,7 @@ export declare class CogTiffImage {
137
136
  * @param index tile index
138
137
  * @returns file offset of the specified tile
139
138
  */
140
- protected getTileOffset(index: number, l?: LogType): Promise<number>;
139
+ protected getTileOffset(index: number): Promise<number>;
141
140
  getTileBounds(x: number, y: number): BoundingBox;
142
141
  /**
143
142
  * Read a strip into a uint8 array
@@ -160,11 +159,11 @@ export declare class CogTiffImage {
160
159
  * @param x Tile x offset
161
160
  * @param y Tile y offset
162
161
  */
163
- getTile(x: number, y: number, l?: LogType): Promise<{
162
+ getTile(x: number, y: number): Promise<{
164
163
  mimeType: TiffMimeType;
165
164
  bytes: Uint8Array;
166
165
  } | null>;
167
- protected getTileSize(index: number, l?: LogType): Promise<{
166
+ protected getTileSize(index: number): Promise<{
168
167
  offset: number;
169
168
  imageSize: number;
170
169
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"cog.tiff.image.d.ts","sourceRoot":"","sources":["../src/cog.tiff.image.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cog.tiff.image.d.ts","sourceRoot":"","sources":["../src/cog.tiff.image.ts"],"names":[],"mappings":"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"}
@@ -19,25 +19,25 @@ export class CogTiffImage {
19
19
  *
20
20
  * @param loadGeoTags Whether to load the GeoKeyDirectory and unpack it
21
21
  */
22
- async init(loadGeoTags = false, l = null) {
22
+ async init(loadGeoTags = false) {
23
23
  const requiredTags = [
24
- this.fetch(TiffTag.Compression, l),
25
- this.fetch(TiffTag.ImageHeight, l),
26
- this.fetch(TiffTag.ImageWidth, l),
27
- this.fetch(TiffTag.ModelPixelScale, l),
28
- this.fetch(TiffTag.ModelTiePoint, l),
29
- this.fetch(TiffTag.ModelTransformation, l),
30
- this.fetch(TiffTag.TileHeight, l),
31
- this.fetch(TiffTag.TileWidth, l),
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),
32
32
  ];
33
33
  if (loadGeoTags) {
34
- requiredTags.push(this.fetch(TiffTag.GeoKeyDirectory, l));
35
- requiredTags.push(this.fetch(TiffTag.GeoAsciiParams, l));
36
- requiredTags.push(this.fetch(TiffTag.GeoDoubleParams, l));
34
+ requiredTags.push(this.fetch(TiffTag.GeoKeyDirectory));
35
+ requiredTags.push(this.fetch(TiffTag.GeoAsciiParams));
36
+ requiredTags.push(this.fetch(TiffTag.GeoDoubleParams));
37
37
  }
38
38
  await Promise.all(requiredTags);
39
39
  if (loadGeoTags) {
40
- await this.loadGeoTiffTags(l);
40
+ await this.loadGeoTiffTags();
41
41
  }
42
42
  }
43
43
  /**
@@ -52,7 +52,7 @@ export class CogTiffImage {
52
52
  /**
53
53
  * Load and unpack the GeoKeyDirectory
54
54
  */
55
- async loadGeoTiffTags(l) {
55
+ async loadGeoTiffTags() {
56
56
  // Already loaded
57
57
  if (this.tagsGeoLoaded)
58
58
  return;
@@ -64,9 +64,9 @@ export class CogTiffImage {
64
64
  if (!sourceTag.isReady && sourceTag instanceof CogTiffTagLazy) {
65
65
  // Load all the required keys
66
66
  await Promise.all([
67
- this.fetch(TiffTag.GeoKeyDirectory, l),
68
- this.fetch(TiffTag.GeoAsciiParams, l),
69
- this.fetch(TiffTag.GeoDoubleParams, l),
67
+ this.fetch(TiffTag.GeoKeyDirectory),
68
+ this.fetch(TiffTag.GeoAsciiParams),
69
+ this.fetch(TiffTag.GeoDoubleParams),
70
70
  ]);
71
71
  }
72
72
  this.tagsGeoLoaded = true;
@@ -107,12 +107,12 @@ export class CogTiffImage {
107
107
  * Load a tag, if it is not currently loaded, fetch the required data for the tag.
108
108
  * @param tag tag to fetch
109
109
  */
110
- async fetch(tag, l) {
110
+ async fetch(tag) {
111
111
  const sourceTag = this.tags.get(tag);
112
112
  if (sourceTag == null)
113
113
  return null;
114
114
  if (CogTiffTag.isLazy(sourceTag))
115
- return sourceTag.fetch(l);
115
+ return sourceTag.fetch();
116
116
  return sourceTag.value;
117
117
  }
118
118
  /**
@@ -287,13 +287,13 @@ export class CogTiffImage {
287
287
  * @param index tile index
288
288
  * @returns file offset of the specified tile
289
289
  */
290
- async getTileOffset(index, l) {
290
+ async getTileOffset(index) {
291
291
  const tileOffset = this.tileOffset;
292
292
  if (index < 0 || index > tileOffset.dataCount) {
293
293
  throw new Error(`Tile offset: ${index} out of range: 0 -> ${tileOffset.dataCount}`);
294
294
  }
295
295
  // Fetch only the part of the offsets that are needed
296
- return tileOffset.getValueAt(index, l);
296
+ return tileOffset.getValueAt(index);
297
297
  }
298
298
  // Clamp the bounds of the output image to the size of the image, as sometimes the edge tiles are not full tiles
299
299
  getTileBounds(x, y) {
@@ -334,13 +334,13 @@ export class CogTiffImage {
334
334
  return actualBytes;
335
335
  }
336
336
  /** Read image bytes at the given offset */
337
- async getBytes(offset, byteCount, l) {
337
+ async getBytes(offset, byteCount) {
338
338
  const mimeType = this.compression;
339
339
  if (mimeType == null)
340
340
  throw new Error('Unsupported compression: ' + this.value(TiffTag.Compression));
341
341
  if (byteCount === 0)
342
342
  return null;
343
- await this.tif.source.loadBytes(offset, byteCount, l);
343
+ await this.tif.source.loadBytes(offset, byteCount);
344
344
  const bytes = this.tif.source.bytes(offset, byteCount);
345
345
  if (this.compression === TiffMimeType.JPEG) {
346
346
  return { mimeType, bytes: this.getJpegHeader(bytes) };
@@ -355,7 +355,7 @@ export class CogTiffImage {
355
355
  * @param x Tile x offset
356
356
  * @param y Tile y offset
357
357
  */
358
- async getTile(x, y, l) {
358
+ async getTile(x, y) {
359
359
  const mimeType = this.compression;
360
360
  const size = this.size;
361
361
  const tiles = this.tileSize;
@@ -373,29 +373,29 @@ export class CogTiffImage {
373
373
  const totalTiles = nxTiles * nyTiles;
374
374
  if (idx >= totalTiles)
375
375
  throw new Error(`Tile index is outside of tile range: ${idx} >= ${totalTiles}`);
376
- const { offset, imageSize } = await this.getTileSize(idx, l);
377
- return this.getBytes(offset, imageSize, l);
376
+ const { offset, imageSize } = await this.getTileSize(idx);
377
+ return this.getBytes(offset, imageSize);
378
378
  }
379
- async getTileSize(index, l) {
379
+ async getTileSize(index) {
380
380
  // GDAL optimizes tiles by storing the size of the tile in
381
381
  // the few bytes leading up to the tile
382
382
  if (this.tif.options.tileLeaderByteSize) {
383
- const offset = await this.getTileOffset(index, l);
383
+ const offset = await this.getTileOffset(index);
384
384
  // Sparse COG no data found
385
385
  if (offset === 0)
386
386
  return { offset: 0, imageSize: 0 };
387
387
  const leaderBytes = this.tif.options.tileLeaderByteSize;
388
388
  // This fetch will generally load in the bytes needed for the image too
389
389
  // provided the image size is less than the size of a chunk
390
- await this.tif.source.loadBytes(offset - leaderBytes, leaderBytes, l);
390
+ await this.tif.source.loadBytes(offset - leaderBytes, leaderBytes);
391
391
  return { offset, imageSize: this.tif.source.getUint(offset - leaderBytes, leaderBytes) };
392
392
  }
393
393
  const byteCounts = this.tags.get(TiffTag.TileByteCounts);
394
394
  if (byteCounts == null) {
395
395
  throw new Error('No tile byte counts found');
396
396
  }
397
- const [offset, imageSize] = await Promise.all([this.getTileOffset(index, l), byteCounts.getValueAt(index, l)]);
397
+ const [offset, imageSize] = await Promise.all([this.getTileOffset(index), byteCounts.getValueAt(index)]);
398
398
  return { offset, imageSize };
399
399
  }
400
400
  }
401
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLnRpZmYuaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29nLnRpZmYuaW1hZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHaEQsd0JBQXdCO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQztBQXNCM0MsTUFBTSxPQUFPLFlBQVk7SUFjckIsWUFBWSxHQUFZLEVBQUUsRUFBVSxFQUFFLElBQWtDO1FBTHhFLHNDQUFzQztRQUM5QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUM5QixpREFBaUQ7UUFDakQsWUFBTyxHQUFxQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBR2xELElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssRUFBRSxJQUFhLElBQVc7UUFDcEQsTUFBTSxZQUFZLEdBQUc7WUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDakMsSUFBSSxD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QUMsQ0FBQyxDQUFDO1lBQ3RFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsV0FBVyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUM7U0FDNUY7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFxQixDQUFDO1FBQzdFLElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7U0FDaEQ7UUFDRCxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ2pDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ1R5cGUgfSBmcm9tICdAY2h1bmtkL2NvcmUnO1xuaW1wb3J0IHsgQ29nVGlmZiB9IGZyb20gJy4vY29nLnRpZmYuanMnO1xuaW1wb3J0IHsgVGlmZkNvbXByZXNzaW9uLCBUaWZmTWltZVR5cGUgfSBmcm9tICcuL2NvbnN0L3RpZmYubWltZS5qcyc7XG5pbXBvcnQgeyBUaWZmVGFnLCBUaWZmVGFnR2VvIH0gZnJvbSAnLi9jb25zdC90aWZmLnRhZy5pZC5qcyc7XG5pbXBvcnQgeyBDb2dUaWZmVGFnQmFzZSB9IGZyb20gJy4vcmVhZC90YWcvdGlmZi50YWcuYmFzZS5qcyc7XG5pbXBvcnQgeyBDb2dUaWZmVGFnTGF6eSB9IGZyb20gJy4vcmVhZC90YWcvdGlmZi50YWcubGF6eS5qcyc7XG5pbXBvcnQgeyBDb2dUaWZmVGFnT2Zmc2V0IH0gZnJvbSAnLi9yZWFkL3RhZy90aWZmLnRhZy5vZmZzZXQuanMnO1xuaW1wb3J0IHsgQ29nVGlmZlRhZyB9IGZyb20gJy4vcmVhZC90aWZmLnRhZy5qcyc7XG5pbXBvcnQgeyBCb3VuZGluZ0JveCwgU2l6ZSB9IGZyb20gJy4vdmVjdG9yLmpzJztcblxuLyoqIEludmFsaWQgRVBTRyBjb2RlICovXG5leHBvcnQgY29uc3QgSW52YWxpZFByb2plY3Rpb25Db2RlID0gMzI3Njc7XG5cbi8qKlxuICogTnVtYmVyIG9mIHRpbGVzIHVzZWQgaW5zaWRlIHRoaXMgaW1hZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2dUaWZmSW1hZ2VUaWxlZENvdW50IHtcbiAgICAvKiogTnVtYmVyIG9mIHRpbGVzIG9uIHRoZSB4IGF4aXMgKi9cbiAgICB4OiBudW1iZXI7XG4gICAgLyoqIE51bWJlciBvZiB0aWxlcyBvbiB0aGUgeSBheGlzICovXG4gICAgeTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFNpemUgb2YgYSBpbmRpdmlkdWFsIHRpbGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2dUaWZmSW1hZ2VUaWxlU2l6ZSB7XG4gICAgLyoqIFRpbGUgd2lkdGggKHBpeGVscykgKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaWxlIGhlaWdodCAocGl4ZWxzKSAqL1xuICAgIGhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgQ29nVGlmZkltYWdlIHtcbiAgICAvKiogQWxsIElGRCB0YWdzIHRoYXQgaGF2ZSBiZWVuIHJlYWQgZm9yIHRoZSBpbWFnZSAqL1xuICAgIHRhZ3M6IE1hcDxUaWZmVGFnLCBDb2dUaWZmVGFnQmFzZT47XG5cbiAgICAvKiogSWQgb2YgdGhlIHRpZiBpbWFnZSwgZ2VuZXJhbGx5IHRoZSBpbWFnZSBpbmRleCBpbnNpZGUgdGhlIHRpZiAqL1xuICAgIGlkOiBudW1iZXI7XG5cbiAgICB0aWY6IENvZ1RpZmY7XG5cbiAgICAvKiogSGFzIGxvYWRHZW9UaWZmVGFncyBiZWVuIGNhbGxlZCAqL1xuICAgIHByaXZhdGUgdGFnc0dlb0xvYWRlZCA9IGZhbHNlO1xuICAgIC8qKiBTdWIgdGFncyBzdG9yZWQgaW4gVGlmZlRhZy5HZW9LZXlEaXJlY3RvcnkgKi9cbiAgICB0YWdzR2VvOiBNYXA8VGlmZlRhZ0dlbywgc3RyaW5nIHwgbnVtYmVyPiA9IG5ldyBNYXAoKTtcblxuICAgIGNvbnN0cnVjdG9yKHRpZjogQ29nVGlmZiwgaWQ6IG51bWJlciwgdGFnczogTWFwPFRpZmZUYWcsIENvZ1RpZmZUYWdCYXNlPikge1xuICAgICAgICB0aGlzLnRpZiA9IHRpZjtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnRhZ3MgPSB0YWdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcmNlIGxvYWRpbmcgb2YgaW1wb3J0YW50IHRhZ3MgaWYgdGhleSBoYXZlIG5vdCBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbG9hZEdlb1RhZ3MgV2hldGhlciB0byBsb2FkIHRoZSBHZW9LZXlEaXJlY3RvcnkgYW5kIHVucGFjayBpdFxuICAgICAqL1xuICAgIGFzeW5jIGluaXQobG9hZEdlb1RhZ3MgPSBmYWxzZSwgbDogTG9nVHlwZSA9IG51bGwgYXMgYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkVGFncyA9IFtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5Db21wcmVzc2lvbiwgbCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuSW1hZ2VIZWlnaHQsIGwpLFxuICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLkltYWdlV2lkdGgsIGwpLFxuICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLk1vZGVsUGl4ZWxTY2FsZSwgbCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuTW9kZWxUaWVQb2ludCwgbCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuTW9kZWxUcmFuc2Zvcm1hdGlvbiwgbCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuVGlsZUhlaWdodCwgbCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuVGlsZVdpZHRoLCBsKSxcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAobG9hZEdlb1RhZ3MpIHtcbiAgICAgICAgICAgIHJlcXVpcmVkVGFncy5wdXNoKHRoaXMuZmV0Y2goVGlmZlRhZy5HZW9LZXlEaXJlY3RvcnksIGwpKTtcbiAgICAgICAgICAgIHJlcXVpcmVkVGFncy5wdXNoKHRoaXMuZmV0Y2goVGlmZlRhZy5HZW9Bc2NpaVBhcmFtcywgbCkpO1xuICAgICAgICAgICAgcmVxdWlyZWRUYWdzLnB1c2godGhpcy5mZXRjaChUaWZmVGFnLkdlb0RvdWJsZVBhcmFtcywgbCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocmVxdWlyZWRUYWdzKTtcbiAgICAgICAgaWYgKGxvYWRHZW9UYWdzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRHZW9UaWZmVGFncyhsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgb2YgYSBUaWZmVGFnIGlmIGl0IGV4aXN0cyBudWxsIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHZhbHVlPFQ+KHRhZzogVGlmZlRhZyk6IFQgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgc291cmNlVGFnID0gdGhpcy50YWdzLmdldCh0YWcpO1xuICAgICAgICBpZiAoc291cmNlVGFnID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gc291cmNlVGFnLnZhbHVlIGFzIFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhbmQgdW5wYWNrIHRoZSBHZW9LZXlEaXJlY3RvcnlcbiAgICAgKi9cbiAgICBhc3luYyBsb2FkR2VvVGlmZlRhZ3MobDogTG9nVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBBbHJlYWR5IGxvYWRlZFxuICAgICAgICBpZiAodGhpcy50YWdzR2VvTG9hZGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNvdXJjZVRhZyA9IHRoaXMudGFncy5nZXQoVGlmZlRhZy5HZW9LZXlEaXJlY3RvcnkpO1xuICAgICAgICBpZiAoc291cmNlVGFnID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudGFnc0dlb0xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzb3VyY2VUYWcuaXNSZWFkeSAmJiBzb3VyY2VUYWcgaW5zdGFuY2VvZiBDb2dUaWZmVGFnTGF6eSkge1xuICAgICAgICAgICAgLy8gTG9hZCBhbGwgdGhlIHJlcXVpcmVkIGtleXNcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuR2VvS2V5RGlyZWN0b3J5LCBsKSxcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuR2VvQXNjaWlQYXJhbXMsIGwpLFxuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5HZW9Eb3VibGVQYXJhbXMsIGwpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWdzR2VvTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHNvdXJjZVRhZy52YWx1ZSA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdlb1RhZ3MgPSBzb3VyY2VUYWcudmFsdWU7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShnZW9UYWdzKSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdlbyB0YWdzIGZvdW5kJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSA0OyBpIDw9IGdlb1RhZ3NbM10gKiA0OyBpICs9IDQpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGdlb1RhZ3NbaV0gYXMgVGlmZlRhZ0dlbztcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gZ2VvVGFnc1tpICsgMV07XG5cbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGdlb1RhZ3NbaSArIDNdO1xuXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ3NHZW8uc2V0KGtleSwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHRoaXMudGFncy5nZXQobG9jYXRpb24pO1xuICAgICAgICAgICAgaWYgKHRhZyA9PSBudWxsIHx8IHRhZy52YWx1ZSA9PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gZ2VvVGFnc1tpICsgMl07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YWcudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzR2VvLnNldChrZXksIHRhZy52YWx1ZVtvZmZzZXQgKyBjb3VudCAtIDFdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRhZy52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ3NHZW8uc2V0KGtleSwgdGFnLnZhbHVlLnN1YnN0cihvZmZzZXQsIG9mZnNldCArIGNvdW50IC0gMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYXNzb2NpYXRlZCBHZW9UaWZmVGFnc1xuICAgICAqL1xuICAgIHZhbHVlR2VvKHRhZzogVGlmZlRhZ0dlbyk6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLnRhZ3NHZW9Mb2FkZWQgPT09IGZhbHNlKSB0aHJvdyBuZXcgRXJyb3IoJ2xvYWRHZW9UaWZmVGFncygpIGhhcyBub3QgYmVlbiBjYWxsZWQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFnc0dlby5nZXQodGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgdGFnLCBpZiBpdCBpcyBub3QgY3VycmVudGx5IGxvYWRlZCwgZmV0Y2ggdGhlIHJlcXVpcmVkIGRhdGEgZm9yIHRoZSB0YWcuXG4gICAgICogQHBhcmFtIHRhZyB0YWcgdG8gZmV0Y2hcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZmV0Y2g8VD4odGFnOiBUaWZmVGFnLCBsOiBMb2dUeXBlKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBzb3VyY2VUYWcgPSB0aGlzLnRhZ3MuZ2V0KHRhZyk7XG4gICAgICAgIGlmIChzb3VyY2VUYWcgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChDb2dUaWZmVGFnLmlzTGF6eShzb3VyY2VUYWcpKSByZXR1cm4gc291cmNlVGFnLmZldGNoKGwpIGFzIGFueTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVRhZy52YWx1ZSBhcyBUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgb3JpZ2luIHBvaW50IGZvciB0aGUgaW1hZ2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIG9yaWdpbiBwb2ludCBvZiB0aGUgaW1hZ2VcbiAgICAgKi9cbiAgICBnZXQgb3JpZ2luKCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IHRpZVBvaW50czogbnVtYmVyW10gfCBudWxsID0gdGhpcy52YWx1ZTxudW1iZXJbXT4oVGlmZlRhZy5Nb2RlbFRpZVBvaW50KTtcbiAgICAgICAgaWYgKHRpZVBvaW50cyAhPSBudWxsICYmIHRpZVBvaW50cy5sZW5ndGggPT09IDYpIHtcbiAgICAgICAgICAgIHJldHVybiBbdGllUG9pbnRzWzNdLCB0aWVQb2ludHNbNF0sIHRpZVBvaW50c1s1XV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb2RlbFRyYW5zZm9ybWF0aW9uID0gdGhpcy52YWx1ZTxudW1iZXJbXT4oVGlmZlRhZy5Nb2RlbFRyYW5zZm9ybWF0aW9uKTtcbiAgICAgICAgaWYgKG1vZGVsVHJhbnNmb3JtYXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFttb2RlbFRyYW5zZm9ybWF0aW9uWzNdLCBtb2RlbFRyYW5zZm9ybWF0aW9uWzddLCBtb2RlbFRyYW5zZm9ybWF0aW9uWzExXV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3ViIGltYWdlLCB1c2UgdGhlIG9yaWdpbiBmcm9tIHRoZSB0b3AgbGV2ZWwgaW1hZ2VcbiAgICAgICAgaWYgKHRoaXMudmFsdWUoVGlmZlRhZy5OZXdTdWJGaWxlVHlwZSkgPT09IDEgJiYgdGhpcy5pZCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGlmLmltYWdlc1swXS5vcmlnaW47XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltYWdlIGRvZXMgbm90IGhhdmUgYSBnZW8gdHJhbnNmb3JtYXRpb24uJyk7XG4gICAgfVxuXG4gICAgLyoqIElzIHRoZXJlIGVub3VnaCBnZW8gaW5mb3JtYXRpb24gb24gdGhpcyBpbWFnZSB0byBmaWd1cmUgb3V0IHdoZXJlIGl0cyBhY3R1YWxseSBsb2NhdGVkICovXG4gICAgZ2V0IGlzR2VvTG9jYXRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXNJbWFnZUxvY2F0ZWQgPVxuICAgICAgICAgICAgdGhpcy52YWx1ZShUaWZmVGFnLk1vZGVsUGl4ZWxTY2FsZSkgIT0gbnVsbCB8fCB0aGlzLnZhbHVlKFRpZmZUYWcuTW9kZWxUcmFuc2Zvcm1hdGlvbikgIT0gbnVsbDtcbiAgICAgICAgaWYgKGlzSW1hZ2VMb2NhdGVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN1YiBpbWFnZSwgdXNlIHRoZSBpc0dlb0xvY2F0ZWQgZnJvbSB0aGUgdG9wIGxldmVsIGltYWdlXG4gICAgICAgIGlmICh0aGlzLnZhbHVlKFRpZmZUYWcuTmV3U3ViRmlsZVR5cGUpID09PSAxICYmIHRoaXMuaWQgIT09IDApIHJldHVybiB0aGlzLnRpZi5pbWFnZXNbMF0uaXNHZW9Mb2NhdGVkO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByZXNvbHV0aW9uIG9mIHRoZSBpbWFnZVxuICAgICAqXG4gICAgICogQHJldHVybnMgW3gseSx6XSBwaXhlbCBzY2FsZVxuICAgICAqL1xuICAgIGdldCByZXNvbHV0aW9uKCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IG1vZGVsUGl4ZWxTY2FsZTogbnVtYmVyW10gfCBudWxsID0gdGhpcy52YWx1ZShUaWZmVGFnLk1vZGVsUGl4ZWxTY2FsZSk7XG4gICAgICAgIGlmIChtb2RlbFBpeGVsU2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFttb2RlbFBpeGVsU2NhbGVbMF0sIC1tb2RlbFBpeGVsU2NhbGVbMV0sIG1vZGVsUGl4ZWxTY2FsZVsyXV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9kZWxUcmFuc2Zvcm1hdGlvbjogbnVtYmVyW10gfCBudWxsID0gdGhpcy52YWx1ZShUaWZmVGFnLk1vZGVsVHJhbnNmb3JtYXRpb24pO1xuICAgICAgICBpZiAobW9kZWxUcmFuc2Zvcm1hdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW21vZGVsVHJhbnNmb3JtYXRpb25bMF0sIG1vZGVsVHJhbnNmb3JtYXRpb25bNV0sIG1vZGVsVHJhbnNmb3JtYXRpb25bMTBdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBzdWIgaW1hZ2UsIHVzZSB0aGUgcmVzb2x1dGlvbiBmcm9tIHRoZSB0b3AgbGV2ZWwgaW1hZ2VcbiAgICAgICAgaWYgKHRoaXMudmFsdWUoVGlmZlRhZy5OZXdTdWJGaWxlVHlwZSkgPT09IDEgJiYgdGhpcy5pZCAhPT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RJbWcgPSB0aGlzLnRpZi5pbWFnZXNbMF07XG4gICAgICAgICAgICBjb25zdCBbcmVzWCwgcmVzWSwgcmVzWl0gPSBmaXJzdEltZy5yZXNvbHV0aW9uO1xuICAgICAgICAgICAgY29uc3QgZmlyc3RJbWdTaXplID0gZmlyc3RJbWcuc2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IGltZ1NpemUgPSB0aGlzLnNpemU7XG4gICAgICAgICAgICAvLyBzY2FsZSByZXNvbHV0aW9uIGJhc2VkIG9uIHRoZSBzaXplIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGltYWdlc1xuICAgICAgICAgICAgcmV0dXJuIFsocmVzWCAqIGZpcnN0SW1nU2l6ZS53aWR0aCkgLyBpbWdTaXplLndpZHRoLCAocmVzWSAqIGZpcnN0SW1nU2l6ZS5oZWlnaHQpIC8gaW1nU2l6ZS5oZWlnaHQsIHJlc1pdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbWFnZSBkb2VzIG5vdCBoYXZlIGEgZ2VvIHRyYW5zZm9ybWF0aW9uLicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJvdW5kaW5nIGJveCBvZiB0aGUgaW1hZ2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSBib3VuZGluZyBib3hcbiAgICAgKi9cbiAgICBnZXQgYmJveCgpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMub3JpZ2luO1xuICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gdGhpcy5yZXNvbHV0aW9uO1xuXG4gICAgICAgIGlmIChvcmlnaW4gPT0gbnVsbCB8fCBzaXplID09IG51bGwgfHwgcmVzb2x1dGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBjYWxjdWxhdGUgYm91bmRpbmcgYm94Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB4MSA9IG9yaWdpblswXTtcbiAgICAgICAgY29uc3QgeTEgPSBvcmlnaW5bMV07XG5cbiAgICAgICAgY29uc3QgeDIgPSB4MSArIHJlc29sdXRpb25bMF0gKiBzaXplLndpZHRoO1xuICAgICAgICBjb25zdCB5MiA9IHkxICsgcmVzb2x1dGlvblsxXSAqIHNpemUuaGVpZ2h0O1xuXG4gICAgICAgIHJldHVybiBbTWF0aC5taW4oeDEsIHgyKSwgTWF0aC5taW4oeTEsIHkyKSwgTWF0aC5tYXgoeDEsIHgyKSwgTWF0aC5tYXgoeTEsIHkyKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjb21wcmVzc2lvbiB1c2VkIGJ5IHRoZSB0aWxlXG4gICAgICpcbiAgICAgKiBAc2VlIFRpZmZDb21wcmVzc2lvblxuICAgICAqXG4gICAgICogQHJldHVybnMgQ29tcHJlc3Npb24gdHlwZSBlZyB3ZWJwXG4gICAgICovXG4gICAgZ2V0IGNvbXByZXNzaW9uKCk6IFRpZmZNaW1lVHlwZSB8IG51bGwge1xuICAgICAgICBjb25zdCBjb21wcmVzc2lvbiA9IHRoaXMudmFsdWUoVGlmZlRhZy5Db21wcmVzc2lvbik7XG4gICAgICAgIGlmIChjb21wcmVzc2lvbiA9PSBudWxsIHx8IHR5cGVvZiBjb21wcmVzc2lvbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWZmQ29tcHJlc3Npb25bY29tcHJlc3Npb25dO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGVtcHQgdG8gcmVhZCB0aGUgRVBTRyBDb2RlIGZyb20gVGlmZkdlb1RhZ3NcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEVQU0cgQ29kZSBpZiBpdCBleGlzdHNcbiAgICAgKi9cbiAgICBnZXQgZXBzZygpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbiA9IHRoaXMudmFsdWVHZW8oVGlmZlRhZ0dlby5Qcm9qZWN0ZWRDU1R5cGVHZW9LZXkpIGFzIG51bWJlcjtcbiAgICAgICAgaWYgKHByb2plY3Rpb24gPT09IEludmFsaWRQcm9qZWN0aW9uQ29kZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBwcm9qZWN0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNpemUgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgZ2V0IHNpemUoKTogU2l6ZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3aWR0aDogdGhpcy52YWx1ZTxudW1iZXI+KFRpZmZUYWcuSW1hZ2VXaWR0aCkhLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnZhbHVlPG51bWJlcj4oVGlmZlRhZy5JbWFnZUhlaWdodCkhLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbGlzdCBvZiBJRkQgdGFncyB0aGF0IHdlcmUgcmVhZFxuICAgICAqL1xuICAgIGdldCB0YWdMaXN0KCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLnRhZ3Mua2V5cygpXS5tYXAoKGMpID0+IFRpZmZUYWdbY10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZSBpZiB0aGlzIGltYWdlIGlzIHRpbGVkXG4gICAgICovXG4gICAgcHVibGljIGlzVGlsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlKFRpZmZUYWcuVGlsZVdpZHRoKSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc2l6ZSBvZiBpbmRpdmlkdWFsIHRpbGVzXG4gICAgICovXG4gICAgZ2V0IHRpbGVTaXplKCk6IENvZ1RpZmZJbWFnZVRpbGVTaXplIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnZhbHVlPG51bWJlcj4oVGlmZlRhZy5UaWxlV2lkdGgpISxcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy52YWx1ZTxudW1iZXI+KFRpZmZUYWcuVGlsZUhlaWdodCkhLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiB0aWxlcyB1c2VkIHRvIGNyZWF0ZSB0aGlzIGltYWdlXG4gICAgICovXG4gICAgZ2V0IHRpbGVDb3VudCgpOiBDb2dUaWZmSW1hZ2VUaWxlZENvdW50IHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgICAgY29uc3QgdGlsZVNpemUgPSB0aGlzLnRpbGVTaXplO1xuICAgICAgICBjb25zdCB4ID0gTWF0aC5jZWlsKHNpemUud2lkdGggLyB0aWxlU2l6ZS53aWR0aCk7XG4gICAgICAgIGNvbnN0IHkgPSBNYXRoLmNlaWwoc2l6ZS5oZWlnaHQgLyB0aWxlU2l6ZS5oZWlnaHQpO1xuICAgICAgICByZXR1cm4geyB4LCB5IH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwb2ludGVyIHRvIHdoZXJlIHRoZSB0aWxlcyBzdGFydCBpbiB0aGUgVGlmZiBmaWxlXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBVc2VkIHRvIHJlYWQgdGlsZWQgdGlmZnNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGZpbGUgb2Zmc2V0IHRvIHdoZXJlIHRoZSB0aWZmcyBhcmUgc3RvcmVkXG4gICAgICovXG4gICAgZ2V0IHRpbGVPZmZzZXQoKTogQ29nVGlmZlRhZ09mZnNldCB7XG4gICAgICAgIGNvbnN0IHRpbGVPZmZzZXQgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuVGlsZU9mZnNldHMpIGFzIENvZ1RpZmZUYWdPZmZzZXQ7XG4gICAgICAgIGlmICh0aWxlT2Zmc2V0ID09IG51bGwpIHRocm93IG5ldyBFcnJvcignTm8gdGlsZSBvZmZzZXRzIGZvdW5kJyk7XG4gICAgICAgIHJldHVybiB0aWxlT2Zmc2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHN0cmlwJ3MgaW5zaWRlIHRoaXMgdGlmZlxuICAgICAqXG4gICAgICogQHJlbWFya3MgVXNlZCB0byByZWFkIHN0cmlwZWQgdGlmZnNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIG51bWJlciBvZiBzdHJpcHMgcHJlc2VudFxuICAgICAqL1xuICAgIGdldCBzdHJpcENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRpbGVPZmZzZXQgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuU3RyaXBCeXRlQ291bnRzKSBhcyBDb2dUaWZmVGFnT2Zmc2V0O1xuICAgICAgICBpZiAodGlsZU9mZnNldCA9PSBudWxsKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHRpbGVPZmZzZXQuZGF0YUNvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHBvaW50ZXIgdG8gYSBzcGVjaWZpYyB0aWxlIGluc2lkZSB0aGUgdGlmZiBmaWxlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXggdGlsZSBpbmRleFxuICAgICAqIEByZXR1cm5zIGZpbGUgb2Zmc2V0IG9mIHRoZSBzcGVjaWZpZWQgdGlsZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3luYyBnZXRUaWxlT2Zmc2V0KGluZGV4OiBudW1iZXIsIGw/OiBMb2dUeXBlKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3QgdGlsZU9mZnNldCA9IHRoaXMudGlsZU9mZnNldDtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IHRpbGVPZmZzZXQuZGF0YUNvdW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbGUgb2Zmc2V0OiAke2luZGV4fSBvdXQgb2YgcmFuZ2U6IDAgLT4gJHt0aWxlT2Zmc2V0LmRhdGFDb3VudH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZldGNoIG9ubHkgdGhlIHBhcnQgb2YgdGhlIG9mZnNldHMgdGhhdCBhcmUgbmVlZGVkXG4gICAgICAgIHJldHVybiB0aWxlT2Zmc2V0LmdldFZhbHVlQXQoaW5kZXgsIGwpO1xuICAgIH1cblxuICAgIC8vIENsYW1wIHRoZSBib3VuZHMgb2YgdGhlIG91dHB1dCBpbWFnZSB0byB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UsIGFzIHNvbWV0aW1lcyB0aGUgZWRnZSB0aWxlcyBhcmUgbm90IGZ1bGwgdGlsZXNcbiAgICBnZXRUaWxlQm91bmRzKHg6IG51bWJlciwgeTogbnVtYmVyKTogQm91bmRpbmdCb3gge1xuICAgICAgICBjb25zdCB7IHNpemUsIHRpbGVTaXplIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB0b3AgPSB5ICogdGlsZVNpemUuaGVpZ2h0O1xuICAgICAgICBjb25zdCBsZWZ0ID0geCAqIHRpbGVTaXplLndpZHRoO1xuICAgICAgICBjb25zdCB3aWR0aCA9IGxlZnQgKyB0aWxlU2l6ZS53aWR0aCA+PSBzaXplLndpZHRoID8gc2l6ZS53aWR0aCAtIGxlZnQgOiB0aWxlU2l6ZS53aWR0aDtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdG9wICsgdGlsZVNpemUuaGVpZ2h0ID49IHNpemUuaGVpZ2h0ID8gc2l6ZS5oZWlnaHQgLSB0b3AgOiB0aWxlU2l6ZS5oZWlnaHQ7XG4gICAgICAgIHJldHVybiB7IHg6IGxlZnQsIHk6IHRvcCwgd2lkdGgsIGhlaWdodCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBzdHJpcCBpbnRvIGEgdWludDggYXJyYXlcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCBTdHJpcCBpbmRleCB0byByZWFkXG4gICAgICovXG4gICAgYXN5bmMgZ2V0U3RyaXAoaW5kZXg6IG51bWJlcik6IFByb21pc2U8eyBtaW1lVHlwZTogVGlmZk1pbWVUeXBlOyBieXRlczogVWludDhBcnJheSB9IHwgbnVsbD4ge1xuICAgICAgICBpZiAodGhpcy5pc1RpbGVkKCkpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlYWQgc3RyaXBlcywgdGlmZiBpcyB0aWxlZCcpO1xuXG4gICAgICAgIGNvbnN0IGJ5dGVDb3VudHMgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuU3RyaXBCeXRlQ291bnRzKSBhcyBDb2dUaWZmVGFnT2Zmc2V0O1xuICAgICAgICBjb25zdCBvZmZzZXRzID0gdGhpcy50YWdzLmdldChUaWZmVGFnLlN0cmlwT2Zmc2V0cykgYXMgQ29nVGlmZlRhZ09mZnNldDtcblxuICAgICAgICBpZiAoaW5kZXggPj0gYnl0ZUNvdW50cy5kYXRhQ291bnQpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlYWQgc3RyaXAsIGluZGV4IG91dCBvZiBib3VuZHMnKTtcblxuICAgICAgICBjb25zdCBbYnl0ZUNvdW50LCBvZmZzZXRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW29mZnNldHMuZ2V0VmFsdWVBdChpbmRleCksIGJ5dGVDb3VudHMuZ2V0VmFsdWVBdChpbmRleCldKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Qnl0ZXMoYnl0ZUNvdW50LCBvZmZzZXQpO1xuICAgIH1cblxuICAgIC8qKiBUaGUganBlZyBoZWFkZXIgaXMgc3RvcmVkIGluIHRoZSBJRkQsIHJlYWQgdGhlIEpQRUcgaGVhZGVyIGFuZCBhZGp1c3QgdGhlIGJ5dGUgYXJyYXkgdG8gaW5jbHVkZSBpdCAqL1xuICAgIHByaXZhdGUgZ2V0SnBlZ0hlYWRlcihieXRlczogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAgICAgICAvLyBCb3RoIHRoZSBKUEVHVGFibGUgYW5kIHRoZSBCeXRlcyB3aXRoIGhhdmUgdGhlIHN0YXJ0IG9mIGltYWdlIGFuZCBlbmQgb2YgaW1hZ2UgbWFya2Vyc1xuICAgICAgICAvLyBTdGFydE9mSW1hZ2UgMHhmZmQ4IEVuZE9mSW1hZ2UgMHhmZmQ5XG4gICAgICAgIGNvbnN0IHRhYmxlcyA9IHRoaXMudmFsdWU8bnVtYmVyW10+KFRpZmZUYWcuSlBFR1RhYmxlcyk7XG4gICAgICAgIGlmICh0YWJsZXMgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBKcGVnIGhlYWRlcicpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBFbmRPZkltYWdlIG1hcmtlclxuICAgICAgICBjb25zdCB0YWJsZURhdGEgPSB0YWJsZXMuc2xpY2UoMCwgdGFibGVzLmxlbmd0aCAtIDIpO1xuICAgICAgICBjb25zdCBhY3R1YWxCeXRlcyA9IG5ldyBVaW50OEFycmF5KGJ5dGVzLmJ5dGVMZW5ndGggKyB0YWJsZURhdGEubGVuZ3RoIC0gMik7XG4gICAgICAgIGFjdHVhbEJ5dGVzLnNldCh0YWJsZURhdGEsIDApO1xuICAgICAgICBhY3R1YWxCeXRlcy5zZXQoYnl0ZXMuc2xpY2UoMiksIHRhYmxlRGF0YS5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gYWN0dWFsQnl0ZXM7XG4gICAgfVxuXG4gICAgLyoqIFJlYWQgaW1hZ2UgYnl0ZXMgYXQgdGhlIGdpdmVuIG9mZnNldCAqL1xuICAgIHByaXZhdGUgYXN5bmMgZ2V0Qnl0ZXMoXG4gICAgICAgIG9mZnNldDogbnVtYmVyLFxuICAgICAgICBieXRlQ291bnQ6IG51bWJlcixcbiAgICAgICAgbD86IExvZ1R5cGUsXG4gICAgKTogUHJvbWlzZTx7IG1pbWVUeXBlOiBUaWZmTWltZVR5cGU7IGJ5dGVzOiBVaW50OEFycmF5IH0gfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IG1pbWVUeXBlID0gdGhpcy5jb21wcmVzc2lvbjtcbiAgICAgICAgaWYgKG1pbWVUeXBlID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY29tcHJlc3Npb246ICcgKyB0aGlzLnZhbHVlKFRpZmZUYWcuQ29tcHJlc3Npb24pKTtcbiAgICAgICAgaWYgKGJ5dGVDb3VudCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgYXdhaXQgdGhpcy50aWYuc291cmNlLmxvYWRCeXRlcyhvZmZzZXQsIGJ5dGVDb3VudCwgbCk7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gdGhpcy50aWYuc291cmNlLmJ5dGVzKG9mZnNldCwgYnl0ZUNvdW50KTtcblxuICAgICAgICBpZiAodGhpcy5jb21wcmVzc2lvbiA9PT0gVGlmZk1pbWVUeXBlLkpQRUcpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1pbWVUeXBlLCBieXRlczogdGhpcy5nZXRKcGVnSGVhZGVyKGJ5dGVzKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1pbWVUeXBlLCBieXRlcyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgdGhlIHRpbGUgYnVmZmVyLCB0aGlzIHdvcmtzIGJlc3Qgd2l0aCB3ZWJwXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYWxzbyBhcHBseSB0aGUgSlBFRyBjb21wcmVzc2lvbiB0YWJsZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRpbGUgeCBvZmZzZXRcbiAgICAgKiBAcGFyYW0geSBUaWxlIHkgb2Zmc2V0XG4gICAgICovXG4gICAgYXN5bmMgZ2V0VGlsZSh4OiBudW1iZXIsIHk6IG51bWJlciwgbD86IExvZ1R5cGUpOiBQcm9taXNlPHsgbWltZVR5cGU6IFRpZmZNaW1lVHlwZTsgYnl0ZXM6IFVpbnQ4QXJyYXkgfSB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgbWltZVR5cGUgPSB0aGlzLmNvbXByZXNzaW9uO1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5zaXplO1xuICAgICAgICBjb25zdCB0aWxlcyA9IHRoaXMudGlsZVNpemU7XG5cbiAgICAgICAgaWYgKHRpbGVzID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVGlmZiBpcyBub3QgdGlsZWQnKTtcbiAgICAgICAgaWYgKG1pbWVUeXBlID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY29tcHJlc3Npb246ICcgKyB0aGlzLnZhbHVlKFRpZmZUYWcuQ29tcHJlc3Npb24pKTtcblxuICAgICAgICAvLyBUT0RPIHN1cHBvcnQgR2hvc3RPcHRpb25UaWxlT3JkZXJcbiAgICAgICAgY29uc3QgbnlUaWxlcyA9IE1hdGguY2VpbChzaXplLmhlaWdodCAvIHRpbGVzLmhlaWdodCk7XG4gICAgICAgIGNvbnN0IG54VGlsZXMgPSBNYXRoLmNlaWwoc2l6ZS53aWR0aCAvIHRpbGVzLndpZHRoKTtcblxuICAgICAgICBpZiAoeCA+PSBueFRpbGVzIHx8IHkgPj0gbnlUaWxlcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaWxlIGluZGV4IGlzIG91dHNpZGUgb2YgcmFuZ2UgeDoke3h9ID49ICR7bnhUaWxlc30gb3IgeToke3l9ID49ICR7bnlUaWxlc31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlkeCA9IHkgKiBueFRpbGVzICsgeDtcbiAgICAgICAgY29uc3QgdG90YWxUaWxlcyA9IG54VGlsZXMgKiBueVRpbGVzO1xuICAgICAgICBpZiAoaWR4ID49IHRvdGFsVGlsZXMpIHRocm93IG5ldyBFcnJvcihgVGlsZSBpbmRleCBpcyBvdXRzaWRlIG9mIHRpbGUgcmFuZ2U6ICR7aWR4fSA+PSAke3RvdGFsVGlsZXN9YCk7XG5cbiAgICAgICAgY29uc3QgeyBvZmZzZXQsIGltYWdlU2l6ZSB9ID0gYXdhaXQgdGhpcy5nZXRUaWxlU2l6ZShpZHgsIGwpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCeXRlcyhvZmZzZXQsIGltYWdlU2l6ZSwgbCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGdldFRpbGVTaXplKGluZGV4OiBudW1iZXIsIGw/OiBMb2dUeXBlKTogUHJvbWlzZTx7IG9mZnNldDogbnVtYmVyOyBpbWFnZVNpemU6IG51bWJlciB9PiB7XG4gICAgICAgIC8vIEdEQUwgb3B0aW1pemVzIHRpbGVzIGJ5IHN0b3JpbmcgdGhlIHNpemUgb2YgdGhlIHRpbGUgaW5cbiAgICAgICAgLy8gdGhlIGZldyBieXRlcyBsZWFkaW5nIHVwIHRvIHRoZSB0aWxlXG4gICAgICAgIGlmICh0aGlzLnRpZi5vcHRpb25zLnRpbGVMZWFkZXJCeXRlU2l6ZSkge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYXdhaXQgdGhpcy5nZXRUaWxlT2Zmc2V0KGluZGV4LCBsKTtcbiAgICAgICAgICAgIC8vIFNwYXJzZSBDT0cgbm8gZGF0YSBmb3VuZFxuICAgICAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgcmV0dXJuIHsgb2Zmc2V0OiAwLCBpbWFnZVNpemU6IDAgfTtcblxuICAgICAgICAgICAgY29uc3QgbGVhZGVyQnl0ZXMgPSB0aGlzLnRpZi5vcHRpb25zLnRpbGVMZWFkZXJCeXRlU2l6ZTtcbiAgICAgICAgICAgIC8vIFRoaXMgZmV0Y2ggd2lsbCBnZW5lcmFsbHkgbG9hZCBpbiB0aGUgYnl0ZXMgbmVlZGVkIGZvciB0aGUgaW1hZ2UgdG9vXG4gICAgICAgICAgICAvLyBwcm92aWRlZCB0aGUgaW1hZ2Ugc2l6ZSBpcyBsZXNzIHRoYW4gdGhlIHNpemUgb2YgYSBjaHVua1xuICAgICAgICAgICAgYXdhaXQgdGhpcy50aWYuc291cmNlLmxvYWRCeXRlcyhvZmZzZXQgLSBsZWFkZXJCeXRlcywgbGVhZGVyQnl0ZXMsIGwpO1xuICAgICAgICAgICAgcmV0dXJuIHsgb2Zmc2V0LCBpbWFnZVNpemU6IHRoaXMudGlmLnNvdXJjZS5nZXRVaW50KG9mZnNldCAtIGxlYWRlckJ5dGVzLCBsZWFkZXJCeXRlcykgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ5dGVDb3VudHMgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuVGlsZUJ5dGVDb3VudHMpIGFzIENvZ1RpZmZUYWdPZmZzZXQ7XG4gICAgICAgIGlmIChieXRlQ291bnRzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdGlsZSBieXRlIGNvdW50cyBmb3VuZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFtvZmZzZXQsIGltYWdlU2l6ZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5nZXRUaWxlT2Zmc2V0KGluZGV4LCBsKSwgYnl0ZUNvdW50cy5nZXRWYWx1ZUF0KGluZGV4LCBsKV0pO1xuICAgICAgICByZXR1cm4geyBvZmZzZXQsIGltYWdlU2l6ZSB9O1xuICAgIH1cbn1cbiJdfQ==
401
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLnRpZmYuaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29nLnRpZmYuaW1hZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHaEQsd0JBQXdCO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQztBQXNCM0MsTUFBTSxPQUFPLFlBQVk7SUFjckIsWUFBWSxHQUFZLEVBQUUsRUFBVSxFQUFFLElBQWtDO1FBTHhFLHNDQUFzQztRQUM5QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUM5QixpREFBaUQ7UUFDakQsWUFBTyxHQUFxQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBR2xELElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUs7UUFDMUIsTUFBTSxZQUFZLEdBQUc7WUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO1lBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztZQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1NBQ2hDLENBQUM7UUFFRixJQUFJLFdBQVcsRUFBRTtZQUNiLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUN2RCxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDdEQsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1NBQzFEO1FBRUQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hDLElBQUksV0FBVyxFQUFFO1lBQ2IsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDaEM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUksR0FBWTtRQUNqQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFJLFNBQVMsSUFBSSxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbkMsT0FBTyxTQUFTLENBQUMsS0FBVSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxlQUFlO1FBQ2pCLGlCQUFpQjtRQUNqQixJQUFJLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTztRQUMvQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDekQsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFO1lBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLFNBQVMsWUFBWSxjQUFjLEVBQUU7WUFDM0QsNkJBQTZCO1lBQzdCLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO2FBQ3RDLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxTQUFTLENBQUMsS0FBSyxJQUFJLElBQUk7WUFBRSxPQUFPO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQ3ZFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDekMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBZSxDQUFDO1lBQ3JDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFaEMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUU5QixJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDOUIsU0FBUzthQUNaO1lBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEMsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksSUFBSTtnQkFBRSxTQUFTO1lBQy9DLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hEO2lCQUFNLElBQUksT0FBTyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRTtnQkFDdEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7YUFDOUU7U0FDSjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBQyxHQUFlO1FBQ3BCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxLQUFLO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQzNGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxLQUFLLENBQUksR0FBWTtRQUM5QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFJLFNBQVMsSUFBSSxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbkMsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDLEtBQUssRUFBUyxDQUFDO1FBQ2xFLE9BQU8sU0FBUyxDQUFDLEtBQVUsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksTUFBTTtRQUNOLE1BQU0sU0FBUyxHQUFvQixJQUFJLENBQUMsS0FBSyxDQUFXLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvRSxJQUFJLFNBQVMsSUFBSSxJQUFJLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0MsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckQ7UUFFRCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQVcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDOUUsSUFBSSxtQkFBbUIsSUFBSSxJQUFJLEVBQUU7WUFDN0IsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDcEY7UUFFRCxrRUFBa0U7UUFDbEUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDM0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDcEM7UUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELDZGQUE2RjtJQUM3RixJQUFJLFlBQVk7UUFDWixNQUFNLGNBQWMsR0FDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksSUFBSSxDQUFDO1FBQ25HLElBQUksY0FBYztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2hDLHdFQUF3RTtRQUN4RSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUN0RyxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksVUFBVTtRQUNWLE1BQU0sZUFBZSxHQUFvQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM3RSxJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUU7WUFDekIsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN4RTtRQUNELE1BQU0sbUJBQW1CLEdBQW9CLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDckYsSUFBSSxtQkFBbUIsSUFBSSxJQUFJLEVBQUU7WUFDN0IsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDcEY7UUFFRCxzRUFBc0U7UUFDdEUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDM0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUMvQyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDMUIsdUVBQXVFO1lBQ3ZFLE9BQU8sQ0FBQyxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM3RztRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksSUFBSTtRQUNKLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRW5DLElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLFVBQVUsSUFBSSxJQUFJLEVBQUU7WUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1NBQ3ZEO1FBRUQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyQixNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDM0MsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBRTVDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUFJLFdBQVc7UUFDWCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwRCxJQUFJLFdBQVcsSUFBSSxJQUFJLElBQUksT0FBTyxXQUFXLEtBQUssUUFBUSxFQUFFO1lBQ3hELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxPQUFPLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksSUFBSTtRQUNKLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFXLENBQUM7UUFDN0UsSUFBSSxVQUFVLEtBQUsscUJBQXFCO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdEQsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJLElBQUk7UUFDSixPQUFPO1lBQ0gsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQVMsT0FBTyxDQUFDLFVBQVUsQ0FBVztZQUN2RCxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBUyxPQUFPLENBQUMsV0FBVyxDQUFXO1NBQzVELENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLE9BQU87UUFDUCxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPO1FBQ1YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLENBQUM7SUFDbEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxRQUFRO1FBQ1IsT0FBTztZQUNILEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFTLE9BQU8sQ0FBQyxTQUFTLENBQVc7WUFDdEQsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQVMsT0FBTyxDQUFDLFVBQVUsQ0FBVztTQUMzRCxDQUFDO0lBQ04sQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxTQUFTO1FBQ1QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN2QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUFJLFVBQVU7UUFDVixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFxQixDQUFDO1FBQzFFLElBQUksVUFBVSxJQUFJLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDakUsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILElBQUksVUFBVTtRQUNWLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQXFCLENBQUM7UUFDOUUsSUFBSSxVQUFVLElBQUksSUFBSTtZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQWE7UUFDdkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNuQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxTQUFTLEVBQUU7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsS0FBSyx1QkFBdUIsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7U0FDdkY7UUFFRCxxREFBcUQ7UUFDckQsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxnSEFBZ0g7SUFDaEgsYUFBYSxDQUFDLENBQVMsRUFBRSxDQUFTO1FBQzlCLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3ZGLE1BQU0sTUFBTSxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQzFGLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFhO1FBQ3hCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUUxRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFxQixDQUFDO1FBQzlFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQXFCLENBQUM7UUFFeEUsSUFBSSxLQUFLLElBQUksVUFBVSxDQUFDLFNBQVM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFFN0YsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELHlHQUF5RztJQUNqRyxhQUFhLENBQUMsS0FBaUI7UUFDbkMseUZBQXlGO1FBQ3pGLHdDQUF3QztRQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFXLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4RCxJQUFJLE1BQU0sSUFBSSxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBRWxFLDJCQUEyQjtRQUMzQixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sV0FBVyxHQUFHLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM1RSxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QixXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELE9BQU8sV0FBVyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCwyQ0FBMkM7SUFDbkMsS0FBSyxDQUFDLFFBQVEsQ0FDbEIsTUFBYyxFQUNkLFNBQWlCO1FBRWpCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDbEMsSUFBSSxRQUFRLElBQUksSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUNyRyxJQUFJLFNBQVMsS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFakMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFdkQsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxJQUFJLEVBQUU7WUFDeEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1NBQ3pEO1FBQ0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBUyxFQUFFLENBQVM7UUFDOUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNsQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFFNUIsSUFBSSxLQUFLLElBQUksSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN4RCxJQUFJLFFBQVEsSUFBSSxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBRXJHLG9DQUFvQztRQUNwQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFcEQsSUFBSSxDQUFDLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxPQUFPLE9BQU8sU0FBUyxDQUFDLE9BQU8sT0FBTyxFQUFFLENBQUMsQ0FBQztTQUNsRztRQUVELE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sVUFBVSxHQUFHLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDckMsSUFBSSxHQUFHLElBQUksVUFBVTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLEdBQUcsT0FBTyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRXZHLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVTLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBYTtRQUNyQywwREFBMEQ7UUFDMUQsdUNBQXVDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUU7WUFDckMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLDJCQUEyQjtZQUMzQixJQUFJLE1BQU0sS0FBSyxDQUFDO2dCQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUVyRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztZQUN4RCx1RUFBdUU7WUFDdkUsMkRBQTJEO1lBQzNELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDbkUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxXQUFXLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQztTQUM1RjtRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQXFCLENBQUM7UUFDN0UsSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztTQUNoRDtRQUNELE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ2pDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvZ1RpZmYgfSBmcm9tICcuL2NvZy50aWZmLmpzJztcbmltcG9ydCB7IFRpZmZDb21wcmVzc2lvbiwgVGlmZk1pbWVUeXBlIH0gZnJvbSAnLi9jb25zdC90aWZmLm1pbWUuanMnO1xuaW1wb3J0IHsgVGlmZlRhZywgVGlmZlRhZ0dlbyB9IGZyb20gJy4vY29uc3QvdGlmZi50YWcuaWQuanMnO1xuaW1wb3J0IHsgQ29nVGlmZlRhZ0Jhc2UgfSBmcm9tICcuL3JlYWQvdGFnL3RpZmYudGFnLmJhc2UuanMnO1xuaW1wb3J0IHsgQ29nVGlmZlRhZ0xhenkgfSBmcm9tICcuL3JlYWQvdGFnL3RpZmYudGFnLmxhenkuanMnO1xuaW1wb3J0IHsgQ29nVGlmZlRhZ09mZnNldCB9IGZyb20gJy4vcmVhZC90YWcvdGlmZi50YWcub2Zmc2V0LmpzJztcbmltcG9ydCB7IENvZ1RpZmZUYWcgfSBmcm9tICcuL3JlYWQvdGlmZi50YWcuanMnO1xuaW1wb3J0IHsgQm91bmRpbmdCb3gsIFNpemUgfSBmcm9tICcuL3ZlY3Rvci5qcyc7XG5cbi8qKiBJbnZhbGlkIEVQU0cgY29kZSAqL1xuZXhwb3J0IGNvbnN0IEludmFsaWRQcm9qZWN0aW9uQ29kZSA9IDMyNzY3O1xuXG4vKipcbiAqIE51bWJlciBvZiB0aWxlcyB1c2VkIGluc2lkZSB0aGlzIGltYWdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29nVGlmZkltYWdlVGlsZWRDb3VudCB7XG4gICAgLyoqIE51bWJlciBvZiB0aWxlcyBvbiB0aGUgeCBheGlzICovXG4gICAgeDogbnVtYmVyO1xuICAgIC8qKiBOdW1iZXIgb2YgdGlsZXMgb24gdGhlIHkgYXhpcyAqL1xuICAgIHk6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBTaXplIG9mIGEgaW5kaXZpZHVhbCB0aWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29nVGlmZkltYWdlVGlsZVNpemUge1xuICAgIC8qKiBUaWxlIHdpZHRoIChwaXhlbHMpICovXG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICAvKiogVGlsZSBoZWlnaHQgKHBpeGVscykgKi9cbiAgICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIENvZ1RpZmZJbWFnZSB7XG4gICAgLyoqIEFsbCBJRkQgdGFncyB0aGF0IGhhdmUgYmVlbiByZWFkIGZvciB0aGUgaW1hZ2UgKi9cbiAgICB0YWdzOiBNYXA8VGlmZlRhZywgQ29nVGlmZlRhZ0Jhc2U+O1xuXG4gICAgLyoqIElkIG9mIHRoZSB0aWYgaW1hZ2UsIGdlbmVyYWxseSB0aGUgaW1hZ2UgaW5kZXggaW5zaWRlIHRoZSB0aWYgKi9cbiAgICBpZDogbnVtYmVyO1xuXG4gICAgdGlmOiBDb2dUaWZmO1xuXG4gICAgLyoqIEhhcyBsb2FkR2VvVGlmZlRhZ3MgYmVlbiBjYWxsZWQgKi9cbiAgICBwcml2YXRlIHRhZ3NHZW9Mb2FkZWQgPSBmYWxzZTtcbiAgICAvKiogU3ViIHRhZ3Mgc3RvcmVkIGluIFRpZmZUYWcuR2VvS2V5RGlyZWN0b3J5ICovXG4gICAgdGFnc0dlbzogTWFwPFRpZmZUYWdHZW8sIHN0cmluZyB8IG51bWJlcj4gPSBuZXcgTWFwKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcih0aWY6IENvZ1RpZmYsIGlkOiBudW1iZXIsIHRhZ3M6IE1hcDxUaWZmVGFnLCBDb2dUaWZmVGFnQmFzZT4pIHtcbiAgICAgICAgdGhpcy50aWYgPSB0aWY7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy50YWdzID0gdGFncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZSBsb2FkaW5nIG9mIGltcG9ydGFudCB0YWdzIGlmIHRoZXkgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAqXG4gICAgICogQHBhcmFtIGxvYWRHZW9UYWdzIFdoZXRoZXIgdG8gbG9hZCB0aGUgR2VvS2V5RGlyZWN0b3J5IGFuZCB1bnBhY2sgaXRcbiAgICAgKi9cbiAgICBhc3luYyBpbml0KGxvYWRHZW9UYWdzID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVxdWlyZWRUYWdzID0gW1xuICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLkNvbXByZXNzaW9uKSxcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5JbWFnZUhlaWdodCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuSW1hZ2VXaWR0aCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuTW9kZWxQaXhlbFNjYWxlKSxcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5Nb2RlbFRpZVBvaW50KSxcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5Nb2RlbFRyYW5zZm9ybWF0aW9uKSxcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5UaWxlSGVpZ2h0KSxcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5UaWxlV2lkdGgpLFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChsb2FkR2VvVGFncykge1xuICAgICAgICAgICAgcmVxdWlyZWRUYWdzLnB1c2godGhpcy5mZXRjaChUaWZmVGFnLkdlb0tleURpcmVjdG9yeSkpO1xuICAgICAgICAgICAgcmVxdWlyZWRUYWdzLnB1c2godGhpcy5mZXRjaChUaWZmVGFnLkdlb0FzY2lpUGFyYW1zKSk7XG4gICAgICAgICAgICByZXF1aXJlZFRhZ3MucHVzaCh0aGlzLmZldGNoKFRpZmZUYWcuR2VvRG91YmxlUGFyYW1zKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChyZXF1aXJlZFRhZ3MpO1xuICAgICAgICBpZiAobG9hZEdlb1RhZ3MpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZEdlb1RpZmZUYWdzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGEgVGlmZlRhZyBpZiBpdCBleGlzdHMgbnVsbCBvdGhlcndpc2VcbiAgICAgKi9cbiAgICB2YWx1ZTxUPih0YWc6IFRpZmZUYWcpOiBUIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHNvdXJjZVRhZyA9IHRoaXMudGFncy5nZXQodGFnKTtcbiAgICAgICAgaWYgKHNvdXJjZVRhZyA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVRhZy52YWx1ZSBhcyBUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgYW5kIHVucGFjayB0aGUgR2VvS2V5RGlyZWN0b3J5XG4gICAgICovXG4gICAgYXN5bmMgbG9hZEdlb1RpZmZUYWdzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBBbHJlYWR5IGxvYWRlZFxuICAgICAgICBpZiAodGhpcy50YWdzR2VvTG9hZGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNvdXJjZVRhZyA9IHRoaXMudGFncy5nZXQoVGlmZlRhZy5HZW9LZXlEaXJlY3RvcnkpO1xuICAgICAgICBpZiAoc291cmNlVGFnID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudGFnc0dlb0xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzb3VyY2VUYWcuaXNSZWFkeSAmJiBzb3VyY2VUYWcgaW5zdGFuY2VvZiBDb2dUaWZmVGFnTGF6eSkge1xuICAgICAgICAgICAgLy8gTG9hZCBhbGwgdGhlIHJlcXVpcmVkIGtleXNcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuR2VvS2V5RGlyZWN0b3J5KSxcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuR2VvQXNjaWlQYXJhbXMpLFxuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5HZW9Eb3VibGVQYXJhbXMpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWdzR2VvTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHNvdXJjZVRhZy52YWx1ZSA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdlb1RhZ3MgPSBzb3VyY2VUYWcudmFsdWU7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShnZW9UYWdzKSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdlbyB0YWdzIGZvdW5kJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSA0OyBpIDw9IGdlb1RhZ3NbM10gKiA0OyBpICs9IDQpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGdlb1RhZ3NbaV0gYXMgVGlmZlRhZ0dlbztcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gZ2VvVGFnc1tpICsgMV07XG5cbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGdlb1RhZ3NbaSArIDNdO1xuXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ3NHZW8uc2V0KGtleSwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IHRoaXMudGFncy5nZXQobG9jYXRpb24pO1xuICAgICAgICAgICAgaWYgKHRhZyA9PSBudWxsIHx8IHRhZy52YWx1ZSA9PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gZ2VvVGFnc1tpICsgMl07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YWcudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzR2VvLnNldChrZXksIHRhZy52YWx1ZVtvZmZzZXQgKyBjb3VudCAtIDFdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRhZy52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ3NHZW8uc2V0KGtleSwgdGFnLnZhbHVlLnN1YnN0cihvZmZzZXQsIG9mZnNldCArIGNvdW50IC0gMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYXNzb2NpYXRlZCBHZW9UaWZmVGFnc1xuICAgICAqL1xuICAgIHZhbHVlR2VvKHRhZzogVGlmZlRhZ0dlbyk6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLnRhZ3NHZW9Mb2FkZWQgPT09IGZhbHNlKSB0aHJvdyBuZXcgRXJyb3IoJ2xvYWRHZW9UaWZmVGFncygpIGhhcyBub3QgYmVlbiBjYWxsZWQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFnc0dlby5nZXQodGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgdGFnLCBpZiBpdCBpcyBub3QgY3VycmVudGx5IGxvYWRlZCwgZmV0Y2ggdGhlIHJlcXVpcmVkIGRhdGEgZm9yIHRoZSB0YWcuXG4gICAgICogQHBhcmFtIHRhZyB0YWcgdG8gZmV0Y2hcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZmV0Y2g8VD4odGFnOiBUaWZmVGFnKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBzb3VyY2VUYWcgPSB0aGlzLnRhZ3MuZ2V0KHRhZyk7XG4gICAgICAgIGlmIChzb3VyY2VUYWcgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChDb2dUaWZmVGFnLmlzTGF6eShzb3VyY2VUYWcpKSByZXR1cm4gc291cmNlVGFnLmZldGNoKCkgYXMgYW55O1xuICAgICAgICByZXR1cm4gc291cmNlVGFnLnZhbHVlIGFzIFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBvcmlnaW4gcG9pbnQgZm9yIHRoZSBpbWFnZVxuICAgICAqXG4gICAgICogQHJldHVybnMgb3JpZ2luIHBvaW50IG9mIHRoZSBpbWFnZVxuICAgICAqL1xuICAgIGdldCBvcmlnaW4oKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgY29uc3QgdGllUG9pbnRzOiBudW1iZXJbXSB8IG51bGwgPSB0aGlzLnZhbHVlPG51bWJlcltdPihUaWZmVGFnLk1vZGVsVGllUG9pbnQpO1xuICAgICAgICBpZiAodGllUG9pbnRzICE9IG51bGwgJiYgdGllUG9pbnRzLmxlbmd0aCA9PT0gNikge1xuICAgICAgICAgICAgcmV0dXJuIFt0aWVQb2ludHNbM10sIHRpZVBvaW50c1s0XSwgdGllUG9pbnRzWzVdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vZGVsVHJhbnNmb3JtYXRpb24gPSB0aGlzLnZhbHVlPG51bWJlcltdPihUaWZmVGFnLk1vZGVsVHJhbnNmb3JtYXRpb24pO1xuICAgICAgICBpZiAobW9kZWxUcmFuc2Zvcm1hdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW21vZGVsVHJhbnNmb3JtYXRpb25bM10sIG1vZGVsVHJhbnNmb3JtYXRpb25bN10sIG1vZGVsVHJhbnNmb3JtYXRpb25bMTFdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBzdWIgaW1hZ2UsIHVzZSB0aGUgb3JpZ2luIGZyb20gdGhlIHRvcCBsZXZlbCBpbWFnZVxuICAgICAgICBpZiAodGhpcy52YWx1ZShUaWZmVGFnLk5ld1N1YkZpbGVUeXBlKSA9PT0gMSAmJiB0aGlzLmlkICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aWYuaW1hZ2VzWzBdLm9yaWdpbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW1hZ2UgZG9lcyBub3QgaGF2ZSBhIGdlbyB0cmFuc2Zvcm1hdGlvbi4nKTtcbiAgICB9XG5cbiAgICAvKiogSXMgdGhlcmUgZW5vdWdoIGdlbyBpbmZvcm1hdGlvbiBvbiB0aGlzIGltYWdlIHRvIGZpZ3VyZSBvdXQgd2hlcmUgaXRzIGFjdHVhbGx5IGxvY2F0ZWQgKi9cbiAgICBnZXQgaXNHZW9Mb2NhdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpc0ltYWdlTG9jYXRlZCA9XG4gICAgICAgICAgICB0aGlzLnZhbHVlKFRpZmZUYWcuTW9kZWxQaXhlbFNjYWxlKSAhPSBudWxsIHx8IHRoaXMudmFsdWUoVGlmZlRhZy5Nb2RlbFRyYW5zZm9ybWF0aW9uKSAhPSBudWxsO1xuICAgICAgICBpZiAoaXNJbWFnZUxvY2F0ZWQpIHJldHVybiB0cnVlO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3ViIGltYWdlLCB1c2UgdGhlIGlzR2VvTG9jYXRlZCBmcm9tIHRoZSB0b3AgbGV2ZWwgaW1hZ2VcbiAgICAgICAgaWYgKHRoaXMudmFsdWUoVGlmZlRhZy5OZXdTdWJGaWxlVHlwZSkgPT09IDEgJiYgdGhpcy5pZCAhPT0gMCkgcmV0dXJuIHRoaXMudGlmLmltYWdlc1swXS5pc0dlb0xvY2F0ZWQ7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJlc29sdXRpb24gb2YgdGhlIGltYWdlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBbeCx5LHpdIHBpeGVsIHNjYWxlXG4gICAgICovXG4gICAgZ2V0IHJlc29sdXRpb24oKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgY29uc3QgbW9kZWxQaXhlbFNjYWxlOiBudW1iZXJbXSB8IG51bGwgPSB0aGlzLnZhbHVlKFRpZmZUYWcuTW9kZWxQaXhlbFNjYWxlKTtcbiAgICAgICAgaWYgKG1vZGVsUGl4ZWxTY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW21vZGVsUGl4ZWxTY2FsZVswXSwgLW1vZGVsUGl4ZWxTY2FsZVsxXSwgbW9kZWxQaXhlbFNjYWxlWzJdXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtb2RlbFRyYW5zZm9ybWF0aW9uOiBudW1iZXJbXSB8IG51bGwgPSB0aGlzLnZhbHVlKFRpZmZUYWcuTW9kZWxUcmFuc2Zvcm1hdGlvbik7XG4gICAgICAgIGlmIChtb2RlbFRyYW5zZm9ybWF0aW9uICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbbW9kZWxUcmFuc2Zvcm1hdGlvblswXSwgbW9kZWxUcmFuc2Zvcm1hdGlvbls1XSwgbW9kZWxUcmFuc2Zvcm1hdGlvblsxMF1dO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN1YiBpbWFnZSwgdXNlIHRoZSByZXNvbHV0aW9uIGZyb20gdGhlIHRvcCBsZXZlbCBpbWFnZVxuICAgICAgICBpZiAodGhpcy52YWx1ZShUaWZmVGFnLk5ld1N1YkZpbGVUeXBlKSA9PT0gMSAmJiB0aGlzLmlkICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdEltZyA9IHRoaXMudGlmLmltYWdlc1swXTtcbiAgICAgICAgICAgIGNvbnN0IFtyZXNYLCByZXNZLCByZXNaXSA9IGZpcnN0SW1nLnJlc29sdXRpb247XG4gICAgICAgICAgICBjb25zdCBmaXJzdEltZ1NpemUgPSBmaXJzdEltZy5zaXplO1xuICAgICAgICAgICAgY29uc3QgaW1nU2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgICAgICAgIC8vIHNjYWxlIHJlc29sdXRpb24gYmFzZWQgb24gdGhlIHNpemUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gaW1hZ2VzXG4gICAgICAgICAgICByZXR1cm4gWyhyZXNYICogZmlyc3RJbWdTaXplLndpZHRoKSAvIGltZ1NpemUud2lkdGgsIChyZXNZICogZmlyc3RJbWdTaXplLmhlaWdodCkgLyBpbWdTaXplLmhlaWdodCwgcmVzWl07XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltYWdlIGRvZXMgbm90IGhhdmUgYSBnZW8gdHJhbnNmb3JtYXRpb24uJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQm91bmRpbmcgYm94IG9mIHRoZSBpbWFnZVxuICAgICAqXG4gICAgICogQHJldHVybnMgW21pblgsIG1pblksIG1heFgsIG1heFldIGJvdW5kaW5nIGJveFxuICAgICAqL1xuICAgIGdldCBiYm94KCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gdGhpcy5vcmlnaW47XG4gICAgICAgIGNvbnN0IHJlc29sdXRpb24gPSB0aGlzLnJlc29sdXRpb247XG5cbiAgICAgICAgaWYgKG9yaWdpbiA9PSBudWxsIHx8IHNpemUgPT0gbnVsbCB8fCByZXNvbHV0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGNhbGN1bGF0ZSBib3VuZGluZyBib3gnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHgxID0gb3JpZ2luWzBdO1xuICAgICAgICBjb25zdCB5MSA9IG9yaWdpblsxXTtcblxuICAgICAgICBjb25zdCB4MiA9IHgxICsgcmVzb2x1dGlvblswXSAqIHNpemUud2lkdGg7XG4gICAgICAgIGNvbnN0IHkyID0geTEgKyByZXNvbHV0aW9uWzFdICogc2l6ZS5oZWlnaHQ7XG5cbiAgICAgICAgcmV0dXJuIFtNYXRoLm1pbih4MSwgeDIpLCBNYXRoLm1pbih5MSwgeTIpLCBNYXRoLm1heCh4MSwgeDIpLCBNYXRoLm1heCh5MSwgeTIpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGNvbXByZXNzaW9uIHVzZWQgYnkgdGhlIHRpbGVcbiAgICAgKlxuICAgICAqIEBzZWUgVGlmZkNvbXByZXNzaW9uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBDb21wcmVzc2lvbiB0eXBlIGVnIHdlYnBcbiAgICAgKi9cbiAgICBnZXQgY29tcHJlc3Npb24oKTogVGlmZk1pbWVUeXBlIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGNvbXByZXNzaW9uID0gdGhpcy52YWx1ZShUaWZmVGFnLkNvbXByZXNzaW9uKTtcbiAgICAgICAgaWYgKGNvbXByZXNzaW9uID09IG51bGwgfHwgdHlwZW9mIGNvbXByZXNzaW9uICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpZmZDb21wcmVzc2lvbltjb21wcmVzc2lvbl07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0ZW1wdCB0byByZWFkIHRoZSBFUFNHIENvZGUgZnJvbSBUaWZmR2VvVGFnc1xuICAgICAqXG4gICAgICogQHJldHVybnMgRVBTRyBDb2RlIGlmIGl0IGV4aXN0c1xuICAgICAqL1xuICAgIGdldCBlcHNnKCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uID0gdGhpcy52YWx1ZUdlbyhUaWZmVGFnR2VvLlByb2plY3RlZENTVHlwZUdlb0tleSkgYXMgbnVtYmVyO1xuICAgICAgICBpZiAocHJvamVjdGlvbiA9PT0gSW52YWxpZFByb2plY3Rpb25Db2RlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHByb2plY3Rpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzaXplIG9mIHRoZSBpbWFnZVxuICAgICAqXG4gICAgICogQHJldHVybnMgU2l6ZSBpbiBwaXhlbHNcbiAgICAgKi9cbiAgICBnZXQgc2l6ZSgpOiBTaXplIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnZhbHVlPG51bWJlcj4oVGlmZlRhZy5JbWFnZVdpZHRoKSBhcyBudW1iZXIsXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMudmFsdWU8bnVtYmVyPihUaWZmVGFnLkltYWdlSGVpZ2h0KSBhcyBudW1iZXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBsaXN0IG9mIElGRCB0YWdzIHRoYXQgd2VyZSByZWFkXG4gICAgICovXG4gICAgZ2V0IHRhZ0xpc3QoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMudGFncy5rZXlzKCldLm1hcCgoYykgPT4gVGlmZlRhZ1tjXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIGlmIHRoaXMgaW1hZ2UgaXMgdGlsZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNUaWxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUoVGlmZlRhZy5UaWxlV2lkdGgpICE9PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzaXplIG9mIGluZGl2aWR1YWwgdGlsZXNcbiAgICAgKi9cbiAgICBnZXQgdGlsZVNpemUoKTogQ29nVGlmZkltYWdlVGlsZVNpemUge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2lkdGg6IHRoaXMudmFsdWU8bnVtYmVyPihUaWZmVGFnLlRpbGVXaWR0aCkgYXMgbnVtYmVyLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnZhbHVlPG51bWJlcj4oVGlmZlRhZy5UaWxlSGVpZ2h0KSBhcyBudW1iZXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHRpbGVzIHVzZWQgdG8gY3JlYXRlIHRoaXMgaW1hZ2VcbiAgICAgKi9cbiAgICBnZXQgdGlsZUNvdW50KCk6IENvZ1RpZmZJbWFnZVRpbGVkQ291bnQge1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5zaXplO1xuICAgICAgICBjb25zdCB0aWxlU2l6ZSA9IHRoaXMudGlsZVNpemU7XG4gICAgICAgIGNvbnN0IHggPSBNYXRoLmNlaWwoc2l6ZS53aWR0aCAvIHRpbGVTaXplLndpZHRoKTtcbiAgICAgICAgY29uc3QgeSA9IE1hdGguY2VpbChzaXplLmhlaWdodCAvIHRpbGVTaXplLmhlaWdodCk7XG4gICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBvaW50ZXIgdG8gd2hlcmUgdGhlIHRpbGVzIHN0YXJ0IGluIHRoZSBUaWZmIGZpbGVcbiAgICAgKlxuICAgICAqIEByZW1hcmtzIFVzZWQgdG8gcmVhZCB0aWxlZCB0aWZmc1xuICAgICAqXG4gICAgICogQHJldHVybnMgZmlsZSBvZmZzZXQgdG8gd2hlcmUgdGhlIHRpZmZzIGFyZSBzdG9yZWRcbiAgICAgKi9cbiAgICBnZXQgdGlsZU9mZnNldCgpOiBDb2dUaWZmVGFnT2Zmc2V0IHtcbiAgICAgICAgY29uc3QgdGlsZU9mZnNldCA9IHRoaXMudGFncy5nZXQoVGlmZlRhZy5UaWxlT2Zmc2V0cykgYXMgQ29nVGlmZlRhZ09mZnNldDtcbiAgICAgICAgaWYgKHRpbGVPZmZzZXQgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdObyB0aWxlIG9mZnNldHMgZm91bmQnKTtcbiAgICAgICAgcmV0dXJuIHRpbGVPZmZzZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBudW1iZXIgb2Ygc3RyaXAncyBpbnNpZGUgdGhpcyB0aWZmXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBVc2VkIHRvIHJlYWQgc3RyaXBlZCB0aWZmc1xuICAgICAqXG4gICAgICogQHJldHVybnMgbnVtYmVyIG9mIHN0cmlwcyBwcmVzZW50XG4gICAgICovXG4gICAgZ2V0IHN0cmlwQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdGlsZU9mZnNldCA9IHRoaXMudGFncy5nZXQoVGlmZlRhZy5TdHJpcEJ5dGVDb3VudHMpIGFzIENvZ1RpZmZUYWdPZmZzZXQ7XG4gICAgICAgIGlmICh0aWxlT2Zmc2V0ID09IG51bGwpIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gdGlsZU9mZnNldC5kYXRhQ291bnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgcG9pbnRlciB0byBhIHNwZWNpZmljIHRpbGUgaW5zaWRlIHRoZSB0aWZmIGZpbGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCB0aWxlIGluZGV4XG4gICAgICogQHJldHVybnMgZmlsZSBvZmZzZXQgb2YgdGhlIHNwZWNpZmllZCB0aWxlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIGdldFRpbGVPZmZzZXQoaW5kZXg6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IHRpbGVPZmZzZXQgPSB0aGlzLnRpbGVPZmZzZXQ7XG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiB0aWxlT2Zmc2V0LmRhdGFDb3VudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaWxlIG9mZnNldDogJHtpbmRleH0gb3V0IG9mIHJhbmdlOiAwIC0+ICR7dGlsZU9mZnNldC5kYXRhQ291bnR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGZXRjaCBvbmx5IHRoZSBwYXJ0IG9mIHRoZSBvZmZzZXRzIHRoYXQgYXJlIG5lZWRlZFxuICAgICAgICByZXR1cm4gdGlsZU9mZnNldC5nZXRWYWx1ZUF0KGluZGV4KTtcbiAgICB9XG5cbiAgICAvLyBDbGFtcCB0aGUgYm91bmRzIG9mIHRoZSBvdXRwdXQgaW1hZ2UgdG8gdGhlIHNpemUgb2YgdGhlIGltYWdlLCBhcyBzb21ldGltZXMgdGhlIGVkZ2UgdGlsZXMgYXJlIG5vdCBmdWxsIHRpbGVzXG4gICAgZ2V0VGlsZUJvdW5kcyh4OiBudW1iZXIsIHk6IG51bWJlcik6IEJvdW5kaW5nQm94IHtcbiAgICAgICAgY29uc3QgeyBzaXplLCB0aWxlU2l6ZSB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgdG9wID0geSAqIHRpbGVTaXplLmhlaWdodDtcbiAgICAgICAgY29uc3QgbGVmdCA9IHggKiB0aWxlU2l6ZS53aWR0aDtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBsZWZ0ICsgdGlsZVNpemUud2lkdGggPj0gc2l6ZS53aWR0aCA/IHNpemUud2lkdGggLSBsZWZ0IDogdGlsZVNpemUud2lkdGg7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRvcCArIHRpbGVTaXplLmhlaWdodCA+PSBzaXplLmhlaWdodCA/IHNpemUuaGVpZ2h0IC0gdG9wIDogdGlsZVNpemUuaGVpZ2h0O1xuICAgICAgICByZXR1cm4geyB4OiBsZWZ0LCB5OiB0b3AsIHdpZHRoLCBoZWlnaHQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgc3RyaXAgaW50byBhIHVpbnQ4IGFycmF5XG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXggU3RyaXAgaW5kZXggdG8gcmVhZFxuICAgICAqL1xuICAgIGFzeW5jIGdldFN0cmlwKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPHsgbWltZVR5cGU6IFRpZmZNaW1lVHlwZTsgYnl0ZXM6IFVpbnQ4QXJyYXkgfSB8IG51bGw+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNUaWxlZCgpKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHN0cmlwZXMsIHRpZmYgaXMgdGlsZWQnKTtcblxuICAgICAgICBjb25zdCBieXRlQ291bnRzID0gdGhpcy50YWdzLmdldChUaWZmVGFnLlN0cmlwQnl0ZUNvdW50cykgYXMgQ29nVGlmZlRhZ09mZnNldDtcbiAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IHRoaXMudGFncy5nZXQoVGlmZlRhZy5TdHJpcE9mZnNldHMpIGFzIENvZ1RpZmZUYWdPZmZzZXQ7XG5cbiAgICAgICAgaWYgKGluZGV4ID49IGJ5dGVDb3VudHMuZGF0YUNvdW50KSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHN0cmlwLCBpbmRleCBvdXQgb2YgYm91bmRzJyk7XG5cbiAgICAgICAgY29uc3QgW2J5dGVDb3VudCwgb2Zmc2V0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtvZmZzZXRzLmdldFZhbHVlQXQoaW5kZXgpLCBieXRlQ291bnRzLmdldFZhbHVlQXQoaW5kZXgpXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ5dGVzKGJ5dGVDb3VudCwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvKiogVGhlIGpwZWcgaGVhZGVyIGlzIHN0b3JlZCBpbiB0aGUgSUZELCByZWFkIHRoZSBKUEVHIGhlYWRlciBhbmQgYWRqdXN0IHRoZSBieXRlIGFycmF5IHRvIGluY2x1ZGUgaXQgKi9cbiAgICBwcml2YXRlIGdldEpwZWdIZWFkZXIoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgICAgICAgLy8gQm90aCB0aGUgSlBFR1RhYmxlIGFuZCB0aGUgQnl0ZXMgd2l0aCBoYXZlIHRoZSBzdGFydCBvZiBpbWFnZSBhbmQgZW5kIG9mIGltYWdlIG1hcmtlcnNcbiAgICAgICAgLy8gU3RhcnRPZkltYWdlIDB4ZmZkOCBFbmRPZkltYWdlIDB4ZmZkOVxuICAgICAgICBjb25zdCB0YWJsZXMgPSB0aGlzLnZhbHVlPG51bWJlcltdPihUaWZmVGFnLkpQRUdUYWJsZXMpO1xuICAgICAgICBpZiAodGFibGVzID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgSnBlZyBoZWFkZXInKTtcblxuICAgICAgICAvLyBSZW1vdmUgRW5kT2ZJbWFnZSBtYXJrZXJcbiAgICAgICAgY29uc3QgdGFibGVEYXRhID0gdGFibGVzLnNsaWNlKDAsIHRhYmxlcy5sZW5ndGggLSAyKTtcbiAgICAgICAgY29uc3QgYWN0dWFsQnl0ZXMgPSBuZXcgVWludDhBcnJheShieXRlcy5ieXRlTGVuZ3RoICsgdGFibGVEYXRhLmxlbmd0aCAtIDIpO1xuICAgICAgICBhY3R1YWxCeXRlcy5zZXQodGFibGVEYXRhLCAwKTtcbiAgICAgICAgYWN0dWFsQnl0ZXMuc2V0KGJ5dGVzLnNsaWNlKDIpLCB0YWJsZURhdGEubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIGFjdHVhbEJ5dGVzO1xuICAgIH1cblxuICAgIC8qKiBSZWFkIGltYWdlIGJ5dGVzIGF0IHRoZSBnaXZlbiBvZmZzZXQgKi9cbiAgICBwcml2YXRlIGFzeW5jIGdldEJ5dGVzKFxuICAgICAgICBvZmZzZXQ6IG51bWJlcixcbiAgICAgICAgYnl0ZUNvdW50OiBudW1iZXIsXG4gICAgKTogUHJvbWlzZTx7IG1pbWVUeXBlOiBUaWZmTWltZVR5cGU7IGJ5dGVzOiBVaW50OEFycmF5IH0gfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IG1pbWVUeXBlID0gdGhpcy5jb21wcmVzc2lvbjtcbiAgICAgICAgaWYgKG1pbWVUeXBlID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY29tcHJlc3Npb246ICcgKyB0aGlzLnZhbHVlKFRpZmZUYWcuQ29tcHJlc3Npb24pKTtcbiAgICAgICAgaWYgKGJ5dGVDb3VudCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgYXdhaXQgdGhpcy50aWYuc291cmNlLmxvYWRCeXRlcyhvZmZzZXQsIGJ5dGVDb3VudCk7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gdGhpcy50aWYuc291cmNlLmJ5dGVzKG9mZnNldCwgYnl0ZUNvdW50KTtcblxuICAgICAgICBpZiAodGhpcy5jb21wcmVzc2lvbiA9PT0gVGlmZk1pbWVUeXBlLkpQRUcpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1pbWVUeXBlLCBieXRlczogdGhpcy5nZXRKcGVnSGVhZGVyKGJ5dGVzKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1pbWVUeXBlLCBieXRlcyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgdGhlIHRpbGUgYnVmZmVyLCB0aGlzIHdvcmtzIGJlc3Qgd2l0aCB3ZWJwXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYWxzbyBhcHBseSB0aGUgSlBFRyBjb21wcmVzc2lvbiB0YWJsZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRpbGUgeCBvZmZzZXRcbiAgICAgKiBAcGFyYW0geSBUaWxlIHkgb2Zmc2V0XG4gICAgICovXG4gICAgYXN5bmMgZ2V0VGlsZSh4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8eyBtaW1lVHlwZTogVGlmZk1pbWVUeXBlOyBieXRlczogVWludDhBcnJheSB9IHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBtaW1lVHlwZSA9IHRoaXMuY29tcHJlc3Npb247XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIGNvbnN0IHRpbGVzID0gdGhpcy50aWxlU2l6ZTtcblxuICAgICAgICBpZiAodGlsZXMgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdUaWZmIGlzIG5vdCB0aWxlZCcpO1xuICAgICAgICBpZiAobWltZVR5cGUgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBjb21wcmVzc2lvbjogJyArIHRoaXMudmFsdWUoVGlmZlRhZy5Db21wcmVzc2lvbikpO1xuXG4gICAgICAgIC8vIFRPRE8gc3VwcG9ydCBHaG9zdE9wdGlvblRpbGVPcmRlclxuICAgICAgICBjb25zdCBueVRpbGVzID0gTWF0aC5jZWlsKHNpemUuaGVpZ2h0IC8gdGlsZXMuaGVpZ2h0KTtcbiAgICAgICAgY29uc3QgbnhUaWxlcyA9IE1hdGguY2VpbChzaXplLndpZHRoIC8gdGlsZXMud2lkdGgpO1xuXG4gICAgICAgIGlmICh4ID49IG54VGlsZXMgfHwgeSA+PSBueVRpbGVzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbGUgaW5kZXggaXMgb3V0c2lkZSBvZiByYW5nZSB4OiR7eH0gPj0gJHtueFRpbGVzfSBvciB5OiR7eX0gPj0gJHtueVRpbGVzfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWR4ID0geSAqIG54VGlsZXMgKyB4O1xuICAgICAgICBjb25zdCB0b3RhbFRpbGVzID0gbnhUaWxlcyAqIG55VGlsZXM7XG4gICAgICAgIGlmIChpZHggPj0gdG90YWxUaWxlcykgdGhyb3cgbmV3IEVycm9yKGBUaWxlIGluZGV4IGlzIG91dHNpZGUgb2YgdGlsZSByYW5nZTogJHtpZHh9ID49ICR7dG90YWxUaWxlc31gKTtcblxuICAgICAgICBjb25zdCB7IG9mZnNldCwgaW1hZ2VTaXplIH0gPSBhd2FpdCB0aGlzLmdldFRpbGVTaXplKGlkeCk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ5dGVzKG9mZnNldCwgaW1hZ2VTaXplKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VGlsZVNpemUoaW5kZXg6IG51bWJlcik6IFByb21pc2U8eyBvZmZzZXQ6IG51bWJlcjsgaW1hZ2VTaXplOiBudW1iZXIgfT4ge1xuICAgICAgICAvLyBHREFMIG9wdGltaXplcyB0aWxlcyBieSBzdG9yaW5nIHRoZSBzaXplIG9mIHRoZSB0aWxlIGluXG4gICAgICAgIC8vIHRoZSBmZXcgYnl0ZXMgbGVhZGluZyB1cCB0byB0aGUgdGlsZVxuICAgICAgICBpZiAodGhpcy50aWYub3B0aW9ucy50aWxlTGVhZGVyQnl0ZVNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGF3YWl0IHRoaXMuZ2V0VGlsZU9mZnNldChpbmRleCk7XG4gICAgICAgICAgICAvLyBTcGFyc2UgQ09HIG5vIGRhdGEgZm91bmRcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT09IDApIHJldHVybiB7IG9mZnNldDogMCwgaW1hZ2VTaXplOiAwIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGxlYWRlckJ5dGVzID0gdGhpcy50aWYub3B0aW9ucy50aWxlTGVhZGVyQnl0ZVNpemU7XG4gICAgICAgICAgICAvLyBUaGlzIGZldGNoIHdpbGwgZ2VuZXJhbGx5IGxvYWQgaW4gdGhlIGJ5dGVzIG5lZWRlZCBmb3IgdGhlIGltYWdlIHRvb1xuICAgICAgICAgICAgLy8gcHJvdmlkZWQgdGhlIGltYWdlIHNpemUgaXMgbGVzcyB0aGFuIHRoZSBzaXplIG9mIGEgY2h1bmtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudGlmLnNvdXJjZS5sb2FkQnl0ZXMob2Zmc2V0IC0gbGVhZGVyQnl0ZXMsIGxlYWRlckJ5dGVzKTtcbiAgICAgICAgICAgIHJldHVybiB7IG9mZnNldCwgaW1hZ2VTaXplOiB0aGlzLnRpZi5zb3VyY2UuZ2V0VWludChvZmZzZXQgLSBsZWFkZXJCeXRlcywgbGVhZGVyQnl0ZXMpIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBieXRlQ291bnRzID0gdGhpcy50YWdzLmdldChUaWZmVGFnLlRpbGVCeXRlQ291bnRzKSBhcyBDb2dUaWZmVGFnT2Zmc2V0O1xuICAgICAgICBpZiAoYnl0ZUNvdW50cyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRpbGUgYnl0ZSBjb3VudHMgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBbb2Zmc2V0LCBpbWFnZVNpemVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0VGlsZU9mZnNldChpbmRleCksIGJ5dGVDb3VudHMuZ2V0VmFsdWVBdChpbmRleCldKTtcbiAgICAgICAgcmV0dXJuIHsgb2Zmc2V0LCBpbWFnZVNpemUgfTtcbiAgICB9XG59XG4iXX0=