@jsprismarine/nbt 0.1.0-rc.53 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE +373 -0
  2. package/dist/Allocation.cjs.js +14 -0
  3. package/dist/Allocation.es.js +10 -0
  4. package/dist/ByteOrder-C8lF6w2G.cjs +16 -0
  5. package/dist/ByteOrder-mAT605jQ.js +13 -0
  6. package/dist/ByteOrder.cjs.js +10 -0
  7. package/dist/ByteOrder.es.js +2 -0
  8. package/dist/NBT.cjs.js +30 -0
  9. package/dist/NBT.d.ts +7 -7
  10. package/dist/NBT.d.ts.map +1 -1
  11. package/dist/NBT.es.js +16 -0
  12. package/dist/NBTDefinitions-BF_rcBoW.js +23 -0
  13. package/dist/NBTDefinitions-DUnu0laJ.cjs +26 -0
  14. package/dist/NBTDefinitions.cjs.js +10 -0
  15. package/dist/NBTDefinitions.es.js +2 -0
  16. package/dist/NBTReader.cjs.js +23 -0
  17. package/dist/NBTReader.d.ts +4 -4
  18. package/dist/NBTReader.d.ts.map +1 -1
  19. package/dist/NBTReader.es.js +15 -0
  20. package/dist/NBTStreamReader.cjs.js +119 -0
  21. package/dist/NBTStreamReader.d.ts +9 -9
  22. package/dist/NBTStreamReader.d.ts.map +1 -1
  23. package/dist/NBTStreamReader.es.js +115 -0
  24. package/dist/NBTTagCompound.cjs.js +23 -0
  25. package/dist/NBTTagCompound.d.ts +1 -1
  26. package/dist/NBTTagCompound.d.ts.map +1 -1
  27. package/dist/NBTTagCompound.es.js +15 -0
  28. package/dist/NBTWriter-CWx4uanO.js +515 -0
  29. package/dist/NBTWriter-KG_h2i_E.cjs +524 -0
  30. package/dist/NBTWriter.cjs.js +23 -0
  31. package/dist/NBTWriter.d.ts +2 -2
  32. package/dist/NBTWriter.d.ts.map +1 -1
  33. package/dist/NBTWriter.es.js +15 -0
  34. package/dist/Types-7TSvUTtn.js +21 -0
  35. package/dist/Types-CTvMjHAk.cjs +23 -0
  36. package/dist/types/ByteVal.cjs.js +16 -0
  37. package/dist/types/ByteVal.es.js +12 -0
  38. package/dist/types/DoubleVal.cjs.js +16 -0
  39. package/dist/types/DoubleVal.es.js +12 -0
  40. package/dist/types/FloatVal.cjs.js +16 -0
  41. package/dist/types/FloatVal.es.js +12 -0
  42. package/dist/types/LongVal.cjs.js +16 -0
  43. package/dist/types/LongVal.es.js +12 -0
  44. package/dist/types/NumberVal.cjs.js +16 -0
  45. package/dist/types/NumberVal.es.js +12 -0
  46. package/dist/types/ShortVal.cjs.js +16 -0
  47. package/dist/types/ShortVal.es.js +12 -0
  48. package/dist/types/StringVal.cjs.js +16 -0
  49. package/dist/types/StringVal.es.js +12 -0
  50. package/dist/types/Types.cjs.js +22 -0
  51. package/dist/types/Types.d.ts +7 -7
  52. package/dist/types/Types.d.ts.map +1 -1
  53. package/dist/types/Types.es.js +8 -0
  54. package/package.json +50 -27
  55. package/dist/Allocation.js +0 -8
  56. package/dist/Allocation.js.map +0 -1
  57. package/dist/ByteOrder.js +0 -6
  58. package/dist/ByteOrder.js.map +0 -1
  59. package/dist/NBT.js +0 -9
  60. package/dist/NBT.js.map +0 -1
  61. package/dist/NBTDefinitions.js +0 -16
  62. package/dist/NBTDefinitions.js.map +0 -1
  63. package/dist/NBTReader.js +0 -157
  64. package/dist/NBTReader.js.map +0 -1
  65. package/dist/NBTStreamReader.js +0 -113
  66. package/dist/NBTStreamReader.js.map +0 -1
  67. package/dist/NBTTagCompound.js +0 -137
  68. package/dist/NBTTagCompound.js.map +0 -1
  69. package/dist/NBTWriter.js +0 -242
  70. package/dist/NBTWriter.js.map +0 -1
  71. package/dist/tsconfig.tsbuildinfo +0 -1
  72. package/dist/types/ByteVal.js +0 -10
  73. package/dist/types/ByteVal.js.map +0 -1
  74. package/dist/types/DoubleVal.js +0 -10
  75. package/dist/types/DoubleVal.js.map +0 -1
  76. package/dist/types/FloatVal.js +0 -10
  77. package/dist/types/FloatVal.js.map +0 -1
  78. package/dist/types/LongVal.js +0 -10
  79. package/dist/types/LongVal.js.map +0 -1
  80. package/dist/types/NumberVal.js +0 -10
  81. package/dist/types/NumberVal.js.map +0 -1
  82. package/dist/types/ShortVal.js +0 -10
  83. package/dist/types/ShortVal.js.map +0 -1
  84. package/dist/types/StringVal.js +0 -10
  85. package/dist/types/StringVal.js.map +0 -1
  86. package/dist/types/Types.js +0 -9
  87. package/dist/types/Types.js.map +0 -1
@@ -0,0 +1,515 @@
1
+ import { a as ByteOrder } from './ByteOrder-mAT605jQ.js';
2
+ import ByteValue from './types/ByteVal.es.js';
3
+ import DoubleValue from './types/DoubleVal.es.js';
4
+ import FloatValue from './types/FloatVal.es.js';
5
+ import LongValue from './types/LongVal.es.js';
6
+ import { a as NBTDefinitions } from './NBTDefinitions-BF_rcBoW.js';
7
+ import fs from 'node:fs';
8
+ import BinaryStream from '@jsprismarine/jsbinaryutils';
9
+ import { Allocation } from './Allocation.es.js';
10
+ import NBTStreamReader from './NBTStreamReader.es.js';
11
+ import NumberValue from './types/NumberVal.es.js';
12
+ import ShortValue from './types/ShortVal.es.js';
13
+ import StringValue from './types/StringVal.es.js';
14
+
15
+ class NBTReader extends NBTStreamReader {
16
+ constructor(input, byteOrder) {
17
+ super(input, byteOrder);
18
+ }
19
+ parseList() {
20
+ this.expectInput(this.isUsingVarint() ? 2 : 3, "Invalid NBT Data: Not enough data to read new tag", false);
21
+ if (this.readByteValue().getValue() !== NBTDefinitions.TAG_LIST) {
22
+ throw new Error("Invalid NBT Data: Not list tag found");
23
+ }
24
+ this.readStringValue();
25
+ return this.readTagListValue();
26
+ }
27
+ parse() {
28
+ this.expectInput(this.isUsingVarint() ? 2 : 3, "Invalid NBT Data: Not enough data to read new tag", false);
29
+ if (this.readByteValue().getValue() !== NBTDefinitions.TAG_COMPOUND) {
30
+ throw new Error("Invalid NBT Data: No root tag found");
31
+ }
32
+ const name = this.readStringValue().getValue();
33
+ const root = this.readTagCompoundValue();
34
+ root.setName(name);
35
+ return root;
36
+ }
37
+ readTagCompoundValue() {
38
+ this.alterAllocationLimit(Allocation.COMPOUND);
39
+ const compound = new NBTTagCompound();
40
+ this.expectInput(1, "Invalid NBT Data: Expected Tag ID in compound tag", false);
41
+ let tagID = this.readByteValue().getValue();
42
+ while (tagID !== NBTDefinitions.TAG_END) {
43
+ switch (tagID) {
44
+ case NBTDefinitions.TAG_BYTE:
45
+ compound.addValue(this.readStringValue().getValue(), this.readByteValue());
46
+ break;
47
+ case NBTDefinitions.TAG_SHORT:
48
+ compound.addValue(this.readStringValue().getValue(), this.readShortValue());
49
+ break;
50
+ case NBTDefinitions.TAG_INT:
51
+ compound.addValue(this.readStringValue().getValue(), this.readIntValue());
52
+ break;
53
+ case NBTDefinitions.TAG_LONG:
54
+ compound.addValue(this.readStringValue().getValue(), this.readLongValue());
55
+ break;
56
+ case NBTDefinitions.TAG_FLOAT:
57
+ compound.addValue(this.readStringValue().getValue(), this.readFloatValue());
58
+ break;
59
+ case NBTDefinitions.TAG_DOUBLE:
60
+ compound.addValue(this.readStringValue().getValue(), this.readDoubleValue());
61
+ break;
62
+ case NBTDefinitions.TAG_BYTE_ARRAY:
63
+ compound.addValue(this.readStringValue().getValue(), this.readByteArrayValue());
64
+ break;
65
+ case NBTDefinitions.TAG_STRING:
66
+ compound.addValue(this.readStringValue().getValue(), this.readStringValue());
67
+ break;
68
+ case NBTDefinitions.TAG_LIST:
69
+ compound.addValue(this.readStringValue().getValue(), this.readTagListValue());
70
+ break;
71
+ case NBTDefinitions.TAG_COMPOUND:
72
+ const name = this.readStringValue().getValue();
73
+ const child = this.readTagCompoundValue();
74
+ child.setName(name);
75
+ compound.addChild(child);
76
+ break;
77
+ case NBTDefinitions.TAG_INT_ARRAY:
78
+ compound.addValue(this.readStringValue().getValue(), this.readIntArrayValue());
79
+ break;
80
+ default:
81
+ throw new Error(`Invalid NBT Data: Unknown tag <${tagID}>`);
82
+ }
83
+ this.expectInput(1, "Invalid NBT Data: Expected tag ID in tag compound", false);
84
+ tagID = this.readByteValue().getValue();
85
+ }
86
+ return compound;
87
+ }
88
+ readTagListValue() {
89
+ this.expectInput(this.isUsingVarint() ? 2 : 5, "Invalid NBT Data: Expected TAGList header", false);
90
+ const listType = this.readByteValue().getValue();
91
+ let listLength = this.readIntValue().getValue();
92
+ this.alterAllocationLimit(Allocation.ARRAY_LIST);
93
+ this.alterAllocationLimit(Allocation.REFERENCE);
94
+ const backingList = /* @__PURE__ */ new Set();
95
+ switch (listType) {
96
+ case NBTDefinitions.TAG_END:
97
+ listLength = 0;
98
+ break;
99
+ case NBTDefinitions.TAG_BYTE:
100
+ this.expectInput(listLength, "Invalid NBT Data: Expected bytes for list");
101
+ for (let i = 0; i < listLength; i++) {
102
+ backingList.add(this.readShortValue());
103
+ }
104
+ break;
105
+ case NBTDefinitions.TAG_SHORT:
106
+ this.expectInput(2 * listLength, "Invalid NBT Data: Expected shorts for list");
107
+ for (let i = 0; i < listLength; i++) {
108
+ backingList.add(this.readShortValue());
109
+ }
110
+ break;
111
+ case NBTDefinitions.TAG_INT:
112
+ this.expectInput(4 * listLength, "Invalid NBT Data: Expected ints for list");
113
+ for (let i = 0; i < listLength; i++) {
114
+ backingList.add(this.readIntValue());
115
+ }
116
+ break;
117
+ case NBTDefinitions.TAG_LONG:
118
+ this.expectInput(8 * listLength, "Invalid NBT Data: Expected longs for list");
119
+ for (let i = 0; i < listLength; i++) {
120
+ backingList.add(this.readLongValue());
121
+ }
122
+ break;
123
+ case NBTDefinitions.TAG_FLOAT:
124
+ this.expectInput(4 * listLength, "Invalid NBT Data: Expected floats for list");
125
+ for (let i = 0; i < listLength; i++) {
126
+ backingList.add(this.readFloatValue());
127
+ }
128
+ break;
129
+ case NBTDefinitions.TAG_DOUBLE:
130
+ this.expectInput(8 * listLength, "Invalid NBT Data: Expected doubles for list");
131
+ for (let i = 0; i < listLength; i++) {
132
+ backingList.add(this.readDoubleValue());
133
+ }
134
+ break;
135
+ case NBTDefinitions.TAG_BYTE_ARRAY:
136
+ for (let i = 0; i < listLength; i++) {
137
+ backingList.add(this.readByteArrayValue());
138
+ }
139
+ break;
140
+ case NBTDefinitions.TAG_STRING:
141
+ for (let i = 0; i < listLength; i++) {
142
+ backingList.add(this.readStringValue());
143
+ }
144
+ break;
145
+ case NBTDefinitions.TAG_LIST:
146
+ for (let i = 0; i < listLength; i++) {
147
+ backingList.add(this.readTagListValue());
148
+ }
149
+ break;
150
+ case NBTDefinitions.TAG_COMPOUND:
151
+ for (let i = 0; i < listLength; i++) {
152
+ backingList.add(this.readTagCompoundValue());
153
+ }
154
+ break;
155
+ case NBTDefinitions.TAG_INT_ARRAY:
156
+ for (let i = 0; i < listLength; i++) {
157
+ backingList.add(this.readIntArrayValue());
158
+ }
159
+ break;
160
+ default:
161
+ throw new Error(`Invalid NBT Data: Unknown tag <${listType}>`);
162
+ }
163
+ return backingList;
164
+ }
165
+ }
166
+
167
+ class NBTTagCompound {
168
+ name;
169
+ children = /* @__PURE__ */ new Map();
170
+ static readFromFile(path, byteOrder) {
171
+ return NBTTagCompound.readFromStream(new BinaryStream(fs.readFileSync(path)), byteOrder);
172
+ }
173
+ static readFromStream(input, byteOrder) {
174
+ const reader = new NBTReader(input, byteOrder);
175
+ return reader.parse();
176
+ }
177
+ constructor(name = null) {
178
+ this.name = name;
179
+ }
180
+ setName(name) {
181
+ this.name = name;
182
+ }
183
+ getName() {
184
+ return this.name;
185
+ }
186
+ addValue(name, value) {
187
+ if (value instanceof NBTTagCompound && !(name === value.getName())) {
188
+ throw new Error(`Failed to add NBTTagCompound with name ${value.getName()} given name ${name}`);
189
+ }
190
+ this.children.set(name, value);
191
+ }
192
+ addChild(tag) {
193
+ this.children.set(tag.getName(), tag);
194
+ }
195
+ getList(name, insert) {
196
+ if (this.children.has(name)) {
197
+ return this.children.get(name);
198
+ }
199
+ if (insert) {
200
+ const backingList = /* @__PURE__ */ new Set();
201
+ this.addValue(name, backingList);
202
+ return backingList;
203
+ }
204
+ return null;
205
+ }
206
+ getCompound(name, insert) {
207
+ if (this.children.has(name)) {
208
+ return this.children.get(name);
209
+ }
210
+ if (insert) {
211
+ const compound = new NBTTagCompound();
212
+ this.addValue(name, compound);
213
+ return compound;
214
+ }
215
+ return null;
216
+ }
217
+ writeToStream(out, byteOrder) {
218
+ const writer = new NBTWriter(out, byteOrder);
219
+ writer.writeCompound(this);
220
+ }
221
+ getByte(name, defaultValue) {
222
+ return this.children.has(name) ? this.children.get(name).getValue() : defaultValue;
223
+ }
224
+ getShort(name, defaultValue) {
225
+ return this.children.has(name) ? this.children.get(name).getValue() : defaultValue;
226
+ }
227
+ getNumber(name, defaultValue) {
228
+ return this.children.has(name) ? this.children.get(name).getValue() : defaultValue;
229
+ }
230
+ getLong(name, defaultValue) {
231
+ return this.children.has(name) ? this.children.get(name).getValue() : defaultValue;
232
+ }
233
+ getFloat(name, defaultValue) {
234
+ return this.children.has(name) ? this.children.get(name).getValue() : defaultValue;
235
+ }
236
+ getDouble(name, defaultValue) {
237
+ return this.children.has(name) ? this.children.get(name).getValue() : defaultValue;
238
+ }
239
+ getString(name, defaultValue) {
240
+ return this.children.has(name) ? this.children.get(name).getValue() : defaultValue;
241
+ }
242
+ remove(key) {
243
+ return this.children.delete(key);
244
+ }
245
+ entries() {
246
+ return this.children.entries();
247
+ }
248
+ has(key) {
249
+ return this.children.has(key);
250
+ }
251
+ size() {
252
+ return this.children.size;
253
+ }
254
+ // Thanks stackoverflow! https://stackoverflow.com/questions/35948335/how-can-i-check-if-two-map-objects-are-equal
255
+ equals(that) {
256
+ if (this.children.size !== that.children.size) {
257
+ return false;
258
+ }
259
+ for (const [key, val] of this.children) {
260
+ const testVal = that.children.get(key);
261
+ if (testVal === void 0 && !that.children.has(key)) {
262
+ return false;
263
+ }
264
+ if (val instanceof NBTTagCompound && testVal instanceof NBTTagCompound && !val.equals(testVal)) {
265
+ return false;
266
+ }
267
+ if (val instanceof ByteValue && testVal instanceof ByteValue && val.getValue() !== testVal.getValue()) {
268
+ return false;
269
+ }
270
+ if (val instanceof DoubleValue && testVal instanceof DoubleValue && val.getValue() !== testVal.getValue()) {
271
+ return false;
272
+ }
273
+ if (val instanceof FloatValue && testVal instanceof FloatValue && val.getValue() !== testVal.getValue()) {
274
+ return false;
275
+ }
276
+ if (val instanceof LongValue && testVal instanceof LongValue && val.getValue() !== testVal.getValue()) {
277
+ return false;
278
+ }
279
+ if (val instanceof NumberValue && testVal instanceof NumberValue && val.getValue() !== testVal.getValue()) {
280
+ return false;
281
+ }
282
+ if (val instanceof ShortValue && testVal instanceof ShortValue && val.getValue() !== testVal.getValue()) {
283
+ return false;
284
+ }
285
+ if (val instanceof StringValue && testVal instanceof StringValue && val.getValue() !== testVal.getValue()) {
286
+ return false;
287
+ }
288
+ }
289
+ return true;
290
+ }
291
+ }
292
+
293
+ class NBTWriter {
294
+ order;
295
+ buf;
296
+ useVarint = false;
297
+ constructor(out, byteOrder) {
298
+ this.buf = out;
299
+ this.order = byteOrder;
300
+ }
301
+ setUseVarint(useVarint) {
302
+ this.useVarint = useVarint;
303
+ }
304
+ writeList(list) {
305
+ this.writeTagHeader(NBTDefinitions.TAG_LIST, "");
306
+ this.writeListValue(list);
307
+ }
308
+ writeCompound(compound) {
309
+ this.writeTagHeader(NBTDefinitions.TAG_COMPOUND, compound.getName() ?? "");
310
+ this.writeCompoundValue(compound);
311
+ }
312
+ writeTagHeader(type, name) {
313
+ this.writeByteValue(type);
314
+ this.writeStringValue(name);
315
+ }
316
+ writeStringValue(value) {
317
+ if (value !== null) {
318
+ const bytes = Buffer.from(value, "utf8");
319
+ if (this.useVarint) {
320
+ this.buf.writeUnsignedVarInt(Buffer.byteLength(value));
321
+ } else {
322
+ this.writeShortValue(Buffer.byteLength(value));
323
+ }
324
+ this.buf.write(bytes);
325
+ } else if (this.useVarint) {
326
+ this.writeByteValue(0);
327
+ } else {
328
+ this.writeShortValue(0);
329
+ }
330
+ }
331
+ writeByteValue(value) {
332
+ this.buf.writeByte(value);
333
+ }
334
+ writeShortValue(value) {
335
+ if (this.order === ByteOrder.LITTLE_ENDIAN) {
336
+ this.buf.writeUnsignedShortLE(value);
337
+ } else {
338
+ this.buf.writeUnsignedShort(value);
339
+ }
340
+ }
341
+ writeIntegerValue(value) {
342
+ if (this.useVarint) {
343
+ this.buf.writeVarInt(value);
344
+ } else if (this.order === ByteOrder.LITTLE_ENDIAN) {
345
+ this.buf.writeUnsignedIntLE(value);
346
+ } else {
347
+ this.buf.writeUnsignedInt(value);
348
+ }
349
+ }
350
+ writeLongValue(value) {
351
+ if (this.useVarint) {
352
+ this.buf.writeVarLong(value);
353
+ } else if (this.order === ByteOrder.LITTLE_ENDIAN) {
354
+ this.buf.writeUnsignedLongLE(value);
355
+ } else {
356
+ this.buf.writeUnsignedLong(value);
357
+ }
358
+ }
359
+ writeFloatValue(value) {
360
+ if (this.order === ByteOrder.LITTLE_ENDIAN) {
361
+ this.buf.writeFloatLE(value);
362
+ } else {
363
+ this.buf.writeFloat(value);
364
+ }
365
+ }
366
+ writeDoubleValue(value) {
367
+ if (this.order === ByteOrder.LITTLE_ENDIAN) {
368
+ this.buf.writeDoubleLE(value);
369
+ } else {
370
+ this.buf.writeDouble(value);
371
+ }
372
+ }
373
+ writeByteArrayValue(value) {
374
+ this.writeIntegerValue(value.length);
375
+ this.buf.write(value);
376
+ }
377
+ writeIntegerArrayValue(value) {
378
+ this.writeIntegerValue(value.length);
379
+ value.forEach((v) => {
380
+ this.writeIntegerValue(v);
381
+ });
382
+ }
383
+ writeListValue(value) {
384
+ if (value.size > 0) {
385
+ const listNbtType = this.getNBTTypeFromValue(value.entries().next().value);
386
+ this.writeByteValue(listNbtType);
387
+ this.writeIntegerValue(value.size);
388
+ for (const rawValue of value) {
389
+ switch (listNbtType) {
390
+ case NBTDefinitions.TAG_BYTE:
391
+ this.writeByteValue(rawValue.getValue());
392
+ break;
393
+ case NBTDefinitions.TAG_SHORT:
394
+ this.writeShortValue(rawValue.getValue());
395
+ break;
396
+ case NBTDefinitions.TAG_INT:
397
+ this.writeIntegerValue(rawValue.getValue());
398
+ break;
399
+ case NBTDefinitions.TAG_LONG:
400
+ this.writeLongValue(rawValue.getValue());
401
+ break;
402
+ case NBTDefinitions.TAG_FLOAT:
403
+ this.writeFloatValue(rawValue.getValue());
404
+ break;
405
+ case NBTDefinitions.TAG_DOUBLE:
406
+ this.writeDoubleValue(rawValue.getValue());
407
+ break;
408
+ case NBTDefinitions.TAG_BYTE_ARRAY:
409
+ this.writeDoubleValue(rawValue);
410
+ break;
411
+ case NBTDefinitions.TAG_STRING:
412
+ this.writeStringValue(rawValue.getValue());
413
+ break;
414
+ case NBTDefinitions.TAG_LIST:
415
+ this.writeListValue(rawValue);
416
+ break;
417
+ case NBTDefinitions.TAG_COMPOUND:
418
+ this.writeCompoundValue(rawValue);
419
+ break;
420
+ case NBTDefinitions.TAG_INT_ARRAY:
421
+ this.writeIntegerArrayValue(rawValue);
422
+ break;
423
+ default:
424
+ throw new Error("Invalid NBTTagType");
425
+ }
426
+ }
427
+ } else {
428
+ this.writeByteValue(NBTDefinitions.TAG_BYTE);
429
+ this.writeIntegerValue(0);
430
+ }
431
+ }
432
+ writeCompoundValue(compound) {
433
+ for (const [key, value] of compound.entries()) {
434
+ const nbtType = this.getNBTTypeFromValue(value);
435
+ this.writeTagHeader(nbtType, key);
436
+ switch (nbtType) {
437
+ case NBTDefinitions.TAG_BYTE:
438
+ this.writeByteValue(value.getValue());
439
+ break;
440
+ case NBTDefinitions.TAG_SHORT:
441
+ this.writeShortValue(value.getValue());
442
+ break;
443
+ case NBTDefinitions.TAG_INT:
444
+ this.writeIntegerValue(value.getValue());
445
+ break;
446
+ case NBTDefinitions.TAG_LONG:
447
+ this.writeLongValue(value.getValue());
448
+ break;
449
+ case NBTDefinitions.TAG_FLOAT:
450
+ this.writeFloatValue(value.getValue());
451
+ break;
452
+ case NBTDefinitions.TAG_DOUBLE:
453
+ this.writeDoubleValue(value.getValue());
454
+ break;
455
+ case NBTDefinitions.TAG_BYTE_ARRAY:
456
+ this.writeByteArrayValue(value);
457
+ break;
458
+ case NBTDefinitions.TAG_STRING:
459
+ this.writeStringValue(value.getValue());
460
+ break;
461
+ case NBTDefinitions.TAG_LIST:
462
+ this.writeListValue(value);
463
+ break;
464
+ case NBTDefinitions.TAG_COMPOUND:
465
+ this.writeCompoundValue(value);
466
+ break;
467
+ case NBTDefinitions.TAG_INT_ARRAY:
468
+ this.writeIntegerValue(value);
469
+ break;
470
+ default:
471
+ throw new Error("Invalid NBTTagType");
472
+ }
473
+ }
474
+ this.writeByteValue(NBTDefinitions.TAG_END);
475
+ }
476
+ getNBTTypeFromValue(value) {
477
+ if (value instanceof ByteValue) {
478
+ return NBTDefinitions.TAG_BYTE;
479
+ }
480
+ if (value instanceof ShortValue) {
481
+ return NBTDefinitions.TAG_SHORT;
482
+ }
483
+ if (value instanceof NumberValue) {
484
+ return NBTDefinitions.TAG_INT;
485
+ }
486
+ if (value instanceof LongValue) {
487
+ return NBTDefinitions.TAG_LONG;
488
+ }
489
+ if (value instanceof FloatValue) {
490
+ return NBTDefinitions.TAG_FLOAT;
491
+ }
492
+ if (value instanceof DoubleValue) {
493
+ return NBTDefinitions.TAG_DOUBLE;
494
+ }
495
+ if (value instanceof Buffer) {
496
+ return NBTDefinitions.TAG_BYTE_ARRAY;
497
+ }
498
+ if (value instanceof StringValue) {
499
+ return NBTDefinitions.TAG_STRING;
500
+ }
501
+ if (value instanceof Set) {
502
+ return NBTDefinitions.TAG_LIST;
503
+ }
504
+ if (value instanceof NBTTagCompound) {
505
+ return NBTDefinitions.TAG_COMPOUND;
506
+ }
507
+ if (Array.isArray(value)) {
508
+ return NBTDefinitions.TAG_INT_ARRAY;
509
+ }
510
+ throw new TypeError(`Invalid NBT Data: Cannot deduce NBT type of class ${value.constructor.name} (${value})`);
511
+ }
512
+ }
513
+
514
+ export { NBTReader as N, NBTTagCompound as a, NBTWriter as b };
515
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkJUV3JpdGVyLUNXeDR1YW5PLmpzIiwic291cmNlcyI6WyIuLi9zcmMvTkJUUmVhZGVyLnRzIiwiLi4vc3JjL05CVFRhZ0NvbXBvdW5kLnRzIiwiLi4vc3JjL05CVFdyaXRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG5pbXBvcnQgeyBBbGxvY2F0aW9uIH0gZnJvbSAnLi9BbGxvY2F0aW9uJztcbmltcG9ydCBCaW5hcnlTdHJlYW0gZnJvbSAnQGpzcHJpc21hcmluZS9qc2JpbmFyeXV0aWxzJztcbmltcG9ydCB7IEJ5dGVPcmRlciB9IGZyb20gJy4vQnl0ZU9yZGVyJztcbmltcG9ydCB7IE5CVERlZmluaXRpb25zIH0gZnJvbSAnLi9OQlREZWZpbml0aW9ucyc7XG5pbXBvcnQgTkJUU3RyZWFtUmVhZGVyIGZyb20gJy4vTkJUU3RyZWFtUmVhZGVyJztcbmltcG9ydCBOQlRUYWdDb21wb3VuZCBmcm9tICcuL05CVFRhZ0NvbXBvdW5kJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTkJUUmVhZGVyIGV4dGVuZHMgTkJUU3RyZWFtUmVhZGVyIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoaW5wdXQ6IEJpbmFyeVN0cmVhbSwgYnl0ZU9yZGVyOiBCeXRlT3JkZXIpIHtcbiAgICAgICAgc3VwZXIoaW5wdXQsIGJ5dGVPcmRlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlTGlzdDxUYWdUeXBlPigpOiBTZXQ8VGFnVHlwZT4ge1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KHRoaXMuaXNVc2luZ1ZhcmludCgpID8gMiA6IDMsICdJbnZhbGlkIE5CVCBEYXRhOiBOb3QgZW5vdWdoIGRhdGEgdG8gcmVhZCBuZXcgdGFnJywgZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5yZWFkQnl0ZVZhbHVlKCkuZ2V0VmFsdWUoKSAhPT0gTkJURGVmaW5pdGlvbnMuVEFHX0xJU1QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBOQlQgRGF0YTogTm90IGxpc3QgdGFnIGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkVGFnTGlzdFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKCk6IE5CVFRhZ0NvbXBvdW5kIHtcbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCh0aGlzLmlzVXNpbmdWYXJpbnQoKSA/IDIgOiAzLCAnSW52YWxpZCBOQlQgRGF0YTogTm90IGVub3VnaCBkYXRhIHRvIHJlYWQgbmV3IHRhZycsIGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMucmVhZEJ5dGVWYWx1ZSgpLmdldFZhbHVlKCkgIT09IE5CVERlZmluaXRpb25zLlRBR19DT01QT1VORCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIE5CVCBEYXRhOiBObyByb290IHRhZyBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gdGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCByb290OiBOQlRUYWdDb21wb3VuZCA9IHRoaXMucmVhZFRhZ0NvbXBvdW5kVmFsdWUoKTtcbiAgICAgICAgcm9vdC5zZXROYW1lKG5hbWUpO1xuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRUYWdDb21wb3VuZFZhbHVlKCk6IE5CVFRhZ0NvbXBvdW5kIHtcbiAgICAgICAgdGhpcy5hbHRlckFsbG9jYXRpb25MaW1pdChBbGxvY2F0aW9uLkNPTVBPVU5EKTtcbiAgICAgICAgY29uc3QgY29tcG91bmQ6IE5CVFRhZ0NvbXBvdW5kID0gbmV3IE5CVFRhZ0NvbXBvdW5kKCk7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoMSwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIFRhZyBJRCBpbiBjb21wb3VuZCB0YWcnLCBmYWxzZSk7XG5cbiAgICAgICAgbGV0IHRhZ0lEID0gdGhpcy5yZWFkQnl0ZVZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgd2hpbGUgKHRhZ0lEICE9PSBOQlREZWZpbml0aW9ucy5UQUdfRU5EKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZ0lEKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURTpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRCeXRlVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NIT1JUOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZFNob3J0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVDpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRJbnRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTE9ORzpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRMb25nVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0ZMT0FUOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZEZsb2F0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0RPVUJMRTpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWREb3VibGVWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURV9BUlJBWTpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRCeXRlQXJyYXlWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU1RSSU5HOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MSVNUOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZFRhZ0xpc3RWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQ6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQ6IE5CVFRhZ0NvbXBvdW5kID0gdGhpcy5yZWFkVGFnQ29tcG91bmRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5zZXROYW1lKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVF9BUlJBWTpcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmQuYWRkVmFsdWUodGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpLCB0aGlzLnJlYWRJbnRBcnJheVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgTkJUIERhdGE6IFVua25vd24gdGFnIDwke3RhZ0lEfT5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dCgxLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgdGFnIElEIGluIHRhZyBjb21wb3VuZCcsIGZhbHNlKTtcbiAgICAgICAgICAgIHRhZ0lEID0gdGhpcy5yZWFkQnl0ZVZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21wb3VuZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRUYWdMaXN0VmFsdWUoKTogU2V0PGFueT4ge1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KHRoaXMuaXNVc2luZ1ZhcmludCgpID8gMiA6IDUsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBUQUdMaXN0IGhlYWRlcicsIGZhbHNlKTtcbiAgICAgICAgY29uc3QgbGlzdFR5cGU6IG51bWJlciA9IHRoaXMucmVhZEJ5dGVWYWx1ZSgpLmdldFZhbHVlKCk7XG4gICAgICAgIGxldCBsaXN0TGVuZ3RoOiBudW1iZXIgPSB0aGlzLnJlYWRJbnRWYWx1ZSgpLmdldFZhbHVlKCk7XG5cbiAgICAgICAgdGhpcy5hbHRlckFsbG9jYXRpb25MaW1pdChBbGxvY2F0aW9uLkFSUkFZX0xJU1QpO1xuICAgICAgICB0aGlzLmFsdGVyQWxsb2NhdGlvbkxpbWl0KEFsbG9jYXRpb24uUkVGRVJFTkNFKTtcblxuICAgICAgICBjb25zdCBiYWNraW5nTGlzdDogU2V0PGFueT4gPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgc3dpdGNoIChsaXN0VHlwZSkge1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRU5EOlxuICAgICAgICAgICAgICAgIGxpc3RMZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURTpcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdElucHV0KGxpc3RMZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBieXRlcyBmb3IgbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRTaG9ydFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU0hPUlQ6XG4gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dCgyICogbGlzdExlbmd0aCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIHNob3J0cyBmb3IgbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRTaG9ydFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UOlxuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoNCAqIGxpc3RMZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBpbnRzIGZvciBsaXN0Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZEludFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTE9ORzpcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdElucHV0KDggKiBsaXN0TGVuZ3RoLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgbG9uZ3MgZm9yIGxpc3QnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkTG9uZ1ZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRkxPQVQ6XG4gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dCg0ICogbGlzdExlbmd0aCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGZsb2F0cyBmb3IgbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRGbG9hdFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRE9VQkxFOlxuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoOCAqIGxpc3RMZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBkb3VibGVzIGZvciBsaXN0Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZERvdWJsZVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURV9BUlJBWTpcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkQnl0ZUFycmF5VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19TVFJJTkc6XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTElTVDpcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkVGFnTGlzdFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQ6XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZFRhZ0NvbXBvdW5kVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19JTlRfQVJSQVk6XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZEludEFycmF5VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBOQlQgRGF0YTogVW5rbm93biB0YWcgPCR7bGlzdFR5cGV9PmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJhY2tpbmdMaXN0O1xuICAgIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuaW1wb3J0IEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHsgQnl0ZU9yZGVyIH0gZnJvbSAnLi9CeXRlT3JkZXInO1xuaW1wb3J0IEJ5dGVWYWwgZnJvbSAnLi90eXBlcy9CeXRlVmFsJztcbmltcG9ydCBEb3VibGVWYWwgZnJvbSAnLi90eXBlcy9Eb3VibGVWYWwnO1xuaW1wb3J0IEZsb2F0VmFsIGZyb20gJy4vdHlwZXMvRmxvYXRWYWwnO1xuaW1wb3J0IExvbmdWYWwgZnJvbSAnLi90eXBlcy9Mb25nVmFsJztcbmltcG9ydCBOQlRSZWFkZXIgZnJvbSAnLi9OQlRSZWFkZXInO1xuaW1wb3J0IE5CVFdyaXRlciBmcm9tICcuL05CVFdyaXRlcic7XG5pbXBvcnQgTnVtYmVyVmFsIGZyb20gJy4vdHlwZXMvTnVtYmVyVmFsJztcbmltcG9ydCBTaG9ydFZhbCBmcm9tICcuL3R5cGVzL1Nob3J0VmFsJztcbmltcG9ydCBTdHJpbmdWYWwgZnJvbSAnLi90eXBlcy9TdHJpbmdWYWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOQlRUYWdDb21wb3VuZCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIHB1YmxpYyByZWFkb25seSBjaGlsZHJlbjogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcblxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZEZyb21GaWxlKHBhdGg6IHN0cmluZywgYnl0ZU9yZGVyOiBCeXRlT3JkZXIpOiBOQlRUYWdDb21wb3VuZCB7XG4gICAgICAgIHJldHVybiBOQlRUYWdDb21wb3VuZC5yZWFkRnJvbVN0cmVhbShuZXcgQmluYXJ5U3RyZWFtKGZzLnJlYWRGaWxlU3luYyhwYXRoKSksIGJ5dGVPcmRlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZWFkRnJvbVN0cmVhbShpbnB1dDogQmluYXJ5U3RyZWFtLCBieXRlT3JkZXI6IEJ5dGVPcmRlcik6IE5CVFRhZ0NvbXBvdW5kIHtcbiAgICAgICAgY29uc3QgcmVhZGVyOiBOQlRSZWFkZXIgPSBuZXcgTkJUUmVhZGVyKGlucHV0LCBieXRlT3JkZXIpO1xuICAgICAgICByZXR1cm4gcmVhZGVyLnBhcnNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldE5hbWUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFZhbHVlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOQlRUYWdDb21wb3VuZCAmJiAhKG5hbWUgPT09IHZhbHVlLmdldE5hbWUoKSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGFkZCBOQlRUYWdDb21wb3VuZCB3aXRoIG5hbWUgJHt2YWx1ZS5nZXROYW1lKCl9IGdpdmVuIG5hbWUgJHtuYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGlsZHJlbi5zZXQobmFtZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRDaGlsZCh0YWc6IE5CVFRhZ0NvbXBvdW5kKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4uc2V0KHRhZy5nZXROYW1lKCkhLCB0YWcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRMaXN0KG5hbWU6IHN0cmluZywgaW5zZXJ0OiBib29sZWFuKTogU2V0PGFueT4gfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4uaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5nZXQobmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5zZXJ0KSB7XG4gICAgICAgICAgICBjb25zdCBiYWNraW5nTGlzdDogU2V0PGFueT4gPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICB0aGlzLmFkZFZhbHVlKG5hbWUsIGJhY2tpbmdMaXN0KTtcbiAgICAgICAgICAgIHJldHVybiBiYWNraW5nTGlzdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb3VuZChuYW1lOiBzdHJpbmcsIGluc2VydDogYm9vbGVhbik6IE5CVFRhZ0NvbXBvdW5kIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uZ2V0KG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluc2VydCkge1xuICAgICAgICAgICAgY29uc3QgY29tcG91bmQ6IE5CVFRhZ0NvbXBvdW5kID0gbmV3IE5CVFRhZ0NvbXBvdW5kKCk7XG4gICAgICAgICAgICB0aGlzLmFkZFZhbHVlKG5hbWUsIGNvbXBvdW5kKTtcbiAgICAgICAgICAgIHJldHVybiBjb21wb3VuZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVRvU3RyZWFtKG91dDogQmluYXJ5U3RyZWFtLCBieXRlT3JkZXI6IEJ5dGVPcmRlcik6IHZvaWQge1xuICAgICAgICBjb25zdCB3cml0ZXI6IE5CVFdyaXRlciA9IG5ldyBOQlRXcml0ZXIob3V0LCBieXRlT3JkZXIpO1xuICAgICAgICB3cml0ZXIud3JpdGVDb21wb3VuZCh0aGlzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Qnl0ZShuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uaGFzKG5hbWUpID8gKHRoaXMuY2hpbGRyZW4uZ2V0KG5hbWUpIGFzIEJ5dGVWYWwpLmdldFZhbHVlKCkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNob3J0KG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5oYXMobmFtZSkgPyAodGhpcy5jaGlsZHJlbi5nZXQobmFtZSkgYXMgU2hvcnRWYWwpLmdldFZhbHVlKCkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE51bWJlcihuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uaGFzKG5hbWUpID8gKHRoaXMuY2hpbGRyZW4uZ2V0KG5hbWUpIGFzIE51bWJlclZhbCkuZ2V0VmFsdWUoKSA6IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TG9uZyhuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogYmlnaW50KTogYmlnaW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uaGFzKG5hbWUpID8gKHRoaXMuY2hpbGRyZW4uZ2V0KG5hbWUpIGFzIExvbmdWYWwpLmdldFZhbHVlKCkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZsb2F0KG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5oYXMobmFtZSkgPyAodGhpcy5jaGlsZHJlbi5nZXQobmFtZSkgYXMgRmxvYXRWYWwpLmdldFZhbHVlKCkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERvdWJsZShuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uaGFzKG5hbWUpID8gKHRoaXMuY2hpbGRyZW4uZ2V0KG5hbWUpIGFzIERvdWJsZVZhbCkuZ2V0VmFsdWUoKSA6IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3RyaW5nKG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5oYXMobmFtZSkgPyAodGhpcy5jaGlsZHJlbi5nZXQobmFtZSkgYXMgU3RyaW5nVmFsKS5nZXRWYWx1ZSgpIDogZGVmYXVsdFZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uZGVsZXRlKGtleSk7XG4gICAgfVxuXG4gICAgcHVibGljIGVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBhbnldPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmVudHJpZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmhhcyhrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLnNpemU7XG4gICAgfVxuXG4gICAgLy8gVGhhbmtzIHN0YWNrb3ZlcmZsb3chIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1OTQ4MzM1L2hvdy1jYW4taS1jaGVjay1pZi10d28tbWFwLW9iamVjdHMtYXJlLWVxdWFsXG4gICAgcHVibGljIGVxdWFscyh0aGF0OiBOQlRUYWdDb21wb3VuZCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5zaXplICE9PSB0aGF0LmNoaWxkcmVuLnNpemUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0VmFsID0gdGhhdC5jaGlsZHJlbi5nZXQoa2V5KTtcblxuICAgICAgICAgICAgaWYgKHRlc3RWYWwgPT09IHVuZGVmaW5lZCAmJiAhdGhhdC5jaGlsZHJlbi5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIE5CVFRhZ0NvbXBvdW5kICYmIHRlc3RWYWwgaW5zdGFuY2VvZiBOQlRUYWdDb21wb3VuZCAmJiAhdmFsLmVxdWFscyh0ZXN0VmFsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIEJ5dGVWYWwgJiYgdGVzdFZhbCBpbnN0YW5jZW9mIEJ5dGVWYWwgJiYgdmFsLmdldFZhbHVlKCkgIT09IHRlc3RWYWwuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIERvdWJsZVZhbCAmJiB0ZXN0VmFsIGluc3RhbmNlb2YgRG91YmxlVmFsICYmIHZhbC5nZXRWYWx1ZSgpICE9PSB0ZXN0VmFsLmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBGbG9hdFZhbCAmJiB0ZXN0VmFsIGluc3RhbmNlb2YgRmxvYXRWYWwgJiYgdmFsLmdldFZhbHVlKCkgIT09IHRlc3RWYWwuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIExvbmdWYWwgJiYgdGVzdFZhbCBpbnN0YW5jZW9mIExvbmdWYWwgJiYgdmFsLmdldFZhbHVlKCkgIT09IHRlc3RWYWwuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIE51bWJlclZhbCAmJiB0ZXN0VmFsIGluc3RhbmNlb2YgTnVtYmVyVmFsICYmIHZhbC5nZXRWYWx1ZSgpICE9PSB0ZXN0VmFsLmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBTaG9ydFZhbCAmJiB0ZXN0VmFsIGluc3RhbmNlb2YgU2hvcnRWYWwgJiYgdmFsLmdldFZhbHVlKCkgIT09IHRlc3RWYWwuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIFN0cmluZ1ZhbCAmJiB0ZXN0VmFsIGluc3RhbmNlb2YgU3RyaW5nVmFsICYmIHZhbC5nZXRWYWx1ZSgpICE9PSB0ZXN0VmFsLmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgQmluYXJ5U3RyZWFtIGZyb20gJ0Bqc3ByaXNtYXJpbmUvanNiaW5hcnl1dGlscyc7XG5pbXBvcnQgeyBCeXRlT3JkZXIgfSBmcm9tICcuL0J5dGVPcmRlcic7XG5pbXBvcnQgQnl0ZVZhbCBmcm9tICcuL3R5cGVzL0J5dGVWYWwnO1xuaW1wb3J0IERvdWJsZVZhbCBmcm9tICcuL3R5cGVzL0RvdWJsZVZhbCc7XG5pbXBvcnQgRmxvYXRWYWwgZnJvbSAnLi90eXBlcy9GbG9hdFZhbCc7XG5pbXBvcnQgTG9uZ1ZhbCBmcm9tICcuL3R5cGVzL0xvbmdWYWwnO1xuaW1wb3J0IHsgTkJURGVmaW5pdGlvbnMgfSBmcm9tICcuL05CVERlZmluaXRpb25zJztcbmltcG9ydCBOQlRUYWdDb21wb3VuZCBmcm9tICcuL05CVFRhZ0NvbXBvdW5kJztcbmltcG9ydCBOdW1iZXJWYWwgZnJvbSAnLi90eXBlcy9OdW1iZXJWYWwnO1xuaW1wb3J0IFNob3J0VmFsIGZyb20gJy4vdHlwZXMvU2hvcnRWYWwnO1xuaW1wb3J0IFN0cmluZ1ZhbCBmcm9tICcuL3R5cGVzL1N0cmluZ1ZhbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5CVFdyaXRlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBvcmRlcjogQnl0ZU9yZGVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYnVmOiBCaW5hcnlTdHJlYW07XG5cbiAgICBwcml2YXRlIHVzZVZhcmludCA9IGZhbHNlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG91dDogQmluYXJ5U3RyZWFtLCBieXRlT3JkZXI6IEJ5dGVPcmRlcikge1xuICAgICAgICB0aGlzLmJ1ZiA9IG91dDtcbiAgICAgICAgdGhpcy5vcmRlciA9IGJ5dGVPcmRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VXNlVmFyaW50KHVzZVZhcmludDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnVzZVZhcmludCA9IHVzZVZhcmludDtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVMaXN0KGxpc3Q6IFNldDxhbnk+KTogdm9pZCB7XG4gICAgICAgIHRoaXMud3JpdGVUYWdIZWFkZXIoTkJURGVmaW5pdGlvbnMuVEFHX0xJU1QsICcnKTtcbiAgICAgICAgdGhpcy53cml0ZUxpc3RWYWx1ZShsaXN0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVDb21wb3VuZChjb21wb3VuZDogTkJUVGFnQ29tcG91bmQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZ0hlYWRlcihOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQsIGNvbXBvdW5kLmdldE5hbWUoKSA/PyAnJyk7XG4gICAgICAgIHRoaXMud3JpdGVDb21wb3VuZFZhbHVlKGNvbXBvdW5kKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlVGFnSGVhZGVyKHR5cGU6IG51bWJlciwgbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUodHlwZSk7XG4gICAgICAgIHRoaXMud3JpdGVTdHJpbmdWYWx1ZShuYW1lKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlU3RyaW5nVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBieXRlcyA9IEJ1ZmZlci5mcm9tKHZhbHVlLCAndXRmOCcpO1xuICAgICAgICAgICAgaWYgKHRoaXMudXNlVmFyaW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZFZhckludChCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlU2hvcnRWYWx1ZShCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZShieXRlcyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy51c2VWYXJpbnQpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUoMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlU2hvcnRWYWx1ZSgwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUJ5dGVWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlQnl0ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlU2hvcnRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZFNob3J0TEUodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZFNob3J0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVJbnRlZ2VyVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy51c2VWYXJpbnQpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlVmFySW50KHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZEludExFKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlVW5zaWduZWRJbnQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZUxvbmdWYWx1ZSh2YWx1ZTogYmlnaW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnVzZVZhcmludCkge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVWYXJMb25nKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZExvbmdMRSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZVVuc2lnbmVkTG9uZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlRmxvYXRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVGbG9hdExFKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlRmxvYXQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZURvdWJsZVZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3JkZXIgPT09IEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZURvdWJsZUxFKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlRG91YmxlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVCeXRlQXJyYXlWYWx1ZSh2YWx1ZTogQnVmZmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMud3JpdGVJbnRlZ2VyVmFsdWUodmFsdWUubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGUodmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVJbnRlZ2VyQXJyYXlWYWx1ZSh2YWx1ZTogbnVtYmVyW10pIHtcbiAgICAgICAgdGhpcy53cml0ZUludGVnZXJWYWx1ZSh2YWx1ZS5sZW5ndGgpO1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHYpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlTGlzdFZhbHVlKHZhbHVlOiBTZXQ8YW55Pik6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3ROYnRUeXBlID0gdGhpcy5nZXROQlRUeXBlRnJvbVZhbHVlKHZhbHVlLmVudHJpZXMoKS5uZXh0KCkudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy53cml0ZUJ5dGVWYWx1ZShsaXN0TmJ0VHlwZSk7XG4gICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHZhbHVlLnNpemUpO1xuICAgICAgICAgICAgZm9yIChjb25zdCByYXdWYWx1ZSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobGlzdE5idFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUocmF3VmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU0hPUlQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlU2hvcnRWYWx1ZShyYXdWYWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19JTlQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHJhd1ZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0xPTkc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlTG9uZ1ZhbHVlKHJhd1ZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0ZMT0FUOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUZsb2F0VmFsdWUocmF3VmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRE9VQkxFOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZURvdWJsZVZhbHVlKHJhd1ZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0JZVEVfQVJSQVk6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlRG91YmxlVmFsdWUocmF3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NUUklORzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVTdHJpbmdWYWx1ZShyYXdWYWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MSVNUOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUxpc3RWYWx1ZShyYXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlQ29tcG91bmRWYWx1ZShyYXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UX0FSUkFZOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUludGVnZXJBcnJheVZhbHVlKHJhd1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIE5CVFRhZ1R5cGUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlQnl0ZVZhbHVlKE5CVERlZmluaXRpb25zLlRBR19CWVRFKTtcbiAgICAgICAgICAgIHRoaXMud3JpdGVJbnRlZ2VyVmFsdWUoMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlQ29tcG91bmRWYWx1ZShjb21wb3VuZDogTkJUVGFnQ29tcG91bmQpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgY29tcG91bmQuZW50cmllcygpKSB7XG4gICAgICAgICAgICBjb25zdCBuYnRUeXBlID0gdGhpcy5nZXROQlRUeXBlRnJvbVZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMud3JpdGVUYWdIZWFkZXIobmJ0VHlwZSwga2V5KTtcbiAgICAgICAgICAgIHN3aXRjaCAobmJ0VHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0JZVEU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUodmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NIT1JUOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlU2hvcnRWYWx1ZSh2YWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MT05HOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlTG9uZ1ZhbHVlKHZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19GTE9BVDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUZsb2F0VmFsdWUodmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0RPVUJMRTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZURvdWJsZVZhbHVlKHZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19CWVRFX0FSUkFZOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlQnl0ZUFycmF5VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19TVFJJTkc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVTdHJpbmdWYWx1ZSh2YWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTElTVDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUxpc3RWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0NPTVBPVU5EOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlQ29tcG91bmRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVF9BUlJBWTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUludGVnZXJWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBOQlRUYWdUeXBlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndyaXRlQnl0ZVZhbHVlKE5CVERlZmluaXRpb25zLlRBR19FTkQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TkJUVHlwZUZyb21WYWx1ZSh2YWx1ZTogYW55KTogTkJURGVmaW5pdGlvbnMge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCeXRlVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0JZVEU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2hvcnRWYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfU0hPUlQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0lOVDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb25nVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0xPTkc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmxvYXRWYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfRkxPQVQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0RPVUJMRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfQllURV9BUlJBWTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmdWYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfU1RSSU5HO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgcmV0dXJuIE5CVERlZmluaXRpb25zLlRBR19MSVNUO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5CVFRhZ0NvbXBvdW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0NPTVBPVU5EO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5CVERlZmluaXRpb25zLlRBR19JTlRfQVJSQVk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIE5CVCBEYXRhOiBDYW5ub3QgZGVkdWNlIE5CVCB0eXBlIG9mIGNsYXNzICR7dmFsdWUuY29uc3RydWN0b3IubmFtZX0gKCR7dmFsdWV9KWApO1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJCeXRlVmFsIiwiRG91YmxlVmFsIiwiRmxvYXRWYWwiLCJMb25nVmFsIiwiTnVtYmVyVmFsIiwiU2hvcnRWYWwiLCJTdHJpbmdWYWwiXSwibWFwcGluZ3MiOiI7Ozs7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