@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/bai.js CHANGED
@@ -1,565 +1,317 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
4
-
5
- var _Object$defineProperty2 = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
6
-
7
- _Object$defineProperty2(exports, "__esModule", {
8
- value: true
9
- });
10
-
11
- exports.default = void 0;
12
-
13
- var _getIterator2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator"));
14
-
15
- var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));
16
-
17
- var _getIteratorMethod2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator-method"));
18
-
19
- var _symbol = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/symbol"));
20
-
21
- var _from = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/from"));
22
-
23
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-property"));
24
-
25
- var _defineProperties = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-properties"));
26
-
27
- var _getOwnPropertyDescriptors = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors"));
28
-
29
- var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
30
-
31
- var _getOwnPropertyDescriptor = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor"));
32
-
33
- var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
34
-
35
- var _getOwnPropertySymbols = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols"));
36
-
37
- var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));
38
-
39
- var _construct = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/reflect/construct"));
40
-
41
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
42
-
43
- var _defineProperty3 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
44
-
45
- var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
46
-
47
- var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));
48
-
49
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));
50
-
51
- var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));
52
-
53
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));
54
-
55
- var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));
56
-
57
- var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));
58
-
59
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));
60
-
61
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));
62
-
63
- var _long = _interopRequireDefault(require("long"));
64
-
65
- var _virtualOffset = require("./virtualOffset");
66
-
67
- var _chunk = _interopRequireDefault(require("./chunk"));
68
-
69
- var _indexFile = _interopRequireDefault(require("./indexFile"));
70
-
71
- var _util = require("./util");
72
-
73
- function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof _symbol.default === "undefined" || (0, _getIteratorMethod2.default)(o) == null) { if ((0, _isArray.default)(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = (0, _getIterator2.default)(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
74
-
75
- function _unsupportedIterableToArray(o, minLen) { var _context7; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = (0, _slice.default)(_context7 = Object.prototype.toString.call(o)).call(_context7, 8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return (0, _from.default)(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
76
-
77
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
78
-
79
- function ownKeys(object, enumerableOnly) { var keys = (0, _keys.default)(object); if (_getOwnPropertySymbols.default) { var symbols = (0, _getOwnPropertySymbols.default)(object); if (enumerableOnly) symbols = (0, _filter.default)(symbols).call(symbols, function (sym) { return (0, _getOwnPropertyDescriptor.default)(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
80
-
81
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context5; (0, _forEach.default)(_context5 = ownKeys(Object(source), true)).call(_context5, function (key) { (0, _defineProperty3.default)(target, key, source[key]); }); } else if (_getOwnPropertyDescriptors.default) { (0, _defineProperties.default)(target, (0, _getOwnPropertyDescriptors.default)(source)); } else { var _context6; (0, _forEach.default)(_context6 = ownKeys(Object(source))).call(_context6, function (key) { (0, _defineProperty2.default)(target, key, (0, _getOwnPropertyDescriptor.default)(source, key)); }); } } return target; }
82
-
83
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = (0, _construct.default)(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
84
-
85
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_construct.default) return false; if (_construct.default.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call((0, _construct.default)(Date, [], function () {})); return true; } catch (e) { return false; } }
86
-
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __assign = (this && this.__assign) || function () {
18
+ __assign = Object.assign || function(t) {
19
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
20
+ s = arguments[i];
21
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
+ t[p] = s[p];
23
+ }
24
+ return t;
25
+ };
26
+ return __assign.apply(this, arguments);
27
+ };
28
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
29
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
30
+ return new (P || (P = Promise))(function (resolve, reject) {
31
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
32
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
33
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
34
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
35
+ });
36
+ };
37
+ var __generator = (this && this.__generator) || function (thisArg, body) {
38
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
39
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
40
+ function verb(n) { return function (v) { return step([n, v]); }; }
41
+ function step(op) {
42
+ if (f) throw new TypeError("Generator is already executing.");
43
+ while (_) try {
44
+ 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;
45
+ if (y = 0, t) op = [op[0] & 2, t.value];
46
+ switch (op[0]) {
47
+ case 0: case 1: t = op; break;
48
+ case 4: _.label++; return { value: op[1], done: false };
49
+ case 5: _.label++; y = op[1]; op = [0]; continue;
50
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
51
+ default:
52
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
53
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
54
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
55
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
56
+ if (t[2]) _.ops.pop();
57
+ _.trys.pop(); continue;
58
+ }
59
+ op = body.call(thisArg, _);
60
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
61
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
62
+ }
63
+ };
64
+ var __importDefault = (this && this.__importDefault) || function (mod) {
65
+ return (mod && mod.__esModule) ? mod : { "default": mod };
66
+ };
67
+ Object.defineProperty(exports, "__esModule", { value: true });
68
+ var long_1 = __importDefault(require("long"));
69
+ var virtualOffset_1 = require("./virtualOffset");
70
+ var chunk_1 = __importDefault(require("./chunk"));
71
+ var indexFile_1 = __importDefault(require("./indexFile"));
72
+ var util_1 = require("./util");
87
73
  var BAI_MAGIC = 21578050; // BAI\1
88
-
89
74
  function roundDown(n, multiple) {
90
- return n - n % multiple;
75
+ return n - (n % multiple);
91
76
  }
92
-
93
77
  function roundUp(n, multiple) {
94
- return n - n % multiple + multiple;
78
+ return n - (n % multiple) + multiple;
95
79
  }
96
-
97
- var BAI = /*#__PURE__*/function (_IndexFile) {
98
- (0, _inherits2.default)(BAI, _IndexFile);
99
-
100
- var _super = _createSuper(BAI);
101
-
102
- function BAI() {
103
- (0, _classCallCheck2.default)(this, BAI);
104
- return _super.apply(this, arguments);
105
- }
106
-
107
- (0, _createClass2.default)(BAI, [{
108
- key: "parsePseudoBin",
109
- value: function parsePseudoBin(bytes, offset) {
110
- var lineCount = (0, _util.longToNumber)(_long.default.fromBytesLE((0, _slice.default)(Array.prototype).call(bytes, offset + 16, offset + 24), true));
111
- return {
112
- lineCount: lineCount
113
- };
80
+ var BAI = /** @class */ (function (_super) {
81
+ __extends(BAI, _super);
82
+ function BAI() {
83
+ return _super !== null && _super.apply(this, arguments) || this;
114
84
  }
115
- }, {
116
- key: "lineCount",
117
- value: function () {
118
- var _lineCount = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(refId) {
119
- var opts,
120
- prom,
121
- index,
122
- ret,
123
- _args = arguments;
124
- return _regenerator.default.wrap(function _callee$(_context) {
125
- while (1) {
126
- switch (_context.prev = _context.next) {
127
- case 0:
128
- opts = _args.length > 1 && _args[1] !== undefined ? _args[1] : {};
129
- _context.next = 3;
130
- return this.parse(opts);
131
-
132
- case 3:
133
- prom = _context.sent;
134
- index = prom.indices[refId];
135
-
136
- if (index) {
137
- _context.next = 7;
138
- break;
139
- }
140
-
141
- return _context.abrupt("return", -1);
142
-
143
- case 7:
144
- ret = index.stats || {};
145
- return _context.abrupt("return", ret.lineCount === undefined ? -1 : ret.lineCount);
146
-
147
- case 9:
148
- case "end":
149
- return _context.stop();
150
- }
151
- }
152
- }, _callee, this);
153
- }));
154
-
155
- function lineCount(_x) {
156
- return _lineCount.apply(this, arguments);
157
- }
158
-
159
- return lineCount;
160
- }() // fetch and parse the index
161
-
162
- }, {
163
- key: "_parse",
164
- value: function () {
165
- var _parse2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
166
- var opts,
167
- data,
168
- bytes,
169
- depth,
170
- binLimit,
171
- currOffset,
172
- i,
173
- binCount,
174
- stats,
175
- binIndex,
176
- j,
177
- bin,
178
- chunkCount,
179
- chunks,
180
- k,
181
- u,
182
- v,
183
- linearCount,
184
- linearIndex,
185
- _k,
186
- _args2 = arguments;
187
-
188
- return _regenerator.default.wrap(function _callee2$(_context2) {
189
- while (1) {
190
- switch (_context2.prev = _context2.next) {
191
- case 0:
192
- opts = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : {};
193
- data = {
194
- bai: true,
195
- maxBlockSize: 1 << 16
196
- };
197
- _context2.next = 4;
198
- return this.filehandle.readFile(opts);
199
-
200
- case 4:
201
- bytes = _context2.sent;
202
-
203
- if (!(bytes.readUInt32LE(0) !== BAI_MAGIC)) {
204
- _context2.next = 7;
205
- break;
206
- }
207
-
208
- throw new Error('Not a BAI file');
209
-
210
- case 7:
211
- data.refCount = bytes.readInt32LE(4);
212
- depth = 5;
213
- binLimit = ((1 << (depth + 1) * 3) - 1) / 7; // read the indexes for each reference sequence
214
-
215
- data.indices = new Array(data.refCount);
216
- currOffset = 8;
217
- i = 0;
218
-
219
- case 13:
220
- if (!(i < data.refCount)) {
221
- _context2.next = 50;
222
- break;
223
- }
224
-
225
- _context2.next = 16;
226
- return (0, _util.abortBreakPoint)(opts.signal);
227
-
228
- case 16:
229
- // the binning index
230
- binCount = bytes.readInt32LE(currOffset);
231
- stats = void 0;
232
- currOffset += 4;
233
- binIndex = {};
234
- j = 0;
235
-
236
- case 21:
237
- if (!(j < binCount)) {
238
- _context2.next = 42;
239
- break;
240
- }
241
-
242
- bin = bytes.readUInt32LE(currOffset);
243
- currOffset += 4;
244
-
245
- if (!(bin === binLimit + 1)) {
246
- _context2.next = 30;
247
- break;
248
- }
249
-
250
- currOffset += 4;
251
- stats = this.parsePseudoBin(bytes, currOffset);
252
- currOffset += 32;
253
- _context2.next = 39;
254
- break;
255
-
256
- case 30:
257
- if (!(bin > binLimit + 1)) {
258
- _context2.next = 34;
259
- break;
260
- }
261
-
262
- throw new Error('bai index contains too many bins, please use CSI');
263
-
264
- case 34:
265
- chunkCount = bytes.readInt32LE(currOffset);
266
- currOffset += 4;
267
- chunks = new Array(chunkCount);
268
-
269
- for (k = 0; k < chunkCount; k += 1) {
270
- u = (0, _virtualOffset.fromBytes)(bytes, currOffset);
271
- v = (0, _virtualOffset.fromBytes)(bytes, currOffset + 8);
272
- currOffset += 16;
273
-
274
- this._findFirstData(data, u);
275
-
276
- chunks[k] = new _chunk.default(u, v, bin);
277
- }
278
-
279
- binIndex[bin] = chunks;
280
-
281
- case 39:
282
- j += 1;
283
- _context2.next = 21;
284
- break;
285
-
286
- case 42:
287
- linearCount = bytes.readInt32LE(currOffset);
288
- currOffset += 4; // as we're going through the linear index, figure out
289
- // the smallest virtual offset in the indexes, which
290
- // tells us where the BAM header ends
291
-
292
- linearIndex = new Array(linearCount);
293
-
294
- for (_k = 0; _k < linearCount; _k += 1) {
295
- linearIndex[_k] = (0, _virtualOffset.fromBytes)(bytes, currOffset);
296
- currOffset += 8;
297
-
298
- this._findFirstData(data, linearIndex[_k]);
299
- }
300
-
301
- data.indices[i] = {
302
- binIndex: binIndex,
303
- linearIndex: linearIndex,
304
- stats: stats
305
- };
306
-
307
- case 47:
308
- i += 1;
309
- _context2.next = 13;
310
- break;
311
-
312
- case 50:
313
- return _context2.abrupt("return", data);
314
-
315
- case 51:
316
- case "end":
317
- return _context2.stop();
318
- }
319
- }
320
- }, _callee2, this);
321
- }));
322
-
323
- function _parse() {
324
- return _parse2.apply(this, arguments);
325
- }
326
-
327
- return _parse;
328
- }()
329
- }, {
330
- key: "indexCov",
331
- value: function () {
332
- var _indexCov = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(seqId, start, end) {
333
- var opts,
334
- v,
335
- range,
336
- indexData,
337
- seqIdx,
338
- _seqIdx$linearIndex,
339
- linearIndex,
340
- stats,
341
- e,
342
- s,
343
- depths,
344
- totalSize,
345
- currentPos,
346
- i,
347
- j,
348
- _args3 = arguments;
349
-
350
- return _regenerator.default.wrap(function _callee3$(_context3) {
351
- while (1) {
352
- switch (_context3.prev = _context3.next) {
353
- case 0:
354
- opts = _args3.length > 3 && _args3[3] !== undefined ? _args3[3] : {};
355
- v = 16384;
356
- range = start !== undefined;
357
- _context3.next = 5;
358
- return this.parse(opts);
359
-
360
- case 5:
361
- indexData = _context3.sent;
362
- seqIdx = indexData.indices[seqId];
363
-
364
- if (seqIdx) {
365
- _context3.next = 9;
366
- break;
367
- }
368
-
369
- return _context3.abrupt("return", []);
370
-
371
- case 9:
372
- _seqIdx$linearIndex = seqIdx.linearIndex, linearIndex = _seqIdx$linearIndex === void 0 ? [] : _seqIdx$linearIndex, stats = seqIdx.stats;
373
-
374
- if (linearIndex.length) {
375
- _context3.next = 12;
376
- break;
377
- }
378
-
379
- return _context3.abrupt("return", []);
380
-
381
- case 12:
382
- e = end !== undefined ? roundUp(end, v) : (linearIndex.length - 1) * v;
383
- s = start !== undefined ? roundDown(start, v) : 0;
384
-
385
- if (range) {
386
- depths = new Array((e - s) / v);
387
- } else {
388
- depths = new Array(linearIndex.length - 1);
85
+ BAI.prototype.parsePseudoBin = function (bytes, offset) {
86
+ var lineCount = (0, util_1.longToNumber)(long_1.default.fromBytesLE(Array.prototype.slice.call(bytes, offset + 16, offset + 24), true));
87
+ return { lineCount: lineCount };
88
+ };
89
+ BAI.prototype.lineCount = function (refId, opts) {
90
+ if (opts === void 0) { opts = {}; }
91
+ return __awaiter(this, void 0, void 0, function () {
92
+ var prom, index, ret;
93
+ return __generator(this, function (_a) {
94
+ switch (_a.label) {
95
+ case 0: return [4 /*yield*/, this.parse(opts)];
96
+ case 1:
97
+ prom = _a.sent();
98
+ index = prom.indices[refId];
99
+ if (!index) {
100
+ return [2 /*return*/, -1];
101
+ }
102
+ ret = index.stats || {};
103
+ return [2 /*return*/, ret.lineCount === undefined ? -1 : ret.lineCount];
389
104
  }
390
-
391
- totalSize = linearIndex[linearIndex.length - 1].blockPosition;
392
-
393
- if (!(e > (linearIndex.length - 1) * v)) {
394
- _context3.next = 18;
395
- break;
105
+ });
106
+ });
107
+ };
108
+ BAI.prototype.fetchBai = function (opts) {
109
+ var _this = this;
110
+ if (opts === void 0) { opts = {}; }
111
+ if (!this.baiP) {
112
+ this.baiP = this.filehandle.readFile(opts).catch(function (e) {
113
+ _this.baiP = undefined;
114
+ throw e;
115
+ });
116
+ }
117
+ return this.baiP;
118
+ };
119
+ // fetch and parse the index
120
+ BAI.prototype._parse = function (opts) {
121
+ if (opts === void 0) { opts = {}; }
122
+ return __awaiter(this, void 0, void 0, function () {
123
+ var data, bytes, depth, binLimit, currOffset, i, binCount, stats, binIndex, j, bin, chunkCount, chunks, k, u, v, linearCount, linearIndex, k;
124
+ return __generator(this, function (_a) {
125
+ switch (_a.label) {
126
+ case 0:
127
+ data = { bai: true, maxBlockSize: 1 << 16 };
128
+ return [4 /*yield*/, this.fetchBai()
129
+ // check BAI magic numbers
130
+ ];
131
+ case 1:
132
+ bytes = _a.sent();
133
+ // check BAI magic numbers
134
+ if (bytes.readUInt32LE(0) !== BAI_MAGIC) {
135
+ throw new Error('Not a BAI file');
136
+ }
137
+ data.refCount = bytes.readInt32LE(4);
138
+ depth = 5;
139
+ binLimit = ((1 << ((depth + 1) * 3)) - 1) / 7;
140
+ // read the indexes for each reference sequence
141
+ data.indices = new Array(data.refCount);
142
+ currOffset = 8;
143
+ i = 0;
144
+ _a.label = 2;
145
+ case 2:
146
+ if (!(i < data.refCount)) return [3 /*break*/, 5];
147
+ return [4 /*yield*/, (0, util_1.abortBreakPoint)(opts.signal)
148
+ // the binning index
149
+ ];
150
+ case 3:
151
+ _a.sent();
152
+ binCount = bytes.readInt32LE(currOffset);
153
+ stats = void 0;
154
+ currOffset += 4;
155
+ binIndex = {};
156
+ for (j = 0; j < binCount; j += 1) {
157
+ bin = bytes.readUInt32LE(currOffset);
158
+ currOffset += 4;
159
+ if (bin === binLimit + 1) {
160
+ currOffset += 4;
161
+ stats = this.parsePseudoBin(bytes, currOffset);
162
+ currOffset += 32;
163
+ }
164
+ else if (bin > binLimit + 1) {
165
+ throw new Error('bai index contains too many bins, please use CSI');
166
+ }
167
+ else {
168
+ chunkCount = bytes.readInt32LE(currOffset);
169
+ currOffset += 4;
170
+ chunks = new Array(chunkCount);
171
+ for (k = 0; k < chunkCount; k += 1) {
172
+ u = (0, virtualOffset_1.fromBytes)(bytes, currOffset);
173
+ v = (0, virtualOffset_1.fromBytes)(bytes, currOffset + 8);
174
+ currOffset += 16;
175
+ this._findFirstData(data, u);
176
+ chunks[k] = new chunk_1.default(u, v, bin);
177
+ }
178
+ binIndex[bin] = chunks;
179
+ }
180
+ }
181
+ linearCount = bytes.readInt32LE(currOffset);
182
+ currOffset += 4;
183
+ linearIndex = new Array(linearCount);
184
+ for (k = 0; k < linearCount; k += 1) {
185
+ linearIndex[k] = (0, virtualOffset_1.fromBytes)(bytes, currOffset);
186
+ currOffset += 8;
187
+ this._findFirstData(data, linearIndex[k]);
188
+ }
189
+ data.indices[i] = { binIndex: binIndex, linearIndex: linearIndex, stats: stats };
190
+ _a.label = 4;
191
+ case 4:
192
+ i += 1;
193
+ return [3 /*break*/, 2];
194
+ case 5: return [2 /*return*/, data];
396
195
  }
397
-
398
- throw new Error('query outside of range of linear index');
399
-
400
- case 18:
401
- currentPos = linearIndex[s / v].blockPosition;
402
-
403
- for (i = s / v, j = 0; i < e / v; i++, j++) {
404
- depths[j] = {
405
- score: linearIndex[i + 1].blockPosition - currentPos,
406
- start: i * v,
407
- end: i * v + v
408
- };
409
- currentPos = linearIndex[i + 1].blockPosition;
196
+ });
197
+ });
198
+ };
199
+ BAI.prototype.indexCov = function (seqId, start, end, opts) {
200
+ if (opts === void 0) { opts = {}; }
201
+ return __awaiter(this, void 0, void 0, function () {
202
+ var v, range, indexData, seqIdx, _a, linearIndex, stats, e, s, depths, totalSize, currentPos, i, j;
203
+ return __generator(this, function (_b) {
204
+ switch (_b.label) {
205
+ case 0:
206
+ v = 16384;
207
+ range = start !== undefined;
208
+ return [4 /*yield*/, this.parse(opts)];
209
+ case 1:
210
+ indexData = _b.sent();
211
+ seqIdx = indexData.indices[seqId];
212
+ if (!seqIdx) {
213
+ return [2 /*return*/, []];
214
+ }
215
+ _a = seqIdx.linearIndex, linearIndex = _a === void 0 ? [] : _a, stats = seqIdx.stats;
216
+ if (!linearIndex.length) {
217
+ return [2 /*return*/, []];
218
+ }
219
+ e = end !== undefined ? roundUp(end, v) : (linearIndex.length - 1) * v;
220
+ s = start !== undefined ? roundDown(start, v) : 0;
221
+ if (range) {
222
+ depths = new Array((e - s) / v);
223
+ }
224
+ else {
225
+ depths = new Array(linearIndex.length - 1);
226
+ }
227
+ totalSize = linearIndex[linearIndex.length - 1].blockPosition;
228
+ if (e > (linearIndex.length - 1) * v) {
229
+ throw new Error('query outside of range of linear index');
230
+ }
231
+ currentPos = linearIndex[s / v].blockPosition;
232
+ for (i = s / v, j = 0; i < e / v; i++, j++) {
233
+ depths[j] = {
234
+ score: linearIndex[i + 1].blockPosition - currentPos,
235
+ start: i * v,
236
+ end: i * v + v,
237
+ };
238
+ currentPos = linearIndex[i + 1].blockPosition;
239
+ }
240
+ return [2 /*return*/, depths.map(function (d) {
241
+ return __assign(__assign({}, d), { score: (d.score * stats.lineCount) / totalSize });
242
+ })];
410
243
  }
411
-
412
- return _context3.abrupt("return", (0, _map.default)(depths).call(depths, function (d) {
413
- return _objectSpread(_objectSpread({}, d), {}, {
414
- score: d.score * stats.lineCount / totalSize
415
- });
416
- }));
417
-
418
- case 21:
419
- case "end":
420
- return _context3.stop();
421
- }
422
- }
423
- }, _callee3, this);
424
- }));
425
-
426
- function indexCov(_x2, _x3, _x4) {
427
- return _indexCov.apply(this, arguments);
428
- }
429
-
430
- return indexCov;
431
- }()
244
+ });
245
+ });
246
+ };
432
247
  /**
433
248
  * calculate the list of bins that may overlap with region [beg,end) (zero-based half-open)
434
249
  * @returns {Array[number]}
435
250
  */
436
-
437
- }, {
438
- key: "reg2bins",
439
- value: function reg2bins(beg, end) {
440
- end -= 1;
441
- return [[0, 0], [1 + (beg >> 26), 1 + (end >> 26)], [9 + (beg >> 23), 9 + (end >> 23)], [73 + (beg >> 20), 73 + (end >> 20)], [585 + (beg >> 17), 585 + (end >> 17)], [4681 + (beg >> 14), 4681 + (end >> 14)]];
442
- }
443
- }, {
444
- key: "blocksForRange",
445
- value: function () {
446
- var _blocksForRange = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(refId, min, max) {
447
- var opts,
448
- indexData,
449
- ba,
450
- overlappingBins,
451
- chunks,
452
- _iterator,
453
- _step,
454
- _step$value,
455
- start,
456
- end,
457
- bin,
458
- binChunks,
459
- c,
460
- nintv,
461
- lowest,
462
- minLin,
463
- maxLin,
464
- i,
465
- vp,
466
- _args4 = arguments;
467
-
468
- return _regenerator.default.wrap(function _callee4$(_context4) {
469
- while (1) {
470
- switch (_context4.prev = _context4.next) {
471
- case 0:
472
- opts = _args4.length > 3 && _args4[3] !== undefined ? _args4[3] : {};
473
-
474
- if (min < 0) {
475
- min = 0;
476
- }
477
-
478
- _context4.next = 4;
479
- return this.parse(opts);
480
-
481
- case 4:
482
- indexData = _context4.sent;
483
-
484
- if (indexData) {
485
- _context4.next = 7;
486
- break;
487
- }
488
-
489
- return _context4.abrupt("return", []);
490
-
491
- case 7:
492
- ba = indexData.indices[refId];
493
-
494
- if (ba) {
495
- _context4.next = 10;
496
- break;
497
- }
498
-
499
- return _context4.abrupt("return", []);
500
-
501
- case 10:
502
- overlappingBins = this.reg2bins(min, max); // List of bin #s that overlap min, max
503
-
504
- chunks = []; // Find chunks in overlapping bins. Leaf bins (< 4681) are not pruned
505
-
506
- _iterator = _createForOfIteratorHelper(overlappingBins);
507
-
508
- try {
509
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
510
- _step$value = (0, _slicedToArray2.default)(_step.value, 2), start = _step$value[0], end = _step$value[1];
511
-
512
- for (bin = start; bin <= end; bin++) {
513
- if (ba.binIndex[bin]) {
514
- binChunks = ba.binIndex[bin];
515
-
516
- for (c = 0; c < binChunks.length; ++c) {
517
- chunks.push(new _chunk.default(binChunks[c].minv, binChunks[c].maxv, bin));
251
+ BAI.prototype.reg2bins = function (beg, end) {
252
+ end -= 1;
253
+ return [
254
+ [0, 0],
255
+ [1 + (beg >> 26), 1 + (end >> 26)],
256
+ [9 + (beg >> 23), 9 + (end >> 23)],
257
+ [73 + (beg >> 20), 73 + (end >> 20)],
258
+ [585 + (beg >> 17), 585 + (end >> 17)],
259
+ [4681 + (beg >> 14), 4681 + (end >> 14)],
260
+ ];
261
+ };
262
+ BAI.prototype.blocksForRange = function (refId, min, max, opts) {
263
+ if (opts === void 0) { opts = {}; }
264
+ return __awaiter(this, void 0, void 0, function () {
265
+ var indexData, ba, overlappingBins, chunks, _i, overlappingBins_1, _a, start, end, bin, binChunks, c, nintv, lowest, minLin, maxLin, i, vp;
266
+ return __generator(this, function (_b) {
267
+ switch (_b.label) {
268
+ case 0:
269
+ if (min < 0) {
270
+ min = 0;
518
271
  }
519
- }
520
- }
521
- } // Use the linear index to find minimum file position of chunks that could contain alignments in the region
522
-
523
- } catch (err) {
524
- _iterator.e(err);
525
- } finally {
526
- _iterator.f();
527
- }
528
-
529
- nintv = ba.linearIndex.length;
530
- lowest = null;
531
- minLin = Math.min(min >> 14, nintv - 1);
532
- maxLin = Math.min(max >> 14, nintv - 1);
533
-
534
- for (i = minLin; i <= maxLin; ++i) {
535
- vp = ba.linearIndex[i];
536
-
537
- if (vp) {
538
- if (!lowest || vp.compareTo(lowest) < 0) {
539
- lowest = vp;
540
- }
541
- }
272
+ return [4 /*yield*/, this.parse(opts)];
273
+ case 1:
274
+ indexData = _b.sent();
275
+ if (!indexData) {
276
+ return [2 /*return*/, []];
277
+ }
278
+ ba = indexData.indices[refId];
279
+ if (!ba) {
280
+ return [2 /*return*/, []];
281
+ }
282
+ overlappingBins = this.reg2bins(min, max) // List of bin #s that overlap min, max
283
+ ;
284
+ chunks = [];
285
+ // Find chunks in overlapping bins. Leaf bins (< 4681) are not pruned
286
+ for (_i = 0, overlappingBins_1 = overlappingBins; _i < overlappingBins_1.length; _i++) {
287
+ _a = overlappingBins_1[_i], start = _a[0], end = _a[1];
288
+ for (bin = start; bin <= end; bin++) {
289
+ if (ba.binIndex[bin]) {
290
+ binChunks = ba.binIndex[bin];
291
+ for (c = 0; c < binChunks.length; ++c) {
292
+ chunks.push(new chunk_1.default(binChunks[c].minv, binChunks[c].maxv, bin));
293
+ }
294
+ }
295
+ }
296
+ }
297
+ nintv = ba.linearIndex.length;
298
+ lowest = null;
299
+ minLin = Math.min(min >> 14, nintv - 1);
300
+ maxLin = Math.min(max >> 14, nintv - 1);
301
+ for (i = minLin; i <= maxLin; ++i) {
302
+ vp = ba.linearIndex[i];
303
+ if (vp) {
304
+ if (!lowest || vp.compareTo(lowest) < 0) {
305
+ lowest = vp;
306
+ }
307
+ }
308
+ }
309
+ return [2 /*return*/, (0, util_1.optimizeChunks)(chunks, lowest)];
542
310
  }
543
-
544
- return _context4.abrupt("return", (0, _util.optimizeChunks)(chunks, lowest));
545
-
546
- case 20:
547
- case "end":
548
- return _context4.stop();
549
- }
550
- }
551
- }, _callee4, this);
552
- }));
553
-
554
- function blocksForRange(_x5, _x6, _x7) {
555
- return _blocksForRange.apply(this, arguments);
556
- }
557
-
558
- return blocksForRange;
559
- }()
560
- }]);
561
- return BAI;
562
- }(_indexFile.default);
563
-
311
+ });
312
+ });
313
+ };
314
+ return BAI;
315
+ }(indexFile_1.default));
564
316
  exports.default = BAI;
565
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iYWkudHMiXSwibmFtZXMiOlsiQkFJX01BR0lDIiwicm91bmREb3duIiwibiIsIm11bHRpcGxlIiwicm91bmRVcCIsIkJBSSIsImJ5dGVzIiwib2Zmc2V0IiwibGluZUNvdW50IiwiTG9uZyIsImZyb21CeXRlc0xFIiwiQXJyYXkiLCJwcm90b3R5cGUiLCJjYWxsIiwicmVmSWQiLCJvcHRzIiwicGFyc2UiLCJwcm9tIiwiaW5kZXgiLCJpbmRpY2VzIiwicmV0Iiwic3RhdHMiLCJ1bmRlZmluZWQiLCJkYXRhIiwiYmFpIiwibWF4QmxvY2tTaXplIiwiZmlsZWhhbmRsZSIsInJlYWRGaWxlIiwicmVhZFVJbnQzMkxFIiwiRXJyb3IiLCJyZWZDb3VudCIsInJlYWRJbnQzMkxFIiwiZGVwdGgiLCJiaW5MaW1pdCIsImN1cnJPZmZzZXQiLCJpIiwic2lnbmFsIiwiYmluQ291bnQiLCJiaW5JbmRleCIsImoiLCJiaW4iLCJwYXJzZVBzZXVkb0JpbiIsImNodW5rQ291bnQiLCJjaHVua3MiLCJrIiwidSIsInYiLCJfZmluZEZpcnN0RGF0YSIsIkNodW5rIiwibGluZWFyQ291bnQiLCJsaW5lYXJJbmRleCIsInNlcUlkIiwic3RhcnQiLCJlbmQiLCJyYW5nZSIsImluZGV4RGF0YSIsInNlcUlkeCIsImxlbmd0aCIsImUiLCJzIiwiZGVwdGhzIiwidG90YWxTaXplIiwiYmxvY2tQb3NpdGlvbiIsImN1cnJlbnRQb3MiLCJzY29yZSIsImQiLCJiZWciLCJtaW4iLCJtYXgiLCJiYSIsIm92ZXJsYXBwaW5nQmlucyIsInJlZzJiaW5zIiwiYmluQ2h1bmtzIiwiYyIsInB1c2giLCJtaW52IiwibWF4diIsIm5pbnR2IiwibG93ZXN0IiwibWluTGluIiwiTWF0aCIsIm1heExpbiIsInZwIiwiY29tcGFyZVRvIiwiSW5kZXhGaWxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTUEsU0FBUyxHQUFHLFFBQWxCLEMsQ0FBMkI7O0FBRTNCLFNBQVNDLFNBQVQsQ0FBbUJDLENBQW5CLEVBQThCQyxRQUE5QixFQUFnRDtBQUM5QyxTQUFPRCxDQUFDLEdBQUlBLENBQUMsR0FBR0MsUUFBaEI7QUFDRDs7QUFDRCxTQUFTQyxPQUFULENBQWlCRixDQUFqQixFQUE0QkMsUUFBNUIsRUFBOEM7QUFDNUMsU0FBT0QsQ0FBQyxHQUFJQSxDQUFDLEdBQUdDLFFBQVQsR0FBcUJBLFFBQTVCO0FBQ0Q7O0lBRW9CRSxHOzs7Ozs7Ozs7Ozs7bUNBQ0pDLEssRUFBZUMsTSxFQUFnQjtBQUM1QyxVQUFNQyxTQUFTLEdBQUcsd0JBQ2hCQyxjQUFLQyxXQUFMLENBQWlCLG9CQUFBQyxLQUFLLENBQUNDLFNBQU4sRUFBc0JDLElBQXRCLENBQTJCUCxLQUEzQixFQUFrQ0MsTUFBTSxHQUFHLEVBQTNDLEVBQStDQSxNQUFNLEdBQUcsRUFBeEQsQ0FBakIsRUFBOEUsSUFBOUUsQ0FEZ0IsQ0FBbEI7QUFHQSxhQUFPO0FBQUVDLFFBQUFBLFNBQVMsRUFBVEE7QUFBRixPQUFQO0FBQ0Q7Ozs7Z0hBRWVNLEs7Ozs7Ozs7Ozs7QUFBZUMsZ0JBQUFBLEksMkRBQWlCLEU7O3VCQUMzQixLQUFLQyxLQUFMLENBQVdELElBQVgsQzs7O0FBQWJFLGdCQUFBQSxJO0FBQ0FDLGdCQUFBQSxLLEdBQVFELElBQUksQ0FBQ0UsT0FBTCxDQUFhTCxLQUFiLEM7O29CQUNUSSxLOzs7OztpREFDSSxDQUFDLEM7OztBQUVKRSxnQkFBQUEsRyxHQUFNRixLQUFLLENBQUNHLEtBQU4sSUFBZSxFO2lEQUNwQkQsR0FBRyxDQUFDWixTQUFKLEtBQWtCYyxTQUFsQixHQUE4QixDQUFDLENBQS9CLEdBQW1DRixHQUFHLENBQUNaLFM7Ozs7Ozs7Ozs7Ozs7OztRQUdoRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDYU8sZ0JBQUFBLEksOERBQWlCLEU7QUFDdEJRLGdCQUFBQSxJLEdBQStCO0FBQUVDLGtCQUFBQSxHQUFHLEVBQUUsSUFBUDtBQUFhQyxrQkFBQUEsWUFBWSxFQUFFLEtBQUs7QUFBaEMsaUI7O3VCQUNoQixLQUFLQyxVQUFMLENBQWdCQyxRQUFoQixDQUF5QlosSUFBekIsQzs7O0FBQWZULGdCQUFBQSxLOztzQkFHRkEsS0FBSyxDQUFDc0IsWUFBTixDQUFtQixDQUFuQixNQUEwQjVCLFM7Ozs7O3NCQUN0QixJQUFJNkIsS0FBSixDQUFVLGdCQUFWLEM7OztBQUdSTixnQkFBQUEsSUFBSSxDQUFDTyxRQUFMLEdBQWdCeEIsS0FBSyxDQUFDeUIsV0FBTixDQUFrQixDQUFsQixDQUFoQjtBQUNNQyxnQkFBQUEsSyxHQUFRLEM7QUFDUkMsZ0JBQUFBLFEsR0FBVyxDQUFDLENBQUMsS0FBTSxDQUFDRCxLQUFLLEdBQUcsQ0FBVCxJQUFjLENBQXJCLElBQTJCLENBQTVCLElBQWlDLEMsRUFFbEQ7O0FBQ0FULGdCQUFBQSxJQUFJLENBQUNKLE9BQUwsR0FBZSxJQUFJUixLQUFKLENBQVVZLElBQUksQ0FBQ08sUUFBZixDQUFmO0FBQ0lJLGdCQUFBQSxVLEdBQWEsQztBQUNSQyxnQkFBQUEsQyxHQUFJLEM7OztzQkFBR0EsQ0FBQyxHQUFHWixJQUFJLENBQUNPLFE7Ozs7Ozt1QkFDakIsMkJBQWdCZixJQUFJLENBQUNxQixNQUFyQixDOzs7QUFFTjtBQUNNQyxnQkFBQUEsUSxHQUFXL0IsS0FBSyxDQUFDeUIsV0FBTixDQUFrQkcsVUFBbEIsQztBQUNiYixnQkFBQUEsSztBQUVKYSxnQkFBQUEsVUFBVSxJQUFJLENBQWQ7QUFDTUksZ0JBQUFBLFEsR0FBdUMsRTtBQUNwQ0MsZ0JBQUFBLEMsR0FBSSxDOzs7c0JBQUdBLENBQUMsR0FBR0YsUTs7Ozs7QUFDWkcsZ0JBQUFBLEcsR0FBTWxDLEtBQUssQ0FBQ3NCLFlBQU4sQ0FBbUJNLFVBQW5CLEM7QUFDWkEsZ0JBQUFBLFVBQVUsSUFBSSxDQUFkOztzQkFDSU0sR0FBRyxLQUFLUCxRQUFRLEdBQUcsQzs7Ozs7QUFDckJDLGdCQUFBQSxVQUFVLElBQUksQ0FBZDtBQUNBYixnQkFBQUEsS0FBSyxHQUFHLEtBQUtvQixjQUFMLENBQW9CbkMsS0FBcEIsRUFBMkI0QixVQUEzQixDQUFSO0FBQ0FBLGdCQUFBQSxVQUFVLElBQUksRUFBZDs7Ozs7c0JBQ1NNLEdBQUcsR0FBR1AsUUFBUSxHQUFHLEM7Ozs7O3NCQUNwQixJQUFJSixLQUFKLENBQVUsa0RBQVYsQzs7O0FBRUFhLGdCQUFBQSxVLEdBQWFwQyxLQUFLLENBQUN5QixXQUFOLENBQWtCRyxVQUFsQixDO0FBQ25CQSxnQkFBQUEsVUFBVSxJQUFJLENBQWQ7QUFDTVMsZ0JBQUFBLE0sR0FBUyxJQUFJaEMsS0FBSixDQUFVK0IsVUFBVixDOztBQUNmLHFCQUFTRSxDQUFULEdBQWEsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHRixVQUFwQixFQUFnQ0UsQ0FBQyxJQUFJLENBQXJDLEVBQXdDO0FBQ2hDQyxrQkFBQUEsQ0FEZ0MsR0FDNUIsOEJBQVV2QyxLQUFWLEVBQWlCNEIsVUFBakIsQ0FENEI7QUFFaENZLGtCQUFBQSxDQUZnQyxHQUU1Qiw4QkFBVXhDLEtBQVYsRUFBaUI0QixVQUFVLEdBQUcsQ0FBOUIsQ0FGNEI7QUFHdENBLGtCQUFBQSxVQUFVLElBQUksRUFBZDs7QUFDQSx1QkFBS2EsY0FBTCxDQUFvQnhCLElBQXBCLEVBQTBCc0IsQ0FBMUI7O0FBQ0FGLGtCQUFBQSxNQUFNLENBQUNDLENBQUQsQ0FBTixHQUFZLElBQUlJLGNBQUosQ0FBVUgsQ0FBVixFQUFhQyxDQUFiLEVBQWdCTixHQUFoQixDQUFaO0FBQ0Q7O0FBQ0RGLGdCQUFBQSxRQUFRLENBQUNFLEdBQUQsQ0FBUixHQUFnQkcsTUFBaEI7OztBQXBCMEJKLGdCQUFBQSxDQUFDLElBQUksQzs7Ozs7QUF3QjdCVSxnQkFBQUEsVyxHQUFjM0MsS0FBSyxDQUFDeUIsV0FBTixDQUFrQkcsVUFBbEIsQztBQUNwQkEsZ0JBQUFBLFVBQVUsSUFBSSxDQUFkLEMsQ0FDQTtBQUNBO0FBQ0E7O0FBQ01nQixnQkFBQUEsVyxHQUFjLElBQUl2QyxLQUFKLENBQVVzQyxXQUFWLEM7O0FBQ3BCLHFCQUFTTCxFQUFULEdBQWEsQ0FBYixFQUFnQkEsRUFBQyxHQUFHSyxXQUFwQixFQUFpQ0wsRUFBQyxJQUFJLENBQXRDLEVBQXlDO0FBQ3ZDTSxrQkFBQUEsV0FBVyxDQUFDTixFQUFELENBQVgsR0FBaUIsOEJBQVV0QyxLQUFWLEVBQWlCNEIsVUFBakIsQ0FBakI7QUFDQUEsa0JBQUFBLFVBQVUsSUFBSSxDQUFkOztBQUNBLHVCQUFLYSxjQUFMLENBQW9CeEIsSUFBcEIsRUFBMEIyQixXQUFXLENBQUNOLEVBQUQsQ0FBckM7QUFDRDs7QUFFRHJCLGdCQUFBQSxJQUFJLENBQUNKLE9BQUwsQ0FBYWdCLENBQWIsSUFBa0I7QUFBRUcsa0JBQUFBLFFBQVEsRUFBUkEsUUFBRjtBQUFZWSxrQkFBQUEsV0FBVyxFQUFYQSxXQUFaO0FBQXlCN0Isa0JBQUFBLEtBQUssRUFBTEE7QUFBekIsaUJBQWxCOzs7QUE3Q2lDYyxnQkFBQUEsQ0FBQyxJQUFJLEM7Ozs7O2tEQWdEakNaLEk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Z0hBSVA0QixLLEVBQ0FDLEssRUFDQUMsRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBdEMsZ0JBQUFBLEksOERBQWlCLEU7QUFFWCtCLGdCQUFBQSxDLEdBQUksSztBQUNKUSxnQkFBQUEsSyxHQUFRRixLQUFLLEtBQUs5QixTOzt1QkFDQSxLQUFLTixLQUFMLENBQVdELElBQVgsQzs7O0FBQWxCd0MsZ0JBQUFBLFM7QUFDQUMsZ0JBQUFBLE0sR0FBU0QsU0FBUyxDQUFDcEMsT0FBVixDQUFrQmdDLEtBQWxCLEM7O29CQUNWSyxNOzs7OztrREFDSSxFOzs7c0NBRTJCQSxNLENBQTVCTixXLEVBQUFBLFcsb0NBQWMsRSx3QkFBSTdCLEssR0FBVW1DLE0sQ0FBVm5DLEs7O29CQUNyQjZCLFdBQVcsQ0FBQ08sTTs7Ozs7a0RBQ1IsRTs7O0FBRUhDLGdCQUFBQSxDLEdBQUlMLEdBQUcsS0FBSy9CLFNBQVIsR0FBb0JsQixPQUFPLENBQUNpRCxHQUFELEVBQU1QLENBQU4sQ0FBM0IsR0FBc0MsQ0FBQ0ksV0FBVyxDQUFDTyxNQUFaLEdBQXFCLENBQXRCLElBQTJCWCxDO0FBQ3JFYSxnQkFBQUEsQyxHQUFJUCxLQUFLLEtBQUs5QixTQUFWLEdBQXNCckIsU0FBUyxDQUFDbUQsS0FBRCxFQUFRTixDQUFSLENBQS9CLEdBQTRDLEM7O0FBRXRELG9CQUFJUSxLQUFKLEVBQVc7QUFDVE0sa0JBQUFBLE1BQU0sR0FBRyxJQUFJakQsS0FBSixDQUFVLENBQUMrQyxDQUFDLEdBQUdDLENBQUwsSUFBVWIsQ0FBcEIsQ0FBVDtBQUNELGlCQUZELE1BRU87QUFDTGMsa0JBQUFBLE1BQU0sR0FBRyxJQUFJakQsS0FBSixDQUFVdUMsV0FBVyxDQUFDTyxNQUFaLEdBQXFCLENBQS9CLENBQVQ7QUFDRDs7QUFDS0ksZ0JBQUFBLFMsR0FBWVgsV0FBVyxDQUFDQSxXQUFXLENBQUNPLE1BQVosR0FBcUIsQ0FBdEIsQ0FBWCxDQUFvQ0ssYTs7c0JBQ2xESixDQUFDLEdBQUcsQ0FBQ1IsV0FBVyxDQUFDTyxNQUFaLEdBQXFCLENBQXRCLElBQTJCWCxDOzs7OztzQkFDM0IsSUFBSWpCLEtBQUosQ0FBVSx3Q0FBVixDOzs7QUFFSmtDLGdCQUFBQSxVLEdBQWFiLFdBQVcsQ0FBQ1MsQ0FBQyxHQUFHYixDQUFMLENBQVgsQ0FBbUJnQixhOztBQUNwQyxxQkFBUzNCLENBQVQsR0FBYXdCLENBQUMsR0FBR2IsQ0FBakIsRUFBb0JQLENBQXBCLEdBQXdCLENBQXhCLEVBQTJCSixDQUFDLEdBQUd1QixDQUFDLEdBQUdaLENBQW5DLEVBQXNDWCxDQUFDLElBQUlJLENBQUMsRUFBNUMsRUFBZ0Q7QUFDOUNxQixrQkFBQUEsTUFBTSxDQUFDckIsQ0FBRCxDQUFOLEdBQVk7QUFDVnlCLG9CQUFBQSxLQUFLLEVBQUVkLFdBQVcsQ0FBQ2YsQ0FBQyxHQUFHLENBQUwsQ0FBWCxDQUFtQjJCLGFBQW5CLEdBQW1DQyxVQURoQztBQUVWWCxvQkFBQUEsS0FBSyxFQUFFakIsQ0FBQyxHQUFHVyxDQUZEO0FBR1ZPLG9CQUFBQSxHQUFHLEVBQUVsQixDQUFDLEdBQUdXLENBQUosR0FBUUE7QUFISCxtQkFBWjtBQUtBaUIsa0JBQUFBLFVBQVUsR0FBR2IsV0FBVyxDQUFDZixDQUFDLEdBQUcsQ0FBTCxDQUFYLENBQW1CMkIsYUFBaEM7QUFDRDs7a0RBQ00sa0JBQUFGLE1BQU0sTUFBTixDQUFBQSxNQUFNLEVBQUssVUFBQUssQ0FBQyxFQUFJO0FBQ3JCLHlEQUFZQSxDQUFaO0FBQWVELG9CQUFBQSxLQUFLLEVBQUdDLENBQUMsQ0FBQ0QsS0FBRixHQUFVM0MsS0FBSyxDQUFDYixTQUFqQixHQUE4QnFEO0FBQXBEO0FBQ0QsaUJBRlksQzs7Ozs7Ozs7Ozs7Ozs7OztBQUtmOzs7Ozs7OzZCQUlTSyxHLEVBQWFiLEcsRUFBYTtBQUNqQ0EsTUFBQUEsR0FBRyxJQUFJLENBQVA7QUFDQSxhQUFPLENBQ0wsQ0FBQyxDQUFELEVBQUksQ0FBSixDQURLLEVBRUwsQ0FBQyxLQUFLYSxHQUFHLElBQUksRUFBWixDQUFELEVBQWtCLEtBQUtiLEdBQUcsSUFBSSxFQUFaLENBQWxCLENBRkssRUFHTCxDQUFDLEtBQUthLEdBQUcsSUFBSSxFQUFaLENBQUQsRUFBa0IsS0FBS2IsR0FBRyxJQUFJLEVBQVosQ0FBbEIsQ0FISyxFQUlMLENBQUMsTUFBTWEsR0FBRyxJQUFJLEVBQWIsQ0FBRCxFQUFtQixNQUFNYixHQUFHLElBQUksRUFBYixDQUFuQixDQUpLLEVBS0wsQ0FBQyxPQUFPYSxHQUFHLElBQUksRUFBZCxDQUFELEVBQW9CLE9BQU9iLEdBQUcsSUFBSSxFQUFkLENBQXBCLENBTEssRUFNTCxDQUFDLFFBQVFhLEdBQUcsSUFBSSxFQUFmLENBQUQsRUFBcUIsUUFBUWIsR0FBRyxJQUFJLEVBQWYsQ0FBckIsQ0FOSyxDQUFQO0FBUUQ7Ozs7c0hBRW9CdkMsSyxFQUFlcUQsRyxFQUFhQyxHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFhckQsZ0JBQUFBLEksOERBQWlCLEU7O0FBQzdFLG9CQUFJb0QsR0FBRyxHQUFHLENBQVYsRUFBYTtBQUNYQSxrQkFBQUEsR0FBRyxHQUFHLENBQU47QUFDRDs7O3VCQUV1QixLQUFLbkQsS0FBTCxDQUFXRCxJQUFYLEM7OztBQUFsQndDLGdCQUFBQSxTOztvQkFDREEsUzs7Ozs7a0RBQ0ksRTs7O0FBRUhjLGdCQUFBQSxFLEdBQUtkLFNBQVMsQ0FBQ3BDLE9BQVYsQ0FBa0JMLEtBQWxCLEM7O29CQUNOdUQsRTs7Ozs7a0RBQ0ksRTs7O0FBR0hDLGdCQUFBQSxlLEdBQWtCLEtBQUtDLFFBQUwsQ0FBY0osR0FBZCxFQUFtQkMsR0FBbkIsQyxFQUF3Qjs7QUFDMUN6QixnQkFBQUEsTSxHQUFrQixFLEVBRXhCOzt1REFDMkIyQixlOzs7QUFBM0Isc0VBQTRDO0FBQUEsZ0ZBQWhDbEIsS0FBZ0MsbUJBQXpCQyxHQUF5Qjs7QUFDMUMseUJBQVNiLEdBQVQsR0FBZVksS0FBZixFQUFzQlosR0FBRyxJQUFJYSxHQUE3QixFQUFrQ2IsR0FBRyxFQUFyQyxFQUF5QztBQUN2QywwQkFBSTZCLEVBQUUsQ0FBQy9CLFFBQUgsQ0FBWUUsR0FBWixDQUFKLEVBQXNCO0FBQ2RnQyx3QkFBQUEsU0FEYyxHQUNGSCxFQUFFLENBQUMvQixRQUFILENBQVlFLEdBQVosQ0FERTs7QUFFcEIsNkJBQVNpQyxDQUFULEdBQWEsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHRCxTQUFTLENBQUNmLE1BQTlCLEVBQXNDLEVBQUVnQixDQUF4QyxFQUEyQztBQUN6QzlCLDBCQUFBQSxNQUFNLENBQUMrQixJQUFQLENBQVksSUFBSTFCLGNBQUosQ0FBVXdCLFNBQVMsQ0FBQ0MsQ0FBRCxDQUFULENBQWFFLElBQXZCLEVBQTZCSCxTQUFTLENBQUNDLENBQUQsQ0FBVCxDQUFhRyxJQUExQyxFQUFnRHBDLEdBQWhELENBQVo7QUFDRDtBQUNGO0FBQ0Y7QUFDRixtQixDQUVEOzs7Ozs7OztBQUNNcUMsZ0JBQUFBLEssR0FBUVIsRUFBRSxDQUFDbkIsV0FBSCxDQUFlTyxNO0FBQ3pCcUIsZ0JBQUFBLE0sR0FBUyxJO0FBQ1BDLGdCQUFBQSxNLEdBQVNDLElBQUksQ0FBQ2IsR0FBTCxDQUFTQSxHQUFHLElBQUksRUFBaEIsRUFBb0JVLEtBQUssR0FBRyxDQUE1QixDO0FBQ1RJLGdCQUFBQSxNLEdBQVNELElBQUksQ0FBQ2IsR0FBTCxDQUFTQyxHQUFHLElBQUksRUFBaEIsRUFBb0JTLEtBQUssR0FBRyxDQUE1QixDOztBQUNmLHFCQUFTMUMsQ0FBVCxHQUFhNEMsTUFBYixFQUFxQjVDLENBQUMsSUFBSThDLE1BQTFCLEVBQWtDLEVBQUU5QyxDQUFwQyxFQUF1QztBQUMvQitDLGtCQUFBQSxFQUQrQixHQUMxQmIsRUFBRSxDQUFDbkIsV0FBSCxDQUFlZixDQUFmLENBRDBCOztBQUVyQyxzQkFBSStDLEVBQUosRUFBUTtBQUNOLHdCQUFJLENBQUNKLE1BQUQsSUFBV0ksRUFBRSxDQUFDQyxTQUFILENBQWFMLE1BQWIsSUFBdUIsQ0FBdEMsRUFBeUM7QUFDdkNBLHNCQUFBQSxNQUFNLEdBQUdJLEVBQVQ7QUFDRDtBQUNGO0FBQ0Y7O2tEQUVNLDBCQUFldkMsTUFBZixFQUF1Qm1DLE1BQXZCLEM7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTVMc0JNLGtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvbmcgZnJvbSAnbG9uZydcbmltcG9ydCB7IGZyb21CeXRlcyB9IGZyb20gJy4vdmlydHVhbE9mZnNldCdcbmltcG9ydCBDaHVuayBmcm9tICcuL2NodW5rJ1xuXG5pbXBvcnQgSW5kZXhGaWxlIGZyb20gJy4vaW5kZXhGaWxlJ1xuaW1wb3J0IHsgbG9uZ1RvTnVtYmVyLCBhYm9ydEJyZWFrUG9pbnQsIG9wdGltaXplQ2h1bmtzLCBCYXNlT3B0cyB9IGZyb20gJy4vdXRpbCdcblxuY29uc3QgQkFJX01BR0lDID0gMjE1NzgwNTAgLy8gQkFJXFwxXG5cbmZ1bmN0aW9uIHJvdW5kRG93bihuOiBudW1iZXIsIG11bHRpcGxlOiBudW1iZXIpIHtcbiAgcmV0dXJuIG4gLSAobiAlIG11bHRpcGxlKVxufVxuZnVuY3Rpb24gcm91bmRVcChuOiBudW1iZXIsIG11bHRpcGxlOiBudW1iZXIpIHtcbiAgcmV0dXJuIG4gLSAobiAlIG11bHRpcGxlKSArIG11bHRpcGxlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJBSSBleHRlbmRzIEluZGV4RmlsZSB7XG4gIHBhcnNlUHNldWRvQmluKGJ5dGVzOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKSB7XG4gICAgY29uc3QgbGluZUNvdW50ID0gbG9uZ1RvTnVtYmVyKFxuICAgICAgTG9uZy5mcm9tQnl0ZXNMRShBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChieXRlcywgb2Zmc2V0ICsgMTYsIG9mZnNldCArIDI0KSwgdHJ1ZSksXG4gICAgKVxuICAgIHJldHVybiB7IGxpbmVDb3VudCB9XG4gIH1cblxuICBhc3luYyBsaW5lQ291bnQocmVmSWQ6IG51bWJlciwgb3B0czogQmFzZU9wdHMgPSB7fSkge1xuICAgIGNvbnN0IHByb20gPSBhd2FpdCB0aGlzLnBhcnNlKG9wdHMpXG4gICAgY29uc3QgaW5kZXggPSBwcm9tLmluZGljZXNbcmVmSWRdXG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIGNvbnN0IHJldCA9IGluZGV4LnN0YXRzIHx8IHt9XG4gICAgcmV0dXJuIHJldC5saW5lQ291bnQgPT09IHVuZGVmaW5lZCA/IC0xIDogcmV0LmxpbmVDb3VudFxuICB9XG5cbiAgLy8gZmV0Y2ggYW5kIHBhcnNlIHRoZSBpbmRleFxuICBhc3luYyBfcGFyc2Uob3B0czogQmFzZU9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7IGJhaTogdHJ1ZSwgbWF4QmxvY2tTaXplOiAxIDw8IDE2IH1cbiAgICBjb25zdCBieXRlcyA9IChhd2FpdCB0aGlzLmZpbGVoYW5kbGUucmVhZEZpbGUob3B0cykpIGFzIEJ1ZmZlclxuXG4gICAgLy8gY2hlY2sgQkFJIG1hZ2ljIG51bWJlcnNcbiAgICBpZiAoYnl0ZXMucmVhZFVJbnQzMkxFKDApICE9PSBCQUlfTUFHSUMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGEgQkFJIGZpbGUnKVxuICAgIH1cblxuICAgIGRhdGEucmVmQ291bnQgPSBieXRlcy5yZWFkSW50MzJMRSg0KVxuICAgIGNvbnN0IGRlcHRoID0gNVxuICAgIGNvbnN0IGJpbkxpbWl0ID0gKCgxIDw8ICgoZGVwdGggKyAxKSAqIDMpKSAtIDEpIC8gN1xuXG4gICAgLy8gcmVhZCB0aGUgaW5kZXhlcyBmb3IgZWFjaCByZWZlcmVuY2Ugc2VxdWVuY2VcbiAgICBkYXRhLmluZGljZXMgPSBuZXcgQXJyYXkoZGF0YS5yZWZDb3VudClcbiAgICBsZXQgY3Vyck9mZnNldCA9IDhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEucmVmQ291bnQ7IGkgKz0gMSkge1xuICAgICAgYXdhaXQgYWJvcnRCcmVha1BvaW50KG9wdHMuc2lnbmFsKVxuXG4gICAgICAvLyB0aGUgYmlubmluZyBpbmRleFxuICAgICAgY29uc3QgYmluQ291bnQgPSBieXRlcy5yZWFkSW50MzJMRShjdXJyT2Zmc2V0KVxuICAgICAgbGV0IHN0YXRzXG5cbiAgICAgIGN1cnJPZmZzZXQgKz0gNFxuICAgICAgY29uc3QgYmluSW5kZXg6IHsgW2tleTogbnVtYmVyXTogQ2h1bmtbXSB9ID0ge31cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYmluQ291bnQ7IGogKz0gMSkge1xuICAgICAgICBjb25zdCBiaW4gPSBieXRlcy5yZWFkVUludDMyTEUoY3Vyck9mZnNldClcbiAgICAgICAgY3Vyck9mZnNldCArPSA0XG4gICAgICAgIGlmIChiaW4gPT09IGJpbkxpbWl0ICsgMSkge1xuICAgICAgICAgIGN1cnJPZmZzZXQgKz0gNFxuICAgICAgICAgIHN0YXRzID0gdGhpcy5wYXJzZVBzZXVkb0JpbihieXRlcywgY3Vyck9mZnNldClcbiAgICAgICAgICBjdXJyT2Zmc2V0ICs9IDMyXG4gICAgICAgIH0gZWxzZSBpZiAoYmluID4gYmluTGltaXQgKyAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWkgaW5kZXggY29udGFpbnMgdG9vIG1hbnkgYmlucywgcGxlYXNlIHVzZSBDU0knKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGNodW5rQ291bnQgPSBieXRlcy5yZWFkSW50MzJMRShjdXJyT2Zmc2V0KVxuICAgICAgICAgIGN1cnJPZmZzZXQgKz0gNFxuICAgICAgICAgIGNvbnN0IGNodW5rcyA9IG5ldyBBcnJheShjaHVua0NvdW50KVxuICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY2h1bmtDb3VudDsgayArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCB1ID0gZnJvbUJ5dGVzKGJ5dGVzLCBjdXJyT2Zmc2V0KVxuICAgICAgICAgICAgY29uc3QgdiA9IGZyb21CeXRlcyhieXRlcywgY3Vyck9mZnNldCArIDgpXG4gICAgICAgICAgICBjdXJyT2Zmc2V0ICs9IDE2XG4gICAgICAgICAgICB0aGlzLl9maW5kRmlyc3REYXRhKGRhdGEsIHUpXG4gICAgICAgICAgICBjaHVua3Nba10gPSBuZXcgQ2h1bmsodSwgdiwgYmluKVxuICAgICAgICAgIH1cbiAgICAgICAgICBiaW5JbmRleFtiaW5dID0gY2h1bmtzXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbGluZWFyQ291bnQgPSBieXRlcy5yZWFkSW50MzJMRShjdXJyT2Zmc2V0KVxuICAgICAgY3Vyck9mZnNldCArPSA0XG4gICAgICAvLyBhcyB3ZSdyZSBnb2luZyB0aHJvdWdoIHRoZSBsaW5lYXIgaW5kZXgsIGZpZ3VyZSBvdXRcbiAgICAgIC8vIHRoZSBzbWFsbGVzdCB2aXJ0dWFsIG9mZnNldCBpbiB0aGUgaW5kZXhlcywgd2hpY2hcbiAgICAgIC8vIHRlbGxzIHVzIHdoZXJlIHRoZSBCQU0gaGVhZGVyIGVuZHNcbiAgICAgIGNvbnN0IGxpbmVhckluZGV4ID0gbmV3IEFycmF5KGxpbmVhckNvdW50KVxuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBsaW5lYXJDb3VudDsgayArPSAxKSB7XG4gICAgICAgIGxpbmVhckluZGV4W2tdID0gZnJvbUJ5dGVzKGJ5dGVzLCBjdXJyT2Zmc2V0KVxuICAgICAgICBjdXJyT2Zmc2V0ICs9IDhcbiAgICAgICAgdGhpcy5fZmluZEZpcnN0RGF0YShkYXRhLCBsaW5lYXJJbmRleFtrXSlcbiAgICAgIH1cblxuICAgICAgZGF0YS5pbmRpY2VzW2ldID0geyBiaW5JbmRleCwgbGluZWFySW5kZXgsIHN0YXRzIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgYXN5bmMgaW5kZXhDb3YoXG4gICAgc2VxSWQ6IG51bWJlcixcbiAgICBzdGFydD86IG51bWJlcixcbiAgICBlbmQ/OiBudW1iZXIsXG4gICAgb3B0czogQmFzZU9wdHMgPSB7fSxcbiAgKTogUHJvbWlzZTx7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyOyBzY29yZTogbnVtYmVyIH1bXT4ge1xuICAgIGNvbnN0IHYgPSAxNjM4NFxuICAgIGNvbnN0IHJhbmdlID0gc3RhcnQgIT09IHVuZGVmaW5lZFxuICAgIGNvbnN0IGluZGV4RGF0YSA9IGF3YWl0IHRoaXMucGFyc2Uob3B0cylcbiAgICBjb25zdCBzZXFJZHggPSBpbmRleERhdGEuaW5kaWNlc1tzZXFJZF1cbiAgICBpZiAoIXNlcUlkeCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICAgIGNvbnN0IHsgbGluZWFySW5kZXggPSBbXSwgc3RhdHMgfSA9IHNlcUlkeFxuICAgIGlmICghbGluZWFySW5kZXgubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgY29uc3QgZSA9IGVuZCAhPT0gdW5kZWZpbmVkID8gcm91bmRVcChlbmQsIHYpIDogKGxpbmVhckluZGV4Lmxlbmd0aCAtIDEpICogdlxuICAgIGNvbnN0IHMgPSBzdGFydCAhPT0gdW5kZWZpbmVkID8gcm91bmREb3duKHN0YXJ0LCB2KSA6IDBcbiAgICBsZXQgZGVwdGhzXG4gICAgaWYgKHJhbmdlKSB7XG4gICAgICBkZXB0aHMgPSBuZXcgQXJyYXkoKGUgLSBzKSAvIHYpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRlcHRocyA9IG5ldyBBcnJheShsaW5lYXJJbmRleC5sZW5ndGggLSAxKVxuICAgIH1cbiAgICBjb25zdCB0b3RhbFNpemUgPSBsaW5lYXJJbmRleFtsaW5lYXJJbmRleC5sZW5ndGggLSAxXS5ibG9ja1Bvc2l0aW9uXG4gICAgaWYgKGUgPiAobGluZWFySW5kZXgubGVuZ3RoIC0gMSkgKiB2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5IG91dHNpZGUgb2YgcmFuZ2Ugb2YgbGluZWFyIGluZGV4JylcbiAgICB9XG4gICAgbGV0IGN1cnJlbnRQb3MgPSBsaW5lYXJJbmRleFtzIC8gdl0uYmxvY2tQb3NpdGlvblxuICAgIGZvciAobGV0IGkgPSBzIC8gdiwgaiA9IDA7IGkgPCBlIC8gdjsgaSsrLCBqKyspIHtcbiAgICAgIGRlcHRoc1tqXSA9IHtcbiAgICAgICAgc2NvcmU6IGxpbmVhckluZGV4W2kgKyAxXS5ibG9ja1Bvc2l0aW9uIC0gY3VycmVudFBvcyxcbiAgICAgICAgc3RhcnQ6IGkgKiB2LFxuICAgICAgICBlbmQ6IGkgKiB2ICsgdixcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRQb3MgPSBsaW5lYXJJbmRleFtpICsgMV0uYmxvY2tQb3NpdGlvblxuICAgIH1cbiAgICByZXR1cm4gZGVwdGhzLm1hcChkID0+IHtcbiAgICAgIHJldHVybiB7IC4uLmQsIHNjb3JlOiAoZC5zY29yZSAqIHN0YXRzLmxpbmVDb3VudCkgLyB0b3RhbFNpemUgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSBsaXN0IG9mIGJpbnMgdGhhdCBtYXkgb3ZlcmxhcCB3aXRoIHJlZ2lvbiBbYmVnLGVuZCkgKHplcm8tYmFzZWQgaGFsZi1vcGVuKVxuICAgKiBAcmV0dXJucyB7QXJyYXlbbnVtYmVyXX1cbiAgICovXG4gIHJlZzJiaW5zKGJlZzogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICAgIGVuZCAtPSAxXG4gICAgcmV0dXJuIFtcbiAgICAgIFswLCAwXSxcbiAgICAgIFsxICsgKGJlZyA+PiAyNiksIDEgKyAoZW5kID4+IDI2KV0sXG4gICAgICBbOSArIChiZWcgPj4gMjMpLCA5ICsgKGVuZCA+PiAyMyldLFxuICAgICAgWzczICsgKGJlZyA+PiAyMCksIDczICsgKGVuZCA+PiAyMCldLFxuICAgICAgWzU4NSArIChiZWcgPj4gMTcpLCA1ODUgKyAoZW5kID4+IDE3KV0sXG4gICAgICBbNDY4MSArIChiZWcgPj4gMTQpLCA0NjgxICsgKGVuZCA+PiAxNCldLFxuICAgIF1cbiAgfVxuXG4gIGFzeW5jIGJsb2Nrc0ZvclJhbmdlKHJlZklkOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgb3B0czogQmFzZU9wdHMgPSB7fSkge1xuICAgIGlmIChtaW4gPCAwKSB7XG4gICAgICBtaW4gPSAwXG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXhEYXRhID0gYXdhaXQgdGhpcy5wYXJzZShvcHRzKVxuICAgIGlmICghaW5kZXhEYXRhKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgY29uc3QgYmEgPSBpbmRleERhdGEuaW5kaWNlc1tyZWZJZF1cbiAgICBpZiAoIWJhKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICBjb25zdCBvdmVybGFwcGluZ0JpbnMgPSB0aGlzLnJlZzJiaW5zKG1pbiwgbWF4KSAvLyBMaXN0IG9mIGJpbiAjcyB0aGF0IG92ZXJsYXAgbWluLCBtYXhcbiAgICBjb25zdCBjaHVua3M6IENodW5rW10gPSBbXVxuXG4gICAgLy8gRmluZCBjaHVua3MgaW4gb3ZlcmxhcHBpbmcgYmlucy4gIExlYWYgYmlucyAoPCA0NjgxKSBhcmUgbm90IHBydW5lZFxuICAgIGZvciAoY29uc3QgW3N0YXJ0LCBlbmRdIG9mIG92ZXJsYXBwaW5nQmlucykge1xuICAgICAgZm9yIChsZXQgYmluID0gc3RhcnQ7IGJpbiA8PSBlbmQ7IGJpbisrKSB7XG4gICAgICAgIGlmIChiYS5iaW5JbmRleFtiaW5dKSB7XG4gICAgICAgICAgY29uc3QgYmluQ2h1bmtzID0gYmEuYmluSW5kZXhbYmluXVxuICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgYmluQ2h1bmtzLmxlbmd0aDsgKytjKSB7XG4gICAgICAgICAgICBjaHVua3MucHVzaChuZXcgQ2h1bmsoYmluQ2h1bmtzW2NdLm1pbnYsIGJpbkNodW5rc1tjXS5tYXh2LCBiaW4pKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVzZSB0aGUgbGluZWFyIGluZGV4IHRvIGZpbmQgbWluaW11bSBmaWxlIHBvc2l0aW9uIG9mIGNodW5rcyB0aGF0IGNvdWxkIGNvbnRhaW4gYWxpZ25tZW50cyBpbiB0aGUgcmVnaW9uXG4gICAgY29uc3QgbmludHYgPSBiYS5saW5lYXJJbmRleC5sZW5ndGhcbiAgICBsZXQgbG93ZXN0ID0gbnVsbFxuICAgIGNvbnN0IG1pbkxpbiA9IE1hdGgubWluKG1pbiA+PiAxNCwgbmludHYgLSAxKVxuICAgIGNvbnN0IG1heExpbiA9IE1hdGgubWluKG1heCA+PiAxNCwgbmludHYgLSAxKVxuICAgIGZvciAobGV0IGkgPSBtaW5MaW47IGkgPD0gbWF4TGluOyArK2kpIHtcbiAgICAgIGNvbnN0IHZwID0gYmEubGluZWFySW5kZXhbaV1cbiAgICAgIGlmICh2cCkge1xuICAgICAgICBpZiAoIWxvd2VzdCB8fCB2cC5jb21wYXJlVG8obG93ZXN0KSA8IDApIHtcbiAgICAgICAgICBsb3dlc3QgPSB2cFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGltaXplQ2h1bmtzKGNodW5rcywgbG93ZXN0KVxuICB9XG59XG4iXX0=
317
+ //# sourceMappingURL=bai.js.map