ag-psd 15.0.0 → 15.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.
Files changed (102) hide show
  1. package/TODO +0 -2
  2. package/clean.js +3 -0
  3. package/dist/abr.d.ts +132 -132
  4. package/dist/abr.js +270 -271
  5. package/dist/abr.js.map +1 -0
  6. package/dist/additionalInfo.d.ts +25 -25
  7. package/dist/additionalInfo.js +2026 -2045
  8. package/dist/additionalInfo.js.map +1 -0
  9. package/dist/bundle.js +9133 -8707
  10. package/dist/csh.d.ts +10 -10
  11. package/dist/csh.js +48 -49
  12. package/dist/csh.js.map +1 -0
  13. package/dist/descriptor.d.ts +411 -390
  14. package/dist/descriptor.js +1689 -1644
  15. package/dist/descriptor.js.map +1 -0
  16. package/dist/effectsHelpers.d.ts +5 -5
  17. package/dist/effectsHelpers.js +309 -310
  18. package/dist/effectsHelpers.js.map +1 -0
  19. package/dist/engineData.d.ts +2 -2
  20. package/dist/engineData.js +337 -338
  21. package/dist/engineData.js.map +1 -0
  22. package/dist/helpers.d.ts +93 -93
  23. package/dist/helpers.js +332 -333
  24. package/dist/helpers.js.map +1 -0
  25. package/dist/imageResources.d.ts +13 -13
  26. package/dist/imageResources.js +1007 -788
  27. package/dist/imageResources.js.map +1 -0
  28. package/dist/index.d.ts +20 -20
  29. package/dist/index.js +53 -54
  30. package/dist/index.js.map +1 -0
  31. package/dist/initializeCanvas.d.ts +1 -1
  32. package/dist/initializeCanvas.js +26 -27
  33. package/dist/initializeCanvas.js.map +1 -0
  34. package/dist/jpeg.d.ts +1 -1
  35. package/dist/jpeg.js +1019 -1020
  36. package/dist/jpeg.js.map +1 -0
  37. package/dist/psd.d.ts +1200 -1147
  38. package/dist/psd.js +22 -23
  39. package/dist/psd.js.map +1 -0
  40. package/dist/psdReader.d.ts +36 -34
  41. package/dist/psdReader.js +958 -941
  42. package/dist/psdReader.js.map +1 -0
  43. package/dist/psdWriter.d.ts +27 -27
  44. package/dist/psdWriter.js +694 -690
  45. package/dist/psdWriter.js.map +1 -0
  46. package/dist/text.d.ts +168 -168
  47. package/dist/text.js +557 -558
  48. package/dist/text.js.map +1 -0
  49. package/dist/utf8.d.ts +5 -5
  50. package/dist/utf8.js +152 -153
  51. package/dist/utf8.js.map +1 -0
  52. package/dist-es/abr.d.ts +132 -132
  53. package/dist-es/abr.js +266 -267
  54. package/dist-es/abr.js.map +1 -0
  55. package/dist-es/additionalInfo.d.ts +25 -25
  56. package/dist-es/additionalInfo.js +2020 -2039
  57. package/dist-es/additionalInfo.js.map +1 -0
  58. package/dist-es/csh.d.ts +10 -10
  59. package/dist-es/csh.js +44 -45
  60. package/dist-es/csh.js.map +1 -0
  61. package/dist-es/descriptor.d.ts +411 -390
  62. package/dist-es/descriptor.js +1661 -1616
  63. package/dist-es/descriptor.js.map +1 -0
  64. package/dist-es/effectsHelpers.d.ts +5 -5
  65. package/dist-es/effectsHelpers.js +304 -305
  66. package/dist-es/effectsHelpers.js.map +1 -0
  67. package/dist-es/engineData.d.ts +2 -2
  68. package/dist-es/engineData.js +332 -333
  69. package/dist-es/engineData.js.map +1 -0
  70. package/dist-es/helpers.d.ts +93 -93
  71. package/dist-es/helpers.js +315 -316
  72. package/dist-es/helpers.js.map +1 -0
  73. package/dist-es/imageResources.d.ts +13 -13
  74. package/dist-es/imageResources.js +1004 -785
  75. package/dist-es/imageResources.js.map +1 -0
  76. package/dist-es/index.d.ts +20 -20
  77. package/dist-es/index.js +31 -32
  78. package/dist-es/index.js.map +1 -0
  79. package/dist-es/initializeCanvas.d.ts +1 -1
  80. package/dist-es/initializeCanvas.js +22 -23
  81. package/dist-es/initializeCanvas.js.map +1 -0
  82. package/dist-es/jpeg.d.ts +1 -1
  83. package/dist-es/jpeg.js +1015 -1016
  84. package/dist-es/jpeg.js.map +1 -0
  85. package/dist-es/psd.d.ts +1200 -1147
  86. package/dist-es/psd.js +19 -20
  87. package/dist-es/psd.js.map +1 -0
  88. package/dist-es/psdReader.d.ts +36 -34
  89. package/dist-es/psdReader.js +928 -912
  90. package/dist-es/psdReader.js.map +1 -0
  91. package/dist-es/psdWriter.d.ts +27 -27
  92. package/dist-es/psdWriter.js +670 -666
  93. package/dist-es/psdWriter.js.map +1 -0
  94. package/dist-es/text.d.ts +168 -168
  95. package/dist-es/text.js +552 -553
  96. package/dist-es/text.js.map +1 -0
  97. package/dist-es/utf8.d.ts +5 -5
  98. package/dist-es/utf8.js +145 -146
  99. package/dist-es/utf8.js.map +1 -0
  100. package/package.json +11 -17
  101. package/tsconfig-es6.json +7 -0
  102. package/tsconfig.json +7 -1
@@ -1,912 +1,928 @@
1
- var __assign = (this && this.__assign) || function () {
2
- __assign = Object.assign || function(t) {
3
- for (var s, i = 1, n = arguments.length; i < n; i++) {
4
- s = arguments[i];
5
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
- t[p] = s[p];
7
- }
8
- return t;
9
- };
10
- return __assign.apply(this, arguments);
11
- };
12
- import { inflate } from 'pako';
13
- import { resetImageData, offsetForChannel, decodeBitmap, createCanvas, createImageData, toBlendMode, RAW_IMAGE_DATA, largeAdditionalInfoKeys } from './helpers';
14
- import { infoHandlersMap } from './additionalInfo';
15
- import { resourceHandlersMap } from './imageResources';
16
- export var supportedColorModes = [0 /* ColorMode.Bitmap */, 1 /* ColorMode.Grayscale */, 3 /* ColorMode.RGB */];
17
- var colorModes = ['bitmap', 'grayscale', 'indexed', 'RGB', 'CMYK', 'multichannel', 'duotone', 'lab'];
18
- function setupGrayscale(data) {
19
- var size = data.width * data.height * 4;
20
- for (var i = 0; i < size; i += 4) {
21
- data.data[i + 1] = data.data[i];
22
- data.data[i + 2] = data.data[i];
23
- }
24
- }
25
- export function createReader(buffer, offset, length) {
26
- var view = new DataView(buffer, offset, length);
27
- return { view: view, offset: 0, strict: false };
28
- }
29
- export function readUint8(reader) {
30
- reader.offset += 1;
31
- return reader.view.getUint8(reader.offset - 1);
32
- }
33
- export function peekUint8(reader) {
34
- return reader.view.getUint8(reader.offset);
35
- }
36
- export function readInt16(reader) {
37
- reader.offset += 2;
38
- return reader.view.getInt16(reader.offset - 2, false);
39
- }
40
- export function readUint16(reader) {
41
- reader.offset += 2;
42
- return reader.view.getUint16(reader.offset - 2, false);
43
- }
44
- export function readInt32(reader) {
45
- reader.offset += 4;
46
- return reader.view.getInt32(reader.offset - 4, false);
47
- }
48
- export function readInt32LE(reader) {
49
- reader.offset += 4;
50
- return reader.view.getInt32(reader.offset - 4, true);
51
- }
52
- export function readUint32(reader) {
53
- reader.offset += 4;
54
- return reader.view.getUint32(reader.offset - 4, false);
55
- }
56
- export function readFloat32(reader) {
57
- reader.offset += 4;
58
- return reader.view.getFloat32(reader.offset - 4, false);
59
- }
60
- export function readFloat64(reader) {
61
- reader.offset += 8;
62
- return reader.view.getFloat64(reader.offset - 8, false);
63
- }
64
- // 32-bit fixed-point number 16.16
65
- export function readFixedPoint32(reader) {
66
- return readInt32(reader) / (1 << 16);
67
- }
68
- // 32-bit fixed-point number 8.24
69
- export function readFixedPointPath32(reader) {
70
- return readInt32(reader) / (1 << 24);
71
- }
72
- export function readBytes(reader, length) {
73
- reader.offset += length;
74
- return new Uint8Array(reader.view.buffer, reader.view.byteOffset + reader.offset - length, length);
75
- }
76
- export function readSignature(reader) {
77
- return readShortString(reader, 4);
78
- }
79
- export function readPascalString(reader, padTo) {
80
- var length = readUint8(reader);
81
- var text = length ? readShortString(reader, length) : '';
82
- while (++length % padTo) {
83
- reader.offset++;
84
- }
85
- return text;
86
- }
87
- export function readUnicodeString(reader) {
88
- var length = readUint32(reader);
89
- return readUnicodeStringWithLength(reader, length);
90
- }
91
- export function readUnicodeStringWithLength(reader, length) {
92
- var text = '';
93
- while (length--) {
94
- var value = readUint16(reader);
95
- if (value || length > 0) { // remove trailing \0
96
- text += String.fromCharCode(value);
97
- }
98
- }
99
- return text;
100
- }
101
- export function readAsciiString(reader, length) {
102
- var text = '';
103
- while (length--) {
104
- text += String.fromCharCode(readUint8(reader));
105
- }
106
- return text;
107
- }
108
- export function skipBytes(reader, count) {
109
- reader.offset += count;
110
- }
111
- export function checkSignature(reader, a, b) {
112
- var offset = reader.offset;
113
- var signature = readSignature(reader);
114
- if (signature !== a && signature !== b) {
115
- throw new Error("Invalid signature: '".concat(signature, "' at 0x").concat(offset.toString(16)));
116
- }
117
- }
118
- function readShortString(reader, length) {
119
- var buffer = readBytes(reader, length);
120
- var result = '';
121
- for (var i = 0; i < buffer.length; i++) {
122
- result += String.fromCharCode(buffer[i]);
123
- }
124
- return result;
125
- }
126
- function isValidSignature(sig) {
127
- return sig === '8BIM' || sig === 'MeSa' || sig === 'AgHg' || sig === 'PHUT' || sig === 'DCSR';
128
- }
129
- export function readPsd(reader, options) {
130
- var _a;
131
- if (options === void 0) { options = {}; }
132
- // header
133
- checkSignature(reader, '8BPS');
134
- var version = readUint16(reader);
135
- if (version !== 1 && version !== 2)
136
- throw new Error("Invalid PSD file version: ".concat(version));
137
- skipBytes(reader, 6);
138
- var channels = readUint16(reader);
139
- var height = readUint32(reader);
140
- var width = readUint32(reader);
141
- var bitsPerChannel = readUint16(reader);
142
- var colorMode = readUint16(reader);
143
- var maxSize = version === 1 ? 30000 : 300000;
144
- if (width > maxSize || height > maxSize)
145
- throw new Error("Invalid size");
146
- if (channels > 16)
147
- throw new Error("Invalid channel count");
148
- if (bitsPerChannel > 32)
149
- throw new Error("Invalid bitsPerChannel count");
150
- if (supportedColorModes.indexOf(colorMode) === -1)
151
- throw new Error("Color mode not supported: ".concat((_a = colorModes[colorMode]) !== null && _a !== void 0 ? _a : colorMode));
152
- var psd = { width: width, height: height, channels: channels, bitsPerChannel: bitsPerChannel, colorMode: colorMode };
153
- var opt = __assign(__assign({}, options), { large: version === 2 });
154
- var fixOffsets = [0, 1, -1, 2, -2, 3, -3, 4, -4];
155
- // color mode data
156
- readSection(reader, 1, function (left) {
157
- if (opt.throwForMissingFeatures)
158
- throw new Error('Color mode data not supported');
159
- skipBytes(reader, left());
160
- });
161
- // image resources
162
- readSection(reader, 1, function (left) {
163
- var _loop_1 = function () {
164
- var sigOffset = reader.offset;
165
- var sig = '';
166
- // attempt to fix broken document by realigning with the signature
167
- for (var _i = 0, fixOffsets_1 = fixOffsets; _i < fixOffsets_1.length; _i++) {
168
- var offset = fixOffsets_1[_i];
169
- try {
170
- reader.offset = sigOffset + offset;
171
- sig = readSignature(reader);
172
- }
173
- catch (_a) { }
174
- if (isValidSignature(sig))
175
- break;
176
- }
177
- if (!isValidSignature(sig)) {
178
- throw new Error("Invalid signature: '".concat(sig, "' at 0x").concat((sigOffset).toString(16)));
179
- }
180
- var id = readUint16(reader);
181
- readPascalString(reader, 2); // name
182
- readSection(reader, 2, function (left) {
183
- var handler = resourceHandlersMap[id];
184
- var skip = id === 1036 && !!opt.skipThumbnail;
185
- if (!psd.imageResources) {
186
- psd.imageResources = {};
187
- }
188
- if (handler && !skip) {
189
- try {
190
- handler.read(reader, psd.imageResources, left, opt);
191
- }
192
- catch (e) {
193
- if (opt.throwForMissingFeatures)
194
- throw e;
195
- skipBytes(reader, left());
196
- }
197
- }
198
- else {
199
- // options.logMissingFeatures && console.log(`Unhandled image resource: ${id}`);
200
- skipBytes(reader, left());
201
- }
202
- });
203
- };
204
- while (left()) {
205
- _loop_1();
206
- }
207
- });
208
- // layer and mask info
209
- var globalAlpha = false;
210
- readSection(reader, 1, function (left) {
211
- globalAlpha = readLayerInfo(reader, psd, opt);
212
- // SAI does not include this section
213
- if (left() > 0) {
214
- var globalLayerMaskInfo = readGlobalLayerMaskInfo(reader);
215
- if (globalLayerMaskInfo)
216
- psd.globalLayerMaskInfo = globalLayerMaskInfo;
217
- }
218
- else {
219
- // revert back to end of section if exceeded section limits
220
- // opt.logMissingFeatures && console.log('reverting to end of section');
221
- skipBytes(reader, left());
222
- }
223
- while (left() > 0) {
224
- // sometimes there are empty bytes here
225
- while (left() && peekUint8(reader) === 0) {
226
- // opt.logMissingFeatures && console.log('skipping 0 byte');
227
- skipBytes(reader, 1);
228
- }
229
- if (left() >= 12) {
230
- readAdditionalLayerInfo(reader, psd, psd, opt);
231
- }
232
- else {
233
- // opt.logMissingFeatures && console.log('skipping leftover bytes', left());
234
- skipBytes(reader, left());
235
- }
236
- }
237
- }, undefined, opt.large);
238
- var hasChildren = psd.children && psd.children.length;
239
- var skipComposite = opt.skipCompositeImageData && (opt.skipLayerImageData || hasChildren);
240
- if (!skipComposite) {
241
- readImageData(reader, psd, globalAlpha, opt);
242
- }
243
- // TODO: show converted color mode instead of original PSD file color mode
244
- // but add option to preserve file color mode (need to return image data instead of canvas in that case)
245
- // psd.colorMode = ColorMode.RGB; // we convert all color modes to RGB
246
- return psd;
247
- }
248
- function readLayerInfo(reader, psd, options) {
249
- var globalAlpha = false;
250
- readSection(reader, 2, function (left) {
251
- var layerCount = readInt16(reader);
252
- if (layerCount < 0) {
253
- globalAlpha = true;
254
- layerCount = -layerCount;
255
- }
256
- var layers = [];
257
- var layerChannels = [];
258
- for (var i = 0; i < layerCount; i++) {
259
- var _a = readLayerRecord(reader, psd, options), layer = _a.layer, channels = _a.channels;
260
- layers.push(layer);
261
- layerChannels.push(channels);
262
- }
263
- if (!options.skipLayerImageData) {
264
- for (var i = 0; i < layerCount; i++) {
265
- readLayerChannelImageData(reader, psd, layers[i], layerChannels[i], options);
266
- }
267
- }
268
- skipBytes(reader, left());
269
- if (!psd.children)
270
- psd.children = [];
271
- var stack = [psd];
272
- for (var i = layers.length - 1; i >= 0; i--) {
273
- var l = layers[i];
274
- var type = l.sectionDivider ? l.sectionDivider.type : 0 /* SectionDividerType.Other */;
275
- if (type === 1 /* SectionDividerType.OpenFolder */ || type === 2 /* SectionDividerType.ClosedFolder */) {
276
- l.opened = type === 1 /* SectionDividerType.OpenFolder */;
277
- l.children = [];
278
- stack[stack.length - 1].children.unshift(l);
279
- stack.push(l);
280
- }
281
- else if (type === 3 /* SectionDividerType.BoundingSectionDivider */) {
282
- stack.pop();
283
- // this was workaround because I didn't know what `lsdk` section was, now it's probably not needed anymore
284
- // } else if (l.name === '</Layer group>' && !l.sectionDivider && !l.top && !l.left && !l.bottom && !l.right) {
285
- // // sometimes layer group terminator doesn't have sectionDivider, so we just guess here (PS bug ?)
286
- // stack.pop();
287
- }
288
- else {
289
- stack[stack.length - 1].children.unshift(l);
290
- }
291
- }
292
- }, undefined, options.large);
293
- return globalAlpha;
294
- }
295
- function readLayerRecord(reader, psd, options) {
296
- var layer = {};
297
- layer.top = readInt32(reader);
298
- layer.left = readInt32(reader);
299
- layer.bottom = readInt32(reader);
300
- layer.right = readInt32(reader);
301
- var channelCount = readUint16(reader);
302
- var channels = [];
303
- for (var i = 0; i < channelCount; i++) {
304
- var channelID = readInt16(reader);
305
- var channelLength = readUint32(reader);
306
- if (options.large) {
307
- if (channelLength !== 0)
308
- throw new Error('Sizes larger than 4GB are not supported');
309
- channelLength = readUint32(reader);
310
- }
311
- channels.push({ id: channelID, length: channelLength });
312
- }
313
- checkSignature(reader, '8BIM');
314
- var blendMode = readSignature(reader);
315
- if (!toBlendMode[blendMode])
316
- throw new Error("Invalid blend mode: '".concat(blendMode, "'"));
317
- layer.blendMode = toBlendMode[blendMode];
318
- layer.opacity = readUint8(reader) / 0xff;
319
- layer.clipping = readUint8(reader) === 1;
320
- var flags = readUint8(reader);
321
- layer.transparencyProtected = (flags & 0x01) !== 0;
322
- layer.hidden = (flags & 0x02) !== 0;
323
- // 0x04 - obsolete
324
- // 0x08 - 1 for Photoshop 5.0 and later, tells if bit 4 has useful information
325
- // 0x10 - pixel data irrelevant to appearance of document
326
- // 0x20 - ???
327
- // if (flags & 0x20) (layer as any)._2 = true; // TEMP !!!!
328
- skipBytes(reader, 1);
329
- readSection(reader, 1, function (left) {
330
- var mask = readLayerMaskData(reader, options);
331
- if (mask)
332
- layer.mask = mask;
333
- /*const blendingRanges =*/ readLayerBlendingRanges(reader);
334
- layer.name = readPascalString(reader, 4);
335
- while (left()) {
336
- readAdditionalLayerInfo(reader, layer, psd, options);
337
- }
338
- });
339
- return { layer: layer, channels: channels };
340
- }
341
- function readLayerMaskData(reader, options) {
342
- return readSection(reader, 1, function (left) {
343
- if (!left())
344
- return undefined;
345
- var mask = {};
346
- mask.top = readInt32(reader);
347
- mask.left = readInt32(reader);
348
- mask.bottom = readInt32(reader);
349
- mask.right = readInt32(reader);
350
- mask.defaultColor = readUint8(reader);
351
- var flags = readUint8(reader);
352
- mask.positionRelativeToLayer = (flags & 1 /* LayerMaskFlags.PositionRelativeToLayer */) !== 0;
353
- mask.disabled = (flags & 2 /* LayerMaskFlags.LayerMaskDisabled */) !== 0;
354
- mask.fromVectorData = (flags & 8 /* LayerMaskFlags.LayerMaskFromRenderingOtherData */) !== 0;
355
- if (flags & 16 /* LayerMaskFlags.MaskHasParametersAppliedToIt */) {
356
- var params = readUint8(reader);
357
- if (params & 1 /* MaskParams.UserMaskDensity */)
358
- mask.userMaskDensity = readUint8(reader) / 0xff;
359
- if (params & 2 /* MaskParams.UserMaskFeather */)
360
- mask.userMaskFeather = readFloat64(reader);
361
- if (params & 4 /* MaskParams.VectorMaskDensity */)
362
- mask.vectorMaskDensity = readUint8(reader) / 0xff;
363
- if (params & 8 /* MaskParams.VectorMaskFeather */)
364
- mask.vectorMaskFeather = readFloat64(reader);
365
- }
366
- if (left() > 2) {
367
- options.logMissingFeatures && console.log('Unhandled extra mask params');
368
- // TODO: handle these values
369
- /*const realFlags =*/ readUint8(reader);
370
- /*const realUserMaskBackground =*/ readUint8(reader);
371
- /*const top2 =*/ readInt32(reader);
372
- /*const left2 =*/ readInt32(reader);
373
- /*const bottom2 =*/ readInt32(reader);
374
- /*const right2 =*/ readInt32(reader);
375
- }
376
- skipBytes(reader, left());
377
- return mask;
378
- });
379
- }
380
- function readLayerBlendingRanges(reader) {
381
- return readSection(reader, 1, function (left) {
382
- var compositeGrayBlendSource = readUint32(reader);
383
- var compositeGraphBlendDestinationRange = readUint32(reader);
384
- var ranges = [];
385
- while (left()) {
386
- var sourceRange = readUint32(reader);
387
- var destRange = readUint32(reader);
388
- ranges.push({ sourceRange: sourceRange, destRange: destRange });
389
- }
390
- return { compositeGrayBlendSource: compositeGrayBlendSource, compositeGraphBlendDestinationRange: compositeGraphBlendDestinationRange, ranges: ranges };
391
- });
392
- }
393
- function readLayerChannelImageData(reader, psd, layer, channels, options) {
394
- var layerWidth = (layer.right || 0) - (layer.left || 0);
395
- var layerHeight = (layer.bottom || 0) - (layer.top || 0);
396
- var cmyk = psd.colorMode === 4 /* ColorMode.CMYK */;
397
- var imageData;
398
- if (layerWidth && layerHeight) {
399
- if (cmyk) {
400
- imageData = { width: layerWidth, height: layerHeight, data: new Uint8ClampedArray(layerWidth * layerHeight * 5) };
401
- for (var p = 4; p < imageData.data.byteLength; p += 5)
402
- imageData.data[p] = 255;
403
- }
404
- else {
405
- imageData = createImageData(layerWidth, layerHeight);
406
- resetImageData(imageData);
407
- }
408
- }
409
- if (RAW_IMAGE_DATA)
410
- layer.imageDataRaw = [];
411
- for (var _i = 0, channels_1 = channels; _i < channels_1.length; _i++) {
412
- var channel = channels_1[_i];
413
- if (channel.length === 0)
414
- continue;
415
- if (channel.length < 2)
416
- throw new Error('Invalid channel length');
417
- var start = reader.offset;
418
- var compression = readUint16(reader);
419
- if (channel.id === -2 /* ChannelID.UserMask */) {
420
- var mask = layer.mask;
421
- if (!mask)
422
- throw new Error("Missing layer mask data");
423
- var maskWidth = (mask.right || 0) - (mask.left || 0);
424
- var maskHeight = (mask.bottom || 0) - (mask.top || 0);
425
- if (maskWidth && maskHeight) {
426
- var maskData = createImageData(maskWidth, maskHeight);
427
- resetImageData(maskData);
428
- var start_1 = reader.offset;
429
- readData(reader, channel.length, maskData, compression, maskWidth, maskHeight, 0, options.large, 4);
430
- if (RAW_IMAGE_DATA) {
431
- layer.maskDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start_1, reader.offset - start_1);
432
- }
433
- setupGrayscale(maskData);
434
- if (options.useImageData) {
435
- mask.imageData = maskData;
436
- }
437
- else {
438
- mask.canvas = createCanvas(maskWidth, maskHeight);
439
- mask.canvas.getContext('2d').putImageData(maskData, 0, 0);
440
- }
441
- }
442
- }
443
- else {
444
- var offset = offsetForChannel(channel.id, cmyk);
445
- var targetData = imageData;
446
- if (offset < 0) {
447
- targetData = undefined;
448
- if (options.throwForMissingFeatures) {
449
- throw new Error("Channel not supported: ".concat(channel.id));
450
- }
451
- }
452
- readData(reader, channel.length, targetData, compression, layerWidth, layerHeight, offset, options.large, cmyk ? 5 : 4);
453
- if (RAW_IMAGE_DATA) {
454
- layer.imageDataRaw[channel.id] = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start + 2, channel.length - 2);
455
- }
456
- reader.offset = start + channel.length;
457
- if (targetData && psd.colorMode === 1 /* ColorMode.Grayscale */) {
458
- setupGrayscale(targetData);
459
- }
460
- }
461
- }
462
- if (imageData) {
463
- if (cmyk) {
464
- var cmykData = imageData;
465
- imageData = createImageData(cmykData.width, cmykData.height);
466
- cmykToRgb(cmykData, imageData, false);
467
- }
468
- if (options.useImageData) {
469
- layer.imageData = imageData;
470
- }
471
- else {
472
- layer.canvas = createCanvas(layerWidth, layerHeight);
473
- layer.canvas.getContext('2d').putImageData(imageData, 0, 0);
474
- }
475
- }
476
- }
477
- function readData(reader, length, data, compression, width, height, offset, large, step) {
478
- if (compression === 0 /* Compression.RawData */) {
479
- readDataRaw(reader, data, width, height, step, offset);
480
- }
481
- else if (compression === 1 /* Compression.RleCompressed */) {
482
- readDataRLE(reader, data, width, height, step, [offset], large);
483
- }
484
- else if (compression === 2 /* Compression.ZipWithoutPrediction */) {
485
- readDataZipWithoutPrediction(reader, length, data, width, height, step, offset);
486
- }
487
- else if (compression === 3 /* Compression.ZipWithPrediction */) {
488
- throw new Error("Compression type not supported: ".concat(compression));
489
- }
490
- else {
491
- throw new Error("Invalid Compression type: ".concat(compression));
492
- }
493
- }
494
- function readGlobalLayerMaskInfo(reader) {
495
- return readSection(reader, 1, function (left) {
496
- if (!left())
497
- return undefined;
498
- var overlayColorSpace = readUint16(reader);
499
- var colorSpace1 = readUint16(reader);
500
- var colorSpace2 = readUint16(reader);
501
- var colorSpace3 = readUint16(reader);
502
- var colorSpace4 = readUint16(reader);
503
- var opacity = readUint16(reader) / 0xff;
504
- var kind = readUint8(reader);
505
- skipBytes(reader, left()); // 3 bytes of padding ?
506
- return { overlayColorSpace: overlayColorSpace, colorSpace1: colorSpace1, colorSpace2: colorSpace2, colorSpace3: colorSpace3, colorSpace4: colorSpace4, opacity: opacity, kind: kind };
507
- });
508
- }
509
- function readAdditionalLayerInfo(reader, target, psd, options) {
510
- var sig = readSignature(reader);
511
- if (sig !== '8BIM' && sig !== '8B64')
512
- throw new Error("Invalid signature: '".concat(sig, "' at 0x").concat((reader.offset - 4).toString(16)));
513
- var key = readSignature(reader);
514
- // `largeAdditionalInfoKeys` fallback, because some keys don't have 8B64 signature even when they are 64bit
515
- var u64 = sig === '8B64' || (options.large && largeAdditionalInfoKeys.indexOf(key) !== -1);
516
- readSection(reader, 2, function (left) {
517
- var handler = infoHandlersMap[key];
518
- if (handler) {
519
- try {
520
- handler.read(reader, target, left, psd, options);
521
- }
522
- catch (e) {
523
- if (options.throwForMissingFeatures)
524
- throw e;
525
- }
526
- }
527
- else {
528
- options.logMissingFeatures && console.log("Unhandled additional info: ".concat(key));
529
- skipBytes(reader, left());
530
- }
531
- if (left()) {
532
- options.logMissingFeatures && console.log("Unread ".concat(left(), " bytes left for additional info: ").concat(key));
533
- skipBytes(reader, left());
534
- }
535
- }, false, u64);
536
- }
537
- function readImageData(reader, psd, globalAlpha, options) {
538
- var compression = readUint16(reader);
539
- if (supportedColorModes.indexOf(psd.colorMode) === -1)
540
- throw new Error("Color mode not supported: ".concat(psd.colorMode));
541
- if (compression !== 0 /* Compression.RawData */ && compression !== 1 /* Compression.RleCompressed */)
542
- throw new Error("Compression type not supported: ".concat(compression));
543
- var imageData = createImageData(psd.width, psd.height);
544
- resetImageData(imageData);
545
- switch (psd.colorMode) {
546
- case 0 /* ColorMode.Bitmap */: {
547
- var bytes = void 0;
548
- if (compression === 0 /* Compression.RawData */) {
549
- bytes = readBytes(reader, Math.ceil(psd.width / 8) * psd.height);
550
- }
551
- else if (compression === 1 /* Compression.RleCompressed */) {
552
- bytes = new Uint8Array(psd.width * psd.height);
553
- readDataRLE(reader, { data: bytes, width: psd.width, height: psd.height }, psd.width, psd.height, 1, [0], options.large);
554
- }
555
- else {
556
- throw new Error("Bitmap compression not supported: ".concat(compression));
557
- }
558
- decodeBitmap(bytes, imageData.data, psd.width, psd.height);
559
- break;
560
- }
561
- case 3 /* ColorMode.RGB */:
562
- case 1 /* ColorMode.Grayscale */: {
563
- var channels = psd.colorMode === 1 /* ColorMode.Grayscale */ ? [0] : [0, 1, 2];
564
- if (psd.channels && psd.channels > 3) {
565
- for (var i = 3; i < psd.channels; i++) {
566
- // TODO: store these channels in additional image data
567
- channels.push(i);
568
- }
569
- }
570
- else if (globalAlpha) {
571
- channels.push(3);
572
- }
573
- if (compression === 0 /* Compression.RawData */) {
574
- for (var i = 0; i < channels.length; i++) {
575
- readDataRaw(reader, imageData, psd.width, psd.height, 4, channels[i]);
576
- }
577
- }
578
- else if (compression === 1 /* Compression.RleCompressed */) {
579
- var start = reader.offset;
580
- readDataRLE(reader, imageData, psd.width, psd.height, 4, channels, options.large);
581
- if (RAW_IMAGE_DATA)
582
- psd.imageDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start, reader.offset - start);
583
- }
584
- if (psd.colorMode === 1 /* ColorMode.Grayscale */) {
585
- setupGrayscale(imageData);
586
- }
587
- break;
588
- }
589
- case 4 /* ColorMode.CMYK */: {
590
- if (psd.channels !== 4)
591
- throw new Error("Invalid channel count");
592
- var channels = [0, 1, 2, 3];
593
- if (globalAlpha)
594
- channels.push(4);
595
- if (compression === 0 /* Compression.RawData */) {
596
- throw new Error("Not implemented");
597
- // TODO: ...
598
- // for (let i = 0; i < channels.length; i++) {
599
- // readDataRaw(reader, imageData, channels[i], psd.width, psd.height);
600
- // }
601
- }
602
- else if (compression === 1 /* Compression.RleCompressed */) {
603
- var cmykImageData = {
604
- width: imageData.width,
605
- height: imageData.height,
606
- data: new Uint8Array(imageData.width * imageData.height * 5),
607
- };
608
- var start = reader.offset;
609
- readDataRLE(reader, cmykImageData, psd.width, psd.height, 5, channels, options.large);
610
- cmykToRgb(cmykImageData, imageData, true);
611
- if (RAW_IMAGE_DATA)
612
- psd.imageDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start, reader.offset - start);
613
- }
614
- break;
615
- }
616
- default: throw new Error("Color mode not supported: ".concat(psd.colorMode));
617
- }
618
- if (options.useImageData) {
619
- psd.imageData = imageData;
620
- }
621
- else {
622
- psd.canvas = createCanvas(psd.width, psd.height);
623
- psd.canvas.getContext('2d').putImageData(imageData, 0, 0);
624
- }
625
- }
626
- function cmykToRgb(cmyk, rgb, reverseAlpha) {
627
- var size = rgb.width * rgb.height * 4;
628
- var srcData = cmyk.data;
629
- var dstData = rgb.data;
630
- for (var src = 0, dst = 0; dst < size; src += 5, dst += 4) {
631
- var c = srcData[src];
632
- var m = srcData[src + 1];
633
- var y = srcData[src + 2];
634
- var k = srcData[src + 3];
635
- dstData[dst] = ((((c * k) | 0) / 255) | 0);
636
- dstData[dst + 1] = ((((m * k) | 0) / 255) | 0);
637
- dstData[dst + 2] = ((((y * k) | 0) / 255) | 0);
638
- dstData[dst + 3] = reverseAlpha ? 255 - srcData[src + 4] : srcData[src + 4];
639
- }
640
- // for (let src = 0, dst = 0; dst < size; src += 5, dst += 4) {
641
- // const c = 1 - (srcData[src + 0] / 255);
642
- // const m = 1 - (srcData[src + 1] / 255);
643
- // const y = 1 - (srcData[src + 2] / 255);
644
- // // const k = srcData[src + 3] / 255;
645
- // dstData[dst + 0] = ((1 - c * 0.8) * 255) | 0;
646
- // dstData[dst + 1] = ((1 - m * 0.8) * 255) | 0;
647
- // dstData[dst + 2] = ((1 - y * 0.8) * 255) | 0;
648
- // dstData[dst + 3] = reverseAlpha ? 255 - srcData[src + 4] : srcData[src + 4];
649
- // }
650
- }
651
- function readDataRaw(reader, pixelData, width, height, step, offset) {
652
- var size = width * height;
653
- var buffer = readBytes(reader, size);
654
- if (pixelData && offset < step) {
655
- var data = pixelData.data;
656
- for (var i = 0, p = offset | 0; i < size; i++, p = (p + step) | 0) {
657
- data[p] = buffer[i];
658
- }
659
- }
660
- }
661
- export function readDataZipWithoutPrediction(reader, length, pixelData, width, height, step, offset) {
662
- var compressed = readBytes(reader, length);
663
- var decompressed = inflate(compressed);
664
- var size = width * height;
665
- if (pixelData && offset < step) {
666
- var data = pixelData.data;
667
- for (var i = 0, p = offset | 0; i < size; i++, p = (p + step) | 0) {
668
- data[p] = decompressed[i];
669
- }
670
- }
671
- }
672
- export function readDataRLE(reader, pixelData, _width, height, step, offsets, large) {
673
- var data = pixelData && pixelData.data;
674
- var lengths;
675
- if (large) {
676
- lengths = new Uint32Array(offsets.length * height);
677
- for (var o = 0, li = 0; o < offsets.length; o++) {
678
- for (var y = 0; y < height; y++, li++) {
679
- lengths[li] = readUint32(reader);
680
- }
681
- }
682
- }
683
- else {
684
- lengths = new Uint16Array(offsets.length * height);
685
- for (var o = 0, li = 0; o < offsets.length; o++) {
686
- for (var y = 0; y < height; y++, li++) {
687
- lengths[li] = readUint16(reader);
688
- }
689
- }
690
- }
691
- var extraLimit = (step - 1) | 0; // 3 for rgb, 4 for cmyk
692
- for (var c = 0, li = 0; c < offsets.length; c++) {
693
- var offset = offsets[c] | 0;
694
- var extra = c > extraLimit || offset > extraLimit;
695
- if (!data || extra) {
696
- for (var y = 0; y < height; y++, li++) {
697
- skipBytes(reader, lengths[li]);
698
- }
699
- }
700
- else {
701
- for (var y = 0, p = offset | 0; y < height; y++, li++) {
702
- var length_1 = lengths[li];
703
- var buffer = readBytes(reader, length_1);
704
- for (var i = 0; i < length_1; i++) {
705
- var header = buffer[i];
706
- if (header > 128) {
707
- var value = buffer[++i];
708
- header = (256 - header) | 0;
709
- for (var j = 0; j <= header; j = (j + 1) | 0) {
710
- data[p] = value;
711
- p = (p + step) | 0;
712
- }
713
- }
714
- else if (header < 128) {
715
- for (var j = 0; j <= header; j = (j + 1) | 0) {
716
- data[p] = buffer[++i];
717
- p = (p + step) | 0;
718
- }
719
- }
720
- else {
721
- // ignore 128
722
- }
723
- if (i >= length_1) {
724
- throw new Error("Invalid RLE data: exceeded buffer size ".concat(i, "/").concat(length_1));
725
- }
726
- }
727
- }
728
- }
729
- }
730
- }
731
- export function readSection(reader, round, func, skipEmpty, eightBytes) {
732
- if (skipEmpty === void 0) { skipEmpty = true; }
733
- if (eightBytes === void 0) { eightBytes = false; }
734
- var length = readUint32(reader);
735
- if (eightBytes) {
736
- if (length !== 0)
737
- throw new Error('Sizes larger than 4GB are not supported');
738
- length = readUint32(reader);
739
- }
740
- if (length <= 0 && skipEmpty)
741
- return undefined;
742
- var end = reader.offset + length;
743
- if (end > reader.view.byteLength)
744
- throw new Error('Section exceeds file size');
745
- var result = func(function () { return end - reader.offset; });
746
- if (reader.offset !== end && reader.strict) {
747
- if (reader.offset > end) {
748
- // throw new Error('Exceeded section limits');
749
- console.warn('Exceeded section limits');
750
- }
751
- else {
752
- // throw new Error(`Unread section data: ${end - reader.offset} bytes at 0x${reader.offset.toString(16)}`);
753
- console.warn('Unread section data');
754
- }
755
- }
756
- while (end % round)
757
- end++;
758
- reader.offset = end;
759
- return result;
760
- }
761
- export function readColor(reader) {
762
- var colorSpace = readUint16(reader);
763
- switch (colorSpace) {
764
- case 0 /* ColorSpace.RGB */: {
765
- var r = readUint16(reader) / 257;
766
- var g = readUint16(reader) / 257;
767
- var b = readUint16(reader) / 257;
768
- skipBytes(reader, 2);
769
- return { r: r, g: g, b: b };
770
- }
771
- case 1 /* ColorSpace.HSB */: {
772
- var h = readUint16(reader) / 0xffff;
773
- var s = readUint16(reader) / 0xffff;
774
- var b = readUint16(reader) / 0xffff;
775
- skipBytes(reader, 2);
776
- return { h: h, s: s, b: b };
777
- }
778
- case 2 /* ColorSpace.CMYK */: {
779
- var c = readUint16(reader) / 257;
780
- var m = readUint16(reader) / 257;
781
- var y = readUint16(reader) / 257;
782
- var k = readUint16(reader) / 257;
783
- return { c: c, m: m, y: y, k: k };
784
- }
785
- case 7 /* ColorSpace.Lab */: {
786
- var l = readInt16(reader) / 10000;
787
- var ta = readInt16(reader);
788
- var tb = readInt16(reader);
789
- var a = ta < 0 ? (ta / 12800) : (ta / 12700);
790
- var b = tb < 0 ? (tb / 12800) : (tb / 12700);
791
- skipBytes(reader, 2);
792
- return { l: l, a: a, b: b };
793
- }
794
- case 8 /* ColorSpace.Grayscale */: {
795
- var k = readUint16(reader) * 255 / 10000;
796
- skipBytes(reader, 6);
797
- return { k: k };
798
- }
799
- default:
800
- throw new Error('Invalid color space');
801
- }
802
- }
803
- export function readPattern(reader) {
804
- readUint32(reader); // length
805
- var version = readUint32(reader);
806
- if (version !== 1)
807
- throw new Error("Invalid pattern version: ".concat(version));
808
- var colorMode = readUint32(reader);
809
- var x = readInt16(reader);
810
- var y = readInt16(reader);
811
- // we only support RGB and grayscale for now
812
- if (colorMode !== 3 /* ColorMode.RGB */ && colorMode !== 1 /* ColorMode.Grayscale */ && colorMode !== 2 /* ColorMode.Indexed */) {
813
- throw new Error("Unsupported pattern color mode: ".concat(colorMode));
814
- }
815
- var name = readUnicodeString(reader);
816
- var id = readPascalString(reader, 1);
817
- var palette = [];
818
- if (colorMode === 2 /* ColorMode.Indexed */) {
819
- for (var i = 0; i < 256; i++) {
820
- palette.push({
821
- r: readUint8(reader),
822
- g: readUint8(reader),
823
- b: readUint8(reader),
824
- });
825
- }
826
- skipBytes(reader, 4); // no idea what this is
827
- }
828
- // virtual memory array list
829
- var version2 = readUint32(reader);
830
- if (version2 !== 3)
831
- throw new Error("Invalid pattern VMAL version: ".concat(version2));
832
- readUint32(reader); // length
833
- var top = readUint32(reader);
834
- var left = readUint32(reader);
835
- var bottom = readUint32(reader);
836
- var right = readUint32(reader);
837
- var channelsCount = readUint32(reader);
838
- var width = right - left;
839
- var height = bottom - top;
840
- var data = new Uint8Array(width * height * 4);
841
- for (var i = 3; i < data.byteLength; i += 4) {
842
- data[i] = 255;
843
- }
844
- for (var i = 0, ch = 0; i < (channelsCount + 2); i++) {
845
- var has = readUint32(reader);
846
- if (!has)
847
- continue;
848
- var length_2 = readUint32(reader);
849
- var pixelDepth = readUint32(reader);
850
- var ctop = readUint32(reader);
851
- var cleft = readUint32(reader);
852
- var cbottom = readUint32(reader);
853
- var cright = readUint32(reader);
854
- var pixelDepth2 = readUint16(reader);
855
- var compressionMode = readUint8(reader); // 0 - raw, 1 - zip
856
- var dataLength = length_2 - (4 + 16 + 2 + 1);
857
- var cdata = readBytes(reader, dataLength);
858
- if (pixelDepth !== 8 || pixelDepth2 !== 8) {
859
- throw new Error('16bit pixel depth not supported for patterns');
860
- }
861
- var w = cright - cleft;
862
- var h = cbottom - ctop;
863
- var ox = cleft - left;
864
- var oy = ctop - top;
865
- if (compressionMode === 0) {
866
- if (colorMode === 3 /* ColorMode.RGB */ && ch < 3) {
867
- for (var y_1 = 0; y_1 < h; y_1++) {
868
- for (var x_1 = 0; x_1 < w; x_1++) {
869
- var src = x_1 + y_1 * w;
870
- var dst = (ox + x_1 + (y_1 + oy) * width) * 4;
871
- data[dst + ch] = cdata[src];
872
- }
873
- }
874
- }
875
- if (colorMode === 1 /* ColorMode.Grayscale */ && ch < 1) {
876
- for (var y_2 = 0; y_2 < h; y_2++) {
877
- for (var x_2 = 0; x_2 < w; x_2++) {
878
- var src = x_2 + y_2 * w;
879
- var dst = (ox + x_2 + (y_2 + oy) * width) * 4;
880
- var value = cdata[src];
881
- data[dst + 0] = value;
882
- data[dst + 1] = value;
883
- data[dst + 2] = value;
884
- }
885
- }
886
- }
887
- if (colorMode === 2 /* ColorMode.Indexed */) {
888
- // TODO:
889
- throw new Error('Indexed pattern color mode not implemented');
890
- }
891
- }
892
- else if (compressionMode === 1) {
893
- // console.log({ colorMode });
894
- // require('fs').writeFileSync('zip.bin', Buffer.from(cdata));
895
- // const data = require('zlib').inflateRawSync(cdata);
896
- // const data = require('zlib').unzipSync(cdata);
897
- // console.log(data);
898
- // throw new Error('Zip compression not supported for pattern');
899
- // throw new Error('Unsupported pattern compression');
900
- console.error('Unsupported pattern compression');
901
- name += ' (failed to decode)';
902
- }
903
- else {
904
- throw new Error('Invalid pattern compression mode');
905
- }
906
- ch++;
907
- }
908
- // TODO: use canvas instead of data ?
909
- return { id: id, name: name, x: x, y: y, bounds: { x: left, y: top, w: width, h: height }, data: data };
910
- }
911
-
912
- //# sourceMappingURL=data:application/json;charset=utf8;base64,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QUMsa0NBQWtDLENBQUMsQ0FBQztTQUNwRDtRQUVELEVBQUUsRUFBRSxDQUFDO0tBQ0w7SUFFRCxxQ0FBcUM7SUFFckMsT0FBTyxFQUFFLEVBQUUsSUFBQSxFQUFFLElBQUksTUFBQSxFQUFFLENBQUMsR0FBQSxFQUFFLENBQUMsR0FBQSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLE1BQUEsRUFBRSxDQUFDO0FBQ25GLENBQUMiLCJmaWxlIjoicHNkUmVhZGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5mbGF0ZSB9IGZyb20gJ3Bha28nO1xuaW1wb3J0IHtcblx0UHNkLCBMYXllciwgQ29sb3JNb2RlLCBTZWN0aW9uRGl2aWRlclR5cGUsIExheWVyQWRkaXRpb25hbEluZm8sIFJlYWRPcHRpb25zLCBMYXllck1hc2tEYXRhLCBDb2xvcixcblx0UGF0dGVybkluZm8sIEdsb2JhbExheWVyTWFza0luZm8sIFJHQlxufSBmcm9tICcuL3BzZCc7XG5pbXBvcnQge1xuXHRyZXNldEltYWdlRGF0YSwgb2Zmc2V0Rm9yQ2hhbm5lbCwgZGVjb2RlQml0bWFwLCBQaXhlbERhdGEsIGNyZWF0ZUNhbnZhcywgY3JlYXRlSW1hZ2VEYXRhLFxuXHR0b0JsZW5kTW9kZSwgQ2hhbm5lbElELCBDb21wcmVzc2lvbiwgTGF5ZXJNYXNrRmxhZ3MsIE1hc2tQYXJhbXMsIENvbG9yU3BhY2UsIFJBV19JTUFHRV9EQVRBLCBsYXJnZUFkZGl0aW9uYWxJbmZvS2V5c1xufSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgaW5mb0hhbmRsZXJzTWFwIH0gZnJvbSAnLi9hZGRpdGlvbmFsSW5mbyc7XG5pbXBvcnQgeyByZXNvdXJjZUhhbmRsZXJzTWFwIH0gZnJvbSAnLi9pbWFnZVJlc291cmNlcyc7XG5cbmludGVyZmFjZSBDaGFubmVsSW5mbyB7XG5cdGlkOiBDaGFubmVsSUQ7XG5cdGxlbmd0aDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUmVhZE9wdGlvbnNFeHQgZXh0ZW5kcyBSZWFkT3B0aW9ucyB7XG5cdGxhcmdlOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3Qgc3VwcG9ydGVkQ29sb3JNb2RlcyA9IFtDb2xvck1vZGUuQml0bWFwLCBDb2xvck1vZGUuR3JheXNjYWxlLCBDb2xvck1vZGUuUkdCXTtcbmNvbnN0IGNvbG9yTW9kZXMgPSBbJ2JpdG1hcCcsICdncmF5c2NhbGUnLCAnaW5kZXhlZCcsICdSR0InLCAnQ01ZSycsICdtdWx0aWNoYW5uZWwnLCAnZHVvdG9uZScsICdsYWInXTtcblxuZnVuY3Rpb24gc2V0dXBHcmF5c2NhbGUoZGF0YTogUGl4ZWxEYXRhKSB7XG5cdGNvbnN0IHNpemUgPSBkYXRhLndpZHRoICogZGF0YS5oZWlnaHQgKiA0O1xuXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSArPSA0KSB7XG5cdFx0ZGF0YS5kYXRhW2kgKyAxXSA9IGRhdGEuZGF0YVtpXTtcblx0XHRkYXRhLmRhdGFbaSArIDJdID0gZGF0YS5kYXRhW2ldO1xuXHR9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHNkUmVhZGVyIHtcblx0b2Zmc2V0OiBudW1iZXI7XG5cdHZpZXc6IERhdGFWaWV3O1xuXHRzdHJpY3Q6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWFkZXIoYnVmZmVyOiBBcnJheUJ1ZmZlciwgb2Zmc2V0PzogbnVtYmVyLCBsZW5ndGg/OiBudW1iZXIpOiBQc2RSZWFkZXIge1xuXHRjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpO1xuXHRyZXR1cm4geyB2aWV3LCBvZmZzZXQ6IDAsIHN0cmljdDogZmFsc2UgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRVaW50OChyZWFkZXI6IFBzZFJlYWRlcikge1xuXHRyZWFkZXIub2Zmc2V0ICs9IDE7XG5cdHJldHVybiByZWFkZXIudmlldy5nZXRVaW50OChyZWFkZXIub2Zmc2V0IC0gMSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwZWVrVWludDgocmVhZGVyOiBQc2RSZWFkZXIpIHtcblx0cmV0dXJuIHJlYWRlci52aWV3LmdldFVpbnQ4KHJlYWRlci5vZmZzZXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEludDE2KHJlYWRlcjogUHNkUmVhZGVyKSB7XG5cdHJlYWRlci5vZmZzZXQgKz0gMjtcblx0cmV0dXJuIHJlYWRlci52aWV3LmdldEludDE2KHJlYWRlci5vZmZzZXQgLSAyLCBmYWxzZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkVWludDE2KHJlYWRlcjogUHNkUmVhZGVyKSB7XG5cdHJlYWRlci5vZmZzZXQgKz0gMjtcblx0cmV0dXJuIHJlYWRlci52aWV3LmdldFVpbnQxNihyZWFkZXIub2Zmc2V0IC0gMiwgZmFsc2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEludDMyKHJlYWRlcjogUHNkUmVhZGVyKSB7XG5cdHJlYWRlci5vZmZzZXQgKz0gNDtcblx0cmV0dXJuIHJlYWRlci52aWV3LmdldEludDMyKHJlYWRlci5vZmZzZXQgLSA0LCBmYWxzZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkSW50MzJMRShyZWFkZXI6IFBzZFJlYWRlcikge1xuXHRyZWFkZXIub2Zmc2V0ICs9IDQ7XG5cdHJldHVybiByZWFkZXIudmlldy5nZXRJbnQzMihyZWFkZXIub2Zmc2V0IC0gNCwgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkVWludDMyKHJlYWRlcjogUHNkUmVhZGVyKSB7XG5cdHJlYWRlci5vZmZzZXQgKz0gNDtcblx0cmV0dXJuIHJlYWRlci52aWV3LmdldFVpbnQzMihyZWFkZXIub2Zmc2V0IC0gNCwgZmFsc2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZsb2F0MzIocmVhZGVyOiBQc2RSZWFkZXIpIHtcblx0cmVhZGVyLm9mZnNldCArPSA0O1xuXHRyZXR1cm4gcmVhZGVyLnZpZXcuZ2V0RmxvYXQzMihyZWFkZXIub2Zmc2V0IC0gNCwgZmFsc2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZsb2F0NjQocmVhZGVyOiBQc2RSZWFkZXIpIHtcblx0cmVhZGVyLm9mZnNldCArPSA4O1xuXHRyZXR1cm4gcmVhZGVyLnZpZXcuZ2V0RmxvYXQ2NChyZWFkZXIub2Zmc2V0IC0gOCwgZmFsc2UpO1xufVxuXG4vLyAzMi1iaXQgZml4ZWQtcG9pbnQgbnVtYmVyIDE2LjE2XG5leHBvcnQgZnVuY3Rpb24gcmVhZEZpeGVkUG9pbnQzMihyZWFkZXI6IFBzZFJlYWRlcik6IG51bWJlciB7XG5cdHJldHVybiByZWFkSW50MzIocmVhZGVyKSAvICgxIDw8IDE2KTtcbn1cblxuLy8gMzItYml0IGZpeGVkLXBvaW50IG51bWJlciA4LjI0XG5leHBvcnQgZnVuY3Rpb24gcmVhZEZpeGVkUG9pbnRQYXRoMzIocmVhZGVyOiBQc2RSZWFkZXIpOiBudW1iZXIge1xuXHRyZXR1cm4gcmVhZEludDMyKHJlYWRlcikgLyAoMSA8PCAyNCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkQnl0ZXMocmVhZGVyOiBQc2RSZWFkZXIsIGxlbmd0aDogbnVtYmVyKSB7XG5cdHJlYWRlci5vZmZzZXQgKz0gbGVuZ3RoO1xuXHRyZXR1cm4gbmV3IFVpbnQ4QXJyYXkocmVhZGVyLnZpZXcuYnVmZmVyLCByZWFkZXIudmlldy5ieXRlT2Zmc2V0ICsgcmVhZGVyLm9mZnNldCAtIGxlbmd0aCwgbGVuZ3RoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRTaWduYXR1cmUocmVhZGVyOiBQc2RSZWFkZXIpIHtcblx0cmV0dXJuIHJlYWRTaG9ydFN0cmluZyhyZWFkZXIsIDQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFBhc2NhbFN0cmluZyhyZWFkZXI6IFBzZFJlYWRlciwgcGFkVG86IG51bWJlcikge1xuXHRsZXQgbGVuZ3RoID0gcmVhZFVpbnQ4KHJlYWRlcik7XG5cdGNvbnN0IHRleHQgPSBsZW5ndGggPyByZWFkU2hvcnRTdHJpbmcocmVhZGVyLCBsZW5ndGgpIDogJyc7XG5cblx0d2hpbGUgKCsrbGVuZ3RoICUgcGFkVG8pIHtcblx0XHRyZWFkZXIub2Zmc2V0Kys7XG5cdH1cblxuXHRyZXR1cm4gdGV4dDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRVbmljb2RlU3RyaW5nKHJlYWRlcjogUHNkUmVhZGVyKSB7XG5cdGNvbnN0IGxlbmd0aCA9IHJlYWRVaW50MzIocmVhZGVyKTtcblx0cmV0dXJuIHJlYWRVbmljb2RlU3RyaW5nV2l0aExlbmd0aChyZWFkZXIsIGxlbmd0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkVW5pY29kZVN0cmluZ1dpdGhMZW5ndGgocmVhZGVyOiBQc2RSZWFkZXIsIGxlbmd0aDogbnVtYmVyKSB7XG5cdGxldCB0ZXh0ID0gJyc7XG5cblx0d2hpbGUgKGxlbmd0aC0tKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSByZWFkVWludDE2KHJlYWRlcik7XG5cblx0XHRpZiAodmFsdWUgfHwgbGVuZ3RoID4gMCkgeyAvLyByZW1vdmUgdHJhaWxpbmcgXFwwXG5cdFx0XHR0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0ZXh0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFzY2lpU3RyaW5nKHJlYWRlcjogUHNkUmVhZGVyLCBsZW5ndGg6IG51bWJlcikge1xuXHRsZXQgdGV4dCA9ICcnO1xuXG5cdHdoaWxlIChsZW5ndGgtLSkge1xuXHRcdHRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShyZWFkVWludDgocmVhZGVyKSk7XG5cdH1cblxuXHRyZXR1cm4gdGV4dDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNraXBCeXRlcyhyZWFkZXI6IFBzZFJlYWRlciwgY291bnQ6IG51bWJlcikge1xuXHRyZWFkZXIub2Zmc2V0ICs9IGNvdW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tTaWduYXR1cmUocmVhZGVyOiBQc2RSZWFkZXIsIGE6IHN0cmluZywgYj86IHN0cmluZykge1xuXHRjb25zdCBvZmZzZXQgPSByZWFkZXIub2Zmc2V0O1xuXHRjb25zdCBzaWduYXR1cmUgPSByZWFkU2lnbmF0dXJlKHJlYWRlcik7XG5cblx0aWYgKHNpZ25hdHVyZSAhPT0gYSAmJiBzaWduYXR1cmUgIT09IGIpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2lnbmF0dXJlOiAnJHtzaWduYXR1cmV9JyBhdCAweCR7b2Zmc2V0LnRvU3RyaW5nKDE2KX1gKTtcblx0fVxufVxuXG5mdW5jdGlvbiByZWFkU2hvcnRTdHJpbmcocmVhZGVyOiBQc2RSZWFkZXIsIGxlbmd0aDogbnVtYmVyKSB7XG5cdGNvbnN0IGJ1ZmZlciA9IHJlYWRCeXRlcyhyZWFkZXIsIGxlbmd0aCk7XG5cdGxldCByZXN1bHQgPSAnJztcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykge1xuXHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZmZlcltpXSk7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkU2lnbmF0dXJlKHNpZzogc3RyaW5nKSB7XG5cdHJldHVybiBzaWcgPT09ICc4QklNJyB8fCBzaWcgPT09ICdNZVNhJyB8fCBzaWcgPT09ICdBZ0hnJyB8fCBzaWcgPT09ICdQSFVUJyB8fCBzaWcgPT09ICdEQ1NSJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRQc2QocmVhZGVyOiBQc2RSZWFkZXIsIG9wdGlvbnM6IFJlYWRPcHRpb25zID0ge30pIHtcblx0Ly8gaGVhZGVyXG5cdGNoZWNrU2lnbmF0dXJlKHJlYWRlciwgJzhCUFMnKTtcblx0Y29uc3QgdmVyc2lvbiA9IHJlYWRVaW50MTYocmVhZGVyKTtcblx0aWYgKHZlcnNpb24gIT09IDEgJiYgdmVyc2lvbiAhPT0gMikgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFBTRCBmaWxlIHZlcnNpb246ICR7dmVyc2lvbn1gKTtcblxuXHRza2lwQnl0ZXMocmVhZGVyLCA2KTtcblx0Y29uc3QgY2hhbm5lbHMgPSByZWFkVWludDE2KHJlYWRlcik7XG5cdGNvbnN0IGhlaWdodCA9IHJlYWRVaW50MzIocmVhZGVyKTtcblx0Y29uc3Qgd2lkdGggPSByZWFkVWludDMyKHJlYWRlcik7XG5cdGNvbnN0IGJpdHNQZXJDaGFubmVsID0gcmVhZFVpbnQxNihyZWFkZXIpO1xuXHRjb25zdCBjb2xvck1vZGUgPSByZWFkVWludDE2KHJlYWRlcik7XG5cdGNvbnN0IG1heFNpemUgPSB2ZXJzaW9uID09PSAxID8gMzAwMDAgOiAzMDAwMDA7XG5cblx0aWYgKHdpZHRoID4gbWF4U2l6ZSB8fCBoZWlnaHQgPiBtYXhTaXplKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZWApO1xuXHRpZiAoY2hhbm5lbHMgPiAxNikgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYW5uZWwgY291bnRgKTtcblx0aWYgKGJpdHNQZXJDaGFubmVsID4gMzIpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBiaXRzUGVyQ2hhbm5lbCBjb3VudGApO1xuXHRpZiAoc3VwcG9ydGVkQ29sb3JNb2Rlcy5pbmRleE9mKGNvbG9yTW9kZSkgPT09IC0xKVxuXHRcdHRocm93IG5ldyBFcnJvcihgQ29sb3IgbW9kZSBub3Qgc3VwcG9ydGVkOiAke2NvbG9yTW9kZXNbY29sb3JNb2RlXSA/PyBjb2xvck1vZGV9YCk7XG5cblx0Y29uc3QgcHNkOiBQc2QgPSB7IHdpZHRoLCBoZWlnaHQsIGNoYW5uZWxzLCBiaXRzUGVyQ2hhbm5lbCwgY29sb3JNb2RlIH07XG5cdGNvbnN0IG9wdDogUmVhZE9wdGlvbnNFeHQgPSB7IC4uLm9wdGlvbnMsIGxhcmdlOiB2ZXJzaW9uID09PSAyIH07XG5cdGNvbnN0IGZpeE9mZnNldHMgPSBbMCwgMSwgLTEsIDIsIC0yLCAzLCAtMywgNCwgLTRdO1xuXG5cdC8vIGNvbG9yIG1vZGUgZGF0YVxuXHRyZWFkU2VjdGlvbihyZWFkZXIsIDEsIGxlZnQgPT4ge1xuXHRcdGlmIChvcHQudGhyb3dGb3JNaXNzaW5nRmVhdHVyZXMpIHRocm93IG5ldyBFcnJvcignQ29sb3IgbW9kZSBkYXRhIG5vdCBzdXBwb3J0ZWQnKTtcblx0XHRza2lwQnl0ZXMocmVhZGVyLCBsZWZ0KCkpO1xuXHR9KTtcblxuXHQvLyBpbWFnZSByZXNvdXJjZXNcblx0cmVhZFNlY3Rpb24ocmVhZGVyLCAxLCBsZWZ0ID0+IHtcblx0XHR3aGlsZSAobGVmdCgpKSB7XG5cdFx0XHRjb25zdCBzaWdPZmZzZXQgPSByZWFkZXIub2Zmc2V0O1xuXHRcdFx0bGV0IHNpZyA9ICcnO1xuXG5cdFx0XHQvLyBhdHRlbXB0IHRvIGZpeCBicm9rZW4gZG9jdW1lbnQgYnkgcmVhbGlnbmluZyB3aXRoIHRoZSBzaWduYXR1cmVcblx0XHRcdGZvciAoY29uc3Qgb2Zmc2V0IG9mIGZpeE9mZnNldHMpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRyZWFkZXIub2Zmc2V0ID0gc2lnT2Zmc2V0ICsgb2Zmc2V0O1xuXHRcdFx0XHRcdHNpZyA9IHJlYWRTaWduYXR1cmUocmVhZGVyKTtcblx0XHRcdFx0fSBjYXRjaCB7IH1cblx0XHRcdFx0aWYgKGlzVmFsaWRTaWduYXR1cmUoc2lnKSkgYnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaXNWYWxpZFNpZ25hdHVyZShzaWcpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaWduYXR1cmU6ICcke3NpZ30nIGF0IDB4JHsoc2lnT2Zmc2V0KS50b1N0cmluZygxNil9YCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGlkID0gcmVhZFVpbnQxNihyZWFkZXIpO1xuXHRcdFx0cmVhZFBhc2NhbFN0cmluZyhyZWFkZXIsIDIpOyAvLyBuYW1lXG5cblx0XHRcdHJlYWRTZWN0aW9uKHJlYWRlciwgMiwgbGVmdCA9PiB7XG5cdFx0XHRcdGNvbnN0IGhhbmRsZXIgPSByZXNvdXJjZUhhbmRsZXJzTWFwW2lkXTtcblx0XHRcdFx0Y29uc3Qgc2tpcCA9IGlkID09PSAxMDM2ICYmICEhb3B0LnNraXBUaHVtYm5haWw7XG5cblx0XHRcdFx0aWYgKCFwc2QuaW1hZ2VSZXNvdXJjZXMpIHtcblx0XHRcdFx0XHRwc2QuaW1hZ2VSZXNvdXJjZXMgPSB7fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChoYW5kbGVyICYmICFza2lwKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGhhbmRsZXIucmVhZChyZWFkZXIsIHBzZC5pbWFnZVJlc291cmNlcywgbGVmdCwgb3B0KTtcblx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0XHRpZiAob3B0LnRocm93Rm9yTWlzc2luZ0ZlYXR1cmVzKSB0aHJvdyBlO1xuXHRcdFx0XHRcdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gb3B0aW9ucy5sb2dNaXNzaW5nRmVhdHVyZXMgJiYgY29uc29sZS5sb2coYFVuaGFuZGxlZCBpbWFnZSByZXNvdXJjZTogJHtpZH1gKTtcblx0XHRcdFx0XHRza2lwQnl0ZXMocmVhZGVyLCBsZWZ0KCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0pO1xuXG5cdC8vIGxheWVyIGFuZCBtYXNrIGluZm9cblx0bGV0IGdsb2JhbEFscGhhID0gZmFsc2U7XG5cblx0cmVhZFNlY3Rpb24ocmVhZGVyLCAxLCBsZWZ0ID0+IHtcblx0XHRnbG9iYWxBbHBoYSA9IHJlYWRMYXllckluZm8ocmVhZGVyLCBwc2QsIG9wdCk7XG5cblx0XHQvLyBTQUkgZG9lcyBub3QgaW5jbHVkZSB0aGlzIHNlY3Rpb25cblx0XHRpZiAobGVmdCgpID4gMCkge1xuXHRcdFx0Y29uc3QgZ2xvYmFsTGF5ZXJNYXNrSW5mbyA9IHJlYWRHbG9iYWxMYXllck1hc2tJbmZvKHJlYWRlcik7XG5cdFx0XHRpZiAoZ2xvYmFsTGF5ZXJNYXNrSW5mbykgcHNkLmdsb2JhbExheWVyTWFza0luZm8gPSBnbG9iYWxMYXllck1hc2tJbmZvO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyByZXZlcnQgYmFjayB0byBlbmQgb2Ygc2VjdGlvbiBpZiBleGNlZWRlZCBzZWN0aW9uIGxpbWl0c1xuXHRcdFx0Ly8gb3B0LmxvZ01pc3NpbmdGZWF0dXJlcyAmJiBjb25zb2xlLmxvZygncmV2ZXJ0aW5nIHRvIGVuZCBvZiBzZWN0aW9uJyk7XG5cdFx0XHRza2lwQnl0ZXMocmVhZGVyLCBsZWZ0KCkpO1xuXHRcdH1cblxuXHRcdHdoaWxlIChsZWZ0KCkgPiAwKSB7XG5cdFx0XHQvLyBzb21ldGltZXMgdGhlcmUgYXJlIGVtcHR5IGJ5dGVzIGhlcmVcblx0XHRcdHdoaWxlIChsZWZ0KCkgJiYgcGVla1VpbnQ4KHJlYWRlcikgPT09IDApIHtcblx0XHRcdFx0Ly8gb3B0LmxvZ01pc3NpbmdGZWF0dXJlcyAmJiBjb25zb2xlLmxvZygnc2tpcHBpbmcgMCBieXRlJyk7XG5cdFx0XHRcdHNraXBCeXRlcyhyZWFkZXIsIDEpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobGVmdCgpID49IDEyKSB7XG5cdFx0XHRcdHJlYWRBZGRpdGlvbmFsTGF5ZXJJbmZvKHJlYWRlciwgcHNkLCBwc2QsIG9wdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBvcHQubG9nTWlzc2luZ0ZlYXR1cmVzICYmIGNvbnNvbGUubG9nKCdza2lwcGluZyBsZWZ0b3ZlciBieXRlcycsIGxlZnQoKSk7XG5cdFx0XHRcdHNraXBCeXRlcyhyZWFkZXIsIGxlZnQoKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LCB1bmRlZmluZWQsIG9wdC5sYXJnZSk7XG5cblx0Y29uc3QgaGFzQ2hpbGRyZW4gPSBwc2QuY2hpbGRyZW4gJiYgcHNkLmNoaWxkcmVuLmxlbmd0aDtcblx0Y29uc3Qgc2tpcENvbXBvc2l0ZSA9IG9wdC5za2lwQ29tcG9zaXRlSW1hZ2VEYXRhICYmIChvcHQuc2tpcExheWVySW1hZ2VEYXRhIHx8IGhhc0NoaWxkcmVuKTtcblxuXHRpZiAoIXNraXBDb21wb3NpdGUpIHtcblx0XHRyZWFkSW1hZ2VEYXRhKHJlYWRlciwgcHNkLCBnbG9iYWxBbHBoYSwgb3B0KTtcblx0fVxuXG5cdC8vIFRPRE86IHNob3cgY29udmVydGVkIGNvbG9yIG1vZGUgaW5zdGVhZCBvZiBvcmlnaW5hbCBQU0QgZmlsZSBjb2xvciBtb2RlXG5cdC8vICAgICAgIGJ1dCBhZGQgb3B0aW9uIHRvIHByZXNlcnZlIGZpbGUgY29sb3IgbW9kZSAobmVlZCB0byByZXR1cm4gaW1hZ2UgZGF0YSBpbnN0ZWFkIG9mIGNhbnZhcyBpbiB0aGF0IGNhc2UpXG5cdC8vIHBzZC5jb2xvck1vZGUgPSBDb2xvck1vZGUuUkdCOyAvLyB3ZSBjb252ZXJ0IGFsbCBjb2xvciBtb2RlcyB0byBSR0JcblxuXHRyZXR1cm4gcHNkO1xufVxuXG5mdW5jdGlvbiByZWFkTGF5ZXJJbmZvKHJlYWRlcjogUHNkUmVhZGVyLCBwc2Q6IFBzZCwgb3B0aW9uczogUmVhZE9wdGlvbnNFeHQpIHtcblx0bGV0IGdsb2JhbEFscGhhID0gZmFsc2U7XG5cblx0cmVhZFNlY3Rpb24ocmVhZGVyLCAyLCBsZWZ0ID0+IHtcblx0XHRsZXQgbGF5ZXJDb3VudCA9IHJlYWRJbnQxNihyZWFkZXIpO1xuXG5cdFx0aWYgKGxheWVyQ291bnQgPCAwKSB7XG5cdFx0XHRnbG9iYWxBbHBoYSA9IHRydWU7XG5cdFx0XHRsYXllckNvdW50ID0gLWxheWVyQ291bnQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbGF5ZXJzOiBMYXllcltdID0gW107XG5cdFx0Y29uc3QgbGF5ZXJDaGFubmVsczogQ2hhbm5lbEluZm9bXVtdID0gW107XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxheWVyQ291bnQ7IGkrKykge1xuXHRcdFx0Y29uc3QgeyBsYXllciwgY2hhbm5lbHMgfSA9IHJlYWRMYXllclJlY29yZChyZWFkZXIsIHBzZCwgb3B0aW9ucyk7XG5cdFx0XHRsYXllcnMucHVzaChsYXllcik7XG5cdFx0XHRsYXllckNoYW5uZWxzLnB1c2goY2hhbm5lbHMpO1xuXHRcdH1cblxuXHRcdGlmICghb3B0aW9ucy5za2lwTGF5ZXJJbWFnZURhdGEpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJDb3VudDsgaSsrKSB7XG5cdFx0XHRcdHJlYWRMYXllckNoYW5uZWxJbWFnZURhdGEocmVhZGVyLCBwc2QsIGxheWVyc1tpXSwgbGF5ZXJDaGFubmVsc1tpXSwgb3B0aW9ucyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblxuXHRcdGlmICghcHNkLmNoaWxkcmVuKSBwc2QuY2hpbGRyZW4gPSBbXTtcblxuXHRcdGNvbnN0IHN0YWNrOiAoTGF5ZXIgfCBQc2QpW10gPSBbcHNkXTtcblxuXHRcdGZvciAobGV0IGkgPSBsYXllcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0XHRcdGNvbnN0IGwgPSBsYXllcnNbaV07XG5cdFx0XHRjb25zdCB0eXBlID0gbC5zZWN0aW9uRGl2aWRlciA/IGwuc2VjdGlvbkRpdmlkZXIudHlwZSA6IFNlY3Rpb25EaXZpZGVyVHlwZS5PdGhlcjtcblxuXHRcdFx0aWYgKHR5cGUgPT09IFNlY3Rpb25EaXZpZGVyVHlwZS5PcGVuRm9sZGVyIHx8IHR5cGUgPT09IFNlY3Rpb25EaXZpZGVyVHlwZS5DbG9zZWRGb2xkZXIpIHtcblx0XHRcdFx0bC5vcGVuZWQgPSB0eXBlID09PSBTZWN0aW9uRGl2aWRlclR5cGUuT3BlbkZvbGRlcjtcblx0XHRcdFx0bC5jaGlsZHJlbiA9IFtdO1xuXHRcdFx0XHRzdGFja1tzdGFjay5sZW5ndGggLSAxXS5jaGlsZHJlbiEudW5zaGlmdChsKTtcblx0XHRcdFx0c3RhY2sucHVzaChsKTtcblx0XHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gU2VjdGlvbkRpdmlkZXJUeXBlLkJvdW5kaW5nU2VjdGlvbkRpdmlkZXIpIHtcblx0XHRcdFx0c3RhY2sucG9wKCk7XG5cdFx0XHRcdC8vIHRoaXMgd2FzIHdvcmthcm91bmQgYmVjYXVzZSBJIGRpZG4ndCBrbm93IHdoYXQgYGxzZGtgIHNlY3Rpb24gd2FzLCBub3cgaXQncyBwcm9iYWJseSBub3QgbmVlZGVkIGFueW1vcmVcblx0XHRcdFx0Ly8gfSBlbHNlIGlmIChsLm5hbWUgPT09ICc8L0xheWVyIGdyb3VwPicgJiYgIWwuc2VjdGlvbkRpdmlkZXIgJiYgIWwudG9wICYmICFsLmxlZnQgJiYgIWwuYm90dG9tICYmICFsLnJpZ2h0KSB7XG5cdFx0XHRcdC8vIFx0Ly8gc29tZXRpbWVzIGxheWVyIGdyb3VwIHRlcm1pbmF0b3IgZG9lc24ndCBoYXZlIHNlY3Rpb25EaXZpZGVyLCBzbyB3ZSBqdXN0IGd1ZXNzIGhlcmUgKFBTIGJ1ZyA/KVxuXHRcdFx0XHQvLyBcdHN0YWNrLnBvcCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c3RhY2tbc3RhY2subGVuZ3RoIC0gMV0uY2hpbGRyZW4hLnVuc2hpZnQobCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LCB1bmRlZmluZWQsIG9wdGlvbnMubGFyZ2UpO1xuXG5cdHJldHVybiBnbG9iYWxBbHBoYTtcbn1cblxuZnVuY3Rpb24gcmVhZExheWVyUmVjb3JkKHJlYWRlcjogUHNkUmVhZGVyLCBwc2Q6IFBzZCwgb3B0aW9uczogUmVhZE9wdGlvbnNFeHQpIHtcblx0Y29uc3QgbGF5ZXI6IExheWVyID0ge307XG5cdGxheWVyLnRvcCA9IHJlYWRJbnQzMihyZWFkZXIpO1xuXHRsYXllci5sZWZ0ID0gcmVhZEludDMyKHJlYWRlcik7XG5cdGxheWVyLmJvdHRvbSA9IHJlYWRJbnQzMihyZWFkZXIpO1xuXHRsYXllci5yaWdodCA9IHJlYWRJbnQzMihyZWFkZXIpO1xuXG5cdGNvbnN0IGNoYW5uZWxDb3VudCA9IHJlYWRVaW50MTYocmVhZGVyKTtcblx0Y29uc3QgY2hhbm5lbHM6IENoYW5uZWxJbmZvW10gPSBbXTtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5uZWxDb3VudDsgaSsrKSB7XG5cdFx0bGV0IGNoYW5uZWxJRCA9IHJlYWRJbnQxNihyZWFkZXIpIGFzIENoYW5uZWxJRDtcblx0XHRsZXQgY2hhbm5lbExlbmd0aCA9IHJlYWRVaW50MzIocmVhZGVyKTtcblxuXHRcdGlmIChvcHRpb25zLmxhcmdlKSB7XG5cdFx0XHRpZiAoY2hhbm5lbExlbmd0aCAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdTaXplcyBsYXJnZXIgdGhhbiA0R0IgYXJlIG5vdCBzdXBwb3J0ZWQnKTtcblx0XHRcdGNoYW5uZWxMZW5ndGggPSByZWFkVWludDMyKHJlYWRlcik7XG5cdFx0fVxuXG5cdFx0Y2hhbm5lbHMucHVzaCh7IGlkOiBjaGFubmVsSUQsIGxlbmd0aDogY2hhbm5lbExlbmd0aCB9KTtcblx0fVxuXG5cdGNoZWNrU2lnbmF0dXJlKHJlYWRlciwgJzhCSU0nKTtcblx0Y29uc3QgYmxlbmRNb2RlID0gcmVhZFNpZ25hdHVyZShyZWFkZXIpO1xuXHRpZiAoIXRvQmxlbmRNb2RlW2JsZW5kTW9kZV0pIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBibGVuZCBtb2RlOiAnJHtibGVuZE1vZGV9J2ApO1xuXHRsYXllci5ibGVuZE1vZGUgPSB0b0JsZW5kTW9kZVtibGVuZE1vZGVdO1xuXG5cdGxheWVyLm9wYWNpdHkgPSByZWFkVWludDgocmVhZGVyKSAvIDB4ZmY7XG5cdGxheWVyLmNsaXBwaW5nID0gcmVhZFVpbnQ4KHJlYWRlcikgPT09IDE7XG5cblx0Y29uc3QgZmxhZ3MgPSByZWFkVWludDgocmVhZGVyKTtcblx0bGF5ZXIudHJhbnNwYXJlbmN5UHJvdGVjdGVkID0gKGZsYWdzICYgMHgwMSkgIT09IDA7XG5cdGxheWVyLmhpZGRlbiA9IChmbGFncyAmIDB4MDIpICE9PSAwO1xuXHQvLyAweDA0IC0gb2Jzb2xldGVcblx0Ly8gMHgwOCAtIDEgZm9yIFBob3Rvc2hvcCA1LjAgYW5kIGxhdGVyLCB0ZWxscyBpZiBiaXQgNCBoYXMgdXNlZnVsIGluZm9ybWF0aW9uXG5cdC8vIDB4MTAgLSBwaXhlbCBkYXRhIGlycmVsZXZhbnQgdG8gYXBwZWFyYW5jZSBvZiBkb2N1bWVudFxuXHQvLyAweDIwIC0gPz8/XG5cdC8vIGlmIChmbGFncyAmIDB4MjApIChsYXllciBhcyBhbnkpLl8yID0gdHJ1ZTsgLy8gVEVNUCAhISEhXG5cblx0c2tpcEJ5dGVzKHJlYWRlciwgMSk7XG5cblx0cmVhZFNlY3Rpb24ocmVhZGVyLCAxLCBsZWZ0ID0+IHtcblx0XHRjb25zdCBtYXNrID0gcmVhZExheWVyTWFza0RhdGEocmVhZGVyLCBvcHRpb25zKTtcblx0XHRpZiAobWFzaykgbGF5ZXIubWFzayA9IG1hc2s7XG5cblx0XHQvKmNvbnN0IGJsZW5kaW5nUmFuZ2VzID0qLyByZWFkTGF5ZXJCbGVuZGluZ1JhbmdlcyhyZWFkZXIpO1xuXHRcdGxheWVyLm5hbWUgPSByZWFkUGFzY2FsU3RyaW5nKHJlYWRlciwgNCk7XG5cblx0XHR3aGlsZSAobGVmdCgpKSB7XG5cdFx0XHRyZWFkQWRkaXRpb25hbExheWVySW5mbyhyZWFkZXIsIGxheWVyLCBwc2QsIG9wdGlvbnMpO1xuXHRcdH1cblx0fSk7XG5cblx0cmV0dXJuIHsgbGF5ZXIsIGNoYW5uZWxzIH07XG59XG5cbmZ1bmN0aW9uIHJlYWRMYXllck1hc2tEYXRhKHJlYWRlcjogUHNkUmVhZGVyLCBvcHRpb25zOiBSZWFkT3B0aW9ucykge1xuXHRyZXR1cm4gcmVhZFNlY3Rpb248TGF5ZXJNYXNrRGF0YSB8IHVuZGVmaW5lZD4ocmVhZGVyLCAxLCBsZWZ0ID0+IHtcblx0XHRpZiAoIWxlZnQoKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdGNvbnN0IG1hc2s6IExheWVyTWFza0RhdGEgPSB7fTtcblx0XHRtYXNrLnRvcCA9IHJlYWRJbnQzMihyZWFkZXIpO1xuXHRcdG1hc2subGVmdCA9IHJlYWRJbnQzMihyZWFkZXIpO1xuXHRcdG1hc2suYm90dG9tID0gcmVhZEludDMyKHJlYWRlcik7XG5cdFx0bWFzay5yaWdodCA9IHJlYWRJbnQzMihyZWFkZXIpO1xuXHRcdG1hc2suZGVmYXVsdENvbG9yID0gcmVhZFVpbnQ4KHJlYWRlcik7XG5cblx0XHRjb25zdCBmbGFncyA9IHJlYWRVaW50OChyZWFkZXIpO1xuXHRcdG1hc2sucG9zaXRpb25SZWxhdGl2ZVRvTGF5ZXIgPSAoZmxhZ3MgJiBMYXllck1hc2tGbGFncy5Qb3NpdGlvblJlbGF0aXZlVG9MYXllcikgIT09IDA7XG5cdFx0bWFzay5kaXNhYmxlZCA9IChmbGFncyAmIExheWVyTWFza0ZsYWdzLkxheWVyTWFza0Rpc2FibGVkKSAhPT0gMDtcblx0XHRtYXNrLmZyb21WZWN0b3JEYXRhID0gKGZsYWdzICYgTGF5ZXJNYXNrRmxhZ3MuTGF5ZXJNYXNrRnJvbVJlbmRlcmluZ090aGVyRGF0YSkgIT09IDA7XG5cblx0XHRpZiAoZmxhZ3MgJiBMYXllck1hc2tGbGFncy5NYXNrSGFzUGFyYW1ldGVyc0FwcGxpZWRUb0l0KSB7XG5cdFx0XHRjb25zdCBwYXJhbXMgPSByZWFkVWludDgocmVhZGVyKTtcblx0XHRcdGlmIChwYXJhbXMgJiBNYXNrUGFyYW1zLlVzZXJNYXNrRGVuc2l0eSkgbWFzay51c2VyTWFza0RlbnNpdHkgPSByZWFkVWludDgocmVhZGVyKSAvIDB4ZmY7XG5cdFx0XHRpZiAocGFyYW1zICYgTWFza1BhcmFtcy5Vc2VyTWFza0ZlYXRoZXIpIG1hc2sudXNlck1hc2tGZWF0aGVyID0gcmVhZEZsb2F0NjQocmVhZGVyKTtcblx0XHRcdGlmIChwYXJhbXMgJiBNYXNrUGFyYW1zLlZlY3Rvck1hc2tEZW5zaXR5KSBtYXNrLnZlY3Rvck1hc2tEZW5zaXR5ID0gcmVhZFVpbnQ4KHJlYWRlcikgLyAweGZmO1xuXHRcdFx0aWYgKHBhcmFtcyAmIE1hc2tQYXJhbXMuVmVjdG9yTWFza0ZlYXRoZXIpIG1hc2sudmVjdG9yTWFza0ZlYXRoZXIgPSByZWFkRmxvYXQ2NChyZWFkZXIpO1xuXHRcdH1cblxuXHRcdGlmIChsZWZ0KCkgPiAyKSB7XG5cdFx0XHRvcHRpb25zLmxvZ01pc3NpbmdGZWF0dXJlcyAmJiBjb25zb2xlLmxvZygnVW5oYW5kbGVkIGV4dHJhIG1hc2sgcGFyYW1zJyk7XG5cdFx0XHQvLyBUT0RPOiBoYW5kbGUgdGhlc2UgdmFsdWVzXG5cdFx0XHQvKmNvbnN0IHJlYWxGbGFncyA9Ki8gcmVhZFVpbnQ4KHJlYWRlcik7XG5cdFx0XHQvKmNvbnN0IHJlYWxVc2VyTWFza0JhY2tncm91bmQgPSovIHJlYWRVaW50OChyZWFkZXIpO1xuXHRcdFx0Lypjb25zdCB0b3AyID0qLyByZWFkSW50MzIocmVhZGVyKTtcblx0XHRcdC8qY29uc3QgbGVmdDIgPSovIHJlYWRJbnQzMihyZWFkZXIpO1xuXHRcdFx0Lypjb25zdCBib3R0b20yID0qLyByZWFkSW50MzIocmVhZGVyKTtcblx0XHRcdC8qY29uc3QgcmlnaHQyID0qLyByZWFkSW50MzIocmVhZGVyKTtcblx0XHR9XG5cblx0XHRza2lwQnl0ZXMocmVhZGVyLCBsZWZ0KCkpO1xuXHRcdHJldHVybiBtYXNrO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gcmVhZExheWVyQmxlbmRpbmdSYW5nZXMocmVhZGVyOiBQc2RSZWFkZXIpIHtcblx0cmV0dXJuIHJlYWRTZWN0aW9uKHJlYWRlciwgMSwgbGVmdCA9PiB7XG5cdFx0Y29uc3QgY29tcG9zaXRlR3JheUJsZW5kU291cmNlID0gcmVhZFVpbnQzMihyZWFkZXIpO1xuXHRcdGNvbnN0IGNvbXBvc2l0ZUdyYXBoQmxlbmREZXN0aW5hdGlvblJhbmdlID0gcmVhZFVpbnQzMihyZWFkZXIpO1xuXHRcdGNvbnN0IHJhbmdlcyA9IFtdO1xuXG5cdFx0d2hpbGUgKGxlZnQoKSkge1xuXHRcdFx0Y29uc3Qgc291cmNlUmFuZ2UgPSByZWFkVWludDMyKHJlYWRlcik7XG5cdFx0XHRjb25zdCBkZXN0UmFuZ2UgPSByZWFkVWludDMyKHJlYWRlcik7XG5cdFx0XHRyYW5nZXMucHVzaCh7IHNvdXJjZVJhbmdlLCBkZXN0UmFuZ2UgfSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHsgY29tcG9zaXRlR3JheUJsZW5kU291cmNlLCBjb21wb3NpdGVHcmFwaEJsZW5kRGVzdGluYXRpb25SYW5nZSwgcmFuZ2VzIH07XG5cdH0pO1xufVxuXG5mdW5jdGlvbiByZWFkTGF5ZXJDaGFubmVsSW1hZ2VEYXRhKFxuXHRyZWFkZXI6IFBzZFJlYWRlciwgcHNkOiBQc2QsIGxheWVyOiBMYXllciwgY2hhbm5lbHM6IENoYW5uZWxJbmZvW10sIG9wdGlvbnM6IFJlYWRPcHRpb25zRXh0XG4pIHtcblx0Y29uc3QgbGF5ZXJXaWR0aCA9IChsYXllci5yaWdodCB8fCAwKSAtIChsYXllci5sZWZ0IHx8IDApO1xuXHRjb25zdCBsYXllckhlaWdodCA9IChsYXllci5ib3R0b20gfHwgMCkgLSAobGF5ZXIudG9wIHx8IDApO1xuXHRjb25zdCBjbXlrID0gcHNkLmNvbG9yTW9kZSA9PT0gQ29sb3JNb2RlLkNNWUs7XG5cblx0bGV0IGltYWdlRGF0YTogSW1hZ2VEYXRhIHwgdW5kZWZpbmVkO1xuXG5cdGlmIChsYXllcldpZHRoICYmIGxheWVySGVpZ2h0KSB7XG5cdFx0aWYgKGNteWspIHtcblx0XHRcdGltYWdlRGF0YSA9IHsgd2lkdGg6IGxheWVyV2lkdGgsIGhlaWdodDogbGF5ZXJIZWlnaHQsIGRhdGE6IG5ldyBVaW50OENsYW1wZWRBcnJheShsYXllcldpZHRoICogbGF5ZXJIZWlnaHQgKiA1KSB9IGFzIGFueSBhcyBJbWFnZURhdGE7XG5cdFx0XHRmb3IgKGxldCBwID0gNDsgcCA8IGltYWdlRGF0YS5kYXRhLmJ5dGVMZW5ndGg7IHAgKz0gNSkgaW1hZ2VEYXRhLmRhdGFbcF0gPSAyNTU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGltYWdlRGF0YSA9IGNyZWF0ZUltYWdlRGF0YShsYXllcldpZHRoLCBsYXllckhlaWdodCk7XG5cdFx0XHRyZXNldEltYWdlRGF0YShpbWFnZURhdGEpO1xuXHRcdH1cblx0fVxuXG5cdGlmIChSQVdfSU1BR0VfREFUQSkgKGxheWVyIGFzIGFueSkuaW1hZ2VEYXRhUmF3ID0gW107XG5cblx0Zm9yIChjb25zdCBjaGFubmVsIG9mIGNoYW5uZWxzKSB7XG5cdFx0aWYgKGNoYW5uZWwubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblx0XHRpZiAoY2hhbm5lbC5sZW5ndGggPCAyKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hhbm5lbCBsZW5ndGgnKTtcblxuXHRcdGNvbnN0IHN0YXJ0ID0gcmVhZGVyLm9mZnNldDtcblx0XHRjb25zdCBjb21wcmVzc2lvbiA9IHJlYWRVaW50MTYocmVhZGVyKSBhcyBDb21wcmVzc2lvbjtcblxuXHRcdGlmIChjaGFubmVsLmlkID09PSBDaGFubmVsSUQuVXNlck1hc2spIHtcblx0XHRcdGNvbnN0IG1hc2sgPSBsYXllci5tYXNrO1xuXG5cdFx0XHRpZiAoIW1hc2spIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBsYXllciBtYXNrIGRhdGFgKTtcblxuXHRcdFx0Y29uc3QgbWFza1dpZHRoID0gKG1hc2sucmlnaHQgfHwgMCkgLSAobWFzay5sZWZ0IHx8IDApO1xuXHRcdFx0Y29uc3QgbWFza0hlaWdodCA9IChtYXNrLmJvdHRvbSB8fCAwKSAtIChtYXNrLnRvcCB8fCAwKTtcblxuXHRcdFx0aWYgKG1hc2tXaWR0aCAmJiBtYXNrSGVpZ2h0KSB7XG5cdFx0XHRcdGNvbnN0IG1hc2tEYXRhID0gY3JlYXRlSW1hZ2VEYXRhKG1hc2tXaWR0aCwgbWFza0hlaWdodCk7XG5cdFx0XHRcdHJlc2V0SW1hZ2VEYXRhKG1hc2tEYXRhKTtcblxuXHRcdFx0XHRjb25zdCBzdGFydCA9IHJlYWRlci5vZmZzZXQ7XG5cdFx0XHRcdHJlYWREYXRhKHJlYWRlciwgY2hhbm5lbC5sZW5ndGgsIG1hc2tEYXRhLCBjb21wcmVzc2lvbiwgbWFza1dpZHRoLCBtYXNrSGVpZ2h0LCAwLCBvcHRpb25zLmxhcmdlLCA0KTtcblxuXHRcdFx0XHRpZiAoUkFXX0lNQUdFX0RBVEEpIHtcblx0XHRcdFx0XHQobGF5ZXIgYXMgYW55KS5tYXNrRGF0YVJhdyA9IG5ldyBVaW50OEFycmF5KHJlYWRlci52aWV3LmJ1ZmZlciwgcmVhZGVyLnZpZXcuYnl0ZU9mZnNldCArIHN0YXJ0LCByZWFkZXIub2Zmc2V0IC0gc3RhcnQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2V0dXBHcmF5c2NhbGUobWFza0RhdGEpO1xuXG5cdFx0XHRcdGlmIChvcHRpb25zLnVzZUltYWdlRGF0YSkge1xuXHRcdFx0XHRcdG1hc2suaW1hZ2VEYXRhID0gbWFza0RhdGE7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bWFzay5jYW52YXMgPSBjcmVhdGVDYW52YXMobWFza1dpZHRoLCBtYXNrSGVpZ2h0KTtcblx0XHRcdFx0XHRtYXNrLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIS5wdXRJbWFnZURhdGEobWFza0RhdGEsIDAsIDApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG9mZnNldCA9IG9mZnNldEZvckNoYW5uZWwoY2hhbm5lbC5pZCwgY215ayk7XG5cdFx0XHRsZXQgdGFyZ2V0RGF0YSA9IGltYWdlRGF0YTtcblxuXHRcdFx0aWYgKG9mZnNldCA8IDApIHtcblx0XHRcdFx0dGFyZ2V0RGF0YSA9IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRpZiAob3B0aW9ucy50aHJvd0Zvck1pc3NpbmdGZWF0dXJlcykge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2hhbm5lbCBub3Qgc3VwcG9ydGVkOiAke2NoYW5uZWwuaWR9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmVhZERhdGEocmVhZGVyLCBjaGFubmVsLmxlbmd0aCwgdGFyZ2V0RGF0YSwgY29tcHJlc3Npb24sIGxheWVyV2lkdGgsIGxheWVySGVpZ2h0LCBvZmZzZXQsIG9wdGlvbnMubGFyZ2UsIGNteWsgPyA1IDogNCk7XG5cblx0XHRcdGlmIChSQVdfSU1BR0VfREFUQSkge1xuXHRcdFx0XHQobGF5ZXIgYXMgYW55KS5pbWFnZURhdGFSYXdbY2hhbm5lbC5pZF0gPSBuZXcgVWludDhBcnJheShyZWFkZXIudmlldy5idWZmZXIsIHJlYWRlci52aWV3LmJ5dGVPZmZzZXQgKyBzdGFydCArIDIsIGNoYW5uZWwubGVuZ3RoIC0gMik7XG5cdFx0XHR9XG5cblx0XHRcdHJlYWRlci5vZmZzZXQgPSBzdGFydCArIGNoYW5uZWwubGVuZ3RoO1xuXG5cdFx0XHRpZiAodGFyZ2V0RGF0YSAmJiBwc2QuY29sb3JNb2RlID09PSBDb2xvck1vZGUuR3JheXNjYWxlKSB7XG5cdFx0XHRcdHNldHVwR3JheXNjYWxlKHRhcmdldERhdGEpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmIChpbWFnZURhdGEpIHtcblx0XHRpZiAoY215aykge1xuXHRcdFx0Y29uc3QgY215a0RhdGEgPSBpbWFnZURhdGE7XG5cdFx0XHRpbWFnZURhdGEgPSBjcmVhdGVJbWFnZURhdGEoY215a0RhdGEud2lkdGgsIGNteWtEYXRhLmhlaWdodCk7XG5cdFx0XHRjbXlrVG9SZ2IoY215a0RhdGEsIGltYWdlRGF0YSwgZmFsc2UpO1xuXHRcdH1cblxuXHRcdGlmIChvcHRpb25zLnVzZUltYWdlRGF0YSkge1xuXHRcdFx0bGF5ZXIuaW1hZ2VEYXRhID0gaW1hZ2VEYXRhO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsYXllci5jYW52YXMgPSBjcmVhdGVDYW52YXMobGF5ZXJXaWR0aCwgbGF5ZXJIZWlnaHQpO1xuXHRcdFx0bGF5ZXIuY2FudmFzLmdldENvbnRleHQoJzJkJykhLnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIDApO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiByZWFkRGF0YShcblx0cmVhZGVyOiBQc2RSZWFkZXIsIGxlbmd0aDogbnVtYmVyLCBkYXRhOiBJbWFnZURhdGEgfCB1bmRlZmluZWQsIGNvbXByZXNzaW9uOiBDb21wcmVzc2lvbiwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsXG5cdG9mZnNldDogbnVtYmVyLCBsYXJnZTogYm9vbGVhbiwgc3RlcDogbnVtYmVyXG4pIHtcblx0aWYgKGNvbXByZXNzaW9uID09PSBDb21wcmVzc2lvbi5SYXdEYXRhKSB7XG5cdFx0cmVhZERhdGFSYXcocmVhZGVyLCBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdGVwLCBvZmZzZXQpO1xuXHR9IGVsc2UgaWYgKGNvbXByZXNzaW9uID09PSBDb21wcmVzc2lvbi5SbGVDb21wcmVzc2VkKSB7XG5cdFx0cmVhZERhdGFSTEUocmVhZGVyLCBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdGVwLCBbb2Zmc2V0XSwgbGFyZ2UpO1xuXHR9IGVsc2UgaWYgKGNvbXByZXNzaW9uID09PSBDb21wcmVzc2lvbi5aaXBXaXRob3V0UHJlZGljdGlvbikge1xuXHRcdHJlYWREYXRhWmlwV2l0aG91dFByZWRpY3Rpb24ocmVhZGVyLCBsZW5ndGgsIGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0ZXAsIG9mZnNldCk7XG5cdH0gZWxzZSBpZiAoY29tcHJlc3Npb24gPT09IENvbXByZXNzaW9uLlppcFdpdGhQcmVkaWN0aW9uKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBDb21wcmVzc2lvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICR7Y29tcHJlc3Npb259YCk7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIENvbXByZXNzaW9uIHR5cGU6ICR7Y29tcHJlc3Npb259YCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gcmVhZEdsb2JhbExheWVyTWFza0luZm8ocmVhZGVyOiBQc2RSZWFkZXIpIHtcblx0cmV0dXJuIHJlYWRTZWN0aW9uPEdsb2JhbExheWVyTWFza0luZm8gfCB1bmRlZmluZWQ+KHJlYWRlciwgMSwgbGVmdCA9PiB7XG5cdFx0aWYgKCFsZWZ0KCkpIHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBvdmVybGF5Q29sb3JTcGFjZSA9IHJlYWRVaW50MTYocmVhZGVyKTtcblx0XHRjb25zdCBjb2xvclNwYWNlMSA9IHJlYWRVaW50MTYocmVhZGVyKTtcblx0XHRjb25zdCBjb2xvclNwYWNlMiA9IHJlYWRVaW50MTYocmVhZGVyKTtcblx0XHRjb25zdCBjb2xvclNwYWNlMyA9IHJlYWRVaW50MTYocmVhZGVyKTtcblx0XHRjb25zdCBjb2xvclNwYWNlNCA9IHJlYWRVaW50MTYocmVhZGVyKTtcblx0XHRjb25zdCBvcGFjaXR5ID0gcmVhZFVpbnQxNihyZWFkZXIpIC8gMHhmZjtcblx0XHRjb25zdCBraW5kID0gcmVhZFVpbnQ4KHJlYWRlcik7XG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTsgLy8gMyBieXRlcyBvZiBwYWRkaW5nID9cblx0XHRyZXR1cm4geyBvdmVybGF5Q29sb3JTcGFjZSwgY29sb3JTcGFjZTEsIGNvbG9yU3BhY2UyLCBjb2xvclNwYWNlMywgY29sb3JTcGFjZTQsIG9wYWNpdHksIGtpbmQgfTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRBZGRpdGlvbmFsTGF5ZXJJbmZvKHJlYWRlcjogUHNkUmVhZGVyLCB0YXJnZXQ6IExheWVyQWRkaXRpb25hbEluZm8sIHBzZDogUHNkLCBvcHRpb25zOiBSZWFkT3B0aW9uc0V4dCkge1xuXHRjb25zdCBzaWcgPSByZWFkU2lnbmF0dXJlKHJlYWRlcik7XG5cdGlmIChzaWcgIT09ICc4QklNJyAmJiBzaWcgIT09ICc4QjY0JykgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNpZ25hdHVyZTogJyR7c2lnfScgYXQgMHgkeyhyZWFkZXIub2Zmc2V0IC0gNCkudG9TdHJpbmcoMTYpfWApO1xuXHRjb25zdCBrZXkgPSByZWFkU2lnbmF0dXJlKHJlYWRlcik7XG5cblx0Ly8gYGxhcmdlQWRkaXRpb25hbEluZm9LZXlzYCBmYWxsYmFjaywgYmVjYXVzZSBzb21lIGtleXMgZG9uJ3QgaGF2ZSA4QjY0IHNpZ25hdHVyZSBldmVuIHdoZW4gdGhleSBhcmUgNjRiaXRcblx0Y29uc3QgdTY0ID0gc2lnID09PSAnOEI2NCcgfHwgKG9wdGlvbnMubGFyZ2UgJiYgbGFyZ2VBZGRpdGlvbmFsSW5mb0tleXMuaW5kZXhPZihrZXkpICE9PSAtMSk7XG5cblx0cmVhZFNlY3Rpb24ocmVhZGVyLCAyLCBsZWZ0ID0+IHtcblx0XHRjb25zdCBoYW5kbGVyID0gaW5mb0hhbmRsZXJzTWFwW2tleV07XG5cblx0XHRpZiAoaGFuZGxlcikge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aGFuZGxlci5yZWFkKHJlYWRlciwgdGFyZ2V0LCBsZWZ0LCBwc2QsIG9wdGlvbnMpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRpZiAob3B0aW9ucy50aHJvd0Zvck1pc3NpbmdGZWF0dXJlcykgdGhyb3cgZTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0b3B0aW9ucy5sb2dNaXNzaW5nRmVhdHVyZXMgJiYgY29uc29sZS5sb2coYFVuaGFuZGxlZCBhZGRpdGlvbmFsIGluZm86ICR7a2V5fWApO1xuXHRcdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblx0XHR9XG5cblx0XHRpZiAobGVmdCgpKSB7XG5cdFx0XHRvcHRpb25zLmxvZ01pc3NpbmdGZWF0dXJlcyAmJiBjb25zb2xlLmxvZyhgVW5yZWFkICR7bGVmdCgpfSBieXRlcyBsZWZ0IGZvciBhZGRpdGlvbmFsIGluZm86ICR7a2V5fWApO1xuXHRcdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblx0XHR9XG5cdH0sIGZhbHNlLCB1NjQpO1xufVxuXG5mdW5jdGlvbiByZWFkSW1hZ2VEYXRhKHJlYWRlcjogUHNkUmVhZGVyLCBwc2Q6IFBzZCwgZ2xvYmFsQWxwaGE6IGJvb2xlYW4sIG9wdGlvbnM6IFJlYWRPcHRpb25zRXh0KSB7XG5cdGNvbnN0IGNvbXByZXNzaW9uID0gcmVhZFVpbnQxNihyZWFkZXIpIGFzIENvbXByZXNzaW9uO1xuXG5cdGlmIChzdXBwb3J0ZWRDb2xvck1vZGVzLmluZGV4T2YocHNkLmNvbG9yTW9kZSEpID09PSAtMSlcblx0XHR0aHJvdyBuZXcgRXJyb3IoYENvbG9yIG1vZGUgbm90IHN1cHBvcnRlZDogJHtwc2QuY29sb3JNb2RlfWApO1xuXG5cdGlmIChjb21wcmVzc2lvbiAhPT0gQ29tcHJlc3Npb24uUmF3RGF0YSAmJiBjb21wcmVzc2lvbiAhPT0gQ29tcHJlc3Npb24uUmxlQ29tcHJlc3NlZClcblx0XHR0aHJvdyBuZXcgRXJyb3IoYENvbXByZXNzaW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJHtjb21wcmVzc2lvbn1gKTtcblxuXHRjb25zdCBpbWFnZURhdGEgPSBjcmVhdGVJbWFnZURhdGEocHNkLndpZHRoLCBwc2QuaGVpZ2h0KTtcblx0cmVzZXRJbWFnZURhdGEoaW1hZ2VEYXRhKTtcblxuXHRzd2l0Y2ggKHBzZC5jb2xvck1vZGUpIHtcblx0XHRjYXNlIENvbG9yTW9kZS5CaXRtYXA6IHtcblx0XHRcdGxldCBieXRlczogVWludDhBcnJheTtcblxuXHRcdFx0aWYgKGNvbXByZXNzaW9uID09PSBDb21wcmVzc2lvbi5SYXdEYXRhKSB7XG5cdFx0XHRcdGJ5dGVzID0gcmVhZEJ5dGVzKHJlYWRlciwgTWF0aC5jZWlsKHBzZC53aWR0aCAvIDgpICogcHNkLmhlaWdodCk7XG5cdFx0XHR9IGVsc2UgaWYgKGNvbXByZXNzaW9uID09PSBDb21wcmVzc2lvbi5SbGVDb21wcmVzc2VkKSB7XG5cdFx0XHRcdGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkocHNkLndpZHRoICogcHNkLmhlaWdodCk7XG5cdFx0XHRcdHJlYWREYXRhUkxFKHJlYWRlciwgeyBkYXRhOiBieXRlcywgd2lkdGg6IHBzZC53aWR0aCwgaGVpZ2h0OiBwc2QuaGVpZ2h0IH0sIHBzZC53aWR0aCwgcHNkLmhlaWdodCwgMSwgWzBdLCBvcHRpb25zLmxhcmdlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQml0bWFwIGNvbXByZXNzaW9uIG5vdCBzdXBwb3J0ZWQ6ICR7Y29tcHJlc3Npb259YCk7XG5cdFx0XHR9XG5cblx0XHRcdGRlY29kZUJpdG1hcChieXRlcywgaW1hZ2VEYXRhLmRhdGEsIHBzZC53aWR0aCwgcHNkLmhlaWdodCk7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdFx0Y2FzZSBDb2xvck1vZGUuUkdCOlxuXHRcdGNhc2UgQ29sb3JNb2RlLkdyYXlzY2FsZToge1xuXHRcdFx0Y29uc3QgY2hhbm5lbHMgPSBwc2QuY29sb3JNb2RlID09PSBDb2xvck1vZGUuR3JheXNjYWxlID8gWzBdIDogWzAsIDEsIDJdO1xuXG5cdFx0XHRpZiAocHNkLmNoYW5uZWxzICYmIHBzZC5jaGFubmVscyA+IDMpIHtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDM7IGkgPCBwc2QuY2hhbm5lbHM7IGkrKykge1xuXHRcdFx0XHRcdC8vIFRPRE86IHN0b3JlIHRoZXNlIGNoYW5uZWxzIGluIGFkZGl0aW9uYWwgaW1hZ2UgZGF0YVxuXHRcdFx0XHRcdGNoYW5uZWxzLnB1c2goaSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoZ2xvYmFsQWxwaGEpIHtcblx0XHRcdFx0Y2hhbm5lbHMucHVzaCgzKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNvbXByZXNzaW9uID09PSBDb21wcmVzc2lvbi5SYXdEYXRhKSB7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbm5lbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRyZWFkRGF0YVJhdyhyZWFkZXIsIGltYWdlRGF0YSwgcHNkLndpZHRoLCBwc2QuaGVpZ2h0LCA0LCBjaGFubmVsc1tpXSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoY29tcHJlc3Npb24gPT09IENvbXByZXNzaW9uLlJsZUNvbXByZXNzZWQpIHtcblx0XHRcdFx0Y29uc3Qgc3RhcnQgPSByZWFkZXIub2Zmc2V0O1xuXHRcdFx0XHRyZWFkRGF0YVJMRShyZWFkZXIsIGltYWdlRGF0YSwgcHNkLndpZHRoLCBwc2QuaGVpZ2h0LCA0LCBjaGFubmVscywgb3B0aW9ucy5sYXJnZSk7XG5cdFx0XHRcdGlmIChSQVdfSU1BR0VfREFUQSkgKHBzZCBhcyBhbnkpLmltYWdlRGF0YVJhdyA9IG5ldyBVaW50OEFycmF5KHJlYWRlci52aWV3LmJ1ZmZlciwgcmVhZGVyLnZpZXcuYnl0ZU9mZnNldCArIHN0YXJ0LCByZWFkZXIub2Zmc2V0IC0gc3RhcnQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocHNkLmNvbG9yTW9kZSA9PT0gQ29sb3JNb2RlLkdyYXlzY2FsZSkge1xuXHRcdFx0XHRzZXR1cEdyYXlzY2FsZShpbWFnZURhdGEpO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGNhc2UgQ29sb3JNb2RlLkNNWUs6IHtcblx0XHRcdGlmIChwc2QuY2hhbm5lbHMgIT09IDQpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFubmVsIGNvdW50YCk7XG5cblx0XHRcdGNvbnN0IGNoYW5uZWxzID0gWzAsIDEsIDIsIDNdO1xuXHRcdFx0aWYgKGdsb2JhbEFscGhhKSBjaGFubmVscy5wdXNoKDQpO1xuXG5cdFx0XHRpZiAoY29tcHJlc3Npb24gPT09IENvbXByZXNzaW9uLlJhd0RhdGEpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBOb3QgaW1wbGVtZW50ZWRgKTtcblx0XHRcdFx0Ly8gVE9ETzogLi4uXG5cdFx0XHRcdC8vIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbm5lbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Ly8gXHRyZWFkRGF0YVJhdyhyZWFkZXIsIGltYWdlRGF0YSwgY2hhbm5lbHNbaV0sIHBzZC53aWR0aCwgcHNkLmhlaWdodCk7XG5cdFx0XHRcdC8vIH1cblx0XHRcdH0gZWxzZSBpZiAoY29tcHJlc3Npb24gPT09IENvbXByZXNzaW9uLlJsZUNvbXByZXNzZWQpIHtcblx0XHRcdFx0Y29uc3QgY215a0ltYWdlRGF0YTogUGl4ZWxEYXRhID0ge1xuXHRcdFx0XHRcdHdpZHRoOiBpbWFnZURhdGEud2lkdGgsXG5cdFx0XHRcdFx0aGVpZ2h0OiBpbWFnZURhdGEuaGVpZ2h0LFxuXHRcdFx0XHRcdGRhdGE6IG5ldyBVaW50OEFycmF5KGltYWdlRGF0YS53aWR0aCAqIGltYWdlRGF0YS5oZWlnaHQgKiA1KSxcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRjb25zdCBzdGFydCA9IHJlYWRlci5vZmZzZXQ7XG5cdFx0XHRcdHJlYWREYXRhUkxFKHJlYWRlciwgY215a0ltYWdlRGF0YSwgcHNkLndpZHRoLCBwc2QuaGVpZ2h0LCA1LCBjaGFubmVscywgb3B0aW9ucy5sYXJnZSk7XG5cdFx0XHRcdGNteWtUb1JnYihjbXlrSW1hZ2VEYXRhLCBpbWFnZURhdGEsIHRydWUpO1xuXG5cdFx0XHRcdGlmIChSQVdfSU1BR0VfREFUQSkgKHBzZCBhcyBhbnkpLmltYWdlRGF0YVJhdyA9IG5ldyBVaW50OEFycmF5KHJlYWRlci52aWV3LmJ1ZmZlciwgcmVhZGVyLnZpZXcuYnl0ZU9mZnNldCArIHN0YXJ0LCByZWFkZXIub2Zmc2V0IC0gc3RhcnQpO1xuXHRcdFx0fVxuXG5cdFx0XHRicmVhaztcblx0XHR9XG5cdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKGBDb2xvciBtb2RlIG5vdCBzdXBwb3J0ZWQ6ICR7cHNkLmNvbG9yTW9kZX1gKTtcblx0fVxuXG5cdGlmIChvcHRpb25zLnVzZUltYWdlRGF0YSkge1xuXHRcdHBzZC5pbWFnZURhdGEgPSBpbWFnZURhdGE7XG5cdH0gZWxzZSB7XG5cdFx0cHNkLmNhbnZhcyA9IGNyZWF0ZUNhbnZhcyhwc2Qud2lkdGgsIHBzZC5oZWlnaHQpO1xuXHRcdHBzZC5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKSEucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgMCwgMCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY215a1RvUmdiKGNteWs6IFBpeGVsRGF0YSwgcmdiOiBQaXhlbERhdGEsIHJldmVyc2VBbHBoYTogYm9vbGVhbikge1xuXHRjb25zdCBzaXplID0gcmdiLndpZHRoICogcmdiLmhlaWdodCAqIDQ7XG5cdGNvbnN0IHNyY0RhdGEgPSBjbXlrLmRhdGE7XG5cdGNvbnN0IGRzdERhdGEgPSByZ2IuZGF0YTtcblxuXHRmb3IgKGxldCBzcmMgPSAwLCBkc3QgPSAwOyBkc3QgPCBzaXplOyBzcmMgKz0gNSwgZHN0ICs9IDQpIHtcblx0XHRjb25zdCBjID0gc3JjRGF0YVtzcmNdO1xuXHRcdGNvbnN0IG0gPSBzcmNEYXRhW3NyYyArIDFdO1xuXHRcdGNvbnN0IHkgPSBzcmNEYXRhW3NyYyArIDJdO1xuXHRcdGNvbnN0IGsgPSBzcmNEYXRhW3NyYyArIDNdO1xuXHRcdGRzdERhdGFbZHN0XSA9ICgoKChjICogaykgfCAwKSAvIDI1NSkgfCAwKTtcblx0XHRkc3REYXRhW2RzdCArIDFdID0gKCgoKG0gKiBrKSB8IDApIC8gMjU1KSB8IDApO1xuXHRcdGRzdERhdGFbZHN0ICsgMl0gPSAoKCgoeSAqIGspIHwgMCkgLyAyNTUpIHwgMCk7XG5cdFx0ZHN0RGF0YVtkc3QgKyAzXSA9IHJldmVyc2VBbHBoYSA/IDI1NSAtIHNyY0RhdGFbc3JjICsgNF0gOiBzcmNEYXRhW3NyYyArIDRdO1xuXHR9XG5cblx0Ly8gZm9yIChsZXQgc3JjID0gMCwgZHN0ID0gMDsgZHN0IDwgc2l6ZTsgc3JjICs9IDUsIGRzdCArPSA0KSB7XG5cdC8vIFx0Y29uc3QgYyA9IDEgLSAoc3JjRGF0YVtzcmMgKyAwXSAvIDI1NSk7XG5cdC8vIFx0Y29uc3QgbSA9IDEgLSAoc3JjRGF0YVtzcmMgKyAxXSAvIDI1NSk7XG5cdC8vIFx0Y29uc3QgeSA9IDEgLSAoc3JjRGF0YVtzcmMgKyAyXSAvIDI1NSk7XG5cdC8vIFx0Ly8gY29uc3QgayA9IHNyY0RhdGFbc3JjICsgM10gLyAyNTU7XG5cdC8vIFx0ZHN0RGF0YVtkc3QgKyAwXSA9ICgoMSAtIGMgKiAwLjgpICogMjU1KSB8IDA7XG5cdC8vIFx0ZHN0RGF0YVtkc3QgKyAxXSA9ICgoMSAtIG0gKiAwLjgpICogMjU1KSB8IDA7XG5cdC8vIFx0ZHN0RGF0YVtkc3QgKyAyXSA9ICgoMSAtIHkgKiAwLjgpICogMjU1KSB8IDA7XG5cdC8vIFx0ZHN0RGF0YVtkc3QgKyAzXSA9IHJldmVyc2VBbHBoYSA/IDI1NSAtIHNyY0RhdGFbc3JjICsgNF0gOiBzcmNEYXRhW3NyYyArIDRdO1xuXHQvLyB9XG59XG5cbmZ1bmN0aW9uIHJlYWREYXRhUmF3KHJlYWRlcjogUHNkUmVhZGVyLCBwaXhlbERhdGE6IFBpeGVsRGF0YSB8IHVuZGVmaW5lZCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHN0ZXA6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIpIHtcblx0Y29uc3Qgc2l6ZSA9IHdpZHRoICogaGVpZ2h0O1xuXHRjb25zdCBidWZmZXIgPSByZWFkQnl0ZXMocmVhZGVyLCBzaXplKTtcblxuXHRpZiAocGl4ZWxEYXRhICYmIG9mZnNldCA8IHN0ZXApIHtcblx0XHRjb25zdCBkYXRhID0gcGl4ZWxEYXRhLmRhdGE7XG5cblx0XHRmb3IgKGxldCBpID0gMCwgcCA9IG9mZnNldCB8IDA7IGkgPCBzaXplOyBpKyssIHAgPSAocCArIHN0ZXApIHwgMCkge1xuXHRcdFx0ZGF0YVtwXSA9IGJ1ZmZlcltpXTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWREYXRhWmlwV2l0aG91dFByZWRpY3Rpb24oXG5cdHJlYWRlcjogUHNkUmVhZGVyLCBsZW5ndGg6IG51bWJlciwgcGl4ZWxEYXRhOiBQaXhlbERhdGEgfCB1bmRlZmluZWQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLFxuXHRzdGVwOiBudW1iZXIsIG9mZnNldDogbnVtYmVyXG4pIHtcblx0Y29uc3QgY29tcHJlc3NlZCA9IHJlYWRCeXRlcyhyZWFkZXIsIGxlbmd0aCk7XG5cdGNvbnN0IGRlY29tcHJlc3NlZCA9IGluZmxhdGUoY29tcHJlc3NlZCk7XG5cdGNvbnN0IHNpemUgPSB3aWR0aCAqIGhlaWdodDtcblxuXHRpZiAocGl4ZWxEYXRhICYmIG9mZnNldCA8IHN0ZXApIHtcblx0XHRjb25zdCBkYXRhID0gcGl4ZWxEYXRhLmRhdGE7XG5cblx0XHRmb3IgKGxldCBpID0gMCwgcCA9IG9mZnNldCB8IDA7IGkgPCBzaXplOyBpKyssIHAgPSAocCArIHN0ZXApIHwgMCkge1xuXHRcdFx0ZGF0YVtwXSA9IGRlY29tcHJlc3NlZFtpXTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWREYXRhUkxFKFxuXHRyZWFkZXI6IFBzZFJlYWRlciwgcGl4ZWxEYXRhOiBQaXhlbERhdGEgfCB1bmRlZmluZWQsIF93aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgc3RlcDogbnVtYmVyLCBvZmZzZXRzOiBudW1iZXJbXSxcblx0bGFyZ2U6IGJvb2xlYW5cbikge1xuXHRjb25zdCBkYXRhID0gcGl4ZWxEYXRhICYmIHBpeGVsRGF0YS5kYXRhO1xuXHRsZXQgbGVuZ3RoczogVWludDE2QXJyYXkgfCBVaW50MzJBcnJheTtcblxuXHRpZiAobGFyZ2UpIHtcblx0XHRsZW5ndGhzID0gbmV3IFVpbnQzMkFycmF5KG9mZnNldHMubGVuZ3RoICogaGVpZ2h0KTtcblxuXHRcdGZvciAobGV0IG8gPSAwLCBsaSA9IDA7IG8gPCBvZmZzZXRzLmxlbmd0aDsgbysrKSB7XG5cdFx0XHRmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrLCBsaSsrKSB7XG5cdFx0XHRcdGxlbmd0aHNbbGldID0gcmVhZFVpbnQzMihyZWFkZXIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRsZW5ndGhzID0gbmV3IFVpbnQxNkFycmF5KG9mZnNldHMubGVuZ3RoICogaGVpZ2h0KTtcblxuXHRcdGZvciAobGV0IG8gPSAwLCBsaSA9IDA7IG8gPCBvZmZzZXRzLmxlbmd0aDsgbysrKSB7XG5cdFx0XHRmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrLCBsaSsrKSB7XG5cdFx0XHRcdGxlbmd0aHNbbGldID0gcmVhZFVpbnQxNihyZWFkZXIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGNvbnN0IGV4dHJhTGltaXQgPSAoc3RlcCAtIDEpIHwgMDsgLy8gMyBmb3IgcmdiLCA0IGZvciBjbXlrXG5cblx0Zm9yIChsZXQgYyA9IDAsIGxpID0gMDsgYyA8IG9mZnNldHMubGVuZ3RoOyBjKyspIHtcblx0XHRjb25zdCBvZmZzZXQgPSBvZmZzZXRzW2NdIHwgMDtcblx0XHRjb25zdCBleHRyYSA9IGMgPiBleHRyYUxpbWl0IHx8IG9mZnNldCA+IGV4dHJhTGltaXQ7XG5cblx0XHRpZiAoIWRhdGEgfHwgZXh0cmEpIHtcblx0XHRcdGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyssIGxpKyspIHtcblx0XHRcdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVuZ3Roc1tsaV0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKGxldCB5ID0gMCwgcCA9IG9mZnNldCB8IDA7IHkgPCBoZWlnaHQ7IHkrKywgbGkrKykge1xuXHRcdFx0XHRjb25zdCBsZW5ndGggPSBsZW5ndGhzW2xpXTtcblx0XHRcdFx0Y29uc3QgYnVmZmVyID0gcmVhZEJ5dGVzKHJlYWRlciwgbGVuZ3RoKTtcblxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0bGV0IGhlYWRlciA9IGJ1ZmZlcltpXTtcblxuXHRcdFx0XHRcdGlmIChoZWFkZXIgPiAxMjgpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gYnVmZmVyWysraV07XG5cdFx0XHRcdFx0XHRoZWFkZXIgPSAoMjU2IC0gaGVhZGVyKSB8IDA7XG5cblx0XHRcdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDw9IGhlYWRlcjsgaiA9IChqICsgMSkgfCAwKSB7XG5cdFx0XHRcdFx0XHRcdGRhdGFbcF0gPSB2YWx1ZTtcblx0XHRcdFx0XHRcdFx0cCA9IChwICsgc3RlcCkgfCAwO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaGVhZGVyIDwgMTI4KSB7XG5cdFx0XHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8PSBoZWFkZXI7IGogPSAoaiArIDEpIHwgMCkge1xuXHRcdFx0XHRcdFx0XHRkYXRhW3BdID0gYnVmZmVyWysraV07XG5cdFx0XHRcdFx0XHRcdHAgPSAocCArIHN0ZXApIHwgMDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gaWdub3JlIDEyOFxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChpID49IGxlbmd0aCkge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFJMRSBkYXRhOiBleGNlZWRlZCBidWZmZXIgc2l6ZSAke2l9LyR7bGVuZ3RofWApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFNlY3Rpb248VD4oXG5cdHJlYWRlcjogUHNkUmVhZGVyLCByb3VuZDogbnVtYmVyLCBmdW5jOiAobGVmdDogKCkgPT4gbnVtYmVyKSA9PiBULCBza2lwRW1wdHkgPSB0cnVlLCBlaWdodEJ5dGVzID0gZmFsc2Vcbik6IFQgfCB1bmRlZmluZWQge1xuXHRsZXQgbGVuZ3RoID0gcmVhZFVpbnQzMihyZWFkZXIpO1xuXG5cdGlmIChlaWdodEJ5dGVzKSB7XG5cdFx0aWYgKGxlbmd0aCAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdTaXplcyBsYXJnZXIgdGhhbiA0R0IgYXJlIG5vdCBzdXBwb3J0ZWQnKTtcblx0XHRsZW5ndGggPSByZWFkVWludDMyKHJlYWRlcik7XG5cdH1cblxuXHRpZiAobGVuZ3RoIDw9IDAgJiYgc2tpcEVtcHR5KSByZXR1cm4gdW5kZWZpbmVkO1xuXG5cdGxldCBlbmQgPSByZWFkZXIub2Zmc2V0ICsgbGVuZ3RoO1xuXHRpZiAoZW5kID4gcmVhZGVyLnZpZXcuYnl0ZUxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdTZWN0aW9uIGV4Y2VlZHMgZmlsZSBzaXplJyk7XG5cblx0Y29uc3QgcmVzdWx0ID0gZnVuYygoKSA9PiBlbmQgLSByZWFkZXIub2Zmc2V0KTtcblxuXHRpZiAocmVhZGVyLm9mZnNldCAhPT0gZW5kICYmIHJlYWRlci5zdHJpY3QpIHtcblx0XHRpZiAocmVhZGVyLm9mZnNldCA+IGVuZCkge1xuXHRcdFx0Ly8gdGhyb3cgbmV3IEVycm9yKCdFeGNlZWRlZCBzZWN0aW9uIGxpbWl0cycpO1xuXHRcdFx0Y29uc29sZS53YXJuKCdFeGNlZWRlZCBzZWN0aW9uIGxpbWl0cycpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyB0aHJvdyBuZXcgRXJyb3IoYFVucmVhZCBzZWN0aW9uIGRhdGE6ICR7ZW5kIC0gcmVhZGVyLm9mZnNldH0gYnl0ZXMgYXQgMHgke3JlYWRlci5vZmZzZXQudG9TdHJpbmcoMTYpfWApO1xuXHRcdFx0Y29uc29sZS53YXJuKCdVbnJlYWQgc2VjdGlvbiBkYXRhJyk7XG5cdFx0fVxuXHR9XG5cblx0d2hpbGUgKGVuZCAlIHJvdW5kKSBlbmQrKztcblx0cmVhZGVyLm9mZnNldCA9IGVuZDtcblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZENvbG9yKHJlYWRlcjogUHNkUmVhZGVyKTogQ29sb3Ige1xuXHRjb25zdCBjb2xvclNwYWNlID0gcmVhZFVpbnQxNihyZWFkZXIpIGFzIENvbG9yU3BhY2U7XG5cblx0c3dpdGNoIChjb2xvclNwYWNlKSB7XG5cdFx0Y2FzZSBDb2xvclNwYWNlLlJHQjoge1xuXHRcdFx0Y29uc3QgciA9IHJlYWRVaW50MTYocmVhZGVyKSAvIDI1Nztcblx0XHRcdGNvbnN0IGcgPSByZWFkVWludDE2KHJlYWRlcikgLyAyNTc7XG5cdFx0XHRjb25zdCBiID0gcmVhZFVpbnQxNihyZWFkZXIpIC8gMjU3O1xuXHRcdFx0c2tpcEJ5dGVzKHJlYWRlciwgMik7XG5cdFx0XHRyZXR1cm4geyByLCBnLCBiIH07XG5cdFx0fVxuXHRcdGNhc2UgQ29sb3JTcGFjZS5IU0I6IHtcblx0XHRcdGNvbnN0IGggPSByZWFkVWludDE2KHJlYWRlcikgLyAweGZmZmY7XG5cdFx0XHRjb25zdCBzID0gcmVhZFVpbnQxNihyZWFkZXIpIC8gMHhmZmZmO1xuXHRcdFx0Y29uc3QgYiA9IHJlYWRVaW50MTYocmVhZGVyKSAvIDB4ZmZmZjtcblx0XHRcdHNraXBCeXRlcyhyZWFkZXIsIDIpO1xuXHRcdFx0cmV0dXJuIHsgaCwgcywgYiB9O1xuXHRcdH1cblx0XHRjYXNlIENvbG9yU3BhY2UuQ01ZSzoge1xuXHRcdFx0Y29uc3QgYyA9IHJlYWRVaW50MTYocmVhZGVyKSAvIDI1Nztcblx0XHRcdGNvbnN0IG0gPSByZWFkVWludDE2KHJlYWRlcikgLyAyNTc7XG5cdFx0XHRjb25zdCB5ID0gcmVhZFVpbnQxNihyZWFkZXIpIC8gMjU3O1xuXHRcdFx0Y29uc3QgayA9IHJlYWRVaW50MTYocmVhZGVyKSAvIDI1Nztcblx0XHRcdHJldHVybiB7IGMsIG0sIHksIGsgfTtcblx0XHR9XG5cdFx0Y2FzZSBDb2xvclNwYWNlLkxhYjoge1xuXHRcdFx0Y29uc3QgbCA9IHJlYWRJbnQxNihyZWFkZXIpIC8gMTAwMDA7XG5cdFx0XHRjb25zdCB0YSA9IHJlYWRJbnQxNihyZWFkZXIpO1xuXHRcdFx0Y29uc3QgdGIgPSByZWFkSW50MTYocmVhZGVyKTtcblx0XHRcdGNvbnN0IGEgPSB0YSA8IDAgPyAodGEgLyAxMjgwMCkgOiAodGEgLyAxMjcwMCk7XG5cdFx0XHRjb25zdCBiID0gdGIgPCAwID8gKHRiIC8gMTI4MDApIDogKHRiIC8gMTI3MDApO1xuXHRcdFx0c2tpcEJ5dGVzKHJlYWRlciwgMik7XG5cdFx0XHRyZXR1cm4geyBsLCBhLCBiIH07XG5cdFx0fVxuXHRcdGNhc2UgQ29sb3JTcGFjZS5HcmF5c2NhbGU6IHtcblx0XHRcdGNvbnN0IGsgPSByZWFkVWludDE2KHJlYWRlcikgKiAyNTUgLyAxMDAwMDtcblx0XHRcdHNraXBCeXRlcyhyZWFkZXIsIDYpO1xuXHRcdFx0cmV0dXJuIHsgayB9O1xuXHRcdH1cblx0XHRkZWZhdWx0OlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbG9yIHNwYWNlJyk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRQYXR0ZXJuKHJlYWRlcjogUHNkUmVhZGVyKTogUGF0dGVybkluZm8ge1xuXHRyZWFkVWludDMyKHJlYWRlcik7IC8vIGxlbmd0aFxuXHRjb25zdCB2ZXJzaW9uID0gcmVhZFVpbnQzMihyZWFkZXIpO1xuXHRpZiAodmVyc2lvbiAhPT0gMSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhdHRlcm4gdmVyc2lvbjogJHt2ZXJzaW9ufWApO1xuXG5cdGNvbnN0IGNvbG9yTW9kZSA9IHJlYWRVaW50MzIocmVhZGVyKSBhcyBDb2xvck1vZGU7XG5cdGNvbnN0IHggPSByZWFkSW50MTYocmVhZGVyKTtcblx0Y29uc3QgeSA9IHJlYWRJbnQxNihyZWFkZXIpO1xuXG5cdC8vIHdlIG9ubHkgc3VwcG9ydCBSR0IgYW5kIGdyYXlzY2FsZSBmb3Igbm93XG5cdGlmIChjb2xvck1vZGUgIT09IENvbG9yTW9kZS5SR0IgJiYgY29sb3JNb2RlICE9PSBDb2xvck1vZGUuR3JheXNjYWxlICYmIGNvbG9yTW9kZSAhPT0gQ29sb3JNb2RlLkluZGV4ZWQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHBhdHRlcm4gY29sb3IgbW9kZTogJHtjb2xvck1vZGV9YCk7XG5cdH1cblxuXHRsZXQgbmFtZSA9IHJlYWRVbmljb2RlU3RyaW5nKHJlYWRlcik7XG5cdGNvbnN0IGlkID0gcmVhZFBhc2NhbFN0cmluZyhyZWFkZXIsIDEpO1xuXHRjb25zdCBwYWxldHRlOiBSR0JbXSA9IFtdO1xuXG5cdGlmIChjb2xvck1vZGUgPT09IENvbG9yTW9kZS5JbmRleGVkKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuXHRcdFx0cGFsZXR0ZS5wdXNoKHtcblx0XHRcdFx0cjogcmVhZFVpbnQ4KHJlYWRlciksXG5cdFx0XHRcdGc6IHJlYWRVaW50OChyZWFkZXIpLFxuXHRcdFx0XHRiOiByZWFkVWludDgocmVhZGVyKSxcblx0XHRcdH0pXG5cdFx0fVxuXG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgNCk7IC8vIG5vIGlkZWEgd2hhdCB0aGlzIGlzXG5cdH1cblxuXHQvLyB2aXJ0dWFsIG1lbW9yeSBhcnJheSBsaXN0XG5cdGNvbnN0IHZlcnNpb24yID0gcmVhZFVpbnQzMihyZWFkZXIpO1xuXHRpZiAodmVyc2lvbjIgIT09IDMpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXR0ZXJuIFZNQUwgdmVyc2lvbjogJHt2ZXJzaW9uMn1gKTtcblxuXHRyZWFkVWludDMyKHJlYWRlcik7IC8vIGxlbmd0aFxuXHRjb25zdCB0b3AgPSByZWFkVWludDMyKHJlYWRlcik7XG5cdGNvbnN0IGxlZnQgPSByZWFkVWludDMyKHJlYWRlcik7XG5cdGNvbnN0IGJvdHRvbSA9IHJlYWRVaW50MzIocmVhZGVyKTtcblx0Y29uc3QgcmlnaHQgPSByZWFkVWludDMyKHJlYWRlcik7XG5cdGNvbnN0IGNoYW5uZWxzQ291bnQgPSByZWFkVWludDMyKHJlYWRlcik7XG5cdGNvbnN0IHdpZHRoID0gcmlnaHQgLSBsZWZ0O1xuXHRjb25zdCBoZWlnaHQgPSBib3R0b20gLSB0b3A7XG5cdGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCAqIDQpO1xuXG5cdGZvciAobGV0IGkgPSAzOyBpIDwgZGF0YS5ieXRlTGVuZ3RoOyBpICs9IDQpIHtcblx0XHRkYXRhW2ldID0gMjU1O1xuXHR9XG5cblx0Zm9yIChsZXQgaSA9IDAsIGNoID0gMDsgaSA8IChjaGFubmVsc0NvdW50ICsgMik7IGkrKykge1xuXHRcdGNvbnN0IGhhcyA9IHJlYWRVaW50MzIocmVhZGVyKTtcblx0XHRpZiAoIWhhcykgY29udGludWU7XG5cblx0XHRjb25zdCBsZW5ndGggPSByZWFkVWludDMyKHJlYWRlcik7XG5cdFx0Y29uc3QgcGl4ZWxEZXB0aCA9IHJlYWRVaW50MzIocmVhZGVyKTtcblx0XHRjb25zdCBjdG9wID0gcmVhZFVpbnQzMihyZWFkZXIpO1xuXHRcdGNvbnN0IGNsZWZ0ID0gcmVhZFVpbnQzMihyZWFkZXIpO1xuXHRcdGNvbnN0IGNib3R0b20gPSByZWFkVWludDMyKHJlYWRlcik7XG5cdFx0Y29uc3QgY3JpZ2h0ID0gcmVhZFVpbnQzMihyZWFkZXIpO1xuXHRcdGNvbnN0IHBpeGVsRGVwdGgyID0gcmVhZFVpbnQxNihyZWFkZXIpO1xuXHRcdGNvbnN0IGNvbXByZXNzaW9uTW9kZSA9IHJlYWRVaW50OChyZWFkZXIpOyAvLyAwIC0gcmF3LCAxIC0gemlwXG5cdFx0Y29uc3QgZGF0YUxlbmd0aCA9IGxlbmd0aCAtICg0ICsgMTYgKyAyICsgMSk7XG5cdFx0Y29uc3QgY2RhdGEgPSByZWFkQnl0ZXMocmVhZGVyLCBkYXRhTGVuZ3RoKTtcblxuXHRcdGlmIChwaXhlbERlcHRoICE9PSA4IHx8IHBpeGVsRGVwdGgyICE9PSA4KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJzE2Yml0IHBpeGVsIGRlcHRoIG5vdCBzdXBwb3J0ZWQgZm9yIHBhdHRlcm5zJyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdyA9IGNyaWdodCAtIGNsZWZ0O1xuXHRcdGNvbnN0IGggPSBjYm90dG9tIC0gY3RvcDtcblx0XHRjb25zdCBveCA9IGNsZWZ0IC0gbGVmdDtcblx0XHRjb25zdCBveSA9IGN0b3AgLSB0b3A7XG5cblx0XHRpZiAoY29tcHJlc3Npb25Nb2RlID09PSAwKSB7XG5cdFx0XHRpZiAoY29sb3JNb2RlID09PSBDb2xvck1vZGUuUkdCICYmIGNoIDwgMykge1xuXHRcdFx0XHRmb3IgKGxldCB5ID0gMDsgeSA8IGg7IHkrKykge1xuXHRcdFx0XHRcdGZvciAobGV0IHggPSAwOyB4IDwgdzsgeCsrKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzcmMgPSB4ICsgeSAqIHc7XG5cdFx0XHRcdFx0XHRjb25zdCBkc3QgPSAob3ggKyB4ICsgKHkgKyBveSkgKiB3aWR0aCkgKiA0O1xuXHRcdFx0XHRcdFx0ZGF0YVtkc3QgKyBjaF0gPSBjZGF0YVtzcmNdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY29sb3JNb2RlID09PSBDb2xvck1vZGUuR3JheXNjYWxlICYmIGNoIDwgMSkge1xuXHRcdFx0XHRmb3IgKGxldCB5ID0gMDsgeSA8IGg7IHkrKykge1xuXHRcdFx0XHRcdGZvciAobGV0IHggPSAwOyB4IDwgdzsgeCsrKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzcmMgPSB4ICsgeSAqIHc7XG5cdFx0XHRcdFx0XHRjb25zdCBkc3QgPSAob3ggKyB4ICsgKHkgKyBveSkgKiB3aWR0aCkgKiA0O1xuXHRcdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSBjZGF0YVtzcmNdO1xuXHRcdFx0XHRcdFx0ZGF0YVtkc3QgKyAwXSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0ZGF0YVtkc3QgKyAxXSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0ZGF0YVtkc3QgKyAyXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY29sb3JNb2RlID09PSBDb2xvck1vZGUuSW5kZXhlZCkge1xuXHRcdFx0XHQvLyBUT0RPOlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0luZGV4ZWQgcGF0dGVybiBjb2xvciBtb2RlIG5vdCBpbXBsZW1lbnRlZCcpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoY29tcHJlc3Npb25Nb2RlID09PSAxKSB7XG5cdFx0XHQvLyBjb25zb2xlLmxvZyh7IGNvbG9yTW9kZSB9KTtcblx0XHRcdC8vIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYygnemlwLmJpbicsIEJ1ZmZlci5mcm9tKGNkYXRhKSk7XG5cdFx0XHQvLyBjb25zdCBkYXRhID0gcmVxdWlyZSgnemxpYicpLmluZmxhdGVSYXdTeW5jKGNkYXRhKTtcblx0XHRcdC8vIGNvbnN0IGRhdGEgPSByZXF1aXJlKCd6bGliJykudW56aXBTeW5jKGNkYXRhKTtcblx0XHRcdC8vIGNvbnNvbGUubG9nKGRhdGEpO1xuXHRcdFx0Ly8gdGhyb3cgbmV3IEVycm9yKCdaaXAgY29tcHJlc3Npb24gbm90IHN1cHBvcnRlZCBmb3IgcGF0dGVybicpO1xuXHRcdFx0Ly8gdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBwYXR0ZXJuIGNvbXByZXNzaW9uJyk7XG5cdFx0XHRjb25zb2xlLmVycm9yKCdVbnN1cHBvcnRlZCBwYXR0ZXJuIGNvbXByZXNzaW9uJyk7XG5cdFx0XHRuYW1lICs9ICcgKGZhaWxlZCB0byBkZWNvZGUpJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhdHRlcm4gY29tcHJlc3Npb24gbW9kZScpO1xuXHRcdH1cblxuXHRcdGNoKys7XG5cdH1cblxuXHQvLyBUT0RPOiB1c2UgY2FudmFzIGluc3RlYWQgb2YgZGF0YSA/XG5cblx0cmV0dXJuIHsgaWQsIG5hbWUsIHgsIHksIGJvdW5kczogeyB4OiBsZWZ0LCB5OiB0b3AsIHc6IHdpZHRoLCBoOiBoZWlnaHQgfSwgZGF0YSB9O1xufVxuIl0sInNvdXJjZVJvb3QiOiJDOlxcUHJvamVjdHNcXGdpdGh1YlxcYWctcHNkXFxzcmMifQ==
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { inflate } from 'pako';
13
+ import { resetImageData, offsetForChannel, decodeBitmap, createCanvas, createImageData, toBlendMode, RAW_IMAGE_DATA, largeAdditionalInfoKeys } from './helpers';
14
+ import { infoHandlersMap } from './additionalInfo';
15
+ import { resourceHandlersMap } from './imageResources';
16
+ export var supportedColorModes = [0 /* ColorMode.Bitmap */, 1 /* ColorMode.Grayscale */, 3 /* ColorMode.RGB */];
17
+ var colorModes = ['bitmap', 'grayscale', 'indexed', 'RGB', 'CMYK', 'multichannel', 'duotone', 'lab'];
18
+ function setupGrayscale(data) {
19
+ var size = data.width * data.height * 4;
20
+ for (var i = 0; i < size; i += 4) {
21
+ data.data[i + 1] = data.data[i];
22
+ data.data[i + 2] = data.data[i];
23
+ }
24
+ }
25
+ export function createReader(buffer, offset, length) {
26
+ var view = new DataView(buffer, offset, length);
27
+ return { view: view, offset: 0, strict: false, debug: false };
28
+ }
29
+ export function warnOrThrow(reader, message) {
30
+ if (reader.strict)
31
+ throw new Error(message);
32
+ if (reader.debug)
33
+ console.warn(message);
34
+ }
35
+ export function readUint8(reader) {
36
+ reader.offset += 1;
37
+ return reader.view.getUint8(reader.offset - 1);
38
+ }
39
+ export function peekUint8(reader) {
40
+ return reader.view.getUint8(reader.offset);
41
+ }
42
+ export function readInt16(reader) {
43
+ reader.offset += 2;
44
+ return reader.view.getInt16(reader.offset - 2, false);
45
+ }
46
+ export function readUint16(reader) {
47
+ reader.offset += 2;
48
+ return reader.view.getUint16(reader.offset - 2, false);
49
+ }
50
+ export function readInt32(reader) {
51
+ reader.offset += 4;
52
+ return reader.view.getInt32(reader.offset - 4, false);
53
+ }
54
+ export function readInt32LE(reader) {
55
+ reader.offset += 4;
56
+ return reader.view.getInt32(reader.offset - 4, true);
57
+ }
58
+ export function readUint32(reader) {
59
+ reader.offset += 4;
60
+ return reader.view.getUint32(reader.offset - 4, false);
61
+ }
62
+ export function readFloat32(reader) {
63
+ reader.offset += 4;
64
+ return reader.view.getFloat32(reader.offset - 4, false);
65
+ }
66
+ export function readFloat64(reader) {
67
+ reader.offset += 8;
68
+ return reader.view.getFloat64(reader.offset - 8, false);
69
+ }
70
+ // 32-bit fixed-point number 16.16
71
+ export function readFixedPoint32(reader) {
72
+ return readInt32(reader) / (1 << 16);
73
+ }
74
+ // 32-bit fixed-point number 8.24
75
+ export function readFixedPointPath32(reader) {
76
+ return readInt32(reader) / (1 << 24);
77
+ }
78
+ export function readBytes(reader, length) {
79
+ var start = reader.view.byteOffset + reader.offset;
80
+ reader.offset += length;
81
+ if ((start + length) > reader.view.buffer.byteLength) {
82
+ // fix for broken PSD files that are missing part of file at the end
83
+ warnOrThrow(reader, 'Reading bytes exceeding buffer length');
84
+ if (length > (100 * 1024 * 1024))
85
+ throw new Error('Reading past end of file'); // limit to 100MB
86
+ var result = new Uint8Array(length);
87
+ var len = Math.min(length, reader.view.byteLength - start);
88
+ if (len > 0)
89
+ result.set(new Uint8Array(reader.view.buffer, start, len));
90
+ return result;
91
+ }
92
+ else {
93
+ return new Uint8Array(reader.view.buffer, start, length);
94
+ }
95
+ }
96
+ export function readSignature(reader) {
97
+ return readShortString(reader, 4);
98
+ }
99
+ export function readPascalString(reader, padTo) {
100
+ var length = readUint8(reader);
101
+ var text = length ? readShortString(reader, length) : '';
102
+ while (++length % padTo) {
103
+ reader.offset++;
104
+ }
105
+ return text;
106
+ }
107
+ export function readUnicodeString(reader) {
108
+ var length = readUint32(reader);
109
+ return readUnicodeStringWithLength(reader, length);
110
+ }
111
+ export function readUnicodeStringWithLength(reader, length) {
112
+ var text = '';
113
+ while (length--) {
114
+ var value = readUint16(reader);
115
+ if (value || length > 0) { // remove trailing \0
116
+ text += String.fromCharCode(value);
117
+ }
118
+ }
119
+ return text;
120
+ }
121
+ export function readAsciiString(reader, length) {
122
+ var text = '';
123
+ while (length--) {
124
+ text += String.fromCharCode(readUint8(reader));
125
+ }
126
+ return text;
127
+ }
128
+ export function skipBytes(reader, count) {
129
+ reader.offset += count;
130
+ }
131
+ export function checkSignature(reader, a, b) {
132
+ var offset = reader.offset;
133
+ var signature = readSignature(reader);
134
+ if (signature !== a && signature !== b) {
135
+ throw new Error("Invalid signature: '".concat(signature, "' at 0x").concat(offset.toString(16)));
136
+ }
137
+ }
138
+ function readShortString(reader, length) {
139
+ var buffer = readBytes(reader, length);
140
+ var result = '';
141
+ for (var i = 0; i < buffer.length; i++) {
142
+ result += String.fromCharCode(buffer[i]);
143
+ }
144
+ return result;
145
+ }
146
+ function isValidSignature(sig) {
147
+ return sig === '8BIM' || sig === 'MeSa' || sig === 'AgHg' || sig === 'PHUT' || sig === 'DCSR';
148
+ }
149
+ export function readPsd(reader, options) {
150
+ var _a;
151
+ if (options === void 0) { options = {}; }
152
+ // header
153
+ checkSignature(reader, '8BPS');
154
+ var version = readUint16(reader);
155
+ if (version !== 1 && version !== 2)
156
+ throw new Error("Invalid PSD file version: ".concat(version));
157
+ skipBytes(reader, 6);
158
+ var channels = readUint16(reader);
159
+ var height = readUint32(reader);
160
+ var width = readUint32(reader);
161
+ var bitsPerChannel = readUint16(reader);
162
+ var colorMode = readUint16(reader);
163
+ var maxSize = version === 1 ? 30000 : 300000;
164
+ if (width > maxSize || height > maxSize)
165
+ throw new Error("Invalid size");
166
+ if (channels > 16)
167
+ throw new Error("Invalid channel count");
168
+ if (bitsPerChannel > 32)
169
+ throw new Error("Invalid bitsPerChannel count");
170
+ if (supportedColorModes.indexOf(colorMode) === -1)
171
+ throw new Error("Color mode not supported: ".concat((_a = colorModes[colorMode]) !== null && _a !== void 0 ? _a : colorMode));
172
+ var psd = { width: width, height: height, channels: channels, bitsPerChannel: bitsPerChannel, colorMode: colorMode };
173
+ var opt = __assign(__assign({}, options), { large: version === 2 });
174
+ var fixOffsets = [0, 1, -1, 2, -2, 3, -3, 4, -4];
175
+ // color mode data
176
+ readSection(reader, 1, function (left) {
177
+ if (opt.throwForMissingFeatures)
178
+ throw new Error('Color mode data not supported');
179
+ skipBytes(reader, left());
180
+ });
181
+ // image resources
182
+ readSection(reader, 1, function (left) {
183
+ var _loop_1 = function () {
184
+ var sigOffset = reader.offset;
185
+ var sig = '';
186
+ // attempt to fix broken document by realigning with the signature
187
+ for (var _i = 0, fixOffsets_1 = fixOffsets; _i < fixOffsets_1.length; _i++) {
188
+ var offset = fixOffsets_1[_i];
189
+ try {
190
+ reader.offset = sigOffset + offset;
191
+ sig = readSignature(reader);
192
+ }
193
+ catch (_a) { }
194
+ if (isValidSignature(sig))
195
+ break;
196
+ }
197
+ if (!isValidSignature(sig)) {
198
+ throw new Error("Invalid signature: '".concat(sig, "' at 0x").concat((sigOffset).toString(16)));
199
+ }
200
+ var id = readUint16(reader);
201
+ readPascalString(reader, 2); // name
202
+ readSection(reader, 2, function (left) {
203
+ var handler = resourceHandlersMap[id];
204
+ var skip = id === 1036 && !!opt.skipThumbnail;
205
+ if (!psd.imageResources) {
206
+ psd.imageResources = {};
207
+ }
208
+ if (handler && !skip) {
209
+ try {
210
+ handler.read(reader, psd.imageResources, left, opt);
211
+ }
212
+ catch (e) {
213
+ if (opt.throwForMissingFeatures)
214
+ throw e;
215
+ skipBytes(reader, left());
216
+ }
217
+ }
218
+ else {
219
+ // options.logMissingFeatures && console.log(`Unhandled image resource: ${id}`);
220
+ skipBytes(reader, left());
221
+ }
222
+ });
223
+ };
224
+ while (left()) {
225
+ _loop_1();
226
+ }
227
+ });
228
+ // layer and mask info
229
+ var globalAlpha = false;
230
+ readSection(reader, 1, function (left) {
231
+ globalAlpha = readLayerInfo(reader, psd, opt);
232
+ // SAI does not include this section
233
+ if (left() > 0) {
234
+ var globalLayerMaskInfo = readGlobalLayerMaskInfo(reader);
235
+ if (globalLayerMaskInfo)
236
+ psd.globalLayerMaskInfo = globalLayerMaskInfo;
237
+ }
238
+ else {
239
+ // revert back to end of section if exceeded section limits
240
+ // opt.logMissingFeatures && console.log('reverting to end of section');
241
+ skipBytes(reader, left());
242
+ }
243
+ while (left() > 0) {
244
+ // sometimes there are empty bytes here
245
+ while (left() && peekUint8(reader) === 0) {
246
+ // opt.logMissingFeatures && console.log('skipping 0 byte');
247
+ skipBytes(reader, 1);
248
+ }
249
+ if (left() >= 12) {
250
+ readAdditionalLayerInfo(reader, psd, psd, opt);
251
+ }
252
+ else {
253
+ // opt.logMissingFeatures && console.log('skipping leftover bytes', left());
254
+ skipBytes(reader, left());
255
+ }
256
+ }
257
+ }, undefined, opt.large);
258
+ var hasChildren = psd.children && psd.children.length;
259
+ var skipComposite = opt.skipCompositeImageData && (opt.skipLayerImageData || hasChildren);
260
+ if (!skipComposite) {
261
+ readImageData(reader, psd, globalAlpha, opt);
262
+ }
263
+ // TODO: show converted color mode instead of original PSD file color mode
264
+ // but add option to preserve file color mode (need to return image data instead of canvas in that case)
265
+ // psd.colorMode = ColorMode.RGB; // we convert all color modes to RGB
266
+ return psd;
267
+ }
268
+ function readLayerInfo(reader, psd, options) {
269
+ var globalAlpha = false;
270
+ readSection(reader, 2, function (left) {
271
+ var layerCount = readInt16(reader);
272
+ if (layerCount < 0) {
273
+ globalAlpha = true;
274
+ layerCount = -layerCount;
275
+ }
276
+ var layers = [];
277
+ var layerChannels = [];
278
+ for (var i = 0; i < layerCount; i++) {
279
+ var _a = readLayerRecord(reader, psd, options), layer = _a.layer, channels = _a.channels;
280
+ layers.push(layer);
281
+ layerChannels.push(channels);
282
+ }
283
+ if (!options.skipLayerImageData) {
284
+ for (var i = 0; i < layerCount; i++) {
285
+ readLayerChannelImageData(reader, psd, layers[i], layerChannels[i], options);
286
+ }
287
+ }
288
+ skipBytes(reader, left());
289
+ if (!psd.children)
290
+ psd.children = [];
291
+ var stack = [psd];
292
+ for (var i = layers.length - 1; i >= 0; i--) {
293
+ var l = layers[i];
294
+ var type = l.sectionDivider ? l.sectionDivider.type : 0 /* SectionDividerType.Other */;
295
+ if (type === 1 /* SectionDividerType.OpenFolder */ || type === 2 /* SectionDividerType.ClosedFolder */) {
296
+ l.opened = type === 1 /* SectionDividerType.OpenFolder */;
297
+ l.children = [];
298
+ stack[stack.length - 1].children.unshift(l);
299
+ stack.push(l);
300
+ }
301
+ else if (type === 3 /* SectionDividerType.BoundingSectionDivider */) {
302
+ stack.pop();
303
+ // this was workaround because I didn't know what `lsdk` section was, now it's probably not needed anymore
304
+ // } else if (l.name === '</Layer group>' && !l.sectionDivider && !l.top && !l.left && !l.bottom && !l.right) {
305
+ // // sometimes layer group terminator doesn't have sectionDivider, so we just guess here (PS bug ?)
306
+ // stack.pop();
307
+ }
308
+ else {
309
+ stack[stack.length - 1].children.unshift(l);
310
+ }
311
+ }
312
+ }, undefined, options.large);
313
+ return globalAlpha;
314
+ }
315
+ function readLayerRecord(reader, psd, options) {
316
+ var layer = {};
317
+ layer.top = readInt32(reader);
318
+ layer.left = readInt32(reader);
319
+ layer.bottom = readInt32(reader);
320
+ layer.right = readInt32(reader);
321
+ var channelCount = readUint16(reader);
322
+ var channels = [];
323
+ for (var i = 0; i < channelCount; i++) {
324
+ var channelID = readInt16(reader);
325
+ var channelLength = readUint32(reader);
326
+ if (options.large) {
327
+ if (channelLength !== 0)
328
+ throw new Error('Sizes larger than 4GB are not supported');
329
+ channelLength = readUint32(reader);
330
+ }
331
+ channels.push({ id: channelID, length: channelLength });
332
+ }
333
+ checkSignature(reader, '8BIM');
334
+ var blendMode = readSignature(reader);
335
+ if (!toBlendMode[blendMode])
336
+ throw new Error("Invalid blend mode: '".concat(blendMode, "'"));
337
+ layer.blendMode = toBlendMode[blendMode];
338
+ layer.opacity = readUint8(reader) / 0xff;
339
+ layer.clipping = readUint8(reader) === 1;
340
+ var flags = readUint8(reader);
341
+ layer.transparencyProtected = (flags & 0x01) !== 0;
342
+ layer.hidden = (flags & 0x02) !== 0;
343
+ // 0x04 - obsolete
344
+ // 0x08 - 1 for Photoshop 5.0 and later, tells if bit 4 has useful information
345
+ // 0x10 - pixel data irrelevant to appearance of document
346
+ // 0x20 - ???
347
+ // if (flags & 0x20) (layer as any)._2 = true; // TEMP !!!!
348
+ skipBytes(reader, 1);
349
+ readSection(reader, 1, function (left) {
350
+ var mask = readLayerMaskData(reader, options);
351
+ if (mask)
352
+ layer.mask = mask;
353
+ /*const blendingRanges =*/ readLayerBlendingRanges(reader);
354
+ layer.name = readPascalString(reader, 4);
355
+ while (left()) {
356
+ readAdditionalLayerInfo(reader, layer, psd, options);
357
+ }
358
+ });
359
+ return { layer: layer, channels: channels };
360
+ }
361
+ function readLayerMaskData(reader, options) {
362
+ return readSection(reader, 1, function (left) {
363
+ if (!left())
364
+ return undefined;
365
+ var mask = {};
366
+ mask.top = readInt32(reader);
367
+ mask.left = readInt32(reader);
368
+ mask.bottom = readInt32(reader);
369
+ mask.right = readInt32(reader);
370
+ mask.defaultColor = readUint8(reader);
371
+ var flags = readUint8(reader);
372
+ mask.positionRelativeToLayer = (flags & 1 /* LayerMaskFlags.PositionRelativeToLayer */) !== 0;
373
+ mask.disabled = (flags & 2 /* LayerMaskFlags.LayerMaskDisabled */) !== 0;
374
+ mask.fromVectorData = (flags & 8 /* LayerMaskFlags.LayerMaskFromRenderingOtherData */) !== 0;
375
+ if (flags & 16 /* LayerMaskFlags.MaskHasParametersAppliedToIt */) {
376
+ var params = readUint8(reader);
377
+ if (params & 1 /* MaskParams.UserMaskDensity */)
378
+ mask.userMaskDensity = readUint8(reader) / 0xff;
379
+ if (params & 2 /* MaskParams.UserMaskFeather */)
380
+ mask.userMaskFeather = readFloat64(reader);
381
+ if (params & 4 /* MaskParams.VectorMaskDensity */)
382
+ mask.vectorMaskDensity = readUint8(reader) / 0xff;
383
+ if (params & 8 /* MaskParams.VectorMaskFeather */)
384
+ mask.vectorMaskFeather = readFloat64(reader);
385
+ }
386
+ if (left() > 2) {
387
+ options.logMissingFeatures && console.log('Unhandled extra mask params');
388
+ // TODO: handle these values
389
+ /*const realFlags =*/ readUint8(reader);
390
+ /*const realUserMaskBackground =*/ readUint8(reader);
391
+ /*const top2 =*/ readInt32(reader);
392
+ /*const left2 =*/ readInt32(reader);
393
+ /*const bottom2 =*/ readInt32(reader);
394
+ /*const right2 =*/ readInt32(reader);
395
+ }
396
+ skipBytes(reader, left());
397
+ return mask;
398
+ });
399
+ }
400
+ function readLayerBlendingRanges(reader) {
401
+ return readSection(reader, 1, function (left) {
402
+ var compositeGrayBlendSource = readUint32(reader);
403
+ var compositeGraphBlendDestinationRange = readUint32(reader);
404
+ var ranges = [];
405
+ while (left()) {
406
+ var sourceRange = readUint32(reader);
407
+ var destRange = readUint32(reader);
408
+ ranges.push({ sourceRange: sourceRange, destRange: destRange });
409
+ }
410
+ return { compositeGrayBlendSource: compositeGrayBlendSource, compositeGraphBlendDestinationRange: compositeGraphBlendDestinationRange, ranges: ranges };
411
+ });
412
+ }
413
+ function readLayerChannelImageData(reader, psd, layer, channels, options) {
414
+ var layerWidth = (layer.right || 0) - (layer.left || 0);
415
+ var layerHeight = (layer.bottom || 0) - (layer.top || 0);
416
+ var cmyk = psd.colorMode === 4 /* ColorMode.CMYK */;
417
+ var imageData;
418
+ if (layerWidth && layerHeight) {
419
+ if (cmyk) {
420
+ imageData = { width: layerWidth, height: layerHeight, data: new Uint8ClampedArray(layerWidth * layerHeight * 5) };
421
+ for (var p = 4; p < imageData.data.byteLength; p += 5)
422
+ imageData.data[p] = 255;
423
+ }
424
+ else {
425
+ imageData = createImageData(layerWidth, layerHeight);
426
+ resetImageData(imageData);
427
+ }
428
+ }
429
+ if (RAW_IMAGE_DATA)
430
+ layer.imageDataRaw = [];
431
+ for (var _i = 0, channels_1 = channels; _i < channels_1.length; _i++) {
432
+ var channel = channels_1[_i];
433
+ if (channel.length === 0)
434
+ continue;
435
+ if (channel.length < 2)
436
+ throw new Error('Invalid channel length');
437
+ var start = reader.offset;
438
+ var compression = readUint16(reader);
439
+ if (channel.id === -2 /* ChannelID.UserMask */) {
440
+ var mask = layer.mask;
441
+ if (!mask)
442
+ throw new Error("Missing layer mask data");
443
+ var maskWidth = (mask.right || 0) - (mask.left || 0);
444
+ var maskHeight = (mask.bottom || 0) - (mask.top || 0);
445
+ if (maskWidth && maskHeight) {
446
+ var maskData = createImageData(maskWidth, maskHeight);
447
+ resetImageData(maskData);
448
+ var start_1 = reader.offset;
449
+ readData(reader, channel.length, maskData, compression, maskWidth, maskHeight, 0, options.large, 4);
450
+ if (RAW_IMAGE_DATA) {
451
+ layer.maskDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start_1, reader.offset - start_1);
452
+ }
453
+ setupGrayscale(maskData);
454
+ if (options.useImageData) {
455
+ mask.imageData = maskData;
456
+ }
457
+ else {
458
+ mask.canvas = createCanvas(maskWidth, maskHeight);
459
+ mask.canvas.getContext('2d').putImageData(maskData, 0, 0);
460
+ }
461
+ }
462
+ }
463
+ else {
464
+ var offset = offsetForChannel(channel.id, cmyk);
465
+ var targetData = imageData;
466
+ if (offset < 0) {
467
+ targetData = undefined;
468
+ if (options.throwForMissingFeatures) {
469
+ throw new Error("Channel not supported: ".concat(channel.id));
470
+ }
471
+ }
472
+ readData(reader, channel.length, targetData, compression, layerWidth, layerHeight, offset, options.large, cmyk ? 5 : 4);
473
+ if (RAW_IMAGE_DATA) {
474
+ layer.imageDataRaw[channel.id] = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start + 2, channel.length - 2);
475
+ }
476
+ reader.offset = start + channel.length;
477
+ if (targetData && psd.colorMode === 1 /* ColorMode.Grayscale */) {
478
+ setupGrayscale(targetData);
479
+ }
480
+ }
481
+ }
482
+ if (imageData) {
483
+ if (cmyk) {
484
+ var cmykData = imageData;
485
+ imageData = createImageData(cmykData.width, cmykData.height);
486
+ cmykToRgb(cmykData, imageData, false);
487
+ }
488
+ if (options.useImageData) {
489
+ layer.imageData = imageData;
490
+ }
491
+ else {
492
+ layer.canvas = createCanvas(layerWidth, layerHeight);
493
+ layer.canvas.getContext('2d').putImageData(imageData, 0, 0);
494
+ }
495
+ }
496
+ }
497
+ function readData(reader, length, data, compression, width, height, offset, large, step) {
498
+ if (compression === 0 /* Compression.RawData */) {
499
+ readDataRaw(reader, data, width, height, step, offset);
500
+ }
501
+ else if (compression === 1 /* Compression.RleCompressed */) {
502
+ readDataRLE(reader, data, width, height, step, [offset], large);
503
+ }
504
+ else if (compression === 2 /* Compression.ZipWithoutPrediction */) {
505
+ readDataZipWithoutPrediction(reader, length, data, width, height, step, offset);
506
+ }
507
+ else if (compression === 3 /* Compression.ZipWithPrediction */) {
508
+ throw new Error("Compression type not supported: ".concat(compression));
509
+ }
510
+ else {
511
+ throw new Error("Invalid Compression type: ".concat(compression));
512
+ }
513
+ }
514
+ function readGlobalLayerMaskInfo(reader) {
515
+ return readSection(reader, 1, function (left) {
516
+ if (!left())
517
+ return undefined;
518
+ var overlayColorSpace = readUint16(reader);
519
+ var colorSpace1 = readUint16(reader);
520
+ var colorSpace2 = readUint16(reader);
521
+ var colorSpace3 = readUint16(reader);
522
+ var colorSpace4 = readUint16(reader);
523
+ var opacity = readUint16(reader) / 0xff;
524
+ var kind = readUint8(reader);
525
+ skipBytes(reader, left()); // 3 bytes of padding ?
526
+ return { overlayColorSpace: overlayColorSpace, colorSpace1: colorSpace1, colorSpace2: colorSpace2, colorSpace3: colorSpace3, colorSpace4: colorSpace4, opacity: opacity, kind: kind };
527
+ });
528
+ }
529
+ function readAdditionalLayerInfo(reader, target, psd, options) {
530
+ var sig = readSignature(reader);
531
+ if (sig !== '8BIM' && sig !== '8B64')
532
+ throw new Error("Invalid signature: '".concat(sig, "' at 0x").concat((reader.offset - 4).toString(16)));
533
+ var key = readSignature(reader);
534
+ // `largeAdditionalInfoKeys` fallback, because some keys don't have 8B64 signature even when they are 64bit
535
+ var u64 = sig === '8B64' || (options.large && largeAdditionalInfoKeys.indexOf(key) !== -1);
536
+ readSection(reader, 2, function (left) {
537
+ var handler = infoHandlersMap[key];
538
+ if (handler) {
539
+ try {
540
+ handler.read(reader, target, left, psd, options);
541
+ }
542
+ catch (e) {
543
+ if (options.throwForMissingFeatures)
544
+ throw e;
545
+ }
546
+ }
547
+ else {
548
+ options.logMissingFeatures && console.log("Unhandled additional info: ".concat(key));
549
+ skipBytes(reader, left());
550
+ }
551
+ if (left()) {
552
+ options.logMissingFeatures && console.log("Unread ".concat(left(), " bytes left for additional info: ").concat(key));
553
+ skipBytes(reader, left());
554
+ }
555
+ }, false, u64);
556
+ }
557
+ function readImageData(reader, psd, globalAlpha, options) {
558
+ var compression = readUint16(reader);
559
+ if (supportedColorModes.indexOf(psd.colorMode) === -1)
560
+ throw new Error("Color mode not supported: ".concat(psd.colorMode));
561
+ if (compression !== 0 /* Compression.RawData */ && compression !== 1 /* Compression.RleCompressed */)
562
+ throw new Error("Compression type not supported: ".concat(compression));
563
+ var imageData = createImageData(psd.width, psd.height);
564
+ resetImageData(imageData);
565
+ switch (psd.colorMode) {
566
+ case 0 /* ColorMode.Bitmap */: {
567
+ var bytes = void 0;
568
+ if (compression === 0 /* Compression.RawData */) {
569
+ bytes = readBytes(reader, Math.ceil(psd.width / 8) * psd.height);
570
+ }
571
+ else if (compression === 1 /* Compression.RleCompressed */) {
572
+ bytes = new Uint8Array(psd.width * psd.height);
573
+ readDataRLE(reader, { data: bytes, width: psd.width, height: psd.height }, psd.width, psd.height, 1, [0], options.large);
574
+ }
575
+ else {
576
+ throw new Error("Bitmap compression not supported: ".concat(compression));
577
+ }
578
+ decodeBitmap(bytes, imageData.data, psd.width, psd.height);
579
+ break;
580
+ }
581
+ case 3 /* ColorMode.RGB */:
582
+ case 1 /* ColorMode.Grayscale */: {
583
+ var channels = psd.colorMode === 1 /* ColorMode.Grayscale */ ? [0] : [0, 1, 2];
584
+ if (psd.channels && psd.channels > 3) {
585
+ for (var i = 3; i < psd.channels; i++) {
586
+ // TODO: store these channels in additional image data
587
+ channels.push(i);
588
+ }
589
+ }
590
+ else if (globalAlpha) {
591
+ channels.push(3);
592
+ }
593
+ if (compression === 0 /* Compression.RawData */) {
594
+ for (var i = 0; i < channels.length; i++) {
595
+ readDataRaw(reader, imageData, psd.width, psd.height, 4, channels[i]);
596
+ }
597
+ }
598
+ else if (compression === 1 /* Compression.RleCompressed */) {
599
+ var start = reader.offset;
600
+ readDataRLE(reader, imageData, psd.width, psd.height, 4, channels, options.large);
601
+ if (RAW_IMAGE_DATA)
602
+ psd.imageDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start, reader.offset - start);
603
+ }
604
+ if (psd.colorMode === 1 /* ColorMode.Grayscale */) {
605
+ setupGrayscale(imageData);
606
+ }
607
+ break;
608
+ }
609
+ case 4 /* ColorMode.CMYK */: {
610
+ if (psd.channels !== 4)
611
+ throw new Error("Invalid channel count");
612
+ var channels = [0, 1, 2, 3];
613
+ if (globalAlpha)
614
+ channels.push(4);
615
+ if (compression === 0 /* Compression.RawData */) {
616
+ throw new Error("Not implemented");
617
+ // TODO: ...
618
+ // for (let i = 0; i < channels.length; i++) {
619
+ // readDataRaw(reader, imageData, channels[i], psd.width, psd.height);
620
+ // }
621
+ }
622
+ else if (compression === 1 /* Compression.RleCompressed */) {
623
+ var cmykImageData = {
624
+ width: imageData.width,
625
+ height: imageData.height,
626
+ data: new Uint8Array(imageData.width * imageData.height * 5),
627
+ };
628
+ var start = reader.offset;
629
+ readDataRLE(reader, cmykImageData, psd.width, psd.height, 5, channels, options.large);
630
+ cmykToRgb(cmykImageData, imageData, true);
631
+ if (RAW_IMAGE_DATA)
632
+ psd.imageDataRaw = new Uint8Array(reader.view.buffer, reader.view.byteOffset + start, reader.offset - start);
633
+ }
634
+ break;
635
+ }
636
+ default: throw new Error("Color mode not supported: ".concat(psd.colorMode));
637
+ }
638
+ if (options.useImageData) {
639
+ psd.imageData = imageData;
640
+ }
641
+ else {
642
+ psd.canvas = createCanvas(psd.width, psd.height);
643
+ psd.canvas.getContext('2d').putImageData(imageData, 0, 0);
644
+ }
645
+ }
646
+ function cmykToRgb(cmyk, rgb, reverseAlpha) {
647
+ var size = rgb.width * rgb.height * 4;
648
+ var srcData = cmyk.data;
649
+ var dstData = rgb.data;
650
+ for (var src = 0, dst = 0; dst < size; src += 5, dst += 4) {
651
+ var c = srcData[src];
652
+ var m = srcData[src + 1];
653
+ var y = srcData[src + 2];
654
+ var k = srcData[src + 3];
655
+ dstData[dst] = ((((c * k) | 0) / 255) | 0);
656
+ dstData[dst + 1] = ((((m * k) | 0) / 255) | 0);
657
+ dstData[dst + 2] = ((((y * k) | 0) / 255) | 0);
658
+ dstData[dst + 3] = reverseAlpha ? 255 - srcData[src + 4] : srcData[src + 4];
659
+ }
660
+ // for (let src = 0, dst = 0; dst < size; src += 5, dst += 4) {
661
+ // const c = 1 - (srcData[src + 0] / 255);
662
+ // const m = 1 - (srcData[src + 1] / 255);
663
+ // const y = 1 - (srcData[src + 2] / 255);
664
+ // // const k = srcData[src + 3] / 255;
665
+ // dstData[dst + 0] = ((1 - c * 0.8) * 255) | 0;
666
+ // dstData[dst + 1] = ((1 - m * 0.8) * 255) | 0;
667
+ // dstData[dst + 2] = ((1 - y * 0.8) * 255) | 0;
668
+ // dstData[dst + 3] = reverseAlpha ? 255 - srcData[src + 4] : srcData[src + 4];
669
+ // }
670
+ }
671
+ function readDataRaw(reader, pixelData, width, height, step, offset) {
672
+ var size = width * height;
673
+ var buffer = readBytes(reader, size);
674
+ if (pixelData && offset < step) {
675
+ var data = pixelData.data;
676
+ for (var i = 0, p = offset | 0; i < size; i++, p = (p + step) | 0) {
677
+ data[p] = buffer[i];
678
+ }
679
+ }
680
+ }
681
+ export function readDataZipWithoutPrediction(reader, length, pixelData, width, height, step, offset) {
682
+ var compressed = readBytes(reader, length);
683
+ var decompressed = inflate(compressed);
684
+ var size = width * height;
685
+ if (pixelData && offset < step) {
686
+ var data = pixelData.data;
687
+ for (var i = 0, p = offset | 0; i < size; i++, p = (p + step) | 0) {
688
+ data[p] = decompressed[i];
689
+ }
690
+ }
691
+ }
692
+ export function readDataRLE(reader, pixelData, _width, height, step, offsets, large) {
693
+ var data = pixelData && pixelData.data;
694
+ var lengths;
695
+ if (large) {
696
+ lengths = new Uint32Array(offsets.length * height);
697
+ for (var o = 0, li = 0; o < offsets.length; o++) {
698
+ for (var y = 0; y < height; y++, li++) {
699
+ lengths[li] = readUint32(reader);
700
+ }
701
+ }
702
+ }
703
+ else {
704
+ lengths = new Uint16Array(offsets.length * height);
705
+ for (var o = 0, li = 0; o < offsets.length; o++) {
706
+ for (var y = 0; y < height; y++, li++) {
707
+ lengths[li] = readUint16(reader);
708
+ }
709
+ }
710
+ }
711
+ var extraLimit = (step - 1) | 0; // 3 for rgb, 4 for cmyk
712
+ for (var c = 0, li = 0; c < offsets.length; c++) {
713
+ var offset = offsets[c] | 0;
714
+ var extra = c > extraLimit || offset > extraLimit;
715
+ if (!data || extra) {
716
+ for (var y = 0; y < height; y++, li++) {
717
+ skipBytes(reader, lengths[li]);
718
+ }
719
+ }
720
+ else {
721
+ for (var y = 0, p = offset | 0; y < height; y++, li++) {
722
+ var length_1 = lengths[li];
723
+ var buffer = readBytes(reader, length_1);
724
+ for (var i = 0; i < length_1; i++) {
725
+ var header = buffer[i];
726
+ if (header > 128) {
727
+ var value = buffer[++i];
728
+ header = (256 - header) | 0;
729
+ for (var j = 0; j <= header; j = (j + 1) | 0) {
730
+ data[p] = value;
731
+ p = (p + step) | 0;
732
+ }
733
+ }
734
+ else if (header < 128) {
735
+ for (var j = 0; j <= header; j = (j + 1) | 0) {
736
+ data[p] = buffer[++i];
737
+ p = (p + step) | 0;
738
+ }
739
+ }
740
+ else {
741
+ // ignore 128
742
+ }
743
+ // This showed up on some images from non-photoshop programs, ignoring it seems to work just fine.
744
+ // if (i >= length) throw new Error(`Invalid RLE data: exceeded buffer size ${i}/${length}`);
745
+ }
746
+ }
747
+ }
748
+ }
749
+ }
750
+ export function readSection(reader, round, func, skipEmpty, eightBytes) {
751
+ if (skipEmpty === void 0) { skipEmpty = true; }
752
+ if (eightBytes === void 0) { eightBytes = false; }
753
+ var length = readUint32(reader);
754
+ if (eightBytes) {
755
+ if (length !== 0)
756
+ throw new Error('Sizes larger than 4GB are not supported');
757
+ length = readUint32(reader);
758
+ }
759
+ if (length <= 0 && skipEmpty)
760
+ return undefined;
761
+ var end = reader.offset + length;
762
+ if (end > reader.view.byteLength)
763
+ throw new Error('Section exceeds file size');
764
+ var result = func(function () { return end - reader.offset; });
765
+ if (reader.offset !== end) {
766
+ if (reader.offset > end) {
767
+ warnOrThrow(reader, 'Exceeded section limits');
768
+ }
769
+ else {
770
+ warnOrThrow(reader, "Unread section data"); // : ${end - reader.offset} bytes at 0x${reader.offset.toString(16)}`);
771
+ }
772
+ }
773
+ while (end % round)
774
+ end++;
775
+ reader.offset = end;
776
+ return result;
777
+ }
778
+ export function readColor(reader) {
779
+ var colorSpace = readUint16(reader);
780
+ switch (colorSpace) {
781
+ case 0 /* ColorSpace.RGB */: {
782
+ var r = readUint16(reader) / 257;
783
+ var g = readUint16(reader) / 257;
784
+ var b = readUint16(reader) / 257;
785
+ skipBytes(reader, 2);
786
+ return { r: r, g: g, b: b };
787
+ }
788
+ case 1 /* ColorSpace.HSB */: {
789
+ var h = readUint16(reader) / 0xffff;
790
+ var s = readUint16(reader) / 0xffff;
791
+ var b = readUint16(reader) / 0xffff;
792
+ skipBytes(reader, 2);
793
+ return { h: h, s: s, b: b };
794
+ }
795
+ case 2 /* ColorSpace.CMYK */: {
796
+ var c = readUint16(reader) / 257;
797
+ var m = readUint16(reader) / 257;
798
+ var y = readUint16(reader) / 257;
799
+ var k = readUint16(reader) / 257;
800
+ return { c: c, m: m, y: y, k: k };
801
+ }
802
+ case 7 /* ColorSpace.Lab */: {
803
+ var l = readInt16(reader) / 10000;
804
+ var ta = readInt16(reader);
805
+ var tb = readInt16(reader);
806
+ var a = ta < 0 ? (ta / 12800) : (ta / 12700);
807
+ var b = tb < 0 ? (tb / 12800) : (tb / 12700);
808
+ skipBytes(reader, 2);
809
+ return { l: l, a: a, b: b };
810
+ }
811
+ case 8 /* ColorSpace.Grayscale */: {
812
+ var k = readUint16(reader) * 255 / 10000;
813
+ skipBytes(reader, 6);
814
+ return { k: k };
815
+ }
816
+ default:
817
+ throw new Error('Invalid color space');
818
+ }
819
+ }
820
+ export function readPattern(reader) {
821
+ readUint32(reader); // length
822
+ var version = readUint32(reader);
823
+ if (version !== 1)
824
+ throw new Error("Invalid pattern version: ".concat(version));
825
+ var colorMode = readUint32(reader);
826
+ var x = readInt16(reader);
827
+ var y = readInt16(reader);
828
+ // we only support RGB and grayscale for now
829
+ if (colorMode !== 3 /* ColorMode.RGB */ && colorMode !== 1 /* ColorMode.Grayscale */ && colorMode !== 2 /* ColorMode.Indexed */) {
830
+ throw new Error("Unsupported pattern color mode: ".concat(colorMode));
831
+ }
832
+ var name = readUnicodeString(reader);
833
+ var id = readPascalString(reader, 1);
834
+ var palette = [];
835
+ if (colorMode === 2 /* ColorMode.Indexed */) {
836
+ for (var i = 0; i < 256; i++) {
837
+ palette.push({
838
+ r: readUint8(reader),
839
+ g: readUint8(reader),
840
+ b: readUint8(reader),
841
+ });
842
+ }
843
+ skipBytes(reader, 4); // no idea what this is
844
+ }
845
+ // virtual memory array list
846
+ var version2 = readUint32(reader);
847
+ if (version2 !== 3)
848
+ throw new Error("Invalid pattern VMAL version: ".concat(version2));
849
+ readUint32(reader); // length
850
+ var top = readUint32(reader);
851
+ var left = readUint32(reader);
852
+ var bottom = readUint32(reader);
853
+ var right = readUint32(reader);
854
+ var channelsCount = readUint32(reader);
855
+ var width = right - left;
856
+ var height = bottom - top;
857
+ var data = new Uint8Array(width * height * 4);
858
+ for (var i = 3; i < data.byteLength; i += 4) {
859
+ data[i] = 255;
860
+ }
861
+ for (var i = 0, ch = 0; i < (channelsCount + 2); i++) {
862
+ var has = readUint32(reader);
863
+ if (!has)
864
+ continue;
865
+ var length_2 = readUint32(reader);
866
+ var pixelDepth = readUint32(reader);
867
+ var ctop = readUint32(reader);
868
+ var cleft = readUint32(reader);
869
+ var cbottom = readUint32(reader);
870
+ var cright = readUint32(reader);
871
+ var pixelDepth2 = readUint16(reader);
872
+ var compressionMode = readUint8(reader); // 0 - raw, 1 - zip
873
+ var dataLength = length_2 - (4 + 16 + 2 + 1);
874
+ var cdata = readBytes(reader, dataLength);
875
+ if (pixelDepth !== 8 || pixelDepth2 !== 8) {
876
+ throw new Error('16bit pixel depth not supported for patterns');
877
+ }
878
+ var w = cright - cleft;
879
+ var h = cbottom - ctop;
880
+ var ox = cleft - left;
881
+ var oy = ctop - top;
882
+ if (compressionMode === 0) {
883
+ if (colorMode === 3 /* ColorMode.RGB */ && ch < 3) {
884
+ for (var y_1 = 0; y_1 < h; y_1++) {
885
+ for (var x_1 = 0; x_1 < w; x_1++) {
886
+ var src = x_1 + y_1 * w;
887
+ var dst = (ox + x_1 + (y_1 + oy) * width) * 4;
888
+ data[dst + ch] = cdata[src];
889
+ }
890
+ }
891
+ }
892
+ if (colorMode === 1 /* ColorMode.Grayscale */ && ch < 1) {
893
+ for (var y_2 = 0; y_2 < h; y_2++) {
894
+ for (var x_2 = 0; x_2 < w; x_2++) {
895
+ var src = x_2 + y_2 * w;
896
+ var dst = (ox + x_2 + (y_2 + oy) * width) * 4;
897
+ var value = cdata[src];
898
+ data[dst + 0] = value;
899
+ data[dst + 1] = value;
900
+ data[dst + 2] = value;
901
+ }
902
+ }
903
+ }
904
+ if (colorMode === 2 /* ColorMode.Indexed */) {
905
+ // TODO:
906
+ throw new Error('Indexed pattern color mode not implemented');
907
+ }
908
+ }
909
+ else if (compressionMode === 1) {
910
+ // console.log({ colorMode });
911
+ // require('fs').writeFileSync('zip.bin', Buffer.from(cdata));
912
+ // const data = require('zlib').inflateRawSync(cdata);
913
+ // const data = require('zlib').unzipSync(cdata);
914
+ // console.log(data);
915
+ // throw new Error('Zip compression not supported for pattern');
916
+ // throw new Error('Unsupported pattern compression');
917
+ console.error('Unsupported pattern compression');
918
+ name += ' (failed to decode)';
919
+ }
920
+ else {
921
+ throw new Error('Invalid pattern compression mode');
922
+ }
923
+ ch++;
924
+ }
925
+ // TODO: use canvas instead of data ?
926
+ return { id: id, name: name, x: x, y: y, bounds: { x: left, y: top, w: width, h: height }, data: data };
927
+ }
928
+ //# sourceMappingURL=psdReader.js.map