@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/bamFile.js CHANGED
@@ -1,1223 +1,695 @@
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 = exports.BAM_MAGIC = void 0;
12
-
13
- var _now = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/date/now"));
14
-
15
- var _sort = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/sort"));
16
-
17
- var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
18
-
19
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
20
-
21
- var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
22
-
23
- var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise"));
24
-
25
- var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
26
-
27
- var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));
28
-
29
- var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
30
-
31
- var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));
32
-
33
- var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));
34
-
35
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));
36
-
37
- var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));
38
-
39
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));
40
-
41
- var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));
42
-
43
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
44
-
45
- var _wrapAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/wrapAsyncGenerator"));
46
-
47
- var _awaitAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/awaitAsyncGenerator"));
48
-
49
- var _asyncGeneratorDelegate2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncGeneratorDelegate"));
50
-
51
- var _asyncIterator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncIterator"));
52
-
53
- var _abortablePromiseCache = _interopRequireDefault(require("abortable-promise-cache"));
54
-
55
- var _bai = _interopRequireDefault(require("./bai"));
56
-
57
- var _csi = _interopRequireDefault(require("./csi"));
58
-
59
- var _bufferCrc = _interopRequireDefault(require("buffer-crc32"));
60
-
61
- var _bgzfFilehandle = require("@gmod/bgzf-filehandle");
62
-
63
- var _object = _interopRequireDefault(require("object.entries-ponyfill"));
64
-
65
- var _quickLru = _interopRequireDefault(require("quick-lru"));
66
-
67
- var _genericFilehandle = require("generic-filehandle");
68
-
69
- var _record = _interopRequireDefault(require("./record"));
70
-
71
- var _sam = require("./sam");
72
-
73
- var _util = require("./util");
74
-
75
- var BAM_MAGIC = 21840194;
76
- exports.BAM_MAGIC = BAM_MAGIC;
77
- var blockLen = 1 << 16;
78
-
79
- var BamFile = /*#__PURE__*/function () {
80
- /**
81
- * @param {object} args
82
- * @param {string} [args.bamPath]
83
- * @param {FileHandle} [args.bamFilehandle]
84
- * @param {string} [args.baiPath]
85
- * @param {FileHandle} [args.baiFilehandle]
86
- */
87
- function BamFile(_ref) {
88
- var _context;
89
-
90
- var bamFilehandle = _ref.bamFilehandle,
91
- bamPath = _ref.bamPath,
92
- bamUrl = _ref.bamUrl,
93
- baiPath = _ref.baiPath,
94
- baiFilehandle = _ref.baiFilehandle,
95
- baiUrl = _ref.baiUrl,
96
- csiPath = _ref.csiPath,
97
- csiFilehandle = _ref.csiFilehandle,
98
- csiUrl = _ref.csiUrl,
99
- cacheSize = _ref.cacheSize,
100
- fetchSizeLimit = _ref.fetchSizeLimit,
101
- chunkSizeLimit = _ref.chunkSizeLimit,
102
- _ref$yieldThreadTime = _ref.yieldThreadTime,
103
- yieldThreadTime = _ref$yieldThreadTime === void 0 ? 100 : _ref$yieldThreadTime,
104
- _ref$renameRefSeqs = _ref.renameRefSeqs,
105
- renameRefSeqs = _ref$renameRefSeqs === void 0 ? function (n) {
106
- return n;
107
- } : _ref$renameRefSeqs;
108
- (0, _classCallCheck2.default)(this, BamFile);
109
- (0, _defineProperty2.default)(this, "renameRefSeq", void 0);
110
- (0, _defineProperty2.default)(this, "bam", void 0);
111
- (0, _defineProperty2.default)(this, "index", void 0);
112
- (0, _defineProperty2.default)(this, "chunkSizeLimit", void 0);
113
- (0, _defineProperty2.default)(this, "fetchSizeLimit", void 0);
114
- (0, _defineProperty2.default)(this, "header", void 0);
115
- (0, _defineProperty2.default)(this, "featureCache", void 0);
116
- (0, _defineProperty2.default)(this, "chrToIndex", void 0);
117
- (0, _defineProperty2.default)(this, "indexToChr", void 0);
118
- (0, _defineProperty2.default)(this, "yieldThreadTime", void 0);
119
- this.renameRefSeq = renameRefSeqs;
120
-
121
- if (bamFilehandle) {
122
- this.bam = bamFilehandle;
123
- } else if (bamPath) {
124
- this.bam = new _genericFilehandle.LocalFile(bamPath);
125
- } else if (bamUrl) {
126
- this.bam = new _genericFilehandle.RemoteFile(bamUrl);
127
- } else {
128
- throw new Error('unable to initialize bam');
129
- }
130
-
131
- if (csiFilehandle) {
132
- this.index = new _csi.default({
133
- filehandle: csiFilehandle
134
- });
135
- } else if (csiPath) {
136
- this.index = new _csi.default({
137
- filehandle: new _genericFilehandle.LocalFile(csiPath)
138
- });
139
- } else if (csiUrl) {
140
- this.index = new _csi.default({
141
- filehandle: new _genericFilehandle.RemoteFile(csiUrl)
142
- });
143
- } else if (baiFilehandle) {
144
- this.index = new _bai.default({
145
- filehandle: baiFilehandle
146
- });
147
- } else if (baiPath) {
148
- this.index = new _bai.default({
149
- filehandle: new _genericFilehandle.LocalFile(baiPath)
150
- });
151
- } else if (baiUrl) {
152
- this.index = new _bai.default({
153
- filehandle: new _genericFilehandle.RemoteFile(baiUrl)
154
- });
155
- } else if (bamPath) {
156
- this.index = new _bai.default({
157
- filehandle: new _genericFilehandle.LocalFile("".concat(bamPath, ".bai"))
158
- });
159
- } else if (bamUrl) {
160
- this.index = new _bai.default({
161
- filehandle: new _genericFilehandle.RemoteFile("".concat(bamUrl, ".bai"))
162
- });
163
- } else {
164
- throw new Error('unable to infer index format');
165
- }
166
-
167
- this.featureCache = new _abortablePromiseCache.default({
168
- cache: new _quickLru.default({
169
- maxSize: cacheSize !== undefined ? cacheSize : 50
170
- }),
171
- fill: (0, _bind.default)(_context = this._readChunk).call(_context, this)
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
172
9
  });
173
- this.fetchSizeLimit = fetchSizeLimit || 500000000; // 500MB
174
-
175
- this.chunkSizeLimit = chunkSizeLimit || 300000000; // 300MB
176
-
177
- this.yieldThreadTime = yieldThreadTime;
178
- }
179
-
180
- (0, _createClass2.default)(BamFile, [{
181
- key: "getHeader",
182
- value: function () {
183
- var _getHeader = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
184
- var origOpts,
185
- opts,
186
- indexData,
187
- ret,
188
- buffer,
189
- res,
190
- bytesRead,
191
- uncba,
192
- headLen,
193
- _yield$this$_readRefS,
194
- chrToIndex,
195
- indexToChr,
196
- _args = arguments;
197
-
198
- return _regenerator.default.wrap(function _callee$(_context2) {
199
- while (1) {
200
- switch (_context2.prev = _context2.next) {
201
- case 0:
202
- origOpts = _args.length > 0 && _args[0] !== undefined ? _args[0] : {};
203
- opts = (0, _util.makeOpts)(origOpts);
204
- _context2.next = 4;
205
- return this.index.parse(opts);
206
-
207
- case 4:
208
- indexData = _context2.sent;
209
- ret = indexData.firstDataLine ? indexData.firstDataLine.blockPosition + 65535 : undefined;
210
-
211
- if (!ret) {
212
- _context2.next = 17;
213
- break;
214
- }
215
-
216
- _context2.next = 9;
217
- return this.bam.read(Buffer.alloc(ret + blockLen), 0, ret + blockLen, 0, opts);
218
-
219
- case 9:
220
- res = _context2.sent;
221
- bytesRead = res.bytesRead;
222
- buffer = res.buffer;
223
-
224
- if (bytesRead) {
225
- _context2.next = 14;
226
- break;
227
- }
228
-
229
- throw new Error('Error reading header');
230
-
231
- case 14:
232
- if (bytesRead < ret) {
233
- buffer = (0, _slice.default)(buffer).call(buffer, 0, bytesRead);
234
- } else {
235
- buffer = (0, _slice.default)(buffer).call(buffer, 0, ret);
236
- }
237
-
238
- _context2.next = 20;
239
- break;
240
-
241
- case 17:
242
- _context2.next = 19;
243
- return this.bam.readFile(opts);
244
-
245
- case 19:
246
- buffer = _context2.sent;
247
-
248
- case 20:
249
- _context2.next = 22;
250
- return (0, _bgzfFilehandle.unzip)(buffer);
251
-
252
- case 22:
253
- uncba = _context2.sent;
254
-
255
- if (!(uncba.readInt32LE(0) !== BAM_MAGIC)) {
256
- _context2.next = 25;
257
- break;
258
- }
259
-
260
- throw new Error('Not a BAM file');
261
-
262
- case 25:
263
- headLen = uncba.readInt32LE(4);
264
- this.header = uncba.toString('utf8', 8, 8 + headLen);
265
- _context2.next = 29;
266
- return this._readRefSeqs(headLen + 8, 65535, opts);
267
-
268
- case 29:
269
- _yield$this$_readRefS = _context2.sent;
270
- chrToIndex = _yield$this$_readRefS.chrToIndex;
271
- indexToChr = _yield$this$_readRefS.indexToChr;
272
- this.chrToIndex = chrToIndex;
273
- this.indexToChr = indexToChr;
274
- return _context2.abrupt("return", (0, _sam.parseHeaderText)(this.header));
275
-
276
- case 35:
277
- case "end":
278
- return _context2.stop();
279
- }
280
- }
281
- }, _callee, this);
282
- }));
283
-
284
- function getHeader() {
285
- return _getHeader.apply(this, arguments);
286
- }
287
-
288
- return getHeader;
289
- }()
290
- }, {
291
- key: "getHeaderText",
292
- value: function () {
293
- var _getHeaderText = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
294
- var opts,
295
- _args2 = arguments;
296
- return _regenerator.default.wrap(function _callee2$(_context3) {
297
- while (1) {
298
- switch (_context3.prev = _context3.next) {
299
- case 0:
300
- opts = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : {};
301
- _context3.next = 3;
302
- return this.getHeader(opts);
303
-
304
- case 3:
305
- return _context3.abrupt("return", this.header);
306
-
307
- case 4:
308
- case "end":
309
- return _context3.stop();
310
- }
311
- }
312
- }, _callee2, this);
313
- }));
314
-
315
- function getHeaderText() {
316
- return _getHeaderText.apply(this, arguments);
317
- }
318
-
319
- return getHeaderText;
320
- }() // the full length of the refseq block is not given in advance so this grabs a chunk and
321
- // doubles it if all refseqs haven't been processed
322
-
323
- }, {
324
- key: "_readRefSeqs",
325
- value: function () {
326
- var _readRefSeqs2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(start, refSeqBytes) {
327
- var opts,
328
- res,
329
- bytesRead,
330
- buffer,
331
- uncba,
332
- nRef,
333
- p,
334
- chrToIndex,
335
- indexToChr,
336
- i,
337
- lName,
338
- refName,
339
- lRef,
340
- _args3 = arguments;
341
- return _regenerator.default.wrap(function _callee3$(_context4) {
342
- while (1) {
343
- switch (_context4.prev = _context4.next) {
344
- case 0:
345
- opts = _args3.length > 2 && _args3[2] !== undefined ? _args3[2] : {};
346
-
347
- if (!(start > refSeqBytes)) {
348
- _context4.next = 3;
349
- break;
350
- }
351
-
352
- return _context4.abrupt("return", this._readRefSeqs(start, refSeqBytes * 2, opts));
353
-
354
- case 3:
355
- _context4.next = 5;
356
- return this.bam.read(Buffer.alloc(refSeqBytes + blockLen), 0, refSeqBytes, 0, opts);
357
-
358
- case 5:
359
- res = _context4.sent;
360
- bytesRead = res.bytesRead;
361
- buffer = res.buffer;
362
-
363
- if (bytesRead) {
364
- _context4.next = 10;
365
- break;
366
- }
367
-
368
- throw new Error('Error reading refseqs from header');
369
-
370
- case 10:
371
- if (bytesRead < refSeqBytes) {
372
- buffer = (0, _slice.default)(buffer).call(buffer, 0, bytesRead);
373
- } else {
374
- buffer = (0, _slice.default)(buffer).call(buffer, 0, refSeqBytes);
375
- }
376
-
377
- _context4.next = 13;
378
- return (0, _bgzfFilehandle.unzip)(buffer);
379
-
380
- case 13:
381
- uncba = _context4.sent;
382
- nRef = uncba.readInt32LE(start);
383
- p = start + 4;
384
- chrToIndex = {};
385
- indexToChr = [];
386
- i = 0;
387
-
388
- case 19:
389
- if (!(i < nRef)) {
390
- _context4.next = 35;
391
- break;
392
- }
393
-
394
- _context4.next = 22;
395
- return (0, _util.abortBreakPoint)(opts.signal);
396
-
397
- case 22:
398
- lName = uncba.readInt32LE(p);
399
- refName = uncba.toString('utf8', p + 4, p + 4 + lName - 1);
400
- refName = this.renameRefSeq(refName);
401
- lRef = uncba.readInt32LE(p + lName + 4);
402
- chrToIndex[refName] = i;
403
- indexToChr.push({
404
- refName: refName,
405
- length: lRef
406
- });
407
- p = p + 8 + lName;
408
-
409
- if (!(p > uncba.length)) {
410
- _context4.next = 32;
411
- break;
412
- }
413
-
414
- console.warn("BAM header is very big. Re-fetching ".concat(refSeqBytes, " bytes."));
415
- return _context4.abrupt("return", this._readRefSeqs(start, refSeqBytes * 2, opts));
416
-
417
- case 32:
418
- i += 1;
419
- _context4.next = 19;
420
- break;
421
-
422
- case 35:
423
- return _context4.abrupt("return", {
424
- chrToIndex: chrToIndex,
425
- indexToChr: indexToChr
426
- });
427
-
428
- case 36:
429
- case "end":
430
- return _context4.stop();
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
431
32
  }
432
- }
433
- }, _callee3, this);
434
- }));
435
-
436
- function _readRefSeqs(_x, _x2) {
437
- return _readRefSeqs2.apply(this, arguments);
438
- }
439
-
440
- return _readRefSeqs;
441
- }()
442
- }, {
443
- key: "getRecordsForRange",
444
- value: function () {
445
- var _getRecordsForRange = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(chr, min, max) {
446
- var opts,
447
- records,
448
- _iteratorNormalCompletion,
449
- _didIteratorError,
450
- _iteratorError,
451
- _iterator,
452
- _step,
453
- _value,
454
- chunk,
455
- _args4 = arguments;
456
-
457
- return _regenerator.default.wrap(function _callee4$(_context5) {
458
- while (1) {
459
- switch (_context5.prev = _context5.next) {
460
- case 0:
461
- opts = _args4.length > 3 && _args4[3] !== undefined ? _args4[3] : {
462
- viewAsPairs: false,
463
- pairAcrossChr: false,
464
- maxInsertSize: 200000
465
- };
466
- records = [];
467
- _iteratorNormalCompletion = true;
468
- _didIteratorError = false;
469
- _context5.prev = 4;
470
- _iterator = (0, _asyncIterator2.default)(this.streamRecordsForRange(chr, min, max, opts));
471
-
472
- case 6:
473
- _context5.next = 8;
474
- return _iterator.next();
475
-
476
- case 8:
477
- _step = _context5.sent;
478
- _iteratorNormalCompletion = _step.done;
479
- _context5.next = 12;
480
- return _step.value;
481
-
482
- case 12:
483
- _value = _context5.sent;
484
-
485
- if (_iteratorNormalCompletion) {
486
- _context5.next = 19;
487
- break;
488
- }
489
-
490
- chunk = _value;
491
- records = (0, _concat.default)(records).call(records, chunk);
492
-
493
- case 16:
494
- _iteratorNormalCompletion = true;
495
- _context5.next = 6;
496
- break;
497
-
498
- case 19:
499
- _context5.next = 25;
500
- break;
501
-
502
- case 21:
503
- _context5.prev = 21;
504
- _context5.t0 = _context5["catch"](4);
505
- _didIteratorError = true;
506
- _iteratorError = _context5.t0;
507
-
508
- case 25:
509
- _context5.prev = 25;
510
- _context5.prev = 26;
511
-
512
- if (!(!_iteratorNormalCompletion && _iterator.return != null)) {
513
- _context5.next = 30;
514
- break;
515
- }
516
-
517
- _context5.next = 30;
518
- return _iterator.return();
519
-
520
- case 30:
521
- _context5.prev = 30;
522
-
523
- if (!_didIteratorError) {
524
- _context5.next = 33;
525
- break;
526
- }
527
-
528
- throw _iteratorError;
529
-
530
- case 33:
531
- return _context5.finish(30);
532
-
533
- case 34:
534
- return _context5.finish(25);
535
-
536
- case 35:
537
- return _context5.abrupt("return", records);
538
-
539
- case 36:
540
- case "end":
541
- return _context5.stop();
542
- }
543
- }
544
- }, _callee4, this, [[4, 21, 25, 35], [26,, 30, 34]]);
545
- }));
546
-
547
- function getRecordsForRange(_x3, _x4, _x5) {
548
- return _getRecordsForRange.apply(this, arguments);
549
- }
550
-
551
- return getRecordsForRange;
552
- }()
553
- }, {
554
- key: "streamRecordsForRange",
555
- value: function streamRecordsForRange(chr, min, max) {
556
- var _this = this;
557
-
558
- var opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {
559
- viewAsPairs: false,
560
- pairAcrossChr: false,
561
- maxInsertSize: 200000
562
- };
563
- return (0, _wrapAsyncGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5() {
564
- var _context7;
565
-
566
- var chrId, chunks, i, size, _context6, totalSize, _context8;
567
-
568
- return _regenerator.default.wrap(function _callee5$(_context9) {
569
- while (1) {
570
- switch (_context9.prev = _context9.next) {
571
- case 0:
572
- // todo regularize refseq names
573
- opts.viewAsPairs = opts.viewAsPairs || false;
574
- opts.pairAcrossChr = opts.pairAcrossChr || false;
575
- opts.maxInsertSize = opts.maxInsertSize !== undefined ? opts.maxInsertSize : 200000;
576
- chrId = _this.chrToIndex && _this.chrToIndex[chr];
577
-
578
- if (chrId >= 0) {
579
- _context9.next = 8;
580
- break;
581
- }
582
-
583
- chunks = [];
584
- _context9.next = 13;
585
- break;
586
-
587
- case 8:
588
- _context9.next = 10;
589
- return (0, _awaitAsyncGenerator2.default)(_this.index.blocksForRange(chrId, min - 1, max, opts));
590
-
591
- case 10:
592
- chunks = _context9.sent;
593
-
594
- if (chunks) {
595
- _context9.next = 13;
596
- break;
597
- }
598
-
599
- throw new Error('Error in index fetch');
600
-
601
- case 13:
602
- i = 0;
603
-
604
- case 14:
605
- if (!(i < chunks.length)) {
606
- _context9.next = 23;
607
- break;
608
- }
609
-
610
- _context9.next = 17;
611
- return (0, _awaitAsyncGenerator2.default)((0, _util.abortBreakPoint)(opts.signal));
612
-
613
- case 17:
614
- size = chunks[i].fetchedSize();
615
-
616
- if (!(size > _this.chunkSizeLimit)) {
617
- _context9.next = 20;
618
- break;
619
- }
620
-
621
- throw new Error((0, _concat.default)(_context6 = "Too many BAM features. BAM chunk size ".concat(size, " bytes exceeds chunkSizeLimit of ")).call(_context6, _this.chunkSizeLimit));
622
-
623
- case 20:
624
- i += 1;
625
- _context9.next = 14;
626
- break;
627
-
628
- case 23:
629
- totalSize = (0, _reduce.default)(_context7 = (0, _map.default)(chunks).call(chunks, function (s) {
630
- return s.fetchedSize();
631
- })).call(_context7, function (a, b) {
632
- return a + b;
633
- }, 0);
634
-
635
- if (!(totalSize > _this.fetchSizeLimit)) {
636
- _context9.next = 26;
637
- break;
638
- }
639
-
640
- throw new Error((0, _concat.default)(_context8 = "data size of ".concat(totalSize.toLocaleString(), " bytes exceeded fetch size limit of ")).call(_context8, _this.fetchSizeLimit.toLocaleString(), " bytes"));
641
-
642
- case 26:
643
- return _context9.delegateYield((0, _asyncGeneratorDelegate2.default)((0, _asyncIterator2.default)(_this._fetchChunkFeatures(chunks, chrId, min, max, opts)), _awaitAsyncGenerator2.default), "t0", 27);
644
-
645
- case 27:
646
- case "end":
647
- return _context9.stop();
648
- }
649
- }
650
- }, _callee5);
651
- }))();
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
39
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
40
+ var m = o[Symbol.asyncIterator], i;
41
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
42
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
43
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
44
+ };
45
+ var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
46
+ var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
47
+ var i, p;
48
+ return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
49
+ function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
50
+ };
51
+ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
52
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
53
+ var g = generator.apply(thisArg, _arguments || []), i, q = [];
54
+ return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
55
+ function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
56
+ function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
57
+ function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
58
+ function fulfill(value) { resume("next", value); }
59
+ function reject(value) { resume("throw", value); }
60
+ function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
61
+ };
62
+ var __values = (this && this.__values) || function(o) {
63
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
64
+ if (m) return m.call(o);
65
+ if (o && typeof o.length === "number") return {
66
+ next: function () {
67
+ if (o && i >= o.length) o = void 0;
68
+ return { value: o && o[i++], done: !o };
69
+ }
70
+ };
71
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
72
+ };
73
+ var __importDefault = (this && this.__importDefault) || function (mod) {
74
+ return (mod && mod.__esModule) ? mod : { "default": mod };
75
+ };
76
+ Object.defineProperty(exports, "__esModule", { value: true });
77
+ exports.BAM_MAGIC = void 0;
78
+ var bai_1 = __importDefault(require("./bai"));
79
+ var csi_1 = __importDefault(require("./csi"));
80
+ var buffer_crc32_1 = __importDefault(require("buffer-crc32"));
81
+ var bgzf_filehandle_1 = require("@gmod/bgzf-filehandle");
82
+ var object_entries_ponyfill_1 = __importDefault(require("object.entries-ponyfill"));
83
+ var generic_filehandle_1 = require("generic-filehandle");
84
+ var record_1 = __importDefault(require("./record"));
85
+ var sam_1 = require("./sam");
86
+ var util_1 = require("./util");
87
+ exports.BAM_MAGIC = 21840194;
88
+ var blockLen = 1 << 16;
89
+ var BamFile = /** @class */ (function () {
90
+ /**
91
+ * @param {object} args
92
+ * @param {string} [args.bamPath]
93
+ * @param {FileHandle} [args.bamFilehandle]
94
+ * @param {string} [args.baiPath]
95
+ * @param {FileHandle} [args.baiFilehandle]
96
+ */
97
+ function BamFile(_a) {
98
+ var bamFilehandle = _a.bamFilehandle, bamPath = _a.bamPath, bamUrl = _a.bamUrl, baiPath = _a.baiPath, baiFilehandle = _a.baiFilehandle, baiUrl = _a.baiUrl, csiPath = _a.csiPath, csiFilehandle = _a.csiFilehandle, csiUrl = _a.csiUrl, fetchSizeLimit = _a.fetchSizeLimit, chunkSizeLimit = _a.chunkSizeLimit, _b = _a.yieldThreadTime, yieldThreadTime = _b === void 0 ? 100 : _b, _c = _a.renameRefSeqs, renameRefSeqs = _c === void 0 ? function (n) { return n; } : _c;
99
+ this.renameRefSeq = renameRefSeqs;
100
+ if (bamFilehandle) {
101
+ this.bam = bamFilehandle;
102
+ }
103
+ else if (bamPath) {
104
+ this.bam = new generic_filehandle_1.LocalFile(bamPath);
105
+ }
106
+ else if (bamUrl) {
107
+ this.bam = new generic_filehandle_1.RemoteFile(bamUrl);
108
+ }
109
+ else {
110
+ throw new Error('unable to initialize bam');
111
+ }
112
+ if (csiFilehandle) {
113
+ this.index = new csi_1.default({ filehandle: csiFilehandle });
114
+ }
115
+ else if (csiPath) {
116
+ this.index = new csi_1.default({ filehandle: new generic_filehandle_1.LocalFile(csiPath) });
117
+ }
118
+ else if (csiUrl) {
119
+ this.index = new csi_1.default({ filehandle: new generic_filehandle_1.RemoteFile(csiUrl) });
120
+ }
121
+ else if (baiFilehandle) {
122
+ this.index = new bai_1.default({ filehandle: baiFilehandle });
123
+ }
124
+ else if (baiPath) {
125
+ this.index = new bai_1.default({ filehandle: new generic_filehandle_1.LocalFile(baiPath) });
126
+ }
127
+ else if (baiUrl) {
128
+ this.index = new bai_1.default({ filehandle: new generic_filehandle_1.RemoteFile(baiUrl) });
129
+ }
130
+ else if (bamPath) {
131
+ this.index = new bai_1.default({ filehandle: new generic_filehandle_1.LocalFile("".concat(bamPath, ".bai")) });
132
+ }
133
+ else if (bamUrl) {
134
+ this.index = new bai_1.default({ filehandle: new generic_filehandle_1.RemoteFile("".concat(bamUrl, ".bai")) });
135
+ }
136
+ else {
137
+ throw new Error('unable to infer index format');
138
+ }
139
+ this.fetchSizeLimit = fetchSizeLimit || 500000000; // 500MB
140
+ this.chunkSizeLimit = chunkSizeLimit || 300000000; // 300MB
141
+ this.yieldThreadTime = yieldThreadTime;
652
142
  }
653
- }, {
654
- key: "_fetchChunkFeatures",
655
- value: function _fetchChunkFeatures(chunks, chrId, min, max, opts) {
656
- var _this2 = this;
657
-
658
- return (0, _wrapAsyncGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6() {
659
- var featPromises, done, i, c, _yield$_awaitAsyncGen, data, cpositions, dpositions, chunk, promise, _i2;
660
-
661
- return _regenerator.default.wrap(function _callee6$(_context10) {
662
- while (1) {
663
- switch (_context10.prev = _context10.next) {
664
- case 0:
665
- featPromises = [];
666
- done = false;
667
- i = 0;
668
-
669
- case 3:
670
- if (!(i < chunks.length)) {
671
- _context10.next = 21;
672
- break;
143
+ BamFile.prototype.getHeader = function (origOpts) {
144
+ if (origOpts === void 0) { origOpts = {}; }
145
+ return __awaiter(this, void 0, void 0, function () {
146
+ var opts, indexData, ret, buffer, res, bytesRead, uncba, headLen, _a, chrToIndex, indexToChr;
147
+ return __generator(this, function (_b) {
148
+ switch (_b.label) {
149
+ case 0:
150
+ opts = (0, util_1.makeOpts)(origOpts);
151
+ return [4 /*yield*/, this.index.parse(opts)];
152
+ case 1:
153
+ indexData = _b.sent();
154
+ ret = indexData.firstDataLine
155
+ ? indexData.firstDataLine.blockPosition + 65535
156
+ : undefined;
157
+ if (!ret) return [3 /*break*/, 3];
158
+ return [4 /*yield*/, this.bam.read(Buffer.alloc(ret + blockLen), 0, ret + blockLen, 0, opts)];
159
+ case 2:
160
+ res = _b.sent();
161
+ bytesRead = res.bytesRead;
162
+ (buffer = res.buffer);
163
+ if (!bytesRead) {
164
+ throw new Error('Error reading header');
165
+ }
166
+ if (bytesRead < ret) {
167
+ buffer = buffer.slice(0, bytesRead);
168
+ }
169
+ else {
170
+ buffer = buffer.slice(0, ret);
171
+ }
172
+ return [3 /*break*/, 5];
173
+ case 3: return [4 /*yield*/, this.bam.readFile(opts)];
174
+ case 4:
175
+ buffer = (_b.sent());
176
+ _b.label = 5;
177
+ case 5: return [4 /*yield*/, (0, bgzf_filehandle_1.unzip)(buffer)];
178
+ case 6:
179
+ uncba = _b.sent();
180
+ if (uncba.readInt32LE(0) !== exports.BAM_MAGIC) {
181
+ throw new Error('Not a BAM file');
182
+ }
183
+ headLen = uncba.readInt32LE(4);
184
+ this.header = uncba.toString('utf8', 8, 8 + headLen);
185
+ return [4 /*yield*/, this._readRefSeqs(headLen + 8, 65535, opts)];
186
+ case 7:
187
+ _a = _b.sent(), chrToIndex = _a.chrToIndex, indexToChr = _a.indexToChr;
188
+ this.chrToIndex = chrToIndex;
189
+ this.indexToChr = indexToChr;
190
+ return [2 /*return*/, (0, sam_1.parseHeaderText)(this.header)];
673
191
  }
674
-
675
- c = chunks[i];
676
- _context10.next = 7;
677
- return (0, _awaitAsyncGenerator2.default)(_this2.featureCache.get(c.toString(), {
678
- chunk: c,
679
- opts: opts
680
- }, opts.signal));
681
-
682
- case 7:
683
- _yield$_awaitAsyncGen = _context10.sent;
684
- data = _yield$_awaitAsyncGen.data;
685
- cpositions = _yield$_awaitAsyncGen.cpositions;
686
- dpositions = _yield$_awaitAsyncGen.dpositions;
687
- chunk = _yield$_awaitAsyncGen.chunk;
688
- promise = _this2.readBamFeatures(data, cpositions, dpositions, chunk).then(function (records) {
689
- var recs = [];
690
-
691
- for (var _i = 0; _i < records.length; _i += 1) {
692
- var feature = records[_i];
693
-
694
- if (feature.seq_id() === chrId) {
695
- if (feature.get('start') >= max) {
696
- // past end of range, can stop iterating
697
- done = true;
698
- break;
699
- } else if (feature.get('end') >= min) {
700
- // must be in range
701
- recs.push(feature);
702
- }
703
- }
704
- }
705
-
706
- return recs;
707
- });
708
- featPromises.push(promise);
709
- _context10.next = 16;
710
- return (0, _awaitAsyncGenerator2.default)(promise);
711
-
712
- case 16:
713
- if (!done) {
714
- _context10.next = 18;
715
- break;
192
+ });
193
+ });
194
+ };
195
+ BamFile.prototype.getHeaderText = function (opts) {
196
+ if (opts === void 0) { opts = {}; }
197
+ return __awaiter(this, void 0, void 0, function () {
198
+ return __generator(this, function (_a) {
199
+ switch (_a.label) {
200
+ case 0: return [4 /*yield*/, this.getHeader(opts)];
201
+ case 1:
202
+ _a.sent();
203
+ return [2 /*return*/, this.header];
716
204
  }
717
-
718
- return _context10.abrupt("break", 21);
719
-
720
- case 18:
721
- i++;
722
- _context10.next = 3;
723
- break;
724
-
725
- case 21:
726
- (0, _util.checkAbortSignal)(opts.signal);
727
- _i2 = 0;
728
-
729
- case 23:
730
- if (!(_i2 < featPromises.length)) {
731
- _context10.next = 29;
732
- break;
205
+ });
206
+ });
207
+ };
208
+ // the full length of the refseq block is not given in advance so this grabs a chunk and
209
+ // doubles it if all refseqs haven't been processed
210
+ BamFile.prototype._readRefSeqs = function (start, refSeqBytes, opts) {
211
+ if (opts === void 0) { opts = {}; }
212
+ return __awaiter(this, void 0, void 0, function () {
213
+ var res, bytesRead, buffer, uncba, nRef, p, chrToIndex, indexToChr, i, lName, refName, lRef;
214
+ return __generator(this, function (_a) {
215
+ switch (_a.label) {
216
+ case 0:
217
+ if (start > refSeqBytes) {
218
+ return [2 /*return*/, this._readRefSeqs(start, refSeqBytes * 2, opts)];
219
+ }
220
+ return [4 /*yield*/, this.bam.read(Buffer.alloc(refSeqBytes + blockLen), 0, refSeqBytes, 0, opts)];
221
+ case 1:
222
+ res = _a.sent();
223
+ bytesRead = res.bytesRead;
224
+ buffer = res.buffer;
225
+ if (!bytesRead) {
226
+ throw new Error('Error reading refseqs from header');
227
+ }
228
+ if (bytesRead < refSeqBytes) {
229
+ buffer = buffer.slice(0, bytesRead);
230
+ }
231
+ else {
232
+ buffer = buffer.slice(0, refSeqBytes);
233
+ }
234
+ return [4 /*yield*/, (0, bgzf_filehandle_1.unzip)(buffer)];
235
+ case 2:
236
+ uncba = _a.sent();
237
+ nRef = uncba.readInt32LE(start);
238
+ p = start + 4;
239
+ chrToIndex = {};
240
+ indexToChr = [];
241
+ i = 0;
242
+ _a.label = 3;
243
+ case 3:
244
+ if (!(i < nRef)) return [3 /*break*/, 6];
245
+ return [4 /*yield*/, (0, util_1.abortBreakPoint)(opts.signal)];
246
+ case 4:
247
+ _a.sent();
248
+ lName = uncba.readInt32LE(p);
249
+ refName = this.renameRefSeq(uncba.toString('utf8', p + 4, p + 4 + lName - 1));
250
+ lRef = uncba.readInt32LE(p + lName + 4);
251
+ chrToIndex[refName] = i;
252
+ indexToChr.push({ refName: refName, length: lRef });
253
+ p = p + 8 + lName;
254
+ if (p > uncba.length) {
255
+ console.warn("BAM header is very big. Re-fetching ".concat(refSeqBytes, " bytes."));
256
+ return [2 /*return*/, this._readRefSeqs(start, refSeqBytes * 2, opts)];
257
+ }
258
+ _a.label = 5;
259
+ case 5:
260
+ i += 1;
261
+ return [3 /*break*/, 3];
262
+ case 6: return [2 /*return*/, { chrToIndex: chrToIndex, indexToChr: indexToChr }];
733
263
  }
734
-
735
- _context10.next = 26;
736
- return featPromises[_i2];
737
-
738
- case 26:
739
- _i2++;
740
- _context10.next = 23;
741
- break;
742
-
743
- case 29:
744
- (0, _util.checkAbortSignal)(opts.signal);
745
-
746
- if (!opts.viewAsPairs) {
747
- _context10.next = 33;
748
- break;
264
+ });
265
+ });
266
+ };
267
+ BamFile.prototype.getRecordsForRange = function (chr, min, max, opts) {
268
+ var e_1, _a;
269
+ if (opts === void 0) { opts = {
270
+ viewAsPairs: false,
271
+ pairAcrossChr: false,
272
+ maxInsertSize: 200000,
273
+ }; }
274
+ return __awaiter(this, void 0, void 0, function () {
275
+ var records, _b, _c, chunk, e_1_1;
276
+ return __generator(this, function (_d) {
277
+ switch (_d.label) {
278
+ case 0:
279
+ records = [];
280
+ _d.label = 1;
281
+ case 1:
282
+ _d.trys.push([1, 6, 7, 12]);
283
+ _b = __asyncValues(this.streamRecordsForRange(chr, min, max, opts));
284
+ _d.label = 2;
285
+ case 2: return [4 /*yield*/, _b.next()];
286
+ case 3:
287
+ if (!(_c = _d.sent(), !_c.done)) return [3 /*break*/, 5];
288
+ chunk = _c.value;
289
+ records = records.concat(chunk);
290
+ _d.label = 4;
291
+ case 4: return [3 /*break*/, 2];
292
+ case 5: return [3 /*break*/, 12];
293
+ case 6:
294
+ e_1_1 = _d.sent();
295
+ e_1 = { error: e_1_1 };
296
+ return [3 /*break*/, 12];
297
+ case 7:
298
+ _d.trys.push([7, , 10, 11]);
299
+ if (!(_c && !_c.done && (_a = _b.return))) return [3 /*break*/, 9];
300
+ return [4 /*yield*/, _a.call(_b)];
301
+ case 8:
302
+ _d.sent();
303
+ _d.label = 9;
304
+ case 9: return [3 /*break*/, 11];
305
+ case 10:
306
+ if (e_1) throw e_1.error;
307
+ return [7 /*endfinally*/];
308
+ case 11: return [7 /*endfinally*/];
309
+ case 12: return [2 /*return*/, records];
749
310
  }
750
-
751
- _context10.next = 33;
752
- return _this2.fetchPairs(chrId, featPromises, opts);
753
-
754
- case 33:
755
- case "end":
756
- return _context10.stop();
757
- }
758
- }
759
- }, _callee6);
760
- }))();
761
- }
762
- }, {
763
- key: "fetchPairs",
764
- value: function () {
765
- var _fetchPairs = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee10(chrId, featPromises, opts) {
766
- var _this3 = this,
767
- _context14,
768
- _context15;
769
-
770
- var unmatedPairs, readIds, matePromises, mateBlocks, mateChunks, i, mateTotalSize, _context16, mateFeatPromises, newMateFeats, featuresRet, newMates;
771
-
772
- return _regenerator.default.wrap(function _callee10$(_context18) {
773
- while (1) {
774
- switch (_context18.prev = _context18.next) {
775
- case 0:
776
- unmatedPairs = {};
777
- readIds = {};
778
- _context18.next = 4;
779
- return _promise.default.all((0, _map.default)(featPromises).call(featPromises, /*#__PURE__*/function () {
780
- var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(f) {
781
- var _context11;
782
-
783
- var ret, readNames, i, name, id;
784
- return _regenerator.default.wrap(function _callee7$(_context12) {
785
- while (1) {
786
- switch (_context12.prev = _context12.next) {
787
- case 0:
788
- _context12.next = 2;
789
- return f;
790
-
791
- case 2:
792
- ret = _context12.sent;
793
- readNames = {};
794
-
795
- for (i = 0; i < ret.length; i++) {
796
- name = ret[i].name();
797
- id = ret[i].id();
798
-
799
- if (!readNames[name]) {
800
- readNames[name] = 0;
801
- }
802
-
803
- readNames[name]++;
804
- readIds[id] = 1;
805
- }
806
-
807
- (0, _forEach.default)(_context11 = (0, _object.default)(readNames)).call(_context11, function (_ref3) {
808
- var _ref4 = (0, _slicedToArray2.default)(_ref3, 2),
809
- k = _ref4[0],
810
- v = _ref4[1];
811
-
812
- if (v === 1) {
813
- unmatedPairs[k] = true;
814
- }
815
- });
816
-
817
- case 6:
818
- case "end":
819
- return _context12.stop();
311
+ });
312
+ });
313
+ };
314
+ BamFile.prototype.streamRecordsForRange = function (chr, min, max, opts) {
315
+ if (opts === void 0) { opts = {
316
+ viewAsPairs: false,
317
+ pairAcrossChr: false,
318
+ maxInsertSize: 200000,
319
+ }; }
320
+ return __asyncGenerator(this, arguments, function streamRecordsForRange_1() {
321
+ var chrId, chunks, i, size, totalSize;
322
+ return __generator(this, function (_a) {
323
+ switch (_a.label) {
324
+ case 0:
325
+ // todo regularize refseq names
326
+ opts.viewAsPairs = opts.viewAsPairs || false;
327
+ opts.pairAcrossChr = opts.pairAcrossChr || false;
328
+ opts.maxInsertSize =
329
+ opts.maxInsertSize !== undefined ? opts.maxInsertSize : 200000;
330
+ chrId = this.chrToIndex && this.chrToIndex[chr];
331
+ if (!!(chrId >= 0)) return [3 /*break*/, 1];
332
+ chunks = [];
333
+ return [3 /*break*/, 3];
334
+ case 1: return [4 /*yield*/, __await(this.index.blocksForRange(chrId, min - 1, max, opts))];
335
+ case 2:
336
+ chunks = _a.sent();
337
+ if (!chunks) {
338
+ throw new Error('Error in index fetch');
820
339
  }
821
- }
822
- }, _callee7);
823
- }));
824
-
825
- return function (_x9) {
826
- return _ref2.apply(this, arguments);
827
- };
828
- }()));
829
-
830
- case 4:
831
- matePromises = [];
832
- _context18.next = 7;
833
- return _promise.default.all((0, _map.default)(featPromises).call(featPromises, /*#__PURE__*/function () {
834
- var _ref5 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8(f) {
835
- var ret, i, name;
836
- return _regenerator.default.wrap(function _callee8$(_context13) {
837
- while (1) {
838
- switch (_context13.prev = _context13.next) {
839
- case 0:
840
- _context13.next = 2;
841
- return f;
842
-
843
- case 2:
844
- ret = _context13.sent;
845
-
846
- for (i = 0; i < ret.length; i++) {
847
- name = ret[i].name();
848
-
849
- if (unmatedPairs[name] && (opts.pairAcrossChr || ret[i]._next_refid() === chrId && Math.abs(ret[i].get('start') - ret[i]._next_pos()) < (opts.maxInsertSize || 200000))) {
850
- matePromises.push(_this3.index.blocksForRange(ret[i]._next_refid(), ret[i]._next_pos(), ret[i]._next_pos() + 1, opts));
851
- }
852
- }
853
-
854
- case 4:
855
- case "end":
856
- return _context13.stop();
340
+ _a.label = 3;
341
+ case 3:
342
+ i = 0;
343
+ _a.label = 4;
344
+ case 4:
345
+ if (!(i < chunks.length)) return [3 /*break*/, 7];
346
+ return [4 /*yield*/, __await((0, util_1.abortBreakPoint)(opts.signal))];
347
+ case 5:
348
+ _a.sent();
349
+ size = chunks[i].fetchedSize();
350
+ if (size > this.chunkSizeLimit) {
351
+ throw new Error("Too many BAM features. BAM chunk size ".concat(size, " bytes exceeds chunkSizeLimit of ").concat(this.chunkSizeLimit));
857
352
  }
858
- }
859
- }, _callee8);
860
- }));
861
-
862
- return function (_x10) {
863
- return _ref5.apply(this, arguments);
864
- };
865
- }()));
866
-
867
- case 7:
868
- _context18.next = 9;
869
- return _promise.default.all(matePromises);
870
-
871
- case 9:
872
- mateBlocks = _context18.sent;
873
- mateChunks = [];
874
-
875
- for (i = 0; i < mateBlocks.length; i++) {
876
- mateChunks = (0, _concat.default)(mateChunks).call(mateChunks, mateBlocks[i]);
877
- } // filter out duplicate chunks (the blocks are lists of chunks, blocks are concatenated, then filter dup chunks)
878
-
879
-
880
- mateChunks = (0, _filter.default)(_context14 = (0, _sort.default)(mateChunks).call(mateChunks)).call(_context14, function (item, pos, ary) {
881
- return !pos || item.toString() !== ary[pos - 1].toString();
882
- });
883
- mateTotalSize = (0, _reduce.default)(_context15 = (0, _map.default)(mateChunks).call(mateChunks, function (s) {
884
- return s.fetchedSize();
885
- })).call(_context15, function (a, b) {
886
- return a + b;
887
- }, 0);
888
-
889
- if (!(mateTotalSize > this.fetchSizeLimit)) {
890
- _context18.next = 16;
891
- break;
353
+ _a.label = 6;
354
+ case 6:
355
+ i += 1;
356
+ return [3 /*break*/, 4];
357
+ case 7:
358
+ totalSize = chunks
359
+ .map(function (s) { return s.fetchedSize(); })
360
+ .reduce(function (a, b) { return a + b; }, 0);
361
+ if (totalSize > this.fetchSizeLimit) {
362
+ throw new Error("data size of ".concat(totalSize.toLocaleString(), " bytes exceeded fetch size limit of ").concat(this.fetchSizeLimit.toLocaleString(), " bytes"));
363
+ }
364
+ return [5 /*yield**/, __values(__asyncDelegator(__asyncValues(this._fetchChunkFeatures(chunks, chrId, min, max, opts))))];
365
+ case 8: return [4 /*yield*/, __await.apply(void 0, [_a.sent()])];
366
+ case 9:
367
+ _a.sent();
368
+ return [2 /*return*/];
892
369
  }
893
-
894
- throw new Error((0, _concat.default)(_context16 = "data size of ".concat(mateTotalSize.toLocaleString(), " bytes exceeded fetch size limit of ")).call(_context16, this.fetchSizeLimit.toLocaleString(), " bytes"));
895
-
896
- case 16:
897
- mateFeatPromises = (0, _map.default)(mateChunks).call(mateChunks, /*#__PURE__*/function () {
898
- var _ref6 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee9(c) {
899
- var _yield$_this3$feature, data, cpositions, dpositions, chunk, feats, mateRecs, _i3, feature;
900
-
901
- return _regenerator.default.wrap(function _callee9$(_context17) {
902
- while (1) {
903
- switch (_context17.prev = _context17.next) {
904
- case 0:
905
- _context17.next = 2;
906
- return _this3.featureCache.get(c.toString(), {
907
- chunk: c,
908
- opts: opts
909
- }, opts.signal);
910
-
911
- case 2:
912
- _yield$_this3$feature = _context17.sent;
913
- data = _yield$_this3$feature.data;
914
- cpositions = _yield$_this3$feature.cpositions;
915
- dpositions = _yield$_this3$feature.dpositions;
916
- chunk = _yield$_this3$feature.chunk;
917
- _context17.next = 9;
918
- return _this3.readBamFeatures(data, cpositions, dpositions, chunk);
919
-
920
- case 9:
921
- feats = _context17.sent;
922
- mateRecs = [];
923
-
924
- for (_i3 = 0; _i3 < feats.length; _i3 += 1) {
925
- feature = feats[_i3];
926
-
927
- if (unmatedPairs[feature.get('name')] && !readIds[feature.id()]) {
928
- mateRecs.push(feature);
929
- }
370
+ });
371
+ });
372
+ };
373
+ BamFile.prototype._fetchChunkFeatures = function (chunks, chrId, min, max, opts) {
374
+ return __asyncGenerator(this, arguments, function _fetchChunkFeatures_1() {
375
+ var featPromises, done, i, _a, data, cpositions, dpositions, chunk, promise, i;
376
+ return __generator(this, function (_b) {
377
+ switch (_b.label) {
378
+ case 0:
379
+ featPromises = [];
380
+ done = false;
381
+ i = 0;
382
+ _b.label = 1;
383
+ case 1:
384
+ if (!(i < chunks.length)) return [3 /*break*/, 5];
385
+ return [4 /*yield*/, __await(this._readChunk({
386
+ chunk: chunks[i],
387
+ opts: opts,
388
+ }))];
389
+ case 2:
390
+ _a = _b.sent(), data = _a.data, cpositions = _a.cpositions, dpositions = _a.dpositions, chunk = _a.chunk;
391
+ promise = this.readBamFeatures(data, cpositions, dpositions, chunk).then(function (records) {
392
+ var recs = [];
393
+ for (var i_1 = 0; i_1 < records.length; i_1 += 1) {
394
+ var feature = records[i_1];
395
+ if (feature.seq_id() === chrId) {
396
+ if (feature.get('start') >= max) {
397
+ // past end of range, can stop iterating
398
+ done = true;
399
+ break;
400
+ }
401
+ else if (feature.get('end') >= min) {
402
+ // must be in range
403
+ recs.push(feature);
404
+ }
405
+ }
930
406
  }
931
-
932
- return _context17.abrupt("return", mateRecs);
933
-
934
- case 13:
935
- case "end":
936
- return _context17.stop();
407
+ return recs;
408
+ });
409
+ featPromises.push(promise);
410
+ return [4 /*yield*/, __await(promise)];
411
+ case 3:
412
+ _b.sent();
413
+ if (done) {
414
+ return [3 /*break*/, 5];
937
415
  }
938
- }
939
- }, _callee9);
940
- }));
941
-
942
- return function (_x11) {
943
- return _ref6.apply(this, arguments);
944
- };
945
- }());
946
- _context18.next = 19;
947
- return _promise.default.all(mateFeatPromises);
948
-
949
- case 19:
950
- newMateFeats = _context18.sent;
951
- featuresRet = [];
952
-
953
- if (newMateFeats.length) {
954
- newMates = (0, _reduce.default)(newMateFeats).call(newMateFeats, function (result, current) {
955
- return (0, _concat.default)(result).call(result, current);
956
- });
957
- featuresRet = (0, _concat.default)(featuresRet).call(featuresRet, newMates);
958
- }
959
-
960
- return _context18.abrupt("return", featuresRet);
961
-
962
- case 23:
963
- case "end":
964
- return _context18.stop();
965
- }
966
- }
967
- }, _callee10, this);
968
- }));
969
-
970
- function fetchPairs(_x6, _x7, _x8) {
971
- return _fetchPairs.apply(this, arguments);
972
- }
973
-
974
- return fetchPairs;
975
- }()
976
- }, {
977
- key: "_readChunk",
978
- value: function () {
979
- var _readChunk2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee11(_ref7, abortSignal) {
980
- var chunk, opts, c, bufsize, res, bytesRead, buffer, _yield$unzipChunkSlic, data, cpositions, dpositions;
981
-
982
- return _regenerator.default.wrap(function _callee11$(_context19) {
983
- while (1) {
984
- switch (_context19.prev = _context19.next) {
985
- case 0:
986
- chunk = _ref7.chunk, opts = _ref7.opts;
987
- c = chunk;
988
- bufsize = c.fetchedSize();
989
- _context19.next = 5;
990
- return this.bam.read(Buffer.alloc(bufsize), 0, bufsize, c.minv.blockPosition, opts);
991
-
992
- case 5:
993
- res = _context19.sent;
994
- bytesRead = res.bytesRead;
995
- buffer = res.buffer;
996
- (0, _util.checkAbortSignal)(abortSignal);
997
-
998
- if (bytesRead) {
999
- _context19.next = 11;
1000
- break;
416
+ _b.label = 4;
417
+ case 4:
418
+ i++;
419
+ return [3 /*break*/, 1];
420
+ case 5:
421
+ (0, util_1.checkAbortSignal)(opts.signal);
422
+ i = 0;
423
+ _b.label = 6;
424
+ case 6:
425
+ if (!(i < featPromises.length)) return [3 /*break*/, 10];
426
+ return [4 /*yield*/, __await(featPromises[i])];
427
+ case 7: return [4 /*yield*/, _b.sent()];
428
+ case 8:
429
+ _b.sent();
430
+ _b.label = 9;
431
+ case 9:
432
+ i++;
433
+ return [3 /*break*/, 6];
434
+ case 10:
435
+ (0, util_1.checkAbortSignal)(opts.signal);
436
+ if (!opts.viewAsPairs) return [3 /*break*/, 13];
437
+ return [4 /*yield*/, __await(this.fetchPairs(chrId, featPromises, opts))];
438
+ case 11: return [4 /*yield*/, _b.sent()];
439
+ case 12:
440
+ _b.sent();
441
+ _b.label = 13;
442
+ case 13: return [2 /*return*/];
1001
443
  }
1002
-
1003
- return _context19.abrupt("return", []);
1004
-
1005
- case 11:
1006
- if (bytesRead < bufsize) {
1007
- buffer = (0, _slice.default)(buffer).call(buffer, 0, bytesRead);
1008
- } else {
1009
- buffer = (0, _slice.default)(buffer).call(buffer, 0, bufsize);
1010
- }
1011
-
1012
- _context19.next = 14;
1013
- return (0, _bgzfFilehandle.unzipChunkSlice)(buffer, chunk);
1014
-
1015
- case 14:
1016
- _yield$unzipChunkSlic = _context19.sent;
1017
- data = _yield$unzipChunkSlic.buffer;
1018
- cpositions = _yield$unzipChunkSlic.cpositions;
1019
- dpositions = _yield$unzipChunkSlic.dpositions;
1020
- (0, _util.checkAbortSignal)(abortSignal);
1021
- return _context19.abrupt("return", {
1022
- data: data,
1023
- cpositions: cpositions,
1024
- dpositions: dpositions,
1025
- chunk: chunk
1026
- });
1027
-
1028
- case 20:
1029
- case "end":
1030
- return _context19.stop();
1031
- }
1032
- }
1033
- }, _callee11, this);
1034
- }));
1035
-
1036
- function _readChunk(_x12, _x13) {
1037
- return _readChunk2.apply(this, arguments);
1038
- }
1039
-
1040
- return _readChunk;
1041
- }()
1042
- }, {
1043
- key: "readBamFeatures",
1044
- value: function () {
1045
- var _readBamFeatures = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee12(ba, cpositions, dpositions, chunk) {
1046
- var blockStart, sink, pos, last, blockSize, blockEnd, feature;
1047
- return _regenerator.default.wrap(function _callee12$(_context20) {
1048
- while (1) {
1049
- switch (_context20.prev = _context20.next) {
1050
- case 0:
1051
- blockStart = 0;
1052
- sink = [];
1053
- pos = 0;
1054
- last = +(0, _now.default)();
1055
-
1056
- case 4:
1057
- if (!(blockStart + 4 < ba.length)) {
1058
- _context20.next = 18;
1059
- break;
444
+ });
445
+ });
446
+ };
447
+ BamFile.prototype.fetchPairs = function (chrId, featPromises, opts) {
448
+ return __awaiter(this, void 0, void 0, function () {
449
+ var unmatedPairs, readIds, matePromises, mateBlocks, mateChunks, i, mateTotalSize, mateFeatPromises, newMateFeats, featuresRet, newMates;
450
+ var _this = this;
451
+ return __generator(this, function (_a) {
452
+ switch (_a.label) {
453
+ case 0:
454
+ unmatedPairs = {};
455
+ readIds = {};
456
+ return [4 /*yield*/, Promise.all(featPromises.map(function (f) { return __awaiter(_this, void 0, void 0, function () {
457
+ var ret, readNames, i, name_1, id;
458
+ return __generator(this, function (_a) {
459
+ switch (_a.label) {
460
+ case 0: return [4 /*yield*/, f];
461
+ case 1:
462
+ ret = _a.sent();
463
+ readNames = {};
464
+ for (i = 0; i < ret.length; i++) {
465
+ name_1 = ret[i].name();
466
+ id = ret[i].id();
467
+ if (!readNames[name_1]) {
468
+ readNames[name_1] = 0;
469
+ }
470
+ readNames[name_1]++;
471
+ readIds[id] = 1;
472
+ }
473
+ (0, object_entries_ponyfill_1.default)(readNames).forEach(function (_a) {
474
+ var k = _a[0], v = _a[1];
475
+ if (v === 1) {
476
+ unmatedPairs[k] = true;
477
+ }
478
+ });
479
+ return [2 /*return*/];
480
+ }
481
+ });
482
+ }); }))];
483
+ case 1:
484
+ _a.sent();
485
+ matePromises = [];
486
+ return [4 /*yield*/, Promise.all(featPromises.map(function (f) { return __awaiter(_this, void 0, void 0, function () {
487
+ var ret, i, name_2;
488
+ return __generator(this, function (_a) {
489
+ switch (_a.label) {
490
+ case 0: return [4 /*yield*/, f];
491
+ case 1:
492
+ ret = _a.sent();
493
+ for (i = 0; i < ret.length; i++) {
494
+ name_2 = ret[i].name();
495
+ if (unmatedPairs[name_2] &&
496
+ (opts.pairAcrossChr ||
497
+ (ret[i]._next_refid() === chrId &&
498
+ Math.abs(ret[i].get('start') - ret[i]._next_pos()) <
499
+ (opts.maxInsertSize || 200000)))) {
500
+ matePromises.push(this.index.blocksForRange(ret[i]._next_refid(), ret[i]._next_pos(), ret[i]._next_pos() + 1, opts));
501
+ }
502
+ }
503
+ return [2 /*return*/];
504
+ }
505
+ });
506
+ }); }))];
507
+ case 2:
508
+ _a.sent();
509
+ return [4 /*yield*/, Promise.all(matePromises)];
510
+ case 3:
511
+ mateBlocks = _a.sent();
512
+ mateChunks = [];
513
+ for (i = 0; i < mateBlocks.length; i++) {
514
+ mateChunks = mateChunks.concat(mateBlocks[i]);
515
+ }
516
+ // filter out duplicate chunks (the blocks are lists of chunks, blocks are concatenated, then filter dup chunks)
517
+ mateChunks = mateChunks
518
+ .sort()
519
+ .filter(function (item, pos, ary) { return !pos || item.toString() !== ary[pos - 1].toString(); });
520
+ mateTotalSize = mateChunks
521
+ .map(function (s) { return s.fetchedSize(); })
522
+ .reduce(function (a, b) { return a + b; }, 0);
523
+ if (mateTotalSize > this.fetchSizeLimit) {
524
+ throw new Error("data size of ".concat(mateTotalSize.toLocaleString(), " bytes exceeded fetch size limit of ").concat(this.fetchSizeLimit.toLocaleString(), " bytes"));
525
+ }
526
+ mateFeatPromises = mateChunks.map(function (c) { return __awaiter(_this, void 0, void 0, function () {
527
+ var _a, data, cpositions, dpositions, chunk, feats, mateRecs, i, feature;
528
+ return __generator(this, function (_b) {
529
+ switch (_b.label) {
530
+ case 0: return [4 /*yield*/, this._readChunk({
531
+ chunk: c,
532
+ opts: opts,
533
+ })];
534
+ case 1:
535
+ _a = _b.sent(), data = _a.data, cpositions = _a.cpositions, dpositions = _a.dpositions, chunk = _a.chunk;
536
+ return [4 /*yield*/, this.readBamFeatures(data, cpositions, dpositions, chunk)];
537
+ case 2:
538
+ feats = _b.sent();
539
+ mateRecs = [];
540
+ for (i = 0; i < feats.length; i += 1) {
541
+ feature = feats[i];
542
+ if (unmatedPairs[feature.get('name')] && !readIds[feature.id()]) {
543
+ mateRecs.push(feature);
544
+ }
545
+ }
546
+ return [2 /*return*/, mateRecs];
547
+ }
548
+ });
549
+ }); });
550
+ return [4 /*yield*/, Promise.all(mateFeatPromises)];
551
+ case 4:
552
+ newMateFeats = _a.sent();
553
+ featuresRet = [];
554
+ if (newMateFeats.length) {
555
+ newMates = newMateFeats.reduce(function (result, current) {
556
+ return result.concat(current);
557
+ });
558
+ featuresRet = featuresRet.concat(newMates);
559
+ }
560
+ return [2 /*return*/, featuresRet];
1060
561
  }
1061
-
1062
- blockSize = ba.readInt32LE(blockStart);
1063
- blockEnd = blockStart + 4 + blockSize - 1; // increment position to the current decompressed status
1064
-
1065
- if (dpositions) {
1066
- while (blockStart + chunk.minv.dataPosition >= dpositions[pos++]) {}
1067
-
1068
- pos--;
1069
- } // only try to read the feature if we have all the bytes for it
1070
-
1071
-
1072
- if (!(blockEnd < ba.length)) {
1073
- _context20.next = 15;
1074
- break;
562
+ });
563
+ });
564
+ };
565
+ BamFile.prototype._readChunk = function (_a) {
566
+ var chunk = _a.chunk, opts = _a.opts;
567
+ return __awaiter(this, void 0, void 0, function () {
568
+ var signal, bufsize, res, bytesRead, buffer, _b, data, cpositions, dpositions;
569
+ return __generator(this, function (_c) {
570
+ switch (_c.label) {
571
+ case 0:
572
+ signal = opts.signal;
573
+ bufsize = chunk.fetchedSize();
574
+ return [4 /*yield*/, this.bam.read(Buffer.alloc(bufsize), 0, bufsize, chunk.minv.blockPosition, opts)];
575
+ case 1:
576
+ res = _c.sent();
577
+ bytesRead = res.bytesRead;
578
+ buffer = res.buffer;
579
+ (0, util_1.checkAbortSignal)(signal);
580
+ if (bytesRead < bufsize) {
581
+ buffer = buffer.slice(0, bytesRead);
582
+ }
583
+ else {
584
+ buffer = buffer.slice(0, bufsize);
585
+ }
586
+ return [4 /*yield*/, (0, bgzf_filehandle_1.unzipChunkSlice)(buffer, chunk)];
587
+ case 2:
588
+ _b = _c.sent(), data = _b.buffer, cpositions = _b.cpositions, dpositions = _b.dpositions;
589
+ (0, util_1.checkAbortSignal)(signal);
590
+ return [2 /*return*/, { data: data, cpositions: cpositions, dpositions: dpositions, chunk: chunk }];
1075
591
  }
1076
-
1077
- feature = new _record.default({
1078
- bytes: {
1079
- byteArray: ba,
1080
- start: blockStart,
1081
- end: blockEnd
1082
- },
1083
- // the below results in an automatically calculated file-offset based ID
1084
- // if the info for that is available, otherwise crc32 of the features
1085
- //
1086
- // cpositions[pos] refers to actual file offset of a bgzip block boundaries
1087
- //
1088
- // we multiply by (1 <<8) in order to make sure each block has a "unique"
1089
- // address space so that data in that block could never overlap
1090
- //
1091
- // then the blockStart-dpositions is an uncompressed file offset from
1092
- // that bgzip block boundary, and since the cpositions are multiplied by
1093
- // (1 << 8) these uncompressed offsets get a unique space
1094
- //
1095
- // this has an extra chunk.minv.dataPosition added on because it blockStart
1096
- // starts at 0 instead of chunk.minv.dataPosition
1097
- //
1098
- // the +1 is just to avoid any possible uniqueId 0 but this does not realistically happen
1099
- fileOffset: cpositions ? cpositions[pos] * (1 << 8) + (blockStart - dpositions[pos]) + chunk.minv.dataPosition + 1 : _bufferCrc.default.signed((0, _slice.default)(ba).call(ba, blockStart, blockEnd))
1100
- });
1101
- sink.push(feature);
1102
-
1103
- if (!(this.yieldThreadTime && +(0, _now.default)() - last > this.yieldThreadTime)) {
1104
- _context20.next = 15;
1105
- break;
592
+ });
593
+ });
594
+ };
595
+ BamFile.prototype.readBamFeatures = function (ba, cpositions, dpositions, chunk) {
596
+ return __awaiter(this, void 0, void 0, function () {
597
+ var blockStart, sink, pos, last, blockSize, blockEnd, feature;
598
+ return __generator(this, function (_a) {
599
+ switch (_a.label) {
600
+ case 0:
601
+ blockStart = 0;
602
+ sink = [];
603
+ pos = 0;
604
+ last = +Date.now();
605
+ _a.label = 1;
606
+ case 1:
607
+ if (!(blockStart + 4 < ba.length)) return [3 /*break*/, 4];
608
+ blockSize = ba.readInt32LE(blockStart);
609
+ blockEnd = blockStart + 4 + blockSize - 1;
610
+ // increment position to the current decompressed status
611
+ if (dpositions) {
612
+ while (blockStart + chunk.minv.dataPosition >= dpositions[pos++]) { }
613
+ pos--;
614
+ }
615
+ if (!(blockEnd < ba.length)) return [3 /*break*/, 3];
616
+ feature = new record_1.default({
617
+ bytes: {
618
+ byteArray: ba,
619
+ start: blockStart,
620
+ end: blockEnd,
621
+ },
622
+ // the below results in an automatically calculated file-offset based ID
623
+ // if the info for that is available, otherwise crc32 of the features
624
+ //
625
+ // cpositions[pos] refers to actual file offset of a bgzip block boundaries
626
+ //
627
+ // we multiply by (1 <<8) in order to make sure each block has a "unique"
628
+ // address space so that data in that block could never overlap
629
+ //
630
+ // then the blockStart-dpositions is an uncompressed file offset from
631
+ // that bgzip block boundary, and since the cpositions are multiplied by
632
+ // (1 << 8) these uncompressed offsets get a unique space
633
+ //
634
+ // this has an extra chunk.minv.dataPosition added on because it blockStart
635
+ // starts at 0 instead of chunk.minv.dataPosition
636
+ //
637
+ // the +1 is just to avoid any possible uniqueId 0 but this does not realistically happen
638
+ fileOffset: cpositions
639
+ ? cpositions[pos] * (1 << 8) +
640
+ (blockStart - dpositions[pos]) +
641
+ chunk.minv.dataPosition +
642
+ 1
643
+ : buffer_crc32_1.default.signed(ba.slice(blockStart, blockEnd)),
644
+ });
645
+ sink.push(feature);
646
+ if (!(this.yieldThreadTime && +Date.now() - last > this.yieldThreadTime)) return [3 /*break*/, 3];
647
+ return [4 /*yield*/, (0, util_1.timeout)(1)];
648
+ case 2:
649
+ _a.sent();
650
+ last = +Date.now();
651
+ _a.label = 3;
652
+ case 3:
653
+ blockStart = blockEnd + 1;
654
+ return [3 /*break*/, 1];
655
+ case 4: return [2 /*return*/, sink];
1106
656
  }
1107
-
1108
- _context20.next = 14;
1109
- return (0, _util.timeout)(1);
1110
-
1111
- case 14:
1112
- last = +(0, _now.default)();
1113
-
1114
- case 15:
1115
- blockStart = blockEnd + 1;
1116
- _context20.next = 4;
1117
- break;
1118
-
1119
- case 18:
1120
- return _context20.abrupt("return", sink);
1121
-
1122
- case 19:
1123
- case "end":
1124
- return _context20.stop();
1125
- }
1126
- }
1127
- }, _callee12, this);
1128
- }));
1129
-
1130
- function readBamFeatures(_x14, _x15, _x16, _x17) {
1131
- return _readBamFeatures.apply(this, arguments);
1132
- }
1133
-
1134
- return readBamFeatures;
1135
- }()
1136
- }, {
1137
- key: "hasRefSeq",
1138
- value: function () {
1139
- var _hasRefSeq = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee13(seqName) {
1140
- var refId;
1141
- return _regenerator.default.wrap(function _callee13$(_context21) {
1142
- while (1) {
1143
- switch (_context21.prev = _context21.next) {
1144
- case 0:
657
+ });
658
+ });
659
+ };
660
+ BamFile.prototype.hasRefSeq = function (seqName) {
661
+ return __awaiter(this, void 0, void 0, function () {
662
+ var refId;
663
+ return __generator(this, function (_a) {
1145
664
  refId = this.chrToIndex && this.chrToIndex[seqName];
1146
- return _context21.abrupt("return", this.index.hasRefSeq(refId));
1147
-
1148
- case 2:
1149
- case "end":
1150
- return _context21.stop();
1151
- }
1152
- }
1153
- }, _callee13, this);
1154
- }));
1155
-
1156
- function hasRefSeq(_x18) {
1157
- return _hasRefSeq.apply(this, arguments);
1158
- }
1159
-
1160
- return hasRefSeq;
1161
- }()
1162
- }, {
1163
- key: "lineCount",
1164
- value: function () {
1165
- var _lineCount = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee14(seqName) {
1166
- var refId;
1167
- return _regenerator.default.wrap(function _callee14$(_context22) {
1168
- while (1) {
1169
- switch (_context22.prev = _context22.next) {
1170
- case 0:
665
+ return [2 /*return*/, this.index.hasRefSeq(refId)];
666
+ });
667
+ });
668
+ };
669
+ BamFile.prototype.lineCount = function (seqName) {
670
+ return __awaiter(this, void 0, void 0, function () {
671
+ var refId;
672
+ return __generator(this, function (_a) {
1171
673
  refId = this.chrToIndex && this.chrToIndex[seqName];
1172
- return _context22.abrupt("return", this.index.lineCount(refId));
1173
-
1174
- case 2:
1175
- case "end":
1176
- return _context22.stop();
1177
- }
1178
- }
1179
- }, _callee14, this);
1180
- }));
1181
-
1182
- function lineCount(_x19) {
1183
- return _lineCount.apply(this, arguments);
1184
- }
1185
-
1186
- return lineCount;
1187
- }()
1188
- }, {
1189
- key: "indexCov",
1190
- value: function () {
1191
- var _indexCov = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee15(seqName, start, end) {
1192
- var seqId;
1193
- return _regenerator.default.wrap(function _callee15$(_context23) {
1194
- while (1) {
1195
- switch (_context23.prev = _context23.next) {
1196
- case 0:
1197
- _context23.next = 2;
1198
- return this.index.parse();
1199
-
1200
- case 2:
1201
- seqId = this.chrToIndex && this.chrToIndex[seqName];
1202
- return _context23.abrupt("return", this.index.indexCov(seqId, start, end));
1203
-
1204
- case 4:
1205
- case "end":
1206
- return _context23.stop();
1207
- }
1208
- }
1209
- }, _callee15, this);
1210
- }));
1211
-
1212
- function indexCov(_x20, _x21, _x22) {
1213
- return _indexCov.apply(this, arguments);
1214
- }
1215
-
1216
- return indexCov;
1217
- }()
1218
- }]);
1219
- return BamFile;
1220
- }();
1221
-
674
+ return [2 /*return*/, this.index.lineCount(refId)];
675
+ });
676
+ });
677
+ };
678
+ BamFile.prototype.indexCov = function (seqName, start, end) {
679
+ return __awaiter(this, void 0, void 0, function () {
680
+ var seqId;
681
+ return __generator(this, function (_a) {
682
+ switch (_a.label) {
683
+ case 0: return [4 /*yield*/, this.index.parse()];
684
+ case 1:
685
+ _a.sent();
686
+ seqId = this.chrToIndex && this.chrToIndex[seqName];
687
+ return [2 /*return*/, this.index.indexCov(seqId, start, end)];
688
+ }
689
+ });
690
+ });
691
+ };
692
+ return BamFile;
693
+ }());
1222
694
  exports.default = BamFile;
1223
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iYW1GaWxlLnRzIl0sIm5hbWVzIjpbIkJBTV9NQUdJQyIsImJsb2NrTGVuIiwiQmFtRmlsZSIsImJhbUZpbGVoYW5kbGUiLCJiYW1QYXRoIiwiYmFtVXJsIiwiYmFpUGF0aCIsImJhaUZpbGVoYW5kbGUiLCJiYWlVcmwiLCJjc2lQYXRoIiwiY3NpRmlsZWhhbmRsZSIsImNzaVVybCIsImNhY2hlU2l6ZSIsImZldGNoU2l6ZUxpbWl0IiwiY2h1bmtTaXplTGltaXQiLCJ5aWVsZFRocmVhZFRpbWUiLCJyZW5hbWVSZWZTZXFzIiwibiIsInJlbmFtZVJlZlNlcSIsImJhbSIsIkxvY2FsRmlsZSIsIlJlbW90ZUZpbGUiLCJFcnJvciIsImluZGV4IiwiQ1NJIiwiZmlsZWhhbmRsZSIsIkJBSSIsImZlYXR1cmVDYWNoZSIsIkFib3J0YWJsZVByb21pc2VDYWNoZSIsImNhY2hlIiwiTFJVIiwibWF4U2l6ZSIsInVuZGVmaW5lZCIsImZpbGwiLCJfcmVhZENodW5rIiwib3JpZ09wdHMiLCJvcHRzIiwicGFyc2UiLCJpbmRleERhdGEiLCJyZXQiLCJmaXJzdERhdGFMaW5lIiwiYmxvY2tQb3NpdGlvbiIsInJlYWQiLCJCdWZmZXIiLCJhbGxvYyIsInJlcyIsImJ5dGVzUmVhZCIsImJ1ZmZlciIsInJlYWRGaWxlIiwidW5jYmEiLCJyZWFkSW50MzJMRSIsImhlYWRMZW4iLCJoZWFkZXIiLCJ0b1N0cmluZyIsIl9yZWFkUmVmU2VxcyIsImNoclRvSW5kZXgiLCJpbmRleFRvQ2hyIiwiZ2V0SGVhZGVyIiwic3RhcnQiLCJyZWZTZXFCeXRlcyIsIm5SZWYiLCJwIiwiaSIsInNpZ25hbCIsImxOYW1lIiwicmVmTmFtZSIsImxSZWYiLCJwdXNoIiwibGVuZ3RoIiwiY29uc29sZSIsIndhcm4iLCJjaHIiLCJtaW4iLCJtYXgiLCJ2aWV3QXNQYWlycyIsInBhaXJBY3Jvc3NDaHIiLCJtYXhJbnNlcnRTaXplIiwicmVjb3JkcyIsInN0cmVhbVJlY29yZHNGb3JSYW5nZSIsImNodW5rIiwiY2hySWQiLCJjaHVua3MiLCJibG9ja3NGb3JSYW5nZSIsInNpemUiLCJmZXRjaGVkU2l6ZSIsInRvdGFsU2l6ZSIsInMiLCJhIiwiYiIsInRvTG9jYWxlU3RyaW5nIiwiX2ZldGNoQ2h1bmtGZWF0dXJlcyIsImZlYXRQcm9taXNlcyIsImRvbmUiLCJjIiwiZ2V0IiwiZGF0YSIsImNwb3NpdGlvbnMiLCJkcG9zaXRpb25zIiwicHJvbWlzZSIsInJlYWRCYW1GZWF0dXJlcyIsInRoZW4iLCJyZWNzIiwiZmVhdHVyZSIsInNlcV9pZCIsImZldGNoUGFpcnMiLCJ1bm1hdGVkUGFpcnMiLCJyZWFkSWRzIiwiYWxsIiwiZiIsInJlYWROYW1lcyIsIm5hbWUiLCJpZCIsImsiLCJ2IiwibWF0ZVByb21pc2VzIiwiX25leHRfcmVmaWQiLCJNYXRoIiwiYWJzIiwiX25leHRfcG9zIiwibWF0ZUJsb2NrcyIsIm1hdGVDaHVua3MiLCJpdGVtIiwicG9zIiwiYXJ5IiwibWF0ZVRvdGFsU2l6ZSIsIm1hdGVGZWF0UHJvbWlzZXMiLCJmZWF0cyIsIm1hdGVSZWNzIiwibmV3TWF0ZUZlYXRzIiwiZmVhdHVyZXNSZXQiLCJuZXdNYXRlcyIsInJlc3VsdCIsImN1cnJlbnQiLCJhYm9ydFNpZ25hbCIsImJ1ZnNpemUiLCJtaW52IiwiYmEiLCJibG9ja1N0YXJ0Iiwic2luayIsImxhc3QiLCJibG9ja1NpemUiLCJibG9ja0VuZCIsImRhdGFQb3NpdGlvbiIsIkJBTUZlYXR1cmUiLCJieXRlcyIsImJ5dGVBcnJheSIsImVuZCIsImZpbGVPZmZzZXQiLCJjcmMzMiIsInNpZ25lZCIsInNlcU5hbWUiLCJyZWZJZCIsImhhc1JlZlNlcSIsImxpbmVDb3VudCIsInNlcUlkIiwiaW5kZXhDb3YiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFF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cm9taXNlLWNhY2hlJ1xuaW1wb3J0IEJBSSBmcm9tICcuL2JhaSdcbmltcG9ydCBDU0kgZnJvbSAnLi9jc2knXG5pbXBvcnQgQ2h1bmsgZnJvbSAnLi9jaHVuaydcbmltcG9ydCBjcmMzMiBmcm9tICdidWZmZXItY3JjMzInXG5cbmltcG9ydCB7IHVuemlwLCB1bnppcENodW5rU2xpY2UgfSBmcm9tICdAZ21vZC9iZ3pmLWZpbGVoYW5kbGUnXG5cbmltcG9ydCBlbnRyaWVzIGZyb20gJ29iamVjdC5lbnRyaWVzLXBvbnlmaWxsJ1xuaW1wb3J0IExSVSBmcm9tICdxdWljay1scnUnXG5pbXBvcnQgeyBMb2NhbEZpbGUsIFJlbW90ZUZpbGUsIEdlbmVyaWNGaWxlaGFuZGxlIH0gZnJvbSAnZ2VuZXJpYy1maWxlaGFuZGxlJ1xuaW1wb3J0IEJBTUZlYXR1cmUgZnJvbSAnLi9yZWNvcmQnXG5pbXBvcnQgSW5kZXhGaWxlIGZyb20gJy4vaW5kZXhGaWxlJ1xuaW1wb3J0IHsgcGFyc2VIZWFkZXJUZXh0IH0gZnJvbSAnLi9zYW0nXG5pbXBvcnQgeyBhYm9ydEJyZWFrUG9pbnQsIGNoZWNrQWJvcnRTaWduYWwsIHRpbWVvdXQsIG1ha2VPcHRzLCBCYW1PcHRzLCBCYXNlT3B0cyB9IGZyb20gJy4vdXRpbCdcblxuZXhwb3J0IGNvbnN0IEJBTV9NQUdJQyA9IDIxODQwMTk0XG5cbmNvbnN0IGJsb2NrTGVuID0gMSA8PCAxNlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYW1GaWxlIHtcbiAgcHJpdmF0ZSByZW5hbWVSZWZTZXE6IChhOiBzdHJpbmcpID0+IHN0cmluZ1xuICBwcml2YXRlIGJhbTogR2VuZXJpY0ZpbGVoYW5kbGVcbiAgcHJpdmF0ZSBpbmRleDogSW5kZXhGaWxlXG4gIHByaXZhdGUgY2h1bmtTaXplTGltaXQ6IG51bWJlclxuICBwcml2YXRlIGZldGNoU2l6ZUxpbWl0OiBudW1iZXJcbiAgcHJpdmF0ZSBoZWFkZXI6IGFueVxuICBwcm90ZWN0ZWQgZmVhdHVyZUNhY2hlOiBhbnlcbiAgcHJvdGVjdGVkIGNoclRvSW5kZXg6IGFueVxuICBwcm90ZWN0ZWQgaW5kZXhUb0NocjogYW55XG4gIHByaXZhdGUgeWllbGRUaHJlYWRUaW1lOiBudW1iZXJcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmJhbVBhdGhdXG4gICAqIEBwYXJhbSB7RmlsZUhhbmRsZX0gW2FyZ3MuYmFtRmlsZWhhbmRsZV1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmJhaVBhdGhdXG4gICAqIEBwYXJhbSB7RmlsZUhhbmRsZX0gW2FyZ3MuYmFpRmlsZWhhbmRsZV1cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBiYW1GaWxlaGFuZGxlLFxuICAgIGJhbVBhdGgsXG4gICAgYmFtVXJsLFxuICAgIGJhaVBhdGgsXG4gICAgYmFpRmlsZWhhbmRsZSxcbiAgICBiYWlVcmwsXG4gICAgY3NpUGF0aCxcbiAgICBjc2lGaWxlaGFuZGxlLFxuICAgIGNzaVVybCxcbiAgICBjYWNoZVNpemUsXG4gICAgZmV0Y2hTaXplTGltaXQsXG4gICAgY2h1bmtTaXplTGltaXQsXG4gICAgeWllbGRUaHJlYWRUaW1lID0gMTAwLFxuICAgIHJlbmFtZVJlZlNlcXMgPSBuID0+IG4sXG4gIH06IHtcbiAgICBiYW1GaWxlaGFuZGxlPzogR2VuZXJpY0ZpbGVoYW5kbGVcbiAgICBiYW1QYXRoPzogc3RyaW5nXG4gICAgYmFtVXJsPzogc3RyaW5nXG4gICAgYmFpUGF0aD86IHN0cmluZ1xuICAgIGJhaUZpbGVoYW5kbGU/OiBHZW5lcmljRmlsZWhhbmRsZVxuICAgIGJhaVVybD86IHN0cmluZ1xuICAgIGNzaVBhdGg/OiBzdHJpbmdcbiAgICBjc2lGaWxlaGFuZGxlPzogR2VuZXJpY0ZpbGVoYW5kbGVcbiAgICBjc2lVcmw/OiBzdHJpbmdcbiAgICBjYWNoZVNpemU/OiBudW1iZXJcbiAgICBmZXRjaFNpemVMaW1pdD86IG51bWJlclxuICAgIGNodW5rU2l6ZUxpbWl0PzogbnVtYmVyXG4gICAgcmVuYW1lUmVmU2Vxcz86IChhOiBzdHJpbmcpID0+IHN0cmluZ1xuICAgIHlpZWxkVGhyZWFkVGltZT86IG51bWJlclxuICB9KSB7XG4gICAgdGhpcy5yZW5hbWVSZWZTZXEgPSByZW5hbWVSZWZTZXFzXG5cbiAgICBpZiAoYmFtRmlsZWhhbmRsZSkge1xuICAgICAgdGhpcy5iYW0gPSBiYW1GaWxlaGFuZGxlXG4gICAgfSBlbHNlIGlmIChiYW1QYXRoKSB7XG4gICAgICB0aGlzLmJhbSA9IG5ldyBMb2NhbEZpbGUoYmFtUGF0aClcbiAgICB9IGVsc2UgaWYgKGJhbVVybCkge1xuICAgICAgdGhpcy5iYW0gPSBuZXcgUmVtb3RlRmlsZShiYW1VcmwpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5hYmxlIHRvIGluaXRpYWxpemUgYmFtJylcbiAgICB9XG4gICAgaWYgKGNzaUZpbGVoYW5kbGUpIHtcbiAgICAgIHRoaXMuaW5kZXggPSBuZXcgQ1NJKHsgZmlsZWhhbmRsZTogY3NpRmlsZWhhbmRsZSB9KVxuICAgIH0gZWxzZSBpZiAoY3NpUGF0aCkge1xuICAgICAgdGhpcy5pbmRleCA9IG5ldyBDU0koeyBmaWxlaGFuZGxlOiBuZXcgTG9jYWxGaWxlKGNzaVBhdGgpIH0pXG4gICAgfSBlbHNlIGlmIChjc2lVcmwpIHtcbiAgICAgIHRoaXMuaW5kZXggPSBuZXcgQ1NJKHsgZmlsZWhhbmRsZTogbmV3IFJlbW90ZUZpbGUoY3NpVXJsKSB9KVxuICAgIH0gZWxzZSBpZiAoYmFpRmlsZWhhbmRsZSkge1xuICAgICAgdGhpcy5pbmRleCA9IG5ldyBCQUkoeyBmaWxlaGFuZGxlOiBiYWlGaWxlaGFuZGxlIH0pXG4gICAgfSBlbHNlIGlmIChiYWlQYXRoKSB7XG4gICAgICB0aGlzLmluZGV4ID0gbmV3IEJBSSh7IGZpbGVoYW5kbGU6IG5ldyBMb2NhbEZpbGUoYmFpUGF0aCkgfSlcbiAgICB9IGVsc2UgaWYgKGJhaVVybCkge1xuICAgICAgdGhpcy5pbmRleCA9IG5ldyBCQUkoeyBmaWxlaGFuZGxlOiBuZXcgUmVtb3RlRmlsZShiYWlVcmwpIH0pXG4gICAgfSBlbHNlIGlmIChiYW1QYXRoKSB7XG4gICAgICB0aGlzLmluZGV4ID0gbmV3IEJBSSh7IGZpbGVoYW5kbGU6IG5ldyBMb2NhbEZpbGUoYCR7YmFtUGF0aH0uYmFpYCkgfSlcbiAgICB9IGVsc2UgaWYgKGJhbVVybCkge1xuICAgICAgdGhpcy5pbmRleCA9IG5ldyBCQUkoeyBmaWxlaGFuZGxlOiBuZXcgUmVtb3RlRmlsZShgJHtiYW1Vcmx9LmJhaWApIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5hYmxlIHRvIGluZmVyIGluZGV4IGZvcm1hdCcpXG4gICAgfVxuICAgIHRoaXMuZmVhdHVyZUNhY2hlID0gbmV3IEFib3J0YWJsZVByb21pc2VDYWNoZSh7XG4gICAgICBjYWNoZTogbmV3IExSVSh7XG4gICAgICAgIG1heFNpemU6IGNhY2hlU2l6ZSAhPT0gdW5kZWZpbmVkID8gY2FjaGVTaXplIDogNTAsXG4gICAgICB9KSxcbiAgICAgIGZpbGw6IHRoaXMuX3JlYWRDaHVuay5iaW5kKHRoaXMpLFxuICAgIH0pXG4gICAgdGhpcy5mZXRjaFNpemVMaW1pdCA9IGZldGNoU2l6ZUxpbWl0IHx8IDUwMDAwMDAwMCAvLyA1MDBNQlxuICAgIHRoaXMuY2h1bmtTaXplTGltaXQgPSBjaHVua1NpemVMaW1pdCB8fCAzMDAwMDAwMDAgLy8gMzAwTUJcbiAgICB0aGlzLnlpZWxkVGhyZWFkVGltZSA9IHlpZWxkVGhyZWFkVGltZVxuICB9XG5cbiAgYXN5bmMgZ2V0SGVhZGVyKG9yaWdPcHRzOiBBYm9ydFNpZ25hbCB8IEJhc2VPcHRzID0ge30pIHtcbiAgICBjb25zdCBvcHRzID0gbWFrZU9wdHMob3JpZ09wdHMpXG4gICAgY29uc3QgaW5kZXhEYXRhID0gYXdhaXQgdGhpcy5pbmRleC5wYXJzZShvcHRzKVxuICAgIGNvbnN0IHJldCA9IGluZGV4RGF0YS5maXJzdERhdGFMaW5lID8gaW5kZXhEYXRhLmZpcnN0RGF0YUxpbmUuYmxvY2tQb3NpdGlvbiArIDY1NTM1IDogdW5kZWZpbmVkXG4gICAgbGV0IGJ1ZmZlclxuICAgIGlmIChyZXQpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuYmFtLnJlYWQoQnVmZmVyLmFsbG9jKHJldCArIGJsb2NrTGVuKSwgMCwgcmV0ICsgYmxvY2tMZW4sIDAsIG9wdHMpXG5cbiAgICAgIGNvbnN0IHsgYnl0ZXNSZWFkIH0gPSByZXNcbiAgICAgIDsoeyBidWZmZXIgfSA9IHJlcylcbiAgICAgIGlmICghYnl0ZXNSZWFkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgcmVhZGluZyBoZWFkZXInKVxuICAgICAgfVxuICAgICAgaWYgKGJ5dGVzUmVhZCA8IHJldCkge1xuICAgICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoMCwgYnl0ZXNSZWFkKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKDAsIHJldClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYnVmZmVyID0gKGF3YWl0IHRoaXMuYmFtLnJlYWRGaWxlKG9wdHMpKSBhcyBCdWZmZXJcbiAgICB9XG5cbiAgICBjb25zdCB1bmNiYSA9IGF3YWl0IHVuemlwKGJ1ZmZlcilcblxuICAgIGlmICh1bmNiYS5yZWFkSW50MzJMRSgwKSAhPT0gQkFNX01BR0lDKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhIEJBTSBmaWxlJylcbiAgICB9XG4gICAgY29uc3QgaGVhZExlbiA9IHVuY2JhLnJlYWRJbnQzMkxFKDQpXG5cbiAgICB0aGlzLmhlYWRlciA9IHVuY2JhLnRvU3RyaW5nKCd1dGY4JywgOCwgOCArIGhlYWRMZW4pXG4gICAgY29uc3QgeyBjaHJUb0luZGV4LCBpbmRleFRvQ2hyIH0gPSBhd2FpdCB0aGlzLl9yZWFkUmVmU2VxcyhoZWFkTGVuICsgOCwgNjU1MzUsIG9wdHMpXG4gICAgdGhpcy5jaHJUb0luZGV4ID0gY2hyVG9JbmRleFxuICAgIHRoaXMuaW5kZXhUb0NociA9IGluZGV4VG9DaHJcblxuICAgIHJldHVybiBwYXJzZUhlYWRlclRleHQodGhpcy5oZWFkZXIpXG4gIH1cblxuICBhc3luYyBnZXRIZWFkZXJUZXh0KG9wdHM6IEJhc2VPcHRzID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLmdldEhlYWRlcihvcHRzKVxuICAgIHJldHVybiB0aGlzLmhlYWRlclxuICB9XG5cbiAgLy8gdGhlIGZ1bGwgbGVuZ3RoIG9mIHRoZSByZWZzZXEgYmxvY2sgaXMgbm90IGdpdmVuIGluIGFkdmFuY2Ugc28gdGhpcyBncmFicyBhIGNodW5rIGFuZFxuICAvLyBkb3VibGVzIGl0IGlmIGFsbCByZWZzZXFzIGhhdmVuJ3QgYmVlbiBwcm9jZXNzZWRcbiAgYXN5bmMgX3JlYWRSZWZTZXFzKFxuICAgIHN0YXJ0OiBudW1iZXIsXG4gICAgcmVmU2VxQnl0ZXM6IG51bWJlcixcbiAgICBvcHRzOiBCYXNlT3B0cyA9IHt9LFxuICApOiBQcm9taXNlPHtcbiAgICBjaHJUb0luZGV4OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9XG4gICAgaW5kZXhUb0NocjogeyByZWZOYW1lOiBzdHJpbmc7IGxlbmd0aDogbnVtYmVyIH1bXVxuICB9PiB7XG4gICAgaWYgKHN0YXJ0ID4gcmVmU2VxQnl0ZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkUmVmU2VxcyhzdGFydCwgcmVmU2VxQnl0ZXMgKiAyLCBvcHRzKVxuICAgIH1cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmJhbS5yZWFkKEJ1ZmZlci5hbGxvYyhyZWZTZXFCeXRlcyArIGJsb2NrTGVuKSwgMCwgcmVmU2VxQnl0ZXMsIDAsIG9wdHMpXG4gICAgY29uc3QgeyBieXRlc1JlYWQgfSA9IHJlc1xuICAgIGxldCB7IGJ1ZmZlciB9ID0gcmVzXG4gICAgaWYgKCFieXRlc1JlYWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgcmVhZGluZyByZWZzZXFzIGZyb20gaGVhZGVyJylcbiAgICB9XG4gICAgaWYgKGJ5dGVzUmVhZCA8IHJlZlNlcUJ5dGVzKSB7XG4gICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoMCwgYnl0ZXNSZWFkKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoMCwgcmVmU2VxQnl0ZXMpXG4gICAgfVxuICAgIGNvbnN0IHVuY2JhID0gYXdhaXQgdW56aXAoYnVmZmVyKVxuICAgIGNvbnN0IG5SZWYgPSB1bmNiYS5yZWFkSW50MzJMRShzdGFydClcbiAgICBsZXQgcCA9IHN0YXJ0ICsgNFxuICAgIGNvbnN0IGNoclRvSW5kZXg6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fVxuICAgIGNvbnN0IGluZGV4VG9DaHI6IHsgcmVmTmFtZTogc3RyaW5nOyBsZW5ndGg6IG51bWJlciB9W10gPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJlZjsgaSArPSAxKSB7XG4gICAgICBhd2FpdCBhYm9ydEJyZWFrUG9pbnQob3B0cy5zaWduYWwpXG4gICAgICBjb25zdCBsTmFtZSA9IHVuY2JhLnJlYWRJbnQzMkxFKHApXG4gICAgICBsZXQgcmVmTmFtZSA9IHVuY2JhLnRvU3RyaW5nKCd1dGY4JywgcCArIDQsIHAgKyA0ICsgbE5hbWUgLSAxKVxuICAgICAgcmVmTmFtZSA9IHRoaXMucmVuYW1lUmVmU2VxKHJlZk5hbWUpXG4gICAgICBjb25zdCBsUmVmID0gdW5jYmEucmVhZEludDMyTEUocCArIGxOYW1lICsgNClcblxuICAgICAgY2hyVG9JbmRleFtyZWZOYW1lXSA9IGlcbiAgICAgIGluZGV4VG9DaHIucHVzaCh7IHJlZk5hbWUsIGxlbmd0aDogbFJlZiB9KVxuXG4gICAgICBwID0gcCArIDggKyBsTmFtZVxuICAgICAgaWYgKHAgPiB1bmNiYS5sZW5ndGgpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBCQU0gaGVhZGVyIGlzIHZlcnkgYmlnLiAgUmUtZmV0Y2hpbmcgJHtyZWZTZXFCeXRlc30gYnl0ZXMuYClcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRSZWZTZXFzKHN0YXJ0LCByZWZTZXFCeXRlcyAqIDIsIG9wdHMpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGNoclRvSW5kZXgsIGluZGV4VG9DaHIgfVxuICB9XG5cbiAgYXN5bmMgZ2V0UmVjb3Jkc0ZvclJhbmdlKFxuICAgIGNocjogc3RyaW5nLFxuICAgIG1pbjogbnVtYmVyLFxuICAgIG1heDogbnVtYmVyLFxuICAgIG9wdHM6IEJhbU9wdHMgPSB7IHZpZXdBc1BhaXJzOiBmYWxzZSwgcGFpckFjcm9zc0NocjogZmFsc2UsIG1heEluc2VydFNpemU6IDIwMDAwMCB9LFxuICApIHtcbiAgICBsZXQgcmVjb3JkczogQkFNRmVhdHVyZVtdID0gW11cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHRoaXMuc3RyZWFtUmVjb3Jkc0ZvclJhbmdlKGNociwgbWluLCBtYXgsIG9wdHMpKSB7XG4gICAgICByZWNvcmRzID0gcmVjb3Jkcy5jb25jYXQoY2h1bmspXG4gICAgfVxuICAgIHJldHVybiByZWNvcmRzXG4gIH1cblxuICBhc3luYyAqc3RyZWFtUmVjb3Jkc0ZvclJhbmdlKFxuICAgIGNocjogc3RyaW5nLFxuICAgIG1pbjogbnVtYmVyLFxuICAgIG1heDogbnVtYmVyLFxuICAgIG9wdHM6IEJhbU9wdHMgPSB7IHZpZXdBc1BhaXJzOiBmYWxzZSwgcGFpckFjcm9zc0NocjogZmFsc2UsIG1heEluc2VydFNpemU6IDIwMDAwMCB9LFxuICApIHtcbiAgICAvLyB0b2RvIHJlZ3VsYXJpemUgcmVmc2VxIG5hbWVzXG4gICAgb3B0cy52aWV3QXNQYWlycyA9IG9wdHMudmlld0FzUGFpcnMgfHwgZmFsc2VcbiAgICBvcHRzLnBhaXJBY3Jvc3NDaHIgPSBvcHRzLnBhaXJBY3Jvc3NDaHIgfHwgZmFsc2VcbiAgICBvcHRzLm1heEluc2VydFNpemUgPSBvcHRzLm1heEluc2VydFNpemUgIT09IHVuZGVmaW5lZCA/IG9wdHMubWF4SW5zZXJ0U2l6ZSA6IDIwMDAwMFxuICAgIGNvbnN0IGNocklkID0gdGhpcy5jaHJUb0luZGV4ICYmIHRoaXMuY2hyVG9JbmRleFtjaHJdXG4gICAgbGV0IGNodW5rczogQ2h1bmtbXVxuICAgIGlmICghKGNocklkID49IDApKSB7XG4gICAgICBjaHVua3MgPSBbXVxuICAgIH0gZWxzZSB7XG4gICAgICBjaHVua3MgPSBhd2FpdCB0aGlzLmluZGV4LmJsb2Nrc0ZvclJhbmdlKGNocklkLCBtaW4gLSAxLCBtYXgsIG9wdHMpXG5cbiAgICAgIGlmICghY2h1bmtzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgaW4gaW5kZXggZmV0Y2gnKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBhd2FpdCBhYm9ydEJyZWFrUG9pbnQob3B0cy5zaWduYWwpXG4gICAgICBjb25zdCBzaXplID0gY2h1bmtzW2ldLmZldGNoZWRTaXplKClcbiAgICAgIGlmIChzaXplID4gdGhpcy5jaHVua1NpemVMaW1pdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRvbyBtYW55IEJBTSBmZWF0dXJlcy4gQkFNIGNodW5rIHNpemUgJHtzaXplfSBieXRlcyBleGNlZWRzIGNodW5rU2l6ZUxpbWl0IG9mICR7dGhpcy5jaHVua1NpemVMaW1pdH1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdG90YWxTaXplID0gY2h1bmtzXG4gICAgICAubWFwKChzOiBDaHVuaykgPT4gcy5mZXRjaGVkU2l6ZSgpKVxuICAgICAgLnJlZHVjZSgoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IGEgKyBiLCAwKVxuICAgIGlmICh0b3RhbFNpemUgPiB0aGlzLmZldGNoU2l6ZUxpbWl0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBkYXRhIHNpemUgb2YgJHt0b3RhbFNpemUudG9Mb2NhbGVTdHJpbmcoKX0gYnl0ZXMgZXhjZWVkZWQgZmV0Y2ggc2l6ZSBsaW1pdCBvZiAke3RoaXMuZmV0Y2hTaXplTGltaXQudG9Mb2NhbGVTdHJpbmcoKX0gYnl0ZXNgLFxuICAgICAgKVxuICAgIH1cbiAgICB5aWVsZCogdGhpcy5fZmV0Y2hDaHVua0ZlYXR1cmVzKGNodW5rcywgY2hySWQsIG1pbiwgbWF4LCBvcHRzKVxuICB9XG5cbiAgYXN5bmMgKl9mZXRjaENodW5rRmVhdHVyZXMoXG4gICAgY2h1bmtzOiBDaHVua1tdLFxuICAgIGNocklkOiBudW1iZXIsXG4gICAgbWluOiBudW1iZXIsXG4gICAgbWF4OiBudW1iZXIsXG4gICAgb3B0czogQmFtT3B0cyxcbiAgKSB7XG4gICAgY29uc3QgZmVhdFByb21pc2VzID0gW11cbiAgICBsZXQgZG9uZSA9IGZhbHNlXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNodW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYyA9IGNodW5rc1tpXVxuICAgICAgY29uc3QgeyBkYXRhLCBjcG9zaXRpb25zLCBkcG9zaXRpb25zLCBjaHVuayB9ID0gYXdhaXQgdGhpcy5mZWF0dXJlQ2FjaGUuZ2V0KFxuICAgICAgICBjLnRvU3RyaW5nKCksXG4gICAgICAgIHsgY2h1bms6IGMsIG9wdHMgfSxcbiAgICAgICAgb3B0cy5zaWduYWwsXG4gICAgICApXG4gICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5yZWFkQmFtRmVhdHVyZXMoZGF0YSwgY3Bvc2l0aW9ucywgZHBvc2l0aW9ucywgY2h1bmspLnRoZW4ocmVjb3JkcyA9PiB7XG4gICAgICAgIGNvbnN0IHJlY3MgPSBbXVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29yZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCBmZWF0dXJlID0gcmVjb3Jkc1tpXVxuICAgICAgICAgIGlmIChmZWF0dXJlLnNlcV9pZCgpID09PSBjaHJJZCkge1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUuZ2V0KCdzdGFydCcpID49IG1heCkge1xuICAgICAgICAgICAgICAvLyBwYXN0IGVuZCBvZiByYW5nZSwgY2FuIHN0b3AgaXRlcmF0aW5nXG4gICAgICAgICAgICAgIGRvbmUgPSB0cnVlXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZlYXR1cmUuZ2V0KCdlbmQnKSA+PSBtaW4pIHtcbiAgICAgICAgICAgICAgLy8gbXVzdCBiZSBpbiByYW5nZVxuICAgICAgICAgICAgICByZWNzLnB1c2goZmVhdHVyZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlY3NcbiAgICAgIH0pXG4gICAgICBmZWF0UHJvbWlzZXMucHVzaChwcm9taXNlKVxuICAgICAgYXdhaXQgcHJvbWlzZVxuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjaGVja0Fib3J0U2lnbmFsKG9wdHMuc2lnbmFsKVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmZWF0UHJvbWlzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHlpZWxkIGZlYXRQcm9taXNlc1tpXVxuICAgIH1cbiAgICBjaGVja0Fib3J0U2lnbmFsKG9wdHMuc2lnbmFsKVxuICAgIGlmIChvcHRzLnZpZXdBc1BhaXJzKSB7XG4gICAgICB5aWVsZCB0aGlzLmZldGNoUGFpcnMoY2hySWQsIGZlYXRQcm9taXNlcywgb3B0cylcbiAgICB9XG4gIH1cblxuICBhc3luYyBmZXRjaFBhaXJzKGNocklkOiBudW1iZXIsIGZlYXRQcm9taXNlczogUHJvbWlzZTxCQU1GZWF0dXJlW10+W10sIG9wdHM6IEJhbU9wdHMpIHtcbiAgICBjb25zdCB1bm1hdGVkUGFpcnM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge31cbiAgICBjb25zdCByZWFkSWRzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge31cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZlYXRQcm9taXNlcy5tYXAoYXN5bmMgZiA9PiB7XG4gICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IGZcbiAgICAgICAgY29uc3QgcmVhZE5hbWVzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge31cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gcmV0W2ldLm5hbWUoKVxuICAgICAgICAgIGNvbnN0IGlkID0gcmV0W2ldLmlkKClcbiAgICAgICAgICBpZiAoIXJlYWROYW1lc1tuYW1lXSkge1xuICAgICAgICAgICAgcmVhZE5hbWVzW25hbWVdID0gMFxuICAgICAgICAgIH1cbiAgICAgICAgICByZWFkTmFtZXNbbmFtZV0rK1xuICAgICAgICAgIHJlYWRJZHNbaWRdID0gMVxuICAgICAgICB9XG4gICAgICAgIGVudHJpZXMocmVhZE5hbWVzKS5mb3JFYWNoKChbaywgdl06IFtzdHJpbmcsIG51bWJlcl0pID0+IHtcbiAgICAgICAgICBpZiAodiA9PT0gMSkge1xuICAgICAgICAgICAgdW5tYXRlZFBhaXJzW2tdID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pLFxuICAgIClcblxuICAgIGNvbnN0IG1hdGVQcm9taXNlczogUHJvbWlzZTxDaHVua1tdPltdID0gW11cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZlYXRQcm9taXNlcy5tYXAoYXN5bmMgZiA9PiB7XG4gICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IGZcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gcmV0W2ldLm5hbWUoKVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHVubWF0ZWRQYWlyc1tuYW1lXSAmJlxuICAgICAgICAgICAgKG9wdHMucGFpckFjcm9zc0NociB8fFxuICAgICAgICAgICAgICAocmV0W2ldLl9uZXh0X3JlZmlkKCkgPT09IGNocklkICYmXG4gICAgICAgICAgICAgICAgTWF0aC5hYnMocmV0W2ldLmdldCgnc3RhcnQnKSAtIHJldFtpXS5fbmV4dF9wb3MoKSkgPFxuICAgICAgICAgICAgICAgICAgKG9wdHMubWF4SW5zZXJ0U2l6ZSB8fCAyMDAwMDApKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1hdGVQcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgICB0aGlzLmluZGV4LmJsb2Nrc0ZvclJhbmdlKFxuICAgICAgICAgICAgICAgIHJldFtpXS5fbmV4dF9yZWZpZCgpLFxuICAgICAgICAgICAgICAgIHJldFtpXS5fbmV4dF9wb3MoKSxcbiAgICAgICAgICAgICAgICByZXRbaV0uX25leHRfcG9zKCkgKyAxLFxuICAgICAgICAgICAgICAgIG9wdHMsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApXG5cbiAgICBjb25zdCBtYXRlQmxvY2tzID0gYXdhaXQgUHJvbWlzZS5hbGwobWF0ZVByb21pc2VzKVxuICAgIGxldCBtYXRlQ2h1bmtzOiBDaHVua1tdID0gW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGVCbG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIG1hdGVDaHVua3MgPSBtYXRlQ2h1bmtzLmNvbmNhdChtYXRlQmxvY2tzW2ldKVxuICAgIH1cbiAgICAvLyBmaWx0ZXIgb3V0IGR1cGxpY2F0ZSBjaHVua3MgKHRoZSBibG9ja3MgYXJlIGxpc3RzIG9mIGNodW5rcywgYmxvY2tzIGFyZSBjb25jYXRlbmF0ZWQsIHRoZW4gZmlsdGVyIGR1cCBjaHVua3MpXG4gICAgbWF0ZUNodW5rcyA9IG1hdGVDaHVua3NcbiAgICAgIC5zb3J0KClcbiAgICAgIC5maWx0ZXIoKGl0ZW0sIHBvcywgYXJ5KSA9PiAhcG9zIHx8IGl0ZW0udG9TdHJpbmcoKSAhPT0gYXJ5W3BvcyAtIDFdLnRvU3RyaW5nKCkpXG5cbiAgICBjb25zdCBtYXRlVG90YWxTaXplID0gbWF0ZUNodW5rcy5tYXAocyA9PiBzLmZldGNoZWRTaXplKCkpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApXG4gICAgaWYgKG1hdGVUb3RhbFNpemUgPiB0aGlzLmZldGNoU2l6ZUxpbWl0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBkYXRhIHNpemUgb2YgJHttYXRlVG90YWxTaXplLnRvTG9jYWxlU3RyaW5nKCl9IGJ5dGVzIGV4Y2VlZGVkIGZldGNoIHNpemUgbGltaXQgb2YgJHt0aGlzLmZldGNoU2l6ZUxpbWl0LnRvTG9jYWxlU3RyaW5nKCl9IGJ5dGVzYCxcbiAgICAgIClcbiAgICB9XG4gICAgY29uc3QgbWF0ZUZlYXRQcm9taXNlcyA9IG1hdGVDaHVua3MubWFwKGFzeW5jIGMgPT4ge1xuICAgICAgY29uc3QgeyBkYXRhLCBjcG9zaXRpb25zLCBkcG9zaXRpb25zLCBjaHVuayB9ID0gYXdhaXQgdGhpcy5mZWF0dXJlQ2FjaGUuZ2V0KFxuICAgICAgICBjLnRvU3RyaW5nKCksXG4gICAgICAgIHsgY2h1bms6IGMsIG9wdHMgfSxcbiAgICAgICAgb3B0cy5zaWduYWwsXG4gICAgICApXG4gICAgICBjb25zdCBmZWF0cyA9IGF3YWl0IHRoaXMucmVhZEJhbUZlYXR1cmVzKGRhdGEsIGNwb3NpdGlvbnMsIGRwb3NpdGlvbnMsIGNodW5rKVxuICAgICAgY29uc3QgbWF0ZVJlY3MgPSBbXVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmZWF0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBmZWF0dXJlID0gZmVhdHNbaV1cbiAgICAgICAgaWYgKHVubWF0ZWRQYWlyc1tmZWF0dXJlLmdldCgnbmFtZScpXSAmJiAhcmVhZElkc1tmZWF0dXJlLmlkKCldKSB7XG4gICAgICAgICAgbWF0ZVJlY3MucHVzaChmZWF0dXJlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0ZVJlY3NcbiAgICB9KVxuICAgIGNvbnN0IG5ld01hdGVGZWF0cyA9IGF3YWl0IFByb21pc2UuYWxsKG1hdGVGZWF0UHJvbWlzZXMpXG4gICAgbGV0IGZlYXR1cmVzUmV0OiBCQU1GZWF0dXJlW10gPSBbXVxuICAgIGlmIChuZXdNYXRlRmVhdHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBuZXdNYXRlcyA9IG5ld01hdGVGZWF0cy5yZWR1Y2UoKHJlc3VsdCwgY3VycmVudCkgPT4gcmVzdWx0LmNvbmNhdChjdXJyZW50KSlcbiAgICAgIGZlYXR1cmVzUmV0ID0gZmVhdHVyZXNSZXQuY29uY2F0KG5ld01hdGVzKVxuICAgIH1cbiAgICByZXR1cm4gZmVhdHVyZXNSZXRcbiAgfVxuXG4gIGFzeW5jIF9yZWFkQ2h1bmsoeyBjaHVuaywgb3B0cyB9OiB7IGNodW5rOiB1bmtub3duOyBvcHRzOiBCYXNlT3B0cyB9LCBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgYyA9IGNodW5rIGFzIENodW5rXG4gICAgY29uc3QgYnVmc2l6ZSA9IGMuZmV0Y2hlZFNpemUoKVxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuYmFtLnJlYWQoQnVmZmVyLmFsbG9jKGJ1ZnNpemUpLCAwLCBidWZzaXplLCBjLm1pbnYuYmxvY2tQb3NpdGlvbiwgb3B0cylcbiAgICBjb25zdCB7IGJ5dGVzUmVhZCB9ID0gcmVzXG4gICAgbGV0IHsgYnVmZmVyIH0gPSByZXNcbiAgICBjaGVja0Fib3J0U2lnbmFsKGFib3J0U2lnbmFsKVxuICAgIGlmICghYnl0ZXNSZWFkKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgaWYgKGJ5dGVzUmVhZCA8IGJ1ZnNpemUpIHtcbiAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZSgwLCBieXRlc1JlYWQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZSgwLCBidWZzaXplKVxuICAgIH1cblxuICAgIGNvbnN0IHsgYnVmZmVyOiBkYXRhLCBjcG9zaXRpb25zLCBkcG9zaXRpb25zIH0gPSBhd2FpdCB1bnppcENodW5rU2xpY2UoYnVmZmVyLCBjaHVuaylcbiAgICBjaGVja0Fib3J0U2lnbmFsKGFib3J0U2lnbmFsKVxuICAgIHJldHVybiB7IGRhdGEsIGNwb3NpdGlvbnMsIGRwb3NpdGlvbnMsIGNodW5rIH1cbiAgfVxuXG4gIGFzeW5jIHJlYWRCYW1GZWF0dXJlcyhiYTogQnVmZmVyLCBjcG9zaXRpb25zOiBudW1iZXJbXSwgZHBvc2l0aW9uczogbnVtYmVyW10sIGNodW5rOiBDaHVuaykge1xuICAgIGxldCBibG9ja1N0YXJ0ID0gMFxuICAgIGNvbnN0IHNpbmsgPSBbXVxuICAgIGxldCBwb3MgPSAwXG4gICAgbGV0IGxhc3QgPSArRGF0ZS5ub3coKVxuXG4gICAgd2hpbGUgKGJsb2NrU3RhcnQgKyA0IDwgYmEubGVuZ3RoKSB7XG4gICAgICBjb25zdCBibG9ja1NpemUgPSBiYS5yZWFkSW50MzJMRShibG9ja1N0YXJ0KVxuICAgICAgY29uc3QgYmxvY2tFbmQgPSBibG9ja1N0YXJ0ICsgNCArIGJsb2NrU2l6ZSAtIDFcblxuICAgICAgLy8gaW5jcmVtZW50IHBvc2l0aW9uIHRvIHRoZSBjdXJyZW50IGRlY29tcHJlc3NlZCBzdGF0dXNcbiAgICAgIGlmIChkcG9zaXRpb25zKSB7XG4gICAgICAgIHdoaWxlIChibG9ja1N0YXJ0ICsgY2h1bmsubWludi5kYXRhUG9zaXRpb24gPj0gZHBvc2l0aW9uc1twb3MrK10pIHt9XG4gICAgICAgIHBvcy0tXG4gICAgICB9XG5cbiAgICAgIC8vIG9ubHkgdHJ5IHRvIHJlYWQgdGhlIGZlYXR1cmUgaWYgd2UgaGF2ZSBhbGwgdGhlIGJ5dGVzIGZvciBpdFxuICAgICAgaWYgKGJsb2NrRW5kIDwgYmEubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBuZXcgQkFNRmVhdHVyZSh7XG4gICAgICAgICAgYnl0ZXM6IHtcbiAgICAgICAgICAgIGJ5dGVBcnJheTogYmEsXG4gICAgICAgICAgICBzdGFydDogYmxvY2tTdGFydCxcbiAgICAgICAgICAgIGVuZDogYmxvY2tFbmQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyB0aGUgYmVsb3cgcmVzdWx0cyBpbiBhbiBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQgZmlsZS1vZmZzZXQgYmFzZWQgSURcbiAgICAgICAgICAvLyBpZiB0aGUgaW5mbyBmb3IgdGhhdCBpcyBhdmFpbGFibGUsIG90aGVyd2lzZSBjcmMzMiBvZiB0aGUgZmVhdHVyZXNcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIGNwb3NpdGlvbnNbcG9zXSByZWZlcnMgdG8gYWN0dWFsIGZpbGUgb2Zmc2V0IG9mIGEgYmd6aXAgYmxvY2sgYm91bmRhcmllc1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gd2UgbXVsdGlwbHkgYnkgKDEgPDw4KSBpbiBvcmRlciB0byBtYWtlIHN1cmUgZWFjaCBibG9jayBoYXMgYSBcInVuaXF1ZVwiXG4gICAgICAgICAgLy8gYWRkcmVzcyBzcGFjZSBzbyB0aGF0IGRhdGEgaW4gdGhhdCBibG9jayBjb3VsZCBuZXZlciBvdmVybGFwXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyB0aGVuIHRoZSBibG9ja1N0YXJ0LWRwb3NpdGlvbnMgaXMgYW4gdW5jb21wcmVzc2VkIGZpbGUgb2Zmc2V0IGZyb21cbiAgICAgICAgICAvLyB0aGF0IGJnemlwIGJsb2NrIGJvdW5kYXJ5LCBhbmQgc2luY2UgdGhlIGNwb3NpdGlvbnMgYXJlIG11bHRpcGxpZWQgYnlcbiAgICAgICAgICAvLyAoMSA8PCA4KSB0aGVzZSB1bmNvbXByZXNzZWQgb2Zmc2V0cyBnZXQgYSB1bmlxdWUgc3BhY2VcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIHRoaXMgaGFzIGFuIGV4dHJhIGNodW5rLm1pbnYuZGF0YVBvc2l0aW9uIGFkZGVkIG9uIGJlY2F1c2UgaXQgYmxvY2tTdGFydFxuICAgICAgICAgIC8vIHN0YXJ0cyBhdCAwIGluc3RlYWQgb2YgY2h1bmsubWludi5kYXRhUG9zaXRpb25cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIHRoZSArMSBpcyBqdXN0IHRvIGF2b2lkIGFueSBwb3NzaWJsZSB1bmlxdWVJZCAwIGJ1dCB0aGlzIGRvZXMgbm90IHJlYWxpc3RpY2FsbHkgaGFwcGVuXG4gICAgICAgICAgZmlsZU9mZnNldDogY3Bvc2l0aW9uc1xuICAgICAgICAgICAgPyBjcG9zaXRpb25zW3Bvc10gKiAoMSA8PCA4KSArXG4gICAgICAgICAgICAgIChibG9ja1N0YXJ0IC0gZHBvc2l0aW9uc1twb3NdKSArXG4gICAgICAgICAgICAgIGNodW5rLm1pbnYuZGF0YVBvc2l0aW9uICtcbiAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgOiBjcmMzMi5zaWduZWQoYmEuc2xpY2UoYmxvY2tTdGFydCwgYmxvY2tFbmQpKSxcbiAgICAgICAgfSlcblxuICAgICAgICBzaW5rLnB1c2goZmVhdHVyZSlcbiAgICAgICAgaWYgKHRoaXMueWllbGRUaHJlYWRUaW1lICYmICtEYXRlLm5vdygpIC0gbGFzdCA+IHRoaXMueWllbGRUaHJlYWRUaW1lKSB7XG4gICAgICAgICAgYXdhaXQgdGltZW91dCgxKVxuICAgICAgICAgIGxhc3QgPSArRGF0ZS5ub3coKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGJsb2NrU3RhcnQgPSBibG9ja0VuZCArIDFcbiAgICB9XG4gICAgcmV0dXJuIHNpbmtcbiAgfVxuXG4gIGFzeW5jIGhhc1JlZlNlcShzZXFOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWZJZCA9IHRoaXMuY2hyVG9JbmRleCAmJiB0aGlzLmNoclRvSW5kZXhbc2VxTmFtZV1cbiAgICByZXR1cm4gdGhpcy5pbmRleC5oYXNSZWZTZXEocmVmSWQpXG4gIH1cblxuICBhc3luYyBsaW5lQ291bnQoc2VxTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVmSWQgPSB0aGlzLmNoclRvSW5kZXggJiYgdGhpcy5jaHJUb0luZGV4W3NlcU5hbWVdXG4gICAgcmV0dXJuIHRoaXMuaW5kZXgubGluZUNvdW50KHJlZklkKVxuICB9XG5cbiAgYXN5bmMgaW5kZXhDb3Yoc2VxTmFtZTogc3RyaW5nLCBzdGFydD86IG51bWJlciwgZW5kPzogbnVtYmVyKSB7XG4gICAgYXdhaXQgdGhpcy5pbmRleC5wYXJzZSgpXG4gICAgY29uc3Qgc2VxSWQgPSB0aGlzLmNoclRvSW5kZXggJiYgdGhpcy5jaHJUb0luZGV4W3NlcU5hbWVdXG4gICAgcmV0dXJuIHRoaXMuaW5kZXguaW5kZXhDb3Yoc2VxSWQsIHN0YXJ0LCBlbmQpXG4gIH1cbn1cbiJdfQ==
695
+ //# sourceMappingURL=bamFile.js.map