ag-psd 15.0.1 → 15.0.3

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 +9164 -8725
  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 -36
  41. package/dist/psdReader.js +974 -959
  42. package/dist/psdReader.js.map +1 -0
  43. package/dist/psdWriter.d.ts +27 -27
  44. package/dist/psdWriter.js +709 -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 -36
  89. package/dist-es/psdReader.js +944 -929
  90. package/dist-es/psdReader.js.map +1 -0
  91. package/dist-es/psdWriter.d.ts +27 -27
  92. package/dist-es/psdWriter.js +685 -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,1616 +1,1661 @@
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 { createEnum } from './helpers';
13
- import { readSignature, readUnicodeString, readUint32, readUint8, readFloat64, readBytes, readAsciiString, readInt32, readFloat32, readInt32LE, readUnicodeStringWithLength } from './psdReader';
14
- import { writeSignature, writeBytes, writeUint32, writeFloat64, writeUint8, writeUnicodeStringWithPadding, writeInt32, writeFloat32, writeUnicodeString } from './psdWriter';
15
- function revMap(map) {
16
- var result = {};
17
- Object.keys(map).forEach(function (key) { return result[map[key]] = key; });
18
- return result;
19
- }
20
- var unitsMap = {
21
- '#Ang': 'Angle',
22
- '#Rsl': 'Density',
23
- '#Rlt': 'Distance',
24
- '#Nne': 'None',
25
- '#Prc': 'Percent',
26
- '#Pxl': 'Pixels',
27
- '#Mlm': 'Millimeters',
28
- '#Pnt': 'Points',
29
- 'RrPi': 'Picas',
30
- 'RrIn': 'Inches',
31
- 'RrCm': 'Centimeters',
32
- };
33
- var unitsMapRev = revMap(unitsMap);
34
- var logErrors = false;
35
- export function setLogErrors(value) {
36
- logErrors = value;
37
- }
38
- function makeType(name, classID) {
39
- return { name: name, classID: classID };
40
- }
41
- var nullType = makeType('', 'null');
42
- var fieldToExtType = {
43
- strokeStyleContent: makeType('', 'solidColorLayer'),
44
- // printProofSetup: makeType('校样设置', 'proofSetup'), // TESTING
45
- printProofSetup: makeType('Proof Setup', 'proofSetup'),
46
- patternFill: makeType('', 'patternFill'),
47
- Grad: makeType('Gradient', 'Grdn'),
48
- ebbl: makeType('', 'ebbl'),
49
- SoFi: makeType('', 'SoFi'),
50
- GrFl: makeType('', 'GrFl'),
51
- sdwC: makeType('', 'RGBC'),
52
- hglC: makeType('', 'RGBC'),
53
- 'Clr ': makeType('', 'RGBC'),
54
- 'tintColor': makeType('', 'RGBC'),
55
- Ofst: makeType('', 'Pnt '),
56
- ChFX: makeType('', 'ChFX'),
57
- MpgS: makeType('', 'ShpC'),
58
- DrSh: makeType('', 'DrSh'),
59
- IrSh: makeType('', 'IrSh'),
60
- OrGl: makeType('', 'OrGl'),
61
- IrGl: makeType('', 'IrGl'),
62
- TrnS: makeType('', 'ShpC'),
63
- Ptrn: makeType('', 'Ptrn'),
64
- FrFX: makeType('', 'FrFX'),
65
- phase: makeType('', 'Pnt '),
66
- frameStep: nullType,
67
- duration: nullType,
68
- workInTime: nullType,
69
- workOutTime: nullType,
70
- audioClipGroupList: nullType,
71
- bounds: makeType('', 'Rctn'),
72
- customEnvelopeWarp: makeType('', 'customEnvelopeWarp'),
73
- warp: makeType('', 'warp'),
74
- 'Sz ': makeType('', 'Pnt '),
75
- origin: makeType('', 'Pnt '),
76
- autoExpandOffset: makeType('', 'Pnt '),
77
- keyOriginShapeBBox: makeType('', 'unitRect'),
78
- Vrsn: nullType,
79
- psVersion: nullType,
80
- docDefaultNewArtboardBackgroundColor: makeType('', 'RGBC'),
81
- artboardRect: makeType('', 'classFloatRect'),
82
- keyOriginRRectRadii: makeType('', 'radii'),
83
- keyOriginBoxCorners: nullType,
84
- rectangleCornerA: makeType('', 'Pnt '),
85
- rectangleCornerB: makeType('', 'Pnt '),
86
- rectangleCornerC: makeType('', 'Pnt '),
87
- rectangleCornerD: makeType('', 'Pnt '),
88
- compInfo: nullType,
89
- Trnf: makeType('Transform', 'Trnf'),
90
- quiltWarp: makeType('', 'quiltWarp'),
91
- generatorSettings: nullType,
92
- crema: nullType,
93
- FrIn: nullType,
94
- blendOptions: nullType,
95
- FXRf: nullType,
96
- Lefx: nullType,
97
- time: nullType,
98
- animKey: nullType,
99
- timeScope: nullType,
100
- inTime: nullType,
101
- outTime: nullType,
102
- sheetStyle: nullType,
103
- translation: nullType,
104
- Skew: nullType,
105
- 'Lnk ': makeType('', 'ExternalFileLink'),
106
- frameReader: makeType('', 'FrameReader'),
107
- effectParams: makeType('', 'motionTrackEffectParams'),
108
- };
109
- var fieldToArrayExtType = {
110
- 'Crv ': makeType('', 'CrPt'),
111
- Clrs: makeType('', 'Clrt'),
112
- Trns: makeType('', 'TrnS'),
113
- keyDescriptorList: nullType,
114
- solidFillMulti: makeType('', 'SoFi'),
115
- gradientFillMulti: makeType('', 'GrFl'),
116
- dropShadowMulti: makeType('', 'DrSh'),
117
- innerShadowMulti: makeType('', 'IrSh'),
118
- frameFXMulti: makeType('', 'FrFX'),
119
- FrIn: nullType,
120
- FSts: nullType,
121
- LaSt: nullType,
122
- sheetTimelineOptions: nullType,
123
- trackList: makeType('', 'animationTrack'),
124
- globalTrackList: makeType('', 'animationTrack'),
125
- keyList: nullType,
126
- audioClipGroupList: nullType,
127
- audioClipList: nullType,
128
- };
129
- var typeToField = {
130
- 'TEXT': [
131
- 'Txt ', 'printerName', 'Nm ', 'Idnt', 'blackAndWhitePresetFileName', 'LUT3DFileName',
132
- 'presetFileName', 'curvesPresetFileName', 'mixerPresetFileName', 'placed', 'description', 'reason',
133
- 'artboardPresetName', 'json', 'groupID', 'clipID', 'relPath', 'fullPath', 'mediaDescriptor',
134
- ],
135
- 'tdta': ['EngineData', 'LUT3DFileData'],
136
- 'long': [
137
- 'TextIndex', 'RndS', 'Mdpn', 'Smth', 'Lctn', 'strokeStyleVersion', 'LaID', 'Vrsn', 'Cnt ',
138
- 'Brgh', 'Cntr', 'means', 'vibrance', 'Strt', 'bwPresetKind', 'presetKind', 'comp', 'compID', 'originalCompID',
139
- 'curvesPresetKind', 'mixerPresetKind', 'uOrder', 'vOrder', 'PgNm', 'totalPages', 'Crop',
140
- 'numerator', 'denominator', 'frameCount', 'Annt', 'keyOriginType', 'unitValueQuadVersion',
141
- 'keyOriginIndex', 'major', 'minor', 'fix', 'docDefaultNewArtboardBackgroundType', 'artboardBackgroundType',
142
- 'numModifyingFX', 'deformNumRows', 'deformNumCols', 'FrID', 'FrDl', 'FsID', 'LCnt', 'AFrm', 'AFSt',
143
- 'numBefore', 'numAfter', 'Spcn', 'minOpacity', 'maxOpacity', 'BlnM', 'sheetID', 'gblA', 'globalAltitude',
144
- 'descVersion', 'frameReaderType', 'LyrI', 'zoomOrigin',
145
- ],
146
- 'enum': [
147
- 'textGridding', 'Ornt', 'warpStyle', 'warpRotate', 'Inte', 'Bltn', 'ClrS',
148
- 'sdwM', 'hglM', 'bvlT', 'bvlS', 'bvlD', 'Md ', 'glwS', 'GrdF', 'GlwT',
149
- 'strokeStyleLineCapType', 'strokeStyleLineJoinType', 'strokeStyleLineAlignment',
150
- 'strokeStyleBlendMode', 'PntT', 'Styl', 'lookupType', 'LUTFormat', 'dataOrder',
151
- 'tableOrder', 'enableCompCore', 'enableCompCoreGPU', 'compCoreSupport', 'compCoreGPUSupport', 'Engn',
152
- 'enableCompCoreThreads', 'gs99', 'FrDs', 'trackID', 'animInterpStyle',
153
- ],
154
- 'bool': [
155
- 'PstS', 'printSixteenBit', 'masterFXSwitch', 'enab', 'uglg', 'antialiasGloss',
156
- 'useShape', 'useTexture', 'uglg', 'antialiasGloss', 'useShape',
157
- 'useTexture', 'Algn', 'Rvrs', 'Dthr', 'Invr', 'VctC', 'ShTr', 'layerConceals',
158
- 'strokeEnabled', 'fillEnabled', 'strokeStyleScaleLock', 'strokeStyleStrokeAdjust',
159
- 'hardProof', 'MpBl', 'paperWhite', 'useLegacy', 'Auto', 'Lab ', 'useTint', 'keyShapeInvalidated',
160
- 'autoExpandEnabled', 'autoNestEnabled', 'autoPositionEnabled', 'shrinkwrapOnSaveEnabled',
161
- 'present', 'showInDialog', 'overprint', 'sheetDisclosed', 'lightsDisclosed', 'meshesDisclosed',
162
- 'materialsDisclosed', 'hasMotion', 'muted', 'Effc', 'selected', 'autoScope', 'fillCanvas',
163
- ],
164
- 'doub': [
165
- 'warpValue', 'warpPerspective', 'warpPerspectiveOther', 'Intr', 'Wdth', 'Hght',
166
- 'strokeStyleMiterLimit', 'strokeStyleResolution', 'layerTime', 'keyOriginResolution',
167
- 'xx', 'xy', 'yx', 'yy', 'tx', 'ty', 'FrGA', 'frameRate', 'audioLevel', 'rotation',
168
- ],
169
- 'UntF': [
170
- 'Scl ', 'sdwO', 'hglO', 'lagl', 'Lald', 'srgR', 'blur', 'Sftn', 'Opct', 'Dstn', 'Angl',
171
- 'Ckmt', 'Nose', 'Inpr', 'ShdN', 'strokeStyleLineWidth', 'strokeStyleLineDashOffset',
172
- 'strokeStyleOpacity', 'H ', 'Top ', 'Left', 'Btom', 'Rght', 'Rslt',
173
- 'topRight', 'topLeft', 'bottomLeft', 'bottomRight',
174
- ],
175
- 'VlLs': [
176
- 'Crv ', 'Clrs', 'Mnm ', 'Mxm ', 'Trns', 'pathList', 'strokeStyleLineDashSet', 'FrLs',
177
- 'LaSt', 'Trnf', 'nonAffineTransform', 'keyDescriptorList', 'guideIndeces', 'gradientFillMulti',
178
- 'solidFillMulti', 'frameFXMulti', 'innerShadowMulti', 'dropShadowMulti', 'FrIn', 'FSts', 'FsFr',
179
- 'sheetTimelineOptions', 'audioClipList', 'trackList', 'globalTrackList', 'keyList', 'audioClipList',
180
- ],
181
- 'ObAr': ['meshPoints', 'quiltSliceX', 'quiltSliceY'],
182
- 'obj ': ['null'],
183
- };
184
- var channels = [
185
- 'Rd ', 'Grn ', 'Bl ', 'Yllw', 'Ylw ', 'Cyn ', 'Mgnt', 'Blck', 'Gry ', 'Lmnc', 'A ', 'B ',
186
- ];
187
- var fieldToArrayType = {
188
- 'Mnm ': 'long',
189
- 'Mxm ': 'long',
190
- 'FrLs': 'long',
191
- 'strokeStyleLineDashSet': 'UntF',
192
- 'Trnf': 'doub',
193
- 'nonAffineTransform': 'doub',
194
- 'keyDescriptorList': 'Objc',
195
- 'gradientFillMulti': 'Objc',
196
- 'solidFillMulti': 'Objc',
197
- 'frameFXMulti': 'Objc',
198
- 'innerShadowMulti': 'Objc',
199
- 'dropShadowMulti': 'Objc',
200
- 'LaSt': 'Objc',
201
- 'FrIn': 'Objc',
202
- 'FSts': 'Objc',
203
- 'FsFr': 'long',
204
- 'blendOptions': 'Objc',
205
- 'sheetTimelineOptions': 'Objc',
206
- 'keyList': 'Objc',
207
- };
208
- var fieldToType = {};
209
- for (var _i = 0, _a = Object.keys(typeToField); _i < _a.length; _i++) {
210
- var type = _a[_i];
211
- for (var _b = 0, _c = typeToField[type]; _b < _c.length; _b++) {
212
- var field = _c[_b];
213
- fieldToType[field] = type;
214
- }
215
- }
216
- for (var _d = 0, _e = Object.keys(fieldToExtType); _d < _e.length; _d++) {
217
- var field = _e[_d];
218
- if (!fieldToType[field])
219
- fieldToType[field] = 'Objc';
220
- }
221
- for (var _f = 0, _g = Object.keys(fieldToArrayExtType); _f < _g.length; _f++) {
222
- var field = _g[_f];
223
- fieldToArrayType[field] = 'Objc';
224
- }
225
- function getTypeByKey(key, value, root, parent) {
226
- if (key === 'Sz ') {
227
- return ('Wdth' in value) ? 'Objc' : (('units' in value) ? 'UntF' : 'doub');
228
- }
229
- else if (key === 'Type') {
230
- return typeof value === 'string' ? 'enum' : 'long';
231
- }
232
- else if (key === 'AntA') {
233
- return typeof value === 'string' ? 'enum' : 'bool';
234
- }
235
- else if ((key === 'Hrzn' || key === 'Vrtc') && parent.Type === 'keyType.Pstn') {
236
- return 'long';
237
- }
238
- else if (key === 'Hrzn' || key === 'Vrtc' || key === 'Top ' || key === 'Left' || key === 'Btom' || key === 'Rght') {
239
- return typeof value === 'number' ? 'doub' : 'UntF';
240
- }
241
- else if (key === 'Vrsn') {
242
- return typeof value === 'number' ? 'long' : 'Objc';
243
- }
244
- else if (key === 'Rd ' || key === 'Grn ' || key === 'Bl ') {
245
- return root === 'artd' ? 'long' : 'doub';
246
- }
247
- else if (key === 'Trnf') {
248
- return Array.isArray(value) ? 'VlLs' : 'Objc';
249
- }
250
- else {
251
- return fieldToType[key];
252
- }
253
- }
254
- export function readAsciiStringOrClassId(reader) {
255
- var length = readInt32(reader);
256
- return readAsciiString(reader, length || 4);
257
- }
258
- function writeAsciiStringOrClassId(writer, value) {
259
- if (value.length === 4 && value !== 'warp' && value !== 'time' && value !== 'hold') {
260
- // write classId
261
- writeInt32(writer, 0);
262
- writeSignature(writer, value);
263
- }
264
- else {
265
- // write ascii string
266
- writeInt32(writer, value.length);
267
- for (var i = 0; i < value.length; i++) {
268
- writeUint8(writer, value.charCodeAt(i));
269
- }
270
- }
271
- }
272
- export function readDescriptorStructure(reader) {
273
- var object = {};
274
- // object.__struct =
275
- readClassStructure(reader);
276
- var itemsCount = readUint32(reader);
277
- // console.log('//', object.__struct);
278
- for (var i = 0; i < itemsCount; i++) {
279
- var key = readAsciiStringOrClassId(reader);
280
- var type = readSignature(reader);
281
- // console.log(`> '${key}' '${type}'`);
282
- var data = readOSType(reader, type);
283
- // if (!getTypeByKey(key, data)) console.log(`> '${key}' '${type}'`, data);
284
- object[key] = data;
285
- }
286
- return object;
287
- }
288
- export function writeDescriptorStructure(writer, name, classId, value, root) {
289
- if (logErrors && !classId)
290
- console.log('Missing classId for: ', name, classId, value);
291
- // write class structure
292
- writeUnicodeStringWithPadding(writer, name);
293
- writeAsciiStringOrClassId(writer, classId);
294
- var keys = Object.keys(value);
295
- writeUint32(writer, keys.length);
296
- for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
297
- var key = keys_1[_i];
298
- var type = getTypeByKey(key, value[key], root, value);
299
- var extType = fieldToExtType[key];
300
- if (key === 'Scl ' && 'Hrzn' in value[key]) {
301
- type = 'Objc';
302
- extType = nullType;
303
- }
304
- else if (key === 'audioClipGroupList' && keys.length === 1) {
305
- type = 'VlLs';
306
- }
307
- else if ((key === 'Strt' || key === 'Brgh') && 'H ' in value) {
308
- type = 'doub';
309
- }
310
- else if (key === 'Strt') {
311
- type = 'Objc';
312
- extType = nullType;
313
- }
314
- else if (channels.indexOf(key) !== -1) {
315
- type = (classId === 'RGBC' && root !== 'artd') ? 'doub' : 'long';
316
- }
317
- else if (key === 'profile') {
318
- type = classId === 'printOutput' ? 'TEXT' : 'tdta';
319
- }
320
- else if (key === 'strokeStyleContent') {
321
- if (value[key]['Clr ']) {
322
- extType = makeType('', 'solidColorLayer');
323
- }
324
- else if (value[key].Grad) {
325
- extType = makeType('', 'gradientLayer');
326
- }
327
- else if (value[key].Ptrn) {
328
- extType = makeType('', 'patternLayer');
329
- }
330
- else {
331
- logErrors && console.log('Invalid strokeStyleContent value', value[key]);
332
- }
333
- }
334
- else if (key === 'bounds' && root === 'quiltWarp') {
335
- extType = makeType('', 'classFloatRect');
336
- }
337
- if (extType && extType.classID === 'RGBC') {
338
- if ('H ' in value[key])
339
- extType = { classID: 'HSBC', name: '' };
340
- // TODO: other color spaces
341
- }
342
- writeAsciiStringOrClassId(writer, key);
343
- writeSignature(writer, type || 'long');
344
- writeOSType(writer, type || 'long', value[key], key, extType, root);
345
- if (logErrors && !type)
346
- console.log("Missing descriptor field type for: '".concat(key, "' in"), value);
347
- }
348
- }
349
- function readOSType(reader, type) {
350
- switch (type) {
351
- case 'obj ': // Reference
352
- return readReferenceStructure(reader);
353
- case 'Objc': // Descriptor
354
- case 'GlbO': // GlobalObject same as Descriptor
355
- return readDescriptorStructure(reader);
356
- case 'VlLs': { // List
357
- var length_1 = readInt32(reader);
358
- var items = [];
359
- for (var i = 0; i < length_1; i++) {
360
- var type_1 = readSignature(reader);
361
- // console.log(' >', type);
362
- items.push(readOSType(reader, type_1));
363
- }
364
- return items;
365
- }
366
- case 'doub': // Double
367
- return readFloat64(reader);
368
- case 'UntF': { // Unit double
369
- var units = readSignature(reader);
370
- var value = readFloat64(reader);
371
- if (!unitsMap[units])
372
- throw new Error("Invalid units: ".concat(units));
373
- return { units: unitsMap[units], value: value };
374
- }
375
- case 'UnFl': { // Unit float
376
- var units = readSignature(reader);
377
- var value = readFloat32(reader);
378
- if (!unitsMap[units])
379
- throw new Error("Invalid units: ".concat(units));
380
- return { units: unitsMap[units], value: value };
381
- }
382
- case 'TEXT': // String
383
- return readUnicodeString(reader);
384
- case 'enum': { // Enumerated
385
- var type_2 = readAsciiStringOrClassId(reader);
386
- var value = readAsciiStringOrClassId(reader);
387
- return "".concat(type_2, ".").concat(value);
388
- }
389
- case 'long': // Integer
390
- return readInt32(reader);
391
- case 'comp': { // Large Integer
392
- var low = readUint32(reader);
393
- var high = readUint32(reader);
394
- return { low: low, high: high };
395
- }
396
- case 'bool': // Boolean
397
- return !!readUint8(reader);
398
- case 'type': // Class
399
- case 'GlbC': // Class
400
- return readClassStructure(reader);
401
- case 'alis': { // Alias
402
- var length_2 = readInt32(reader);
403
- return readAsciiString(reader, length_2);
404
- }
405
- case 'tdta': { // Raw Data
406
- var length_3 = readInt32(reader);
407
- return readBytes(reader, length_3);
408
- }
409
- case 'ObAr': { // Object array
410
- readInt32(reader); // version: 16
411
- readUnicodeString(reader); // name: ''
412
- readAsciiStringOrClassId(reader); // 'rationalPoint'
413
- var length_4 = readInt32(reader);
414
- var items = [];
415
- for (var i = 0; i < length_4; i++) {
416
- var type1 = readAsciiStringOrClassId(reader); // type Hrzn | Vrtc
417
- readSignature(reader); // UnFl
418
- readSignature(reader); // units ? '#Pxl'
419
- var valuesCount = readInt32(reader);
420
- var values = [];
421
- for (var j = 0; j < valuesCount; j++) {
422
- values.push(readFloat64(reader));
423
- }
424
- items.push({ type: type1, values: values });
425
- }
426
- return items;
427
- }
428
- case 'Pth ': { // File path
429
- /*const length =*/ readInt32(reader);
430
- var sig = readSignature(reader);
431
- /*const pathSize =*/ readInt32LE(reader);
432
- var charsCount = readInt32LE(reader);
433
- var path = readUnicodeStringWithLength(reader, charsCount);
434
- return { sig: sig, path: path };
435
- }
436
- default:
437
- throw new Error("Invalid TySh descriptor OSType: ".concat(type, " at ").concat(reader.offset.toString(16)));
438
- }
439
- }
440
- var ObArTypes = {
441
- meshPoints: 'rationalPoint',
442
- quiltSliceX: 'UntF',
443
- quiltSliceY: 'UntF',
444
- };
445
- function writeOSType(writer, type, value, key, extType, root) {
446
- switch (type) {
447
- case 'obj ': // Reference
448
- writeReferenceStructure(writer, key, value);
449
- break;
450
- case 'Objc': // Descriptor
451
- case 'GlbO': // GlobalObject same as Descriptor
452
- if (!extType)
453
- throw new Error("Missing ext type for: '".concat(key, "' (").concat(JSON.stringify(value), ")"));
454
- writeDescriptorStructure(writer, extType.name, extType.classID, value, root);
455
- break;
456
- case 'VlLs': // List
457
- writeInt32(writer, value.length);
458
- for (var i = 0; i < value.length; i++) {
459
- var type_3 = fieldToArrayType[key];
460
- writeSignature(writer, type_3 || 'long');
461
- writeOSType(writer, type_3 || 'long', value[i], '', fieldToArrayExtType[key], root);
462
- if (logErrors && !type_3)
463
- console.log("Missing descriptor array type for: '".concat(key, "' in"), value);
464
- }
465
- break;
466
- case 'doub': // Double
467
- writeFloat64(writer, value);
468
- break;
469
- case 'UntF': // Unit double
470
- if (!unitsMapRev[value.units])
471
- throw new Error("Invalid units: ".concat(value.units, " in ").concat(key));
472
- writeSignature(writer, unitsMapRev[value.units]);
473
- writeFloat64(writer, value.value);
474
- break;
475
- case 'UnFl': // Unit float
476
- if (!unitsMapRev[value.units])
477
- throw new Error("Invalid units: ".concat(value.units, " in ").concat(key));
478
- writeSignature(writer, unitsMapRev[value.units]);
479
- writeFloat32(writer, value.value);
480
- break;
481
- case 'TEXT': // String
482
- writeUnicodeStringWithPadding(writer, value);
483
- break;
484
- case 'enum': { // Enumerated
485
- var _a = value.split('.'), _type = _a[0], val = _a[1];
486
- writeAsciiStringOrClassId(writer, _type);
487
- writeAsciiStringOrClassId(writer, val);
488
- break;
489
- }
490
- case 'long': // Integer
491
- writeInt32(writer, value);
492
- break;
493
- // case 'comp': // Large Integer
494
- // writeLargeInteger(reader);
495
- case 'bool': // Boolean
496
- writeUint8(writer, value ? 1 : 0);
497
- break;
498
- // case 'type': // Class
499
- // case 'GlbC': // Class
500
- // writeClassStructure(reader);
501
- // case 'alis': // Alias
502
- // writeAliasStructure(reader);
503
- case 'tdta': // Raw Data
504
- writeInt32(writer, value.byteLength);
505
- writeBytes(writer, value);
506
- break;
507
- case 'ObAr': { // Object array
508
- writeInt32(writer, 16); // version
509
- writeUnicodeStringWithPadding(writer, ''); // name
510
- var type_4 = ObArTypes[key];
511
- if (!type_4)
512
- throw new Error("Not implemented ObArType for: ".concat(key));
513
- writeAsciiStringOrClassId(writer, type_4);
514
- writeInt32(writer, value.length);
515
- for (var i = 0; i < value.length; i++) {
516
- writeAsciiStringOrClassId(writer, value[i].type); // Hrzn | Vrtc
517
- writeSignature(writer, 'UnFl');
518
- writeSignature(writer, '#Pxl');
519
- writeInt32(writer, value[i].values.length);
520
- for (var j = 0; j < value[i].values.length; j++) {
521
- writeFloat64(writer, value[i].values[j]);
522
- }
523
- }
524
- break;
525
- }
526
- // case 'Pth ': // File path
527
- // writeFilePath(reader);
528
- default:
529
- throw new Error("Not implemented descriptor OSType: ".concat(type));
530
- }
531
- }
532
- function readReferenceStructure(reader) {
533
- var itemsCount = readInt32(reader);
534
- var items = [];
535
- for (var i = 0; i < itemsCount; i++) {
536
- var type = readSignature(reader);
537
- switch (type) {
538
- case 'prop': { // Property
539
- readClassStructure(reader);
540
- var keyID = readAsciiStringOrClassId(reader);
541
- items.push(keyID);
542
- break;
543
- }
544
- case 'Clss': // Class
545
- items.push(readClassStructure(reader));
546
- break;
547
- case 'Enmr': { // Enumerated Reference
548
- readClassStructure(reader);
549
- var typeID = readAsciiStringOrClassId(reader);
550
- var value = readAsciiStringOrClassId(reader);
551
- items.push("".concat(typeID, ".").concat(value));
552
- break;
553
- }
554
- case 'rele': { // Offset
555
- // const { name, classID } =
556
- readClassStructure(reader);
557
- items.push(readUint32(reader));
558
- break;
559
- }
560
- case 'Idnt': // Identifier
561
- items.push(readInt32(reader));
562
- break;
563
- case 'indx': // Index
564
- items.push(readInt32(reader));
565
- break;
566
- case 'name': { // Name
567
- readClassStructure(reader);
568
- items.push(readUnicodeString(reader));
569
- break;
570
- }
571
- default:
572
- throw new Error("Invalid descriptor reference type: ".concat(type));
573
- }
574
- }
575
- return items;
576
- }
577
- function writeReferenceStructure(writer, _key, items) {
578
- writeInt32(writer, items.length);
579
- for (var i = 0; i < items.length; i++) {
580
- var value = items[i];
581
- var type = 'unknown';
582
- if (typeof value === 'string') {
583
- if (/^[a-z]+\.[a-z]+$/i.test(value)) {
584
- type = 'Enmr';
585
- }
586
- else {
587
- type = 'name';
588
- }
589
- }
590
- writeSignature(writer, type);
591
- switch (type) {
592
- // case 'prop': // Property
593
- // case 'Clss': // Class
594
- case 'Enmr': { // Enumerated Reference
595
- var _a = value.split('.'), typeID = _a[0], enumValue = _a[1];
596
- writeClassStructure(writer, '\0', typeID);
597
- writeAsciiStringOrClassId(writer, typeID);
598
- writeAsciiStringOrClassId(writer, enumValue);
599
- break;
600
- }
601
- // case 'rele': // Offset
602
- // case 'Idnt': // Identifier
603
- // case 'indx': // Index
604
- case 'name': { // Name
605
- writeClassStructure(writer, '\0', 'Lyr ');
606
- writeUnicodeString(writer, value + '\0');
607
- break;
608
- }
609
- default:
610
- throw new Error("Invalid descriptor reference type: ".concat(type));
611
- }
612
- }
613
- return items;
614
- }
615
- function readClassStructure(reader) {
616
- var name = readUnicodeString(reader);
617
- var classID = readAsciiStringOrClassId(reader);
618
- // console.log({ name, classID });
619
- return { name: name, classID: classID };
620
- }
621
- function writeClassStructure(writer, name, classID) {
622
- writeUnicodeString(writer, name);
623
- writeAsciiStringOrClassId(writer, classID);
624
- }
625
- export function readVersionAndDescriptor(reader) {
626
- var version = readUint32(reader);
627
- if (version !== 16)
628
- throw new Error("Invalid descriptor version: ".concat(version));
629
- var desc = readDescriptorStructure(reader);
630
- // console.log(require('util').inspect(desc, false, 99, true));
631
- return desc;
632
- }
633
- export function writeVersionAndDescriptor(writer, name, classID, descriptor, root) {
634
- if (root === void 0) { root = ''; }
635
- writeUint32(writer, 16); // version
636
- writeDescriptorStructure(writer, name, classID, descriptor, root);
637
- }
638
- export function horzVrtcToXY(hv) {
639
- return { x: hv.Hrzn, y: hv.Vrtc };
640
- }
641
- export function xyToHorzVrtc(xy) {
642
- return { Hrzn: xy.x, Vrtc: xy.y };
643
- }
644
- function parseFxObject(fx) {
645
- var stroke = {
646
- enabled: !!fx.enab,
647
- position: FStl.decode(fx.Styl),
648
- fillType: FrFl.decode(fx.PntT),
649
- blendMode: BlnM.decode(fx['Md ']),
650
- opacity: parsePercent(fx.Opct),
651
- size: parseUnits(fx['Sz ']),
652
- };
653
- if (fx.present !== undefined)
654
- stroke.present = fx.present;
655
- if (fx.showInDialog !== undefined)
656
- stroke.showInDialog = fx.showInDialog;
657
- if (fx.overprint !== undefined)
658
- stroke.overprint = fx.overprint;
659
- if (fx['Clr '])
660
- stroke.color = parseColor(fx['Clr ']);
661
- if (fx.Grad)
662
- stroke.gradient = parseGradientContent(fx);
663
- if (fx.Ptrn)
664
- stroke.pattern = parsePatternContent(fx);
665
- return stroke;
666
- }
667
- function serializeFxObject(stroke) {
668
- var FrFX = {};
669
- FrFX.enab = !!stroke.enabled;
670
- if (stroke.present !== undefined)
671
- FrFX.present = !!stroke.present;
672
- if (stroke.showInDialog !== undefined)
673
- FrFX.showInDialog = !!stroke.showInDialog;
674
- FrFX.Styl = FStl.encode(stroke.position);
675
- FrFX.PntT = FrFl.encode(stroke.fillType);
676
- FrFX['Md '] = BlnM.encode(stroke.blendMode);
677
- FrFX.Opct = unitsPercent(stroke.opacity);
678
- FrFX['Sz '] = unitsValue(stroke.size, 'size');
679
- if (stroke.color)
680
- FrFX['Clr '] = serializeColor(stroke.color);
681
- if (stroke.gradient)
682
- FrFX = __assign(__assign({}, FrFX), serializeGradientContent(stroke.gradient));
683
- if (stroke.pattern)
684
- FrFX = __assign(__assign({}, FrFX), serializePatternContent(stroke.pattern));
685
- if (stroke.overprint !== undefined)
686
- FrFX.overprint = !!stroke.overprint;
687
- return FrFX;
688
- }
689
- export function serializeEffects(e, log, multi) {
690
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
691
- var info = multi ? {
692
- 'Scl ': unitsPercent((_a = e.scale) !== null && _a !== void 0 ? _a : 1),
693
- masterFXSwitch: !e.disabled,
694
- } : {
695
- masterFXSwitch: !e.disabled,
696
- 'Scl ': unitsPercent((_b = e.scale) !== null && _b !== void 0 ? _b : 1),
697
- };
698
- var arrayKeys = ['dropShadow', 'innerShadow', 'solidFill', 'gradientOverlay', 'stroke'];
699
- for (var _i = 0, arrayKeys_1 = arrayKeys; _i < arrayKeys_1.length; _i++) {
700
- var key = arrayKeys_1[_i];
701
- if (e[key] && !Array.isArray(e[key]))
702
- throw new Error("".concat(key, " should be an array"));
703
- }
704
- if (((_c = e.dropShadow) === null || _c === void 0 ? void 0 : _c[0]) && !multi)
705
- info.DrSh = serializeEffectObject(e.dropShadow[0], 'dropShadow', log);
706
- if (((_d = e.dropShadow) === null || _d === void 0 ? void 0 : _d[0]) && multi)
707
- info.dropShadowMulti = e.dropShadow.map(function (i) { return serializeEffectObject(i, 'dropShadow', log); });
708
- if (((_e = e.innerShadow) === null || _e === void 0 ? void 0 : _e[0]) && !multi)
709
- info.IrSh = serializeEffectObject(e.innerShadow[0], 'innerShadow', log);
710
- if (((_f = e.innerShadow) === null || _f === void 0 ? void 0 : _f[0]) && multi)
711
- info.innerShadowMulti = e.innerShadow.map(function (i) { return serializeEffectObject(i, 'innerShadow', log); });
712
- if (e.outerGlow)
713
- info.OrGl = serializeEffectObject(e.outerGlow, 'outerGlow', log);
714
- if (((_g = e.solidFill) === null || _g === void 0 ? void 0 : _g[0]) && multi)
715
- info.solidFillMulti = e.solidFill.map(function (i) { return serializeEffectObject(i, 'solidFill', log); });
716
- if (((_h = e.gradientOverlay) === null || _h === void 0 ? void 0 : _h[0]) && multi)
717
- info.gradientFillMulti = e.gradientOverlay.map(function (i) { return serializeEffectObject(i, 'gradientOverlay', log); });
718
- if (((_j = e.stroke) === null || _j === void 0 ? void 0 : _j[0]) && multi)
719
- info.frameFXMulti = e.stroke.map(function (i) { return serializeFxObject(i); });
720
- if (e.innerGlow)
721
- info.IrGl = serializeEffectObject(e.innerGlow, 'innerGlow', log);
722
- if (e.bevel)
723
- info.ebbl = serializeEffectObject(e.bevel, 'bevel', log);
724
- if (((_k = e.solidFill) === null || _k === void 0 ? void 0 : _k[0]) && !multi)
725
- info.SoFi = serializeEffectObject(e.solidFill[0], 'solidFill', log);
726
- if (e.patternOverlay)
727
- info.patternFill = serializeEffectObject(e.patternOverlay, 'patternOverlay', log);
728
- if (((_l = e.gradientOverlay) === null || _l === void 0 ? void 0 : _l[0]) && !multi)
729
- info.GrFl = serializeEffectObject(e.gradientOverlay[0], 'gradientOverlay', log);
730
- if (e.satin)
731
- info.ChFX = serializeEffectObject(e.satin, 'satin', log);
732
- if (((_m = e.stroke) === null || _m === void 0 ? void 0 : _m[0]) && !multi)
733
- info.FrFX = serializeFxObject((_o = e.stroke) === null || _o === void 0 ? void 0 : _o[0]);
734
- if (multi) {
735
- info.numModifyingFX = 0;
736
- for (var _p = 0, _q = Object.keys(e); _p < _q.length; _p++) {
737
- var key = _q[_p];
738
- var value = e[key];
739
- if (Array.isArray(value)) {
740
- for (var _r = 0, value_1 = value; _r < value_1.length; _r++) {
741
- var effect = value_1[_r];
742
- if (effect.enabled)
743
- info.numModifyingFX++;
744
- }
745
- }
746
- }
747
- }
748
- return info;
749
- }
750
- export function parseEffects(info, log) {
751
- var effects = {};
752
- if (!info.masterFXSwitch)
753
- effects.disabled = true;
754
- if (info['Scl '])
755
- effects.scale = parsePercent(info['Scl ']);
756
- if (info.DrSh)
757
- effects.dropShadow = [parseEffectObject(info.DrSh, log)];
758
- if (info.dropShadowMulti)
759
- effects.dropShadow = info.dropShadowMulti.map(function (i) { return parseEffectObject(i, log); });
760
- if (info.IrSh)
761
- effects.innerShadow = [parseEffectObject(info.IrSh, log)];
762
- if (info.innerShadowMulti)
763
- effects.innerShadow = info.innerShadowMulti.map(function (i) { return parseEffectObject(i, log); });
764
- if (info.OrGl)
765
- effects.outerGlow = parseEffectObject(info.OrGl, log);
766
- if (info.IrGl)
767
- effects.innerGlow = parseEffectObject(info.IrGl, log);
768
- if (info.ebbl)
769
- effects.bevel = parseEffectObject(info.ebbl, log);
770
- if (info.SoFi)
771
- effects.solidFill = [parseEffectObject(info.SoFi, log)];
772
- if (info.solidFillMulti)
773
- effects.solidFill = info.solidFillMulti.map(function (i) { return parseEffectObject(i, log); });
774
- if (info.patternFill)
775
- effects.patternOverlay = parseEffectObject(info.patternFill, log);
776
- if (info.GrFl)
777
- effects.gradientOverlay = [parseEffectObject(info.GrFl, log)];
778
- if (info.gradientFillMulti)
779
- effects.gradientOverlay = info.gradientFillMulti.map(function (i) { return parseEffectObject(i, log); });
780
- if (info.ChFX)
781
- effects.satin = parseEffectObject(info.ChFX, log);
782
- if (info.FrFX)
783
- effects.stroke = [parseFxObject(info.FrFX)];
784
- if (info.frameFXMulti)
785
- effects.stroke = info.frameFXMulti.map(function (i) { return parseFxObject(i); });
786
- return effects;
787
- }
788
- function parseKeyList(keyList, logMissingFeatures) {
789
- var keys = [];
790
- for (var j = 0; j < keyList.length; j++) {
791
- var key = keyList[j];
792
- var time = key.time, selected = key.selected, animKey = key.animKey;
793
- var interpolation = animInterpStyleEnum.decode(key.animInterpStyle);
794
- switch (animKey.Type) {
795
- case 'keyType.Opct':
796
- keys.push({ interpolation: interpolation, time: time, selected: selected, type: 'opacity', value: parsePercent(animKey.Opct) });
797
- break;
798
- case 'keyType.Pstn':
799
- keys.push({ interpolation: interpolation, time: time, selected: selected, type: 'position', x: animKey.Hrzn, y: animKey.Vrtc });
800
- break;
801
- case 'keyType.Trnf':
802
- keys.push({
803
- interpolation: interpolation,
804
- time: time,
805
- selected: selected,
806
- type: 'transform',
807
- scale: horzVrtcToXY(animKey['Scl ']), skew: horzVrtcToXY(animKey.Skew), rotation: animKey.rotation, translation: horzVrtcToXY(animKey.translation)
808
- });
809
- break;
810
- case 'keyType.sheetStyle': {
811
- var key_1 = { interpolation: interpolation, time: time, selected: selected, type: 'style' };
812
- if (animKey.sheetStyle.Lefx)
813
- key_1.style = parseEffects(animKey.sheetStyle.Lefx, logMissingFeatures);
814
- keys.push(key_1);
815
- break;
816
- }
817
- case 'keyType.globalLighting': {
818
- keys.push({
819
- interpolation: interpolation,
820
- time: time,
821
- selected: selected,
822
- type: 'globalLighting',
823
- globalAngle: animKey.gblA, globalAltitude: animKey.globalAltitude
824
- });
825
- break;
826
- }
827
- default: throw new Error("Unsupported keyType value");
828
- }
829
- }
830
- return keys;
831
- }
832
- function serializeKeyList(keys) {
833
- var keyList = [];
834
- for (var j = 0; j < keys.length; j++) {
835
- var key = keys[j];
836
- var time = key.time, _a = key.selected, selected = _a === void 0 ? false : _a, interpolation = key.interpolation;
837
- var animInterpStyle = animInterpStyleEnum.encode(interpolation);
838
- var animKey = void 0;
839
- switch (key.type) {
840
- case 'opacity':
841
- animKey = { Type: 'keyType.Opct', Opct: unitsPercent(key.value) };
842
- break;
843
- case 'position':
844
- animKey = { Type: 'keyType.Pstn', Hrzn: key.x, Vrtc: key.y };
845
- break;
846
- case 'transform':
847
- animKey = { Type: 'keyType.Trnf', 'Scl ': xyToHorzVrtc(key.scale), Skew: xyToHorzVrtc(key.skew), rotation: key.rotation, translation: xyToHorzVrtc(key.translation) };
848
- break;
849
- case 'style':
850
- animKey = { Type: 'keyType.sheetStyle', sheetStyle: { Vrsn: 1, blendOptions: {} } };
851
- if (key.style)
852
- animKey.sheetStyle = { Vrsn: 1, Lefx: serializeEffects(key.style, false, false), blendOptions: {} };
853
- break;
854
- case 'globalLighting': {
855
- animKey = { Type: 'keyType.globalLighting', gblA: key.globalAngle, globalAltitude: key.globalAltitude };
856
- break;
857
- }
858
- default: throw new Error("Unsupported keyType value");
859
- }
860
- keyList.push({ Vrsn: 1, animInterpStyle: animInterpStyle, time: time, animKey: animKey, selected: selected });
861
- }
862
- return keyList;
863
- }
864
- export function parseTrackList(trackList, logMissingFeatures) {
865
- var tracks = [];
866
- for (var i = 0; i < trackList.length; i++) {
867
- var tr = trackList[i];
868
- var track = {
869
- type: stdTrackID.decode(tr.trackID),
870
- enabled: tr.enab,
871
- keys: parseKeyList(tr.keyList, logMissingFeatures),
872
- };
873
- if (tr.effectParams) {
874
- track.effectParams = {
875
- fillCanvas: tr.effectParams.fillCanvas,
876
- zoomOrigin: tr.effectParams.zoomOrigin,
877
- keys: parseKeyList(tr.effectParams.keyList, logMissingFeatures),
878
- };
879
- }
880
- tracks.push(track);
881
- }
882
- return tracks;
883
- }
884
- export function serializeTrackList(tracks) {
885
- var trackList = [];
886
- for (var i = 0; i < tracks.length; i++) {
887
- var t = tracks[i];
888
- trackList.push(__assign(__assign({ trackID: stdTrackID.encode(t.type), Vrsn: 1, enab: !!t.enabled, Effc: !!t.effectParams }, (t.effectParams ? {
889
- effectParams: {
890
- keyList: serializeKeyList(t.keys),
891
- fillCanvas: t.effectParams.fillCanvas,
892
- zoomOrigin: t.effectParams.zoomOrigin,
893
- }
894
- } : {})), { keyList: serializeKeyList(t.keys) }));
895
- }
896
- return trackList;
897
- }
898
- function parseEffectObject(obj, reportErrors) {
899
- var result = {};
900
- for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {
901
- var key = _a[_i];
902
- var val = obj[key];
903
- switch (key) {
904
- case 'enab':
905
- result.enabled = !!val;
906
- break;
907
- case 'uglg':
908
- result.useGlobalLight = !!val;
909
- break;
910
- case 'AntA':
911
- result.antialiased = !!val;
912
- break;
913
- case 'Algn':
914
- result.align = !!val;
915
- break;
916
- case 'Dthr':
917
- result.dither = !!val;
918
- break;
919
- case 'Invr':
920
- result.invert = !!val;
921
- break;
922
- case 'Rvrs':
923
- result.reverse = !!val;
924
- break;
925
- case 'Clr ':
926
- result.color = parseColor(val);
927
- break;
928
- case 'hglC':
929
- result.highlightColor = parseColor(val);
930
- break;
931
- case 'sdwC':
932
- result.shadowColor = parseColor(val);
933
- break;
934
- case 'Styl':
935
- result.position = FStl.decode(val);
936
- break;
937
- case 'Md ':
938
- result.blendMode = BlnM.decode(val);
939
- break;
940
- case 'hglM':
941
- result.highlightBlendMode = BlnM.decode(val);
942
- break;
943
- case 'sdwM':
944
- result.shadowBlendMode = BlnM.decode(val);
945
- break;
946
- case 'bvlS':
947
- result.style = BESl.decode(val);
948
- break;
949
- case 'bvlD':
950
- result.direction = BESs.decode(val);
951
- break;
952
- case 'bvlT':
953
- result.technique = bvlT.decode(val);
954
- break;
955
- case 'GlwT':
956
- result.technique = BETE.decode(val);
957
- break;
958
- case 'glwS':
959
- result.source = IGSr.decode(val);
960
- break;
961
- case 'Type':
962
- result.type = GrdT.decode(val);
963
- break;
964
- case 'gs99':
965
- result.interpolationMethod = gradientInterpolationMethodType.decode(val);
966
- break;
967
- case 'Opct':
968
- result.opacity = parsePercent(val);
969
- break;
970
- case 'hglO':
971
- result.highlightOpacity = parsePercent(val);
972
- break;
973
- case 'sdwO':
974
- result.shadowOpacity = parsePercent(val);
975
- break;
976
- case 'lagl':
977
- result.angle = parseAngle(val);
978
- break;
979
- case 'Angl':
980
- result.angle = parseAngle(val);
981
- break;
982
- case 'Lald':
983
- result.altitude = parseAngle(val);
984
- break;
985
- case 'Sftn':
986
- result.soften = parseUnits(val);
987
- break;
988
- case 'srgR':
989
- result.strength = parsePercent(val);
990
- break;
991
- case 'blur':
992
- result.size = parseUnits(val);
993
- break;
994
- case 'Nose':
995
- result.noise = parsePercent(val);
996
- break;
997
- case 'Inpr':
998
- result.range = parsePercent(val);
999
- break;
1000
- case 'Ckmt':
1001
- result.choke = parseUnits(val);
1002
- break;
1003
- case 'ShdN':
1004
- result.jitter = parsePercent(val);
1005
- break;
1006
- case 'Dstn':
1007
- result.distance = parseUnits(val);
1008
- break;
1009
- case 'Scl ':
1010
- result.scale = parsePercent(val);
1011
- break;
1012
- case 'Ptrn':
1013
- result.pattern = { name: val['Nm '], id: val.Idnt };
1014
- break;
1015
- case 'phase':
1016
- result.phase = { x: val.Hrzn, y: val.Vrtc };
1017
- break;
1018
- case 'Ofst':
1019
- result.offset = { x: parsePercent(val.Hrzn), y: parsePercent(val.Vrtc) };
1020
- break;
1021
- case 'MpgS':
1022
- case 'TrnS':
1023
- result.contour = {
1024
- name: val['Nm '],
1025
- curve: val['Crv '].map(function (p) { return ({ x: p.Hrzn, y: p.Vrtc }); }),
1026
- };
1027
- break;
1028
- case 'Grad':
1029
- result.gradient = parseGradient(val);
1030
- break;
1031
- case 'useTexture':
1032
- case 'useShape':
1033
- case 'layerConceals':
1034
- case 'present':
1035
- case 'showInDialog':
1036
- case 'antialiasGloss':
1037
- result[key] = val;
1038
- break;
1039
- default:
1040
- reportErrors && console.log("Invalid effect key: '".concat(key, "', value:"), val);
1041
- }
1042
- }
1043
- return result;
1044
- }
1045
- function serializeEffectObject(obj, objName, reportErrors) {
1046
- var result = {};
1047
- for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {
1048
- var objKey = _a[_i];
1049
- var key = objKey;
1050
- var val = obj[key];
1051
- switch (key) {
1052
- case 'enabled':
1053
- result.enab = !!val;
1054
- break;
1055
- case 'useGlobalLight':
1056
- result.uglg = !!val;
1057
- break;
1058
- case 'antialiased':
1059
- result.AntA = !!val;
1060
- break;
1061
- case 'align':
1062
- result.Algn = !!val;
1063
- break;
1064
- case 'dither':
1065
- result.Dthr = !!val;
1066
- break;
1067
- case 'invert':
1068
- result.Invr = !!val;
1069
- break;
1070
- case 'reverse':
1071
- result.Rvrs = !!val;
1072
- break;
1073
- case 'color':
1074
- result['Clr '] = serializeColor(val);
1075
- break;
1076
- case 'highlightColor':
1077
- result.hglC = serializeColor(val);
1078
- break;
1079
- case 'shadowColor':
1080
- result.sdwC = serializeColor(val);
1081
- break;
1082
- case 'position':
1083
- result.Styl = FStl.encode(val);
1084
- break;
1085
- case 'blendMode':
1086
- result['Md '] = BlnM.encode(val);
1087
- break;
1088
- case 'highlightBlendMode':
1089
- result.hglM = BlnM.encode(val);
1090
- break;
1091
- case 'shadowBlendMode':
1092
- result.sdwM = BlnM.encode(val);
1093
- break;
1094
- case 'style':
1095
- result.bvlS = BESl.encode(val);
1096
- break;
1097
- case 'direction':
1098
- result.bvlD = BESs.encode(val);
1099
- break;
1100
- case 'technique':
1101
- if (objName === 'bevel') {
1102
- result.bvlT = bvlT.encode(val);
1103
- }
1104
- else {
1105
- result.GlwT = BETE.encode(val);
1106
- }
1107
- break;
1108
- case 'source':
1109
- result.glwS = IGSr.encode(val);
1110
- break;
1111
- case 'type':
1112
- result.Type = GrdT.encode(val);
1113
- break;
1114
- case 'interpolationMethod':
1115
- result.gs99 = gradientInterpolationMethodType.encode(val);
1116
- break;
1117
- case 'opacity':
1118
- result.Opct = unitsPercent(val);
1119
- break;
1120
- case 'highlightOpacity':
1121
- result.hglO = unitsPercent(val);
1122
- break;
1123
- case 'shadowOpacity':
1124
- result.sdwO = unitsPercent(val);
1125
- break;
1126
- case 'angle':
1127
- if (objName === 'gradientOverlay') {
1128
- result.Angl = unitsAngle(val);
1129
- }
1130
- else {
1131
- result.lagl = unitsAngle(val);
1132
- }
1133
- break;
1134
- case 'altitude':
1135
- result.Lald = unitsAngle(val);
1136
- break;
1137
- case 'soften':
1138
- result.Sftn = unitsValue(val, key);
1139
- break;
1140
- case 'strength':
1141
- result.srgR = unitsPercent(val);
1142
- break;
1143
- case 'size':
1144
- result.blur = unitsValue(val, key);
1145
- break;
1146
- case 'noise':
1147
- result.Nose = unitsPercent(val);
1148
- break;
1149
- case 'range':
1150
- result.Inpr = unitsPercent(val);
1151
- break;
1152
- case 'choke':
1153
- result.Ckmt = unitsValue(val, key);
1154
- break;
1155
- case 'jitter':
1156
- result.ShdN = unitsPercent(val);
1157
- break;
1158
- case 'distance':
1159
- result.Dstn = unitsValue(val, key);
1160
- break;
1161
- case 'scale':
1162
- result['Scl '] = unitsPercent(val);
1163
- break;
1164
- case 'pattern':
1165
- result.Ptrn = { 'Nm ': val.name, Idnt: val.id };
1166
- break;
1167
- case 'phase':
1168
- result.phase = { Hrzn: val.x, Vrtc: val.y };
1169
- break;
1170
- case 'offset':
1171
- result.Ofst = { Hrzn: unitsPercent(val.x), Vrtc: unitsPercent(val.y) };
1172
- break;
1173
- case 'contour': {
1174
- result[objName === 'satin' ? 'MpgS' : 'TrnS'] = {
1175
- 'Nm ': val.name,
1176
- 'Crv ': val.curve.map(function (p) { return ({ Hrzn: p.x, Vrtc: p.y }); }),
1177
- };
1178
- break;
1179
- }
1180
- case 'gradient':
1181
- result.Grad = serializeGradient(val);
1182
- break;
1183
- case 'useTexture':
1184
- case 'useShape':
1185
- case 'layerConceals':
1186
- case 'present':
1187
- case 'showInDialog':
1188
- case 'antialiasGloss':
1189
- result[key] = val;
1190
- break;
1191
- default:
1192
- reportErrors && console.log("Invalid effect key: '".concat(key, "', value:"), val);
1193
- }
1194
- }
1195
- return result;
1196
- }
1197
- function parseGradient(grad) {
1198
- if (grad.GrdF === 'GrdF.CstS') {
1199
- var samples_1 = grad.Intr || 4096;
1200
- return {
1201
- type: 'solid',
1202
- name: grad['Nm '],
1203
- smoothness: grad.Intr / 4096,
1204
- colorStops: grad.Clrs.map(function (s) { return ({
1205
- color: parseColor(s['Clr ']),
1206
- location: s.Lctn / samples_1,
1207
- midpoint: s.Mdpn / 100,
1208
- }); }),
1209
- opacityStops: grad.Trns.map(function (s) { return ({
1210
- opacity: parsePercent(s.Opct),
1211
- location: s.Lctn / samples_1,
1212
- midpoint: s.Mdpn / 100,
1213
- }); }),
1214
- };
1215
- }
1216
- else {
1217
- return {
1218
- type: 'noise',
1219
- name: grad['Nm '],
1220
- roughness: grad.Smth / 4096,
1221
- colorModel: ClrS.decode(grad.ClrS),
1222
- randomSeed: grad.RndS,
1223
- restrictColors: !!grad.VctC,
1224
- addTransparency: !!grad.ShTr,
1225
- min: grad['Mnm '].map(function (x) { return x / 100; }),
1226
- max: grad['Mxm '].map(function (x) { return x / 100; }),
1227
- };
1228
- }
1229
- }
1230
- function serializeGradient(grad) {
1231
- var _a, _b;
1232
- if (grad.type === 'solid') {
1233
- var samples_2 = Math.round(((_a = grad.smoothness) !== null && _a !== void 0 ? _a : 1) * 4096);
1234
- return {
1235
- 'Nm ': grad.name || '',
1236
- GrdF: 'GrdF.CstS',
1237
- Intr: samples_2,
1238
- Clrs: grad.colorStops.map(function (s) {
1239
- var _a;
1240
- return ({
1241
- 'Clr ': serializeColor(s.color),
1242
- Type: 'Clry.UsrS',
1243
- Lctn: Math.round(s.location * samples_2),
1244
- Mdpn: Math.round(((_a = s.midpoint) !== null && _a !== void 0 ? _a : 0.5) * 100),
1245
- });
1246
- }),
1247
- Trns: grad.opacityStops.map(function (s) {
1248
- var _a;
1249
- return ({
1250
- Opct: unitsPercent(s.opacity),
1251
- Lctn: Math.round(s.location * samples_2),
1252
- Mdpn: Math.round(((_a = s.midpoint) !== null && _a !== void 0 ? _a : 0.5) * 100),
1253
- });
1254
- }),
1255
- };
1256
- }
1257
- else {
1258
- return {
1259
- GrdF: 'GrdF.ClNs',
1260
- 'Nm ': grad.name || '',
1261
- ShTr: !!grad.addTransparency,
1262
- VctC: !!grad.restrictColors,
1263
- ClrS: ClrS.encode(grad.colorModel),
1264
- RndS: grad.randomSeed || 0,
1265
- Smth: Math.round(((_b = grad.roughness) !== null && _b !== void 0 ? _b : 1) * 4096),
1266
- 'Mnm ': (grad.min || [0, 0, 0, 0]).map(function (x) { return x * 100; }),
1267
- 'Mxm ': (grad.max || [1, 1, 1, 1]).map(function (x) { return x * 100; }),
1268
- };
1269
- }
1270
- }
1271
- function parseGradientContent(descriptor) {
1272
- var result = parseGradient(descriptor.Grad);
1273
- result.style = GrdT.decode(descriptor.Type);
1274
- if (descriptor.Dthr !== undefined)
1275
- result.dither = descriptor.Dthr;
1276
- if (descriptor.Rvrs !== undefined)
1277
- result.reverse = descriptor.Rvrs;
1278
- if (descriptor.Angl !== undefined)
1279
- result.angle = parseAngle(descriptor.Angl);
1280
- if (descriptor['Scl '] !== undefined)
1281
- result.scale = parsePercent(descriptor['Scl ']);
1282
- if (descriptor.Algn !== undefined)
1283
- result.align = descriptor.Algn;
1284
- if (descriptor.Ofst !== undefined) {
1285
- result.offset = {
1286
- x: parsePercent(descriptor.Ofst.Hrzn),
1287
- y: parsePercent(descriptor.Ofst.Vrtc)
1288
- };
1289
- }
1290
- return result;
1291
- }
1292
- function parsePatternContent(descriptor) {
1293
- var result = {
1294
- name: descriptor.Ptrn['Nm '],
1295
- id: descriptor.Ptrn.Idnt,
1296
- };
1297
- if (descriptor.Lnkd !== undefined)
1298
- result.linked = descriptor.Lnkd;
1299
- if (descriptor.phase !== undefined)
1300
- result.phase = { x: descriptor.phase.Hrzn, y: descriptor.phase.Vrtc };
1301
- return result;
1302
- }
1303
- export function parseVectorContent(descriptor) {
1304
- if ('Grad' in descriptor) {
1305
- return parseGradientContent(descriptor);
1306
- }
1307
- else if ('Ptrn' in descriptor) {
1308
- return __assign({ type: 'pattern' }, parsePatternContent(descriptor));
1309
- }
1310
- else if ('Clr ' in descriptor) {
1311
- return { type: 'color', color: parseColor(descriptor['Clr ']) };
1312
- }
1313
- else {
1314
- throw new Error('Invalid vector content');
1315
- }
1316
- }
1317
- function serializeGradientContent(content) {
1318
- var result = {};
1319
- if (content.dither !== undefined)
1320
- result.Dthr = content.dither;
1321
- if (content.reverse !== undefined)
1322
- result.Rvrs = content.reverse;
1323
- if (content.angle !== undefined)
1324
- result.Angl = unitsAngle(content.angle);
1325
- result.Type = GrdT.encode(content.style);
1326
- if (content.align !== undefined)
1327
- result.Algn = content.align;
1328
- if (content.scale !== undefined)
1329
- result['Scl '] = unitsPercent(content.scale);
1330
- if (content.offset) {
1331
- result.Ofst = {
1332
- Hrzn: unitsPercent(content.offset.x),
1333
- Vrtc: unitsPercent(content.offset.y),
1334
- };
1335
- }
1336
- result.Grad = serializeGradient(content);
1337
- return result;
1338
- }
1339
- function serializePatternContent(content) {
1340
- var result = {
1341
- Ptrn: {
1342
- 'Nm ': content.name || '',
1343
- Idnt: content.id || '',
1344
- }
1345
- };
1346
- if (content.linked !== undefined)
1347
- result.Lnkd = !!content.linked;
1348
- if (content.phase !== undefined)
1349
- result.phase = { Hrzn: content.phase.x, Vrtc: content.phase.y };
1350
- return result;
1351
- }
1352
- export function serializeVectorContent(content) {
1353
- if (content.type === 'color') {
1354
- return { key: 'SoCo', descriptor: { 'Clr ': serializeColor(content.color) } };
1355
- }
1356
- else if (content.type === 'pattern') {
1357
- return { key: 'PtFl', descriptor: serializePatternContent(content) };
1358
- }
1359
- else {
1360
- return { key: 'GdFl', descriptor: serializeGradientContent(content) };
1361
- }
1362
- }
1363
- export function parseColor(color) {
1364
- if ('H ' in color) {
1365
- return { h: parsePercentOrAngle(color['H ']), s: color.Strt, b: color.Brgh };
1366
- }
1367
- else if ('Rd ' in color) {
1368
- return { r: color['Rd '], g: color['Grn '], b: color['Bl '] };
1369
- }
1370
- else if ('Cyn ' in color) {
1371
- return { c: color['Cyn '], m: color.Mgnt, y: color['Ylw '], k: color.Blck };
1372
- }
1373
- else if ('Gry ' in color) {
1374
- return { k: color['Gry '] };
1375
- }
1376
- else if ('Lmnc' in color) {
1377
- return { l: color.Lmnc, a: color['A '], b: color['B '] };
1378
- }
1379
- else {
1380
- throw new Error('Unsupported color descriptor');
1381
- }
1382
- }
1383
- export function serializeColor(color) {
1384
- if (!color) {
1385
- return { 'Rd ': 0, 'Grn ': 0, 'Bl ': 0 };
1386
- }
1387
- else if ('r' in color) {
1388
- return { 'Rd ': color.r || 0, 'Grn ': color.g || 0, 'Bl ': color.b || 0 };
1389
- }
1390
- else if ('h' in color) {
1391
- return { 'H ': unitsAngle(color.h * 360), Strt: color.s || 0, Brgh: color.b || 0 };
1392
- }
1393
- else if ('c' in color) {
1394
- return { 'Cyn ': color.c || 0, Mgnt: color.m || 0, 'Ylw ': color.y || 0, Blck: color.k || 0 };
1395
- }
1396
- else if ('l' in color) {
1397
- return { Lmnc: color.l || 0, 'A ': color.a || 0, 'B ': color.b || 0 };
1398
- }
1399
- else if ('k' in color) {
1400
- return { 'Gry ': color.k };
1401
- }
1402
- else {
1403
- throw new Error('Invalid color value');
1404
- }
1405
- }
1406
- export function parseAngle(x) {
1407
- if (x === undefined)
1408
- return 0;
1409
- if (x.units !== 'Angle')
1410
- throw new Error("Invalid units: ".concat(x.units));
1411
- return x.value;
1412
- }
1413
- export function parsePercent(x) {
1414
- if (x === undefined)
1415
- return 1;
1416
- if (x.units !== 'Percent')
1417
- throw new Error("Invalid units: ".concat(x.units));
1418
- return x.value / 100;
1419
- }
1420
- export function parsePercentOrAngle(x) {
1421
- if (x === undefined)
1422
- return 1;
1423
- if (x.units === 'Percent')
1424
- return x.value / 100;
1425
- if (x.units === 'Angle')
1426
- return x.value / 360;
1427
- throw new Error("Invalid units: ".concat(x.units));
1428
- }
1429
- export function parseUnits(_a) {
1430
- var units = _a.units, value = _a.value;
1431
- if (units !== 'Pixels' && units !== 'Millimeters' && units !== 'Points' && units !== 'None' &&
1432
- units !== 'Picas' && units !== 'Inches' && units !== 'Centimeters' && units !== 'Density') {
1433
- throw new Error("Invalid units: ".concat(JSON.stringify({ units: units, value: value })));
1434
- }
1435
- return { value: value, units: units };
1436
- }
1437
- export function parseUnitsOrNumber(value, units) {
1438
- if (units === void 0) { units = 'Pixels'; }
1439
- if (typeof value === 'number')
1440
- return { value: value, units: units };
1441
- return parseUnits(value);
1442
- }
1443
- export function parseUnitsToNumber(_a, expectedUnits) {
1444
- var units = _a.units, value = _a.value;
1445
- if (units !== expectedUnits)
1446
- throw new Error("Invalid units: ".concat(JSON.stringify({ units: units, value: value })));
1447
- return value;
1448
- }
1449
- export function unitsAngle(value) {
1450
- return { units: 'Angle', value: value || 0 };
1451
- }
1452
- export function unitsPercent(value) {
1453
- return { units: 'Percent', value: Math.round((value || 0) * 100) };
1454
- }
1455
- export function unitsValue(x, key) {
1456
- if (x == null)
1457
- return { units: 'Pixels', value: 0 };
1458
- if (typeof x !== 'object')
1459
- throw new Error("Invalid value: ".concat(JSON.stringify(x), " (key: ").concat(key, ") (should have value and units)"));
1460
- var units = x.units, value = x.value;
1461
- if (typeof value !== 'number')
1462
- throw new Error("Invalid value in ".concat(JSON.stringify(x), " (key: ").concat(key, ")"));
1463
- if (units !== 'Pixels' && units !== 'Millimeters' && units !== 'Points' && units !== 'None' &&
1464
- units !== 'Picas' && units !== 'Inches' && units !== 'Centimeters' && units !== 'Density') {
1465
- throw new Error("Invalid units in ".concat(JSON.stringify(x), " (key: ").concat(key, ")"));
1466
- }
1467
- return { units: units, value: value };
1468
- }
1469
- export var textGridding = createEnum('textGridding', 'none', {
1470
- none: 'None',
1471
- round: 'Rnd ',
1472
- });
1473
- export var Ornt = createEnum('Ornt', 'horizontal', {
1474
- horizontal: 'Hrzn',
1475
- vertical: 'Vrtc',
1476
- });
1477
- export var Annt = createEnum('Annt', 'sharp', {
1478
- none: 'Anno',
1479
- sharp: 'antiAliasSharp',
1480
- crisp: 'AnCr',
1481
- strong: 'AnSt',
1482
- smooth: 'AnSm',
1483
- platform: 'antiAliasPlatformGray',
1484
- platformLCD: 'antiAliasPlatformLCD',
1485
- });
1486
- export var warpStyle = createEnum('warpStyle', 'none', {
1487
- none: 'warpNone',
1488
- arc: 'warpArc',
1489
- arcLower: 'warpArcLower',
1490
- arcUpper: 'warpArcUpper',
1491
- arch: 'warpArch',
1492
- bulge: 'warpBulge',
1493
- shellLower: 'warpShellLower',
1494
- shellUpper: 'warpShellUpper',
1495
- flag: 'warpFlag',
1496
- wave: 'warpWave',
1497
- fish: 'warpFish',
1498
- rise: 'warpRise',
1499
- fisheye: 'warpFisheye',
1500
- inflate: 'warpInflate',
1501
- squeeze: 'warpSqueeze',
1502
- twist: 'warpTwist',
1503
- custom: 'warpCustom',
1504
- });
1505
- export var BlnM = createEnum('BlnM', 'normal', {
1506
- 'normal': 'Nrml',
1507
- 'dissolve': 'Dslv',
1508
- 'darken': 'Drkn',
1509
- 'multiply': 'Mltp',
1510
- 'color burn': 'CBrn',
1511
- 'linear burn': 'linearBurn',
1512
- 'darker color': 'darkerColor',
1513
- 'lighten': 'Lghn',
1514
- 'screen': 'Scrn',
1515
- 'color dodge': 'CDdg',
1516
- 'linear dodge': 'linearDodge',
1517
- 'lighter color': 'lighterColor',
1518
- 'overlay': 'Ovrl',
1519
- 'soft light': 'SftL',
1520
- 'hard light': 'HrdL',
1521
- 'vivid light': 'vividLight',
1522
- 'linear light': 'linearLight',
1523
- 'pin light': 'pinLight',
1524
- 'hard mix': 'hardMix',
1525
- 'difference': 'Dfrn',
1526
- 'exclusion': 'Xclu',
1527
- 'subtract': 'blendSubtraction',
1528
- 'divide': 'blendDivide',
1529
- 'hue': 'H ',
1530
- 'saturation': 'Strt',
1531
- 'color': 'Clr ',
1532
- 'luminosity': 'Lmns',
1533
- // used in ABR
1534
- 'linear height': 'linearHeight',
1535
- 'height': 'Hght',
1536
- 'subtraction': 'Sbtr', // 2nd version of subtract ?
1537
- });
1538
- export var BESl = createEnum('BESl', 'inner bevel', {
1539
- 'inner bevel': 'InrB',
1540
- 'outer bevel': 'OtrB',
1541
- 'emboss': 'Embs',
1542
- 'pillow emboss': 'PlEb',
1543
- 'stroke emboss': 'strokeEmboss',
1544
- });
1545
- export var bvlT = createEnum('bvlT', 'smooth', {
1546
- 'smooth': 'SfBL',
1547
- 'chisel hard': 'PrBL',
1548
- 'chisel soft': 'Slmt',
1549
- });
1550
- export var BESs = createEnum('BESs', 'up', {
1551
- up: 'In ',
1552
- down: 'Out ',
1553
- });
1554
- export var BETE = createEnum('BETE', 'softer', {
1555
- softer: 'SfBL',
1556
- precise: 'PrBL',
1557
- });
1558
- export var IGSr = createEnum('IGSr', 'edge', {
1559
- edge: 'SrcE',
1560
- center: 'SrcC',
1561
- });
1562
- export var GrdT = createEnum('GrdT', 'linear', {
1563
- linear: 'Lnr ',
1564
- radial: 'Rdl ',
1565
- angle: 'Angl',
1566
- reflected: 'Rflc',
1567
- diamond: 'Dmnd',
1568
- });
1569
- export var animInterpStyleEnum = createEnum('animInterpStyle', 'linear', {
1570
- linear: 'Lnr ',
1571
- hold: 'hold',
1572
- });
1573
- export var stdTrackID = createEnum('stdTrackID', 'opacity', {
1574
- opacity: 'opacityTrack',
1575
- style: 'styleTrack',
1576
- sheetTransform: 'sheetTransformTrack',
1577
- sheetPosition: 'sheetPositionTrack',
1578
- globalLighting: 'globalLightingTrack',
1579
- });
1580
- export var gradientInterpolationMethodType = createEnum('gradientInterpolationMethodType', 'perceptual', {
1581
- perceptual: 'Perc',
1582
- linear: 'Lnr',
1583
- classic: 'Gcls',
1584
- });
1585
- export var ClrS = createEnum('ClrS', 'rgb', {
1586
- rgb: 'RGBC',
1587
- hsb: 'HSBl',
1588
- lab: 'LbCl',
1589
- });
1590
- export var FStl = createEnum('FStl', 'outside', {
1591
- outside: 'OutF',
1592
- center: 'CtrF',
1593
- inside: 'InsF'
1594
- });
1595
- export var FrFl = createEnum('FrFl', 'color', {
1596
- color: 'SClr',
1597
- gradient: 'GrFl',
1598
- pattern: 'Ptrn',
1599
- });
1600
- export var strokeStyleLineCapType = createEnum('strokeStyleLineCapType', 'butt', {
1601
- butt: 'strokeStyleButtCap',
1602
- round: 'strokeStyleRoundCap',
1603
- square: 'strokeStyleSquareCap',
1604
- });
1605
- export var strokeStyleLineJoinType = createEnum('strokeStyleLineJoinType', 'miter', {
1606
- miter: 'strokeStyleMiterJoin',
1607
- round: 'strokeStyleRoundJoin',
1608
- bevel: 'strokeStyleBevelJoin',
1609
- });
1610
- export var strokeStyleLineAlignment = createEnum('strokeStyleLineAlignment', 'inside', {
1611
- inside: 'strokeStyleAlignInside',
1612
- center: 'strokeStyleAlignCenter',
1613
- outside: 'strokeStyleAlignOutside',
1614
- });
1615
-
1616
- //# sourceMappingURL=data:application/json;charset=utf8;base64,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QUM7Z0JBQUMsTUFBTTtZQUNwRCxLQUFLLE1BQU07Z0JBQUUsTUFBTSxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUN4RCxLQUFLLE1BQU07Z0JBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUNsRCxLQUFLLE1BQU07Z0JBQUUsTUFBTSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUNyRCxLQUFLLE1BQU07Z0JBQUUsTUFBTSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUNyRCxLQUFLLE1BQU07Z0JBQUUsTUFBTSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUNuRCxLQUFLLE1BQU07Z0JBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUN0RCxLQUFLLE1BQU07Z0JBQUUsTUFBTSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUN0RCxLQUFLLE1BQU07Z0JBQUUsTUFBTSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUNyRCxLQUFLLE1BQU07Z0JBQUUsTUFBTSxDQUFDLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFBQyxNQUFNO1lBQ3pFLEtBQUssT0FBTztnQkFBRSxNQUFNLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFBQyxNQUFNO1lBQ2pFLEtBQUss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QUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxJQUFNLElBQUksR0FBRyxVQUFVLENBQWtDLE1BQU0sRUFBRSxTQUFTLEVBQUU7SUFDbEYsT0FBTyxFQUFFLE1BQU07SUFDZixNQUFNLEVBQUUsTUFBTTtJQUNkLE1BQU0sRUFBRSxNQUFNO0NBQ2QsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLElBQU0sSUFBSSxHQUFHLFVBQVUsQ0FBbUMsTUFBTSxFQUFFLE9BQU8sRUFBRTtJQUNqRixLQUFLLEVBQUUsTUFBTTtJQUNiLFFBQVEsRUFBRSxNQUFNO0lBQ2hCLE9BQU8sRUFBRSxNQUFNO0NBQ2YsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLElBQU0sc0JBQXNCLEdBQUcsVUFBVSxDQUFjLHdCQUF3QixFQUFFLE1BQU0sRUFBRTtJQUMvRixJQUFJLEVBQUUsb0JBQW9CO0lBQzFCLEtBQUssRUFBRSxxQkFBcUI7SUFDNUIsTUFBTSxFQUFFLHNCQUFzQjtDQUM5QixDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsSUFBTSx1QkFBdUIsR0FBRyxVQUFVLENBQWUseUJBQXlCLEVBQUUsT0FBTyxFQUFFO0lBQ25HLEtBQUssRUFBRSxzQkFBc0I7SUFDN0IsS0FBSyxFQUFFLHNCQUFzQjtJQUM3QixLQUFLLEVBQUUsc0JBQXNCO0NBQzdCLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxJQUFNLHdCQUF3QixHQUFHLFVBQVUsQ0FBZ0IsMEJBQTBCLEVBQUUsUUFBUSxFQUFFO0lBQ3ZHLE1BQU0sRUFBRSx3QkFBd0I7SUFDaEMsTUFBTSxFQUFFLHdCQUF3QjtJQUNoQyxPQUFPLEVBQUUseUJBQXlCO0NBQ2xDLENBQUMsQ0FBQyIsImZpbGUiOiJkZXNjcmlwdG9yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlRW51bSB9IGZyb20gJy4vaGVscGVycyc7XHJcbmltcG9ydCB7XHJcblx0QW50aUFsaWFzLCBCZXZlbERpcmVjdGlvbiwgQmV2ZWxTdHlsZSwgQmV2ZWxUZWNobmlxdWUsIEJsZW5kTW9kZSwgQ29sb3IsIEVmZmVjdENvbnRvdXIsXHJcblx0RWZmZWN0Tm9pc2VHcmFkaWVudCwgRWZmZWN0UGF0dGVybiwgRWZmZWN0U29saWRHcmFkaWVudCwgRXh0cmFHcmFkaWVudEluZm8sIEV4dHJhUGF0dGVybkluZm8sXHJcblx0R2xvd1NvdXJjZSwgR2xvd1RlY2huaXF1ZSwgR3JhZGllbnRTdHlsZSwgSW50ZXJwb2xhdGlvbk1ldGhvZCwgTGF5ZXJFZmZlY3RCZXZlbCxcclxuXHRMYXllckVmZmVjdEdyYWRpZW50T3ZlcmxheSwgTGF5ZXJFZmZlY3RJbm5lckdsb3csIExheWVyRWZmZWN0UGF0dGVybk92ZXJsYXksXHJcblx0TGF5ZXJFZmZlY3RTYXRpbiwgTGF5ZXJFZmZlY3RTaGFkb3csIExheWVyRWZmZWN0c0luZm8sIExheWVyRWZmZWN0U29saWRGaWxsLFxyXG5cdExheWVyRWZmZWN0c091dGVyR2xvdywgTGF5ZXJFZmZlY3RTdHJva2UsIExpbmVBbGlnbm1lbnQsIExpbmVDYXBUeXBlLCBMaW5lSm9pblR5cGUsXHJcblx0T3JpZW50YXRpb24sIFRleHRHcmlkZGluZywgVGltZWxpbmVLZXksIFRpbWVsaW5lS2V5SW50ZXJwb2xhdGlvbiwgVGltZWxpbmVUcmFjaywgVGltZWxpbmVUcmFja1R5cGUsXHJcblx0VW5pdHMsIFVuaXRzVmFsdWUsIFZlY3RvckNvbnRlbnQsIFdhcnBTdHlsZVxyXG59IGZyb20gJy4vcHNkJztcclxuaW1wb3J0IHtcclxuXHRQc2RSZWFkZXIsIHJlYWRTaWduYXR1cmUsIHJlYWRVbmljb2RlU3RyaW5nLCByZWFkVWludDMyLCByZWFkVWludDgsIHJlYWRGbG9hdDY0LFxyXG5cdHJlYWRCeXRlcywgcmVhZEFzY2lpU3RyaW5nLCByZWFkSW50MzIsIHJlYWRGbG9hdDMyLCByZWFkSW50MzJMRSwgcmVhZFVuaWNvZGVTdHJpbmdXaXRoTGVuZ3RoXHJcbn0gZnJvbSAnLi9wc2RSZWFkZXInO1xyXG5pbXBvcnQge1xyXG5cdFBzZFdyaXRlciwgd3JpdGVTaWduYXR1cmUsIHdyaXRlQnl0ZXMsIHdyaXRlVWludDMyLCB3cml0ZUZsb2F0NjQsIHdyaXRlVWludDgsXHJcblx0d3JpdGVVbmljb2RlU3RyaW5nV2l0aFBhZGRpbmcsIHdyaXRlSW50MzIsIHdyaXRlRmxvYXQzMiwgd3JpdGVVbmljb2RlU3RyaW5nXHJcbn0gZnJvbSAnLi9wc2RXcml0ZXInO1xyXG5cclxuaW50ZXJmYWNlIERpY3QgeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH1cclxuaW50ZXJmYWNlIE5hbWVDbGFzc0lEIHsgbmFtZTogc3RyaW5nOyBjbGFzc0lEOiBzdHJpbmc7IH1cclxuaW50ZXJmYWNlIEV4dFR5cGVEaWN0IHsgW2tleTogc3RyaW5nXTogTmFtZUNsYXNzSUQ7IH1cclxuXHJcbmZ1bmN0aW9uIHJldk1hcChtYXA6IERpY3QpIHtcclxuXHRjb25zdCByZXN1bHQ6IERpY3QgPSB7fTtcclxuXHRPYmplY3Qua2V5cyhtYXApLmZvckVhY2goa2V5ID0+IHJlc3VsdFttYXBba2V5XV0gPSBrZXkpO1xyXG5cdHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmNvbnN0IHVuaXRzTWFwOiBEaWN0ID0ge1xyXG5cdCcjQW5nJzogJ0FuZ2xlJyxcclxuXHQnI1JzbCc6ICdEZW5zaXR5JyxcclxuXHQnI1JsdCc6ICdEaXN0YW5jZScsXHJcblx0JyNObmUnOiAnTm9uZScsXHJcblx0JyNQcmMnOiAnUGVyY2VudCcsXHJcblx0JyNQeGwnOiAnUGl4ZWxzJyxcclxuXHQnI01sbSc6ICdNaWxsaW1ldGVycycsXHJcblx0JyNQbnQnOiAnUG9pbnRzJyxcclxuXHQnUnJQaSc6ICdQaWNhcycsXHJcblx0J1JySW4nOiAnSW5jaGVzJyxcclxuXHQnUnJDbSc6ICdDZW50aW1ldGVycycsXHJcbn07XHJcblxyXG5jb25zdCB1bml0c01hcFJldiA9IHJldk1hcCh1bml0c01hcCk7XHJcbmxldCBsb2dFcnJvcnMgPSBmYWxzZTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2dFcnJvcnModmFsdWU6IGJvb2xlYW4pIHtcclxuXHRsb2dFcnJvcnMgPSB2YWx1ZTtcclxufVxyXG5cclxuZnVuY3Rpb24gbWFrZVR5cGUobmFtZTogc3RyaW5nLCBjbGFzc0lEOiBzdHJpbmcpIHtcclxuXHRyZXR1cm4geyBuYW1lLCBjbGFzc0lEIH07XHJcbn1cclxuXHJcbmNvbnN0IG51bGxUeXBlID0gbWFrZVR5cGUoJycsICdudWxsJyk7XHJcblxyXG5jb25zdCBmaWVsZFRvRXh0VHlwZTogRXh0VHlwZURpY3QgPSB7XHJcblx0c3Ryb2tlU3R5bGVDb250ZW50OiBtYWtlVHlwZSgnJywgJ3NvbGlkQ29sb3JMYXllcicpLFxyXG5cdC8vIHByaW50UHJvb2ZTZXR1cDogbWFrZVR5cGUoJ+agoeagt+iuvue9ricsICdwcm9vZlNldHVwJyksIC8vIFRFU1RJTkdcclxuXHRwcmludFByb29mU2V0dXA6IG1ha2VUeXBlKCdQcm9vZiBTZXR1cCcsICdwcm9vZlNldHVwJyksXHJcblx0cGF0dGVybkZpbGw6IG1ha2VUeXBlKCcnLCAncGF0dGVybkZpbGwnKSxcclxuXHRHcmFkOiBtYWtlVHlwZSgnR3JhZGllbnQnLCAnR3JkbicpLFxyXG5cdGViYmw6IG1ha2VUeXBlKCcnLCAnZWJibCcpLFxyXG5cdFNvRmk6IG1ha2VUeXBlKCcnLCAnU29GaScpLFxyXG5cdEdyRmw6IG1ha2VUeXBlKCcnLCAnR3JGbCcpLFxyXG5cdHNkd0M6IG1ha2VUeXBlKCcnLCAnUkdCQycpLFxyXG5cdGhnbEM6IG1ha2VUeXBlKCcnLCAnUkdCQycpLFxyXG5cdCdDbHIgJzogbWFrZVR5cGUoJycsICdSR0JDJyksXHJcblx0J3RpbnRDb2xvcic6IG1ha2VUeXBlKCcnLCAnUkdCQycpLFxyXG5cdE9mc3Q6IG1ha2VUeXBlKCcnLCAnUG50ICcpLFxyXG5cdENoRlg6IG1ha2VUeXBlKCcnLCAnQ2hGWCcpLFxyXG5cdE1wZ1M6IG1ha2VUeXBlKCcnLCAnU2hwQycpLFxyXG5cdERyU2g6IG1ha2VUeXBlKCcnLCAnRHJTaCcpLFxyXG5cdElyU2g6IG1ha2VUeXBlKCcnLCAnSXJTaCcpLFxyXG5cdE9yR2w6IG1ha2VUeXBlKCcnLCAnT3JHbCcpLFxyXG5cdElyR2w6IG1ha2VUeXBlKCcnLCAnSXJHbCcpLFxyXG5cdFRyblM6IG1ha2VUeXBlKCcnLCAnU2hwQycpLFxyXG5cdFB0cm46IG1ha2VUeXBlKCcnLCAnUHRybicpLFxyXG5cdEZyRlg6IG1ha2VUeXBlKCcnLCAnRnJGWCcpLFxyXG5cdHBoYXNlOiBtYWtlVHlwZSgnJywgJ1BudCAnKSxcclxuXHRmcmFtZVN0ZXA6IG51bGxUeXBlLFxyXG5cdGR1cmF0aW9uOiBudWxsVHlwZSxcclxuXHR3b3JrSW5UaW1lOiBudWxsVHlwZSxcclxuXHR3b3JrT3V0VGltZTogbnVsbFR5cGUsXHJcblx0YXVkaW9DbGlwR3JvdXBMaXN0OiBudWxsVHlwZSxcclxuXHRib3VuZHM6IG1ha2VUeXBlKCcnLCAnUmN0bicpLFxyXG5cdGN1c3RvbUVudmVsb3BlV2FycDogbWFrZVR5cGUoJycsICdjdXN0b21FbnZlbG9wZVdhcnAnKSxcclxuXHR3YXJwOiBtYWtlVHlwZSgnJywgJ3dhcnAnKSxcclxuXHQnU3ogICc6IG1ha2VUeXBlKCcnLCAnUG50ICcpLFxyXG5cdG9yaWdpbjogbWFrZVR5cGUoJycsICdQbnQgJyksXHJcblx0YXV0b0V4cGFuZE9mZnNldDogbWFrZVR5cGUoJycsICdQbnQgJyksXHJcblx0a2V5T3JpZ2luU2hhcGVCQm94OiBtYWtlVHlwZSgnJywgJ3VuaXRSZWN0JyksXHJcblx0VnJzbjogbnVsbFR5cGUsXHJcblx0cHNWZXJzaW9uOiBudWxsVHlwZSxcclxuXHRkb2NEZWZhdWx0TmV3QXJ0Ym9hcmRCYWNrZ3JvdW5kQ29sb3I6IG1ha2VUeXBlKCcnLCAnUkdCQycpLFxyXG5cdGFydGJvYXJkUmVjdDogbWFrZVR5cGUoJycsICdjbGFzc0Zsb2F0UmVjdCcpLFxyXG5cdGtleU9yaWdpblJSZWN0UmFkaWk6IG1ha2VUeXBlKCcnLCAncmFkaWknKSxcclxuXHRrZXlPcmlnaW5Cb3hDb3JuZXJzOiBudWxsVHlwZSxcclxuXHRyZWN0YW5nbGVDb3JuZXJBOiBtYWtlVHlwZSgnJywgJ1BudCAnKSxcclxuXHRyZWN0YW5nbGVDb3JuZXJCOiBtYWtlVHlwZSgnJywgJ1BudCAnKSxcclxuXHRyZWN0YW5nbGVDb3JuZXJDOiBtYWtlVHlwZSgnJywgJ1BudCAnKSxcclxuXHRyZWN0YW5nbGVDb3JuZXJEOiBtYWtlVHlwZSgnJywgJ1BudCAnKSxcclxuXHRjb21wSW5mbzogbnVsbFR5cGUsXHJcblx0VHJuZjogbWFrZVR5cGUoJ1RyYW5zZm9ybScsICdUcm5mJyksXHJcblx0cXVpbHRXYXJwOiBtYWtlVHlwZSgnJywgJ3F1aWx0V2FycCcpLFxyXG5cdGdlbmVyYXRvclNldHRpbmdzOiBudWxsVHlwZSxcclxuXHRjcmVtYTogbnVsbFR5cGUsXHJcblx0RnJJbjogbnVsbFR5cGUsXHJcblx0YmxlbmRPcHRpb25zOiBudWxsVHlwZSxcclxuXHRGWFJmOiBudWxsVHlwZSxcclxuXHRMZWZ4OiBudWxsVHlwZSxcclxuXHR0aW1lOiBudWxsVHlwZSxcclxuXHRhbmltS2V5OiBudWxsVHlwZSxcclxuXHR0aW1lU2NvcGU6IG51bGxUeXBlLFxyXG5cdGluVGltZTogbnVsbFR5cGUsXHJcblx0b3V0VGltZTogbnVsbFR5cGUsXHJcblx0c2hlZXRTdHlsZTogbnVsbFR5cGUsXHJcblx0dHJhbnNsYXRpb246IG51bGxUeXBlLFxyXG5cdFNrZXc6IG51bGxUeXBlLFxyXG5cdCdMbmsgJzogbWFrZVR5cGUoJycsICdFeHRlcm5hbEZpbGVMaW5rJyksXHJcblx0ZnJhbWVSZWFkZXI6IG1ha2VUeXBlKCcnLCAnRnJhbWVSZWFkZXInKSxcclxuXHRlZmZlY3RQYXJhbXM6IG1ha2VUeXBlKCcnLCAnbW90aW9uVHJhY2tFZmZlY3RQYXJhbXMnKSxcclxufTtcclxuXHJcbmNvbnN0IGZpZWxkVG9BcnJheUV4dFR5cGU6IEV4dFR5cGVEaWN0ID0ge1xyXG5cdCdDcnYgJzogbWFrZVR5cGUoJycsICdDclB0JyksXHJcblx0Q2xyczogbWFrZVR5cGUoJycsICdDbHJ0JyksXHJcblx0VHJuczogbWFrZVR5cGUoJycsICdUcm5TJyksXHJcblx0a2V5RGVzY3JpcHRvckxpc3Q6IG51bGxUeXBlLFxyXG5cdHNvbGlkRmlsbE11bHRpOiBtYWtlVHlwZSgnJywgJ1NvRmknKSxcclxuXHRncmFkaWVudEZpbGxNdWx0aTogbWFrZVR5cGUoJycsICdHckZsJyksXHJcblx0ZHJvcFNoYWRvd011bHRpOiBtYWtlVHlwZSgnJywgJ0RyU2gnKSxcclxuXHRpbm5lclNoYWRvd011bHRpOiBtYWtlVHlwZSgnJywgJ0lyU2gnKSxcclxuXHRmcmFtZUZYTXVsdGk6IG1ha2VUeXBlKCcnLCAnRnJGWCcpLFxyXG5cdEZySW46IG51bGxUeXBlLFxyXG5cdEZTdHM6IG51bGxUeXBlLFxyXG5cdExhU3Q6IG51bGxUeXBlLFxyXG5cdHNoZWV0VGltZWxpbmVPcHRpb25zOiBudWxsVHlwZSxcclxuXHR0cmFja0xpc3Q6IG1ha2VUeXBlKCcnLCAnYW5pbWF0aW9uVHJhY2snKSxcclxuXHRnbG9iYWxUcmFja0xpc3Q6IG1ha2VUeXBlKCcnLCAnYW5pbWF0aW9uVHJhY2snKSxcclxuXHRrZXlMaXN0OiBudWxsVHlwZSxcclxuXHRhdWRpb0NsaXBHcm91cExpc3Q6IG51bGxUeXBlLFxyXG5cdGF1ZGlvQ2xpcExpc3Q6IG51bGxUeXBlLFxyXG59O1xyXG5cclxuY29uc3QgdHlwZVRvRmllbGQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW107IH0gPSB7XHJcblx0J1RFWFQnOiBbXHJcblx0XHQnVHh0ICcsICdwcmludGVyTmFtZScsICdObSAgJywgJ0lkbnQnLCAnYmxhY2tBbmRXaGl0ZVByZXNldEZpbGVOYW1lJywgJ0xVVDNERmlsZU5hbWUnLFxyXG5cdFx0J3ByZXNldEZpbGVOYW1lJywgJ2N1cnZlc1ByZXNldEZpbGVOYW1lJywgJ21peGVyUHJlc2V0RmlsZU5hbWUnLCAncGxhY2VkJywgJ2Rlc2NyaXB0aW9uJywgJ3JlYXNvbicsXHJcblx0XHQnYXJ0Ym9hcmRQcmVzZXROYW1lJywgJ2pzb24nLCAnZ3JvdXBJRCcsICdjbGlwSUQnLCAncmVsUGF0aCcsICdmdWxsUGF0aCcsICdtZWRpYURlc2NyaXB0b3InLFxyXG5cdF0sXHJcblx0J3RkdGEnOiBbJ0VuZ2luZURhdGEnLCAnTFVUM0RGaWxlRGF0YSddLFxyXG5cdCdsb25nJzogW1xyXG5cdFx0J1RleHRJbmRleCcsICdSbmRTJywgJ01kcG4nLCAnU210aCcsICdMY3RuJywgJ3N0cm9rZVN0eWxlVmVyc2lvbicsICdMYUlEJywgJ1Zyc24nLCAnQ250ICcsXHJcblx0XHQnQnJnaCcsICdDbnRyJywgJ21lYW5zJywgJ3ZpYnJhbmNlJywgJ1N0cnQnLCAnYndQcmVzZXRLaW5kJywgJ3ByZXNldEtpbmQnLCAnY29tcCcsICdjb21wSUQnLCAnb3JpZ2luYWxDb21wSUQnLFxyXG5cdFx0J2N1cnZlc1ByZXNldEtpbmQnLCAnbWl4ZXJQcmVzZXRLaW5kJywgJ3VPcmRlcicsICd2T3JkZXInLCAnUGdObScsICd0b3RhbFBhZ2VzJywgJ0Nyb3AnLFxyXG5cdFx0J251bWVyYXRvcicsICdkZW5vbWluYXRvcicsICdmcmFtZUNvdW50JywgJ0FubnQnLCAna2V5T3JpZ2luVHlwZScsICd1bml0VmFsdWVRdWFkVmVyc2lvbicsXHJcblx0XHQna2V5T3JpZ2luSW5kZXgnLCAnbWFqb3InLCAnbWlub3InLCAnZml4JywgJ2RvY0RlZmF1bHROZXdBcnRib2FyZEJhY2tncm91bmRUeXBlJywgJ2FydGJvYXJkQmFja2dyb3VuZFR5cGUnLFxyXG5cdFx0J251bU1vZGlmeWluZ0ZYJywgJ2RlZm9ybU51bVJvd3MnLCAnZGVmb3JtTnVtQ29scycsICdGcklEJywgJ0ZyRGwnLCAnRnNJRCcsICdMQ250JywgJ0FGcm0nLCAnQUZTdCcsXHJcblx0XHQnbnVtQmVmb3JlJywgJ251bUFmdGVyJywgJ1NwY24nLCAnbWluT3BhY2l0eScsICdtYXhPcGFjaXR5JywgJ0Jsbk0nLCAnc2hlZXRJRCcsICdnYmxBJywgJ2dsb2JhbEFsdGl0dWRlJyxcclxuXHRcdCdkZXNjVmVyc2lvbicsICdmcmFtZVJlYWRlclR5cGUnLCAnTHlySScsICd6b29tT3JpZ2luJyxcclxuXHRdLFxyXG5cdCdlbnVtJzogW1xyXG5cdFx0J3RleHRHcmlkZGluZycsICdPcm50JywgJ3dhcnBTdHlsZScsICd3YXJwUm90YXRlJywgJ0ludGUnLCAnQmx0bicsICdDbHJTJyxcclxuXHRcdCdzZHdNJywgJ2hnbE0nLCAnYnZsVCcsICdidmxTJywgJ2J2bEQnLCAnTWQgICcsICdnbHdTJywgJ0dyZEYnLCAnR2x3VCcsXHJcblx0XHQnc3Ryb2tlU3R5bGVMaW5lQ2FwVHlwZScsICdzdHJva2VTdHlsZUxpbmVKb2luVHlwZScsICdzdHJva2VTdHlsZUxpbmVBbGlnbm1lbnQnLFxyXG5cdFx0J3N0cm9rZVN0eWxlQmxlbmRNb2RlJywgJ1BudFQnLCAnU3R5bCcsICdsb29rdXBUeXBlJywgJ0xVVEZvcm1hdCcsICdkYXRhT3JkZXInLFxyXG5cdFx0J3RhYmxlT3JkZXInLCAnZW5hYmxlQ29tcENvcmUnLCAnZW5hYmxlQ29tcENvcmVHUFUnLCAnY29tcENvcmVTdXBwb3J0JywgJ2NvbXBDb3JlR1BVU3VwcG9ydCcsICdFbmduJyxcclxuXHRcdCdlbmFibGVDb21wQ29yZVRocmVhZHMnLCAnZ3M5OScsICdGckRzJywgJ3RyYWNrSUQnLCAnYW5pbUludGVycFN0eWxlJyxcclxuXHRdLFxyXG5cdCdib29sJzogW1xyXG5cdFx0J1BzdFMnLCAncHJpbnRTaXh0ZWVuQml0JywgJ21hc3RlckZYU3dpdGNoJywgJ2VuYWInLCAndWdsZycsICdhbnRpYWxpYXNHbG9zcycsXHJcblx0XHQndXNlU2hhcGUnLCAndXNlVGV4dHVyZScsICd1Z2xnJywgJ2FudGlhbGlhc0dsb3NzJywgJ3VzZVNoYXBlJyxcclxuXHRcdCd1c2VUZXh0dXJlJywgJ0FsZ24nLCAnUnZycycsICdEdGhyJywgJ0ludnInLCAnVmN0QycsICdTaFRyJywgJ2xheWVyQ29uY2VhbHMnLFxyXG5cdFx0J3N0cm9rZUVuYWJsZWQnLCAnZmlsbEVuYWJsZWQnLCAnc3Ryb2tlU3R5bGVTY2FsZUxvY2snLCAnc3Ryb2tlU3R5bGVTdHJva2VBZGp1c3QnLFxyXG5cdFx0J2hhcmRQcm9vZicsICdNcEJsJywgJ3BhcGVyV2hpdGUnLCAndXNlTGVnYWN5JywgJ0F1dG8nLCAnTGFiICcsICd1c2VUaW50JywgJ2tleVNoYXBlSW52YWxpZGF0ZWQnLFxyXG5cdFx0J2F1dG9FeHBhbmRFbmFibGVkJywgJ2F1dG9OZXN0RW5hYmxlZCcsICdhdXRvUG9zaXRpb25FbmFibGVkJywgJ3Nocmlua3dyYXBPblNhdmVFbmFibGVkJyxcclxuXHRcdCdwcmVzZW50JywgJ3Nob3dJbkRpYWxvZycsICdvdmVycHJpbnQnLCAnc2hlZXREaXNjbG9zZWQnLCAnbGlnaHRzRGlzY2xvc2VkJywgJ21lc2hlc0Rpc2Nsb3NlZCcsXHJcblx0XHQnbWF0ZXJpYWxzRGlzY2xvc2VkJywgJ2hhc01vdGlvbicsICdtdXRlZCcsICdFZmZjJywgJ3NlbGVjdGVkJywgJ2F1dG9TY29wZScsICdmaWxsQ2FudmFzJyxcclxuXHRdLFxyXG5cdCdkb3ViJzogW1xyXG5cdFx0J3dhcnBWYWx1ZScsICd3YXJwUGVyc3BlY3RpdmUnLCAnd2FycFBlcnNwZWN0aXZlT3RoZXInLCAnSW50cicsICdXZHRoJywgJ0hnaHQnLFxyXG5cdFx0J3N0cm9rZVN0eWxlTWl0ZXJMaW1pdCcsICdzdHJva2VTdHlsZVJlc29sdXRpb24nLCAnbGF5ZXJUaW1lJywgJ2tleU9yaWdpblJlc29sdXRpb24nLFxyXG5cdFx0J3h4JywgJ3h5JywgJ3l4JywgJ3l5JywgJ3R4JywgJ3R5JywgJ0ZyR0EnLCAnZnJhbWVSYXRlJywgJ2F1ZGlvTGV2ZWwnLCAncm90YXRpb24nLFxyXG5cdF0sXHJcblx0J1VudEYnOiBbXHJcblx0XHQnU2NsICcsICdzZHdPJywgJ2hnbE8nLCAnbGFnbCcsICdMYWxkJywgJ3NyZ1InLCAnYmx1cicsICdTZnRuJywgJ09wY3QnLCAnRHN0bicsICdBbmdsJyxcclxuXHRcdCdDa210JywgJ05vc2UnLCAnSW5wcicsICdTaGROJywgJ3N0cm9rZVN0eWxlTGluZVdpZHRoJywgJ3N0cm9rZVN0eWxlTGluZURhc2hPZmZzZXQnLFxyXG5cdFx0J3N0cm9rZVN0eWxlT3BhY2l0eScsICdIICAgJywgJ1RvcCAnLCAnTGVmdCcsICdCdG9tJywgJ1JnaHQnLCAnUnNsdCcsXHJcblx0XHQndG9wUmlnaHQnLCAndG9wTGVmdCcsICdib3R0b21MZWZ0JywgJ2JvdHRvbVJpZ2h0JyxcclxuXHRdLFxyXG5cdCdWbExzJzogW1xyXG5cdFx0J0NydiAnLCAnQ2xycycsICdNbm0gJywgJ014bSAnLCAnVHJucycsICdwYXRoTGlzdCcsICdzdHJva2VTdHlsZUxpbmVEYXNoU2V0JywgJ0ZyTHMnLFxyXG5cdFx0J0xhU3QnLCAnVHJuZicsICdub25BZmZpbmVUcmFuc2Zvcm0nLCAna2V5RGVzY3JpcHRvckxpc3QnLCAnZ3VpZGVJbmRlY2VzJywgJ2dyYWRpZW50RmlsbE11bHRpJyxcclxuXHRcdCdzb2xpZEZpbGxNdWx0aScsICdmcmFtZUZYTXVsdGknLCAnaW5uZXJTaGFkb3dNdWx0aScsICdkcm9wU2hhZG93TXVsdGknLCAnRnJJbicsICdGU3RzJywgJ0ZzRnInLFxyXG5cdFx0J3NoZWV0VGltZWxpbmVPcHRpb25zJywgJ2F1ZGlvQ2xpcExpc3QnLCAndHJhY2tMaXN0JywgJ2dsb2JhbFRyYWNrTGlzdCcsICdrZXlMaXN0JywgJ2F1ZGlvQ2xpcExpc3QnLFxyXG5cdF0sXHJcblx0J09iQXInOiBbJ21lc2hQb2ludHMnLCAncXVpbHRTbGljZVgnLCAncXVpbHRTbGljZVknXSxcclxuXHQnb2JqICc6IFsnbnVsbCddLFxyXG59O1xyXG5cclxuY29uc3QgY2hhbm5lbHMgPSBbXHJcblx0J1JkICAnLCAnR3JuICcsICdCbCAgJywgJ1lsbHcnLCAnWWx3ICcsICdDeW4gJywgJ01nbnQnLCAnQmxjaycsICdHcnkgJywgJ0xtbmMnLCAnQSAgICcsICdCICAgJyxcclxuXTtcclxuXHJcbmNvbnN0IGZpZWxkVG9BcnJheVR5cGU6IERpY3QgPSB7XHJcblx0J01ubSAnOiAnbG9uZycsXHJcblx0J014bSAnOiAnbG9uZycsXHJcblx0J0ZyTHMnOiAnbG9uZycsXHJcblx0J3N0cm9rZVN0eWxlTGluZURhc2hTZXQnOiAnVW50RicsXHJcblx0J1RybmYnOiAnZG91YicsXHJcblx0J25vbkFmZmluZVRyYW5zZm9ybSc6ICdkb3ViJyxcclxuXHQna2V5RGVzY3JpcHRvckxpc3QnOiAnT2JqYycsXHJcblx0J2dyYWRpZW50RmlsbE11bHRpJzogJ09iamMnLFxyXG5cdCdzb2xpZEZpbGxNdWx0aSc6ICdPYmpjJyxcclxuXHQnZnJhbWVGWE11bHRpJzogJ09iamMnLFxyXG5cdCdpbm5lclNoYWRvd011bHRpJzogJ09iamMnLFxyXG5cdCdkcm9wU2hhZG93TXVsdGknOiAnT2JqYycsXHJcblx0J0xhU3QnOiAnT2JqYycsXHJcblx0J0ZySW4nOiAnT2JqYycsXHJcblx0J0ZTdHMnOiAnT2JqYycsXHJcblx0J0ZzRnInOiAnbG9uZycsXHJcblx0J2JsZW5kT3B0aW9ucyc6ICdPYmpjJyxcclxuXHQnc2hlZXRUaW1lbGluZU9wdGlvbnMnOiAnT2JqYycsXHJcblx0J2tleUxpc3QnOiAnT2JqYycsXHJcbn07XHJcblxyXG5jb25zdCBmaWVsZFRvVHlwZTogRGljdCA9IHt9O1xyXG5cclxuZm9yIChjb25zdCB0eXBlIG9mIE9iamVjdC5rZXlzKHR5cGVUb0ZpZWxkKSkge1xyXG5cdGZvciAoY29uc3QgZmllbGQgb2YgdHlwZVRvRmllbGRbdHlwZV0pIHtcclxuXHRcdGZpZWxkVG9UeXBlW2ZpZWxkXSA9IHR5cGU7XHJcblx0fVxyXG59XHJcblxyXG5mb3IgKGNvbnN0IGZpZWxkIG9mIE9iamVjdC5rZXlzKGZpZWxkVG9FeHRUeXBlKSkge1xyXG5cdGlmICghZmllbGRUb1R5cGVbZmllbGRdKSBmaWVsZFRvVHlwZVtmaWVsZF0gPSAnT2JqYyc7XHJcbn1cclxuXHJcbmZvciAoY29uc3QgZmllbGQgb2YgT2JqZWN0LmtleXMoZmllbGRUb0FycmF5RXh0VHlwZSkpIHtcclxuXHRmaWVsZFRvQXJyYXlUeXBlW2ZpZWxkXSA9ICdPYmpjJztcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0VHlwZUJ5S2V5KGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCByb290OiBzdHJpbmcsIHBhcmVudDogYW55KSB7XHJcblx0aWYgKGtleSA9PT0gJ1N6ICAnKSB7XHJcblx0XHRyZXR1cm4gKCdXZHRoJyBpbiB2YWx1ZSkgPyAnT2JqYycgOiAoKCd1bml0cycgaW4gdmFsdWUpID8gJ1VudEYnIDogJ2RvdWInKTtcclxuXHR9IGVsc2UgaWYgKGtleSA9PT0gJ1R5cGUnKSB7XHJcblx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/ICdlbnVtJyA6ICdsb25nJztcclxuXHR9IGVsc2UgaWYgKGtleSA9PT0gJ0FudEEnKSB7XHJcblx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/ICdlbnVtJyA6ICdib29sJztcclxuXHR9IGVsc2UgaWYgKChrZXkgPT09ICdIcnpuJyB8fCBrZXkgPT09ICdWcnRjJykgJiYgcGFyZW50LlR5cGUgPT09ICdrZXlUeXBlLlBzdG4nKSB7XHJcblx0XHRyZXR1cm4gJ2xvbmcnO1xyXG5cdH0gZWxzZSBpZiAoa2V5ID09PSAnSHJ6bicgfHwga2V5ID09PSAnVnJ0YycgfHwga2V5ID09PSAnVG9wICcgfHwga2V5ID09PSAnTGVmdCcgfHwga2V5ID09PSAnQnRvbScgfHwga2V5ID09PSAnUmdodCcpIHtcclxuXHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gJ2RvdWInIDogJ1VudEYnO1xyXG5cdH0gZWxzZSBpZiAoa2V5ID09PSAnVnJzbicpIHtcclxuXHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gJ2xvbmcnIDogJ09iamMnO1xyXG5cdH0gZWxzZSBpZiAoa2V5ID09PSAnUmQgICcgfHwga2V5ID09PSAnR3JuICcgfHwga2V5ID09PSAnQmwgICcpIHtcclxuXHRcdHJldHVybiByb290ID09PSAnYXJ0ZCcgPyAnbG9uZycgOiAnZG91Yic7XHJcblx0fSBlbHNlIGlmIChrZXkgPT09ICdUcm5mJykge1xyXG5cdFx0cmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gJ1ZsTHMnIDogJ09iamMnO1xyXG5cdH0gZWxzZSB7XHJcblx0XHRyZXR1cm4gZmllbGRUb1R5cGVba2V5XTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZWFkQXNjaWlTdHJpbmdPckNsYXNzSWQocmVhZGVyOiBQc2RSZWFkZXIpIHtcclxuXHRjb25zdCBsZW5ndGggPSByZWFkSW50MzIocmVhZGVyKTtcclxuXHRyZXR1cm4gcmVhZEFzY2lpU3RyaW5nKHJlYWRlciwgbGVuZ3RoIHx8IDQpO1xyXG59XHJcblxyXG5mdW5jdGlvbiB3cml0ZUFzY2lpU3RyaW5nT3JDbGFzc0lkKHdyaXRlcjogUHNkV3JpdGVyLCB2YWx1ZTogc3RyaW5nKSB7XHJcblx0aWYgKHZhbHVlLmxlbmd0aCA9PT0gNCAmJiB2YWx1ZSAhPT0gJ3dhcnAnICYmIHZhbHVlICE9PSAndGltZScgJiYgdmFsdWUgIT09ICdob2xkJykge1xyXG5cdFx0Ly8gd3JpdGUgY2xhc3NJZFxyXG5cdFx0d3JpdGVJbnQzMih3cml0ZXIsIDApO1xyXG5cdFx0d3JpdGVTaWduYXR1cmUod3JpdGVyLCB2YWx1ZSk7XHJcblx0fSBlbHNlIHtcclxuXHRcdC8vIHdyaXRlIGFzY2lpIHN0cmluZ1xyXG5cdFx0d3JpdGVJbnQzMih3cml0ZXIsIHZhbHVlLmxlbmd0aCk7XHJcblxyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR3cml0ZVVpbnQ4KHdyaXRlciwgdmFsdWUuY2hhckNvZGVBdChpKSk7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVhZERlc2NyaXB0b3JTdHJ1Y3R1cmUocmVhZGVyOiBQc2RSZWFkZXIpIHtcclxuXHRjb25zdCBvYmplY3Q6IGFueSA9IHt9O1xyXG5cdC8vIG9iamVjdC5fX3N0cnVjdCA9XHJcblx0cmVhZENsYXNzU3RydWN0dXJlKHJlYWRlcik7XHJcblx0Y29uc3QgaXRlbXNDb3VudCA9IHJlYWRVaW50MzIocmVhZGVyKTtcclxuXHQvLyBjb25zb2xlLmxvZygnLy8nLCBvYmplY3QuX19zdHJ1Y3QpO1xyXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNDb3VudDsgaSsrKSB7XHJcblx0XHRjb25zdCBrZXkgPSByZWFkQXNjaWlTdHJpbmdPckNsYXNzSWQocmVhZGVyKTtcclxuXHRcdGNvbnN0IHR5cGUgPSByZWFkU2lnbmF0dXJlKHJlYWRlcik7XHJcblx0XHQvLyBjb25zb2xlLmxvZyhgPiAnJHtrZXl9JyAnJHt0eXBlfSdgKTtcclxuXHRcdGNvbnN0IGRhdGEgPSByZWFkT1NUeXBlKHJlYWRlciwgdHlwZSk7XHJcblx0XHQvLyBpZiAoIWdldFR5cGVCeUtleShrZXksIGRhdGEpKSBjb25zb2xlLmxvZyhgPiAnJHtrZXl9JyAnJHt0eXBlfSdgLCBkYXRhKTtcclxuXHRcdG9iamVjdFtrZXldID0gZGF0YTtcclxuXHR9XHJcblxyXG5cdHJldHVybiBvYmplY3Q7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB3cml0ZURlc2NyaXB0b3JTdHJ1Y3R1cmUod3JpdGVyOiBQc2RXcml0ZXIsIG5hbWU6IHN0cmluZywgY2xhc3NJZDogc3RyaW5nLCB2YWx1ZTogYW55LCByb290OiBzdHJpbmcpIHtcclxuXHRpZiAobG9nRXJyb3JzICYmICFjbGFzc0lkKSBjb25zb2xlLmxvZygnTWlzc2luZyBjbGFzc0lkIGZvcjogJywgbmFtZSwgY2xhc3NJZCwgdmFsdWUpO1xyXG5cclxuXHQvLyB3cml0ZSBjbGFzcyBzdHJ1Y3R1cmVcclxuXHR3cml0ZVVuaWNvZGVTdHJpbmdXaXRoUGFkZGluZyh3cml0ZXIsIG5hbWUpO1xyXG5cdHdyaXRlQXNjaWlTdHJpbmdPckNsYXNzSWQod3JpdGVyLCBjbGFzc0lkKTtcclxuXHJcblx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcclxuXHR3cml0ZVVpbnQzMih3cml0ZXIsIGtleXMubGVuZ3RoKTtcclxuXHJcblx0Zm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xyXG5cdFx0bGV0IHR5cGUgPSBnZXRUeXBlQnlLZXkoa2V5LCB2YWx1ZVtrZXldLCByb290LCB2YWx1ZSk7XHJcblx0XHRsZXQgZXh0VHlwZSA9IGZpZWxkVG9FeHRUeXBlW2tleV07XHJcblxyXG5cdFx0aWYgKGtleSA9PT0gJ1NjbCAnICYmICdIcnpuJyBpbiB2YWx1ZVtrZXldKSB7XHJcblx0XHRcdHR5cGUgPSAnT2JqYyc7XHJcblx0XHRcdGV4dFR5cGUgPSBudWxsVHlwZTtcclxuXHRcdH0gZWxzZSBpZiAoa2V5ID09PSAnYXVkaW9DbGlwR3JvdXBMaXN0JyAmJiBrZXlzLmxlbmd0aCA9PT0gMSkge1xyXG5cdFx0XHR0eXBlID0gJ1ZsTHMnO1xyXG5cdFx0fSBlbHNlIGlmICgoa2V5ID09PSAnU3RydCcgfHwga2V5ID09PSAnQnJnaCcpICYmICdIICAgJyBpbiB2YWx1ZSkge1xyXG5cdFx0XHR0eXBlID0gJ2RvdWInO1xyXG5cdFx0fSBlbHNlIGlmIChrZXkgPT09ICdTdHJ0Jykge1xyXG5cdFx0XHR0eXBlID0gJ09iamMnO1xyXG5cdFx0XHRleHRUeXBlID0gbnVsbFR5cGU7XHJcblx0XHR9IGVsc2UgaWYgKGNoYW5uZWxzLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHtcclxuXHRcdFx0dHlwZSA9IChjbGFzc0lkID09PSAnUkdCQycgJiYgcm9vdCAhPT0gJ2FydGQnKSA/ICdkb3ViJyA6ICdsb25nJztcclxuXHRcdH0gZWxzZSBpZiAoa2V5ID09PSAncHJvZmlsZScpIHtcclxuXHRcdFx0dHlwZSA9IGNsYXNzSWQgPT09ICdwcmludE91dHB1dCcgPyAnVEVYVCcgOiAndGR0YSc7XHJcblx0XHR9IGVsc2UgaWYgKGtleSA9PT0gJ3N0cm9rZVN0eWxlQ29udGVudCcpIHtcclxuXHRcdFx0aWYgKHZhbHVlW2tleV1bJ0NsciAnXSkge1xyXG5cdFx0XHRcdGV4dFR5cGUgPSBtYWtlVHlwZSgnJywgJ3NvbGlkQ29sb3JMYXllcicpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHZhbHVlW2tleV0uR3JhZCkge1xyXG5cdFx0XHRcdGV4dFR5cGUgPSBtYWtlVHlwZSgnJywgJ2dyYWRpZW50TGF5ZXInKTtcclxuXHRcdFx0fSBlbHNlIGlmICh2YWx1ZVtrZXldLlB0cm4pIHtcclxuXHRcdFx0XHRleHRUeXBlID0gbWFrZVR5cGUoJycsICdwYXR0ZXJuTGF5ZXInKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRsb2dFcnJvcnMgJiYgY29uc29sZS5sb2coJ0ludmFsaWQgc3Ryb2tlU3R5bGVDb250ZW50IHZhbHVlJywgdmFsdWVba2V5XSk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAoa2V5ID09PSAnYm91bmRzJyAmJiByb290ID09PSAncXVpbHRXYXJwJykge1xyXG5cdFx0XHRleHRUeXBlID0gbWFrZVR5cGUoJycsICdjbGFzc0Zsb2F0UmVjdCcpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChleHRUeXBlICYmIGV4dFR5cGUuY2xhc3NJRCA9PT0gJ1JHQkMnKSB7XHJcblx0XHRcdGlmICgnSCAgICcgaW4gdmFsdWVba2V5XSkgZXh0VHlwZSA9IHsgY2xhc3NJRDogJ0hTQkMnLCBuYW1lOiAnJyB9O1xyXG5cdFx0XHQvLyBUT0RPOiBvdGhlciBjb2xvciBzcGFjZXNcclxuXHRcdH1cclxuXHJcblx0XHR3cml0ZUFzY2lpU3RyaW5nT3JDbGFzc0lkKHdyaXRlciwga2V5KTtcclxuXHRcdHdyaXRlU2lnbmF0dXJlKHdyaXRlciwgdHlwZSB8fCAnbG9uZycpO1xyXG5cdFx0d3JpdGVPU1R5cGUod3JpdGVyLCB0eXBlIHx8ICdsb25nJywgdmFsdWVba2V5XSwga2V5LCBleHRUeXBlLCByb290KTtcclxuXHRcdGlmIChsb2dFcnJvcnMgJiYgIXR5cGUpIGNvbnNvbGUubG9nKGBNaXNzaW5nIGRlc2NyaXB0b3IgZmllbGQgdHlwZSBmb3I6ICcke2tleX0nIGluYCwgdmFsdWUpO1xyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gcmVhZE9TVHlwZShyZWFkZXI6IFBzZFJlYWRlciwgdHlwZTogc3RyaW5nKSB7XHJcblx0c3dpdGNoICh0eXBlKSB7XHJcblx0XHRjYXNlICdvYmogJzogLy8gUmVmZXJlbmNlXHJcblx0XHRcdHJldHVybiByZWFkUmVmZXJlbmNlU3RydWN0dXJlKHJlYWRlcik7XHJcblx0XHRjYXNlICdPYmpjJzogLy8gRGVzY3JpcHRvclxyXG5cdFx0Y2FzZSAnR2xiTyc6IC8vIEdsb2JhbE9iamVjdCBzYW1lIGFzIERlc2NyaXB0b3JcclxuXHRcdFx0cmV0dXJuIHJlYWREZXNjcmlwdG9yU3RydWN0dXJlKHJlYWRlcik7XHJcblx0XHRjYXNlICdWbExzJzogeyAvLyBMaXN0XHJcblx0XHRcdGNvbnN0IGxlbmd0aCA9IHJlYWRJbnQzMihyZWFkZXIpO1xyXG5cdFx0XHRjb25zdCBpdGVtczogYW55W10gPSBbXTtcclxuXHJcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRjb25zdCB0eXBlID0gcmVhZFNpZ25hdHVyZShyZWFkZXIpO1xyXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKCcgID4nLCB0eXBlKTtcclxuXHRcdFx0XHRpdGVtcy5wdXNoKHJlYWRPU1R5cGUocmVhZGVyLCB0eXBlKSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBpdGVtcztcclxuXHRcdH1cclxuXHRcdGNhc2UgJ2RvdWInOiAvLyBEb3VibGVcclxuXHRcdFx0cmV0dXJuIHJlYWRGbG9hdDY0KHJlYWRlcik7XHJcblx0XHRjYXNlICdVbnRGJzogeyAvLyBVbml0IGRvdWJsZVxyXG5cdFx0XHRjb25zdCB1bml0cyA9IHJlYWRTaWduYXR1cmUocmVhZGVyKTtcclxuXHRcdFx0Y29uc3QgdmFsdWUgPSByZWFkRmxvYXQ2NChyZWFkZXIpO1xyXG5cdFx0XHRpZiAoIXVuaXRzTWFwW3VuaXRzXSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHVuaXRzOiAke3VuaXRzfWApO1xyXG5cdFx0XHRyZXR1cm4geyB1bml0czogdW5pdHNNYXBbdW5pdHNdLCB2YWx1ZSB9O1xyXG5cdFx0fVxyXG5cdFx0Y2FzZSAnVW5GbCc6IHsgLy8gVW5pdCBmbG9hdFxyXG5cdFx0XHRjb25zdCB1bml0cyA9IHJlYWRTaWduYXR1cmUocmVhZGVyKTtcclxuXHRcdFx0Y29uc3QgdmFsdWUgPSByZWFkRmxvYXQzMihyZWFkZXIpO1xyXG5cdFx0XHRpZiAoIXVuaXRzTWFwW3VuaXRzXSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHVuaXRzOiAke3VuaXRzfWApO1xyXG5cdFx0XHRyZXR1cm4geyB1bml0czogdW5pdHNNYXBbdW5pdHNdLCB2YWx1ZSB9O1xyXG5cdFx0fVxyXG5cdFx0Y2FzZSAnVEVYVCc6IC8vIFN0cmluZ1xyXG5cdFx0XHRyZXR1cm4gcmVhZFVuaWNvZGVTdHJpbmcocmVhZGVyKTtcclxuXHRcdGNhc2UgJ2VudW0nOiB7IC8vIEVudW1lcmF0ZWRcclxuXHRcdFx0Y29uc3QgdHlwZSA9IHJlYWRBc2NpaVN0cmluZ09yQ2xhc3NJZChyZWFkZXIpO1xyXG5cdFx0XHRjb25zdCB2YWx1ZSA9IHJlYWRBc2NpaVN0cmluZ09yQ2xhc3NJZChyZWFkZXIpO1xyXG5cdFx0XHRyZXR1cm4gYCR7dHlwZX0uJHt2YWx1ZX1gO1xyXG5cdFx0fVxyXG5cdFx0Y2FzZSAnbG9uZyc6IC8vIEludGVnZXJcclxuXHRcdFx0cmV0dXJuIHJlYWRJbnQzMihyZWFkZXIpO1xyXG5cdFx0Y2FzZSAnY29tcCc6IHsgLy8gTGFyZ2UgSW50ZWdlclxyXG5cdFx0XHRjb25zdCBsb3cgPSByZWFkVWludDMyKHJlYWRlcik7XHJcblx0XHRcdGNvbnN0IGhpZ2ggPSByZWFkVWludDMyKHJlYWRlcik7XHJcblx0XHRcdHJldHVybiB7IGxvdywgaGlnaCB9O1xyXG5cdFx0fVxyXG5cdFx0Y2FzZSAnYm9vbCc6IC8vIEJvb2xlYW5cclxuXHRcdFx0cmV0dXJuICEhcmVhZFVpbnQ4KHJlYWRlcik7XHJcblx0XHRjYXNlICd0eXBlJzogLy8gQ2xhc3NcclxuXHRcdGNhc2UgJ0dsYkMnOiAvLyBDbGFzc1xyXG5cdFx0XHRyZXR1cm4gcmVhZENsYXNzU3RydWN0dXJlKHJlYWRlcik7XHJcblx0XHRjYXNlICdhbGlzJzogeyAvLyBBbGlhc1xyXG5cdFx0XHRjb25zdCBsZW5ndGggPSByZWFkSW50MzIocmVhZGVyKTtcclxuXHRcdFx0cmV0dXJuIHJlYWRBc2NpaVN0cmluZyhyZWFkZXIsIGxlbmd0aCk7XHJcblx0XHR9XHJcblx0XHRjYXNlICd0ZHRhJzogeyAvLyBSYXcgRGF0YVxyXG5cdFx0XHRjb25zdCBsZW5ndGggPSByZWFkSW50MzIocmVhZGVyKTtcclxuXHRcdFx0cmV0dXJuIHJlYWRCeXRlcyhyZWFkZXIsIGxlbmd0aCk7XHJcblx0XHR9XHJcblx0XHRjYXNlICdPYkFyJzogeyAvLyBPYmplY3QgYXJyYXlcclxuXHRcdFx0cmVhZEludDMyKHJlYWRlcik7IC8vIHZlcnNpb246IDE2XHJcblx0XHRcdHJlYWRVbmljb2RlU3RyaW5nKHJlYWRlcik7IC8vIG5hbWU6ICcnXHJcblx0XHRcdHJlYWRBc2NpaVN0cmluZ09yQ2xhc3NJZChyZWFkZXIpOyAvLyAncmF0aW9uYWxQb2ludCdcclxuXHRcdFx0Y29uc3QgbGVuZ3RoID0gcmVhZEludDMyKHJlYWRlcik7XHJcblx0XHRcdGNvbnN0IGl0ZW1zOiBhbnlbXSA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGNvbnN0IHR5cGUxID0gcmVhZEFzY2lpU3RyaW5nT3JDbGFzc0lkKHJlYWRlcik7IC8vIHR5cGUgSHJ6biB8IFZydGNcclxuXHRcdFx0XHRyZWFkU2lnbmF0dXJlKHJlYWRlcik7IC8vIFVuRmxcclxuXHJcblx0XHRcdFx0cmVhZFNpZ25hdHVyZShyZWFkZXIpOyAvLyB1bml0cyA/ICcjUHhsJ1xyXG5cdFx0XHRcdGNvbnN0IHZhbHVlc0NvdW50ID0gcmVhZEludDMyKHJlYWRlcik7XHJcblx0XHRcdFx0Y29uc3QgdmFsdWVzOiBudW1iZXJbXSA9IFtdO1xyXG5cdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgdmFsdWVzQ291bnQ7IGorKykge1xyXG5cdFx0XHRcdFx0dmFsdWVzLnB1c2gocmVhZEZsb2F0NjQocmVhZGVyKSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpdGVtcy5wdXNoKHsgdHlwZTogdHlwZTEsIHZhbHVlcyB9KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGl0ZW1zO1xyXG5cdFx0fVxyXG5cdFx0Y2FzZSAnUHRoICc6IHsgLy8gRmlsZSBwYXRoXHJcblx0XHRcdC8qY29uc3QgbGVuZ3RoID0qLyByZWFkSW50MzIocmVhZGVyKTtcclxuXHRcdFx0Y29uc3Qgc2lnID0gcmVhZFNpZ25hdHVyZShyZWFkZXIpO1xyXG5cdFx0XHQvKmNvbnN0IHBhdGhTaXplID0qLyByZWFkSW50MzJMRShyZWFkZXIpO1xyXG5cdFx0XHRjb25zdCBjaGFyc0NvdW50ID0gcmVhZEludDMyTEUocmVhZGVyKTtcclxuXHRcdFx0Y29uc3QgcGF0aCA9IHJlYWRVbmljb2RlU3RyaW5nV2l0aExlbmd0aChyZWFkZXIsIGNoYXJzQ291bnQpO1xyXG5cdFx0XHRyZXR1cm4geyBzaWcsIHBhdGggfTtcclxuXHRcdH1cclxuXHRcdGRlZmF1bHQ6XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBUeVNoIGRlc2NyaXB0b3IgT1NUeXBlOiAke3R5cGV9IGF0ICR7cmVhZGVyLm9mZnNldC50b1N0cmluZygxNil9YCk7XHJcblx0fVxyXG59XHJcblxyXG5jb25zdCBPYkFyVHlwZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkOyB9ID0ge1xyXG5cdG1lc2hQb2ludHM6ICdyYXRpb25hbFBvaW50JyxcclxuXHRxdWlsdFNsaWNlWDogJ1VudEYnLFxyXG5cdHF1aWx0U2xpY2VZOiAnVW50RicsXHJcbn07XHJcblxyXG5mdW5jdGlvbiB3cml0ZU9TVHlwZSh3cml0ZXI6IFBzZFdyaXRlciwgdHlwZTogc3RyaW5nLCB2YWx1ZTogYW55LCBrZXk6IHN0cmluZywgZXh0VHlwZTogTmFtZUNsYXNzSUQgfCB1bmRlZmluZWQsIHJvb3Q6IHN0cmluZykge1xyXG5cdHN3aXRjaCAodHlwZSkge1xyXG5cdFx0Y2FzZSAnb2JqICc6IC8vIFJlZmVyZW5jZVxyXG5cdFx0XHR3cml0ZVJlZmVyZW5jZVN0cnVjdHVyZSh3cml0ZXIsIGtleSwgdmFsdWUpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgJ09iamMnOiAvLyBEZXNjcmlwdG9yXHJcblx0XHRjYXNlICdHbGJPJzogLy8gR2xvYmFsT2JqZWN0IHNhbWUgYXMgRGVzY3JpcHRvclxyXG5cdFx0XHRpZiAoIWV4dFR5cGUpIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBleHQgdHlwZSBmb3I6ICcke2tleX0nICgke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0pYCk7XHJcblx0XHRcdHdyaXRlRGVzY3JpcHRvclN0cnVjdHVyZSh3cml0ZXIsIGV4dFR5cGUubmFtZSwgZXh0VHlwZS5jbGFzc0lELCB2YWx1ZSwgcm9vdCk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Y2FzZSAnVmxMcyc6IC8vIExpc3RcclxuXHRcdFx0d3JpdGVJbnQzMih3cml0ZXIsIHZhbHVlLmxlbmd0aCk7XHJcblxyXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0Y29uc3QgdHlwZSA9IGZpZWxkVG9BcnJheVR5cGVba2V5XTtcclxuXHRcdFx0XHR3cml0ZVNpZ25hdHVyZSh3cml0ZXIsIHR5cGUgfHwgJ2xvbmcnKTtcclxuXHRcdFx0XHR3cml0ZU9TVHlwZSh3cml0ZXIsIHR5cGUgfHwgJ2xvbmcnLCB2YWx1ZVtpXSwgJycsIGZpZWxkVG9BcnJheUV4dFR5cGVba2V5XSwgcm9vdCk7XHJcblx0XHRcdFx0aWYgKGxvZ0Vycm9ycyAmJiAhdHlwZSkgY29uc29sZS5sb2coYE1pc3NpbmcgZGVzY3JpcHRvciBhcnJheSB0eXBlIGZvcjogJyR7a2V5fScgaW5gLCB2YWx1ZSk7XHJcblx0XHRcdH1cclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlICdkb3ViJzogLy8gRG91YmxlXHJcblx0XHRcdHdyaXRlRmxvYXQ2NCh3cml0ZXIsIHZhbHVlKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlICdVbnRGJzogLy8gVW5pdCBkb3VibGVcclxuXHRcdFx0aWYgKCF1bml0c01hcFJldlt2YWx1ZS51bml0c10pIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB1bml0czogJHt2YWx1ZS51bml0c30gaW4gJHtrZXl9YCk7XHJcblx0XHRcdHdyaXRlU2lnbmF0dXJlKHdyaXRlciwgdW5pdHNNYXBSZXZbdmFsdWUudW5pdHNdKTtcclxuXHRcdFx0d3JpdGVGbG9hdDY0KHdyaXRlciwgdmFsdWUudmFsdWUpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgJ1VuRmwnOiAvLyBVbml0IGZsb2F0XHJcblx0XHRcdGlmICghdW5pdHNNYXBSZXZbdmFsdWUudW5pdHNdKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdW5pdHM6ICR7dmFsdWUudW5pdHN9IGluICR7a2V5fWApO1xyXG5cdFx0XHR3cml0ZVNpZ25hdHVyZSh3cml0ZXIsIHVuaXRzTWFwUmV2W3ZhbHVlLnVuaXRzXSk7XHJcblx0XHRcdHdyaXRlRmxvYXQzMih3cml0ZXIsIHZhbHVlLnZhbHVlKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlICdURVhUJzogLy8gU3RyaW5nXHJcblx0XHRcdHdyaXRlVW5pY29kZVN0cmluZ1dpdGhQYWRkaW5nKHdyaXRlciwgdmFsdWUpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgJ2VudW0nOiB7IC8vIEVudW1lcmF0ZWRcclxuXHRcdFx0Y29uc3QgW190eXBlLCB2YWxdID0gdmFsdWUuc3BsaXQoJy4nKTtcclxuXHRcdFx0d3JpdGVBc2NpaVN0cmluZ09yQ2xhc3NJZCh3cml0ZXIsIF90eXBlKTtcclxuXHRcdFx0d3JpdGVBc2NpaVN0cmluZ09yQ2xhc3NJZCh3cml0ZXIsIHZhbCk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cdFx0Y2FzZSAnbG9uZyc6IC8vIEludGVnZXJcclxuXHRcdFx0d3JpdGVJbnQzMih3cml0ZXIsIHZhbHVlKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHQvLyBjYXNlICdjb21wJzogLy8gTGFyZ2UgSW50ZWdlclxyXG5cdFx0Ly8gXHR3cml0ZUxhcmdlSW50ZWdlcihyZWFkZXIpO1xyXG5cdFx0Y2FzZSAnYm9vbCc6IC8vIEJvb2xlYW5cclxuXHRcdFx0d3JpdGVVaW50OCh3cml0ZXIsIHZhbHVlID8gMSA6IDApO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdC8vIGNhc2UgJ3R5cGUnOiAvLyBDbGFzc1xyXG5cdFx0Ly8gY2FzZSAnR2xiQyc6IC8vIENsYXNzXHJcblx0XHQvLyBcdHdyaXRlQ2xhc3NTdHJ1Y3R1cmUocmVhZGVyKTtcclxuXHRcdC8vIGNhc2UgJ2FsaXMnOiAvLyBBbGlhc1xyXG5cdFx0Ly8gXHR3cml0ZUFsaWFzU3RydWN0dXJlKHJlYWRlcik7XHJcblx0XHRjYXNlICd0ZHRhJzogLy8gUmF3IERhdGFcclxuXHRcdFx0d3JpdGVJbnQzMih3cml0ZXIsIHZhbHVlLmJ5dGVMZW5ndGgpO1xyXG5cdFx0XHR3cml0ZUJ5dGVzKHdyaXRlciwgdmFsdWUpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgJ09iQXInOiB7IC8vIE9iamVjdCBhcnJheVxyXG5cdFx0XHR3cml0ZUludDMyKHdyaXRlciwgMTYpOyAvLyB2ZXJzaW9uXHJcblx0XHRcdHdyaXRlVW5pY29kZVN0cmluZ1dpdGhQYWRkaW5nKHdyaXRlciwgJycpOyAvLyBuYW1lXHJcblx0XHRcdGNvbnN0IHR5cGUgPSBPYkFyVHlwZXNba2V5XTtcclxuXHRcdFx0aWYgKCF0eXBlKSB0aHJvdyBuZXcgRXJyb3IoYE5vdCBpbXBsZW1lbnRlZCBPYkFyVHlwZSBmb3I6ICR7a2V5fWApO1xyXG5cdFx0XHR3cml0ZUFzY2lpU3RyaW5nT3JDbGFzc0lkKHdyaXRlciwgdHlwZSk7XHJcblx0XHRcdHdyaXRlSW50MzIod3JpdGVyLCB2YWx1ZS5sZW5ndGgpO1xyXG5cclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdHdyaXRlQXNjaWlTdHJpbmdPckNsYXNzSWQod3JpdGVyLCB2YWx1ZVtpXS50eXBlKTsgLy8gSHJ6biB8IFZydGNcclxuXHRcdFx0XHR3cml0ZVNpZ25hdHVyZSh3cml0ZXIsICdVbkZsJyk7XHJcblx0XHRcdFx0d3JpdGVTaWduYXR1cmUod3JpdGVyLCAnI1B4bCcpO1xyXG5cdFx0XHRcdHdyaXRlSW50MzIod3JpdGVyLCB2YWx1ZVtpXS52YWx1ZXMubGVuZ3RoKTtcclxuXHJcblx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCB2YWx1ZVtpXS52YWx1ZXMubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRcdHdyaXRlRmxvYXQ2NCh3cml0ZXIsIHZhbHVlW2ldLnZhbHVlc1tqXSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cdFx0Ly8gY2FzZSAnUHRoICc6IC8vIEZpbGUgcGF0aFxyXG5cdFx0Ly8gXHR3cml0ZUZpbGVQYXRoKHJlYWRlcik7XHJcblx0XHRkZWZhdWx0OlxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYE5vdCBpbXBsZW1lbnRlZCBkZXNjcmlwdG9yIE9TVHlwZTogJHt0eXBlfWApO1xyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gcmVhZFJlZmVyZW5jZVN0cnVjdHVyZShyZWFkZXI6IFBzZFJlYWRlcikge1xyXG5cdGNvbnN0IGl0ZW1zQ291bnQgPSByZWFkSW50MzIocmVhZGVyKTtcclxuXHRjb25zdCBpdGVtczogYW55W10gPSBbXTtcclxuXHJcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtc0NvdW50OyBpKyspIHtcclxuXHRcdGNvbnN0IHR5cGUgPSByZWFkU2lnbmF0dXJlKHJlYWRlcik7XHJcblxyXG5cdFx0c3dpdGNoICh0eXBlKSB7XHJcblx0XHRcdGNhc2UgJ3Byb3AnOiB7IC8vIFByb3BlcnR5XHJcblx0XHRcdFx0cmVhZENsYXNzU3RydWN0dXJlKHJlYWRlcik7XHJcblx0XHRcdFx0Y29uc3Qga2V5SUQgPSByZWFkQXNjaWlTdHJpbmdPckNsYXNzSWQocmVhZGVyKTtcclxuXHRcdFx0XHRpdGVtcy5wdXNoKGtleUlEKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0XHRjYXNlICdDbHNzJzogLy8gQ2xhc3NcclxuXHRcdFx0XHRpdGVtcy5wdXNoKHJlYWRDbGFzc1N0cnVjdHVyZShyZWFkZXIpKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAnRW5tcic6IHsgLy8gRW51bWVyYXRlZCBSZWZlcmVuY2VcclxuXHRcdFx0XHRyZWFkQ2xhc3NTdHJ1Y3R1cmUocmVhZGVyKTtcclxuXHRcdFx0XHRjb25zdCB0eXBlSUQgPSByZWFkQXNjaWlTdHJpbmdPckNsYXNzSWQocmVhZGVyKTtcclxuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IHJlYWRBc2NpaVN0cmluZ09yQ2xhc3NJZChyZWFkZXIpO1xyXG5cdFx0XHRcdGl0ZW1zLnB1c2goYCR7dHlwZUlEfS4ke3ZhbHVlfWApO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNhc2UgJ3JlbGUnOiB7IC8vIE9mZnNldFxyXG5cdFx0XHRcdC8vIGNvbnN0IHsgbmFtZSwgY2xhc3NJRCB9ID1cclxuXHRcdFx0XHRyZWFkQ2xhc3NTdHJ1Y3R1cmUocmVhZGVyKTtcclxuXHRcdFx0XHRpdGVtcy5wdXNoKHJlYWRVaW50MzIocmVhZGVyKSk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdH1cclxuXHRcdFx0Y2FzZSAnSWRudCc6IC8vIElkZW50aWZpZXJcclxuXHRcdFx0XHRpdGVtcy5wdXNoKHJlYWRJbnQzMihyZWFkZXIpKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAnaW5keCc6IC8vIEluZGV4XHJcblx0XHRcdFx0aXRlbXMucHVzaChyZWFkSW50MzIocmVhZGVyKSk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJ25hbWUnOiB7IC8vIE5hbWVcclxuXHRcdFx0XHRyZWFkQ2xhc3NTdHJ1Y3R1cmUocmVhZGVyKTtcclxuXHRcdFx0XHRpdGVtcy5wdXNoKHJlYWRVbmljb2RlU3RyaW5nKHJlYWRlcikpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRlc2NyaXB0b3IgcmVmZXJlbmNlIHR5cGU6ICR7dHlwZX1gKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHJldHVybiBpdGVtcztcclxufVxyXG5cclxuZnVuY3Rpb24gd3JpdGVSZWZlcmVuY2VTdHJ1Y3R1cmUod3JpdGVyOiBQc2RXcml0ZXIsIF9rZXk6IHN0cmluZywgaXRlbXM6IGFueVtdKSB7XHJcblx0d3JpdGVJbnQzMih3cml0ZXIsIGl0ZW1zLmxlbmd0aCk7XHJcblxyXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdGNvbnN0IHZhbHVlID0gaXRlbXNbaV07XHJcblx0XHRsZXQgdHlwZSA9ICd1bmtub3duJztcclxuXHJcblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG5cdFx0XHRpZiAoL15bYS16XStcXC5bYS16XSskL2kudGVzdCh2YWx1ZSkpIHtcclxuXHRcdFx0XHR0eXBlID0gJ0VubXInO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHR5cGUgPSAnbmFtZSc7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHR3cml0ZVNpZ25hdHVyZSh3cml0ZXIsIHR5cGUpO1xyXG5cclxuXHRcdHN3aXRjaCAodHlwZSkge1xyXG5cdFx0XHQvLyBjYXNlICdwcm9wJzogLy8gUHJvcGVydHlcclxuXHRcdFx0Ly8gY2FzZSAnQ2xzcyc6IC8vIENsYXNzXHJcblx0XHRcdGNhc2UgJ0VubXInOiB7IC8vIEVudW1lcmF0ZWQgUmVmZXJlbmNlXHJcblx0XHRcdFx0Y29uc3QgW3R5cGVJRCwgZW51bVZhbHVlXSA9IHZhbHVlLnNwbGl0KCcuJyk7XHJcblx0XHRcdFx0d3JpdGVDbGFzc1N0cnVjdHVyZSh3cml0ZXIsICdcXDAnLCB0eXBlSUQpO1xyXG5cdFx0XHRcdHdyaXRlQXNjaWlTdHJpbmdPckNsYXNzSWQod3JpdGVyLCB0eXBlSUQpO1xyXG5cdFx0XHRcdHdyaXRlQXNjaWlTdHJpbmdPckNsYXNzSWQod3JpdGVyLCBlbnVtVmFsdWUpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vIGNhc2UgJ3JlbGUnOiAvLyBPZmZzZXRcclxuXHRcdFx0Ly8gY2FzZSAnSWRudCc6IC8vIElkZW50aWZpZXJcclxuXHRcdFx0Ly8gY2FzZSAnaW5keCc6IC8vIEluZGV4XHJcblx0XHRcdGNhc2UgJ25hbWUnOiB7IC8vIE5hbWVcclxuXHRcdFx0XHR3cml0ZUNsYXNzU3RydWN0dXJlKHdyaXRlciwgJ1xcMCcsICdMeXIgJyk7XHJcblx0XHRcdFx0d3JpdGVVbmljb2RlU3RyaW5nKHdyaXRlciwgdmFsdWUgKyAnXFwwJyk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdH1cclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGVzY3JpcHRvciByZWZlcmVuY2UgdHlwZTogJHt0eXBlfWApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGl0ZW1zO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZWFkQ2xhc3NTdHJ1Y3R1cmUocmVhZGVyOiBQc2RSZWFkZXIpIHtcclxuXHRjb25zdCBuYW1lID0gcmVhZFVuaWNvZGVTdHJpbmcocmVhZGVyKTtcclxuXHRjb25zdCBjbGFzc0lEID0gcmVhZEFzY2lpU3RyaW5nT3JDbGFzc0lkKHJlYWRlcik7XHJcblx0Ly8gY29uc29sZS5sb2coeyBuYW1lLCBjbGFzc0lEIH0pO1xyXG5cdHJldHVybiB7IG5hbWUsIGNsYXNzSUQgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gd3JpdGVDbGFzc1N0cnVjdHVyZSh3cml0ZXI6IFBzZFdyaXRlciwgbmFtZTogc3RyaW5nLCBjbGFzc0lEOiBzdHJpbmcpIHtcclxuXHR3cml0ZVVuaWNvZGVTdHJpbmcod3JpdGVyLCBuYW1lKTtcclxuXHR3cml0ZUFzY2lpU3RyaW5nT3JDbGFzc0lkKHdyaXRlciwgY2xhc3NJRCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZWFkVmVyc2lvbkFuZERlc2NyaXB0b3IocmVhZGVyOiBQc2RSZWFkZXIpIHtcclxuXHRjb25zdCB2ZXJzaW9uID0gcmVhZFVpbnQzMihyZWFkZXIpO1xyXG5cdGlmICh2ZXJzaW9uICE9PSAxNikgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRlc2NyaXB0b3IgdmVyc2lvbjogJHt2ZXJzaW9ufWApO1xyXG5cdGNvbnN0IGRlc2MgPSByZWFkRGVzY3JpcHRvclN0cnVjdHVyZShyZWFkZXIpO1xyXG5cdC8vIGNvbnNvbGUubG9nKHJlcXVpcmUoJ3V0aWwnKS5pbnNwZWN0KGRlc2MsIGZhbHNlLCA5OSwgdHJ1ZSkpO1xyXG5cdHJldHVybiBkZXNjO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVWZXJzaW9uQW5kRGVzY3JpcHRvcih3cml0ZXI6IFBzZFdyaXRlciwgbmFtZTogc3RyaW5nLCBjbGFzc0lEOiBzdHJpbmcsIGRlc2NyaXB0b3I6IGFueSwgcm9vdCA9ICcnKSB7XHJcblx0d3JpdGVVaW50MzIod3JpdGVyLCAxNik7IC8vIHZlcnNpb25cclxuXHR3cml0ZURlc2NyaXB0b3JTdHJ1Y3R1cmUod3JpdGVyLCBuYW1lLCBjbGFzc0lELCBkZXNjcmlwdG9yLCByb290KTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgRGVzY3JpcHRvclVuaXRzID0gJ0FuZ2xlJyB8ICdEZW5zaXR5JyB8ICdEaXN0YW5jZScgfCAnTm9uZScgfCAnUGVyY2VudCcgfCAnUGl4ZWxzJyB8XHJcblx0J01pbGxpbWV0ZXJzJyB8ICdQb2ludHMnIHwgJ1BpY2FzJyB8ICdJbmNoZXMnIHwgJ0NlbnRpbWV0ZXJzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGVzY3JpcHRvclVuaXRzVmFsdWUge1xyXG5cdHVuaXRzOiBEZXNjcmlwdG9yVW5pdHM7XHJcblx0dmFsdWU6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgRGVzY3JpcHRvckNvbG9yID0ge1xyXG5cdCdSZCAgJzogbnVtYmVyO1xyXG5cdCdHcm4gJzogbnVtYmVyO1xyXG5cdCdCbCAgJzogbnVtYmVyO1xyXG59IHwge1xyXG5cdCdIICAgJzogRGVzY3JpcHRvclVuaXRzVmFsdWU7XHJcblx0U3RydDogbnVtYmVyO1xyXG5cdEJyZ2g6IG51bWJlcjtcclxufSB8IHtcclxuXHQnQ3luICc6IG51bWJlcjtcclxuXHRNZ250OiBudW1iZXI7XHJcblx0J1lsdyAnOiBudW1iZXI7XHJcblx0QmxjazogbnVtYmVyO1xyXG59IHwge1xyXG5cdCdHcnkgJzogbnVtYmVyO1xyXG59IHwge1xyXG5cdExtbmM6IG51bWJlcjtcclxuXHQnQSAgICc6IG51bWJlcjtcclxuXHQnQiAgICc6IG51bWJlcjtcclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGVzY2lwdG9yUGF0dGVybiB7XHJcblx0J05tICAnOiBzdHJpbmc7XHJcblx0SWRudDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBEZXNjaXB0b3JHcmFkaWVudCA9IHtcclxuXHQnTm0gICc6IHN0cmluZztcclxuXHRHcmRGOiAnR3JkRi5Dc3RTJztcclxuXHRJbnRyOiBudW1iZXI7XHJcblx0Q2xyczoge1xyXG5cdFx0J0NsciAnOiBEZXNjcmlwdG9yQ29sb3I7XHJcblx0XHRUeXBlOiAnQ2xyeS5Vc3JTJztcclxuXHRcdExjdG46IG51bWJlcjtcclxuXHRcdE1kcG46IG51bWJlcjtcclxuXHR9W107XHJcblx0VHJuczoge1xyXG5cdFx0T3BjdDogRGVzY3JpcHRvclVuaXRzVmFsdWU7XHJcblx0XHRMY3RuOiBudW1iZXI7XHJcblx0XHRNZHBuOiBudW1iZXI7XHJcblx0fVtdO1xyXG59IHwge1xyXG5cdEdyZEY6ICdHcmRGLkNsTnMnO1xyXG5cdFNtdGg6IG51bWJlcjtcclxuXHQnTm0gICc6IHN0cmluZztcclxuXHRDbHJTOiBzdHJpbmc7XHJcblx0Um5kUzogbnVtYmVyO1xyXG5cdFZjdEM/OiBib29sZWFuO1xyXG5cdFNoVHI/OiBib29sZWFuO1xyXG5cdCdNbm0gJzogbnVtYmVyW107XHJcblx0J014bSAnOiBudW1iZXJbXTtcclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGVzY3JpcHRvckNvbG9yQ29udGVudCB7XHJcblx0J0NsciAnOiBEZXNjcmlwdG9yQ29sb3I7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGVzY3JpcHRvckdyYWRpZW50Q29udGVudCB7XHJcblx0R3JhZDogRGVzY2lwdG9yR3JhZGllbnQ7XHJcblx0VHlwZTogc3RyaW5nO1xyXG5cdER0aHI/OiBib29sZWFuO1xyXG5cdFJ2cnM/OiBib29sZWFuO1xyXG5cdEFuZ2w/OiBEZXNjcmlwdG9yVW5pdHNWYWx1ZTtcclxuXHQnU2NsICc/OiBEZXNjcmlwdG9yVW5pdHNWYWx1ZTtcclxuXHRBbGduPzogYm9vbGVhbjtcclxuXHRPZnN0PzogeyBIcnpuOiBEZXNjcmlwdG9yVW5pdHNWYWx1ZTsgVnJ0YzogRGVzY3JpcHRvclVuaXRzVmFsdWU7IH07XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGVzY3JpcHRvclBhdHRlcm5Db250ZW50IHtcclxuXHRQdHJuOiBEZXNjaXB0b3JQYXR0ZXJuO1xyXG5cdExua2Q/OiBib29sZWFuO1xyXG5cdHBoYXNlPzogeyBIcnpuOiBudW1iZXI7IFZydGM6IG51bWJlcjsgfTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgRGVzY3JpcHRvclZlY3RvckNvbnRlbnQgPSBEZXNjcmlwdG9yQ29sb3JDb250ZW50IHwgRGVzY3JpcHRvckdyYWRpZW50Q29udGVudCB8IERlc2NyaXB0b3JQYXR0ZXJuQ29udGVudDtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3Ryb2tlRGVzY3JpcHRvciB7XHJcblx0c3Ryb2tlU3R5bGVWZXJzaW9uOiBudW1iZXI7XHJcblx0c3Ryb2tlRW5hYmxlZDogYm9vbGVhbjtcclxuXHRmaWxsRW5hYmxlZDogYm9vbGVhbjtcclxuXHRzdHJva2VTdHlsZUxpbmVXaWR0aDogRGVzY3JpcHRvclVuaXRzVmFsdWU7XHJcblx0c3Ryb2tlU3R5bGVMaW5lRGFzaE9mZnNldDogRGVzY3JpcHRvclVuaXRzVmFsdWU7XHJcblx0c3Ryb2tlU3R5bGVNaXRlckxpbWl0OiBudW1iZXI7XHJcblx0c3Ryb2tlU3R5bGVMaW5lQ2FwVHlwZTogc3RyaW5nO1xyXG5cdHN0cm9rZVN0eWxlTGluZUpvaW5UeXBlOiBzdHJpbmc7XHJcblx0c3Ryb2tlU3R5bGVMaW5lQWxpZ25tZW50OiBzdHJpbmc7XHJcblx0c3Ryb2tlU3R5bGVTY2FsZUxvY2s6IGJvb2xlYW47XHJcblx0c3Ryb2tlU3R5bGVTdHJva2VBZGp1c3Q6IGJvb2xlYW47XHJcblx0c3Ryb2tlU3R5bGVMaW5lRGFzaFNldDogRGVzY3JpcHRvclVuaXRzVmFsdWVbXTtcclxuXHRzdHJva2VTdHlsZUJsZW5kTW9kZTogc3RyaW5nO1xyXG5cdHN0cm9rZVN0eWxlT3BhY2l0eTogRGVzY3JpcHRvclVuaXRzVmFsdWU7XHJcblx0c3Ryb2tlU3R5bGVDb250ZW50OiBEZXNjcmlwdG9yVmVjdG9yQ29udGVudDtcclxuXHRzdHJva2VTdHlsZVJlc29sdXRpb246IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUZXh0RGVzY3JpcHRvciB7XHJcblx0J1R4dCAnOiBzdHJpbmc7XHJcblx0dGV4dEdyaWRkaW5nOiBzdHJpbmc7XHJcblx0T3JudDogc3RyaW5nO1xyXG5cdEFudEE6IHN0cmluZztcclxuXHRUZXh0SW5kZXg6IG51bWJlcjtcclxuXHRFbmdpbmVEYXRhPzogVWludDhBcnJheTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBXYXJwRGVzY3JpcHRvciB7XHJcblx0d2FycFN0eWxlOiBzdHJpbmc7XHJcblx0d2FycFZhbHVlOiBudW1iZXI7XHJcblx0d2FycFBlcnNwZWN0aXZlOiBudW1iZXI7XHJcblx0d2FycFBlcnNwZWN0aXZlT3RoZXI6IG51bWJlcjtcclxuXHR3YXJwUm90YXRlOiBzdHJpbmc7XHJcblx0Ym91bmRzPzoge1xyXG5cdFx0J1RvcCAnOiBEZXNjcmlwdG9yVW5pdHNWYWx1ZTtcclxuXHRcdExlZnQ6IERlc2NyaXB0b3JVbml0c1ZhbHVlO1xyXG5cdFx0QnRvbTogRGVzY3JpcHRvclVuaXRzVmFsdWU7XHJcblx0XHRSZ2h0OiBEZXNjcmlwdG9yVW5pdHNWYWx1ZTtcclxuXHR9O1xyXG5cdHVPcmRlcjogbnVtYmVyO1xyXG5cdHZPcmRlcjogbnVtYmVyO1xyXG5cdGN1c3RvbUVudmVsb3BlV2FycD86IHtcclxuXHRcdG1lc2hQb2ludHM6IHtcclxuXHRcdFx0dHlwZTogJ0hyem4nIHwgJ1ZydGMnO1xyXG5cdFx0XHR2YWx1ZXM6IG51bWJlcltdO1xyXG5cdFx0fVtdO1xyXG5cdH07XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUXVpbHRXYXJwRGVzY3JpcHRvciBleHRlbmRzIFdhcnBEZXNjcmlwdG9yIHtcclxuXHRkZWZvcm1OdW1Sb3dzOiBudW1iZXI7XHJcblx0ZGVmb3JtTnVtQ29sczogbnVtYmVyO1xyXG5cdGN1c3RvbUVudmVsb3BlV2FycDoge1xyXG5cdFx0cXVpbHRTbGljZVg6IHtcclxuXHRcdFx0dHlwZTogJ3F1aWx0U2xpY2VYJztcclxuXHRcdFx0dmFsdWVzOiBudW1iZXJbXTtcclxuXHRcdH1bXTtcclxuXHRcdHF1aWx0U2xpY2VZOiB7XHJcblx0XHRcdHR5cGU6ICdxdWlsdFNsaWNlWSc7XHJcblx0XHRcdHZhbHVlczogbnVtYmVyW107XHJcblx0XHR9W107XHJcblx0XHRtZXNoUG9pbnRzOiB7XHJcblx0XHRcdHR5cGU6ICdIcnpuJyB8ICdWcnRjJztcclxuXHRcdFx0dmFsdWVzOiBudW1iZXJbXTtcclxuXHRcdH1bXTtcclxuXHR9O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZyYWN0aW9uRGVzY3JpcHRvciB7XHJcblx0bnVtZXJhdG9yOiBudW1iZXI7XHJcblx0ZGVub21pbmF0b3I6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBIcnpuVnJ0Y0Rlc2NyaXB0b3Ige1xyXG5cdEhyem46IG51bWJlcjtcclxuXHRWcnRjOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRnJhbWVEZXNjcmlwdG9yIHtcclxuXHRGckxzOiBudW1iZXJbXTtcclxuXHRlbmFiPzogYm9vbGVhbjtcclxuXHRJTXNrPzogeyBPZnN0OiBIcnpuVnJ0Y0Rlc2NyaXB0b3IgfTtcclxuXHRWTXNrPzogeyBPZnN0OiBIcnpuVnJ0Y0Rlc2NyaXB0b3IgfTtcclxuXHRPZnN0PzogSHJ6blZydGNEZXNjcmlwdG9yO1xyXG5cdEZYUmY/OiBIcnpuVnJ0Y0Rlc2NyaXB0b3I7XHJcblx0TGVmeD86IExmeDJEZXNjcmlwdG9yO1xyXG5cdGJsZW5kT3B0aW9ucz86IHsgT3BjdDogRGVzY3JpcHRvclVuaXRzVmFsdWU7IH07XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRnJhbWVMaXN0RGVzY3JpcHRvciB7XHJcblx0TGFJRDogbnVtYmVyOyAvLyBsYXllciBJRFxyXG5cdExhU3Q6IEZyYW1lRGVzY3JpcHRvcltdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaG9yelZydGNUb1hZKGh2OiBIcnpuVnJ0Y0Rlc2NyaXB0b3IpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB9IHtcclxuXHRyZXR1cm4geyB4OiBodi5IcnpuLCB5OiBodi5WcnRjIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB4eVRvSG9yelZydGMoeHk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IH0pOiBIcnpuVnJ0Y0Rlc2NyaXB0b3Ige1xyXG5cdHJldHVybiB7IEhyem46IHh5LngsIFZydGM6IHh5LnkgfTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgVGltZWxpbmVBbmltS2V5RGVzY3JpcHRvciA9IHtcclxuXHRUeXBlOiAna2V5VHlwZS5PcGN0JztcclxuXHRPcGN0OiBEZXNjcmlwdG9yVW5pdHNWYWx1ZTtcclxufSB8IHtcclxuXHRUeXBlOiAna2V5VHlwZS5Ucm5mJztcclxuXHQnU2NsICc6IEhyem5WcnRjRGVzY3JpcHRvcjtcclxuXHRTa2V3OiBIcnpuVnJ0Y0Rlc2NyaXB0b3I7XHJcblx0cm90YXRpb246IG51bWJlcjtcclxuXHR0cmFuc2xhdGlvbjogSHJ6blZydGNEZXNjcmlwdG9yO1xyXG59IHwge1xyXG5cdFR5cGU6ICdrZXlUeXBlLlBzdG4nO1xyXG5cdEhyem46IG51bWJlcjtcclxuXHRWcnRjOiBudW1iZXI7XHJcbn0gfCB7XHJcblx0VHlwZTogJ2tleVR5cGUuc2hlZXRTdHlsZSc7XHJcblx0c2hlZXRTdHlsZToge1xyXG5cdFx0VnJzbjogbnVtYmVyO1xyXG5cdFx0TGVmeD86IExmeDJEZXNjcmlwdG9yO1xyXG5cdFx0YmxlbmRPcHRpb25zOiB7fTtcclxuXHR9O1xyXG59IHwge1xyXG5cdFR5cGU6ICdrZXlUeXBlLmdsb2JhbExpZ2h0aW5nJztcclxuXHRnYmxBOiBudW1iZXI7XHJcblx0Z2xvYmFsQWx0aXR1ZGU6IG51bWJlcjtcclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGltZWxpbmVLZXlEZXNjcmlwdG9yIHtcclxuXHRWcnNuOiAxO1xyXG5cdGFuaW1JbnRlcnBTdHlsZTogJ2FuaW1JbnRlcnBTdHlsZS5MbnIgJyB8ICdhbmltSW50ZXJwU3R5bGUuaG9sZCc7XHJcblx0dGltZTogRnJhY3Rpb25EZXNjcmlwdG9yO1xyXG5cdGFuaW1LZXk6IFRpbWVsaW5lQW5pbUtleURlc2NyaXB0b3I7XHJcblx0c2VsZWN0ZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGltZWxpbmVUcmFja0Rlc2NyaXB0b3Ige1xyXG5cdHRyYWNrSUQ6ICdzdGRUcmFja0lELmdsb2JhbExpZ2h0aW5nVHJhY2snIHwgJ3N0ZFRyYWNrSUQub3BhY2l0eVRyYWNrJyB8ICdzdGRUcmFja0lELnN0eWxlVHJhY2snIHwgJ3N0ZFRyYWNrSUQuc2hlZXRUcmFuc2Zvcm1UcmFjaycgfCAnc3RkVHJhY2tJRC5zaGVldFBvc2l0aW9uVHJhY2snO1xyXG5cdFZyc246IDE7XHJcblx0ZW5hYjogYm9vbGVhbjtcclxuXHRFZmZjOiBib29sZWFuO1xyXG5cdGVmZmVjdFBhcmFtcz86IHtcclxuXHRcdGtleUxpc3Q6IFRpbWVsaW5lS2V5RGVzY3JpcHRvcltdO1xyXG5cdFx0ZmlsbENhbnZhczogYm9vbGVhbjtcclxuXHRcdHpvb21PcmlnaW46IG51bWJlcjtcclxuXHR9O1xyXG5cdGtleUxpc3Q6IFRpbWVsaW5lS2V5RGVzY3JpcHRvcltdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVTY29wZURlc2NyaXB0b3Ige1xyXG5cdFZyc246IDE7XHJcblx0U3RydDogRnJhY3Rpb25EZXNjcmlwdG9yO1xyXG5cdGR1cmF0aW9uOiBGcmFjdGlvbkRlc2NyaXB0b3I7XHJcblx0aW5UaW1lOiBGcmFjdGlvbkRlc2NyaXB0b3I7XHJcblx0b3V0VGltZTogRnJhY3Rpb25EZXNjcmlwdG9yO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVsaW5lRGVzY3JpcHRvciB7XHJcblx0VnJzbjogMTtcclxuXHR0aW1lU2NvcGU6IFRpbWVTY29wZURlc2NyaXB0b3I7XHJcblx0YXV0b1Njb3BlOiBib29sZWFuO1xyXG5cdGF1ZGlvTGV2ZWw6IG51bWJlcjtcclxuXHRMeXJJOiBudW1iZXI7XHJcblx0dHJhY2tMaXN0PzogVGltZWxpbmVUcmFja0Rlc2NyaXB0b3JbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFZmZlY3REZXNjcmlwdG9yIGV4dGVuZHMgUGFydGlhbDxEZXNjcmlwdG9yR3JhZGllbnRDb250ZW50PiwgUGFydGlhbDxEZXNjcmlwdG9yUGF0dGVybkNvbnRlbnQ+IHtcclxuXHRlbmFiPzogYm9vbGVhbjtcclxuXHRTdHlsOiBzdHJpbmc7XHJcblx0UG50VD86IHN0cmluZztcclxuXHQnTWQgICc/OiBzdHJpbmc7XHJcblx0T3BjdD86IERlc2NyaXB0b3JVbml0c1ZhbHVlO1xyXG5cdCdTeiAgJz86IERlc2NyaXB0b3JVbml0c1ZhbHVlO1xyXG5cdCdDbHIgJz86IERlc2NyaXB0b3JDb2xvcjtcclxuXHRwcmVzZW50PzogYm9vbGVhbjtcclxuXHRzaG93SW5EaWFsb2c/OiBib29sZWFuO1xyXG5cdG92ZXJwcmludD86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGZ4MkRlc2NyaXB0b3Ige1xyXG5cdCdTY2wgJz86IERlc2NyaXB0b3JVbml0c1ZhbHVlO1xyXG5cdG1hc3RlckZYU3dpdGNoPzogYm9vbGVhbjtcclxuXHREclNoPzogRWZmZWN0RGVzY3JpcHRvcjtcclxuXHRJclNoPzogRWZmZWN0RGVzY3JpcHRvcjtcclxuXHRPckdsPzogRWZmZWN0RGVzY3JpcHRvcjtcclxuXHRJckdsPzogRWZmZWN0RGVzY3JpcHRvcjtcclxuXHRlYmJsPzogRWZmZWN0RGVzY3JpcHRvcjtcclxuXHRTb0ZpPzogRWZmZWN0RGVzY3JpcHRvcjtcclxuXHRwYXR0ZXJuRmlsbD86IEVmZmVjdERlc2NyaXB0b3I7XHJcblx0R3JGbD86IEVmZmVjdERlc2NyaXB0b3I7XHJcblx0Q2hGWD86IEVmZmVjdERlc2NyaXB0b3I7XHJcblx0RnJGWD86IEVmZmVjdERlc2NyaXB0b3I7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTG1meERlc2NyaXB0b3Ige1xyXG5cdCdTY2wgJz86IERlc2NyaXB0b3JVbml0c1ZhbHVlO1xyXG5cdG1hc3RlckZYU3dpdGNoPzogYm9vbGVhbjtcclxuXHRudW1Nb2RpZnlpbmdGWD86IG51bWJlcjtcclxuXHRPckdsPzogRWZmZWN0RGVzY3JpcHRvcjtcclxuXHRJckdsPzogRWZmZWN0RGVzY3JpcHRvcjtcclxuXHRlYmJsPzogRWZmZWN0RGVzY3JpcHRvcjtcclxuXHRDaEZYPzogRWZmZWN0RGVzY3JpcHRvcjtcclxuXHRkcm9wU2hhZG93TXVsdGk/OiBFZmZlY3REZXNjcmlwdG9yW107XHJcblx0aW5uZXJTaGFkb3dNdWx0aT86IEVmZmVjdERlc2NyaXB0b3JbXTtcclxuXHRzb2xpZEZpbGxNdWx0aT86IEVmZmVjdERlc2NyaXB0b3JbXTtcclxuXHRncmFkaWVudEZpbGxNdWx0aT86IEVmZmVjdERlc2NyaXB0b3JbXTtcclxuXHRmcmFtZUZYTXVsdGk/OiBFZmZlY3REZXNjcmlwdG9yW107XHJcblx0cGF0dGVybkZpbGw/OiBFZmZlY3REZXNjcmlwdG9yOyAvLyA/Pz9cclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VGeE9iamVjdChmeDogRWZmZWN0RGVzY3JpcHRvcikge1xyXG5cdGNvbnN0IHN0cm9rZTogTGF5ZXJFZmZlY3RTdHJva2UgPSB7XHJcblx0XHRlbmFibGVkOiAhIWZ4LmVuYWIsXHJcblx0XHRwb3NpdGlvbjogRlN0bC5kZWNvZGUoZnguU3R5bCksXHJcblx0XHRmaWxsVHlwZTogRnJGbC5kZWNvZGUoZnguUG50VCEpLFxyXG5cdFx0YmxlbmRNb2RlOiBCbG5NLmRlY29kZShmeFsnTWQgICddISksXHJcblx0XHRvcGFjaXR5OiBwYXJzZVBlcmNlbnQoZnguT3BjdCksXHJcblx0XHRzaXplOiBwYXJzZVVuaXRzKGZ4WydTeiAgJ10hKSxcclxuXHR9O1xyXG5cclxuXHRpZiAoZngucHJlc2VudCAhPT0gdW5kZWZpbmVkKSBzdHJva2UucHJlc2VudCA9IGZ4LnByZXNlbnQ7XHJcblx0aWYgKGZ4LnNob3dJbkRpYWxvZyAhPT0gdW5kZWZpbmVkKSBzdHJva2Uuc2hvd0luRGlhbG9nID0gZnguc2hvd0luRGlhbG9nO1xyXG5cdGlmIChmeC5vdmVycHJpbnQgIT09IHVuZGVmaW5lZCkgc3Ryb2tlLm92ZXJwcmludCA9IGZ4Lm92ZXJwcmludDtcclxuXHRpZiAoZnhbJ0NsciAnXSkgc3Ryb2tlLmNvbG9yID0gcGFyc2VDb2xvcihmeFsnQ2xyICddKTtcclxuXHRpZiAoZnguR3JhZCkgc3Ryb2tlLmdyYWRpZW50ID0gcGFyc2VHcmFkaWVudENvbnRlbnQoZnggYXMgYW55KTtcclxuXHRpZiAoZnguUHRybikgc3Ryb2tlLnBhdHRlcm4gPSBwYXJzZVBhdHRlcm5Db250ZW50KGZ4IGFzIGFueSk7XHJcblxyXG5cdHJldHVybiBzdHJva2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNlcmlhbGl6ZUZ4T2JqZWN0KHN0cm9rZTogTGF5ZXJFZmZlY3RTdHJva2UpIHtcclxuXHRsZXQgRnJGWDogRWZmZWN0RGVzY3JpcHRvciA9IHt9IGFzIGFueTtcclxuXHRGckZYLmVuYWIgPSAhIXN0cm9rZS5lbmFibGVkO1xyXG5cdGlmIChzdHJva2UucHJlc2VudCAhPT0gdW5kZWZpbmVkKSBGckZYLnByZXNlbnQgPSAhIXN0cm9rZS5wcmVzZW50O1xyXG5cdGlmIChzdHJva2Uuc2hvd0luRGlhbG9nICE9PSB1bmRlZmluZWQpIEZyRlguc2hvd0luRGlhbG9nID0gISFzdHJva2Uuc2hvd0luRGlhbG9nO1xyXG5cdEZyRlguU3R5bCA9IEZTdGwuZW5jb2RlKHN0cm9rZS5wb3NpdGlvbik7XHJcblx0RnJGWC5QbnRUID0gRnJGbC5lbmNvZGUoc3Ryb2tlLmZpbGxUeXBlKTtcclxuXHRGckZYWydNZCAgJ10gPSBCbG5NLmVuY29kZShzdHJva2UuYmxlbmRNb2RlKTtcclxuXHRGckZYLk9wY3QgPSB1bml0c1BlcmNlbnQoc3Ryb2tlLm9wYWNpdHkpO1xyXG5cdEZyRlhbJ1N6ICAnXSA9IHVuaXRzVmFsdWUoc3Ryb2tlLnNpemUsICdzaXplJyk7XHJcblx0aWYgKHN0cm9rZS5jb2xvcikgRnJGWFsnQ2xyICddID0gc2VyaWFsaXplQ29sb3Ioc3Ryb2tlLmNvbG9yKTtcclxuXHRpZiAoc3Ryb2tlLmdyYWRpZW50KSBGckZYID0geyAuLi5GckZYLCAuLi5zZXJpYWxpemVHcmFkaWVudENvbnRlbnQoc3Ryb2tlLmdyYWRpZW50KSB9O1xyXG5cdGlmIChzdHJva2UucGF0dGVybikgRnJGWCA9IHsgLi4uRnJGWCwgLi4uc2VyaWFsaXplUGF0dGVybkNvbnRlbnQoc3Ryb2tlLnBhdHRlcm4pIH07XHJcblx0aWYgKHN0cm9rZS5vdmVycHJpbnQgIT09IHVuZGVmaW5lZCkgRnJGWC5vdmVycHJpbnQgPSAhIXN0cm9rZS5vdmVycHJpbnQ7XHJcblx0cmV0dXJuIEZyRlg7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVFZmZlY3RzKGU6IExheWVyRWZmZWN0c0luZm8sIGxvZzogYm9vbGVhbiwgbXVsdGk6IGJvb2xlYW4pIHtcclxuXHRjb25zdCBpbmZvOiBMZngyRGVzY3JpcHRvciAmIExtZnhEZXNjcmlwdG9yID0gbXVsdGkgPyB7XHJcblx0XHQnU2NsICc6IHVuaXRzUGVyY2VudChlLnNjYWxlID8/IDEpLFxyXG5cdFx0bWFzdGVyRlhTd2l0Y2g6ICFlLmRpc2FibGVkLFxyXG5cdH0gOiB7XHJcblx0XHRtYXN0ZXJGWFN3aXRjaDogIWUuZGlzYWJsZWQsXHJcblx0XHQnU2NsICc6IHVuaXRzUGVyY2VudChlLnNjYWxlID8/IDEpLFxyXG5cdH07XHJcblxyXG5cdGNvbnN0IGFycmF5S2V5czogKGtleW9mIExheWVyRWZmZWN0c0luZm8pW10gPSBbJ2Ryb3BTaGFkb3cnLCAnaW5uZXJTaGFkb3cnLCAnc29saWRGaWxsJywgJ2dyYWRpZW50T3ZlcmxheScsICdzdHJva2UnXTtcclxuXHRmb3IgKGNvbnN0IGtleSBvZiBhcnJheUtleXMpIHtcclxuXHRcdGlmIChlW2tleV0gJiYgIUFycmF5LmlzQXJyYXkoZVtrZXldKSkgdGhyb3cgbmV3IEVycm9yKGAke2tleX0gc2hvdWxkIGJlIGFuIGFycmF5YCk7XHJcblx0fVxyXG5cclxuXHRpZiAoZS5kcm9wU2hhZG93Py5bMF0gJiYgIW11bHRpKSBpbmZvLkRyU2ggPSBzZXJpYWxpemVFZmZlY3RPYmplY3QoZS5kcm9wU2hhZG93WzBdLCAnZHJvcFNoYWRvdycsIGxvZyk7XHJcblx0aWYgKGUuZHJvcFNoYWRvdz8uWzBdICYmIG11bHRpKSBpbmZvLmRyb3BTaGFkb3dNdWx0aSA9IGUuZHJvcFNoYWRvdy5tYXAoaSA9PiBzZXJpYWxpemVFZmZlY3RPYmplY3QoaSwgJ2Ryb3BTaGFkb3cnLCBsb2cpKTtcclxuXHRpZiAoZS5pbm5lclNoYWRvdz8uWzBdICYmICFtdWx0aSkgaW5mby5JclNoID0gc2VyaWFsaXplRWZmZWN0T2JqZWN0KGUuaW5uZXJTaGFkb3dbMF0sICdpbm5lclNoYWRvdycsIGxvZyk7XHJcblx0aWYgKGUuaW5uZXJTaGFkb3c/LlswXSAmJiBtdWx0aSkgaW5mby5pbm5lclNoYWRvd011bHRpID0gZS5pbm5lclNoYWRvdy5tYXAoaSA9PiBzZXJpYWxpemVFZmZlY3RPYmplY3QoaSwgJ2lubmVyU2hhZG93JywgbG9nKSk7XHJcblx0aWYgKGUub3V0ZXJHbG93KSBpbmZvLk9yR2wgPSBzZXJpYWxpemVFZmZlY3RPYmplY3QoZS5vdXRlckdsb3csICdvdXRlckdsb3cnLCBsb2cpO1xyXG5cdGlmIChlLnNvbGlkRmlsbD8uWzBdICYmIG11bHRpKSBpbmZvLnNvbGlkRmlsbE11bHRpID0gZS5zb2xpZEZpbGwubWFwKGkgPT4gc2VyaWFsaXplRWZmZWN0T2JqZWN0KGksICdzb2xpZEZpbGwnLCBsb2cpKTtcclxuXHRpZiAoZS5ncmFkaWVudE92ZXJsYXk/LlswXSAmJiBtdWx0aSkgaW5mby5ncmFkaWVudEZpbGxNdWx0aSA9IGUuZ3JhZGllbnRPdmVybGF5Lm1hcChpID0+IHNlcmlhbGl6ZUVmZmVjdE9iamVjdChpLCAnZ3JhZGllbnRPdmVybGF5JywgbG9nKSk7XHJcblx0aWYgKGUuc3Ryb2tlPy5bMF0gJiYgbXVsdGkpIGluZm8uZnJhbWVGWE11bHRpID0gZS5zdHJva2UubWFwKGkgPT4gc2VyaWFsaXplRnhPYmplY3QoaSkpO1xyXG5cdGlmIChlLmlubmVyR2xvdykgaW5mby5JckdsID0gc2VyaWFsaXplRWZmZWN0T2JqZWN0KGUuaW5uZXJHbG93LCAnaW5uZXJHbG93JywgbG9nKTtcclxuXHRpZiAoZS5iZXZlbCkgaW5mby5lYmJsID0gc2VyaWFsaXplRWZmZWN0T2JqZWN0KGUuYmV2ZWwsICdiZXZlbCcsIGxvZyk7XHJcblx0aWYgKGUuc29saWRGaWxsPy5bMF0gJiYgIW11bHRpKSBpbmZvLlNvRmkgPSBzZXJpYWxpemVFZmZlY3RPYmplY3QoZS5zb2xpZEZpbGxbMF0sICdzb2xpZEZpbGwnLCBsb2cpO1xyXG5cdGlmIChlLnBhdHRlcm5PdmVybGF5KSBpbmZvLnBhdHRlcm5GaWxsID0gc2VyaWFsaXplRWZmZWN0T2JqZWN0KGUucGF0dGVybk92ZXJsYXksICdwYXR0ZXJuT3ZlcmxheScsIGxvZyk7XHJcblx0aWYgKGUuZ3JhZGllbnRPdmVybGF5Py5bMF0gJiYgIW11bHRpKSBpbmZvLkdyRmwgPSBzZXJpYWxpemVFZmZlY3RPYmplY3QoZS5ncmFkaWVudE92ZXJsYXlbMF0sICdncmFkaWVudE92ZXJsYXknLCBsb2cpO1xyXG5cdGlmIChlLnNhdGluKSBpbmZvLkNoRlggPSBzZXJpYWxpemVFZmZlY3RPYmplY3QoZS5zYXRpbiwgJ3NhdGluJywgbG9nKTtcclxuXHRpZiAoZS5zdHJva2U/LlswXSAmJiAhbXVsdGkpIGluZm8uRnJGWCA9IHNlcmlhbGl6ZUZ4T2JqZWN0KGUuc3Ryb2tlPy5bMF0pO1xyXG5cclxuXHRpZiAobXVsdGkpIHtcclxuXHRcdGluZm8ubnVtTW9kaWZ5aW5nRlggPSAwO1xyXG5cclxuXHRcdGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGUpKSB7XHJcblx0XHRcdGNvbnN0IHZhbHVlID0gKGUgYXMgYW55KVtrZXldO1xyXG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuXHRcdFx0XHRmb3IgKGNvbnN0IGVmZmVjdCBvZiB2YWx1ZSkge1xyXG5cdFx0XHRcdFx0aWYgKGVmZmVjdC5lbmFibGVkKSBpbmZvLm51bU1vZGlmeWluZ0ZYKys7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gaW5mbztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRWZmZWN0cyhpbmZvOiBMZngyRGVzY3JpcHRvciAmIExtZnhEZXNjcmlwdG9yLCBsb2c6IGJvb2xlYW4pIHtcclxuXHRjb25zdCBlZmZlY3RzOiBMYXllckVmZmVjdHNJbmZvID0ge307XHJcblx0aWYgKCFpbmZvLm1hc3RlckZYU3dpdGNoKSBlZmZlY3RzLmRpc2FibGVkID0gdHJ1ZTtcclxuXHRpZiAoaW5mb1snU2NsICddKSBlZmZlY3RzLnNjYWxlID0gcGFyc2VQZXJjZW50KGluZm9bJ1NjbCAnXSk7XHJcblx0aWYgKGluZm8uRHJTaCkgZWZmZWN0cy5kcm9wU2hhZG93ID0gW3BhcnNlRWZmZWN0T2JqZWN0KGluZm8uRHJTaCwgbG9nKV07XHJcblx0aWYgKGluZm8uZHJvcFNoYWRvd011bHRpKSBlZmZlY3RzLmRyb3BTaGFkb3cgPSBpbmZvLmRyb3BTaGFkb3dNdWx0aS5tYXAoaSA9PiBwYXJzZUVmZmVjdE9iamVjdChpLCBsb2cpKTtcclxuXHRpZiAoaW5mby5JclNoKSBlZmZlY3RzLmlubmVyU2hhZG93ID0gW3BhcnNlRWZmZWN0T2JqZWN0KGluZm8uSXJTaCwgbG9nKV07XHJcblx0aWYgKGluZm8uaW5uZXJTaGFkb3dNdWx0aSkgZWZmZWN0cy5pbm5lclNoYWRvdyA9IGluZm8uaW5uZXJTaGFkb3dNdWx0aS5tYXAoaSA9PiBwYXJzZUVmZmVjdE9iamVjdChpLCBsb2cpKTtcclxuXHRpZiAoaW5mby5PckdsKSBlZmZlY3RzLm91dGVyR2xvdyA9IHBhcnNlRWZmZWN0T2JqZWN0KGluZm8uT3JHbCwgbG9nKTtcclxuXHRpZiAoaW5mby5JckdsKSBlZmZlY3RzLmlubmVyR2xvdyA9IHBhcnNlRWZmZWN0T2JqZWN0KGluZm8uSXJHbCwgbG9nKTtcclxuXHRpZiAoaW5mby5lYmJsKSBlZmZlY3RzLmJldmVsID0gcGFyc2VFZmZlY3RPYmplY3QoaW5mby5lYmJsLCBsb2cpO1xyXG5cdGlmIChpbmZvLlNvRmkpIGVmZmVjdHMuc29saWRGaWxsID0gW3BhcnNlRWZmZWN0T2JqZWN0KGluZm8uU29GaSwgbG9nKV07XHJcblx0aWYgKGluZm8uc29saWRGaWxsTXVsdGkpIGVmZmVjdHMuc29saWRGaWxsID0gaW5mby5zb2xpZEZpbGxNdWx0aS5tYXAoaSA9PiBwYXJzZUVmZmVjdE9iamVjdChpLCBsb2cpKTtcclxuXHRpZiAoaW5mby5wYXR0ZXJuRmlsbCkgZWZmZWN0cy5wYXR0ZXJuT3ZlcmxheSA9IHBhcnNlRWZmZWN0T2JqZWN0KGluZm8ucGF0dGVybkZpbGwsIGxvZyk7XHJcblx0aWYgKGluZm8uR3JGbCkgZWZmZWN0cy5ncmFkaWVudE92ZXJsYXkgPSBbcGFyc2VFZmZlY3RPYmplY3QoaW5mby5HckZsLCBsb2cpXTtcclxuXHRpZiAoaW5mby5ncmFkaWVudEZpbGxNdWx0aSkgZWZmZWN0cy5ncmFkaWVudE92ZXJsYXkgPSBpbmZvLmdyYWRpZW50RmlsbE11bHRpLm1hcChpID0+IHBhcnNlRWZmZWN0T2JqZWN0KGksIGxvZykpO1xyXG5cdGlmIChpbmZvLkNoRlgpIGVmZmVjdHMuc2F0aW4gPSBwYXJzZUVmZmVjdE9iamVjdChpbmZvLkNoRlgsIGxvZyk7XHJcblx0aWYgKGluZm8uRnJGWCkgZWZmZWN0cy5zdHJva2UgPSBbcGFyc2VGeE9iamVjdChpbmZvLkZyRlgpXTtcclxuXHRpZiAoaW5mby5mcmFtZUZYTXVsdGkpIGVmZmVjdHMuc3Ryb2tlID0gaW5mby5mcmFtZUZYTXVsdGkubWFwKGkgPT4gcGFyc2VGeE9iamVjdChpKSk7XHJcblx0cmV0dXJuIGVmZmVjdHM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlS2V5TGlzdChrZXlMaXN0OiBUaW1lbGluZUtleURlc2NyaXB0b3JbXSwgbG9nTWlzc2luZ0ZlYXR1cmVzOiBib29sZWFuKSB7XHJcblx0Y29uc3Qga2V5czogVGltZWxpbmVLZXlbXSA9IFtdO1xyXG5cclxuXHRmb3IgKGxldCBqID0gMDsgaiA8IGtleUxpc3QubGVuZ3RoOyBqKyspIHtcclxuXHRcdGNvbnN0IGtleSA9IGtleUxpc3Rbal07XHJcblx0XHRjb25zdCB7IHRpbWUsIHNlbGVjdGVkLCBhbmltS2V5IH0gPSBrZXk7XHJcblx0XHRjb25zdCBpbnRlcnBvbGF0aW9uID0gYW5pbUludGVycFN0eWxlRW51bS5kZWNvZGUoa2V5LmFuaW1JbnRlcnBTdHlsZSk7XHJcblxyXG5cdFx0c3dpdGNoIChhbmltS2V5LlR5cGUpIHtcclxuXHRcdFx0Y2FzZSAna2V5VHlwZS5PcGN0JzpcclxuXHRcdFx0XHRrZXlzLnB1c2goeyBpbnRlcnBvbGF0aW9uLCB0aW1lLCBzZWxlY3RlZCwgdHlwZTogJ29wYWNpdHknLCB2YWx1ZTogcGFyc2VQZXJjZW50KGFuaW1LZXkuT3BjdCkgfSk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJ2tleVR5cGUuUHN0bic6XHJcblx0XHRcdFx0a2V5cy5wdXNoKHsgaW50ZXJwb2xhdGlvbiwgdGltZSwgc2VsZWN0ZWQsIHR5cGU6ICdwb3NpdGlvbicsIHg6IGFuaW1LZXkuSHJ6biwgeTogYW5pbUtleS5WcnRjIH0pO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICdrZXlUeXBlLlRybmYnOlxyXG5cdFx0XHRcdGtleXMucHVzaCh7XHJcblx0XHRcdFx0XHRpbnRlcnBvbGF0aW9uLCB0aW1lLCBzZWxlY3RlZCwgdHlwZTogJ3RyYW5zZm9ybScsXHJcblx0XHRcdFx0XHRzY2FsZTogaG9yelZydGNUb1hZKGFuaW1LZXlbJ1NjbCAnXSksIHNrZXc6IGhvcnpWcnRjVG9YWShhbmltS2V5LlNrZXcpLCByb3RhdGlvbjogYW5pbUtleS5yb3RhdGlvbiwgdHJhbnNsYXRpb246IGhvcnpWcnRjVG9YWShhbmltS2V5LnRyYW5zbGF0aW9uKVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICdrZXlUeXBlLnNoZWV0U3R5bGUnOiB7XHJcblx0XHRcdFx0Y29uc3Qga2V5OiBUaW1lbGluZUtleSA9IHsgaW50ZXJwb2xhdGlvbiwgdGltZSwgc2VsZWN0ZWQsIHR5cGU6ICdzdHlsZScgfTtcclxuXHRcdFx0XHRpZiAoYW5pbUtleS5zaGVldFN0eWxlLkxlZngpIGtleS5zdHlsZSA9IHBhcnNlRWZmZWN0cyhhbmltS2V5LnNoZWV0U3R5bGUuTGVmeCwgbG9nTWlzc2luZ0ZlYXR1cmVzKTtcclxuXHRcdFx0XHRrZXlzLnB1c2goa2V5KTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0XHRjYXNlICdrZXlUeXBlLmdsb2JhbExpZ2h0aW5nJzoge1xyXG5cdFx0XHRcdGtleXMucHVzaCh7XHJcblx0XHRcdFx0XHRpbnRlcnBvbGF0aW9uLCB0aW1lLCBzZWxlY3RlZCwgdHlwZTogJ2dsb2JhbExpZ2h0aW5nJyxcclxuXHRcdFx0XHRcdGdsb2JhbEFuZ2xlOiBhbmltS2V5LmdibEEsIGdsb2JhbEFsdGl0dWRlOiBhbmltS2V5Lmdsb2JhbEFsdGl0dWRlXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdH1cclxuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBrZXlUeXBlIHZhbHVlYCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4ga2V5cztcclxufVxyXG5cclxuZnVuY3Rpb24gc2VyaWFsaXplS2V5TGlzdChrZXlzOiBUaW1lbGluZUtleVtdKTogVGltZWxpbmVLZXlEZXNjcmlwdG9yW10ge1xyXG5cdGNvbnN0IGtleUxpc3Q6IFRpbWVsaW5lS2V5RGVzY3JpcHRvcltdID0gW107XHJcblxyXG5cdGZvciAobGV0IGogPSAwOyBqIDwga2V5cy5sZW5ndGg7IGorKykge1xyXG5cdFx0Y29uc3Qga2V5ID0ga2V5c1tqXTtcclxuXHRcdGNvbnN0IHsgdGltZSwgc2VsZWN0ZWQgPSBmYWxzZSwgaW50ZXJwb2xhdGlvbiB9ID0ga2V5O1xyXG5cdFx0Y29uc3QgYW5pbUludGVycFN0eWxlID0gYW5pbUludGVycFN0eWxlRW51bS5lbmNvZGUoaW50ZXJwb2xhdGlvbikgYXMgJ2FuaW1JbnRlcnBTdHlsZS5MbnIgJyB8ICdhbmltSW50ZXJwU3R5bGUuaG9sZCc7XHJcblx0XHRsZXQgYW5pbUtleTogVGltZWxpbmVBbmltS2V5RGVzY3JpcHRvcjtcclxuXHJcblx0XHRzd2l0Y2ggKGtleS50eXBlKSB7XHJcblx0XHRcdGNhc2UgJ29wYWNpdHknOlxyXG5cdFx0XHRcdGFuaW1LZXkgPSB7IFR5cGU6ICdrZXlUeXBlLk9wY3QnLCBPcGN0OiB1bml0c1BlcmNlbnQoa2V5LnZhbHVlKSB9O1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICdwb3NpdGlvbic6XHJcblx0XHRcdFx0YW5pbUtleSA9IHsgVHlwZTogJ2tleVR5cGUuUHN0bicsIEhyem46IGtleS54LCBWcnRjOiBrZXkueSB9O1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICd0cmFuc2Zvcm0nOlxyXG5cdFx0XHRcdGFuaW1LZXkgPSB7IFR5cGU6ICdrZXlUeXBlLlRybmYnLCAnU2NsICc6IHh5VG9Ib3J6VnJ0YyhrZXkuc2NhbGUpLCBTa2V3OiB4eVRvSG9yelZydGMoa2V5LnNrZXcpLCByb3RhdGlvbjoga2V5LnJvdGF0aW9uLCB0cmFuc2xhdGlvbjogeHlUb0hvcnpWcnRjKGtleS50cmFuc2xhdGlvbikgfTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAnc3R5bGUnOlxyXG5cdFx0XHRcdGFuaW1LZXkgPSB7IFR5cGU6ICdrZXlUeXBlLnNoZWV0U3R5bGUnLCBzaGVldFN0eWxlOiB7IFZyc246IDEsIGJsZW5kT3B0aW9uczoge30gfSB9O1xyXG5cdFx0XHRcdGlmIChrZXkuc3R5bGUpIGFuaW1LZXkuc2hlZXRTdHlsZSA9IHsgVnJzbjogMSwgTGVmeDogc2VyaWFsaXplRWZmZWN0cyhrZXkuc3R5bGUsIGZhbHNlLCBmYWxzZSksIGJsZW5kT3B0aW9uczoge30gfTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAnZ2xvYmFsTGlnaHRpbmcnOiB7XHJcblx0XHRcdFx0YW5pbUtleSA9IHsgVHlwZTogJ2tleVR5cGUuZ2xvYmFsTGlnaHRpbmcnLCBnYmxBOiBrZXkuZ2xvYmFsQW5nbGUsIGdsb2JhbEFsdGl0dWRlOiBrZXkuZ2xvYmFsQWx0aXR1ZGUgfTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGtleVR5cGUgdmFsdWVgKTtcclxuXHRcdH1cclxuXHJcblx0XHRrZXlMaXN0LnB1c2goeyBWcnNuOiAxLCBhbmltSW50ZXJwU3R5bGUsIHRpbWUsIGFuaW1LZXksIHNlbGVjdGVkIH0pO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIGtleUxpc3Q7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRyYWNrTGlzdCh0cmFja0xpc3Q6IFRpbWVsaW5lVHJhY2tEZXNjcmlwdG9yW10sIGxvZ01pc3NpbmdGZWF0dXJlczogYm9vbGVhbikge1xyXG5cdGNvbnN0IHRyYWNrczogVGltZWxpbmVUcmFja1tdID0gW107XHJcblxyXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgdHJhY2tMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHRjb25zdCB0ciA9IHRyYWNrTGlzdFtpXTtcclxuXHRcdGNvbnN0IHRyYWNrOiBUaW1lbGluZVRyYWNrID0ge1xyXG5cdFx0XHR0eXBlOiBzdGRUcmFja0lELmRlY29kZSh0ci50cmFja0lEKSxcclxuXHRcdFx0ZW5hYmxlZDogdHIuZW5hYixcclxuXHRcdFx0a2V5czogcGFyc2VLZXlMaXN0KHRyLmtleUxpc3QsIGxvZ01pc3NpbmdGZWF0dXJlcyksXHJcblx0XHR9O1xyXG5cclxuXHRcdGlmICh0ci5lZmZlY3RQYXJhbXMpIHtcclxuXHRcdFx0dHJhY2suZWZmZWN0UGFyYW1zID0ge1xyXG5cdFx0XHRcdGZpbGxDYW52YXM6IHRyLmVmZmVjdFBhcmFtcy5maWxsQ2FudmFzLFxyXG5cdFx0XHRcdHpvb21PcmlnaW46IHRyLmVmZmVjdFBhcmFtcy56b29tT3JpZ2luLFxyXG5cdFx0XHRcdGtleXM6IHBhcnNlS2V5TGlzdCh0ci5lZmZlY3RQYXJhbXMua2V5TGlzdCwgbG9nTWlzc2luZ0ZlYXR1cmVzKSxcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHJcblx0XHR0cmFja3MucHVzaCh0cmFjayk7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gdHJhY2tzO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplVHJhY2tMaXN0KHRyYWNrczogVGltZWxpbmVUcmFja1tdKTogVGltZWxpbmVUcmFja0Rlc2NyaXB0b3JbXSB7XHJcblx0Y29uc3QgdHJhY2tMaXN0OiBUaW1lbGluZVRyYWNrRGVzY3JpcHRvcltdID0gW107XHJcblxyXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRjb25zdCB0ID0gdHJhY2tzW2ldO1xyXG5cdFx0dHJhY2tMaXN0LnB1c2goe1xyXG5cdFx0XHR0cmFja0lEOiBzdGRUcmFja0lELmVuY29kZSh0LnR5cGUpIGFzIGFueSxcclxuXHRcdFx0VnJzbjogMSxcclxuXHRcdFx0ZW5hYjogISF0LmVuYWJsZWQsXHJcblx0XHRcdEVmZmM6ICEhdC5lZmZlY3RQYXJhbXMsXHJcblx0XHRcdC4uLih0LmVmZmVjdFBhcmFtcyA/IHtcclxuXHRcdFx0XHRlZmZlY3RQYXJhbXM6IHtcclxuXHRcdFx0XHRcdGtleUxpc3Q6IHNlcmlhbGl6ZUtleUxpc3QodC5rZXlzKSxcclxuXHRcdFx0XHRcdGZpbGxDYW52YXM6IHQuZWZmZWN0UGFyYW1zLmZpbGxDYW52YXMsXHJcblx0XHRcdFx0XHR6b29tT3JpZ2luOiB0LmVmZmVjdFBhcmFtcy56b29tT3JpZ2luLFxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSA6IHt9KSxcclxuXHRcdFx0a2V5TGlzdDogc2VyaWFsaXplS2V5TGlzdCh0LmtleXMpLFxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gdHJhY2tMaXN0O1xyXG59XHJcblxyXG50eXBlIEFsbEVmZmVjdHMgPSBMYXllckVmZmVjdFNoYWRvdyAmIExheWVyRWZmZWN0c091dGVyR2xvdyAmIExheWVyRWZmZWN0U3Ryb2tlICZcclxuXHRMYXllckVmZmVjdElubmVyR2xvdyAmIExheWVyRWZmZWN0QmV2ZWwgJiBMYXllckVmZmVjdFNvbGlkRmlsbCAmXHJcblx0TGF5ZXJFZmZlY3RQYXR0ZXJuT3ZlcmxheSAmIExheWVyRWZmZWN0U2F0aW4gJiBMYXllckVmZmVjdEdyYWRpZW50T3ZlcmxheTtcclxuXHJcbmZ1bmN0aW9uIHBhcnNlRWZmZWN0T2JqZWN0KG9iajogYW55LCByZXBvcnRFcnJvcnM6IGJvb2xlYW4pIHtcclxuXHRjb25zdCByZXN1bHQ6IEFsbEVmZmVjdHMgPSB7fSBhcyBhbnk7XHJcblxyXG5cdGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iaikpIHtcclxuXHRcdGNvbnN0IHZhbCA9IG9ialtrZXldO1xyXG5cclxuXHRcdHN3aXRjaCAoa2V5KSB7XHJcblx0XHRcdGNhc2UgJ2VuYWInOiByZXN1bHQuZW5hYmxlZCA9ICEhdmFsOyBicmVhaztcclxuXHRcdFx0Y2FzZSAndWdsZyc6IHJlc3VsdC51c2VHbG9iYWxMaWdodCA9ICEhdmFsOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnQW50QSc6IHJlc3VsdC5hbnRpYWxpYXNlZCA9ICEhdmFsOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnQWxnbic6IHJlc3VsdC5hbGlnbiA9ICEhdmFsOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnRHRocic6IHJlc3VsdC5kaXRoZXIgPSAhIXZhbDsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ0ludnInOiByZXN1bHQuaW52ZXJ0ID0gISF2YWw7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdSdnJzJzogcmVzdWx0LnJldmVyc2UgPSAhIXZhbDsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ0NsciAnOiByZXN1bHQuY29sb3IgPSBwYXJzZUNvbG9yKHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdoZ2xDJzogcmVzdWx0LmhpZ2hsaWdodENvbG9yID0gcGFyc2VDb2xvcih2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnc2R3Qyc6IHJlc3VsdC5zaGFkb3dDb2xvciA9IHBhcnNlQ29sb3IodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ1N0eWwnOiByZXN1bHQucG9zaXRpb24gPSBGU3RsLmRlY29kZSh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnTWQgICc6IHJlc3VsdC5ibGVuZE1vZGUgPSBCbG5NLmRlY29kZSh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnaGdsTSc6IHJlc3VsdC5oaWdobGlnaHRCbGVuZE1vZGUgPSBCbG5NLmRlY29kZSh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnc2R3TSc6IHJlc3VsdC5zaGFkb3dCbGVuZE1vZGUgPSBCbG5NLmRlY29kZSh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnYnZsUyc6IHJlc3VsdC5zdHlsZSA9IEJFU2wuZGVjb2RlKHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdidmxEJzogcmVzdWx0LmRpcmVjdGlvbiA9IEJFU3MuZGVjb2RlKHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdidmxUJzogcmVzdWx0LnRlY2huaXF1ZSA9IGJ2bFQuZGVjb2RlKHZhbCkgYXMgYW55OyBicmVhaztcclxuXHRcdFx0Y2FzZSAnR2x3VCc6IHJlc3VsdC50ZWNobmlxdWUgPSBCRVRFLmRlY29kZSh2YWwpIGFzIGFueTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ2dsd1MnOiByZXN1bHQuc291cmNlID0gSUdTci5kZWNvZGUodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ1R5cGUnOiByZXN1bHQudHlwZSA9IEdyZFQuZGVjb2RlKHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdnczk5JzogcmVzdWx0LmludGVycG9sYXRpb25NZXRob2QgPSBncmFkaWVudEludGVycG9sYXRpb25NZXRob2RUeXBlLmRlY29kZSh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnT3BjdCc6IHJlc3VsdC5vcGFjaXR5ID0gcGFyc2VQZXJjZW50KHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdoZ2xPJzogcmVzdWx0LmhpZ2hsaWdodE9wYWNpdHkgPSBwYXJzZVBlcmNlbnQodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ3Nkd08nOiByZXN1bHQuc2hhZG93T3BhY2l0eSA9IHBhcnNlUGVyY2VudCh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnbGFnbCc6IHJlc3VsdC5hbmdsZSA9IHBhcnNlQW5nbGUodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ0FuZ2wnOiByZXN1bHQuYW5nbGUgPSBwYXJzZUFuZ2xlKHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdMYWxkJzogcmVzdWx0LmFsdGl0dWRlID0gcGFyc2VBbmdsZSh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnU2Z0bic6IHJlc3VsdC5zb2Z0ZW4gPSBwYXJzZVVuaXRzKHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdzcmdSJzogcmVzdWx0LnN0cmVuZ3RoID0gcGFyc2VQZXJjZW50KHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdibHVyJzogcmVzdWx0LnNpemUgPSBwYXJzZVVuaXRzKHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdOb3NlJzogcmVzdWx0Lm5vaXNlID0gcGFyc2VQZXJjZW50KHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdJbnByJzogcmVzdWx0LnJhbmdlID0gcGFyc2VQZXJjZW50KHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdDa210JzogcmVzdWx0LmNob2tlID0gcGFyc2VVbml0cyh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnU2hkTic6IHJlc3VsdC5qaXR0ZXIgPSBwYXJzZVBlcmNlbnQodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ0RzdG4nOiByZXN1bHQuZGlzdGFuY2UgPSBwYXJzZVVuaXRzKHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdTY2wgJzogcmVzdWx0LnNjYWxlID0gcGFyc2VQZXJjZW50KHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdQdHJuJzogcmVzdWx0LnBhdHRlcm4gPSB7IG5hbWU6IHZhbFsnTm0gICddLCBpZDogdmFsLklkbnQgfTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ3BoYXNlJzogcmVzdWx0LnBoYXNlID0geyB4OiB2YWwuSHJ6biwgeTogdmFsLlZydGMgfTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ09mc3QnOiByZXN1bHQub2Zmc2V0ID0geyB4OiBwYXJzZVBlcmNlbnQodmFsLkhyem4pLCB5OiBwYXJzZVBlcmNlbnQodmFsLlZydGMpIH07IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdNcGdTJzpcclxuXHRcdFx0Y2FzZSAnVHJuUyc6XHJcblx0XHRcdFx0cmVzdWx0LmNvbnRvdXIgPSB7XHJcblx0XHRcdFx0XHRuYW1lOiB2YWxbJ05tICAnXSxcclxuXHRcdFx0XHRcdGN1cnZlOiAodmFsWydDcnYgJ10gYXMgYW55W10pLm1hcChwID0+ICh7IHg6IHAuSHJ6biwgeTogcC5WcnRjIH0pKSxcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICdHcmFkJzogcmVzdWx0LmdyYWRpZW50ID0gcGFyc2VHcmFkaWVudCh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAndXNlVGV4dHVyZSc6XHJcblx0XHRcdGNhc2UgJ3VzZVNoYXBlJzpcclxuXHRcdFx0Y2FzZSAnbGF5ZXJDb25jZWFscyc6XHJcblx0XHRcdGNhc2UgJ3ByZXNlbnQnOlxyXG5cdFx0XHRjYXNlICdzaG93SW5EaWFsb2cnOlxyXG5cdFx0XHRjYXNlICdhbnRpYWxpYXNHbG9zcyc6IHJlc3VsdFtrZXldID0gdmFsOyBicmVhaztcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRyZXBvcnRFcnJvcnMgJiYgY29uc29sZS5sb2coYEludmFsaWQgZWZmZWN0IGtleTogJyR7a2V5fScsIHZhbHVlOmAsIHZhbCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZXJpYWxpemVFZmZlY3RPYmplY3Qob2JqOiBhbnksIG9iak5hbWU6IHN0cmluZywgcmVwb3J0RXJyb3JzOiBib29sZWFuKSB7XHJcblx0Y29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcclxuXHJcblx0Zm9yIChjb25zdCBvYmpLZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xyXG5cdFx0Y29uc3Qga2V5OiBrZXlvZiBBbGxFZmZlY3RzID0gb2JqS2V5IGFzIGFueTtcclxuXHRcdGNvbnN0IHZhbCA9IG9ialtrZXldO1xyXG5cclxuXHRcdHN3aXRjaCAoa2V5KSB7XHJcblx0XHRcdGNhc2UgJ2VuYWJsZWQnOiByZXN1bHQuZW5hYiA9ICEhdmFsOyBicmVhaztcclxuXHRcdFx0Y2FzZSAndXNlR2xvYmFsTGlnaHQnOiByZXN1bHQudWdsZyA9ICEhdmFsOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnYW50aWFsaWFzZWQnOiByZXN1bHQuQW50QSA9ICEhdmFsOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnYWxpZ24nOiByZXN1bHQuQWxnbiA9ICEhdmFsOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnZGl0aGVyJzogcmVzdWx0LkR0aHIgPSAhIXZhbDsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ2ludmVydCc6IHJlc3VsdC5JbnZyID0gISF2YWw7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdyZXZlcnNlJzogcmVzdWx0LlJ2cnMgPSAhIXZhbDsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ2NvbG9yJzogcmVzdWx0WydDbHIgJ10gPSBzZXJpYWxpemVDb2xvcih2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnaGlnaGxpZ2h0Q29sb3InOiByZXN1bHQuaGdsQyA9IHNlcmlhbGl6ZUNvbG9yKHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdzaGFkb3dDb2xvcic6IHJlc3VsdC5zZHdDID0gc2VyaWFsaXplQ29sb3IodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ3Bvc2l0aW9uJzogcmVzdWx0LlN0eWwgPSBGU3RsLmVuY29kZSh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnYmxlbmRNb2RlJzogcmVzdWx0WydNZCAgJ10gPSBCbG5NLmVuY29kZSh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnaGlnaGxpZ2h0QmxlbmRNb2RlJzogcmVzdWx0LmhnbE0gPSBCbG5NLmVuY29kZSh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnc2hhZG93QmxlbmRNb2RlJzogcmVzdWx0LnNkd00gPSBCbG5NLmVuY29kZSh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnc3R5bGUnOiByZXN1bHQuYnZsUyA9IEJFU2wuZW5jb2RlKHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdkaXJlY3Rpb24nOiByZXN1bHQuYnZsRCA9IEJFU3MuZW5jb2RlKHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICd0ZWNobmlxdWUnOlxyXG5cdFx0XHRcdGlmIChvYmpOYW1lID09PSAnYmV2ZWwnKSB7XHJcblx0XHRcdFx0XHRyZXN1bHQuYnZsVCA9IGJ2bFQuZW5jb2RlKHZhbCk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHJlc3VsdC5HbHdUID0gQkVURS5lbmNvZGUodmFsKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJ3NvdXJjZSc6IHJlc3VsdC5nbHdTID0gSUdTci5lbmNvZGUodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ3R5cGUnOiByZXN1bHQuVHlwZSA9IEdyZFQuZW5jb2RlKHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdpbnRlcnBvbGF0aW9uTWV0aG9kJzogcmVzdWx0LmdzOTkgPSBncmFkaWVudEludGVycG9sYXRpb25NZXRob2RUeXBlLmVuY29kZSh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnb3BhY2l0eSc6IHJlc3VsdC5PcGN0ID0gdW5pdHNQZXJjZW50KHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdoaWdobGlnaHRPcGFjaXR5JzogcmVzdWx0LmhnbE8gPSB1bml0c1BlcmNlbnQodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ3NoYWRvd09wYWNpdHknOiByZXN1bHQuc2R3TyA9IHVuaXRzUGVyY2VudCh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnYW5nbGUnOlxyXG5cdFx0XHRcdGlmIChvYmpOYW1lID09PSAnZ3JhZGllbnRPdmVybGF5Jykge1xyXG5cdFx0XHRcdFx0cmVzdWx0LkFuZ2wgPSB1bml0c0FuZ2xlKHZhbCk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHJlc3VsdC5sYWdsID0gdW5pdHNBbmdsZSh2YWwpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAnYWx0aXR1ZGUnOiByZXN1bHQuTGFsZCA9IHVuaXRzQW5nbGUodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ3NvZnRlbic6IHJlc3VsdC5TZnRuID0gdW5pdHNWYWx1ZSh2YWwsIGtleSk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdzdHJlbmd0aCc6IHJlc3VsdC5zcmdSID0gdW5pdHNQZXJjZW50KHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdzaXplJzogcmVzdWx0LmJsdXIgPSB1bml0c1ZhbHVlKHZhbCwga2V5KTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ25vaXNlJzogcmVzdWx0Lk5vc2UgPSB1bml0c1BlcmNlbnQodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ3JhbmdlJzogcmVzdWx0LklucHIgPSB1bml0c1BlcmNlbnQodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ2Nob2tlJzogcmVzdWx0LkNrbXQgPSB1bml0c1ZhbHVlKHZhbCwga2V5KTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ2ppdHRlcic6IHJlc3VsdC5TaGROID0gdW5pdHNQZXJjZW50KHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdkaXN0YW5jZSc6IHJlc3VsdC5Ec3RuID0gdW5pdHNWYWx1ZSh2YWwsIGtleSk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdzY2FsZSc6IHJlc3VsdFsnU2NsICddID0gdW5pdHNQZXJjZW50KHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdwYXR0ZXJuJzogcmVzdWx0LlB0cm4gPSB7ICdObSAgJzogdmFsLm5hbWUsIElkbnQ6IHZhbC5pZCB9OyBicmVhaztcclxuXHRcdFx0Y2FzZSAncGhhc2UnOiByZXN1bHQucGhhc2UgPSB7IEhyem46IHZhbC54LCBWcnRjOiB2YWwueSB9OyBicmVhaztcclxuXHRcdFx0Y2FzZSAnb2Zmc2V0JzogcmVzdWx0Lk9mc3QgPSB7IEhyem46IHVuaXRzUGVyY2VudCh2YWwueCksIFZydGM6IHVuaXRzUGVyY2VudCh2YWwueSkgfTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ2NvbnRvdXInOiB7XHJcblx0XHRcdFx0cmVzdWx0W29iak5hbWUgPT09ICdzYXRpbicgPyAnTXBnUycgOiAnVHJuUyddID0ge1xyXG5cdFx0XHRcdFx0J05tICAnOiAodmFsIGFzIEVmZmVjdENvbnRvdXIpLm5hbWUsXHJcblx0XHRcdFx0XHQnQ3J2ICc6ICh2YWwgYXMgRWZmZWN0Q29udG91cikuY3VydmUubWFwKHAgPT4gKHsgSHJ6bjogcC54LCBWcnRjOiBwLnkgfSkpLFxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdH1cclxuXHRcdFx0Y2FzZSAnZ3JhZGllbnQnOiByZXN1bHQuR3JhZCA9IHNlcmlhbGl6ZUdyYWRpZW50KHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICd1c2VUZXh0dXJlJzpcclxuXHRcdFx0Y2FzZSAndXNlU2hhcGUnOlxyXG5cdFx0XHRjYXNlICdsYXllckNvbmNlYWxzJzpcclxuXHRcdFx0Y2FzZSAncHJlc2VudCc6XHJcblx0XHRcdGNhc2UgJ3Nob3dJbkRpYWxvZyc6XHJcblx0XHRcdGNhc2UgJ2FudGlhbGlhc0dsb3NzJzpcclxuXHRcdFx0XHRyZXN1bHRba2V5XSA9IHZhbDtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRyZXBvcnRFcnJvcnMgJiYgY29uc29sZS5sb2coYEludmFsaWQgZWZmZWN0IGtleTogJyR7a2V5fScsIHZhbHVlOmAsIHZhbCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUdyYWRpZW50KGdyYWQ6IERlc2NpcHRvckdyYWRpZW50KTogRWZmZWN0U29saWRHcmFkaWVudCB8IEVmZmVjdE5vaXNlR3JhZGllbnQge1xyXG5cdGlmIChncmFkLkdyZEYgPT09ICdHcmRGLkNzdFMnKSB7XHJcblx0XHRjb25zdCBzYW1wbGVzOiBudW1iZXIgPSBncmFkLkludHIgfHwgNDA5NjtcclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR0eXBlOiAnc29saWQnLFxyXG5cdFx0XHRuYW1lOiBncmFkWydObSAgJ10sXHJcblx0XHRcdHNtb290aG5lc3M6IGdyYWQuSW50ciAvIDQwOTYsXHJcblx0XHRcdGNvbG9yU3RvcHM6IGdyYWQuQ2xycy5tYXAocyA9PiAoe1xyXG5cdFx0XHRcdGNvbG9yOiBwYXJzZUNvbG9yKHNbJ0NsciAnXSksXHJcblx0XHRcdFx0bG9jYXRpb246IHMuTGN0biAvIHNhbXBsZXMsXHJcblx0XHRcdFx0bWlkcG9pbnQ6IHMuTWRwbiAvIDEwMCxcclxuXHRcdFx0fSkpLFxyXG5cdFx0XHRvcGFjaXR5U3RvcHM6IGdyYWQuVHJucy5tYXAocyA9PiAoe1xyXG5cdFx0XHRcdG9wYWNpdHk6IHBhcnNlUGVyY2VudChzLk9wY3QpLFxyXG5cdFx0XHRcdGxvY2F0aW9uOiBzLkxjdG4gLyBzYW1wbGVzLFxyXG5cdFx0XHRcdG1pZHBvaW50OiBzLk1kcG4gLyAxMDAsXHJcblx0XHRcdH0pKSxcclxuXHRcdH07XHJcblx0fSBlbHNlIHtcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdHR5cGU6ICdub2lzZScsXHJcblx0XHRcdG5hbWU6IGdyYWRbJ05tICAnXSxcclxuXHRcdFx0cm91Z2huZXNzOiBncmFkLlNtdGggLyA0MDk2LFxyXG5cdFx0XHRjb2xvck1vZGVsOiBDbHJTLmRlY29kZShncmFkLkNsclMpLFxyXG5cdFx0XHRyYW5kb21TZWVkOiBncmFkLlJuZFMsXHJcblx0XHRcdHJlc3RyaWN0Q29sb3JzOiAhIWdyYWQuVmN0QyxcclxuXHRcdFx0YWRkVHJhbnNwYXJlbmN5OiAhIWdyYWQuU2hUcixcclxuXHRcdFx0bWluOiBncmFkWydNbm0gJ10ubWFwKHggPT4geCAvIDEwMCksXHJcblx0XHRcdG1heDogZ3JhZFsnTXhtICddLm1hcCh4ID0+IHggLyAxMDApLFxyXG5cdFx0fTtcclxuXHR9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNlcmlhbGl6ZUdyYWRpZW50KGdyYWQ6IEVmZmVjdFNvbGlkR3JhZGllbnQgfCBFZmZlY3ROb2lzZUdyYWRpZW50KTogRGVzY2lwdG9yR3JhZGllbnQge1xyXG5cdGlmIChncmFkLnR5cGUgPT09ICdzb2xpZCcpIHtcclxuXHRcdGNvbnN0IHNhbXBsZXMgPSBNYXRoLnJvdW5kKChncmFkLnNtb290aG5lc3MgPz8gMSkgKiA0MDk2KTtcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdCdObSAgJzogZ3JhZC5uYW1lIHx8ICcnLFxyXG5cdFx0XHRHcmRGOiAnR3JkRi5Dc3RTJyxcclxuXHRcdFx0SW50cjogc2FtcGxlcyxcclxuXHRcdFx0Q2xyczogZ3JhZC5jb2xvclN0b3BzLm1hcChzID0+ICh7XHJcblx0XHRcdFx0J0NsciAnOiBzZXJpYWxpemVDb2xvcihzLmNvbG9yKSxcclxuXHRcdFx0XHRUeXBlOiAnQ2xyeS5Vc3JTJyxcclxuXHRcdFx0XHRMY3RuOiBNYXRoLnJvdW5kKHMubG9jYXRpb24gKiBzYW1wbGVzKSxcclxuXHRcdFx0XHRNZHBuOiBNYXRoLnJvdW5kKChzLm1pZHBvaW50ID8/IDAuNSkgKiAxMDApLFxyXG5cdFx0XHR9KSksXHJcblx0XHRcdFRybnM6IGdyYWQub3BhY2l0eVN0b3BzLm1hcChzID0+ICh7XHJcblx0XHRcdFx0T3BjdDogdW5pdHNQZXJjZW50KHMub3BhY2l0eSksXHJcblx0XHRcdFx0TGN0bjogTWF0aC5yb3VuZChzLmxvY2F0aW9uICogc2FtcGxlcyksXHJcblx0XHRcdFx0TWRwbjogTWF0aC5yb3VuZCgocy5taWRwb2ludCA/PyAwLjUpICogMTAwKSxcclxuXHRcdFx0fSkpLFxyXG5cdFx0fTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0R3JkRjogJ0dyZEYuQ2xOcycsXHJcblx0XHRcdCdObSAgJzogZ3JhZC5uYW1lIHx8ICcnLFxyXG5cdFx0XHRTaFRyOiAhIWdyYWQuYWRkVHJhbnNwYXJlbmN5LFxyXG5cdFx0XHRWY3RDOiAhIWdyYWQucmVzdHJpY3RDb2xvcnMsXHJcblx0XHRcdENsclM6IENsclMuZW5jb2RlKGdyYWQuY29sb3JNb2RlbCksXHJcblx0XHRcdFJuZFM6IGdyYWQucmFuZG9tU2VlZCB8fCAwLFxyXG5cdFx0XHRTbXRoOiBNYXRoLnJvdW5kKChncmFkLnJvdWdobmVzcyA/PyAxKSAqIDQwOTYpLFxyXG5cdFx0XHQnTW5tICc6IChncmFkLm1pbiB8fCBbMCwgMCwgMCwgMF0pLm1hcCh4ID0+IHggKiAxMDApLFxyXG5cdFx0XHQnTXhtICc6IChncmFkLm1heCB8fCBbMSwgMSwgMSwgMV0pLm1hcCh4ID0+IHggKiAxMDApLFxyXG5cdFx0fTtcclxuXHR9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlR3JhZGllbnRDb250ZW50KGRlc2NyaXB0b3I6IERlc2NyaXB0b3JHcmFkaWVudENvbnRlbnQpIHtcclxuXHRjb25zdCByZXN1bHQgPSBwYXJzZUdyYWRpZW50KGRlc2NyaXB0b3IuR3JhZCkgYXMgKEVmZmVjdFNvbGlkR3JhZGllbnQgfCBFZmZlY3ROb2lzZUdyYWRpZW50KSAmIEV4dHJhR3JhZGllbnRJbmZvO1xyXG5cdHJlc3VsdC5zdHlsZSA9IEdyZFQuZGVjb2RlKGRlc2NyaXB0b3IuVHlwZSk7XHJcblx0aWYgKGRlc2NyaXB0b3IuRHRociAhPT0gdW5kZWZpbmVkKSByZXN1bHQuZGl0aGVyID0gZGVzY3JpcHRvci5EdGhyO1xyXG5cdGlmIChkZXNjcmlwdG9yLlJ2cnMgIT09IHVuZGVmaW5lZCkgcmVzdWx0LnJldmVyc2UgPSBkZXNjcmlwdG9yLlJ2cnM7XHJcblx0aWYgKGRlc2NyaXB0b3IuQW5nbCAhPT0gdW5kZWZpbmVkKSByZXN1bHQuYW5nbGUgPSBwYXJzZUFuZ2xlKGRlc2NyaXB0b3IuQW5nbCk7XHJcblx0aWYgKGRlc2NyaXB0b3JbJ1NjbCAnXSAhPT0gdW5kZWZpbmVkKSByZXN1bHQuc2NhbGUgPSBwYXJzZVBlcmNlbnQoZGVzY3JpcHRvclsnU2NsICddKTtcclxuXHRpZiAoZGVzY3JpcHRvci5BbGduICE9PSB1bmRlZmluZWQpIHJlc3VsdC5hbGlnbiA9IGRlc2NyaXB0b3IuQWxnbjtcclxuXHRpZiAoZGVzY3JpcHRvci5PZnN0ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdHJlc3VsdC5vZmZzZXQgPSB7XHJcblx0XHRcdHg6IHBhcnNlUGVyY2VudChkZXNjcmlwdG9yLk9mc3QuSHJ6biksXHJcblx0XHRcdHk6IHBhcnNlUGVyY2VudChkZXNjcmlwdG9yLk9mc3QuVnJ0YylcclxuXHRcdH07XHJcblx0fVxyXG5cdHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlUGF0dGVybkNvbnRlbnQoZGVzY3JpcHRvcjogRGVzY3JpcHRvclBhdHRlcm5Db250ZW50KSB7XHJcblx0Y29uc3QgcmVzdWx0OiBFZmZlY3RQYXR0ZXJuICYgRXh0cmFQYXR0ZXJuSW5mbyA9IHtcclxuXHRcdG5hbWU6IGRlc2NyaXB0b3IuUHRyblsnTm0gICddLFxyXG5cdFx0aWQ6IGRlc2NyaXB0b3IuUHRybi5JZG50LFxyXG5cdH07XHJcblx0aWYgKGRlc2NyaXB0b3IuTG5rZCAhPT0gdW5kZWZpbmVkKSByZXN1bHQubGlua2VkID0gZGVzY3JpcHRvci5MbmtkO1xyXG5cdGlmIChkZXNjcmlwdG9yLnBoYXNlICE9PSB1bmRlZmluZWQpIHJlc3VsdC5waGFzZSA9IHsgeDogZGVzY3JpcHRvci5waGFzZS5IcnpuLCB5OiBkZXNjcmlwdG9yLnBoYXNlLlZydGMgfTtcclxuXHRyZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmVjdG9yQ29udGVudChkZXNjcmlwdG9yOiBEZXNjcmlwdG9yVmVjdG9yQ29udGVudCk6IFZlY3RvckNvbnRlbnQge1xyXG5cdGlmICgnR3JhZCcgaW4gZGVzY3JpcHRvcikge1xyXG5cdFx0cmV0dXJuIHBhcnNlR3JhZGllbnRDb250ZW50KGRlc2NyaXB0b3IpO1xyXG5cdH0gZWxzZSBpZiAoJ1B0cm4nIGluIGRlc2NyaXB0b3IpIHtcclxuXHRcdHJldHVybiB7IHR5cGU6ICdwYXR0ZXJuJywgLi4ucGFyc2VQYXR0ZXJuQ29udGVudChkZXNjcmlwdG9yKSB9O1xyXG5cdH0gZWxzZSBpZiAoJ0NsciAnIGluIGRlc2NyaXB0b3IpIHtcclxuXHRcdHJldHVybiB7IHR5cGU6ICdjb2xvcicsIGNvbG9yOiBwYXJzZUNvbG9yKGRlc2NyaXB0b3JbJ0NsciAnXSkgfTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZlY3RvciBjb250ZW50Jyk7XHJcblx0fVxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXJpYWxpemVHcmFkaWVudENvbnRlbnQoY29udGVudDogKEVmZmVjdFNvbGlkR3JhZGllbnQgfCBFZmZlY3ROb2lzZUdyYWRpZW50KSAmIEV4dHJhR3JhZGllbnRJbmZvKSB7XHJcblx0Y29uc3QgcmVzdWx0OiBEZXNjcmlwdG9yR3JhZGllbnRDb250ZW50ID0ge30gYXMgYW55O1xyXG5cdGlmIChjb250ZW50LmRpdGhlciAhPT0gdW5kZWZpbmVkKSByZXN1bHQuRHRociA9IGNvbnRlbnQuZGl0aGVyO1xyXG5cdGlmIChjb250ZW50LnJldmVyc2UgIT09IHVuZGVmaW5lZCkgcmVzdWx0LlJ2cnMgPSBjb250ZW50LnJldmVyc2U7XHJcblx0aWYgKGNvbnRlbnQuYW5nbGUgIT09IHVuZGVmaW5lZCkgcmVzdWx0LkFuZ2wgPSB1bml0c0FuZ2xlKGNvbnRlbnQuYW5nbGUpO1xyXG5cdHJlc3VsdC5UeXBlID0gR3JkVC5lbmNvZGUoY29udGVudC5zdHlsZSk7XHJcblx0aWYgKGNvbnRlbnQuYWxpZ24gIT09IHVuZGVmaW5lZCkgcmVzdWx0LkFsZ24gPSBjb250ZW50LmFsaWduO1xyXG5cdGlmIChjb250ZW50LnNjYWxlICE9PSB1bmRlZmluZWQpIHJlc3VsdFsnU2NsICddID0gdW5pdHNQZXJjZW50KGNvbnRlbnQuc2NhbGUpO1xyXG5cdGlmIChjb250ZW50Lm9mZnNldCkge1xyXG5cdFx0cmVzdWx0Lk9mc3QgPSB7XHJcblx0XHRcdEhyem46IHVuaXRzUGVyY2VudChjb250ZW50Lm9mZnNldC54KSxcclxuXHRcdFx0VnJ0YzogdW5pdHNQZXJjZW50KGNvbnRlbnQub2Zmc2V0LnkpLFxyXG5cdFx0fTtcclxuXHR9XHJcblx0cmVzdWx0LkdyYWQgPSBzZXJpYWxpemVHcmFkaWVudChjb250ZW50KTtcclxuXHRyZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZXJpYWxpemVQYXR0ZXJuQ29udGVudChjb250ZW50OiBFZmZlY3RQYXR0ZXJuICYgRXh0cmFQYXR0ZXJuSW5mbykge1xyXG5cdGNvbnN0IHJlc3VsdDogRGVzY3JpcHRvclBhdHRlcm5Db250ZW50ID0ge1xyXG5cdFx0UHRybjoge1xyXG5cdFx0XHQnTm0gICc6IGNvbnRlbnQubmFtZSB8fCAnJyxcclxuXHRcdFx0SWRudDogY29udGVudC5pZCB8fCAnJyxcclxuXHRcdH1cclxuXHR9O1xyXG5cdGlmIChjb250ZW50LmxpbmtlZCAhPT0gdW5kZWZpbmVkKSByZXN1bHQuTG5rZCA9ICEhY29udGVudC5saW5rZWQ7XHJcblx0aWYgKGNvbnRlbnQucGhhc2UgIT09IHVuZGVmaW5lZCkgcmVzdWx0LnBoYXNlID0geyBIcnpuOiBjb250ZW50LnBoYXNlLngsIFZydGM6IGNvbnRlbnQucGhhc2UueSB9O1xyXG5cdHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVWZWN0b3JDb250ZW50KGNvbnRlbnQ6IFZlY3RvckNvbnRlbnQpOiB7IGRlc2NyaXB0b3I6IERlc2NyaXB0b3JWZWN0b3JDb250ZW50OyBrZXk6IHN0cmluZzsgfSB7XHJcblx0aWYgKGNvbnRlbnQudHlwZSA9PT0gJ2NvbG9yJykge1xyXG5cdFx0cmV0dXJuIHsga2V5OiAnU29DbycsIGRlc2NyaXB0b3I6IHsgJ0NsciAnOiBzZXJpYWxpemVDb2xvcihjb250ZW50LmNvbG9yKSB9IH07XHJcblx0fSBlbHNlIGlmIChjb250ZW50LnR5cGUgPT09ICdwYXR0ZXJuJykge1xyXG5cdFx0cmV0dXJuIHsga2V5OiAnUHRGbCcsIGRlc2NyaXB0b3I6IHNlcmlhbGl6ZVBhdHRlcm5Db250ZW50KGNvbnRlbnQpIH07XHJcblx0fSBlbHNlIHtcclxuXHRcdHJldHVybiB7IGtleTogJ0dkRmwnLCBkZXNjcmlwdG9yOiBzZXJpYWxpemVHcmFkaWVudENvbnRlbnQoY29udGVudCkgfTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbG9yKGNvbG9yOiBEZXNjcmlwdG9yQ29sb3IpOiBDb2xvciB7XHJcblx0aWYgKCdIICAgJyBpbiBjb2xvcikge1xyXG5cdFx0cmV0dXJuIHsgaDogcGFyc2VQZXJjZW50T3JBbmdsZShjb2xvclsnSCAgICddKSwgczogY29sb3IuU3RydCwgYjogY29sb3IuQnJnaCB9O1xyXG5cdH0gZWxzZSBpZiAoJ1JkICAnIGluIGNvbG9yKSB7XHJcblx0XHRyZXR1cm4geyByOiBjb2xvclsnUmQgICddLCBnOiBjb2xvclsnR3JuICddLCBiOiBjb2xvclsnQmwgICddIH07XHJcblx0fSBlbHNlIGlmICgnQ3luICcgaW4gY29sb3IpIHtcclxuXHRcdHJldHVybiB7IGM6IGNvbG9yWydDeW4gJ10sIG06IGNvbG9yLk1nbnQsIHk6IGNvbG9yWydZbHcgJ10sIGs6IGNvbG9yLkJsY2sgfTtcclxuXHR9IGVsc2UgaWYgKCdHcnkgJyBpbiBjb2xvcikge1xyXG5cdFx0cmV0dXJuIHsgazogY29sb3JbJ0dyeSAnXSB9O1xyXG5cdH0gZWxzZSBpZiAoJ0xtbmMnIGluIGNvbG9yKSB7XHJcblx0XHRyZXR1cm4geyBsOiBjb2xvci5MbW5jLCBhOiBjb2xvclsnQSAgICddLCBiOiBjb2xvclsnQiAgICddIH07XHJcblx0fSBlbHNlIHtcclxuXHRcdHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY29sb3IgZGVzY3JpcHRvcicpO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUNvbG9yKGNvbG9yOiBDb2xvciB8IHVuZGVmaW5lZCk6IERlc2NyaXB0b3JDb2xvciB7XHJcblx0aWYgKCFjb2xvcikge1xyXG5cdFx0cmV0dXJuIHsgJ1JkICAnOiAwLCAnR3JuICc6IDAsICdCbCAgJzogMCB9O1xyXG5cdH0gZWxzZSBpZiAoJ3InIGluIGNvbG9yKSB7XHJcblx0XHRyZXR1cm4geyAnUmQgICc6IGNvbG9yLnIgfHwgMCwgJ0dybiAnOiBjb2xvci5nIHx8IDAsICdCbCAgJzogY29sb3IuYiB8fCAwIH07XHJcblx0fSBlbHNlIGlmICgnaCcgaW4gY29sb3IpIHtcclxuXHRcdHJldHVybiB7ICdIICAgJzogdW5pdHNBbmdsZShjb2xvci5oICogMzYwKSwgU3RydDogY29sb3IucyB8fCAwLCBCcmdoOiBjb2xvci5iIHx8IDAgfTtcclxuXHR9IGVsc2UgaWYgKCdjJyBpbiBjb2xvcikge1xyXG5cdFx0cmV0dXJuIHsgJ0N5biAnOiBjb2xvci5jIHx8IDAsIE1nbnQ6IGNvbG9yLm0gfHwgMCwgJ1lsdyAnOiBjb2xvci55IHx8IDAsIEJsY2s6IGNvbG9yLmsgfHwgMCB9O1xyXG5cdH0gZWxzZSBpZiAoJ2wnIGluIGNvbG9yKSB7XHJcblx0XHRyZXR1cm4geyBMbW5jOiBjb2xvci5sIHx8IDAsICdBICAgJzogY29sb3IuYSB8fCAwLCAnQiAgICc6IGNvbG9yLmIgfHwgMCB9O1xyXG5cdH0gZWxzZSBpZiAoJ2snIGluIGNvbG9yKSB7XHJcblx0XHRyZXR1cm4geyAnR3J5ICc6IGNvbG9yLmsgfTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbG9yIHZhbHVlJyk7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBbmdsZSh4OiBEZXNjcmlwdG9yVW5pdHNWYWx1ZSkge1xyXG5cdGlmICh4ID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xyXG5cdGlmICh4LnVuaXRzICE9PSAnQW5nbGUnKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdW5pdHM6ICR7eC51bml0c31gKTtcclxuXHRyZXR1cm4geC52YWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGVyY2VudCh4OiBEZXNjcmlwdG9yVW5pdHNWYWx1ZSB8IHVuZGVmaW5lZCkge1xyXG5cdGlmICh4ID09PSB1bmRlZmluZWQpIHJldHVybiAxO1xyXG5cdGlmICh4LnVuaXRzICE9PSAnUGVyY2VudCcpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB1bml0czogJHt4LnVuaXRzfWApO1xyXG5cdHJldHVybiB4LnZhbHVlIC8gMTAwO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQZXJjZW50T3JBbmdsZSh4OiBEZXNjcmlwdG9yVW5pdHNWYWx1ZSB8IHVuZGVmaW5lZCkge1xyXG5cdGlmICh4ID09PSB1bmRlZmluZWQpIHJldHVybiAxO1xyXG5cdGlmICh4LnVuaXRzID09PSAnUGVyY2VudCcpIHJldHVybiB4LnZhbHVlIC8gMTAwO1xyXG5cdGlmICh4LnVuaXRzID09PSAnQW5nbGUnKSByZXR1cm4geC52YWx1ZSAvIDM2MDtcclxuXHR0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdW5pdHM6ICR7eC51bml0c31gKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVW5pdHMoeyB1bml0cywgdmFsdWUgfTogRGVzY3JpcHRvclVuaXRzVmFsdWUpOiBVbml0c1ZhbHVlIHtcclxuXHRpZiAoXHJcblx0XHR1bml0cyAhPT0gJ1BpeGVscycgJiYgdW5pdHMgIT09ICdNaWxsaW1ldGVycycgJiYgdW5pdHMgIT09ICdQb2ludHMnICYmIHVuaXRzICE9PSAnTm9uZScgJiZcclxuXHRcdHVuaXRzICE9PSAnUGljYXMnICYmIHVuaXRzICE9PSAnSW5jaGVzJyAmJiB1bml0cyAhPT0gJ0NlbnRpbWV0ZXJzJyAmJiB1bml0cyAhPT0gJ0RlbnNpdHknXHJcblx0KSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdW5pdHM6ICR7SlNPTi5zdHJpbmdpZnkoeyB1bml0cywgdmFsdWUgfSl9YCk7XHJcblx0fVxyXG5cdHJldHVybiB7IHZhbHVlLCB1bml0cyB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVbml0c09yTnVtYmVyKHZhbHVlOiBEZXNjcmlwdG9yVW5pdHNWYWx1ZSB8IG51bWJlciwgdW5pdHM6IFVuaXRzID0gJ1BpeGVscycpOiBVbml0c1ZhbHVlIHtcclxuXHRpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIHsgdmFsdWUsIHVuaXRzIH07XHJcblx0cmV0dXJuIHBhcnNlVW5pdHModmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVbml0c1RvTnVtYmVyKHsgdW5pdHMsIHZhbHVlIH06IERlc2NyaXB0b3JVbml0c1ZhbHVlLCBleHBlY3RlZFVuaXRzOiBzdHJpbmcpOiBudW1iZXIge1xyXG5cdGlmICh1bml0cyAhPT0gZXhwZWN0ZWRVbml0cykgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHVuaXRzOiAke0pTT04uc3RyaW5naWZ5KHsgdW5pdHMsIHZhbHVlIH0pfWApO1xyXG5cdHJldHVybiB2YWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVuaXRzQW5nbGUodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IERlc2NyaXB0b3JVbml0c1ZhbHVlIHtcclxuXHRyZXR1cm4geyB1bml0czogJ0FuZ2xlJywgdmFsdWU6IHZhbHVlIHx8IDAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVuaXRzUGVyY2VudCh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogRGVzY3JpcHRvclVuaXRzVmFsdWUge1xyXG5cdHJldHVybiB7IHVuaXRzOiAnUGVyY2VudCcsIHZhbHVlOiBNYXRoLnJvdW5kKCh2YWx1ZSB8fCAwKSAqIDEwMCkgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVuaXRzVmFsdWUoeDogVW5pdHNWYWx1ZSB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcpOiBEZXNjcmlwdG9yVW5pdHNWYWx1ZSB7XHJcblx0aWYgKHggPT0gbnVsbCkgcmV0dXJuIHsgdW5pdHM6ICdQaXhlbHMnLCB2YWx1ZTogMCB9O1xyXG5cclxuXHRpZiAodHlwZW9mIHggIT09ICdvYmplY3QnKVxyXG5cdFx0dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KHgpfSAoa2V5OiAke2tleX0pIChzaG91bGQgaGF2ZSB2YWx1ZSBhbmQgdW5pdHMpYCk7XHJcblxyXG5cdGNvbnN0IHsgdW5pdHMsIHZhbHVlIH0gPSB4O1xyXG5cclxuXHRpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJylcclxuXHRcdHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2YWx1ZSBpbiAke0pTT04uc3RyaW5naWZ5KHgpfSAoa2V5OiAke2tleX0pYCk7XHJcblxyXG5cdGlmIChcclxuXHRcdHVuaXRzICE9PSAnUGl4ZWxzJyAmJiB1bml0cyAhPT0gJ01pbGxpbWV0ZXJzJyAmJiB1bml0cyAhPT0gJ1BvaW50cycgJiYgdW5pdHMgIT09ICdOb25lJyAmJlxyXG5cdFx0dW5pdHMgIT09ICdQaWNhcycgJiYgdW5pdHMgIT09ICdJbmNoZXMnICYmIHVuaXRzICE9PSAnQ2VudGltZXRlcnMnICYmIHVuaXRzICE9PSAnRGVuc2l0eSdcclxuXHQpIHtcclxuXHRcdHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB1bml0cyBpbiAke0pTT04uc3RyaW5naWZ5KHgpfSAoa2V5OiAke2tleX0pYCk7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4geyB1bml0cywgdmFsdWUgfTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHRleHRHcmlkZGluZyA9IGNyZWF0ZUVudW08VGV4dEdyaWRkaW5nPigndGV4dEdyaWRkaW5nJywgJ25vbmUnLCB7XHJcblx0bm9uZTogJ05vbmUnLFxyXG5cdHJvdW5kOiAnUm5kICcsXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IE9ybnQgPSBjcmVhdGVFbnVtPE9yaWVudGF0aW9uPignT3JudCcsICdob3Jpem9udGFsJywge1xyXG5cdGhvcml6b250YWw6ICdIcnpuJyxcclxuXHR2ZXJ0aWNhbDogJ1ZydGMnLFxyXG59KTtcclxuXHJcbmV4cG9ydCBjb25zdCBBbm50ID0gY3JlYXRlRW51bTxBbnRpQWxpYXM+KCdBbm50JywgJ3NoYXJwJywge1xyXG5cdG5vbmU6ICdBbm5vJyxcclxuXHRzaGFycDogJ2FudGlBbGlhc1NoYXJwJyxcclxuXHRjcmlzcDogJ0FuQ3InLFxyXG5cdHN0cm9uZzogJ0FuU3QnLFxyXG5cdHNtb290aDogJ0FuU20nLFxyXG5cdHBsYXRmb3JtOiAnYW50aUFsaWFzUGxhdGZvcm1HcmF5JyxcclxuXHRwbGF0Zm9ybUxDRDogJ2FudGlBbGlhc1BsYXRmb3JtTENEJyxcclxufSk7XHJcblxyXG5leHBvcnQgY29uc3Qgd2FycFN0eWxlID0gY3JlYXRlRW51bTxXYXJwU3R5bGU+KCd3YXJwU3R5bGUnLCAnbm9uZScsIHtcclxuXHRub25lOiAnd2FycE5vbmUnLFxyXG5cdGFyYzogJ3dhcnBBcmMnLFxyXG5cdGFyY0xvd2VyOiAnd2FycEFyY0xvd2VyJyxcclxuXHRhcmNVcHBlcjogJ3dhcnBBcmNVcHBlcicsXHJcblx0YXJjaDogJ3dhcnBBcmNoJyxcclxuXHRidWxnZTogJ3dhcnBCdWxnZScsXHJcblx0c2hlbGxMb3dlcjogJ3dhcnBTaGVsbExvd2VyJyxcclxuXHRzaGVsbFVwcGVyOiAnd2FycFNoZWxsVXBwZXInLFxyXG5cdGZsYWc6ICd3YXJwRmxhZycsXHJcblx0d2F2ZTogJ3dhcnBXYXZlJyxcclxuXHRmaXNoOiAnd2FycEZpc2gnLFxyXG5cdHJpc2U6ICd3YXJwUmlzZScsXHJcblx0ZmlzaGV5ZTogJ3dhcnBGaXNoZXllJyxcclxuXHRpbmZsYXRlOiAnd2FycEluZmxhdGUnLFxyXG5cdHNxdWVlemU6ICd3YXJwU3F1ZWV6ZScsXHJcblx0dHdpc3Q6ICd3YXJwVHdpc3QnLFxyXG5cdGN1c3RvbTogJ3dhcnBDdXN0b20nLFxyXG59KTtcclxuXHJcbmV4cG9ydCBjb25zdCBCbG5NID0gY3JlYXRlRW51bTxCbGVuZE1vZGU+KCdCbG5NJywgJ25vcm1hbCcsIHtcclxuXHQnbm9ybWFsJzogJ05ybWwnLFxyXG5cdCdkaXNzb2x2ZSc6ICdEc2x2JyxcclxuXHQnZGFya2VuJzogJ0Rya24nLFxyXG5cdCdtdWx0aXBseSc6ICdNbHRwJyxcclxuXHQnY29sb3IgYnVybic6ICdDQnJuJyxcclxuXHQnbGluZWFyIGJ1cm4nOiAnbGluZWFyQnVybicsXHJcblx0J2RhcmtlciBjb2xvcic6ICdkYXJrZXJDb2xvcicsXHJcblx0J2xpZ2h0ZW4nOiAnTGdobicsXHJcblx0J3NjcmVlbic6ICdTY3JuJyxcclxuXHQnY29sb3IgZG9kZ2UnOiAnQ0RkZycsXHJcblx0J2xpbmVhciBkb2RnZSc6ICdsaW5lYXJEb2RnZScsXHJcblx0J2xpZ2h0ZXIgY29sb3InOiAnbGlnaHRlckNvbG9yJyxcclxuXHQnb3ZlcmxheSc6ICdPdnJsJyxcclxuXHQnc29mdCBsaWdodCc6ICdTZnRMJyxcclxuXHQnaGFyZCBsaWdodCc6ICdIcmRMJyxcclxuXHQndml2aWQgbGlnaHQnOiAndml2aWRMaWdodCcsXHJcblx0J2xpbmVhciBsaWdodCc6ICdsaW5lYXJMaWdodCcsXHJcblx0J3BpbiBsaWdodCc6ICdwaW5MaWdodCcsXHJcblx0J2hhcmQgbWl4JzogJ2hhcmRNaXgnLFxyXG5cdCdkaWZmZXJlbmNlJzogJ0Rmcm4nLFxyXG5cdCdleGNsdXNpb24nOiAnWGNsdScsXHJcblx0J3N1YnRyYWN0JzogJ2JsZW5kU3VidHJhY3Rpb24nLFxyXG5cdCdkaXZpZGUnOiAnYmxlbmREaXZpZGUnLFxyXG5cdCdodWUnOiAnSCAgICcsXHJcblx0J3NhdHVyYXRpb24nOiAnU3RydCcsXHJcblx0J2NvbG9yJzogJ0NsciAnLFxyXG5cdCdsdW1pbm9zaXR5JzogJ0xtbnMnLFxyXG5cdC8vIHVzZWQgaW4gQUJSXHJcblx0J2xpbmVhciBoZWlnaHQnOiAnbGluZWFySGVpZ2h0JyxcclxuXHQnaGVpZ2h0JzogJ0hnaHQnLFxyXG5cdCdzdWJ0cmFjdGlvbic6ICdTYnRyJywgLy8gMm5kIHZlcnNpb24gb2Ygc3VidHJhY3QgP1xyXG59KTtcclxuXHJcbmV4cG9ydCBjb25zdCBCRVNsID0gY3JlYXRlRW51bTxCZXZlbFN0eWxlPignQkVTbCcsICdpbm5lciBiZXZlbCcsIHtcclxuXHQnaW5uZXIgYmV2ZWwnOiAnSW5yQicsXHJcblx0J291dGVyIGJldmVsJzogJ090ckInLFxyXG5cdCdlbWJvc3MnOiAnRW1icycsXHJcblx0J3BpbGxvdyBlbWJvc3MnOiAnUGxFYicsXHJcblx0J3N0cm9rZSBlbWJvc3MnOiAnc3Ryb2tlRW1ib3NzJyxcclxufSk7XHJcblxyXG5leHBvcnQgY29uc3QgYnZsVCA9IGNyZWF0ZUVudW08QmV2ZWxUZWNobmlxdWU+KCdidmxUJywgJ3Ntb290aCcsIHtcclxuXHQnc21vb3RoJzogJ1NmQkwnLFxyXG5cdCdjaGlzZWwgaGFyZCc6ICdQckJMJyxcclxuXHQnY2hpc2VsIHNvZnQnOiAnU2xtdCcsXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IEJFU3MgPSBjcmVhdGVFbnVtPEJldmVsRGlyZWN0aW9uPignQkVTcycsICd1cCcsIHtcclxuXHR1cDogJ0luICAnLFxyXG5cdGRvd246ICdPdXQgJyxcclxufSk7XHJcblxyXG5leHBvcnQgY29uc3QgQkVURSA9IGNyZWF0ZUVudW08R2xvd1RlY2huaXF1ZT4oJ0JFVEUnLCAnc29mdGVyJywge1xyXG5cdHNvZnRlcjogJ1NmQkwnLFxyXG5cdHByZWNpc2U6ICdQckJMJyxcclxufSk7XHJcblxyXG5leHBvcnQgY29uc3QgSUdTciA9IGNyZWF0ZUVudW08R2xvd1NvdXJjZT4oJ0lHU3InLCAnZWRnZScsIHtcclxuXHRlZGdlOiAnU3JjRScsXHJcblx0Y2VudGVyOiAnU3JjQycsXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IEdyZFQgPSBjcmVhdGVFbnVtPEdyYWRpZW50U3R5bGU+KCdHcmRUJywgJ2xpbmVhcicsIHtcclxuXHRsaW5lYXI6ICdMbnIgJyxcclxuXHRyYWRpYWw6ICdSZGwgJyxcclxuXHRhbmdsZTogJ0FuZ2wnLFxyXG5cdHJlZmxlY3RlZDogJ1JmbGMnLFxyXG5cdGRpYW1vbmQ6ICdEbW5kJyxcclxufSk7XHJcblxyXG5leHBvcnQgY29uc3QgYW5pbUludGVycFN0eWxlRW51bSA9IGNyZWF0ZUVudW08VGltZWxpbmVLZXlJbnRlcnBvbGF0aW9uPignYW5pbUludGVycFN0eWxlJywgJ2xpbmVhcicsIHtcclxuXHRsaW5lYXI6ICdMbnIgJyxcclxuXHRob2xkOiAnaG9sZCcsXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IHN0ZFRyYWNrSUQgPSBjcmVhdGVFbnVtPFRpbWVsaW5lVHJhY2tUeXBlPignc3RkVHJhY2tJRCcsICdvcGFjaXR5Jywge1xyXG5cdG9wYWNpdHk6ICdvcGFjaXR5VHJhY2snLFxyXG5cdHN0eWxlOiAnc3R5bGVUcmFjaycsXHJcblx0c2hlZXRUcmFuc2Zvcm06ICdzaGVldFRyYW5zZm9ybVRyYWNrJyxcclxuXHRzaGVldFBvc2l0aW9uOiAnc2hlZXRQb3NpdGlvblRyYWNrJyxcclxuXHRnbG9iYWxMaWdodGluZzogJ2dsb2JhbExpZ2h0aW5nVHJhY2snLFxyXG59KTtcclxuXHJcbmV4cG9ydCBjb25zdCBncmFkaWVudEludGVycG9sYXRpb25NZXRob2RUeXBlID0gY3JlYXRlRW51bTxJbnRlcnBvbGF0aW9uTWV0aG9kPignZ3JhZGllbnRJbnRlcnBvbGF0aW9uTWV0aG9kVHlwZScsICdwZXJjZXB0dWFsJywge1xyXG5cdHBlcmNlcHR1YWw6ICdQZXJjJyxcclxuXHRsaW5lYXI6ICdMbnInLFxyXG5cdGNsYXNzaWM6ICdHY2xzJyxcclxufSk7XHJcblxyXG5leHBvcnQgY29uc3QgQ2xyUyA9IGNyZWF0ZUVudW08J3JnYicgfCAnaHNiJyB8ICdsYWInPignQ2xyUycsICdyZ2InLCB7XHJcblx0cmdiOiAnUkdCQycsXHJcblx0aHNiOiAnSFNCbCcsXHJcblx0bGFiOiAnTGJDbCcsXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IEZTdGwgPSBjcmVhdGVFbnVtPCdpbnNpZGUnIHwgJ2NlbnRlcicgfCAnb3V0c2lkZSc+KCdGU3RsJywgJ291dHNpZGUnLCB7XHJcblx0b3V0c2lkZTogJ091dEYnLFxyXG5cdGNlbnRlcjogJ0N0ckYnLFxyXG5cdGluc2lkZTogJ0luc0YnXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IEZyRmwgPSBjcmVhdGVFbnVtPCdjb2xvcicgfCAnZ3JhZGllbnQnIHwgJ3BhdHRlcm4nPignRnJGbCcsICdjb2xvcicsIHtcclxuXHRjb2xvcjogJ1NDbHInLFxyXG5cdGdyYWRpZW50OiAnR3JGbCcsXHJcblx0cGF0dGVybjogJ1B0cm4nLFxyXG59KTtcclxuXHJcbmV4cG9ydCBjb25zdCBzdHJva2VTdHlsZUxpbmVDYXBUeXBlID0gY3JlYXRlRW51bTxMaW5lQ2FwVHlwZT4oJ3N0cm9rZVN0eWxlTGluZUNhcFR5cGUnLCAnYnV0dCcsIHtcclxuXHRidXR0OiAnc3Ryb2tlU3R5bGVCdXR0Q2FwJyxcclxuXHRyb3VuZDogJ3N0cm9rZVN0eWxlUm91bmRDYXAnLFxyXG5cdHNxdWFyZTogJ3N0cm9rZVN0eWxlU3F1YXJlQ2FwJyxcclxufSk7XHJcblxyXG5leHBvcnQgY29uc3Qgc3Ryb2tlU3R5bGVMaW5lSm9pblR5cGUgPSBjcmVhdGVFbnVtPExpbmVKb2luVHlwZT4oJ3N0cm9rZVN0eWxlTGluZUpvaW5UeXBlJywgJ21pdGVyJywge1xyXG5cdG1pdGVyOiAnc3Ryb2tlU3R5bGVNaXRlckpvaW4nLFxyXG5cdHJvdW5kOiAnc3Ryb2tlU3R5bGVSb3VuZEpvaW4nLFxyXG5cdGJldmVsOiAnc3Ryb2tlU3R5bGVCZXZlbEpvaW4nLFxyXG59KTtcclxuXHJcbmV4cG9ydCBjb25zdCBzdHJva2VTdHlsZUxpbmVBbGlnbm1lbnQgPSBjcmVhdGVFbnVtPExpbmVBbGlnbm1lbnQ+KCdzdHJva2VTdHlsZUxpbmVBbGlnbm1lbnQnLCAnaW5zaWRlJywge1xyXG5cdGluc2lkZTogJ3N0cm9rZVN0eWxlQWxpZ25JbnNpZGUnLFxyXG5cdGNlbnRlcjogJ3N0cm9rZVN0eWxlQWxpZ25DZW50ZXInLFxyXG5cdG91dHNpZGU6ICdzdHJva2VTdHlsZUFsaWduT3V0c2lkZScsXHJcbn0pO1xyXG4iXSwic291cmNlUm9vdCI6IkM6XFxQcm9qZWN0c1xcZ2l0aHViXFxhZy1wc2RcXHNyYyJ9
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 { createEnum } from './helpers';
13
+ import { readSignature, readUnicodeString, readUint32, readUint8, readFloat64, readBytes, readAsciiString, readInt32, readFloat32, readInt32LE, readUnicodeStringWithLength } from './psdReader';
14
+ import { writeSignature, writeBytes, writeUint32, writeFloat64, writeUint8, writeUnicodeStringWithPadding, writeInt32, writeFloat32, writeUnicodeString } from './psdWriter';
15
+ function revMap(map) {
16
+ var result = {};
17
+ Object.keys(map).forEach(function (key) { return result[map[key]] = key; });
18
+ return result;
19
+ }
20
+ var unitsMap = {
21
+ '#Ang': 'Angle',
22
+ '#Rsl': 'Density',
23
+ '#Rlt': 'Distance',
24
+ '#Nne': 'None',
25
+ '#Prc': 'Percent',
26
+ '#Pxl': 'Pixels',
27
+ '#Mlm': 'Millimeters',
28
+ '#Pnt': 'Points',
29
+ 'RrPi': 'Picas',
30
+ 'RrIn': 'Inches',
31
+ 'RrCm': 'Centimeters',
32
+ };
33
+ var unitsMapRev = revMap(unitsMap);
34
+ var logErrors = false;
35
+ export function setLogErrors(value) {
36
+ logErrors = value;
37
+ }
38
+ function makeType(name, classID) {
39
+ return { name: name, classID: classID };
40
+ }
41
+ var nullType = makeType('', 'null');
42
+ var fieldToExtType = {
43
+ strokeStyleContent: makeType('', 'solidColorLayer'),
44
+ // printProofSetup: makeType('校样设置', 'proofSetup'), // TESTING
45
+ printProofSetup: makeType('Proof Setup', 'proofSetup'),
46
+ patternFill: makeType('', 'patternFill'),
47
+ Grad: makeType('Gradient', 'Grdn'),
48
+ ebbl: makeType('', 'ebbl'),
49
+ SoFi: makeType('', 'SoFi'),
50
+ GrFl: makeType('', 'GrFl'),
51
+ sdwC: makeType('', 'RGBC'),
52
+ hglC: makeType('', 'RGBC'),
53
+ 'Clr ': makeType('', 'RGBC'),
54
+ 'tintColor': makeType('', 'RGBC'),
55
+ Ofst: makeType('', 'Pnt '),
56
+ ChFX: makeType('', 'ChFX'),
57
+ MpgS: makeType('', 'ShpC'),
58
+ DrSh: makeType('', 'DrSh'),
59
+ IrSh: makeType('', 'IrSh'),
60
+ OrGl: makeType('', 'OrGl'),
61
+ IrGl: makeType('', 'IrGl'),
62
+ TrnS: makeType('', 'ShpC'),
63
+ Ptrn: makeType('', 'Ptrn'),
64
+ FrFX: makeType('', 'FrFX'),
65
+ phase: makeType('', 'Pnt '),
66
+ frameStep: nullType,
67
+ duration: nullType,
68
+ workInTime: nullType,
69
+ workOutTime: nullType,
70
+ audioClipGroupList: nullType,
71
+ bounds: makeType('', 'Rctn'),
72
+ customEnvelopeWarp: makeType('', 'customEnvelopeWarp'),
73
+ warp: makeType('', 'warp'),
74
+ 'Sz ': makeType('', 'Pnt '),
75
+ origin: makeType('', 'Pnt '),
76
+ autoExpandOffset: makeType('', 'Pnt '),
77
+ keyOriginShapeBBox: makeType('', 'unitRect'),
78
+ Vrsn: nullType,
79
+ psVersion: nullType,
80
+ docDefaultNewArtboardBackgroundColor: makeType('', 'RGBC'),
81
+ artboardRect: makeType('', 'classFloatRect'),
82
+ keyOriginRRectRadii: makeType('', 'radii'),
83
+ keyOriginBoxCorners: nullType,
84
+ rectangleCornerA: makeType('', 'Pnt '),
85
+ rectangleCornerB: makeType('', 'Pnt '),
86
+ rectangleCornerC: makeType('', 'Pnt '),
87
+ rectangleCornerD: makeType('', 'Pnt '),
88
+ compInfo: nullType,
89
+ Trnf: makeType('Transform', 'Trnf'),
90
+ quiltWarp: makeType('', 'quiltWarp'),
91
+ generatorSettings: nullType,
92
+ crema: nullType,
93
+ FrIn: nullType,
94
+ blendOptions: nullType,
95
+ FXRf: nullType,
96
+ Lefx: nullType,
97
+ time: nullType,
98
+ animKey: nullType,
99
+ timeScope: nullType,
100
+ inTime: nullType,
101
+ outTime: nullType,
102
+ sheetStyle: nullType,
103
+ translation: nullType,
104
+ Skew: nullType,
105
+ 'Lnk ': makeType('', 'ExternalFileLink'),
106
+ frameReader: makeType('', 'FrameReader'),
107
+ effectParams: makeType('', 'motionTrackEffectParams'),
108
+ };
109
+ var fieldToArrayExtType = {
110
+ 'Crv ': makeType('', 'CrPt'),
111
+ Clrs: makeType('', 'Clrt'),
112
+ Trns: makeType('', 'TrnS'),
113
+ keyDescriptorList: nullType,
114
+ solidFillMulti: makeType('', 'SoFi'),
115
+ gradientFillMulti: makeType('', 'GrFl'),
116
+ dropShadowMulti: makeType('', 'DrSh'),
117
+ innerShadowMulti: makeType('', 'IrSh'),
118
+ frameFXMulti: makeType('', 'FrFX'),
119
+ FrIn: nullType,
120
+ FSts: nullType,
121
+ LaSt: nullType,
122
+ sheetTimelineOptions: nullType,
123
+ trackList: makeType('', 'animationTrack'),
124
+ globalTrackList: makeType('', 'animationTrack'),
125
+ keyList: nullType,
126
+ audioClipGroupList: nullType,
127
+ audioClipList: nullType,
128
+ countObjectList: makeType('', 'countObject'),
129
+ countGroupList: makeType('', 'countGroup'),
130
+ slices: makeType('', 'slice'),
131
+ };
132
+ var typeToField = {
133
+ 'TEXT': [
134
+ 'Txt ', 'printerName', 'Nm ', 'Idnt', 'blackAndWhitePresetFileName', 'LUT3DFileName',
135
+ 'presetFileName', 'curvesPresetFileName', 'mixerPresetFileName', 'placed', 'description', 'reason',
136
+ 'artboardPresetName', 'json', 'clipID', 'relPath', 'fullPath', 'mediaDescriptor', 'Msge',
137
+ 'altTag', 'url', 'cellText',
138
+ ],
139
+ 'tdta': ['EngineData', 'LUT3DFileData'],
140
+ 'long': [
141
+ 'TextIndex', 'RndS', 'Mdpn', 'Smth', 'Lctn', 'strokeStyleVersion', 'LaID', 'Vrsn', 'Cnt ',
142
+ 'Brgh', 'Cntr', 'means', 'vibrance', 'Strt', 'bwPresetKind', 'presetKind', 'comp', 'compID', 'originalCompID',
143
+ 'curvesPresetKind', 'mixerPresetKind', 'uOrder', 'vOrder', 'PgNm', 'totalPages', 'Crop',
144
+ 'numerator', 'denominator', 'frameCount', 'Annt', 'keyOriginType', 'unitValueQuadVersion',
145
+ 'keyOriginIndex', 'major', 'minor', 'fix', 'docDefaultNewArtboardBackgroundType', 'artboardBackgroundType',
146
+ 'numModifyingFX', 'deformNumRows', 'deformNumCols', 'FrID', 'FrDl', 'FsID', 'LCnt', 'AFrm', 'AFSt',
147
+ 'numBefore', 'numAfter', 'Spcn', 'minOpacity', 'maxOpacity', 'BlnM', 'sheetID', 'gblA', 'globalAltitude',
148
+ 'descVersion', 'frameReaderType', 'LyrI', 'zoomOrigin', 'fontSize', 'Rds ', 'sliceID',
149
+ 'topOutset', 'leftOutset', 'bottomOutset', 'rightOutset',
150
+ ],
151
+ 'enum': [
152
+ 'textGridding', 'Ornt', 'warpStyle', 'warpRotate', 'Inte', 'Bltn', 'ClrS',
153
+ 'sdwM', 'hglM', 'bvlT', 'bvlS', 'bvlD', 'Md ', 'glwS', 'GrdF', 'GlwT',
154
+ 'strokeStyleLineCapType', 'strokeStyleLineJoinType', 'strokeStyleLineAlignment',
155
+ 'strokeStyleBlendMode', 'PntT', 'Styl', 'lookupType', 'LUTFormat', 'dataOrder',
156
+ 'tableOrder', 'enableCompCore', 'enableCompCoreGPU', 'compCoreSupport', 'compCoreGPUSupport', 'Engn',
157
+ 'enableCompCoreThreads', 'gs99', 'FrDs', 'trackID', 'animInterpStyle', 'horzAlign',
158
+ 'vertAlign', 'bgColorType',
159
+ ],
160
+ 'bool': [
161
+ 'PstS', 'printSixteenBit', 'masterFXSwitch', 'enab', 'uglg', 'antialiasGloss',
162
+ 'useShape', 'useTexture', 'uglg', 'antialiasGloss', 'useShape', 'Vsbl',
163
+ 'useTexture', 'Algn', 'Rvrs', 'Dthr', 'Invr', 'VctC', 'ShTr', 'layerConceals',
164
+ 'strokeEnabled', 'fillEnabled', 'strokeStyleScaleLock', 'strokeStyleStrokeAdjust',
165
+ 'hardProof', 'MpBl', 'paperWhite', 'useLegacy', 'Auto', 'Lab ', 'useTint', 'keyShapeInvalidated',
166
+ 'autoExpandEnabled', 'autoNestEnabled', 'autoPositionEnabled', 'shrinkwrapOnSaveEnabled',
167
+ 'present', 'showInDialog', 'overprint', 'sheetDisclosed', 'lightsDisclosed', 'meshesDisclosed',
168
+ 'materialsDisclosed', 'hasMotion', 'muted', 'Effc', 'selected', 'autoScope', 'fillCanvas',
169
+ 'cellTextIsHTML',
170
+ ],
171
+ 'doub': [
172
+ 'warpValue', 'warpPerspective', 'warpPerspectiveOther', 'Intr', 'Wdth', 'Hght',
173
+ 'strokeStyleMiterLimit', 'strokeStyleResolution', 'layerTime', 'keyOriginResolution',
174
+ 'xx', 'xy', 'yx', 'yy', 'tx', 'ty', 'FrGA', 'frameRate', 'audioLevel', 'rotation',
175
+ 'X ', 'Y ',
176
+ ],
177
+ 'UntF': [
178
+ 'Scl ', 'sdwO', 'hglO', 'lagl', 'Lald', 'srgR', 'blur', 'Sftn', 'Opct', 'Dstn', 'Angl',
179
+ 'Ckmt', 'Nose', 'Inpr', 'ShdN', 'strokeStyleLineWidth', 'strokeStyleLineDashOffset',
180
+ 'strokeStyleOpacity', 'H ', 'Top ', 'Left', 'Btom', 'Rght', 'Rslt',
181
+ 'topRight', 'topLeft', 'bottomLeft', 'bottomRight',
182
+ ],
183
+ 'VlLs': [
184
+ 'Crv ', 'Clrs', 'Mnm ', 'Mxm ', 'Trns', 'pathList', 'strokeStyleLineDashSet', 'FrLs', 'slices',
185
+ 'LaSt', 'Trnf', 'nonAffineTransform', 'keyDescriptorList', 'guideIndeces', 'gradientFillMulti',
186
+ 'solidFillMulti', 'frameFXMulti', 'innerShadowMulti', 'dropShadowMulti', 'FrIn', 'FSts', 'FsFr',
187
+ 'sheetTimelineOptions', 'audioClipList', 'trackList', 'globalTrackList', 'keyList', 'audioClipList',
188
+ 'warpValues',
189
+ ],
190
+ 'ObAr': ['meshPoints', 'quiltSliceX', 'quiltSliceY'],
191
+ 'obj ': ['null'],
192
+ };
193
+ var channels = [
194
+ 'Rd ', 'Grn ', 'Bl ', 'Yllw', 'Ylw ', 'Cyn ', 'Mgnt', 'Blck', 'Gry ', 'Lmnc', 'A ', 'B ',
195
+ ];
196
+ var fieldToArrayType = {
197
+ 'Mnm ': 'long',
198
+ 'Mxm ': 'long',
199
+ 'FrLs': 'long',
200
+ 'strokeStyleLineDashSet': 'UntF',
201
+ 'Trnf': 'doub',
202
+ 'nonAffineTransform': 'doub',
203
+ 'keyDescriptorList': 'Objc',
204
+ 'gradientFillMulti': 'Objc',
205
+ 'solidFillMulti': 'Objc',
206
+ 'frameFXMulti': 'Objc',
207
+ 'innerShadowMulti': 'Objc',
208
+ 'dropShadowMulti': 'Objc',
209
+ 'LaSt': 'Objc',
210
+ 'FrIn': 'Objc',
211
+ 'FSts': 'Objc',
212
+ 'FsFr': 'long',
213
+ 'blendOptions': 'Objc',
214
+ 'sheetTimelineOptions': 'Objc',
215
+ 'keyList': 'Objc',
216
+ 'warpValues': 'doub',
217
+ };
218
+ var fieldToType = {};
219
+ for (var _i = 0, _a = Object.keys(typeToField); _i < _a.length; _i++) {
220
+ var type = _a[_i];
221
+ for (var _b = 0, _c = typeToField[type]; _b < _c.length; _b++) {
222
+ var field = _c[_b];
223
+ fieldToType[field] = type;
224
+ }
225
+ }
226
+ for (var _d = 0, _e = Object.keys(fieldToExtType); _d < _e.length; _d++) {
227
+ var field = _e[_d];
228
+ if (!fieldToType[field])
229
+ fieldToType[field] = 'Objc';
230
+ }
231
+ for (var _f = 0, _g = Object.keys(fieldToArrayExtType); _f < _g.length; _f++) {
232
+ var field = _g[_f];
233
+ fieldToArrayType[field] = 'Objc';
234
+ }
235
+ function getTypeByKey(key, value, root, parent) {
236
+ if (key === 'null' && root === 'slices') {
237
+ return 'TEXT';
238
+ }
239
+ else if (key === 'groupID') {
240
+ return root === 'slices' ? 'long' : 'TEXT';
241
+ }
242
+ else if (key === 'Sz ') {
243
+ return ('Wdth' in value) ? 'Objc' : (('units' in value) ? 'UntF' : 'doub');
244
+ }
245
+ else if (key === 'Type') {
246
+ return typeof value === 'string' ? 'enum' : 'long';
247
+ }
248
+ else if (key === 'AntA') {
249
+ return typeof value === 'string' ? 'enum' : 'bool';
250
+ }
251
+ else if ((key === 'Hrzn' || key === 'Vrtc') && parent.Type === 'keyType.Pstn') {
252
+ return 'long';
253
+ }
254
+ else if (key === 'Hrzn' || key === 'Vrtc' || key === 'Top ' || key === 'Left' || key === 'Btom' || key === 'Rght') {
255
+ if (root === 'slices')
256
+ return 'long';
257
+ return typeof value === 'number' ? 'doub' : 'UntF';
258
+ }
259
+ else if (key === 'Vrsn') {
260
+ return typeof value === 'number' ? 'long' : 'Objc';
261
+ }
262
+ else if (key === 'Rd ' || key === 'Grn ' || key === 'Bl ') {
263
+ return root === 'artd' ? 'long' : 'doub';
264
+ }
265
+ else if (key === 'Trnf') {
266
+ return Array.isArray(value) ? 'VlLs' : 'Objc';
267
+ }
268
+ else {
269
+ return fieldToType[key];
270
+ }
271
+ }
272
+ export function readAsciiStringOrClassId(reader) {
273
+ var length = readInt32(reader);
274
+ return readAsciiString(reader, length || 4);
275
+ }
276
+ function writeAsciiStringOrClassId(writer, value) {
277
+ if (value.length === 4 && value !== 'warp' && value !== 'time' && value !== 'hold') {
278
+ // write classId
279
+ writeInt32(writer, 0);
280
+ writeSignature(writer, value);
281
+ }
282
+ else {
283
+ // write ascii string
284
+ writeInt32(writer, value.length);
285
+ for (var i = 0; i < value.length; i++) {
286
+ writeUint8(writer, value.charCodeAt(i));
287
+ }
288
+ }
289
+ }
290
+ export function readDescriptorStructure(reader) {
291
+ var object = {};
292
+ // object.__struct =
293
+ readClassStructure(reader);
294
+ var itemsCount = readUint32(reader);
295
+ // console.log('//', object.__struct);
296
+ for (var i = 0; i < itemsCount; i++) {
297
+ var key = readAsciiStringOrClassId(reader);
298
+ var type = readSignature(reader);
299
+ // console.log(`> '${key}' '${type}'`);
300
+ var data = readOSType(reader, type);
301
+ // if (!getTypeByKey(key, data)) console.log(`> '${key}' '${type}'`, data);
302
+ object[key] = data;
303
+ }
304
+ return object;
305
+ }
306
+ export function writeDescriptorStructure(writer, name, classId, value, root) {
307
+ if (logErrors && !classId)
308
+ console.log('Missing classId for: ', name, classId, value);
309
+ // write class structure
310
+ writeUnicodeStringWithPadding(writer, name);
311
+ writeAsciiStringOrClassId(writer, classId);
312
+ var keys = Object.keys(value);
313
+ writeUint32(writer, keys.length);
314
+ for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
315
+ var key = keys_1[_i];
316
+ var type = getTypeByKey(key, value[key], root, value);
317
+ var extType = fieldToExtType[key];
318
+ if (key === 'origin') {
319
+ type = root === 'slices' ? 'enum' : 'Objc';
320
+ }
321
+ else if (key === 'bounds' && root === 'slices') {
322
+ type = 'Objc';
323
+ extType = makeType('', 'Rct1');
324
+ }
325
+ else if (key === 'Scl ' && 'Hrzn' in value[key]) {
326
+ type = 'Objc';
327
+ extType = nullType;
328
+ }
329
+ else if (key === 'audioClipGroupList' && keys.length === 1) {
330
+ type = 'VlLs';
331
+ }
332
+ else if ((key === 'Strt' || key === 'Brgh') && 'H ' in value) {
333
+ type = 'doub';
334
+ }
335
+ else if (key === 'Strt') {
336
+ type = 'Objc';
337
+ extType = nullType;
338
+ }
339
+ else if (channels.indexOf(key) !== -1) {
340
+ type = (classId === 'RGBC' && root !== 'artd') ? 'doub' : 'long';
341
+ }
342
+ else if (key === 'profile') {
343
+ type = classId === 'printOutput' ? 'TEXT' : 'tdta';
344
+ }
345
+ else if (key === 'strokeStyleContent') {
346
+ if (value[key]['Clr ']) {
347
+ extType = makeType('', 'solidColorLayer');
348
+ }
349
+ else if (value[key].Grad) {
350
+ extType = makeType('', 'gradientLayer');
351
+ }
352
+ else if (value[key].Ptrn) {
353
+ extType = makeType('', 'patternLayer');
354
+ }
355
+ else {
356
+ logErrors && console.log('Invalid strokeStyleContent value', value[key]);
357
+ }
358
+ }
359
+ else if (key === 'bounds' && root === 'quiltWarp') {
360
+ extType = makeType('', 'classFloatRect');
361
+ }
362
+ if (extType && extType.classID === 'RGBC') {
363
+ if ('H ' in value[key])
364
+ extType = { classID: 'HSBC', name: '' };
365
+ // TODO: other color spaces
366
+ }
367
+ writeAsciiStringOrClassId(writer, key);
368
+ writeSignature(writer, type || 'long');
369
+ writeOSType(writer, type || 'long', value[key], key, extType, root);
370
+ if (logErrors && !type)
371
+ console.log("Missing descriptor field type for: '".concat(key, "' in"), value);
372
+ }
373
+ }
374
+ function readOSType(reader, type) {
375
+ switch (type) {
376
+ case 'obj ': // Reference
377
+ return readReferenceStructure(reader);
378
+ case 'Objc': // Descriptor
379
+ case 'GlbO': // GlobalObject same as Descriptor
380
+ return readDescriptorStructure(reader);
381
+ case 'VlLs': { // List
382
+ var length_1 = readInt32(reader);
383
+ var items = [];
384
+ for (var i = 0; i < length_1; i++) {
385
+ var type_1 = readSignature(reader);
386
+ // console.log(' >', type);
387
+ items.push(readOSType(reader, type_1));
388
+ }
389
+ return items;
390
+ }
391
+ case 'doub': // Double
392
+ return readFloat64(reader);
393
+ case 'UntF': { // Unit double
394
+ var units = readSignature(reader);
395
+ var value = readFloat64(reader);
396
+ if (!unitsMap[units])
397
+ throw new Error("Invalid units: ".concat(units));
398
+ return { units: unitsMap[units], value: value };
399
+ }
400
+ case 'UnFl': { // Unit float
401
+ var units = readSignature(reader);
402
+ var value = readFloat32(reader);
403
+ if (!unitsMap[units])
404
+ throw new Error("Invalid units: ".concat(units));
405
+ return { units: unitsMap[units], value: value };
406
+ }
407
+ case 'TEXT': // String
408
+ return readUnicodeString(reader);
409
+ case 'enum': { // Enumerated
410
+ var type_2 = readAsciiStringOrClassId(reader);
411
+ var value = readAsciiStringOrClassId(reader);
412
+ return "".concat(type_2, ".").concat(value);
413
+ }
414
+ case 'long': // Integer
415
+ return readInt32(reader);
416
+ case 'comp': { // Large Integer
417
+ var low = readUint32(reader);
418
+ var high = readUint32(reader);
419
+ return { low: low, high: high };
420
+ }
421
+ case 'bool': // Boolean
422
+ return !!readUint8(reader);
423
+ case 'type': // Class
424
+ case 'GlbC': // Class
425
+ return readClassStructure(reader);
426
+ case 'alis': { // Alias
427
+ var length_2 = readInt32(reader);
428
+ return readAsciiString(reader, length_2);
429
+ }
430
+ case 'tdta': { // Raw Data
431
+ var length_3 = readInt32(reader);
432
+ return readBytes(reader, length_3);
433
+ }
434
+ case 'ObAr': { // Object array
435
+ readInt32(reader); // version: 16
436
+ readUnicodeString(reader); // name: ''
437
+ readAsciiStringOrClassId(reader); // 'rationalPoint'
438
+ var length_4 = readInt32(reader);
439
+ var items = [];
440
+ for (var i = 0; i < length_4; i++) {
441
+ var type1 = readAsciiStringOrClassId(reader); // type Hrzn | Vrtc
442
+ readSignature(reader); // UnFl
443
+ readSignature(reader); // units ? '#Pxl'
444
+ var valuesCount = readInt32(reader);
445
+ var values = [];
446
+ for (var j = 0; j < valuesCount; j++) {
447
+ values.push(readFloat64(reader));
448
+ }
449
+ items.push({ type: type1, values: values });
450
+ }
451
+ return items;
452
+ }
453
+ case 'Pth ': { // File path
454
+ /*const length =*/ readInt32(reader);
455
+ var sig = readSignature(reader);
456
+ /*const pathSize =*/ readInt32LE(reader);
457
+ var charsCount = readInt32LE(reader);
458
+ var path = readUnicodeStringWithLength(reader, charsCount);
459
+ return { sig: sig, path: path };
460
+ }
461
+ default:
462
+ throw new Error("Invalid TySh descriptor OSType: ".concat(type, " at ").concat(reader.offset.toString(16)));
463
+ }
464
+ }
465
+ var ObArTypes = {
466
+ meshPoints: 'rationalPoint',
467
+ quiltSliceX: 'UntF',
468
+ quiltSliceY: 'UntF',
469
+ };
470
+ function writeOSType(writer, type, value, key, extType, root) {
471
+ switch (type) {
472
+ case 'obj ': // Reference
473
+ writeReferenceStructure(writer, key, value);
474
+ break;
475
+ case 'Objc': // Descriptor
476
+ case 'GlbO': // GlobalObject same as Descriptor
477
+ if (!extType)
478
+ throw new Error("Missing ext type for: '".concat(key, "' (").concat(JSON.stringify(value), ")"));
479
+ writeDescriptorStructure(writer, extType.name, extType.classID, value, root);
480
+ break;
481
+ case 'VlLs': // List
482
+ writeInt32(writer, value.length);
483
+ for (var i = 0; i < value.length; i++) {
484
+ var type_3 = fieldToArrayType[key];
485
+ writeSignature(writer, type_3 || 'long');
486
+ writeOSType(writer, type_3 || 'long', value[i], '', fieldToArrayExtType[key], root);
487
+ if (logErrors && !type_3)
488
+ console.log("Missing descriptor array type for: '".concat(key, "' in"), value);
489
+ }
490
+ break;
491
+ case 'doub': // Double
492
+ writeFloat64(writer, value);
493
+ break;
494
+ case 'UntF': // Unit double
495
+ if (!unitsMapRev[value.units])
496
+ throw new Error("Invalid units: ".concat(value.units, " in ").concat(key));
497
+ writeSignature(writer, unitsMapRev[value.units]);
498
+ writeFloat64(writer, value.value);
499
+ break;
500
+ case 'UnFl': // Unit float
501
+ if (!unitsMapRev[value.units])
502
+ throw new Error("Invalid units: ".concat(value.units, " in ").concat(key));
503
+ writeSignature(writer, unitsMapRev[value.units]);
504
+ writeFloat32(writer, value.value);
505
+ break;
506
+ case 'TEXT': // String
507
+ writeUnicodeStringWithPadding(writer, value);
508
+ break;
509
+ case 'enum': { // Enumerated
510
+ var _a = value.split('.'), _type = _a[0], val = _a[1];
511
+ writeAsciiStringOrClassId(writer, _type);
512
+ writeAsciiStringOrClassId(writer, val);
513
+ break;
514
+ }
515
+ case 'long': // Integer
516
+ writeInt32(writer, value);
517
+ break;
518
+ // case 'comp': // Large Integer
519
+ // writeLargeInteger(reader);
520
+ case 'bool': // Boolean
521
+ writeUint8(writer, value ? 1 : 0);
522
+ break;
523
+ // case 'type': // Class
524
+ // case 'GlbC': // Class
525
+ // writeClassStructure(reader);
526
+ // case 'alis': // Alias
527
+ // writeAliasStructure(reader);
528
+ case 'tdta': // Raw Data
529
+ writeInt32(writer, value.byteLength);
530
+ writeBytes(writer, value);
531
+ break;
532
+ case 'ObAr': { // Object array
533
+ writeInt32(writer, 16); // version
534
+ writeUnicodeStringWithPadding(writer, ''); // name
535
+ var type_4 = ObArTypes[key];
536
+ if (!type_4)
537
+ throw new Error("Not implemented ObArType for: ".concat(key));
538
+ writeAsciiStringOrClassId(writer, type_4);
539
+ writeInt32(writer, value.length);
540
+ for (var i = 0; i < value.length; i++) {
541
+ writeAsciiStringOrClassId(writer, value[i].type); // Hrzn | Vrtc
542
+ writeSignature(writer, 'UnFl');
543
+ writeSignature(writer, '#Pxl');
544
+ writeInt32(writer, value[i].values.length);
545
+ for (var j = 0; j < value[i].values.length; j++) {
546
+ writeFloat64(writer, value[i].values[j]);
547
+ }
548
+ }
549
+ break;
550
+ }
551
+ // case 'Pth ': // File path
552
+ // writeFilePath(reader);
553
+ default:
554
+ throw new Error("Not implemented descriptor OSType: ".concat(type));
555
+ }
556
+ }
557
+ function readReferenceStructure(reader) {
558
+ var itemsCount = readInt32(reader);
559
+ var items = [];
560
+ for (var i = 0; i < itemsCount; i++) {
561
+ var type = readSignature(reader);
562
+ switch (type) {
563
+ case 'prop': { // Property
564
+ readClassStructure(reader);
565
+ var keyID = readAsciiStringOrClassId(reader);
566
+ items.push(keyID);
567
+ break;
568
+ }
569
+ case 'Clss': // Class
570
+ items.push(readClassStructure(reader));
571
+ break;
572
+ case 'Enmr': { // Enumerated Reference
573
+ readClassStructure(reader);
574
+ var typeID = readAsciiStringOrClassId(reader);
575
+ var value = readAsciiStringOrClassId(reader);
576
+ items.push("".concat(typeID, ".").concat(value));
577
+ break;
578
+ }
579
+ case 'rele': { // Offset
580
+ // const { name, classID } =
581
+ readClassStructure(reader);
582
+ items.push(readUint32(reader));
583
+ break;
584
+ }
585
+ case 'Idnt': // Identifier
586
+ items.push(readInt32(reader));
587
+ break;
588
+ case 'indx': // Index
589
+ items.push(readInt32(reader));
590
+ break;
591
+ case 'name': { // Name
592
+ readClassStructure(reader);
593
+ items.push(readUnicodeString(reader));
594
+ break;
595
+ }
596
+ default:
597
+ throw new Error("Invalid descriptor reference type: ".concat(type));
598
+ }
599
+ }
600
+ return items;
601
+ }
602
+ function writeReferenceStructure(writer, _key, items) {
603
+ writeInt32(writer, items.length);
604
+ for (var i = 0; i < items.length; i++) {
605
+ var value = items[i];
606
+ var type = 'unknown';
607
+ if (typeof value === 'string') {
608
+ if (/^[a-z]+\.[a-z]+$/i.test(value)) {
609
+ type = 'Enmr';
610
+ }
611
+ else {
612
+ type = 'name';
613
+ }
614
+ }
615
+ writeSignature(writer, type);
616
+ switch (type) {
617
+ // case 'prop': // Property
618
+ // case 'Clss': // Class
619
+ case 'Enmr': { // Enumerated Reference
620
+ var _a = value.split('.'), typeID = _a[0], enumValue = _a[1];
621
+ writeClassStructure(writer, '\0', typeID);
622
+ writeAsciiStringOrClassId(writer, typeID);
623
+ writeAsciiStringOrClassId(writer, enumValue);
624
+ break;
625
+ }
626
+ // case 'rele': // Offset
627
+ // case 'Idnt': // Identifier
628
+ // case 'indx': // Index
629
+ case 'name': { // Name
630
+ writeClassStructure(writer, '\0', 'Lyr ');
631
+ writeUnicodeString(writer, value + '\0');
632
+ break;
633
+ }
634
+ default:
635
+ throw new Error("Invalid descriptor reference type: ".concat(type));
636
+ }
637
+ }
638
+ return items;
639
+ }
640
+ function readClassStructure(reader) {
641
+ var name = readUnicodeString(reader);
642
+ var classID = readAsciiStringOrClassId(reader);
643
+ // console.log({ name, classID });
644
+ return { name: name, classID: classID };
645
+ }
646
+ function writeClassStructure(writer, name, classID) {
647
+ writeUnicodeString(writer, name);
648
+ writeAsciiStringOrClassId(writer, classID);
649
+ }
650
+ export function readVersionAndDescriptor(reader) {
651
+ var version = readUint32(reader);
652
+ if (version !== 16)
653
+ throw new Error("Invalid descriptor version: ".concat(version));
654
+ var desc = readDescriptorStructure(reader);
655
+ // console.log(require('util').inspect(desc, false, 99, true));
656
+ return desc;
657
+ }
658
+ export function writeVersionAndDescriptor(writer, name, classID, descriptor, root) {
659
+ if (root === void 0) { root = ''; }
660
+ writeUint32(writer, 16); // version
661
+ writeDescriptorStructure(writer, name, classID, descriptor, root);
662
+ }
663
+ export function horzVrtcToXY(hv) {
664
+ return { x: hv.Hrzn, y: hv.Vrtc };
665
+ }
666
+ export function xyToHorzVrtc(xy) {
667
+ return { Hrzn: xy.x, Vrtc: xy.y };
668
+ }
669
+ function parseFxObject(fx) {
670
+ var stroke = {
671
+ enabled: !!fx.enab,
672
+ position: FStl.decode(fx.Styl),
673
+ fillType: FrFl.decode(fx.PntT),
674
+ blendMode: BlnM.decode(fx['Md ']),
675
+ opacity: parsePercent(fx.Opct),
676
+ size: parseUnits(fx['Sz ']),
677
+ };
678
+ if (fx.present !== undefined)
679
+ stroke.present = fx.present;
680
+ if (fx.showInDialog !== undefined)
681
+ stroke.showInDialog = fx.showInDialog;
682
+ if (fx.overprint !== undefined)
683
+ stroke.overprint = fx.overprint;
684
+ if (fx['Clr '])
685
+ stroke.color = parseColor(fx['Clr ']);
686
+ if (fx.Grad)
687
+ stroke.gradient = parseGradientContent(fx);
688
+ if (fx.Ptrn)
689
+ stroke.pattern = parsePatternContent(fx);
690
+ return stroke;
691
+ }
692
+ function serializeFxObject(stroke) {
693
+ var FrFX = {};
694
+ FrFX.enab = !!stroke.enabled;
695
+ if (stroke.present !== undefined)
696
+ FrFX.present = !!stroke.present;
697
+ if (stroke.showInDialog !== undefined)
698
+ FrFX.showInDialog = !!stroke.showInDialog;
699
+ FrFX.Styl = FStl.encode(stroke.position);
700
+ FrFX.PntT = FrFl.encode(stroke.fillType);
701
+ FrFX['Md '] = BlnM.encode(stroke.blendMode);
702
+ FrFX.Opct = unitsPercent(stroke.opacity);
703
+ FrFX['Sz '] = unitsValue(stroke.size, 'size');
704
+ if (stroke.color)
705
+ FrFX['Clr '] = serializeColor(stroke.color);
706
+ if (stroke.gradient)
707
+ FrFX = __assign(__assign({}, FrFX), serializeGradientContent(stroke.gradient));
708
+ if (stroke.pattern)
709
+ FrFX = __assign(__assign({}, FrFX), serializePatternContent(stroke.pattern));
710
+ if (stroke.overprint !== undefined)
711
+ FrFX.overprint = !!stroke.overprint;
712
+ return FrFX;
713
+ }
714
+ export function serializeEffects(e, log, multi) {
715
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
716
+ var info = multi ? {
717
+ 'Scl ': unitsPercent((_a = e.scale) !== null && _a !== void 0 ? _a : 1),
718
+ masterFXSwitch: !e.disabled,
719
+ } : {
720
+ masterFXSwitch: !e.disabled,
721
+ 'Scl ': unitsPercent((_b = e.scale) !== null && _b !== void 0 ? _b : 1),
722
+ };
723
+ var arrayKeys = ['dropShadow', 'innerShadow', 'solidFill', 'gradientOverlay', 'stroke'];
724
+ for (var _i = 0, arrayKeys_1 = arrayKeys; _i < arrayKeys_1.length; _i++) {
725
+ var key = arrayKeys_1[_i];
726
+ if (e[key] && !Array.isArray(e[key]))
727
+ throw new Error("".concat(key, " should be an array"));
728
+ }
729
+ if (((_c = e.dropShadow) === null || _c === void 0 ? void 0 : _c[0]) && !multi)
730
+ info.DrSh = serializeEffectObject(e.dropShadow[0], 'dropShadow', log);
731
+ if (((_d = e.dropShadow) === null || _d === void 0 ? void 0 : _d[0]) && multi)
732
+ info.dropShadowMulti = e.dropShadow.map(function (i) { return serializeEffectObject(i, 'dropShadow', log); });
733
+ if (((_e = e.innerShadow) === null || _e === void 0 ? void 0 : _e[0]) && !multi)
734
+ info.IrSh = serializeEffectObject(e.innerShadow[0], 'innerShadow', log);
735
+ if (((_f = e.innerShadow) === null || _f === void 0 ? void 0 : _f[0]) && multi)
736
+ info.innerShadowMulti = e.innerShadow.map(function (i) { return serializeEffectObject(i, 'innerShadow', log); });
737
+ if (e.outerGlow)
738
+ info.OrGl = serializeEffectObject(e.outerGlow, 'outerGlow', log);
739
+ if (((_g = e.solidFill) === null || _g === void 0 ? void 0 : _g[0]) && multi)
740
+ info.solidFillMulti = e.solidFill.map(function (i) { return serializeEffectObject(i, 'solidFill', log); });
741
+ if (((_h = e.gradientOverlay) === null || _h === void 0 ? void 0 : _h[0]) && multi)
742
+ info.gradientFillMulti = e.gradientOverlay.map(function (i) { return serializeEffectObject(i, 'gradientOverlay', log); });
743
+ if (((_j = e.stroke) === null || _j === void 0 ? void 0 : _j[0]) && multi)
744
+ info.frameFXMulti = e.stroke.map(function (i) { return serializeFxObject(i); });
745
+ if (e.innerGlow)
746
+ info.IrGl = serializeEffectObject(e.innerGlow, 'innerGlow', log);
747
+ if (e.bevel)
748
+ info.ebbl = serializeEffectObject(e.bevel, 'bevel', log);
749
+ if (((_k = e.solidFill) === null || _k === void 0 ? void 0 : _k[0]) && !multi)
750
+ info.SoFi = serializeEffectObject(e.solidFill[0], 'solidFill', log);
751
+ if (e.patternOverlay)
752
+ info.patternFill = serializeEffectObject(e.patternOverlay, 'patternOverlay', log);
753
+ if (((_l = e.gradientOverlay) === null || _l === void 0 ? void 0 : _l[0]) && !multi)
754
+ info.GrFl = serializeEffectObject(e.gradientOverlay[0], 'gradientOverlay', log);
755
+ if (e.satin)
756
+ info.ChFX = serializeEffectObject(e.satin, 'satin', log);
757
+ if (((_m = e.stroke) === null || _m === void 0 ? void 0 : _m[0]) && !multi)
758
+ info.FrFX = serializeFxObject((_o = e.stroke) === null || _o === void 0 ? void 0 : _o[0]);
759
+ if (multi) {
760
+ info.numModifyingFX = 0;
761
+ for (var _p = 0, _q = Object.keys(e); _p < _q.length; _p++) {
762
+ var key = _q[_p];
763
+ var value = e[key];
764
+ if (Array.isArray(value)) {
765
+ for (var _r = 0, value_1 = value; _r < value_1.length; _r++) {
766
+ var effect = value_1[_r];
767
+ if (effect.enabled)
768
+ info.numModifyingFX++;
769
+ }
770
+ }
771
+ }
772
+ }
773
+ return info;
774
+ }
775
+ export function parseEffects(info, log) {
776
+ var effects = {};
777
+ if (!info.masterFXSwitch)
778
+ effects.disabled = true;
779
+ if (info['Scl '])
780
+ effects.scale = parsePercent(info['Scl ']);
781
+ if (info.DrSh)
782
+ effects.dropShadow = [parseEffectObject(info.DrSh, log)];
783
+ if (info.dropShadowMulti)
784
+ effects.dropShadow = info.dropShadowMulti.map(function (i) { return parseEffectObject(i, log); });
785
+ if (info.IrSh)
786
+ effects.innerShadow = [parseEffectObject(info.IrSh, log)];
787
+ if (info.innerShadowMulti)
788
+ effects.innerShadow = info.innerShadowMulti.map(function (i) { return parseEffectObject(i, log); });
789
+ if (info.OrGl)
790
+ effects.outerGlow = parseEffectObject(info.OrGl, log);
791
+ if (info.IrGl)
792
+ effects.innerGlow = parseEffectObject(info.IrGl, log);
793
+ if (info.ebbl)
794
+ effects.bevel = parseEffectObject(info.ebbl, log);
795
+ if (info.SoFi)
796
+ effects.solidFill = [parseEffectObject(info.SoFi, log)];
797
+ if (info.solidFillMulti)
798
+ effects.solidFill = info.solidFillMulti.map(function (i) { return parseEffectObject(i, log); });
799
+ if (info.patternFill)
800
+ effects.patternOverlay = parseEffectObject(info.patternFill, log);
801
+ if (info.GrFl)
802
+ effects.gradientOverlay = [parseEffectObject(info.GrFl, log)];
803
+ if (info.gradientFillMulti)
804
+ effects.gradientOverlay = info.gradientFillMulti.map(function (i) { return parseEffectObject(i, log); });
805
+ if (info.ChFX)
806
+ effects.satin = parseEffectObject(info.ChFX, log);
807
+ if (info.FrFX)
808
+ effects.stroke = [parseFxObject(info.FrFX)];
809
+ if (info.frameFXMulti)
810
+ effects.stroke = info.frameFXMulti.map(function (i) { return parseFxObject(i); });
811
+ return effects;
812
+ }
813
+ function parseKeyList(keyList, logMissingFeatures) {
814
+ var keys = [];
815
+ for (var j = 0; j < keyList.length; j++) {
816
+ var key = keyList[j];
817
+ var time = key.time, selected = key.selected, animKey = key.animKey;
818
+ var interpolation = animInterpStyleEnum.decode(key.animInterpStyle);
819
+ switch (animKey.Type) {
820
+ case 'keyType.Opct':
821
+ keys.push({ interpolation: interpolation, time: time, selected: selected, type: 'opacity', value: parsePercent(animKey.Opct) });
822
+ break;
823
+ case 'keyType.Pstn':
824
+ keys.push({ interpolation: interpolation, time: time, selected: selected, type: 'position', x: animKey.Hrzn, y: animKey.Vrtc });
825
+ break;
826
+ case 'keyType.Trnf':
827
+ keys.push({
828
+ interpolation: interpolation,
829
+ time: time,
830
+ selected: selected,
831
+ type: 'transform',
832
+ scale: horzVrtcToXY(animKey['Scl ']), skew: horzVrtcToXY(animKey.Skew), rotation: animKey.rotation, translation: horzVrtcToXY(animKey.translation)
833
+ });
834
+ break;
835
+ case 'keyType.sheetStyle': {
836
+ var key_1 = { interpolation: interpolation, time: time, selected: selected, type: 'style' };
837
+ if (animKey.sheetStyle.Lefx)
838
+ key_1.style = parseEffects(animKey.sheetStyle.Lefx, logMissingFeatures);
839
+ keys.push(key_1);
840
+ break;
841
+ }
842
+ case 'keyType.globalLighting': {
843
+ keys.push({
844
+ interpolation: interpolation,
845
+ time: time,
846
+ selected: selected,
847
+ type: 'globalLighting',
848
+ globalAngle: animKey.gblA, globalAltitude: animKey.globalAltitude
849
+ });
850
+ break;
851
+ }
852
+ default: throw new Error("Unsupported keyType value");
853
+ }
854
+ }
855
+ return keys;
856
+ }
857
+ function serializeKeyList(keys) {
858
+ var keyList = [];
859
+ for (var j = 0; j < keys.length; j++) {
860
+ var key = keys[j];
861
+ var time = key.time, _a = key.selected, selected = _a === void 0 ? false : _a, interpolation = key.interpolation;
862
+ var animInterpStyle = animInterpStyleEnum.encode(interpolation);
863
+ var animKey = void 0;
864
+ switch (key.type) {
865
+ case 'opacity':
866
+ animKey = { Type: 'keyType.Opct', Opct: unitsPercent(key.value) };
867
+ break;
868
+ case 'position':
869
+ animKey = { Type: 'keyType.Pstn', Hrzn: key.x, Vrtc: key.y };
870
+ break;
871
+ case 'transform':
872
+ animKey = { Type: 'keyType.Trnf', 'Scl ': xyToHorzVrtc(key.scale), Skew: xyToHorzVrtc(key.skew), rotation: key.rotation, translation: xyToHorzVrtc(key.translation) };
873
+ break;
874
+ case 'style':
875
+ animKey = { Type: 'keyType.sheetStyle', sheetStyle: { Vrsn: 1, blendOptions: {} } };
876
+ if (key.style)
877
+ animKey.sheetStyle = { Vrsn: 1, Lefx: serializeEffects(key.style, false, false), blendOptions: {} };
878
+ break;
879
+ case 'globalLighting': {
880
+ animKey = { Type: 'keyType.globalLighting', gblA: key.globalAngle, globalAltitude: key.globalAltitude };
881
+ break;
882
+ }
883
+ default: throw new Error("Unsupported keyType value");
884
+ }
885
+ keyList.push({ Vrsn: 1, animInterpStyle: animInterpStyle, time: time, animKey: animKey, selected: selected });
886
+ }
887
+ return keyList;
888
+ }
889
+ export function parseTrackList(trackList, logMissingFeatures) {
890
+ var tracks = [];
891
+ for (var i = 0; i < trackList.length; i++) {
892
+ var tr = trackList[i];
893
+ var track = {
894
+ type: stdTrackID.decode(tr.trackID),
895
+ enabled: tr.enab,
896
+ keys: parseKeyList(tr.keyList, logMissingFeatures),
897
+ };
898
+ if (tr.effectParams) {
899
+ track.effectParams = {
900
+ fillCanvas: tr.effectParams.fillCanvas,
901
+ zoomOrigin: tr.effectParams.zoomOrigin,
902
+ keys: parseKeyList(tr.effectParams.keyList, logMissingFeatures),
903
+ };
904
+ }
905
+ tracks.push(track);
906
+ }
907
+ return tracks;
908
+ }
909
+ export function serializeTrackList(tracks) {
910
+ var trackList = [];
911
+ for (var i = 0; i < tracks.length; i++) {
912
+ var t = tracks[i];
913
+ trackList.push(__assign(__assign({ trackID: stdTrackID.encode(t.type), Vrsn: 1, enab: !!t.enabled, Effc: !!t.effectParams }, (t.effectParams ? {
914
+ effectParams: {
915
+ keyList: serializeKeyList(t.keys),
916
+ fillCanvas: t.effectParams.fillCanvas,
917
+ zoomOrigin: t.effectParams.zoomOrigin,
918
+ }
919
+ } : {})), { keyList: serializeKeyList(t.keys) }));
920
+ }
921
+ return trackList;
922
+ }
923
+ function parseEffectObject(obj, reportErrors) {
924
+ var result = {};
925
+ for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {
926
+ var key = _a[_i];
927
+ var val = obj[key];
928
+ switch (key) {
929
+ case 'enab':
930
+ result.enabled = !!val;
931
+ break;
932
+ case 'uglg':
933
+ result.useGlobalLight = !!val;
934
+ break;
935
+ case 'AntA':
936
+ result.antialiased = !!val;
937
+ break;
938
+ case 'Algn':
939
+ result.align = !!val;
940
+ break;
941
+ case 'Dthr':
942
+ result.dither = !!val;
943
+ break;
944
+ case 'Invr':
945
+ result.invert = !!val;
946
+ break;
947
+ case 'Rvrs':
948
+ result.reverse = !!val;
949
+ break;
950
+ case 'Clr ':
951
+ result.color = parseColor(val);
952
+ break;
953
+ case 'hglC':
954
+ result.highlightColor = parseColor(val);
955
+ break;
956
+ case 'sdwC':
957
+ result.shadowColor = parseColor(val);
958
+ break;
959
+ case 'Styl':
960
+ result.position = FStl.decode(val);
961
+ break;
962
+ case 'Md ':
963
+ result.blendMode = BlnM.decode(val);
964
+ break;
965
+ case 'hglM':
966
+ result.highlightBlendMode = BlnM.decode(val);
967
+ break;
968
+ case 'sdwM':
969
+ result.shadowBlendMode = BlnM.decode(val);
970
+ break;
971
+ case 'bvlS':
972
+ result.style = BESl.decode(val);
973
+ break;
974
+ case 'bvlD':
975
+ result.direction = BESs.decode(val);
976
+ break;
977
+ case 'bvlT':
978
+ result.technique = bvlT.decode(val);
979
+ break;
980
+ case 'GlwT':
981
+ result.technique = BETE.decode(val);
982
+ break;
983
+ case 'glwS':
984
+ result.source = IGSr.decode(val);
985
+ break;
986
+ case 'Type':
987
+ result.type = GrdT.decode(val);
988
+ break;
989
+ case 'gs99':
990
+ result.interpolationMethod = gradientInterpolationMethodType.decode(val);
991
+ break;
992
+ case 'Opct':
993
+ result.opacity = parsePercent(val);
994
+ break;
995
+ case 'hglO':
996
+ result.highlightOpacity = parsePercent(val);
997
+ break;
998
+ case 'sdwO':
999
+ result.shadowOpacity = parsePercent(val);
1000
+ break;
1001
+ case 'lagl':
1002
+ result.angle = parseAngle(val);
1003
+ break;
1004
+ case 'Angl':
1005
+ result.angle = parseAngle(val);
1006
+ break;
1007
+ case 'Lald':
1008
+ result.altitude = parseAngle(val);
1009
+ break;
1010
+ case 'Sftn':
1011
+ result.soften = parseUnits(val);
1012
+ break;
1013
+ case 'srgR':
1014
+ result.strength = parsePercent(val);
1015
+ break;
1016
+ case 'blur':
1017
+ result.size = parseUnits(val);
1018
+ break;
1019
+ case 'Nose':
1020
+ result.noise = parsePercent(val);
1021
+ break;
1022
+ case 'Inpr':
1023
+ result.range = parsePercent(val);
1024
+ break;
1025
+ case 'Ckmt':
1026
+ result.choke = parseUnits(val);
1027
+ break;
1028
+ case 'ShdN':
1029
+ result.jitter = parsePercent(val);
1030
+ break;
1031
+ case 'Dstn':
1032
+ result.distance = parseUnits(val);
1033
+ break;
1034
+ case 'Scl ':
1035
+ result.scale = parsePercent(val);
1036
+ break;
1037
+ case 'Ptrn':
1038
+ result.pattern = { name: val['Nm '], id: val.Idnt };
1039
+ break;
1040
+ case 'phase':
1041
+ result.phase = { x: val.Hrzn, y: val.Vrtc };
1042
+ break;
1043
+ case 'Ofst':
1044
+ result.offset = { x: parsePercent(val.Hrzn), y: parsePercent(val.Vrtc) };
1045
+ break;
1046
+ case 'MpgS':
1047
+ case 'TrnS':
1048
+ result.contour = {
1049
+ name: val['Nm '],
1050
+ curve: val['Crv '].map(function (p) { return ({ x: p.Hrzn, y: p.Vrtc }); }),
1051
+ };
1052
+ break;
1053
+ case 'Grad':
1054
+ result.gradient = parseGradient(val);
1055
+ break;
1056
+ case 'useTexture':
1057
+ case 'useShape':
1058
+ case 'layerConceals':
1059
+ case 'present':
1060
+ case 'showInDialog':
1061
+ case 'antialiasGloss':
1062
+ result[key] = val;
1063
+ break;
1064
+ default:
1065
+ reportErrors && console.log("Invalid effect key: '".concat(key, "', value:"), val);
1066
+ }
1067
+ }
1068
+ return result;
1069
+ }
1070
+ function serializeEffectObject(obj, objName, reportErrors) {
1071
+ var result = {};
1072
+ for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {
1073
+ var objKey = _a[_i];
1074
+ var key = objKey;
1075
+ var val = obj[key];
1076
+ switch (key) {
1077
+ case 'enabled':
1078
+ result.enab = !!val;
1079
+ break;
1080
+ case 'useGlobalLight':
1081
+ result.uglg = !!val;
1082
+ break;
1083
+ case 'antialiased':
1084
+ result.AntA = !!val;
1085
+ break;
1086
+ case 'align':
1087
+ result.Algn = !!val;
1088
+ break;
1089
+ case 'dither':
1090
+ result.Dthr = !!val;
1091
+ break;
1092
+ case 'invert':
1093
+ result.Invr = !!val;
1094
+ break;
1095
+ case 'reverse':
1096
+ result.Rvrs = !!val;
1097
+ break;
1098
+ case 'color':
1099
+ result['Clr '] = serializeColor(val);
1100
+ break;
1101
+ case 'highlightColor':
1102
+ result.hglC = serializeColor(val);
1103
+ break;
1104
+ case 'shadowColor':
1105
+ result.sdwC = serializeColor(val);
1106
+ break;
1107
+ case 'position':
1108
+ result.Styl = FStl.encode(val);
1109
+ break;
1110
+ case 'blendMode':
1111
+ result['Md '] = BlnM.encode(val);
1112
+ break;
1113
+ case 'highlightBlendMode':
1114
+ result.hglM = BlnM.encode(val);
1115
+ break;
1116
+ case 'shadowBlendMode':
1117
+ result.sdwM = BlnM.encode(val);
1118
+ break;
1119
+ case 'style':
1120
+ result.bvlS = BESl.encode(val);
1121
+ break;
1122
+ case 'direction':
1123
+ result.bvlD = BESs.encode(val);
1124
+ break;
1125
+ case 'technique':
1126
+ if (objName === 'bevel') {
1127
+ result.bvlT = bvlT.encode(val);
1128
+ }
1129
+ else {
1130
+ result.GlwT = BETE.encode(val);
1131
+ }
1132
+ break;
1133
+ case 'source':
1134
+ result.glwS = IGSr.encode(val);
1135
+ break;
1136
+ case 'type':
1137
+ result.Type = GrdT.encode(val);
1138
+ break;
1139
+ case 'interpolationMethod':
1140
+ result.gs99 = gradientInterpolationMethodType.encode(val);
1141
+ break;
1142
+ case 'opacity':
1143
+ result.Opct = unitsPercent(val);
1144
+ break;
1145
+ case 'highlightOpacity':
1146
+ result.hglO = unitsPercent(val);
1147
+ break;
1148
+ case 'shadowOpacity':
1149
+ result.sdwO = unitsPercent(val);
1150
+ break;
1151
+ case 'angle':
1152
+ if (objName === 'gradientOverlay') {
1153
+ result.Angl = unitsAngle(val);
1154
+ }
1155
+ else {
1156
+ result.lagl = unitsAngle(val);
1157
+ }
1158
+ break;
1159
+ case 'altitude':
1160
+ result.Lald = unitsAngle(val);
1161
+ break;
1162
+ case 'soften':
1163
+ result.Sftn = unitsValue(val, key);
1164
+ break;
1165
+ case 'strength':
1166
+ result.srgR = unitsPercent(val);
1167
+ break;
1168
+ case 'size':
1169
+ result.blur = unitsValue(val, key);
1170
+ break;
1171
+ case 'noise':
1172
+ result.Nose = unitsPercent(val);
1173
+ break;
1174
+ case 'range':
1175
+ result.Inpr = unitsPercent(val);
1176
+ break;
1177
+ case 'choke':
1178
+ result.Ckmt = unitsValue(val, key);
1179
+ break;
1180
+ case 'jitter':
1181
+ result.ShdN = unitsPercent(val);
1182
+ break;
1183
+ case 'distance':
1184
+ result.Dstn = unitsValue(val, key);
1185
+ break;
1186
+ case 'scale':
1187
+ result['Scl '] = unitsPercent(val);
1188
+ break;
1189
+ case 'pattern':
1190
+ result.Ptrn = { 'Nm ': val.name, Idnt: val.id };
1191
+ break;
1192
+ case 'phase':
1193
+ result.phase = { Hrzn: val.x, Vrtc: val.y };
1194
+ break;
1195
+ case 'offset':
1196
+ result.Ofst = { Hrzn: unitsPercent(val.x), Vrtc: unitsPercent(val.y) };
1197
+ break;
1198
+ case 'contour': {
1199
+ result[objName === 'satin' ? 'MpgS' : 'TrnS'] = {
1200
+ 'Nm ': val.name,
1201
+ 'Crv ': val.curve.map(function (p) { return ({ Hrzn: p.x, Vrtc: p.y }); }),
1202
+ };
1203
+ break;
1204
+ }
1205
+ case 'gradient':
1206
+ result.Grad = serializeGradient(val);
1207
+ break;
1208
+ case 'useTexture':
1209
+ case 'useShape':
1210
+ case 'layerConceals':
1211
+ case 'present':
1212
+ case 'showInDialog':
1213
+ case 'antialiasGloss':
1214
+ result[key] = val;
1215
+ break;
1216
+ default:
1217
+ reportErrors && console.log("Invalid effect key: '".concat(key, "', value:"), val);
1218
+ }
1219
+ }
1220
+ return result;
1221
+ }
1222
+ function parseGradient(grad) {
1223
+ if (grad.GrdF === 'GrdF.CstS') {
1224
+ var samples_1 = grad.Intr || 4096;
1225
+ return {
1226
+ type: 'solid',
1227
+ name: grad['Nm '],
1228
+ smoothness: grad.Intr / 4096,
1229
+ colorStops: grad.Clrs.map(function (s) { return ({
1230
+ color: parseColor(s['Clr ']),
1231
+ location: s.Lctn / samples_1,
1232
+ midpoint: s.Mdpn / 100,
1233
+ }); }),
1234
+ opacityStops: grad.Trns.map(function (s) { return ({
1235
+ opacity: parsePercent(s.Opct),
1236
+ location: s.Lctn / samples_1,
1237
+ midpoint: s.Mdpn / 100,
1238
+ }); }),
1239
+ };
1240
+ }
1241
+ else {
1242
+ return {
1243
+ type: 'noise',
1244
+ name: grad['Nm '],
1245
+ roughness: grad.Smth / 4096,
1246
+ colorModel: ClrS.decode(grad.ClrS),
1247
+ randomSeed: grad.RndS,
1248
+ restrictColors: !!grad.VctC,
1249
+ addTransparency: !!grad.ShTr,
1250
+ min: grad['Mnm '].map(function (x) { return x / 100; }),
1251
+ max: grad['Mxm '].map(function (x) { return x / 100; }),
1252
+ };
1253
+ }
1254
+ }
1255
+ function serializeGradient(grad) {
1256
+ var _a, _b;
1257
+ if (grad.type === 'solid') {
1258
+ var samples_2 = Math.round(((_a = grad.smoothness) !== null && _a !== void 0 ? _a : 1) * 4096);
1259
+ return {
1260
+ 'Nm ': grad.name || '',
1261
+ GrdF: 'GrdF.CstS',
1262
+ Intr: samples_2,
1263
+ Clrs: grad.colorStops.map(function (s) {
1264
+ var _a;
1265
+ return ({
1266
+ 'Clr ': serializeColor(s.color),
1267
+ Type: 'Clry.UsrS',
1268
+ Lctn: Math.round(s.location * samples_2),
1269
+ Mdpn: Math.round(((_a = s.midpoint) !== null && _a !== void 0 ? _a : 0.5) * 100),
1270
+ });
1271
+ }),
1272
+ Trns: grad.opacityStops.map(function (s) {
1273
+ var _a;
1274
+ return ({
1275
+ Opct: unitsPercent(s.opacity),
1276
+ Lctn: Math.round(s.location * samples_2),
1277
+ Mdpn: Math.round(((_a = s.midpoint) !== null && _a !== void 0 ? _a : 0.5) * 100),
1278
+ });
1279
+ }),
1280
+ };
1281
+ }
1282
+ else {
1283
+ return {
1284
+ GrdF: 'GrdF.ClNs',
1285
+ 'Nm ': grad.name || '',
1286
+ ShTr: !!grad.addTransparency,
1287
+ VctC: !!grad.restrictColors,
1288
+ ClrS: ClrS.encode(grad.colorModel),
1289
+ RndS: grad.randomSeed || 0,
1290
+ Smth: Math.round(((_b = grad.roughness) !== null && _b !== void 0 ? _b : 1) * 4096),
1291
+ 'Mnm ': (grad.min || [0, 0, 0, 0]).map(function (x) { return x * 100; }),
1292
+ 'Mxm ': (grad.max || [1, 1, 1, 1]).map(function (x) { return x * 100; }),
1293
+ };
1294
+ }
1295
+ }
1296
+ function parseGradientContent(descriptor) {
1297
+ var result = parseGradient(descriptor.Grad);
1298
+ result.style = GrdT.decode(descriptor.Type);
1299
+ if (descriptor.Dthr !== undefined)
1300
+ result.dither = descriptor.Dthr;
1301
+ if (descriptor.Rvrs !== undefined)
1302
+ result.reverse = descriptor.Rvrs;
1303
+ if (descriptor.Angl !== undefined)
1304
+ result.angle = parseAngle(descriptor.Angl);
1305
+ if (descriptor['Scl '] !== undefined)
1306
+ result.scale = parsePercent(descriptor['Scl ']);
1307
+ if (descriptor.Algn !== undefined)
1308
+ result.align = descriptor.Algn;
1309
+ if (descriptor.Ofst !== undefined) {
1310
+ result.offset = {
1311
+ x: parsePercent(descriptor.Ofst.Hrzn),
1312
+ y: parsePercent(descriptor.Ofst.Vrtc)
1313
+ };
1314
+ }
1315
+ return result;
1316
+ }
1317
+ function parsePatternContent(descriptor) {
1318
+ var result = {
1319
+ name: descriptor.Ptrn['Nm '],
1320
+ id: descriptor.Ptrn.Idnt,
1321
+ };
1322
+ if (descriptor.Lnkd !== undefined)
1323
+ result.linked = descriptor.Lnkd;
1324
+ if (descriptor.phase !== undefined)
1325
+ result.phase = { x: descriptor.phase.Hrzn, y: descriptor.phase.Vrtc };
1326
+ return result;
1327
+ }
1328
+ export function parseVectorContent(descriptor) {
1329
+ if ('Grad' in descriptor) {
1330
+ return parseGradientContent(descriptor);
1331
+ }
1332
+ else if ('Ptrn' in descriptor) {
1333
+ return __assign({ type: 'pattern' }, parsePatternContent(descriptor));
1334
+ }
1335
+ else if ('Clr ' in descriptor) {
1336
+ return { type: 'color', color: parseColor(descriptor['Clr ']) };
1337
+ }
1338
+ else {
1339
+ throw new Error('Invalid vector content');
1340
+ }
1341
+ }
1342
+ function serializeGradientContent(content) {
1343
+ var result = {};
1344
+ if (content.dither !== undefined)
1345
+ result.Dthr = content.dither;
1346
+ if (content.reverse !== undefined)
1347
+ result.Rvrs = content.reverse;
1348
+ if (content.angle !== undefined)
1349
+ result.Angl = unitsAngle(content.angle);
1350
+ result.Type = GrdT.encode(content.style);
1351
+ if (content.align !== undefined)
1352
+ result.Algn = content.align;
1353
+ if (content.scale !== undefined)
1354
+ result['Scl '] = unitsPercent(content.scale);
1355
+ if (content.offset) {
1356
+ result.Ofst = {
1357
+ Hrzn: unitsPercent(content.offset.x),
1358
+ Vrtc: unitsPercent(content.offset.y),
1359
+ };
1360
+ }
1361
+ result.Grad = serializeGradient(content);
1362
+ return result;
1363
+ }
1364
+ function serializePatternContent(content) {
1365
+ var result = {
1366
+ Ptrn: {
1367
+ 'Nm ': content.name || '',
1368
+ Idnt: content.id || '',
1369
+ }
1370
+ };
1371
+ if (content.linked !== undefined)
1372
+ result.Lnkd = !!content.linked;
1373
+ if (content.phase !== undefined)
1374
+ result.phase = { Hrzn: content.phase.x, Vrtc: content.phase.y };
1375
+ return result;
1376
+ }
1377
+ export function serializeVectorContent(content) {
1378
+ if (content.type === 'color') {
1379
+ return { key: 'SoCo', descriptor: { 'Clr ': serializeColor(content.color) } };
1380
+ }
1381
+ else if (content.type === 'pattern') {
1382
+ return { key: 'PtFl', descriptor: serializePatternContent(content) };
1383
+ }
1384
+ else {
1385
+ return { key: 'GdFl', descriptor: serializeGradientContent(content) };
1386
+ }
1387
+ }
1388
+ export function parseColor(color) {
1389
+ if ('H ' in color) {
1390
+ return { h: parsePercentOrAngle(color['H ']), s: color.Strt, b: color.Brgh };
1391
+ }
1392
+ else if ('Rd ' in color) {
1393
+ return { r: color['Rd '], g: color['Grn '], b: color['Bl '] };
1394
+ }
1395
+ else if ('Cyn ' in color) {
1396
+ return { c: color['Cyn '], m: color.Mgnt, y: color['Ylw '], k: color.Blck };
1397
+ }
1398
+ else if ('Gry ' in color) {
1399
+ return { k: color['Gry '] };
1400
+ }
1401
+ else if ('Lmnc' in color) {
1402
+ return { l: color.Lmnc, a: color['A '], b: color['B '] };
1403
+ }
1404
+ else {
1405
+ throw new Error('Unsupported color descriptor');
1406
+ }
1407
+ }
1408
+ export function serializeColor(color) {
1409
+ if (!color) {
1410
+ return { 'Rd ': 0, 'Grn ': 0, 'Bl ': 0 };
1411
+ }
1412
+ else if ('r' in color) {
1413
+ return { 'Rd ': color.r || 0, 'Grn ': color.g || 0, 'Bl ': color.b || 0 };
1414
+ }
1415
+ else if ('h' in color) {
1416
+ return { 'H ': unitsAngle(color.h * 360), Strt: color.s || 0, Brgh: color.b || 0 };
1417
+ }
1418
+ else if ('c' in color) {
1419
+ return { 'Cyn ': color.c || 0, Mgnt: color.m || 0, 'Ylw ': color.y || 0, Blck: color.k || 0 };
1420
+ }
1421
+ else if ('l' in color) {
1422
+ return { Lmnc: color.l || 0, 'A ': color.a || 0, 'B ': color.b || 0 };
1423
+ }
1424
+ else if ('k' in color) {
1425
+ return { 'Gry ': color.k };
1426
+ }
1427
+ else {
1428
+ throw new Error('Invalid color value');
1429
+ }
1430
+ }
1431
+ export function parseAngle(x) {
1432
+ if (x === undefined)
1433
+ return 0;
1434
+ if (x.units !== 'Angle')
1435
+ throw new Error("Invalid units: ".concat(x.units));
1436
+ return x.value;
1437
+ }
1438
+ export function parsePercent(x) {
1439
+ if (x === undefined)
1440
+ return 1;
1441
+ if (x.units !== 'Percent')
1442
+ throw new Error("Invalid units: ".concat(x.units));
1443
+ return x.value / 100;
1444
+ }
1445
+ export function parsePercentOrAngle(x) {
1446
+ if (x === undefined)
1447
+ return 1;
1448
+ if (x.units === 'Percent')
1449
+ return x.value / 100;
1450
+ if (x.units === 'Angle')
1451
+ return x.value / 360;
1452
+ throw new Error("Invalid units: ".concat(x.units));
1453
+ }
1454
+ export function parseUnits(_a) {
1455
+ var units = _a.units, value = _a.value;
1456
+ if (units !== 'Pixels' && units !== 'Millimeters' && units !== 'Points' && units !== 'None' &&
1457
+ units !== 'Picas' && units !== 'Inches' && units !== 'Centimeters' && units !== 'Density') {
1458
+ throw new Error("Invalid units: ".concat(JSON.stringify({ units: units, value: value })));
1459
+ }
1460
+ return { value: value, units: units };
1461
+ }
1462
+ export function parseUnitsOrNumber(value, units) {
1463
+ if (units === void 0) { units = 'Pixels'; }
1464
+ if (typeof value === 'number')
1465
+ return { value: value, units: units };
1466
+ return parseUnits(value);
1467
+ }
1468
+ export function parseUnitsToNumber(_a, expectedUnits) {
1469
+ var units = _a.units, value = _a.value;
1470
+ if (units !== expectedUnits)
1471
+ throw new Error("Invalid units: ".concat(JSON.stringify({ units: units, value: value })));
1472
+ return value;
1473
+ }
1474
+ export function unitsAngle(value) {
1475
+ return { units: 'Angle', value: value || 0 };
1476
+ }
1477
+ export function unitsPercent(value) {
1478
+ return { units: 'Percent', value: Math.round((value || 0) * 100) };
1479
+ }
1480
+ export function unitsValue(x, key) {
1481
+ if (x == null)
1482
+ return { units: 'Pixels', value: 0 };
1483
+ if (typeof x !== 'object')
1484
+ throw new Error("Invalid value: ".concat(JSON.stringify(x), " (key: ").concat(key, ") (should have value and units)"));
1485
+ var units = x.units, value = x.value;
1486
+ if (typeof value !== 'number')
1487
+ throw new Error("Invalid value in ".concat(JSON.stringify(x), " (key: ").concat(key, ")"));
1488
+ if (units !== 'Pixels' && units !== 'Millimeters' && units !== 'Points' && units !== 'None' &&
1489
+ units !== 'Picas' && units !== 'Inches' && units !== 'Centimeters' && units !== 'Density') {
1490
+ throw new Error("Invalid units in ".concat(JSON.stringify(x), " (key: ").concat(key, ")"));
1491
+ }
1492
+ return { units: units, value: value };
1493
+ }
1494
+ export var textGridding = createEnum('textGridding', 'none', {
1495
+ none: 'None',
1496
+ round: 'Rnd ',
1497
+ });
1498
+ export var Ornt = createEnum('Ornt', 'horizontal', {
1499
+ horizontal: 'Hrzn',
1500
+ vertical: 'Vrtc',
1501
+ });
1502
+ export var Annt = createEnum('Annt', 'sharp', {
1503
+ none: 'Anno',
1504
+ sharp: 'antiAliasSharp',
1505
+ crisp: 'AnCr',
1506
+ strong: 'AnSt',
1507
+ smooth: 'AnSm',
1508
+ platform: 'antiAliasPlatformGray',
1509
+ platformLCD: 'antiAliasPlatformLCD',
1510
+ });
1511
+ export var warpStyle = createEnum('warpStyle', 'none', {
1512
+ none: 'warpNone',
1513
+ arc: 'warpArc',
1514
+ arcLower: 'warpArcLower',
1515
+ arcUpper: 'warpArcUpper',
1516
+ arch: 'warpArch',
1517
+ bulge: 'warpBulge',
1518
+ shellLower: 'warpShellLower',
1519
+ shellUpper: 'warpShellUpper',
1520
+ flag: 'warpFlag',
1521
+ wave: 'warpWave',
1522
+ fish: 'warpFish',
1523
+ rise: 'warpRise',
1524
+ fisheye: 'warpFisheye',
1525
+ inflate: 'warpInflate',
1526
+ squeeze: 'warpSqueeze',
1527
+ twist: 'warpTwist',
1528
+ cylinder: 'warpCylinder',
1529
+ custom: 'warpCustom',
1530
+ });
1531
+ export var BlnM = createEnum('BlnM', 'normal', {
1532
+ 'normal': 'Nrml',
1533
+ 'dissolve': 'Dslv',
1534
+ 'darken': 'Drkn',
1535
+ 'multiply': 'Mltp',
1536
+ 'color burn': 'CBrn',
1537
+ 'linear burn': 'linearBurn',
1538
+ 'darker color': 'darkerColor',
1539
+ 'lighten': 'Lghn',
1540
+ 'screen': 'Scrn',
1541
+ 'color dodge': 'CDdg',
1542
+ 'linear dodge': 'linearDodge',
1543
+ 'lighter color': 'lighterColor',
1544
+ 'overlay': 'Ovrl',
1545
+ 'soft light': 'SftL',
1546
+ 'hard light': 'HrdL',
1547
+ 'vivid light': 'vividLight',
1548
+ 'linear light': 'linearLight',
1549
+ 'pin light': 'pinLight',
1550
+ 'hard mix': 'hardMix',
1551
+ 'difference': 'Dfrn',
1552
+ 'exclusion': 'Xclu',
1553
+ 'subtract': 'blendSubtraction',
1554
+ 'divide': 'blendDivide',
1555
+ 'hue': 'H ',
1556
+ 'saturation': 'Strt',
1557
+ 'color': 'Clr ',
1558
+ 'luminosity': 'Lmns',
1559
+ // used in ABR
1560
+ 'linear height': 'linearHeight',
1561
+ 'height': 'Hght',
1562
+ 'subtraction': 'Sbtr', // 2nd version of subtract ?
1563
+ });
1564
+ export var BESl = createEnum('BESl', 'inner bevel', {
1565
+ 'inner bevel': 'InrB',
1566
+ 'outer bevel': 'OtrB',
1567
+ 'emboss': 'Embs',
1568
+ 'pillow emboss': 'PlEb',
1569
+ 'stroke emboss': 'strokeEmboss',
1570
+ });
1571
+ export var bvlT = createEnum('bvlT', 'smooth', {
1572
+ 'smooth': 'SfBL',
1573
+ 'chisel hard': 'PrBL',
1574
+ 'chisel soft': 'Slmt',
1575
+ });
1576
+ export var BESs = createEnum('BESs', 'up', {
1577
+ up: 'In ',
1578
+ down: 'Out ',
1579
+ });
1580
+ export var BETE = createEnum('BETE', 'softer', {
1581
+ softer: 'SfBL',
1582
+ precise: 'PrBL',
1583
+ });
1584
+ export var IGSr = createEnum('IGSr', 'edge', {
1585
+ edge: 'SrcE',
1586
+ center: 'SrcC',
1587
+ });
1588
+ export var GrdT = createEnum('GrdT', 'linear', {
1589
+ linear: 'Lnr ',
1590
+ radial: 'Rdl ',
1591
+ angle: 'Angl',
1592
+ reflected: 'Rflc',
1593
+ diamond: 'Dmnd',
1594
+ });
1595
+ export var animInterpStyleEnum = createEnum('animInterpStyle', 'linear', {
1596
+ linear: 'Lnr ',
1597
+ hold: 'hold',
1598
+ });
1599
+ export var stdTrackID = createEnum('stdTrackID', 'opacity', {
1600
+ opacity: 'opacityTrack',
1601
+ style: 'styleTrack',
1602
+ sheetTransform: 'sheetTransformTrack',
1603
+ sheetPosition: 'sheetPositionTrack',
1604
+ globalLighting: 'globalLightingTrack',
1605
+ });
1606
+ export var gradientInterpolationMethodType = createEnum('gradientInterpolationMethodType', 'perceptual', {
1607
+ perceptual: 'Perc',
1608
+ linear: 'Lnr',
1609
+ classic: 'Gcls',
1610
+ });
1611
+ export var ClrS = createEnum('ClrS', 'rgb', {
1612
+ rgb: 'RGBC',
1613
+ hsb: 'HSBl',
1614
+ lab: 'LbCl',
1615
+ });
1616
+ export var FStl = createEnum('FStl', 'outside', {
1617
+ outside: 'OutF',
1618
+ center: 'CtrF',
1619
+ inside: 'InsF'
1620
+ });
1621
+ export var FrFl = createEnum('FrFl', 'color', {
1622
+ color: 'SClr',
1623
+ gradient: 'GrFl',
1624
+ pattern: 'Ptrn',
1625
+ });
1626
+ export var ESliceType = createEnum('ESliceType', 'image', {
1627
+ image: 'Img ',
1628
+ noImage: 'noImage',
1629
+ });
1630
+ export var ESliceHorzAlign = createEnum('ESliceHorzAlign', 'default', {
1631
+ default: 'default',
1632
+ });
1633
+ export var ESliceVertAlign = createEnum('ESliceVertAlign', 'default', {
1634
+ default: 'default',
1635
+ });
1636
+ export var ESliceOrigin = createEnum('ESliceOrigin', 'userGenerated', {
1637
+ userGenerated: 'userGenerated',
1638
+ autoGenerated: 'autoGenerated',
1639
+ layer: 'layer',
1640
+ });
1641
+ export var ESliceBGColorType = createEnum('ESliceBGColorType', 'none', {
1642
+ none: 'None',
1643
+ matte: 'matte',
1644
+ color: 'Clr ',
1645
+ });
1646
+ export var strokeStyleLineCapType = createEnum('strokeStyleLineCapType', 'butt', {
1647
+ butt: 'strokeStyleButtCap',
1648
+ round: 'strokeStyleRoundCap',
1649
+ square: 'strokeStyleSquareCap',
1650
+ });
1651
+ export var strokeStyleLineJoinType = createEnum('strokeStyleLineJoinType', 'miter', {
1652
+ miter: 'strokeStyleMiterJoin',
1653
+ round: 'strokeStyleRoundJoin',
1654
+ bevel: 'strokeStyleBevelJoin',
1655
+ });
1656
+ export var strokeStyleLineAlignment = createEnum('strokeStyleLineAlignment', 'inside', {
1657
+ inside: 'strokeStyleAlignInside',
1658
+ center: 'strokeStyleAlignCenter',
1659
+ outside: 'strokeStyleAlignOutside',
1660
+ });
1661
+ //# sourceMappingURL=descriptor.js.map