@gmod/bam 1.1.8 → 1.1.9

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 (73) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +2 -3
  3. package/dist/bai.d.ts +2 -0
  4. package/dist/bai.js +300 -548
  5. package/dist/bai.js.map +1 -0
  6. package/dist/bamFile.d.ts +4 -6
  7. package/dist/bamFile.js +675 -1203
  8. package/dist/bamFile.js.map +1 -0
  9. package/dist/chunk.js +34 -69
  10. package/dist/chunk.js.map +1 -0
  11. package/dist/constants.js +27 -35
  12. package/dist/constants.js.map +1 -0
  13. package/dist/csi.js +317 -515
  14. package/dist/csi.js.map +1 -0
  15. package/dist/errors.js +64 -120
  16. package/dist/errors.js.map +1 -0
  17. package/dist/htsget.js +275 -396
  18. package/dist/htsget.js.map +1 -0
  19. package/dist/index.js +16 -54
  20. package/dist/index.js.map +1 -0
  21. package/dist/indexFile.d.ts +1 -2
  22. package/dist/indexFile.js +77 -163
  23. package/dist/indexFile.js.map +1 -0
  24. package/dist/record.js +496 -707
  25. package/dist/record.js.map +1 -0
  26. package/dist/sam.js +16 -49
  27. package/dist/sam.js.map +1 -0
  28. package/dist/util.d.ts +0 -1
  29. package/dist/util.js +115 -126
  30. package/dist/util.js.map +1 -0
  31. package/dist/virtualOffset.js +44 -77
  32. package/dist/virtualOffset.js.map +1 -0
  33. package/esm/bai.d.ts +26 -0
  34. package/esm/bai.js +191 -0
  35. package/esm/bai.js.map +1 -0
  36. package/esm/bamFile.d.ts +77 -0
  37. package/esm/bamFile.js +388 -0
  38. package/esm/bamFile.js.map +1 -0
  39. package/esm/chunk.d.ts +18 -0
  40. package/esm/chunk.js +33 -0
  41. package/esm/chunk.js.map +1 -0
  42. package/esm/constants.d.ts +15 -0
  43. package/esm/constants.js +27 -0
  44. package/esm/constants.js.map +1 -0
  45. package/esm/csi.d.ts +35 -0
  46. package/esm/csi.js +209 -0
  47. package/esm/csi.js.map +1 -0
  48. package/esm/errors.d.ts +23 -0
  49. package/esm/errors.js +24 -0
  50. package/esm/errors.js.map +1 -0
  51. package/esm/htsget.d.ts +33 -0
  52. package/esm/htsget.js +100 -0
  53. package/esm/htsget.js.map +1 -0
  54. package/esm/index.d.ts +6 -0
  55. package/esm/index.js +7 -0
  56. package/esm/index.js.map +1 -0
  57. package/esm/indexFile.d.ts +27 -0
  58. package/esm/indexFile.js +27 -0
  59. package/esm/indexFile.js.map +1 -0
  60. package/esm/record.d.ts +88 -0
  61. package/esm/record.js +534 -0
  62. package/esm/record.js.map +1 -0
  63. package/esm/sam.d.ts +7 -0
  64. package/esm/sam.js +16 -0
  65. package/esm/sam.js.map +1 -0
  66. package/esm/util.d.ts +35 -0
  67. package/esm/util.js +92 -0
  68. package/esm/util.js.map +1 -0
  69. package/esm/virtualOffset.d.ts +10 -0
  70. package/esm/virtualOffset.js +37 -0
  71. package/esm/virtualOffset.js.map +1 -0
  72. package/package.json +21 -29
  73. package/dist/declare.d.js +0 -2
package/dist/record.js CHANGED
@@ -1,754 +1,543 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
4
-
5
- var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
6
-
7
- _Object$defineProperty(exports, "__esModule", {
8
- value: true
9
- });
10
-
11
- exports.default = void 0;
12
-
13
- var _flags2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/flags"));
14
-
15
- var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int"));
16
-
17
- var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
18
-
19
- var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));
20
-
21
- var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
22
-
23
- var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
24
-
25
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));
26
-
27
- var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));
28
-
29
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
30
-
31
- var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
32
-
33
- var _constants = _interopRequireDefault(require("./constants"));
34
-
35
- var _context;
36
-
37
- var SEQRET_DECODER = (0, _map.default)(_context = '=ACMGRSVTWYHKDBN'.split('')).call(_context, function (s) {
38
- return s.charCodeAt(0);
39
- });
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ /* eslint-disable @typescript-eslint/no-empty-function */
7
+ var constants_1 = __importDefault(require("./constants"));
8
+ var SEQRET_DECODER = '=ACMGRSVTWYHKDBN'.split('').map(function (s) { return s.charCodeAt(0); });
40
9
  var CIGAR_DECODER = 'MIDNSHP=X???????'.split('');
41
10
  /**
42
11
  * Class of each BAM record returned by this API.
43
12
  */
44
-
45
- var BamRecord = /*#__PURE__*/function () {
46
- function BamRecord(args) {
47
- (0, _classCallCheck2.default)(this, BamRecord);
48
- (0, _defineProperty2.default)(this, "data", void 0);
49
- (0, _defineProperty2.default)(this, "bytes", void 0);
50
- (0, _defineProperty2.default)(this, "flags", void 0);
51
- (0, _defineProperty2.default)(this, "_id", void 0);
52
- (0, _defineProperty2.default)(this, "_refID", void 0);
53
- (0, _defineProperty2.default)(this, "_tagOffset", undefined);
54
- (0, _defineProperty2.default)(this, "_tagList", []);
55
- (0, _defineProperty2.default)(this, "_allTagsParsed", false);
56
- this.data = {};
57
- this.bytes = {
58
- start: args.bytes.start,
59
- end: args.bytes.end,
60
- byteArray: args.bytes.byteArray
61
- };
62
- this._id = args.fileOffset;
63
- var _this$bytes = this.bytes,
64
- start = _this$bytes.start,
65
- byteArray = _this$bytes.byteArray;
66
- this._refID = byteArray.readInt32LE(start + 4);
67
- this.data.start = byteArray.readInt32LE(start + 8);
68
- this.flags = (byteArray.readInt32LE(start + 16) & 0xffff0000) >> 16;
69
- }
70
-
71
- (0, _createClass2.default)(BamRecord, [{
72
- key: "get",
73
- value: function get(field) {
74
- //@ts-ignore
75
- if (this[field]) {
13
+ var BamRecord = /** @class */ (function () {
14
+ function BamRecord(args) {
15
+ this._tagOffset = undefined;
16
+ this._tagList = [];
17
+ this._allTagsParsed = false;
18
+ this.data = {};
19
+ this.bytes = {
20
+ start: args.bytes.start,
21
+ end: args.bytes.end,
22
+ byteArray: args.bytes.byteArray,
23
+ };
24
+ this._id = args.fileOffset;
25
+ var _a = this.bytes, start = _a.start, byteArray = _a.byteArray;
26
+ this._refID = byteArray.readInt32LE(start + 4);
27
+ this.data.start = byteArray.readInt32LE(start + 8);
28
+ this.flags = (byteArray.readInt32LE(start + 16) & 0xffff0000) >> 16;
29
+ }
30
+ BamRecord.prototype.get = function (field) {
76
31
  //@ts-ignore
77
- if (this.data[field]) {
78
- return this.data[field];
79
- } //@ts-ignore
80
-
81
-
82
- this.data[field] = this[field]();
83
- return this.data[field];
84
- }
85
-
86
- return this._get(field.toLowerCase());
87
- }
88
- }, {
89
- key: "end",
90
- value: function end() {
91
- return this.get('start') + (this.get('length_on_ref') || this.get('seq_length') || undefined);
92
- }
93
- }, {
94
- key: "seq_id",
95
- value: function seq_id() {
96
- return this._refID;
97
- } // same as get(), except requires lower-case arguments. used
32
+ if (this[field]) {
33
+ //@ts-ignore
34
+ if (this.data[field]) {
35
+ return this.data[field];
36
+ }
37
+ //@ts-ignore
38
+ this.data[field] = this[field]();
39
+ return this.data[field];
40
+ }
41
+ return this._get(field.toLowerCase());
42
+ };
43
+ BamRecord.prototype.end = function () {
44
+ return (this.get('start') +
45
+ (this.get('length_on_ref') || this.get('seq_length') || undefined));
46
+ };
47
+ BamRecord.prototype.seq_id = function () {
48
+ return this._refID;
49
+ };
50
+ // same as get(), except requires lower-case arguments. used
98
51
  // internally to save lots of calls to field.toLowerCase()
99
-
100
- }, {
101
- key: "_get",
102
- value: function _get(field) {
103
- if (field in this.data) {
52
+ BamRecord.prototype._get = function (field) {
53
+ if (field in this.data) {
54
+ return this.data[field];
55
+ }
56
+ this.data[field] = this._parseTag(field);
104
57
  return this.data[field];
105
- }
106
-
107
- this.data[field] = this._parseTag(field);
108
- return this.data[field];
109
- }
110
- }, {
111
- key: "_tags",
112
- value: function _tags() {
113
- var _context2,
114
- _this = this;
115
-
116
- this._parseAllTags();
117
-
118
- var tags = ['seq'];
119
-
120
- if (!this.isSegmentUnmapped()) {
121
- tags.push('start', 'end', 'strand', 'score', 'qual', 'MQ', 'CIGAR', 'length_on_ref', 'template_length');
122
- }
123
-
124
- if (this.isPaired()) {
125
- tags.push('next_segment_position', 'pair_orientation');
126
- }
127
-
128
- tags = (0, _concat.default)(tags).call(tags, this._tagList || []);
129
- (0, _forEach.default)(_context2 = (0, _keys.default)(this.data)).call(_context2, function (k) {
130
- if (k[0] !== '_' && k !== 'next_seq_id') {
131
- tags.push(k);
58
+ };
59
+ BamRecord.prototype._tags = function () {
60
+ var _this = this;
61
+ this._parseAllTags();
62
+ var tags = ['seq'];
63
+ if (!this.isSegmentUnmapped()) {
64
+ tags.push('start', 'end', 'strand', 'score', 'qual', 'MQ', 'CIGAR', 'length_on_ref', 'template_length');
132
65
  }
133
- });
134
- var seen = {};
135
- tags = (0, _filter.default)(tags).call(tags, function (t) {
136
- if (t in _this.data && _this.data[t] === undefined || t === 'CG' || t === 'cg') {
137
- return false;
66
+ if (this.isPaired()) {
67
+ tags.push('next_segment_position', 'pair_orientation');
138
68
  }
139
-
140
- var lt = t.toLowerCase();
141
- var s = seen[lt];
142
- seen[lt] = true;
143
- return !s;
144
- });
145
- return tags;
146
- }
147
- }, {
148
- key: "parent",
149
- value: function parent() {
150
- return undefined;
151
- }
152
- }, {
153
- key: "children",
154
- value: function children() {
155
- return this.get('subfeatures');
156
- }
157
- }, {
158
- key: "id",
159
- value: function id() {
160
- return this._id;
161
- } // special parsers
162
-
69
+ tags = tags.concat(this._tagList || []);
70
+ Object.keys(this.data).forEach(function (k) {
71
+ if (k[0] !== '_' && k !== 'next_seq_id') {
72
+ tags.push(k);
73
+ }
74
+ });
75
+ var seen = {};
76
+ tags = tags.filter(function (t) {
77
+ if ((t in _this.data && _this.data[t] === undefined) ||
78
+ t === 'CG' ||
79
+ t === 'cg') {
80
+ return false;
81
+ }
82
+ var lt = t.toLowerCase();
83
+ var s = seen[lt];
84
+ seen[lt] = true;
85
+ return !s;
86
+ });
87
+ return tags;
88
+ };
89
+ BamRecord.prototype.parent = function () {
90
+ return undefined;
91
+ };
92
+ BamRecord.prototype.children = function () {
93
+ return this.get('subfeatures');
94
+ };
95
+ BamRecord.prototype.id = function () {
96
+ return this._id;
97
+ };
98
+ // special parsers
163
99
  /**
164
100
  * Mapping quality score.
165
101
  */
166
-
167
- }, {
168
- key: "mq",
169
- value: function mq() {
170
- var mq = (this.get('_bin_mq_nl') & 0xff00) >> 8;
171
- return mq === 255 ? undefined : mq;
172
- }
173
- }, {
174
- key: "score",
175
- value: function score() {
176
- return this.get('mq');
177
- }
178
- }, {
179
- key: "qual",
180
- value: function qual() {
181
- var _this$qualRaw;
182
-
183
- return (_this$qualRaw = this.qualRaw()) === null || _this$qualRaw === void 0 ? void 0 : _this$qualRaw.join(' ');
184
- }
185
- }, {
186
- key: "qualRaw",
187
- value: function qualRaw() {
188
- if (this.isSegmentUnmapped()) {
189
- return undefined;
190
- }
191
-
192
- var byteArray = this.bytes.byteArray;
193
- var p = this.bytes.start + 36 + this.get('_l_read_name') + this.get('_n_cigar_op') * 4 + this.get('_seq_bytes');
194
- var lseq = this.get('seq_length');
195
- var qseq = Buffer.allocUnsafe(lseq);
196
-
197
- for (var j = 0; j < lseq; ++j) {
198
- qseq[j] = byteArray[p + j];
199
- }
200
-
201
- return qseq;
202
- }
203
- }, {
204
- key: "strand",
205
- value: function strand() {
206
- return this.isReverseComplemented() ? -1 : 1;
207
- }
208
- }, {
209
- key: "multi_segment_next_segment_strand",
210
- value: function multi_segment_next_segment_strand() {
211
- if (this.isMateUnmapped()) {
212
- return undefined;
213
- }
214
-
215
- return this.isMateReverseComplemented() ? -1 : 1;
216
- }
217
- }, {
218
- key: "name",
219
- value: function name() {
220
- return this.get('_read_name');
221
- }
222
- }, {
223
- key: "_read_name",
224
- value: function _read_name() {
225
- var nl = this.get('_l_read_name');
226
- return this.bytes.byteArray.toString('ascii', this.bytes.start + 36, this.bytes.start + 36 + nl - 1);
227
- }
102
+ BamRecord.prototype.mq = function () {
103
+ var mq = (this.get('_bin_mq_nl') & 0xff00) >> 8;
104
+ return mq === 255 ? undefined : mq;
105
+ };
106
+ BamRecord.prototype.score = function () {
107
+ return this.get('mq');
108
+ };
109
+ BamRecord.prototype.qual = function () {
110
+ var _a;
111
+ return (_a = this.qualRaw()) === null || _a === void 0 ? void 0 : _a.join(' ');
112
+ };
113
+ BamRecord.prototype.qualRaw = function () {
114
+ if (this.isSegmentUnmapped()) {
115
+ return undefined;
116
+ }
117
+ var byteArray = this.bytes.byteArray;
118
+ var p = this.bytes.start +
119
+ 36 +
120
+ this.get('_l_read_name') +
121
+ this.get('_n_cigar_op') * 4 +
122
+ this.get('_seq_bytes');
123
+ var lseq = this.get('seq_length');
124
+ var qseq = Buffer.allocUnsafe(lseq);
125
+ for (var j = 0; j < lseq; ++j) {
126
+ qseq[j] = byteArray[p + j];
127
+ }
128
+ return qseq;
129
+ };
130
+ BamRecord.prototype.strand = function () {
131
+ return this.isReverseComplemented() ? -1 : 1;
132
+ };
133
+ BamRecord.prototype.multi_segment_next_segment_strand = function () {
134
+ if (this.isMateUnmapped()) {
135
+ return undefined;
136
+ }
137
+ return this.isMateReverseComplemented() ? -1 : 1;
138
+ };
139
+ BamRecord.prototype.name = function () {
140
+ return this.get('_read_name');
141
+ };
142
+ BamRecord.prototype._read_name = function () {
143
+ var nl = this.get('_l_read_name');
144
+ return this.bytes.byteArray.toString('ascii', this.bytes.start + 36, this.bytes.start + 36 + nl - 1);
145
+ };
228
146
  /**
229
147
  * Get the value of a tag, parsing the tags as far as necessary.
230
148
  * Only called if we have not already parsed that field.
231
149
  */
232
-
233
- }, {
234
- key: "_parseTag",
235
- value: function _parseTag(tagName) {
236
- // if all of the tags have been parsed and we're still being
237
- // called, we already know that we have no such tag, because
238
- // it would already have been cached.
239
- if (this._allTagsParsed) {
240
- return undefined;
241
- }
242
-
243
- var byteArray = this.bytes.byteArray;
244
- var p = this._tagOffset || this.bytes.start + 36 + this.get('_l_read_name') + this.get('_n_cigar_op') * 4 + this.get('_seq_bytes') + this.get('seq_length');
245
- var blockEnd = this.bytes.end;
246
- var lcTag;
247
-
248
- while (p < blockEnd && lcTag !== tagName) {
249
- var tag = String.fromCharCode(byteArray[p], byteArray[p + 1]);
250
- lcTag = tag.toLowerCase();
251
- var type = String.fromCharCode(byteArray[p + 2]);
252
- p += 3;
253
- var value = void 0;
254
-
255
- switch (type) {
256
- case 'A':
257
- value = String.fromCharCode(byteArray[p]);
258
- p += 1;
259
- break;
260
-
261
- case 'i':
262
- value = byteArray.readInt32LE(p);
263
- p += 4;
264
- break;
265
-
266
- case 'I':
267
- value = byteArray.readUInt32LE(p);
268
- p += 4;
269
- break;
270
-
271
- case 'c':
272
- value = byteArray.readInt8(p);
273
- p += 1;
274
- break;
275
-
276
- case 'C':
277
- value = byteArray.readUInt8(p);
278
- p += 1;
279
- break;
280
-
281
- case 's':
282
- value = byteArray.readInt16LE(p);
283
- p += 2;
284
- break;
285
-
286
- case 'S':
287
- value = byteArray.readUInt16LE(p);
288
- p += 2;
289
- break;
290
-
291
- case 'f':
292
- value = byteArray.readFloatLE(p);
293
- p += 4;
294
- break;
295
-
296
- case 'Z':
297
- case 'H':
298
- value = '';
299
-
300
- while (p <= blockEnd) {
301
- var cc = byteArray[p++];
302
-
303
- if (cc === 0) {
304
- break;
305
- } else {
306
- value += String.fromCharCode(cc);
307
- }
308
- }
309
-
310
- break;
311
-
312
- case 'B':
313
- {
314
- value = '';
315
- var _cc = byteArray[p++];
316
- var Btype = String.fromCharCode(_cc);
317
- var limit = byteArray.readInt32LE(p);
318
- p += 4;
319
-
320
- if (Btype === 'i') {
321
- if (tag === 'CG') {
322
- for (var k = 0; k < limit; k++) {
323
- var cigop = byteArray.readInt32LE(p);
324
- var lop = cigop >> 4;
325
- var op = CIGAR_DECODER[cigop & 0xf];
326
- value += lop + op;
150
+ BamRecord.prototype._parseTag = function (tagName) {
151
+ // if all of the tags have been parsed and we're still being
152
+ // called, we already know that we have no such tag, because
153
+ // it would already have been cached.
154
+ if (this._allTagsParsed) {
155
+ return undefined;
156
+ }
157
+ var byteArray = this.bytes.byteArray;
158
+ var p = this._tagOffset ||
159
+ this.bytes.start +
160
+ 36 +
161
+ this.get('_l_read_name') +
162
+ this.get('_n_cigar_op') * 4 +
163
+ this.get('_seq_bytes') +
164
+ this.get('seq_length');
165
+ var blockEnd = this.bytes.end;
166
+ var lcTag;
167
+ while (p < blockEnd && lcTag !== tagName) {
168
+ var tag = String.fromCharCode(byteArray[p], byteArray[p + 1]);
169
+ lcTag = tag.toLowerCase();
170
+ var type = String.fromCharCode(byteArray[p + 2]);
171
+ p += 3;
172
+ var value = void 0;
173
+ switch (type) {
174
+ case 'A':
175
+ value = String.fromCharCode(byteArray[p]);
176
+ p += 1;
177
+ break;
178
+ case 'i':
179
+ value = byteArray.readInt32LE(p);
327
180
  p += 4;
328
- }
329
- } else {
330
- for (var _k = 0; _k < limit; _k++) {
331
- value += byteArray.readInt32LE(p);
332
-
333
- if (_k + 1 < limit) {
334
- value += ',';
335
- }
336
-
181
+ break;
182
+ case 'I':
183
+ value = byteArray.readUInt32LE(p);
337
184
  p += 4;
338
- }
339
- }
340
- }
341
-
342
- if (Btype === 'I') {
343
- if (tag === 'CG') {
344
- for (var _k2 = 0; _k2 < limit; _k2++) {
345
- var _cigop = byteArray.readUInt32LE(p);
346
-
347
- var _lop = _cigop >> 4;
348
-
349
- var _op = CIGAR_DECODER[_cigop & 0xf];
350
- value += _lop + _op;
185
+ break;
186
+ case 'c':
187
+ value = byteArray.readInt8(p);
188
+ p += 1;
189
+ break;
190
+ case 'C':
191
+ value = byteArray.readUInt8(p);
192
+ p += 1;
193
+ break;
194
+ case 's':
195
+ value = byteArray.readInt16LE(p);
196
+ p += 2;
197
+ break;
198
+ case 'S':
199
+ value = byteArray.readUInt16LE(p);
200
+ p += 2;
201
+ break;
202
+ case 'f':
203
+ value = byteArray.readFloatLE(p);
351
204
  p += 4;
352
- }
353
- } else {
354
- for (var _k3 = 0; _k3 < limit; _k3++) {
355
- value += byteArray.readUInt32LE(p);
356
-
357
- if (_k3 + 1 < limit) {
358
- value += ',';
205
+ break;
206
+ case 'Z':
207
+ case 'H':
208
+ value = '';
209
+ while (p <= blockEnd) {
210
+ var cc = byteArray[p++];
211
+ if (cc === 0) {
212
+ break;
213
+ }
214
+ else {
215
+ value += String.fromCharCode(cc);
216
+ }
359
217
  }
360
-
218
+ break;
219
+ case 'B': {
220
+ value = '';
221
+ var cc = byteArray[p++];
222
+ var Btype = String.fromCharCode(cc);
223
+ var limit = byteArray.readInt32LE(p);
361
224
  p += 4;
362
- }
363
- }
364
- }
365
-
366
- if (Btype === 's') {
367
- for (var _k4 = 0; _k4 < limit; _k4++) {
368
- value += byteArray.readInt16LE(p);
369
-
370
- if (_k4 + 1 < limit) {
371
- value += ',';
372
- }
373
-
374
- p += 2;
375
- }
376
- }
377
-
378
- if (Btype === 'S') {
379
- for (var _k5 = 0; _k5 < limit; _k5++) {
380
- value += byteArray.readUInt16LE(p);
381
-
382
- if (_k5 + 1 < limit) {
383
- value += ',';
384
- }
385
-
386
- p += 2;
387
- }
388
- }
389
-
390
- if (Btype === 'c') {
391
- for (var _k6 = 0; _k6 < limit; _k6++) {
392
- value += byteArray.readInt8(p);
393
-
394
- if (_k6 + 1 < limit) {
395
- value += ',';
396
- }
397
-
398
- p += 1;
399
- }
400
- }
401
-
402
- if (Btype === 'C') {
403
- for (var _k7 = 0; _k7 < limit; _k7++) {
404
- value += byteArray.readUInt8(p);
405
-
406
- if (_k7 + 1 < limit) {
407
- value += ',';
408
- }
409
-
410
- p += 1;
411
- }
412
- }
413
-
414
- if (Btype === 'f') {
415
- for (var _k8 = 0; _k8 < limit; _k8++) {
416
- value += byteArray.readFloatLE(p);
417
-
418
- if (_k8 + 1 < limit) {
419
- value += ',';
420
- }
421
-
422
- p += 4;
225
+ if (Btype === 'i') {
226
+ if (tag === 'CG') {
227
+ for (var k = 0; k < limit; k++) {
228
+ var cigop = byteArray.readInt32LE(p);
229
+ var lop = cigop >> 4;
230
+ var op = CIGAR_DECODER[cigop & 0xf];
231
+ value += lop + op;
232
+ p += 4;
233
+ }
234
+ }
235
+ else {
236
+ for (var k = 0; k < limit; k++) {
237
+ value += byteArray.readInt32LE(p);
238
+ if (k + 1 < limit) {
239
+ value += ',';
240
+ }
241
+ p += 4;
242
+ }
243
+ }
244
+ }
245
+ if (Btype === 'I') {
246
+ if (tag === 'CG') {
247
+ for (var k = 0; k < limit; k++) {
248
+ var cigop = byteArray.readUInt32LE(p);
249
+ var lop = cigop >> 4;
250
+ var op = CIGAR_DECODER[cigop & 0xf];
251
+ value += lop + op;
252
+ p += 4;
253
+ }
254
+ }
255
+ else {
256
+ for (var k = 0; k < limit; k++) {
257
+ value += byteArray.readUInt32LE(p);
258
+ if (k + 1 < limit) {
259
+ value += ',';
260
+ }
261
+ p += 4;
262
+ }
263
+ }
264
+ }
265
+ if (Btype === 's') {
266
+ for (var k = 0; k < limit; k++) {
267
+ value += byteArray.readInt16LE(p);
268
+ if (k + 1 < limit) {
269
+ value += ',';
270
+ }
271
+ p += 2;
272
+ }
273
+ }
274
+ if (Btype === 'S') {
275
+ for (var k = 0; k < limit; k++) {
276
+ value += byteArray.readUInt16LE(p);
277
+ if (k + 1 < limit) {
278
+ value += ',';
279
+ }
280
+ p += 2;
281
+ }
282
+ }
283
+ if (Btype === 'c') {
284
+ for (var k = 0; k < limit; k++) {
285
+ value += byteArray.readInt8(p);
286
+ if (k + 1 < limit) {
287
+ value += ',';
288
+ }
289
+ p += 1;
290
+ }
291
+ }
292
+ if (Btype === 'C') {
293
+ for (var k = 0; k < limit; k++) {
294
+ value += byteArray.readUInt8(p);
295
+ if (k + 1 < limit) {
296
+ value += ',';
297
+ }
298
+ p += 1;
299
+ }
300
+ }
301
+ if (Btype === 'f') {
302
+ for (var k = 0; k < limit; k++) {
303
+ value += byteArray.readFloatLE(p);
304
+ if (k + 1 < limit) {
305
+ value += ',';
306
+ }
307
+ p += 4;
308
+ }
309
+ }
310
+ break;
423
311
  }
424
- }
425
-
426
- break;
312
+ default:
313
+ console.warn("Unknown BAM tag type '".concat(type, "', tags may be incomplete"));
314
+ value = undefined;
315
+ p = blockEnd; // stop parsing tags
427
316
  }
428
-
429
- default:
430
- console.warn("Unknown BAM tag type '".concat(type, "', tags may be incomplete"));
431
- value = undefined;
432
- p = blockEnd;
433
- // stop parsing tags
434
- }
435
-
436
- this._tagOffset = p;
437
-
438
- this._tagList.push(tag);
439
-
440
- if (lcTag === tagName) {
441
- return value;
317
+ this._tagOffset = p;
318
+ this._tagList.push(tag);
319
+ if (lcTag === tagName) {
320
+ return value;
321
+ }
322
+ this.data[lcTag] = value;
442
323
  }
443
-
444
- this.data[lcTag] = value;
445
- }
446
-
447
- this._allTagsParsed = true;
448
- return undefined;
449
- }
450
- }, {
451
- key: "_parseAllTags",
452
- value: function _parseAllTags() {
453
- this._parseTag('');
454
- }
455
- }, {
456
- key: "_parseCigar",
457
- value: function _parseCigar(cigar) {
458
- var _context3;
459
-
460
- return (//@ts-ignore
461
- (0, _map.default)(_context3 = cigar.match(/\d+\D/g)).call(_context3, function (op) {
462
- return [op.match(/\D/)[0].toUpperCase(), (0, _parseInt2.default)(op, 10)];
463
- })
464
- );
465
- }
324
+ this._allTagsParsed = true;
325
+ return undefined;
326
+ };
327
+ BamRecord.prototype._parseAllTags = function () {
328
+ this._parseTag('');
329
+ };
330
+ BamRecord.prototype._parseCigar = function (cigar) {
331
+ return (
332
+ //@ts-ignore
333
+ cigar
334
+ .match(/\d+\D/g)
335
+ //@ts-ignore
336
+ .map(function (op) { return [op.match(/\D/)[0].toUpperCase(), parseInt(op, 10)]; }));
337
+ };
466
338
  /**
467
339
  * @returns {boolean} true if the read is paired, regardless of whether both segments are mapped
468
340
  */
469
-
470
- }, {
471
- key: "isPaired",
472
- value: function isPaired() {
473
- return !!((0, _flags2.default)(this) & _constants.default.BAM_FPAIRED);
474
- }
341
+ BamRecord.prototype.isPaired = function () {
342
+ return !!(this.flags & constants_1.default.BAM_FPAIRED);
343
+ };
475
344
  /** @returns {boolean} true if the read is paired, and both segments are mapped */
476
-
477
- }, {
478
- key: "isProperlyPaired",
479
- value: function isProperlyPaired() {
480
- return !!((0, _flags2.default)(this) & _constants.default.BAM_FPROPER_PAIR);
481
- }
345
+ BamRecord.prototype.isProperlyPaired = function () {
346
+ return !!(this.flags & constants_1.default.BAM_FPROPER_PAIR);
347
+ };
482
348
  /** @returns {boolean} true if the read itself is unmapped; conflictive with isProperlyPaired */
483
-
484
- }, {
485
- key: "isSegmentUnmapped",
486
- value: function isSegmentUnmapped() {
487
- return !!((0, _flags2.default)(this) & _constants.default.BAM_FUNMAP);
488
- }
349
+ BamRecord.prototype.isSegmentUnmapped = function () {
350
+ return !!(this.flags & constants_1.default.BAM_FUNMAP);
351
+ };
489
352
  /** @returns {boolean} true if the read itself is unmapped; conflictive with isProperlyPaired */
490
-
491
- }, {
492
- key: "isMateUnmapped",
493
- value: function isMateUnmapped() {
494
- return !!((0, _flags2.default)(this) & _constants.default.BAM_FMUNMAP);
495
- }
353
+ BamRecord.prototype.isMateUnmapped = function () {
354
+ return !!(this.flags & constants_1.default.BAM_FMUNMAP);
355
+ };
496
356
  /** @returns {boolean} true if the read is mapped to the reverse strand */
497
-
498
- }, {
499
- key: "isReverseComplemented",
500
- value: function isReverseComplemented() {
501
- return !!((0, _flags2.default)(this) & _constants.default.BAM_FREVERSE);
502
- }
357
+ BamRecord.prototype.isReverseComplemented = function () {
358
+ return !!(this.flags & constants_1.default.BAM_FREVERSE);
359
+ };
503
360
  /** @returns {boolean} true if the mate is mapped to the reverse strand */
504
-
505
- }, {
506
- key: "isMateReverseComplemented",
507
- value: function isMateReverseComplemented() {
508
- return !!((0, _flags2.default)(this) & _constants.default.BAM_FMREVERSE);
509
- }
361
+ BamRecord.prototype.isMateReverseComplemented = function () {
362
+ return !!(this.flags & constants_1.default.BAM_FMREVERSE);
363
+ };
510
364
  /** @returns {boolean} true if this is read number 1 in a pair */
511
-
512
- }, {
513
- key: "isRead1",
514
- value: function isRead1() {
515
- return !!((0, _flags2.default)(this) & _constants.default.BAM_FREAD1);
516
- }
365
+ BamRecord.prototype.isRead1 = function () {
366
+ return !!(this.flags & constants_1.default.BAM_FREAD1);
367
+ };
517
368
  /** @returns {boolean} true if this is read number 2 in a pair */
518
-
519
- }, {
520
- key: "isRead2",
521
- value: function isRead2() {
522
- return !!((0, _flags2.default)(this) & _constants.default.BAM_FREAD2);
523
- }
369
+ BamRecord.prototype.isRead2 = function () {
370
+ return !!(this.flags & constants_1.default.BAM_FREAD2);
371
+ };
524
372
  /** @returns {boolean} true if this is a secondary alignment */
525
-
526
- }, {
527
- key: "isSecondary",
528
- value: function isSecondary() {
529
- return !!((0, _flags2.default)(this) & _constants.default.BAM_FSECONDARY);
530
- }
373
+ BamRecord.prototype.isSecondary = function () {
374
+ return !!(this.flags & constants_1.default.BAM_FSECONDARY);
375
+ };
531
376
  /** @returns {boolean} true if this read has failed QC checks */
532
-
533
- }, {
534
- key: "isFailedQc",
535
- value: function isFailedQc() {
536
- return !!((0, _flags2.default)(this) & _constants.default.BAM_FQCFAIL);
537
- }
377
+ BamRecord.prototype.isFailedQc = function () {
378
+ return !!(this.flags & constants_1.default.BAM_FQCFAIL);
379
+ };
538
380
  /** @returns {boolean} true if the read is an optical or PCR duplicate */
539
-
540
- }, {
541
- key: "isDuplicate",
542
- value: function isDuplicate() {
543
- return !!((0, _flags2.default)(this) & _constants.default.BAM_FDUP);
544
- }
381
+ BamRecord.prototype.isDuplicate = function () {
382
+ return !!(this.flags & constants_1.default.BAM_FDUP);
383
+ };
545
384
  /** @returns {boolean} true if this is a supplementary alignment */
546
-
547
- }, {
548
- key: "isSupplementary",
549
- value: function isSupplementary() {
550
- return !!((0, _flags2.default)(this) & _constants.default.BAM_FSUPPLEMENTARY);
551
- }
552
- }, {
553
- key: "cigar",
554
- value: function cigar() {
555
- if (this.isSegmentUnmapped()) {
556
- return undefined;
557
- }
558
-
559
- var _this$bytes2 = this.bytes,
560
- byteArray = _this$bytes2.byteArray,
561
- start = _this$bytes2.start;
562
- var numCigarOps = this.get('_n_cigar_op');
563
- var p = start + 36 + this.get('_l_read_name');
564
- var seqLen = this.get('seq_length');
565
- var cigar = '';
566
- var lref = 0; // check for CG tag by inspecting whether the CIGAR field
567
- // contains a clip that consumes entire seqLen
568
-
569
- var cigop = byteArray.readInt32LE(p);
570
- var lop = cigop >> 4;
571
- var op = CIGAR_DECODER[cigop & 0xf];
572
-
573
- if (op === 'S' && lop === seqLen) {
574
- // if there is a CG the second CIGAR field will
575
- // be a N tag the represents the length on ref
576
- p += 4;
577
- cigop = byteArray.readInt32LE(p);
578
- lop = cigop >> 4;
579
- op = CIGAR_DECODER[cigop & 0xf];
580
-
581
- if (op !== 'N') {
582
- console.warn('CG tag with no N tag');
385
+ BamRecord.prototype.isSupplementary = function () {
386
+ return !!(this.flags & constants_1.default.BAM_FSUPPLEMENTARY);
387
+ };
388
+ BamRecord.prototype.cigar = function () {
389
+ if (this.isSegmentUnmapped()) {
390
+ return undefined;
583
391
  }
584
-
585
- this.data.length_on_ref = lop;
586
- return this.get('CG');
587
- } else {
588
- for (var c = 0; c < numCigarOps; ++c) {
589
- cigop = byteArray.readInt32LE(p);
590
- lop = cigop >> 4;
591
- op = CIGAR_DECODER[cigop & 0xf];
592
- cigar += lop + op; // soft clip, hard clip, and insertion don't count toward
593
- // the length on the reference
594
-
595
- if (op !== 'H' && op !== 'S' && op !== 'I') {
596
- lref += lop;
597
- }
598
-
599
- p += 4;
392
+ var _a = this.bytes, byteArray = _a.byteArray, start = _a.start;
393
+ var numCigarOps = this.get('_n_cigar_op');
394
+ var p = start + 36 + this.get('_l_read_name');
395
+ var seqLen = this.get('seq_length');
396
+ var cigar = '';
397
+ var lref = 0;
398
+ // check for CG tag by inspecting whether the CIGAR field
399
+ // contains a clip that consumes entire seqLen
400
+ var cigop = byteArray.readInt32LE(p);
401
+ var lop = cigop >> 4;
402
+ var op = CIGAR_DECODER[cigop & 0xf];
403
+ if (op === 'S' && lop === seqLen) {
404
+ // if there is a CG the second CIGAR field will
405
+ // be a N tag the represents the length on ref
406
+ p += 4;
407
+ cigop = byteArray.readInt32LE(p);
408
+ lop = cigop >> 4;
409
+ op = CIGAR_DECODER[cigop & 0xf];
410
+ if (op !== 'N') {
411
+ console.warn('CG tag with no N tag');
412
+ }
413
+ this.data.length_on_ref = lop;
414
+ return this.get('CG');
600
415
  }
601
-
602
- this.data.length_on_ref = lref;
603
- return cigar;
604
- }
605
- }
606
- }, {
607
- key: "_flags",
608
- value: function _flags() {}
609
- }, {
610
- key: "length_on_ref",
611
- value: function length_on_ref() {
612
- this.get('cigar'); // the length_on_ref is set as a
613
- // side effect of the CIGAR parsing
614
-
615
- return this.data.length_on_ref;
616
- }
617
- }, {
618
- key: "_n_cigar_op",
619
- value: function _n_cigar_op() {
620
- return this.get('_flag_nc') & 0xffff;
621
- }
622
- }, {
623
- key: "_l_read_name",
624
- value: function _l_read_name() {
625
- return this.get('_bin_mq_nl') & 0xff;
626
- }
416
+ else {
417
+ for (var c = 0; c < numCigarOps; ++c) {
418
+ cigop = byteArray.readInt32LE(p);
419
+ lop = cigop >> 4;
420
+ op = CIGAR_DECODER[cigop & 0xf];
421
+ cigar += lop + op;
422
+ // soft clip, hard clip, and insertion don't count toward
423
+ // the length on the reference
424
+ if (op !== 'H' && op !== 'S' && op !== 'I') {
425
+ lref += lop;
426
+ }
427
+ p += 4;
428
+ }
429
+ this.data.length_on_ref = lref;
430
+ return cigar;
431
+ }
432
+ };
433
+ BamRecord.prototype._flags = function () { };
434
+ BamRecord.prototype.length_on_ref = function () {
435
+ this.get('cigar'); // the length_on_ref is set as a
436
+ // side effect of the CIGAR parsing
437
+ return this.data.length_on_ref;
438
+ };
439
+ BamRecord.prototype._n_cigar_op = function () {
440
+ return this.get('_flag_nc') & 0xffff;
441
+ };
442
+ BamRecord.prototype._l_read_name = function () {
443
+ return this.get('_bin_mq_nl') & 0xff;
444
+ };
627
445
  /**
628
446
  * number of bytes in the sequence field
629
447
  */
630
-
631
- }, {
632
- key: "_seq_bytes",
633
- value: function _seq_bytes() {
634
- return this.get('seq_length') + 1 >> 1;
635
- }
636
- }, {
637
- key: "getReadBases",
638
- value: function getReadBases() {
639
- return this.seq();
640
- }
641
- }, {
642
- key: "seq",
643
- value: function seq() {
644
- var byteArray = this.bytes.byteArray;
645
- var p = this.bytes.start + 36 + this.get('_l_read_name') + this.get('_n_cigar_op') * 4;
646
- var seqBytes = this.get('_seq_bytes');
647
- var len = this.get('seq_length');
648
- var buf = '';
649
- var i = 0;
650
-
651
- for (var j = 0; j < seqBytes; ++j) {
652
- var sb = byteArray[p + j];
653
- buf += String.fromCharCode(SEQRET_DECODER[(sb & 0xf0) >> 4]);
654
- i++;
655
-
656
- if (i < len) {
657
- buf += String.fromCharCode(SEQRET_DECODER[sb & 0x0f]);
658
- i++;
659
- }
660
- }
661
-
662
- return buf;
663
- } // adapted from igv.js
664
-
665
- }, {
666
- key: "getPairOrientation",
667
- value: function getPairOrientation() {
668
- if (!this.isSegmentUnmapped() && !this.isMateUnmapped() && this._refID === this._next_refid()) {
669
- var s1 = this.isReverseComplemented() ? 'R' : 'F';
670
- var s2 = this.isMateReverseComplemented() ? 'R' : 'F';
671
- var o1 = ' ';
672
- var o2 = ' ';
673
-
674
- if (this.isRead1()) {
675
- o1 = '1';
676
- o2 = '2';
677
- } else if (this.isRead2()) {
678
- o1 = '2';
679
- o2 = '1';
448
+ BamRecord.prototype._seq_bytes = function () {
449
+ return (this.get('seq_length') + 1) >> 1;
450
+ };
451
+ BamRecord.prototype.getReadBases = function () {
452
+ return this.seq();
453
+ };
454
+ BamRecord.prototype.seq = function () {
455
+ var byteArray = this.bytes.byteArray;
456
+ var p = this.bytes.start +
457
+ 36 +
458
+ this.get('_l_read_name') +
459
+ this.get('_n_cigar_op') * 4;
460
+ var seqBytes = this.get('_seq_bytes');
461
+ var len = this.get('seq_length');
462
+ var buf = '';
463
+ var i = 0;
464
+ for (var j = 0; j < seqBytes; ++j) {
465
+ var sb = byteArray[p + j];
466
+ buf += String.fromCharCode(SEQRET_DECODER[(sb & 0xf0) >> 4]);
467
+ i++;
468
+ if (i < len) {
469
+ buf += String.fromCharCode(SEQRET_DECODER[sb & 0x0f]);
470
+ i++;
471
+ }
680
472
  }
681
-
682
- var tmp = [];
683
- var isize = this.template_length();
684
-
685
- if (isize > 0) {
686
- tmp[0] = s1;
687
- tmp[1] = o1;
688
- tmp[2] = s2;
689
- tmp[3] = o2;
690
- } else {
691
- tmp[2] = s1;
692
- tmp[3] = o1;
693
- tmp[0] = s2;
694
- tmp[1] = o2;
473
+ return buf;
474
+ };
475
+ // adapted from igv.js
476
+ BamRecord.prototype.getPairOrientation = function () {
477
+ if (!this.isSegmentUnmapped() &&
478
+ !this.isMateUnmapped() &&
479
+ this._refID === this._next_refid()) {
480
+ var s1 = this.isReverseComplemented() ? 'R' : 'F';
481
+ var s2 = this.isMateReverseComplemented() ? 'R' : 'F';
482
+ var o1 = ' ';
483
+ var o2 = ' ';
484
+ if (this.isRead1()) {
485
+ o1 = '1';
486
+ o2 = '2';
487
+ }
488
+ else if (this.isRead2()) {
489
+ o1 = '2';
490
+ o2 = '1';
491
+ }
492
+ var tmp = [];
493
+ var isize = this.template_length();
494
+ if (isize > 0) {
495
+ tmp[0] = s1;
496
+ tmp[1] = o1;
497
+ tmp[2] = s2;
498
+ tmp[3] = o2;
499
+ }
500
+ else {
501
+ tmp[2] = s1;
502
+ tmp[3] = o1;
503
+ tmp[0] = s2;
504
+ tmp[1] = o2;
505
+ }
506
+ return tmp.join('');
695
507
  }
696
-
697
- return tmp.join('');
698
- }
699
-
700
- return null;
701
- }
702
- }, {
703
- key: "_bin_mq_nl",
704
- value: function _bin_mq_nl() {
705
- return this.bytes.byteArray.readInt32LE(this.bytes.start + 12);
706
- }
707
- }, {
708
- key: "_flag_nc",
709
- value: function _flag_nc() {
710
- return this.bytes.byteArray.readInt32LE(this.bytes.start + 16);
711
- }
712
- }, {
713
- key: "seq_length",
714
- value: function seq_length() {
715
- return this.bytes.byteArray.readInt32LE(this.bytes.start + 20);
716
- }
717
- }, {
718
- key: "_next_refid",
719
- value: function _next_refid() {
720
- return this.bytes.byteArray.readInt32LE(this.bytes.start + 24);
721
- }
722
- }, {
723
- key: "_next_pos",
724
- value: function _next_pos() {
725
- return this.bytes.byteArray.readInt32LE(this.bytes.start + 28);
726
- }
727
- }, {
728
- key: "template_length",
729
- value: function template_length() {
730
- return this.bytes.byteArray.readInt32LE(this.bytes.start + 32);
731
- }
732
- }, {
733
- key: "toJSON",
734
- value: function toJSON() {
735
- var _context4,
736
- _this2 = this;
737
-
738
- var data = {};
739
- (0, _forEach.default)(_context4 = (0, _keys.default)(this)).call(_context4, function (k) {
740
- if (k.charAt(0) === '_' || k === 'bytes') {
741
- return;
742
- } //@ts-ignore
743
-
744
-
745
- data[k] = _this2[k];
746
- });
747
- return data;
748
- }
749
- }]);
750
- return BamRecord;
751
- }();
752
-
508
+ return null;
509
+ };
510
+ BamRecord.prototype._bin_mq_nl = function () {
511
+ return this.bytes.byteArray.readInt32LE(this.bytes.start + 12);
512
+ };
513
+ BamRecord.prototype._flag_nc = function () {
514
+ return this.bytes.byteArray.readInt32LE(this.bytes.start + 16);
515
+ };
516
+ BamRecord.prototype.seq_length = function () {
517
+ return this.bytes.byteArray.readInt32LE(this.bytes.start + 20);
518
+ };
519
+ BamRecord.prototype._next_refid = function () {
520
+ return this.bytes.byteArray.readInt32LE(this.bytes.start + 24);
521
+ };
522
+ BamRecord.prototype._next_pos = function () {
523
+ return this.bytes.byteArray.readInt32LE(this.bytes.start + 28);
524
+ };
525
+ BamRecord.prototype.template_length = function () {
526
+ return this.bytes.byteArray.readInt32LE(this.bytes.start + 32);
527
+ };
528
+ BamRecord.prototype.toJSON = function () {
529
+ var _this = this;
530
+ var data = {};
531
+ Object.keys(this).forEach(function (k) {
532
+ if (k.charAt(0) === '_' || k === 'bytes') {
533
+ return;
534
+ }
535
+ //@ts-ignore
536
+ data[k] = _this[k];
537
+ });
538
+ return data;
539
+ };
540
+ return BamRecord;
541
+ }());
753
542
  exports.default = BamRecord;
754
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWNvcmQudHMiXSwibmFtZXMiOlsiU0VRUkVUX0RFQ09ERVIiLCJzcGxpdCIsInMiLCJjaGFyQ29kZUF0IiwiQ0lHQVJfREVDT0RFUiIsIkJhbVJlY29yZCIsImFyZ3MiLCJ1bmRlZmluZWQiLCJkYXRhIiwiYnl0ZXMiLCJzdGFydCIsImVuZCIsImJ5dGVBcnJheSIsIl9pZCIsImZpbGVPZmZzZXQiLCJfcmVmSUQiLCJyZWFkSW50MzJMRSIsImZsYWdzIiwiZmllbGQiLCJfZ2V0IiwidG9Mb3dlckNhc2UiLCJnZXQiLCJfcGFyc2VUYWciLCJfcGFyc2VBbGxUYWdzIiwidGFncyIsImlzU2VnbWVudFVubWFwcGVkIiwicHVzaCIsImlzUGFpcmVkIiwiX3RhZ0xpc3QiLCJrIiwic2VlbiIsInQiLCJsdCIsIm1xIiwicXVhbFJhdyIsImpvaW4iLCJwIiwibHNlcSIsInFzZXEiLCJCdWZmZXIiLCJhbGxvY1Vuc2FmZSIsImoiLCJpc1JldmVyc2VDb21wbGVtZW50ZWQiLCJpc01hdGVVbm1hcHBlZCIsImlzTWF0ZVJldmVyc2VDb21wbGVtZW50ZWQiLCJubCIsInRvU3RyaW5nIiwidGFnTmFtZSIsIl9hbGxUYWdzUGFyc2VkIiwiX3RhZ09mZnNldCIsImJsb2NrRW5kIiwibGNUYWciLCJ0YWciLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJ0eXBlIiwidmFsdWUiLCJyZWFkVUludDMyTEUiLCJyZWFkSW50OCIsInJlYWRVSW50OCIsInJlYWRJbnQxNkxFIiwicmVhZFVJbnQxNkxFIiwicmVhZEZsb2F0TEUiLCJjYyIsIkJ0eXBlIiwibGltaXQiLCJjaWdvcCIsImxvcCIsIm9wIiwiY29uc29sZSIsIndhcm4iLCJjaWdhciIsIm1hdGNoIiwidG9VcHBlckNhc2UiLCJDb25zdGFudHMiLCJCQU1fRlBBSVJFRCIsIkJBTV9GUFJPUEVSX1BBSVIiLCJCQU1fRlVOTUFQIiwiQkFNX0ZNVU5NQVAiLCJCQU1fRlJFVkVSU0UiLCJCQU1fRk1SRVZFUlNFIiwiQkFNX0ZSRUFEMSIsIkJBTV9GUkVBRDIiLCJCQU1fRlNFQ09OREFSWSIsIkJBTV9GUUNGQUlMIiwiQkFNX0ZEVVAiLCJCQU1fRlNVUFBMRU1FTlRBUlkiLCJudW1DaWdhck9wcyIsInNlcUxlbiIsImxyZWYiLCJsZW5ndGhfb25fcmVmIiwiYyIsInNlcSIsInNlcUJ5dGVzIiwibGVuIiwiYnVmIiwiaSIsInNiIiwiX25leHRfcmVmaWQiLCJzMSIsInMyIiwibzEiLCJvMiIsImlzUmVhZDEiLCJpc1JlYWQyIiwidG1wIiwiaXNpemUiLCJ0ZW1wbGF0ZV9sZW5ndGgiLCJjaGFyQXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7Ozs7QUFFQSxJQUFNQSxjQUFjLEdBQUcsZ0RBQW1CQyxLQUFuQixDQUF5QixFQUF6QixrQkFBaUMsVUFBQUMsQ0FBQztBQUFBLFNBQUlBLENBQUMsQ0FBQ0MsVUFBRixDQUFhLENBQWIsQ0FBSjtBQUFBLENBQWxDLENBQXZCO0FBQ0EsSUFBTUMsYUFBYSxHQUFHLG1CQUFtQkgsS0FBbkIsQ0FBeUIsRUFBekIsQ0FBdEI7QUFFQTs7OztJQUdxQkksUztBQVNuQixxQkFBWUMsSUFBWixFQUF1QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHNEQUhrQkMsU0FHbEI7QUFBQSxvREFGTSxFQUVOO0FBQUEsMERBREUsS0FDRjtBQUNyQixTQUFLQyxJQUFMLEdBQVksRUFBWjtBQUNBLFNBQUtDLEtBQUwsR0FBYTtBQUNYQyxNQUFBQSxLQUFLLEVBQUVKLElBQUksQ0FBQ0csS0FBTCxDQUFXQyxLQURQO0FBRVhDLE1BQUFBLEdBQUcsRUFBRUwsSUFBSSxDQUFDRyxLQUFMLENBQVdFLEdBRkw7QUFHWEMsTUFBQUEsU0FBUyxFQUFFTixJQUFJLENBQUNHLEtBQUwsQ0FBV0c7QUFIWCxLQUFiO0FBS0EsU0FBS0MsR0FBTCxHQUFXUCxJQUFJLENBQUNRLFVBQWhCO0FBUHFCLHNCQVFRLEtBQUtMLEtBUmI7QUFBQSxRQVFiQyxL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aXB0LWVzbGludC9jYW1lbGNhc2UgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvbiAqL1xuaW1wb3J0IENvbnN0YW50cyBmcm9tICcuL2NvbnN0YW50cydcblxuY29uc3QgU0VRUkVUX0RFQ09ERVIgPSAnPUFDTUdSU1ZUV1lIS0RCTicuc3BsaXQoJycpLm1hcChzID0+IHMuY2hhckNvZGVBdCgwKSlcbmNvbnN0IENJR0FSX0RFQ09ERVIgPSAnTUlETlNIUD1YPz8/Pz8/Pycuc3BsaXQoJycpXG5cbi8qKlxuICogQ2xhc3Mgb2YgZWFjaCBCQU0gcmVjb3JkIHJldHVybmVkIGJ5IHRoaXMgQVBJLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYW1SZWNvcmQge1xuICBwcml2YXRlIGRhdGE6IGFueVxuICBwcml2YXRlIGJ5dGVzOiBhbnlcbiAgcHJpdmF0ZSBmbGFnczogYW55XG4gIHByaXZhdGUgX2lkOiBudW1iZXJcbiAgcHJpdmF0ZSBfcmVmSUQ6IG51bWJlclxuICBwcml2YXRlIF90YWdPZmZzZXQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuICBwcml2YXRlIF90YWdMaXN0OiBzdHJpbmdbXSA9IFtdXG4gIHByaXZhdGUgX2FsbFRhZ3NQYXJzZWQgPSBmYWxzZVxuICBjb25zdHJ1Y3RvcihhcmdzOiBhbnkpIHtcbiAgICB0aGlzLmRhdGEgPSB7fVxuICAgIHRoaXMuYnl0ZXMgPSB7XG4gICAgICBzdGFydDogYXJncy5ieXRlcy5zdGFydCxcbiAgICAgIGVuZDogYXJncy5ieXRlcy5lbmQsXG4gICAgICBieXRlQXJyYXk6IGFyZ3MuYnl0ZXMuYnl0ZUFycmF5LFxuICAgIH1cbiAgICB0aGlzLl9pZCA9IGFyZ3MuZmlsZU9mZnNldFxuICAgIGNvbnN0IHsgc3RhcnQsIGJ5dGVBcnJheSB9ID0gdGhpcy5ieXRlc1xuICAgIHRoaXMuX3JlZklEID0gYnl0ZUFycmF5LnJlYWRJbnQzMkxFKHN0YXJ0ICsgNClcbiAgICB0aGlzLmRhdGEuc3RhcnQgPSBieXRlQXJyYXkucmVhZEludDMyTEUoc3RhcnQgKyA4KVxuICAgIHRoaXMuZmxhZ3MgPSAoYnl0ZUFycmF5LnJlYWRJbnQzMkxFKHN0YXJ0ICsgMTYpICYgMHhmZmZmMDAwMCkgPj4gMTZcbiAgfVxuXG4gIGdldChmaWVsZDogc3RyaW5nKSB7XG4gICAgLy9AdHMtaWdub3JlXG4gICAgaWYgKHRoaXNbZmllbGRdKSB7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGlmICh0aGlzLmRhdGFbZmllbGRdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFbZmllbGRdXG4gICAgICB9XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHRoaXMuZGF0YVtmaWVsZF0gPSB0aGlzW2ZpZWxkXSgpXG4gICAgICByZXR1cm4gdGhpcy5kYXRhW2ZpZWxkXVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ2V0KGZpZWxkLnRvTG93ZXJDYXNlKCkpXG4gIH1cblxuICBlbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdzdGFydCcpICsgKHRoaXMuZ2V0KCdsZW5ndGhfb25fcmVmJykgfHwgdGhpcy5nZXQoJ3NlcV9sZW5ndGgnKSB8fCB1bmRlZmluZWQpXG4gIH1cblxuICBzZXFfaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlZklEXG4gIH1cblxuICAvLyBzYW1lIGFzIGdldCgpLCBleGNlcHQgcmVxdWlyZXMgbG93ZXItY2FzZSBhcmd1bWVudHMuICB1c2VkXG4gIC8vIGludGVybmFsbHkgdG8gc2F2ZSBsb3RzIG9mIGNhbGxzIHRvIGZpZWxkLnRvTG93ZXJDYXNlKClcbiAgX2dldChmaWVsZDogc3RyaW5nKSB7XG4gICAgaWYgKGZpZWxkIGluIHRoaXMuZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVtmaWVsZF1cbiAgICB9XG4gICAgdGhpcy5kYXRhW2ZpZWxkXSA9IHRoaXMuX3BhcnNlVGFnKGZpZWxkKVxuICAgIHJldHVybiB0aGlzLmRhdGFbZmllbGRdXG4gIH1cblxuICBfdGFncygpIHtcbiAgICB0aGlzLl9wYXJzZUFsbFRhZ3MoKVxuXG4gICAgbGV0IHRhZ3MgPSBbJ3NlcSddXG5cbiAgICBpZiAoIXRoaXMuaXNTZWdtZW50VW5tYXBwZWQoKSkge1xuICAgICAgdGFncy5wdXNoKFxuICAgICAgICAnc3RhcnQnLFxuICAgICAgICAnZW5kJyxcbiAgICAgICAgJ3N0cmFuZCcsXG4gICAgICAgICdzY29yZScsXG4gICAgICAgICdxdWFsJyxcbiAgICAgICAgJ01RJyxcbiAgICAgICAgJ0NJR0FSJyxcbiAgICAgICAgJ2xlbmd0aF9vbl9yZWYnLFxuICAgICAgICAndGVtcGxhdGVfbGVuZ3RoJyxcbiAgICAgIClcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNQYWlyZWQoKSkge1xuICAgICAgdGFncy5wdXNoKCduZXh0X3NlZ21lbnRfcG9zaXRpb24nLCAncGFpcl9vcmllbnRhdGlvbicpXG4gICAgfVxuICAgIHRhZ3MgPSB0YWdzLmNvbmNhdCh0aGlzLl90YWdMaXN0IHx8IFtdKVxuXG4gICAgT2JqZWN0LmtleXModGhpcy5kYXRhKS5mb3JFYWNoKGsgPT4ge1xuICAgICAgaWYgKGtbMF0gIT09ICdfJyAmJiBrICE9PSAnbmV4dF9zZXFfaWQnKSB7XG4gICAgICAgIHRhZ3MucHVzaChrKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBzZWVuOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9XG4gICAgdGFncyA9IHRhZ3MuZmlsdGVyKHQgPT4ge1xuICAgICAgaWYgKCh0IGluIHRoaXMuZGF0YSAmJiB0aGlzLmRhdGFbdF0gPT09IHVuZGVmaW5lZCkgfHwgdCA9PT0gJ0NHJyB8fCB0ID09PSAnY2cnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBsdCA9IHQudG9Mb3dlckNhc2UoKVxuICAgICAgY29uc3QgcyA9IHNlZW5bbHRdXG4gICAgICBzZWVuW2x0XSA9IHRydWVcbiAgICAgIHJldHVybiAhc1xuICAgIH0pXG5cbiAgICByZXR1cm4gdGFnc1xuICB9XG5cbiAgcGFyZW50KCkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGNoaWxkcmVuKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnc3ViZmVhdHVyZXMnKVxuICB9XG5cbiAgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lkXG4gIH1cblxuICAvLyBzcGVjaWFsIHBhcnNlcnNcbiAgLyoqXG4gICAqIE1hcHBpbmcgcXVhbGl0eSBzY29yZS5cbiAgICovXG4gIG1xKCkge1xuICAgIGNvbnN0IG1xID0gKHRoaXMuZ2V0KCdfYmluX21xX25sJykgJiAweGZmMDApID4+IDhcbiAgICByZXR1cm4gbXEgPT09IDI1NSA/IHVuZGVmaW5lZCA6IG1xXG4gIH1cblxuICBzY29yZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ21xJylcbiAgfVxuXG4gIHF1YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVhbFJhdygpPy5qb2luKCcgJylcbiAgfVxuXG4gIHF1YWxSYXcoKSB7XG4gICAgaWYgKHRoaXMuaXNTZWdtZW50VW5tYXBwZWQoKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IHsgYnl0ZUFycmF5IH0gPSB0aGlzLmJ5dGVzXG4gICAgY29uc3QgcCA9XG4gICAgICB0aGlzLmJ5dGVzLnN0YXJ0ICtcbiAgICAgIDM2ICtcbiAgICAgIHRoaXMuZ2V0KCdfbF9yZWFkX25hbWUnKSArXG4gICAgICB0aGlzLmdldCgnX25fY2lnYXJfb3AnKSAqIDQgK1xuICAgICAgdGhpcy5nZXQoJ19zZXFfYnl0ZXMnKVxuICAgIGNvbnN0IGxzZXEgPSB0aGlzLmdldCgnc2VxX2xlbmd0aCcpXG4gICAgY29uc3QgcXNlcSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsc2VxKVxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbHNlcTsgKytqKSB7XG4gICAgICBxc2VxW2pdID0gYnl0ZUFycmF5W3AgKyBqXVxuICAgIH1cbiAgICByZXR1cm4gcXNlcVxuICB9XG5cbiAgc3RyYW5kKCkge1xuICAgIHJldHVybiB0aGlzLmlzUmV2ZXJzZUNvbXBsZW1lbnRlZCgpID8gLTEgOiAxXG4gIH1cblxuICBtdWx0aV9zZWdtZW50X25leHRfc2VnbWVudF9zdHJhbmQoKSB7XG4gICAgaWYgKHRoaXMuaXNNYXRlVW5tYXBwZWQoKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pc01hdGVSZXZlcnNlQ29tcGxlbWVudGVkKCkgPyAtMSA6IDFcbiAgfVxuXG4gIG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdfcmVhZF9uYW1lJylcbiAgfVxuXG4gIF9yZWFkX25hbWUoKSB7XG4gICAgY29uc3QgbmwgPSB0aGlzLmdldCgnX2xfcmVhZF9uYW1lJylcbiAgICByZXR1cm4gdGhpcy5ieXRlcy5ieXRlQXJyYXkudG9TdHJpbmcoXG4gICAgICAnYXNjaWknLFxuICAgICAgdGhpcy5ieXRlcy5zdGFydCArIDM2LFxuICAgICAgdGhpcy5ieXRlcy5zdGFydCArIDM2ICsgbmwgLSAxLFxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIGEgdGFnLCBwYXJzaW5nIHRoZSB0YWdzIGFzIGZhciBhcyBuZWNlc3NhcnkuXG4gICAqIE9ubHkgY2FsbGVkIGlmIHdlIGhhdmUgbm90IGFscmVhZHkgcGFyc2VkIHRoYXQgZmllbGQuXG4gICAqL1xuICBfcGFyc2VUYWcodGFnTmFtZT86IHN0cmluZykge1xuICAgIC8vIGlmIGFsbCBvZiB0aGUgdGFncyBoYXZlIGJlZW4gcGFyc2VkIGFuZCB3ZSdyZSBzdGlsbCBiZWluZ1xuICAgIC8vIGNhbGxlZCwgd2UgYWxyZWFkeSBrbm93IHRoYXQgd2UgaGF2ZSBubyBzdWNoIHRhZywgYmVjYXVzZVxuICAgIC8vIGl0IHdvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGNhY2hlZC5cbiAgICBpZiAodGhpcy5fYWxsVGFnc1BhcnNlZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IHsgYnl0ZUFycmF5IH0gPSB0aGlzLmJ5dGVzXG4gICAgbGV0IHAgPVxuICAgICAgdGhpcy5fdGFnT2Zmc2V0IHx8XG4gICAgICB0aGlzLmJ5dGVzLnN0YXJ0ICtcbiAgICAgICAgMzYgK1xuICAgICAgICB0aGlzLmdldCgnX2xfcmVhZF9uYW1lJykgK1xuICAgICAgICB0aGlzLmdldCgnX25fY2lnYXJfb3AnKSAqIDQgK1xuICAgICAgICB0aGlzLmdldCgnX3NlcV9ieXRlcycpICtcbiAgICAgICAgdGhpcy5nZXQoJ3NlcV9sZW5ndGgnKVxuXG4gICAgY29uc3QgYmxvY2tFbmQgPSB0aGlzLmJ5dGVzLmVuZFxuICAgIGxldCBsY1RhZ1xuICAgIHdoaWxlIChwIDwgYmxvY2tFbmQgJiYgbGNUYWcgIT09IHRhZ05hbWUpIHtcbiAgICAgIGNvbnN0IHRhZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZUFycmF5W3BdLCBieXRlQXJyYXlbcCArIDFdKVxuICAgICAgbGNUYWcgPSB0YWcudG9Mb3dlckNhc2UoKVxuICAgICAgY29uc3QgdHlwZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZUFycmF5W3AgKyAyXSlcbiAgICAgIHAgKz0gM1xuXG4gICAgICBsZXQgdmFsdWVcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdBJzpcbiAgICAgICAgICB2YWx1ZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZUFycmF5W3BdKVxuICAgICAgICAgIHAgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2knOlxuICAgICAgICAgIHZhbHVlID0gYnl0ZUFycmF5LnJlYWRJbnQzMkxFKHApXG4gICAgICAgICAgcCArPSA0XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnSSc6XG4gICAgICAgICAgdmFsdWUgPSBieXRlQXJyYXkucmVhZFVJbnQzMkxFKHApXG4gICAgICAgICAgcCArPSA0XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnYyc6XG4gICAgICAgICAgdmFsdWUgPSBieXRlQXJyYXkucmVhZEludDgocClcbiAgICAgICAgICBwICs9IDFcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdDJzpcbiAgICAgICAgICB2YWx1ZSA9IGJ5dGVBcnJheS5yZWFkVUludDgocClcbiAgICAgICAgICBwICs9IDFcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICB2YWx1ZSA9IGJ5dGVBcnJheS5yZWFkSW50MTZMRShwKVxuICAgICAgICAgIHAgKz0gMlxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ1MnOlxuICAgICAgICAgIHZhbHVlID0gYnl0ZUFycmF5LnJlYWRVSW50MTZMRShwKVxuICAgICAgICAgIHAgKz0gMlxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2YnOlxuICAgICAgICAgIHZhbHVlID0gYnl0ZUFycmF5LnJlYWRGbG9hdExFKHApXG4gICAgICAgICAgcCArPSA0XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnWic6XG4gICAgICAgIGNhc2UgJ0gnOlxuICAgICAgICAgIHZhbHVlID0gJydcbiAgICAgICAgICB3aGlsZSAocCA8PSBibG9ja0VuZCkge1xuICAgICAgICAgICAgY29uc3QgY2MgPSBieXRlQXJyYXlbcCsrXVxuICAgICAgICAgICAgaWYgKGNjID09PSAwKSB7XG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YWx1ZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNjKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdCJzoge1xuICAgICAgICAgIHZhbHVlID0gJydcbiAgICAgICAgICBjb25zdCBjYyA9IGJ5dGVBcnJheVtwKytdXG4gICAgICAgICAgY29uc3QgQnR5cGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNjKVxuICAgICAgICAgIGNvbnN0IGxpbWl0ID0gYnl0ZUFycmF5LnJlYWRJbnQzMkxFKHApXG4gICAgICAgICAgcCArPSA0XG4gICAgICAgICAgaWYgKEJ0eXBlID09PSAnaScpIHtcbiAgICAgICAgICAgIGlmICh0YWcgPT09ICdDRycpIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBsaW1pdDsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2lnb3AgPSBieXRlQXJyYXkucmVhZEludDMyTEUocClcbiAgICAgICAgICAgICAgICBjb25zdCBsb3AgPSBjaWdvcCA+PiA0XG4gICAgICAgICAgICAgICAgY29uc3Qgb3AgPSBDSUdBUl9ERUNPREVSW2NpZ29wICYgMHhmXVxuICAgICAgICAgICAgICAgIHZhbHVlICs9IGxvcCArIG9wXG4gICAgICAgICAgICAgICAgcCArPSA0XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbGltaXQ7IGsrKykge1xuICAgICAgICAgICAgICAgIHZhbHVlICs9IGJ5dGVBcnJheS5yZWFkSW50MzJMRShwKVxuICAgICAgICAgICAgICAgIGlmIChrICsgMSA8IGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSArPSAnLCdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcCArPSA0XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKEJ0eXBlID09PSAnSScpIHtcbiAgICAgICAgICAgIGlmICh0YWcgPT09ICdDRycpIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBsaW1pdDsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2lnb3AgPSBieXRlQXJyYXkucmVhZFVJbnQzMkxFKHApXG4gICAgICAgICAgICAgICAgY29uc3QgbG9wID0gY2lnb3AgPj4gNFxuICAgICAgICAgICAgICAgIGNvbnN0IG9wID0gQ0lHQVJfREVDT0RFUltjaWdvcCAmIDB4Zl1cbiAgICAgICAgICAgICAgICB2YWx1ZSArPSBsb3AgKyBvcFxuICAgICAgICAgICAgICAgIHAgKz0gNFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGxpbWl0OyBrKyspIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSBieXRlQXJyYXkucmVhZFVJbnQzMkxFKHApXG4gICAgICAgICAgICAgICAgaWYgKGsgKyAxIDwgbGltaXQpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlICs9ICcsJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwICs9IDRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoQnR5cGUgPT09ICdzJykge1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBsaW1pdDsgaysrKSB7XG4gICAgICAgICAgICAgIHZhbHVlICs9IGJ5dGVBcnJheS5yZWFkSW50MTZMRShwKVxuICAgICAgICAgICAgICBpZiAoayArIDEgPCBsaW1pdCkge1xuICAgICAgICAgICAgICAgIHZhbHVlICs9ICcsJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHAgKz0gMlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoQnR5cGUgPT09ICdTJykge1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBsaW1pdDsgaysrKSB7XG4gICAgICAgICAgICAgIHZhbHVlICs9IGJ5dGVBcnJheS5yZWFkVUludDE2TEUocClcbiAgICAgICAgICAgICAgaWYgKGsgKyAxIDwgbGltaXQpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSAnLCdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwICs9IDJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKEJ0eXBlID09PSAnYycpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbGltaXQ7IGsrKykge1xuICAgICAgICAgICAgICB2YWx1ZSArPSBieXRlQXJyYXkucmVhZEludDgocClcbiAgICAgICAgICAgICAgaWYgKGsgKyAxIDwgbGltaXQpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSAnLCdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwICs9IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKEJ0eXBlID09PSAnQycpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbGltaXQ7IGsrKykge1xuICAgICAgICAgICAgICB2YWx1ZSArPSBieXRlQXJyYXkucmVhZFVJbnQ4KHApXG4gICAgICAgICAgICAgIGlmIChrICsgMSA8IGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gJywnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcCArPSAxXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChCdHlwZSA9PT0gJ2YnKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGxpbWl0OyBrKyspIHtcbiAgICAgICAgICAgICAgdmFsdWUgKz0gYnl0ZUFycmF5LnJlYWRGbG9hdExFKHApXG4gICAgICAgICAgICAgIGlmIChrICsgMSA8IGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gJywnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcCArPSA0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFVua25vd24gQkFNIHRhZyB0eXBlICcke3R5cGV9JywgdGFncyBtYXkgYmUgaW5jb21wbGV0ZWApXG4gICAgICAgICAgdmFsdWUgPSB1bmRlZmluZWRcbiAgICAgICAgICBwID0gYmxvY2tFbmQgLy8gc3RvcCBwYXJzaW5nIHRhZ3NcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdGFnT2Zmc2V0ID0gcFxuXG4gICAgICB0aGlzLl90YWdMaXN0LnB1c2godGFnKVxuICAgICAgaWYgKGxjVGFnID09PSB0YWdOYW1lKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgfVxuXG4gICAgICB0aGlzLmRhdGFbbGNUYWddID0gdmFsdWVcbiAgICB9XG4gICAgdGhpcy5fYWxsVGFnc1BhcnNlZCA9IHRydWVcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBfcGFyc2VBbGxUYWdzKCkge1xuICAgIHRoaXMuX3BhcnNlVGFnKCcnKVxuICB9XG5cbiAgX3BhcnNlQ2lnYXIoY2lnYXI6IHN0cmluZykge1xuICAgIHJldHVybiAoXG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGNpZ2FyLm1hdGNoKC9cXGQrXFxEL2cpLm1hcCgob3A6IHN0cmluZykgPT4gW29wLm1hdGNoKC9cXEQvKVswXS50b1VwcGVyQ2FzZSgpLCBwYXJzZUludChvcCwgMTApXSlcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIHJlYWQgaXMgcGFpcmVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYm90aCBzZWdtZW50cyBhcmUgbWFwcGVkXG4gICAqL1xuICBpc1BhaXJlZCgpIHtcbiAgICByZXR1cm4gISEodGhpcy5mbGFncyAmIENvbnN0YW50cy5CQU1fRlBBSVJFRClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgcmVhZCBpcyBwYWlyZWQsIGFuZCBib3RoIHNlZ21lbnRzIGFyZSBtYXBwZWQgKi9cbiAgaXNQcm9wZXJseVBhaXJlZCgpIHtcbiAgICByZXR1cm4gISEodGhpcy5mbGFncyAmIENvbnN0YW50cy5CQU1fRlBST1BFUl9QQUlSKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSByZWFkIGl0c2VsZiBpcyB1bm1hcHBlZDsgY29uZmxpY3RpdmUgd2l0aCBpc1Byb3Blcmx5UGFpcmVkICovXG4gIGlzU2VnbWVudFVubWFwcGVkKCkge1xuICAgIHJldHVybiAhISh0aGlzLmZsYWdzICYgQ29uc3RhbnRzLkJBTV9GVU5NQVApXG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIHJlYWQgaXRzZWxmIGlzIHVubWFwcGVkOyBjb25mbGljdGl2ZSB3aXRoIGlzUHJvcGVybHlQYWlyZWQgKi9cbiAgaXNNYXRlVW5tYXBwZWQoKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuZmxhZ3MgJiBDb25zdGFudHMuQkFNX0ZNVU5NQVApXG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIHJlYWQgaXMgbWFwcGVkIHRvIHRoZSByZXZlcnNlIHN0cmFuZCAqL1xuICBpc1JldmVyc2VDb21wbGVtZW50ZWQoKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuZmxhZ3MgJiBDb25zdGFudHMuQkFNX0ZSRVZFUlNFKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBtYXRlIGlzIG1hcHBlZCB0byB0aGUgcmV2ZXJzZSBzdHJhbmQgKi9cbiAgaXNNYXRlUmV2ZXJzZUNvbXBsZW1lbnRlZCgpIHtcbiAgICByZXR1cm4gISEodGhpcy5mbGFncyAmIENvbnN0YW50cy5CQU1fRk1SRVZFUlNFKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoaXMgaXMgcmVhZCBudW1iZXIgMSBpbiBhIHBhaXIgKi9cbiAgaXNSZWFkMSgpIHtcbiAgICByZXR1cm4gISEodGhpcy5mbGFncyAmIENvbnN0YW50cy5CQU1fRlJFQUQxKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoaXMgaXMgcmVhZCBudW1iZXIgMiBpbiBhIHBhaXIgKi9cbiAgaXNSZWFkMigpIHtcbiAgICByZXR1cm4gISEodGhpcy5mbGFncyAmIENvbnN0YW50cy5CQU1fRlJFQUQyKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoaXMgaXMgYSBzZWNvbmRhcnkgYWxpZ25tZW50ICovXG4gIGlzU2Vjb25kYXJ5KCkge1xuICAgIHJldHVybiAhISh0aGlzLmZsYWdzICYgQ29uc3RhbnRzLkJBTV9GU0VDT05EQVJZKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoaXMgcmVhZCBoYXMgZmFpbGVkIFFDIGNoZWNrcyAqL1xuICBpc0ZhaWxlZFFjKCkge1xuICAgIHJldHVybiAhISh0aGlzLmZsYWdzICYgQ29uc3RhbnRzLkJBTV9GUUNGQUlMKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSByZWFkIGlzIGFuIG9wdGljYWwgb3IgUENSIGR1cGxpY2F0ZSAqL1xuICBpc0R1cGxpY2F0ZSgpIHtcbiAgICByZXR1cm4gISEodGhpcy5mbGFncyAmIENvbnN0YW50cy5CQU1fRkRVUClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGlzIGEgc3VwcGxlbWVudGFyeSBhbGlnbm1lbnQgKi9cbiAgaXNTdXBwbGVtZW50YXJ5KCkge1xuICAgIHJldHVybiAhISh0aGlzLmZsYWdzICYgQ29uc3RhbnRzLkJBTV9GU1VQUExFTUVOVEFSWSlcbiAgfVxuXG4gIGNpZ2FyKCkge1xuICAgIGlmICh0aGlzLmlzU2VnbWVudFVubWFwcGVkKCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjb25zdCB7IGJ5dGVBcnJheSwgc3RhcnQgfSA9IHRoaXMuYnl0ZXNcbiAgICBjb25zdCBudW1DaWdhck9wcyA9IHRoaXMuZ2V0KCdfbl9jaWdhcl9vcCcpXG4gICAgbGV0IHAgPSBzdGFydCArIDM2ICsgdGhpcy5nZXQoJ19sX3JlYWRfbmFtZScpXG4gICAgY29uc3Qgc2VxTGVuID0gdGhpcy5nZXQoJ3NlcV9sZW5ndGgnKVxuICAgIGxldCBjaWdhciA9ICcnXG4gICAgbGV0IGxyZWYgPSAwXG5cbiAgICAvLyBjaGVjayBmb3IgQ0cgdGFnIGJ5IGluc3BlY3Rpbmcgd2hldGhlciB0aGUgQ0lHQVIgZmllbGRcbiAgICAvLyBjb250YWlucyBhIGNsaXAgdGhhdCBjb25zdW1lcyBlbnRpcmUgc2VxTGVuXG4gICAgbGV0IGNpZ29wID0gYnl0ZUFycmF5LnJlYWRJbnQzMkxFKHApXG4gICAgbGV0IGxvcCA9IGNpZ29wID4+IDRcbiAgICBsZXQgb3AgPSBDSUdBUl9ERUNPREVSW2NpZ29wICYgMHhmXVxuICAgIGlmIChvcCA9PT0gJ1MnICYmIGxvcCA9PT0gc2VxTGVuKSB7XG4gICAgICAvLyBpZiB0aGVyZSBpcyBhIENHIHRoZSBzZWNvbmQgQ0lHQVIgZmllbGQgd2lsbFxuICAgICAgLy8gYmUgYSBOIHRhZyB0aGUgcmVwcmVzZW50cyB0aGUgbGVuZ3RoIG9uIHJlZlxuICAgICAgcCArPSA0XG4gICAgICBjaWdvcCA9IGJ5dGVBcnJheS5yZWFkSW50MzJMRShwKVxuICAgICAgbG9wID0gY2lnb3AgPj4gNFxuICAgICAgb3AgPSBDSUdBUl9ERUNPREVSW2NpZ29wICYgMHhmXVxuICAgICAgaWYgKG9wICE9PSAnTicpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdDRyB0YWcgd2l0aCBubyBOIHRhZycpXG4gICAgICB9XG4gICAgICB0aGlzLmRhdGEubGVuZ3RoX29uX3JlZiA9IGxvcFxuICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdDRycpXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbnVtQ2lnYXJPcHM7ICsrYykge1xuICAgICAgICBjaWdvcCA9IGJ5dGVBcnJheS5yZWFkSW50MzJMRShwKVxuICAgICAgICBsb3AgPSBjaWdvcCA+PiA0XG4gICAgICAgIG9wID0gQ0lHQVJfREVDT0RFUltjaWdvcCAmIDB4Zl1cbiAgICAgICAgY2lnYXIgKz0gbG9wICsgb3BcblxuICAgICAgICAvLyBzb2Z0IGNsaXAsIGhhcmQgY2xpcCwgYW5kIGluc2VydGlvbiBkb24ndCBjb3VudCB0b3dhcmRcbiAgICAgICAgLy8gdGhlIGxlbmd0aCBvbiB0aGUgcmVmZXJlbmNlXG4gICAgICAgIGlmIChvcCAhPT0gJ0gnICYmIG9wICE9PSAnUycgJiYgb3AgIT09ICdJJykge1xuICAgICAgICAgIGxyZWYgKz0gbG9wXG4gICAgICAgIH1cblxuICAgICAgICBwICs9IDRcbiAgICAgIH1cblxuICAgICAgdGhpcy5kYXRhLmxlbmd0aF9vbl9yZWYgPSBscmVmXG4gICAgICByZXR1cm4gY2lnYXJcbiAgICB9XG4gIH1cblxuICBfZmxhZ3MoKSB7fVxuXG4gIGxlbmd0aF9vbl9yZWYoKSB7XG4gICAgdGhpcy5nZXQoJ2NpZ2FyJykgLy8gdGhlIGxlbmd0aF9vbl9yZWYgaXMgc2V0IGFzIGFcbiAgICAvLyBzaWRlIGVmZmVjdCBvZiB0aGUgQ0lHQVIgcGFyc2luZ1xuICAgIHJldHVybiB0aGlzLmRhdGEubGVuZ3RoX29uX3JlZlxuICB9XG5cbiAgX25fY2lnYXJfb3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdfZmxhZ19uYycpICYgMHhmZmZmXG4gIH1cblxuICBfbF9yZWFkX25hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdfYmluX21xX25sJykgJiAweGZmXG4gIH1cblxuICAvKipcbiAgICogbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzZXF1ZW5jZSBmaWVsZFxuICAgKi9cbiAgX3NlcV9ieXRlcygpIHtcbiAgICByZXR1cm4gKHRoaXMuZ2V0KCdzZXFfbGVuZ3RoJykgKyAxKSA+PiAxXG4gIH1cblxuICBnZXRSZWFkQmFzZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VxKClcbiAgfVxuXG4gIHNlcSgpIHtcbiAgICBjb25zdCB7IGJ5dGVBcnJheSB9ID0gdGhpcy5ieXRlc1xuICAgIGNvbnN0IHAgPSB0aGlzLmJ5dGVzLnN0YXJ0ICsgMzYgKyB0aGlzLmdldCgnX2xfcmVhZF9uYW1lJykgKyB0aGlzLmdldCgnX25fY2lnYXJfb3AnKSAqIDRcbiAgICBjb25zdCBzZXFCeXRlcyA9IHRoaXMuZ2V0KCdfc2VxX2J5dGVzJylcbiAgICBjb25zdCBsZW4gPSB0aGlzLmdldCgnc2VxX2xlbmd0aCcpXG4gICAgbGV0IGJ1ZiA9ICcnXG4gICAgbGV0IGkgPSAwXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBzZXFCeXRlczsgKytqKSB7XG4gICAgICBjb25zdCBzYiA9IGJ5dGVBcnJheVtwICsgal1cbiAgICAgIGJ1ZiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFNFUVJFVF9ERUNPREVSWyhzYiAmIDB4ZjApID4+IDRdKVxuICAgICAgaSsrXG4gICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICBidWYgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShTRVFSRVRfREVDT0RFUltzYiAmIDB4MGZdKVxuICAgICAgICBpKytcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ1ZlxuICB9XG5cbiAgLy8gYWRhcHRlZCBmcm9tIGlndi5qc1xuICBnZXRQYWlyT3JpZW50YXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLmlzU2VnbWVudFVubWFwcGVkKCkgJiYgIXRoaXMuaXNNYXRlVW5tYXBwZWQoKSAmJiB0aGlzLl9yZWZJRCA9PT0gdGhpcy5fbmV4dF9yZWZpZCgpKSB7XG4gICAgICBjb25zdCBzMSA9IHRoaXMuaXNSZXZlcnNlQ29tcGxlbWVudGVkKCkgPyAnUicgOiAnRidcbiAgICAgIGNvbnN0IHMyID0gdGhpcy5pc01hdGVSZXZlcnNlQ29tcGxlbWVudGVkKCkgPyAnUicgOiAnRidcbiAgICAgIGxldCBvMSA9ICcgJ1xuICAgICAgbGV0IG8yID0gJyAnXG4gICAgICBpZiAodGhpcy5pc1JlYWQxKCkpIHtcbiAgICAgICAgbzEgPSAnMSdcbiAgICAgICAgbzIgPSAnMidcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1JlYWQyKCkpIHtcbiAgICAgICAgbzEgPSAnMidcbiAgICAgICAgbzIgPSAnMSdcbiAgICAgIH1cblxuICAgICAgY29uc3QgdG1wID0gW11cbiAgICAgIGNvbnN0IGlzaXplID0gdGhpcy50ZW1wbGF0ZV9sZW5ndGgoKVxuICAgICAgaWYgKGlzaXplID4gMCkge1xuICAgICAgICB0bXBbMF0gPSBzMVxuICAgICAgICB0bXBbMV0gPSBvMVxuICAgICAgICB0bXBbMl0gPSBzMlxuICAgICAgICB0bXBbM10gPSBvMlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG1wWzJdID0gczFcbiAgICAgICAgdG1wWzNdID0gbzFcbiAgICAgICAgdG1wWzBdID0gczJcbiAgICAgICAgdG1wWzFdID0gbzJcbiAgICAgIH1cbiAgICAgIHJldHVybiB0bXAuam9pbignJylcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIF9iaW5fbXFfbmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnl0ZXMuYnl0ZUFycmF5LnJlYWRJbnQzMkxFKHRoaXMuYnl0ZXMuc3RhcnQgKyAxMilcbiAgfVxuXG4gIF9mbGFnX25jKCkge1xuICAgIHJldHVybiB0aGlzLmJ5dGVzLmJ5dGVBcnJheS5yZWFkSW50MzJMRSh0aGlzLmJ5dGVzLnN0YXJ0ICsgMTYpXG4gIH1cblxuICBzZXFfbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLmJ5dGVzLmJ5dGVBcnJheS5yZWFkSW50MzJMRSh0aGlzLmJ5dGVzLnN0YXJ0ICsgMjApXG4gIH1cblxuICBfbmV4dF9yZWZpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5ieXRlcy5ieXRlQXJyYXkucmVhZEludDMyTEUodGhpcy5ieXRlcy5zdGFydCArIDI0KVxuICB9XG5cbiAgX25leHRfcG9zKCkge1xuICAgIHJldHVybiB0aGlzLmJ5dGVzLmJ5dGVBcnJheS5yZWFkSW50MzJMRSh0aGlzLmJ5dGVzLnN0YXJ0ICsgMjgpXG4gIH1cblxuICB0ZW1wbGF0ZV9sZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnl0ZXMuYnl0ZUFycmF5LnJlYWRJbnQzMkxFKHRoaXMuYnl0ZXMuc3RhcnQgKyAzMilcbiAgfVxuXG4gIHRvSlNPTigpIHtcbiAgICBjb25zdCBkYXRhOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge31cbiAgICBPYmplY3Qua2V5cyh0aGlzKS5mb3JFYWNoKGsgPT4ge1xuICAgICAgaWYgKGsuY2hhckF0KDApID09PSAnXycgfHwgayA9PT0gJ2J5dGVzJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgZGF0YVtrXSA9IHRoaXNba11cbiAgICB9KVxuXG4gICAgcmV0dXJuIGRhdGFcbiAgfVxufVxuIl19
543
+ //# sourceMappingURL=record.js.map