@datagrok-libraries/bio 5.2.1 → 5.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "friendlyName": "Datagrok bio library",
7
- "version": "5.2.1",
7
+ "version": "5.4.0",
8
8
  "description": "",
9
9
  "dependencies": {
10
10
  "@datagrok-libraries/utils": "^1.10.1",
@@ -2,6 +2,7 @@ interface NodeType {
2
2
  name: string;
3
3
  children: NodeType[];
4
4
  branch_length: number;
5
+ isLeaf: boolean;
5
6
  }
6
7
  export { NodeType as NodeType };
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAEA,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,OAAO,EAAC,QAAQ,IAAI,QAAQ,EAAC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAEA,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,OAAO,EAAC,QAAQ,IAAI,QAAQ,EAAC,CAAC"}
@@ -1,3 +1,3 @@
1
1
  // import {NodeType} from '@phylocanvas/phylocanvas.gl';
2
2
  export {};
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3REFBd0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQge05vZGVUeXBlfSBmcm9tICdAcGh5bG9jYW52YXMvcGh5bG9jYW52YXMuZ2wnO1xuXG5pbnRlcmZhY2UgTm9kZVR5cGUge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNoaWxkcmVuOiBOb2RlVHlwZVtdO1xuICBicmFuY2hfbGVuZ3RoOiBudW1iZXI7XG59XG5cbmV4cG9ydCB7Tm9kZVR5cGUgYXMgTm9kZVR5cGV9OyJdfQ==
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3REFBd0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQge05vZGVUeXBlfSBmcm9tICdAcGh5bG9jYW52YXMvcGh5bG9jYW52YXMuZ2wnO1xuXG5pbnRlcmZhY2UgTm9kZVR5cGUge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNoaWxkcmVuOiBOb2RlVHlwZVtdO1xuICBicmFuY2hfbGVuZ3RoOiBudW1iZXI7XG4gIGlzTGVhZjogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHtOb2RlVHlwZSBhcyBOb2RlVHlwZX07Il19
@@ -0,0 +1,2 @@
1
+ export declare function getMacroMol(monomers: any[][]): Promise<string[]>;
2
+ //# sourceMappingURL=atomic-works.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-works.d.ts","sourceRoot":"","sources":["atomic-works.ts"],"names":[],"mappings":"AAuYA,wBAAsB,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBtE"}
@@ -0,0 +1,354 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import * as grok from 'datagrok-api/grok';
11
+ function extractAtomDataV3K(v3KMolblock) {
12
+ const numbers = extractAtomAndBondCountsV3K(v3KMolblock);
13
+ let begin = v3KMolblock.indexOf('M V30 BEGIN ATOM'); // V3000 block for atom coordinates
14
+ begin = v3KMolblock.indexOf('\n', begin);
15
+ let end = begin;
16
+ const atomIndices = Array(numbers.atomCount);
17
+ const atomTypes = Array(numbers.atomCount);
18
+ const x = Array(numbers.atomCount);
19
+ const y = Array(numbers.atomCount);
20
+ for (let i = 0; i < numbers.atomCount; i++) {
21
+ begin = v3KMolblock.indexOf('V30', begin) + 4;
22
+ end = v3KMolblock.indexOf(' ', begin);
23
+ atomIndices[i] = parseInt(v3KMolblock.substring(begin, end));
24
+ begin = end + 1;
25
+ end = v3KMolblock.indexOf(' ', begin);
26
+ atomTypes[i] = v3KMolblock.substring(begin, end);
27
+ begin = end + 1;
28
+ end = v3KMolblock.indexOf(' ', begin);
29
+ x[i] = parseFloat(v3KMolblock.substring(begin, end));
30
+ begin = end + 1;
31
+ end = v3KMolblock.indexOf(' ', begin);
32
+ y[i] = parseFloat(v3KMolblock.substring(begin, end));
33
+ begin = v3KMolblock.indexOf('\n', begin) + 1;
34
+ }
35
+ return { atomIndices: atomIndices, atomTypes: atomTypes, x: x, y: y };
36
+ }
37
+ // todo: extractRgroupData
38
+ function extractAtomAndBondCountsV3K(v3KMolblock) {
39
+ v3KMolblock = v3KMolblock.replaceAll('\r', ''); // equalize old and new sdf standards
40
+ // parse atom count
41
+ let idxBegin = v3KMolblock.indexOf('COUNTS') + 7;
42
+ let idxEnd = v3KMolblock.indexOf(' ', idxBegin);
43
+ const numOfAtoms = parseInt(v3KMolblock.substring(idxBegin, idxEnd));
44
+ // parse bond count
45
+ idxBegin = idxEnd + 1;
46
+ idxEnd = v3KMolblock.indexOf(' ', idxBegin);
47
+ const numOfBonds = parseInt(v3KMolblock.substring(idxBegin, idxEnd));
48
+ return { atomCount: numOfAtoms, bondCount: numOfBonds };
49
+ }
50
+ function getIndices(v2KMolblock, v3KMolblock) {
51
+ // one should also take into account that there can be multiple M RGP lines
52
+ // with R-Groups specified
53
+ let begin = v2KMolblock.indexOf('M RGP', 0) + 8;
54
+ let end = v2KMolblock.indexOf('\n', begin);
55
+ // todo: maybe this part deserves a separate function
56
+ // there may be situation when the rgp information is distributed among
57
+ // multiple lines, this must be taken into account
58
+ const rgpStringParsed = v2KMolblock.substring(begin, end).replaceAll(' ', ' ').replaceAll(' ', ' ').split(' ');
59
+ const rgpData = rgpStringParsed.map((el) => parseInt(el));
60
+ // rgpData[0] is the number of R-groups
61
+ // the following code sets remFirst to node# to which RGP#1 is substituted
62
+ // todo: handle the exceptional case when there is not enough rgroups
63
+ // todo: handle the exceptional case when the order is different
64
+ const remFirst = rgpData[1]; // leftmost Rgroup node
65
+ const remLast = rgpData[rgpData.length - 2]; // rightmost Rgroup node
66
+ // if (remFirst === -1 || remLast === -1)
67
+ // throw new Error('RGP parsing: first and last groups have wrong format');
68
+ // const remFirst = rgpData[2] === '1' ? parseInt(rgpData[1]) : parseInt(rgpData[3]);
69
+ // const remLast = rgpData[2] === '2' ? parseInt(rgpData[1]) : parseInt(rgpData[3]);
70
+ // todo: rename 'numbers'
71
+ const numbers = extractAtomAndBondCountsV3K(v3KMolblock);
72
+ let indexBonds = v3KMolblock.indexOf('M V30 BEGIN BOND'); // V3000 bond block
73
+ indexBonds = v3KMolblock.indexOf('\n', indexBonds);
74
+ begin = indexBonds;
75
+ end = indexBonds;
76
+ let first = 0; // todo: improve notation
77
+ let last = 0;
78
+ let remBondFirst = 0;
79
+ let remBondLast = 0;
80
+ // iterate over edges of the graph and find those
81
+ for (let j = 0; j < numbers.bondCount; j++) {
82
+ if (first === 0 || last === 0) {
83
+ begin = v3KMolblock.indexOf('V30', begin) + 4;
84
+ end = v3KMolblock.indexOf('\n', begin);
85
+ const bondStringParsed = v3KMolblock.substring(begin, end).replaceAll(' ', ' ').replaceAll(' ', ' ').split(' ');
86
+ const bondData = bondStringParsed.map((el) => parseInt(el));
87
+ if (bondData[2] === remFirst) { // bondData[2] is the 1st node/atom of the bond
88
+ first = bondData[3]; // bondData[3] is the 2nd node/atom of the bond
89
+ remBondFirst = bondData[0]; // bondData[0] is the idx of the associated bond/edge
90
+ }
91
+ else if (bondData[3] === remFirst) {
92
+ first = bondData[2];
93
+ remBondFirst = bondData[0];
94
+ }
95
+ else if (bondData[2] === remLast) {
96
+ last = bondData[3];
97
+ remBondLast = bondData[0];
98
+ }
99
+ else if (bondData[3] === remLast) {
100
+ last = bondData[2];
101
+ remBondLast = bondData[0];
102
+ }
103
+ }
104
+ }
105
+ return { first, last, remFirst, remLast, remBondFirst, remBondLast };
106
+ }
107
+ /* provide description */
108
+ function rotateBackboneV3K(v3KMolblock, indices) {
109
+ return __awaiter(this, void 0, void 0, function* () {
110
+ const coordinates = extractAtomDataV3K(v3KMolblock); // naming?
111
+ const atomCount = coordinates.atomIndices.length;
112
+ const first = indices['first'];
113
+ const last = indices['last'];
114
+ const xCenter = (coordinates.x[last] + coordinates.x[first]) / 2;
115
+ const yCenter = (coordinates.y[last] + coordinates.y[first]) / 2;
116
+ //place to center
117
+ for (let i = 0; i < atomCount; i++) {
118
+ coordinates.x[i] -= xCenter;
119
+ coordinates.y[i] -= yCenter;
120
+ }
121
+ let angle = 0;
122
+ if (coordinates.x[first] === 0) { // both vertices are on OY
123
+ angle = coordinates.y[first] > coordinates.y[last] ? Math.PI / 2 : -Math.PI / 2;
124
+ }
125
+ else if (coordinates.y[first] === 0) { // both vertices are on OX
126
+ angle = coordinates.x[first] > coordinates.x[last] ? Math.PI : 0; // v
127
+ }
128
+ else {
129
+ const tangent = coordinates.y[first] / coordinates.x[first];
130
+ if (coordinates.x[first] < coordinates.x[last])
131
+ angle = tangent > 0 ? -Math.atan(tangent) : Math.atan(tangent);
132
+ else
133
+ angle = tangent > 0 ? Math.PI - Math.atan(tangent) : Math.atan(tangent) - Math.PI;
134
+ }
135
+ const cos = Math.cos(angle);
136
+ const sin = Math.sin(angle);
137
+ for (let i = 0; i < atomCount; i++) {
138
+ const xAdd = coordinates.x[i];
139
+ coordinates.x[i] = xAdd * cos - coordinates.y[i] * sin;
140
+ coordinates.y[i] = xAdd * sin + coordinates.y[i] * cos;
141
+ }
142
+ //place to right
143
+ const xShift = coordinates.x[first];
144
+ for (let i = 0; i < atomCount; i++)
145
+ coordinates.x[i] -= xShift;
146
+ //rewrite v3KMolblock
147
+ let index = v3KMolblock.indexOf('M V30 BEGIN ATOM'); // V3000 index for atoms coordinates
148
+ index = v3KMolblock.indexOf('\n', index);
149
+ let indexEnd = index;
150
+ for (let i = 0; i < atomCount; i++) {
151
+ index = v3KMolblock.indexOf('V30', index) + 4;
152
+ index = v3KMolblock.indexOf(' ', index) + 1;
153
+ index = v3KMolblock.indexOf(' ', index) + 1;
154
+ indexEnd = v3KMolblock.indexOf(' ', index) + 1;
155
+ indexEnd = v3KMolblock.indexOf(' ', indexEnd);
156
+ v3KMolblock = v3KMolblock.slice(0, index) +
157
+ coordinates.x[i] + ' ' + coordinates.y[i] +
158
+ v3KMolblock.slice(indexEnd);
159
+ index = v3KMolblock.indexOf('\n', index) + 1;
160
+ }
161
+ return v3KMolblock;
162
+ });
163
+ }
164
+ /* provide description */
165
+ function linkV3K(monomers) {
166
+ let macroMolBlock = '\nDatagrok macromolecule handler\n\n';
167
+ macroMolBlock += ' 0 0 0 0 0 0 999 V3000\n';
168
+ macroMolBlock += 'M V30 BEGIN CTAB\n';
169
+ let atomBlock = '';
170
+ let bondBlock = '';
171
+ // const collectionBlock = '';
172
+ // const collection: number [] = [];
173
+ let atomCount = 0;
174
+ let bondCount = 0;
175
+ let xShift = 0; // ?
176
+ for (let i = 0; i < monomers.length; i++) {
177
+ let v3KMolfile = monomers[i]['molfile'];
178
+ const first = monomers[i]['indices']['first'];
179
+ const last = monomers[i]['indices']['last'];
180
+ const remFirst = monomers[i]['indices']['remFirst'];
181
+ const remLast = monomers[i]['indices']['remLast'];
182
+ const remBondFirst = monomers[i]['indices']['remBondFirst'];
183
+ const remBondLast = monomers[i]['indices']['remBondLast'];
184
+ // todo: handle r-groups
185
+ v3KMolfile = v3KMolfile.replaceAll('(-\nM V30 ', '(')
186
+ .replaceAll('-\nM V30 ', '').replaceAll(' )', ')');
187
+ // todo: improve naming
188
+ const numbers = extractAtomAndBondCountsV3K(v3KMolfile);
189
+ const coordinates = extractAtomDataV3K(v3KMolfile);
190
+ let indexAtoms = v3KMolfile.indexOf('M V30 BEGIN ATOM'); // V3000 atom block
191
+ indexAtoms = v3KMolfile.indexOf('\n', indexAtoms);
192
+ let index = indexAtoms;
193
+ let indexEnd = indexAtoms;
194
+ const totalShift = xShift - coordinates.x[first - 1];
195
+ for (let j = 0; j < numbers.atomCount; j++) {
196
+ if (coordinates.atomIndices[j] != remFirst && coordinates.atomIndices[j] != remLast) { //|| i === 0) {
197
+ //rewrite atom number
198
+ index = v3KMolfile.indexOf('V30', index) + 4;
199
+ indexEnd = v3KMolfile.indexOf(' ', index);
200
+ let atomNumber = parseInt(v3KMolfile.substring(index, indexEnd));
201
+ atomNumber = (atomNumber > remFirst && atomNumber > remLast) ? atomNumber - 2 :
202
+ (atomNumber > remFirst || atomNumber > remLast) ? atomNumber - 1 : atomNumber;
203
+ atomNumber += atomCount;
204
+ v3KMolfile = v3KMolfile.slice(0, index) + atomNumber + v3KMolfile.slice(indexEnd);
205
+ //rewrite coordinates
206
+ index = v3KMolfile.indexOf(' ', index) + 1;
207
+ index = v3KMolfile.indexOf(' ', index) + 1;
208
+ indexEnd = v3KMolfile.indexOf(' ', index);
209
+ let coordinate = Math.round(10000 * (parseFloat(v3KMolfile.substring(index, indexEnd)) + totalShift)) / 10000;
210
+ v3KMolfile = v3KMolfile.slice(0, index) + coordinate + v3KMolfile.slice(indexEnd);
211
+ index = v3KMolfile.indexOf(' ', index) + 1;
212
+ indexEnd = v3KMolfile.indexOf(' ', index);
213
+ coordinate = Math.round(10000 * (parseFloat(v3KMolfile.substring(index, indexEnd)))) / 10000;
214
+ v3KMolfile = v3KMolfile.slice(0, index) + coordinate + v3KMolfile.slice(indexEnd);
215
+ index = v3KMolfile.indexOf('\n', index) + 1;
216
+ }
217
+ else {
218
+ index = v3KMolfile.indexOf('M V30', index) - 1;
219
+ indexEnd = v3KMolfile.indexOf('\n', index + 1);
220
+ v3KMolfile = v3KMolfile.slice(0, index) + v3KMolfile.slice(indexEnd);
221
+ }
222
+ }
223
+ const indexAtomsEnd = v3KMolfile.indexOf('M V30 END ATOM');
224
+ atomBlock += v3KMolfile.substring(indexAtoms + 1, indexAtomsEnd);
225
+ let indexBonds = v3KMolfile.indexOf('M V30 BEGIN BOND'); // V3000 index for bonds
226
+ indexBonds = v3KMolfile.indexOf('\n', indexBonds);
227
+ index = indexBonds;
228
+ indexEnd = indexBonds;
229
+ let bondNumber = 0;
230
+ for (let j = 0; j < numbers.bondCount; j++) {
231
+ //rewrite bond number
232
+ index = v3KMolfile.indexOf('V30', index) + 4;
233
+ indexEnd = v3KMolfile.indexOf(' ', index);
234
+ bondNumber = parseInt(v3KMolfile.substring(index, indexEnd));
235
+ if (bondNumber === remBondFirst || bondNumber === remBondLast) {
236
+ indexEnd = v3KMolfile.indexOf('\n', index) + 1;
237
+ index -= 7;
238
+ v3KMolfile = v3KMolfile.slice(0, index) + v3KMolfile.slice(indexEnd);
239
+ continue;
240
+ }
241
+ bondNumber = (bondNumber > remBondFirst && bondNumber > remBondLast) ? bondNumber - 2 :
242
+ (bondNumber > remBondFirst || bondNumber > remBondLast) ? bondNumber - 1 : bondNumber;
243
+ bondNumber += bondCount;
244
+ v3KMolfile = v3KMolfile.slice(0, index) + bondNumber + v3KMolfile.slice(indexEnd);
245
+ //rewrite atom pair in bond
246
+ index = v3KMolfile.indexOf(' ', index) + 1;
247
+ index = v3KMolfile.indexOf(' ', index) + 1;
248
+ indexEnd = v3KMolfile.indexOf(' ', index);
249
+ let atomNumber = parseInt(v3KMolfile.substring(index, indexEnd));
250
+ atomNumber = (atomNumber > remFirst && atomNumber > remLast) ? atomNumber - 2 :
251
+ (atomNumber > remFirst || atomNumber > remLast) ? atomNumber - 1 : atomNumber;
252
+ atomNumber += atomCount;
253
+ v3KMolfile = v3KMolfile.slice(0, index) + atomNumber + v3KMolfile.slice(indexEnd);
254
+ index = v3KMolfile.indexOf(' ', index) + 1;
255
+ indexEnd = Math.min(v3KMolfile.indexOf('\n', index), v3KMolfile.indexOf(' ', index));
256
+ atomNumber = parseInt(v3KMolfile.substring(index, indexEnd));
257
+ atomNumber = (atomNumber > remFirst && atomNumber > remLast) ? atomNumber - 2 :
258
+ (atomNumber > remFirst || atomNumber > remLast) ? atomNumber - 1 : atomNumber;
259
+ atomNumber += atomCount;
260
+ v3KMolfile = v3KMolfile.slice(0, index) + atomNumber + v3KMolfile.slice(indexEnd);
261
+ index = v3KMolfile.indexOf('\n', index) + 1;
262
+ }
263
+ const indexBondEnd = v3KMolfile.indexOf('M V30 END BOND');
264
+ bondBlock += v3KMolfile.substring(indexBonds + 1, indexBondEnd);
265
+ //let indexCollection = v3KMolfile.indexOf('M V30 MDLV30/STEABS ATOMS=('); // V3000 index for collections
266
+ // while (indexCollection != -1) {
267
+ // indexCollection += 28;
268
+ // const collectionEnd = v3KMolfile.indexOf(')', indexCollection);
269
+ // const collectionEntries = v3KMolfile.substring(indexCollection, collectionEnd).split(' ').slice(1);
270
+ // collectionEntries.forEach((e: string) => {
271
+ // collection.push(parseInt(e) + atomCount);
272
+ // });
273
+ // indexCollection = collectionEnd;
274
+ // indexCollection = v3KMolfile.indexOf('M V30 MDLV30/STEABS ATOMS=(', indexCollection);
275
+ // }
276
+ atomCount += numbers.atomCount - 2;
277
+ bondCount += numbers.bondCount - 2;
278
+ xShift += coordinates.x[last] - coordinates.x[first] + 1;
279
+ if (i === monomers.length - 1) {
280
+ atomCount++;
281
+ const shift = xShift + 0.2;
282
+ atomBlock += 'M V30 ' + atomCount + ' O ' + shift + ' 0 0.000000 0\n';
283
+ }
284
+ bondCount++;
285
+ if (i === monomers.length - 1) {
286
+ const rightTerminal = (last > remFirst && last > remLast) ? last + atomCount - (numbers.atomCount - 2) - 3 :
287
+ (last > remFirst || last > remLast) ? last + atomCount - (numbers.atomCount - 2) - 2 :
288
+ last + atomCount - (numbers.atomCount - 2) - 1;
289
+ bondBlock += 'M V30 ' + bondCount + ' 1 ' + rightTerminal + ' ' + atomCount + '\n';
290
+ }
291
+ else {
292
+ const rightTerminal = (last > remFirst && last > remLast) ? last + atomCount - (numbers.atomCount - 2) - 2 :
293
+ (last > remFirst || last > remLast) ? last + atomCount - (numbers.atomCount - 2) - 1 :
294
+ last + atomCount - (numbers.atomCount - 2);
295
+ const next = monomers[i + 1]['indices'];
296
+ const nextFirst = next['first'];
297
+ const nextRemFirst = next['remFirst'];
298
+ const nextRemLast = next['remLast'];
299
+ const leftTerminal = (nextFirst > nextRemFirst && nextFirst > nextRemLast) ? nextFirst + atomCount - 2 :
300
+ (nextFirst > nextRemFirst || nextFirst > nextRemLast) ? nextFirst + atomCount - 1 :
301
+ nextFirst + atomCount;
302
+ bondBlock += 'M V30 ' + bondCount + ' 1 ' + rightTerminal + ' ' + leftTerminal + '\n';
303
+ }
304
+ }
305
+ // const entries = 4;
306
+ // const collNumber = Math.ceil(collection.length / entries);
307
+ // collectionBlock += 'M V30 MDLV30/STEABS ATOMS=(' + collection.length + ' -\n';
308
+ // for (let i = 0; i < collNumber; i++) {
309
+ // collectionBlock += 'M V30 ';
310
+ // const entriesCurrent = i + 1 === collNumber ? collection.length - (collNumber - 1)*entries : entries;
311
+ // for (let j = 0; j < entriesCurrent; j++) {
312
+ // collectionBlock += (j + 1 === entriesCurrent) ?
313
+ // (i === collNumber - 1 ? collection[entries*i + j] + ')\n' : collection[entries*i + j] + ' -\n') :
314
+ // collection[entries*i + j] + ' ';
315
+ // }
316
+ // }
317
+ //generate file
318
+ macroMolBlock += 'M V30 COUNTS ' + atomCount + ' ' + bondCount + ' 0 0 0\n';
319
+ macroMolBlock += 'M V30 BEGIN ATOM\n';
320
+ macroMolBlock += atomBlock;
321
+ macroMolBlock += 'M V30 END ATOM\n';
322
+ macroMolBlock += 'M V30 BEGIN BOND\n';
323
+ macroMolBlock += bondBlock;
324
+ macroMolBlock += 'M V30 END BOND\n';
325
+ //macroMolBlock += 'M V30 BEGIN COLLECTION\n';
326
+ //macroMolBlock += collectionBlock;
327
+ //macroMolBlock += 'M V30 END COLLECTION\n';
328
+ macroMolBlock += 'M V30 END CTAB\n';
329
+ macroMolBlock += 'M END\n';
330
+ return macroMolBlock;
331
+ }
332
+ export function getMacroMol(monomers) {
333
+ return __awaiter(this, void 0, void 0, function* () {
334
+ const result = [];
335
+ const moduleRdkit = yield grok.functions.call('Chem:getRdKitModule');
336
+ for (let i = 0; i < monomers.length; i++) {
337
+ for (let j = 0; j < monomers[i].length; j++) {
338
+ const molObj = moduleRdkit.get_mol(monomers[i][j]['molfile']);
339
+ const v3KMolblock = molObj.get_v3Kmolblock();
340
+ const indices = getIndices(monomers[i][j]['molfile'], v3KMolblock);
341
+ monomers[i][j]['indices'] = indices;
342
+ // a new molfile for 'rotated' is obtained in v3k format
343
+ monomers[i][j]['molfile'] = yield rotateBackboneV3K(v3KMolblock, indices);
344
+ // monomers[i][j]['molfile'] = v3KMolblock;
345
+ molObj === null || molObj === void 0 ? void 0 : molObj.delete();
346
+ }
347
+ // seemingly, at this stage the bond is reconstructed
348
+ result.push(linkV3K(monomers[i]));
349
+ // result.push(monomers[i][0]['molfile']);
350
+ }
351
+ return result;
352
+ });
353
+ }
354
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljLXdvcmtzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXRvbWljLXdvcmtzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFtQjFDLFNBQVMsa0JBQWtCLENBQUMsV0FBbUI7SUFDN0MsTUFBTSxPQUFPLEdBQUcsMkJBQTJCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDekQsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsbUNBQW1DO0lBQ3pGLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6QyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUM7SUFFaEIsTUFBTSxXQUFXLEdBQWEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2RCxNQUFNLFNBQVMsR0FBYSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sQ0FBQyxHQUFhLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0MsTUFBTSxDQUFDLEdBQWEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUU3QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLEdBQUcsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0QyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFF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S0FBSyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBQyxDQUFDLENBQUM7U0FDN0U7YUFBTSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsMEJBQTBCO1lBQ2pFLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDdkU7YUFBTTtZQUNMLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxRCxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzVDLEtBQUssR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7O2dCQUUvRCxLQUFLLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7U0FDckY7UUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLE1B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LEVBQUUsS0FBSyxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRWxGLHFCQUFxQjtnQkFDckIsS0FBSyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDM0MsS0FBSyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDM0MsUUFBUSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUUxQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLEdBQUMsS0FBSyxDQUFDO2dCQUMxRyxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRWxGLEtBQUssR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzNDLFFBQVEsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDMUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDLEtBQUssQ0FBQztnQkFDekYsVUFBVSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLFVBQVUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLFFB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MkNBQTJDO2dCQUMzQyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsTUFBTSxFQUFFLENBQUM7YUFDbEI7WUFDRCxxREFBcUQ7WUFDckQsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQywwQ0FBMEM7U0FDM0M7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcblxudHlwZSBJbmRpY2VzID0ge1xuICBmaXJzdDogbnVtYmVyLCAvLyBub2RlIHRvIHdoaWNoIHJlbUZpcnN0IGlzIGF0dGFjaGVkXG4gIGxhc3Q6IG51bWJlciwgLy8gbm9kZSB0byB3aGljaCByZW1MYXN0IGlzIGF0dGFjaGVkXG4gIHJlbUZpcnN0OiBudW1iZXIsIC8vIFwibGVmdG1vc3RcIiByLWdyb3VwIG5vZGUgb2YgdGhlIG1vbm9tZXJcbiAgcmVtTGFzdDogbnVtYmVyLCAvLyBcInJpZ2h0bW9zdFwiIHItZ3JvdXAgbm9kZSBvZiB0aGUgbW9ub21lclxuICByZW1Cb25kRmlyc3Q6IG51bWJlciwgLy8gaWR4IG9mIHRoZSBib25kIGJldHdlZW4gZmlyc3QgYW5kIHJlbUZpcnN0XG4gIHJlbUJvbmRMYXN0OiBudW1iZXIsIC8vIGlkeCBvZiB0aGUgYm9uZCBiZXR3ZWVuIGxhc3QgYW5kIHJlbUxhc3Rcbn1cblxuLy8gdG9kbzogaW1wcm92ZVxudHlwZSBBdG9tRGF0YSA9IHtcbiAgYXRvbUluZGljZXM6IG51bWJlcltdLFxuICBhdG9tVHlwZXM6IHN0cmluZ1tdLFxuICB4OiBudW1iZXJbXSxcbiAgeTogbnVtYmVyW10sXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RBdG9tRGF0YVYzSyh2M0tNb2xibG9jazogc3RyaW5nKTogQXRvbURhdGEge1xuICBjb25zdCBudW1iZXJzID0gZXh0cmFjdEF0b21BbmRCb25kQ291bnRzVjNLKHYzS01vbGJsb2NrKTtcbiAgbGV0IGJlZ2luID0gdjNLTW9sYmxvY2suaW5kZXhPZignTSAgVjMwIEJFR0lOIEFUT00nKTsgLy8gVjMwMDAgYmxvY2sgZm9yIGF0b20gY29vcmRpbmF0ZXNcbiAgYmVnaW4gPSB2M0tNb2xibG9jay5pbmRleE9mKCdcXG4nLCBiZWdpbik7XG4gIGxldCBlbmQgPSBiZWdpbjtcblxuICBjb25zdCBhdG9tSW5kaWNlczogbnVtYmVyW10gPSBBcnJheShudW1iZXJzLmF0b21Db3VudCk7XG4gIGNvbnN0IGF0b21UeXBlczogc3RyaW5nW10gPSBBcnJheShudW1iZXJzLmF0b21Db3VudCk7XG4gIGNvbnN0IHg6IG51bWJlcltdID0gQXJyYXkobnVtYmVycy5hdG9tQ291bnQpO1xuICBjb25zdCB5OiBudW1iZXJbXSA9IEFycmF5KG51bWJlcnMuYXRvbUNvdW50KTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlcnMuYXRvbUNvdW50OyBpKyspIHtcbiAgICBiZWdpbiA9IHYzS01vbGJsb2NrLmluZGV4T2YoJ1YzMCcsIGJlZ2luKSArIDQ7XG4gICAgZW5kID0gdjNLTW9sYmxvY2suaW5kZXhPZignICcsIGJlZ2luKTtcbiAgICBhdG9tSW5kaWNlc1tpXSA9IHBhcnNlSW50KHYzS01vbGJsb2NrLnN1YnN0cmluZyhiZWdpbiwgZW5kKSk7XG5cbiAgICBiZWdpbiA9IGVuZCArIDE7XG4gICAgZW5kID0gdjNLTW9sYmxvY2suaW5kZXhPZignICcsIGJlZ2luKTtcbiAgICBhdG9tVHlwZXNbaV0gPSB2M0tNb2xibG9jay5zdWJzdHJpbmcoYmVnaW4sIGVuZCk7XG5cbiAgICBiZWdpbiA9IGVuZCArIDE7XG4gICAgZW5kID0gdjNLTW9sYmxvY2suaW5kZXhPZignICcsIGJlZ2luKTtcbiAgICB4W2ldID0gcGFyc2VGbG9hdCh2M0tNb2xibG9jay5zdWJzdHJpbmcoYmVnaW4sIGVuZCkpO1xuXG4gICAgYmVnaW4gPSBlbmQgKyAxO1xuICAgIGVuZCA9IHYzS01vbGJsb2NrLmluZGV4T2YoJyAnLCBiZWdpbik7XG4gICAgeVtpXSA9IHBhcnNlRmxvYXQodjNLTW9sYmxvY2suc3Vic3RyaW5nKGJlZ2luLCBlbmQpKTtcblxuICAgIGJlZ2luID0gdjNLTW9sYmxvY2suaW5kZXhPZignXFxuJywgYmVnaW4pICsgMTtcbiAgfVxuXG4gIHJldHVybiB7YXRvbUluZGljZXM6IGF0b21JbmRpY2VzLCBhdG9tVHlwZXM6IGF0b21UeXBlcywgeDogeCwgeTogeX07XG59XG5cbi8vIHRvZG86IGV4dHJhY3RSZ3JvdXBEYXRhXG5cbmZ1bmN0aW9uIGV4dHJhY3RBdG9tQW5kQm9uZENvdW50c1YzSyh2M0tNb2xibG9jazogc3RyaW5nKToge2F0b21Db3VudDogbnVtYmVyLCBib25kQ291bnQ6IG51bWJlcn0ge1xuICB2M0tNb2xibG9jayA9IHYzS01vbGJsb2NrLnJlcGxhY2VBbGwoJ1xccicsICcnKTsgLy8gZXF1YWxpemUgb2xkIGFuZCBuZXcgc2RmIHN0YW5kYXJkc1xuXG4gIC8vIHBhcnNlIGF0b20gY291bnRcbiAgbGV0IGlkeEJlZ2luID0gdjNLTW9sYmxvY2suaW5kZXhPZignQ09VTlRTJykgKyA3O1xuICBsZXQgaWR4RW5kID0gdjNLTW9sYmxvY2suaW5kZXhPZignICcsIGlkeEJlZ2luKTtcbiAgY29uc3QgbnVtT2ZBdG9tcyA9IHBhcnNlSW50KHYzS01vbGJsb2NrLnN1YnN0cmluZyhpZHhCZWdpbiwgaWR4RW5kKSk7XG5cbiAgLy8gcGFyc2UgYm9uZCBjb3VudFxuICBpZHhCZWdpbiA9IGlkeEVuZCArIDE7XG4gIGlkeEVuZCA9IHYzS01vbGJsb2NrLmluZGV4T2YoJyAnLCBpZHhCZWdpbik7XG4gIGNvbnN0IG51bU9mQm9uZHMgPSBwYXJzZUludCh2M0tNb2xibG9jay5zdWJzdHJpbmcoaWR4QmVnaW4sIGlkeEVuZCkpO1xuXG4gIHJldHVybiB7YXRvbUNvdW50OiBudW1PZkF0b21zLCBib25kQ291bnQ6IG51bU9mQm9uZHN9O1xufVxuXG5mdW5jdGlvbiBnZXRJbmRpY2VzKHYyS01vbGJsb2NrOiBzdHJpbmcsIHYzS01vbGJsb2NrOiBzdHJpbmcpOiBJbmRpY2VzIHtcbiAgLy8gb25lIHNob3VsZCBhbHNvIHRha2UgaW50byBhY2NvdW50IHRoYXQgdGhlcmUgY2FuIGJlIG11bHRpcGxlIE0gUkdQIGxpbmVzXG4gIC8vIHdpdGggUi1Hcm91cHMgc3BlY2lmaWVkXG4gIGxldCBiZWdpbiA9IHYyS01vbGJsb2NrLmluZGV4T2YoJ00gIFJHUCcsIDApICsgODtcbiAgbGV0IGVuZCA9IHYyS01vbGJsb2NrLmluZGV4T2YoJ1xcbicsIGJlZ2luKTtcblxuICAvLyB0b2RvOiBtYXliZSB0aGlzIHBhcnQgZGVzZXJ2ZXMgYSBzZXBhcmF0ZSBmdW5jdGlvblxuICAvLyB0aGVyZSBtYXkgYmUgc2l0dWF0aW9uIHdoZW4gdGhlIHJncCBpbmZvcm1hdGlvbiBpcyBkaXN0cmlidXRlZCBhbW9uZ1xuICAvLyBtdWx0aXBsZSBsaW5lcywgdGhpcyBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudFxuICBjb25zdCByZ3BTdHJpbmdQYXJzZWQgPSB2MktNb2xibG9jay5zdWJzdHJpbmcoYmVnaW4sIGVuZCkucmVwbGFjZUFsbCgnICAnLCAnICcpLnJlcGxhY2VBbGwoJyAgJywgJyAnKS5zcGxpdCgnICcpO1xuICBjb25zdCByZ3BEYXRhID0gcmdwU3RyaW5nUGFyc2VkLm1hcCgoZWwpID0+IHBhcnNlSW50KGVsKSk7XG4gIC8vIHJncERhdGFbMF0gaXMgdGhlIG51bWJlciBvZiBSLWdyb3Vwc1xuICAvLyB0aGUgZm9sbG93aW5nIGNvZGUgc2V0cyByZW1GaXJzdCB0byBub2RlIyB0byB3aGljaCBSR1AjMSBpcyBzdWJzdGl0dXRlZFxuXG4gIC8vIHRvZG86IGhhbmRsZSB0aGUgZXhjZXB0aW9uYWwgY2FzZSB3aGVuIHRoZXJlIGlzIG5vdCBlbm91Z2ggcmdyb3Vwc1xuICAvLyB0b2RvOiBoYW5kbGUgdGhlIGV4Y2VwdGlvbmFsIGNhc2Ugd2hlbiB0aGUgb3JkZXIgaXMgZGlmZmVyZW50XG4gIGNvbnN0IHJlbUZpcnN0ID0gcmdwRGF0YVsxXTsgLy8gbGVmdG1vc3QgUmdyb3VwIG5vZGVcbiAgY29uc3QgcmVtTGFzdCA9IHJncERhdGFbcmdwRGF0YS5sZW5ndGggLSAyXTsgLy8gcmlnaHRtb3N0IFJncm91cCBub2RlXG4gIC8vIGlmIChyZW1GaXJzdCA9PT0gLTEgfHwgcmVtTGFzdCA9PT0gLTEpXG4gIC8vICAgdGhyb3cgbmV3IEVycm9yKCdSR1AgcGFyc2luZzogZmlyc3QgYW5kIGxhc3QgZ3JvdXBzIGhhdmUgd3JvbmcgZm9ybWF0Jyk7XG5cbiAgLy8gY29uc3QgcmVtRmlyc3QgPSByZ3BEYXRhWzJdID09PSAnMScgPyBwYXJzZUludChyZ3BEYXRhWzFdKSA6IHBhcnNlSW50KHJncERhdGFbM10pO1xuICAvLyBjb25zdCByZW1MYXN0ID0gcmdwRGF0YVsyXSA9PT0gJzInID8gcGFyc2VJbnQocmdwRGF0YVsxXSkgOiBwYXJzZUludChyZ3BEYXRhWzNdKTtcblxuICAvLyB0b2RvOiByZW5hbWUgJ251bWJlcnMnXG4gIGNvbnN0IG51bWJlcnMgPSBleHRyYWN0QXRvbUFuZEJvbmRDb3VudHNWM0sodjNLTW9sYmxvY2spO1xuICBsZXQgaW5kZXhCb25kcyA9IHYzS01vbGJsb2NrLmluZGV4T2YoJ00gIFYzMCBCRUdJTiBCT05EJyk7IC8vIFYzMDAwIGJvbmQgYmxvY2tcbiAgaW5kZXhCb25kcyA9IHYzS01vbGJsb2NrLmluZGV4T2YoJ1xcbicsIGluZGV4Qm9uZHMpO1xuICBiZWdpbiA9IGluZGV4Qm9uZHM7XG4gIGVuZCA9IGluZGV4Qm9uZHM7XG5cbiAgbGV0IGZpcnN0ID0gMDsgLy8gdG9kbzogaW1wcm92ZSBub3RhdGlvblxuICBsZXQgbGFzdCA9IDA7XG4gIGxldCByZW1Cb25kRmlyc3QgPSAwO1xuICBsZXQgcmVtQm9uZExhc3QgPSAwO1xuXG4gIC8vIGl0ZXJhdGUgb3ZlciBlZGdlcyBvZiB0aGUgZ3JhcGggYW5kIGZpbmQgdGhvc2VcbiAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1iZXJzLmJvbmRDb3VudDsgaisrKSB7XG4gICAgaWYgKGZpcnN0ID09PSAwIHx8IGxhc3QgPT09IDApIHtcbiAgICAgIGJlZ2luID0gdjNLTW9sYmxvY2suaW5kZXhPZignVjMwJywgYmVnaW4pICsgNDtcbiAgICAgIGVuZCA9IHYzS01vbGJsb2NrLmluZGV4T2YoJ1xcbicsIGJlZ2luKTtcbiAgICAgIGNvbnN0IGJvbmRTdHJpbmdQYXJzZWQgPSB2M0tNb2xibG9jay5zdWJzdHJpbmcoYmVnaW4sIGVuZCkucmVwbGFjZUFsbCgnICAnLCAnICcpLnJlcGxhY2VBbGwoJyAgJywgJyAnKS5zcGxpdCgnICcpO1xuICAgICAgY29uc3QgYm9uZERhdGEgPSBib25kU3RyaW5nUGFyc2VkLm1hcCgoZWwpID0+IHBhcnNlSW50KGVsKSk7XG5cbiAgICAgIGlmIChib25kRGF0YVsyXSA9PT0gcmVtRmlyc3QpIHsgLy8gYm9uZERhdGFbMl0gaXMgdGhlIDFzdCBub2RlL2F0b20gb2YgdGhlIGJvbmRcbiAgICAgICAgZmlyc3QgPSBib25kRGF0YVszXTsgLy8gYm9uZERhdGFbM10gaXMgdGhlIDJuZCBub2RlL2F0b20gb2YgdGhlIGJvbmRcbiAgICAgICAgcmVtQm9uZEZpcnN0ID0gYm9uZERhdGFbMF07IC8vIGJvbmREYXRhWzBdIGlzIHRoZSBpZHggb2YgdGhlIGFzc29jaWF0ZWQgYm9uZC9lZGdlXG4gICAgICB9IGVsc2UgaWYgKGJvbmREYXRhWzNdID09PSByZW1GaXJzdCkge1xuICAgICAgICBmaXJzdCA9IGJvbmREYXRhWzJdO1xuICAgICAgICByZW1Cb25kRmlyc3QgPSBib25kRGF0YVswXTtcbiAgICAgIH0gZWxzZSBpZiAoYm9uZERhdGFbMl0gPT09IHJlbUxhc3QpIHtcbiAgICAgICAgbGFzdCA9IGJvbmREYXRhWzNdO1xuICAgICAgICByZW1Cb25kTGFzdCA9IGJvbmREYXRhWzBdO1xuICAgICAgfSBlbHNlIGlmIChib25kRGF0YVszXSA9PT0gcmVtTGFzdCkge1xuICAgICAgICBsYXN0ID0gYm9uZERhdGFbMl07XG4gICAgICAgIHJlbUJvbmRMYXN0ID0gYm9uZERhdGFbMF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtmaXJzdCwgbGFzdCwgcmVtRmlyc3QsIHJlbUxhc3QsIHJlbUJvbmRGaXJzdCwgcmVtQm9uZExhc3R9O1xufVxuXG4vKiBwcm92aWRlIGRlc2NyaXB0aW9uICovXG5hc3luYyBmdW5jdGlvbiByb3RhdGVCYWNrYm9uZVYzSyh2M0tNb2xibG9jazogc3RyaW5nLCBpbmRpY2VzOmFueSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNvb3JkaW5hdGVzID0gZXh0cmFjdEF0b21EYXRhVjNLKHYzS01vbGJsb2NrKTsgLy8gbmFtaW5nP1xuICBjb25zdCBhdG9tQ291bnQgPSBjb29yZGluYXRlcy5hdG9tSW5kaWNlcy5sZW5ndGg7XG4gIGNvbnN0IGZpcnN0ID0gaW5kaWNlc1snZmlyc3QnXTtcbiAgY29uc3QgbGFzdCA9IGluZGljZXNbJ2xhc3QnXTtcblxuICBjb25zdCB4Q2VudGVyID0gKGNvb3JkaW5hdGVzLnhbbGFzdF0gKyBjb29yZGluYXRlcy54W2ZpcnN0XSkvMjtcbiAgY29uc3QgeUNlbnRlciA9IChjb29yZGluYXRlcy55W2xhc3RdICsgY29vcmRpbmF0ZXMueVtmaXJzdF0pLzI7XG5cbiAgLy9wbGFjZSB0byBjZW50ZXJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdG9tQ291bnQ7IGkrKykge1xuICAgIGNvb3JkaW5hdGVzLnhbaV0gLT0geENlbnRlcjtcbiAgICBjb29yZGluYXRlcy55W2ldIC09IHlDZW50ZXI7XG4gIH1cblxuICBsZXQgYW5nbGUgPSAwO1xuICBpZiAoY29vcmRpbmF0ZXMueFtmaXJzdF0gPT09IDApIHsgLy8gYm90aCB2ZXJ0aWNlcyBhcmUgb24gT1lcbiAgICBhbmdsZSA9IGNvb3JkaW5hdGVzLnlbZmlyc3RdID4gY29vcmRpbmF0ZXMueVtsYXN0XSA/IE1hdGguUEkvMiA6IC1NYXRoLlBJLzI7XG4gIH0gZWxzZSBpZiAoY29vcmRpbmF0ZXMueVtmaXJzdF0gPT09IDApIHsgLy8gYm90aCB2ZXJ0aWNlcyBhcmUgb24gT1hcbiAgICBhbmdsZSA9IGNvb3JkaW5hdGVzLnhbZmlyc3RdID4gY29vcmRpbmF0ZXMueFtsYXN0XSA/IE1hdGguUEkgOiAwOyAvLyB2XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdGFuZ2VudCA9IGNvb3JkaW5hdGVzLnlbZmlyc3RdL2Nvb3JkaW5hdGVzLnhbZmlyc3RdO1xuICAgIGlmIChjb29yZGluYXRlcy54W2ZpcnN0XSA8IGNvb3JkaW5hdGVzLnhbbGFzdF0pXG4gICAgICBhbmdsZSA9IHRhbmdlbnQgPiAwID8gLU1hdGguYXRhbih0YW5nZW50KSA6IE1hdGguYXRhbih0YW5nZW50KTtcbiAgICBlbHNlXG4gICAgICBhbmdsZSA9IHRhbmdlbnQgPiAwID8gTWF0aC5QSSAtIE1hdGguYXRhbih0YW5nZW50KSA6IE1hdGguYXRhbih0YW5nZW50KSAtIE1hdGguUEk7XG4gIH1cblxuICBjb25zdCBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG4gIGNvbnN0IHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGF0b21Db3VudDsgaSsrKSB7XG4gICAgY29uc3QgeEFkZCA9IGNvb3JkaW5hdGVzLnhbaV07XG4gICAgY29vcmRpbmF0ZXMueFtpXSA9IHhBZGQqY29zIC0gY29vcmRpbmF0ZXMueVtpXSpzaW47XG4gICAgY29vcmRpbmF0ZXMueVtpXSA9IHhBZGQqc2luICsgY29vcmRpbmF0ZXMueVtpXSpjb3M7XG4gIH1cblxuICAvL3BsYWNlIHRvIHJpZ2h0XG4gIGNvbnN0IHhTaGlmdCA9IGNvb3JkaW5hdGVzLnhbZmlyc3RdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGF0b21Db3VudDsgaSsrKVxuICAgIGNvb3JkaW5hdGVzLnhbaV0gLT0geFNoaWZ0O1xuXG4gIC8vcmV3cml0ZSB2M0tNb2xibG9ja1xuICBsZXQgaW5kZXggPSB2M0tNb2xibG9jay5pbmRleE9mKCdNICBWMzAgQkVHSU4gQVRPTScpOyAvLyBWMzAwMCBpbmRleCBmb3IgYXRvbXMgY29vcmRpbmF0ZXNcbiAgaW5kZXggPSB2M0tNb2xibG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCk7XG4gIGxldCBpbmRleEVuZCA9IGluZGV4O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGF0b21Db3VudDsgaSsrKSB7XG4gICAgaW5kZXggPSB2M0tNb2xibG9jay5pbmRleE9mKCdWMzAnLCBpbmRleCkgKyA0O1xuICAgIGluZGV4ID0gdjNLTW9sYmxvY2suaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgaW5kZXggPSB2M0tNb2xibG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICBpbmRleEVuZCA9IHYzS01vbGJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgIGluZGV4RW5kID0gdjNLTW9sYmxvY2suaW5kZXhPZignICcsIGluZGV4RW5kKTtcblxuICAgIHYzS01vbGJsb2NrID0gdjNLTW9sYmxvY2suc2xpY2UoMCwgaW5kZXgpICtcbiAgICAgIGNvb3JkaW5hdGVzLnhbaV0gKyAnICcgKyBjb29yZGluYXRlcy55W2ldICtcbiAgICAgIHYzS01vbGJsb2NrLnNsaWNlKGluZGV4RW5kKTtcblxuICAgIGluZGV4ID0gdjNLTW9sYmxvY2suaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgfVxuXG4gIHJldHVybiB2M0tNb2xibG9jaztcbn1cblxuLyogcHJvdmlkZSBkZXNjcmlwdGlvbiAqL1xuZnVuY3Rpb24gbGlua1YzSyhtb25vbWVyczogYW55W10pOiBzdHJpbmcge1xuICBsZXQgbWFjcm9Nb2xCbG9jayA9ICdcXG5EYXRhZ3JvayBtYWNyb21vbGVjdWxlIGhhbmRsZXJcXG5cXG4nO1xuICBtYWNyb01vbEJsb2NrICs9ICcgIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICA5OTkgVjMwMDBcXG4nO1xuICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQ1RBQlxcbic7XG4gIGxldCBhdG9tQmxvY2sgPSAnJztcbiAgbGV0IGJvbmRCbG9jayA9ICcnO1xuICAvLyBjb25zdCBjb2xsZWN0aW9uQmxvY2sgPSAnJztcbiAgLy8gY29uc3QgY29sbGVjdGlvbjogbnVtYmVyIFtdID0gW107XG4gIGxldCBhdG9tQ291bnQgPSAwO1xuICBsZXQgYm9uZENvdW50ID0gMDtcbiAgbGV0IHhTaGlmdCA9IDA7IC8vID9cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG1vbm9tZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IHYzS01vbGZpbGUgPSBtb25vbWVyc1tpXVsnbW9sZmlsZSddO1xuICAgIGNvbnN0IGZpcnN0ID0gbW9ub21lcnNbaV1bJ2luZGljZXMnXVsnZmlyc3QnXTtcbiAgICBjb25zdCBsYXN0ID0gbW9ub21lcnNbaV1bJ2luZGljZXMnXVsnbGFzdCddO1xuICAgIGNvbnN0IHJlbUZpcnN0ID0gbW9ub21lcnNbaV1bJ2luZGljZXMnXVsncmVtRmlyc3QnXTtcbiAgICBjb25zdCByZW1MYXN0ID0gbW9ub21lcnNbaV1bJ2luZGljZXMnXVsncmVtTGFzdCddO1xuICAgIGNvbnN0IHJlbUJvbmRGaXJzdCA9IG1vbm9tZXJzW2ldWydpbmRpY2VzJ11bJ3JlbUJvbmRGaXJzdCddO1xuICAgIGNvbnN0IHJlbUJvbmRMYXN0ID0gbW9ub21lcnNbaV1bJ2luZGljZXMnXVsncmVtQm9uZExhc3QnXTtcbiAgICAvLyB0b2RvOiBoYW5kbGUgci1ncm91cHNcbiAgICB2M0tNb2xmaWxlID0gdjNLTW9sZmlsZS5yZXBsYWNlQWxsKCcoLVxcbk0gIFYzMCAnLCAnKCcpXG4gICAgICAucmVwbGFjZUFsbCgnLVxcbk0gIFYzMCAnLCAnJykucmVwbGFjZUFsbCgnICknLCAnKScpO1xuICAgIC8vIHRvZG86IGltcHJvdmUgbmFtaW5nXG4gICAgY29uc3QgbnVtYmVycyA9IGV4dHJhY3RBdG9tQW5kQm9uZENvdW50c1YzSyh2M0tNb2xmaWxlKTtcbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGV4dHJhY3RBdG9tRGF0YVYzSyh2M0tNb2xmaWxlKTtcblxuICAgIGxldCBpbmRleEF0b21zID0gdjNLTW9sZmlsZS5pbmRleE9mKCdNICBWMzAgQkVHSU4gQVRPTScpOyAvLyBWMzAwMCBhdG9tIGJsb2NrXG4gICAgaW5kZXhBdG9tcyA9IHYzS01vbGZpbGUuaW5kZXhPZignXFxuJywgaW5kZXhBdG9tcyk7XG4gICAgbGV0IGluZGV4ID0gaW5kZXhBdG9tcztcbiAgICBsZXQgaW5kZXhFbmQgPSBpbmRleEF0b21zO1xuICAgIGNvbnN0IHRvdGFsU2hpZnQgPSB4U2hpZnQgLSBjb29yZGluYXRlcy54W2ZpcnN0IC0gMV07XG5cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bWJlcnMuYXRvbUNvdW50OyBqKyspIHtcbiAgICAgIGlmIChjb29yZGluYXRlcy5hdG9tSW5kaWNlc1tqXSAhPSByZW1GaXJzdCAmJiBjb29yZGluYXRlcy5hdG9tSW5kaWNlc1tqXSAhPSByZW1MYXN0KSB7IC8vfHwgaSA9PT0gMCkge1xuICAgICAgICAvL3Jld3JpdGUgYXRvbSBudW1iZXJcbiAgICAgICAgaW5kZXggPSB2M0tNb2xmaWxlLmluZGV4T2YoJ1YzMCcsIGluZGV4KSArIDQ7XG4gICAgICAgIGluZGV4RW5kID0gdjNLTW9sZmlsZS5pbmRleE9mKCcgJywgaW5kZXgpO1xuXG4gICAgICAgIGxldCBhdG9tTnVtYmVyID0gcGFyc2VJbnQodjNLTW9sZmlsZS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSk7XG4gICAgICAgIGF0b21OdW1iZXIgPSAoYXRvbU51bWJlciA+IHJlbUZpcnN0ICYmIGF0b21OdW1iZXIgPiByZW1MYXN0KSA/IGF0b21OdW1iZXIgLSAyIDpcbiAgICAgICAgICAoYXRvbU51bWJlciA+IHJlbUZpcnN0IHx8IGF0b21OdW1iZXIgPiByZW1MYXN0KSA/IGF0b21OdW1iZXIgLSAxIDogYXRvbU51bWJlcjtcbiAgICAgICAgYXRvbU51bWJlciArPSBhdG9tQ291bnQ7XG4gICAgICAgIHYzS01vbGZpbGUgPSB2M0tNb2xmaWxlLnNsaWNlKDAsIGluZGV4KSArIGF0b21OdW1iZXIgKyB2M0tNb2xmaWxlLnNsaWNlKGluZGV4RW5kKTtcblxuICAgICAgICAvL3Jld3JpdGUgY29vcmRpbmF0ZXNcbiAgICAgICAgaW5kZXggPSB2M0tNb2xmaWxlLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICBpbmRleCA9IHYzS01vbGZpbGUuaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgIGluZGV4RW5kID0gdjNLTW9sZmlsZS5pbmRleE9mKCcgJywgaW5kZXgpO1xuXG4gICAgICAgIGxldCBjb29yZGluYXRlID0gTWF0aC5yb3VuZCgxMDAwMCoocGFyc2VGbG9hdCh2M0tNb2xmaWxlLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKSArIHRvdGFsU2hpZnQpKS8xMDAwMDtcbiAgICAgICAgdjNLTW9sZmlsZSA9IHYzS01vbGZpbGUuc2xpY2UoMCwgaW5kZXgpICsgY29vcmRpbmF0ZSArIHYzS01vbGZpbGUuc2xpY2UoaW5kZXhFbmQpO1xuXG4gICAgICAgIGluZGV4ID0gdjNLTW9sZmlsZS5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSB2M0tNb2xmaWxlLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgIGNvb3JkaW5hdGUgPSBNYXRoLnJvdW5kKDEwMDAwKihwYXJzZUZsb2F0KHYzS01vbGZpbGUuc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpKSkvMTAwMDA7XG4gICAgICAgIHYzS01vbGZpbGUgPSB2M0tNb2xmaWxlLnNsaWNlKDAsIGluZGV4KSArIGNvb3JkaW5hdGUgKyB2M0tNb2xmaWxlLnNsaWNlKGluZGV4RW5kKTtcblxuICAgICAgICBpbmRleCA9IHYzS01vbGZpbGUuaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4ID0gdjNLTW9sZmlsZS5pbmRleE9mKCdNICBWMzAnLCBpbmRleCkgLSAxO1xuICAgICAgICBpbmRleEVuZCA9IHYzS01vbGZpbGUuaW5kZXhPZignXFxuJywgaW5kZXggKyAxKTtcbiAgICAgICAgdjNLTW9sZmlsZSA9IHYzS01vbGZpbGUuc2xpY2UoMCwgaW5kZXgpICsgdjNLTW9sZmlsZS5zbGljZShpbmRleEVuZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXhBdG9tc0VuZCA9IHYzS01vbGZpbGUuaW5kZXhPZignTSAgVjMwIEVORCBBVE9NJyk7XG4gICAgYXRvbUJsb2NrICs9IHYzS01vbGZpbGUuc3Vic3RyaW5nKGluZGV4QXRvbXMgKyAxLCBpbmRleEF0b21zRW5kKTtcblxuICAgIGxldCBpbmRleEJvbmRzID0gdjNLTW9sZmlsZS5pbmRleE9mKCdNICBWMzAgQkVHSU4gQk9ORCcpOyAvLyBWMzAwMCBpbmRleCBmb3IgYm9uZHNcbiAgICBpbmRleEJvbmRzID0gdjNLTW9sZmlsZS5pbmRleE9mKCdcXG4nLCBpbmRleEJvbmRzKTtcbiAgICBpbmRleCA9IGluZGV4Qm9uZHM7XG4gICAgaW5kZXhFbmQgPSBpbmRleEJvbmRzO1xuICAgIGxldCBib25kTnVtYmVyID0gMDtcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtYmVycy5ib25kQ291bnQ7IGorKykge1xuICAgICAgLy9yZXdyaXRlIGJvbmQgbnVtYmVyXG4gICAgICBpbmRleCA9IHYzS01vbGZpbGUuaW5kZXhPZignVjMwJywgaW5kZXgpICsgNDtcbiAgICAgIGluZGV4RW5kID0gdjNLTW9sZmlsZS5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgYm9uZE51bWJlciA9IHBhcnNlSW50KHYzS01vbGZpbGUuc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpO1xuXG4gICAgICBpZiAoYm9uZE51bWJlciA9PT0gcmVtQm9uZEZpcnN0IHx8IGJvbmROdW1iZXIgPT09IHJlbUJvbmRMYXN0KSB7XG4gICAgICAgIGluZGV4RW5kID0gdjNLTW9sZmlsZS5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxO1xuICAgICAgICBpbmRleCAtPTc7XG4gICAgICAgIHYzS01vbGZpbGUgPSB2M0tNb2xmaWxlLnNsaWNlKDAsIGluZGV4KSArIHYzS01vbGZpbGUuc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYm9uZE51bWJlciA9IChib25kTnVtYmVyID4gcmVtQm9uZEZpcnN0ICYmIGJvbmROdW1iZXIgPiByZW1Cb25kTGFzdCkgPyBib25kTnVtYmVyIC0gMiA6XG4gICAgICAgIChib25kTnVtYmVyID4gcmVtQm9uZEZpcnN0IHx8IGJvbmROdW1iZXIgPiByZW1Cb25kTGFzdCkgPyBib25kTnVtYmVyIC0gMSA6IGJvbmROdW1iZXI7XG4gICAgICBib25kTnVtYmVyICs9IGJvbmRDb3VudDtcblxuICAgICAgdjNLTW9sZmlsZSA9IHYzS01vbGZpbGUuc2xpY2UoMCwgaW5kZXgpICsgYm9uZE51bWJlciArIHYzS01vbGZpbGUuc2xpY2UoaW5kZXhFbmQpO1xuXG4gICAgICAvL3Jld3JpdGUgYXRvbSBwYWlyIGluIGJvbmRcbiAgICAgIGluZGV4ID0gdjNLTW9sZmlsZS5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgIGluZGV4ID0gdjNLTW9sZmlsZS5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgIGluZGV4RW5kID0gdjNLTW9sZmlsZS5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgbGV0IGF0b21OdW1iZXIgPSBwYXJzZUludCh2M0tNb2xmaWxlLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKTtcbiAgICAgIGF0b21OdW1iZXIgPSAoYXRvbU51bWJlciA+IHJlbUZpcnN0ICYmIGF0b21OdW1iZXIgPiByZW1MYXN0KSA/IGF0b21OdW1iZXIgLSAyIDpcbiAgICAgICAgKGF0b21OdW1iZXIgPiByZW1GaXJzdCB8fCBhdG9tTnVtYmVyID4gcmVtTGFzdCkgPyBhdG9tTnVtYmVyIC0gMSA6IGF0b21OdW1iZXI7XG4gICAgICBhdG9tTnVtYmVyICs9IGF0b21Db3VudDtcbiAgICAgIHYzS01vbGZpbGUgPSB2M0tNb2xmaWxlLnNsaWNlKDAsIGluZGV4KSArIGF0b21OdW1iZXIgKyB2M0tNb2xmaWxlLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgIGluZGV4ID0gdjNLTW9sZmlsZS5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgIGluZGV4RW5kID0gTWF0aC5taW4odjNLTW9sZmlsZS5pbmRleE9mKCdcXG4nLCBpbmRleCksIHYzS01vbGZpbGUuaW5kZXhPZignICcsIGluZGV4KSk7XG4gICAgICBhdG9tTnVtYmVyID0gcGFyc2VJbnQodjNLTW9sZmlsZS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSk7XG4gICAgICBhdG9tTnVtYmVyID0gKGF0b21OdW1iZXIgPiByZW1GaXJzdCAmJiBhdG9tTnVtYmVyID4gcmVtTGFzdCkgPyBhdG9tTnVtYmVyIC0gMiA6XG4gICAgICAgIChhdG9tTnVtYmVyID4gcmVtRmlyc3QgfHwgYXRvbU51bWJlciA+IHJlbUxhc3QpID8gYXRvbU51bWJlciAtIDEgOiBhdG9tTnVtYmVyO1xuICAgICAgYXRvbU51bWJlciArPSBhdG9tQ291bnQ7XG4gICAgICB2M0tNb2xmaWxlID0gdjNLTW9sZmlsZS5zbGljZSgwLCBpbmRleCkgKyBhdG9tTnVtYmVyICsgdjNLTW9sZmlsZS5zbGljZShpbmRleEVuZCk7XG5cbiAgICAgIGluZGV4ID0gdjNLTW9sZmlsZS5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4Qm9uZEVuZCA9IHYzS01vbGZpbGUuaW5kZXhPZignTSAgVjMwIEVORCBCT05EJyk7XG4gICAgYm9uZEJsb2NrICs9IHYzS01vbGZpbGUuc3Vic3RyaW5nKGluZGV4Qm9uZHMgKyAxLCBpbmRleEJvbmRFbmQpO1xuICAgIC8vbGV0IGluZGV4Q29sbGVjdGlvbiA9IHYzS01vbGZpbGUuaW5kZXhPZignTSAgVjMwIE1ETFYzMC9TVEVBQlMgQVRPTVM9KCcpOyAvLyBWMzAwMCBpbmRleCBmb3IgY29sbGVjdGlvbnNcblxuICAgIC8vIHdoaWxlIChpbmRleENvbGxlY3Rpb24gIT0gLTEpIHtcbiAgICAvLyAgIGluZGV4Q29sbGVjdGlvbiArPSAyODtcbiAgICAvLyAgIGNvbnN0IGNvbGxlY3Rpb25FbmQgPSB2M0tNb2xmaWxlLmluZGV4T2YoJyknLCBpbmRleENvbGxlY3Rpb24pO1xuICAgIC8vICAgY29uc3QgY29sbGVjdGlvbkVudHJpZXMgPSB2M0tNb2xmaWxlLnN1YnN0cmluZyhpbmRleENvbGxlY3Rpb24sIGNvbGxlY3Rpb25FbmQpLnNwbGl0KCcgJykuc2xpY2UoMSk7XG4gICAgLy8gICBjb2xsZWN0aW9uRW50cmllcy5mb3JFYWNoKChlOiBzdHJpbmcpID0+IHtcbiAgICAvLyAgICAgY29sbGVjdGlvbi5wdXNoKHBhcnNlSW50KGUpICsgYXRvbUNvdW50KTtcbiAgICAvLyAgIH0pO1xuICAgIC8vICAgaW5kZXhDb2xsZWN0aW9uID0gY29sbGVjdGlvbkVuZDtcbiAgICAvLyAgIGluZGV4Q29sbGVjdGlvbiA9IHYzS01vbGZpbGUuaW5kZXhPZignTSAgVjMwIE1ETFYzMC9TVEVBQlMgQVRPTVM9KCcsIGluZGV4Q29sbGVjdGlvbik7XG4gICAgLy8gfVxuXG4gICAgYXRvbUNvdW50ICs9IG51bWJlcnMuYXRvbUNvdW50IC0gMjtcbiAgICBib25kQ291bnQgKz0gbnVtYmVycy5ib25kQ291bnQgLSAyO1xuICAgIHhTaGlmdCArPSBjb29yZGluYXRlcy54W2xhc3RdIC0gY29vcmRpbmF0ZXMueFtmaXJzdF0gKyAxO1xuXG4gICAgaWYgKGkgPT09IG1vbm9tZXJzLmxlbmd0aCAtMSkge1xuICAgICAgYXRvbUNvdW50Kys7XG4gICAgICBjb25zdCBzaGlmdCA9IHhTaGlmdCArIDAuMjtcbiAgICAgIGF0b21CbG9jayArPSAnTSAgVjMwICcgKyBhdG9tQ291bnQgKyAnIE8gJyArIHNoaWZ0ICsgJyAwIDAuMDAwMDAwIDBcXG4nO1xuICAgIH1cbiAgICBib25kQ291bnQrKztcbiAgICBpZiAoaSA9PT0gbW9ub21lcnMubGVuZ3RoIC0xKSB7XG4gICAgICBjb25zdCByaWdodFRlcm1pbmFsID0gKGxhc3QgPiByZW1GaXJzdCAmJiBsYXN0ID4gcmVtTGFzdCkgPyBsYXN0ICsgYXRvbUNvdW50IC0gKG51bWJlcnMuYXRvbUNvdW50IC0gMikgLSAzOlxuICAgICAgICAobGFzdCA+IHJlbUZpcnN0IHx8IGxhc3QgPiByZW1MYXN0KSA/IGxhc3QgKyBhdG9tQ291bnQgLSAobnVtYmVycy5hdG9tQ291bnQgLSAyKSAtIDIgOlxuICAgICAgICAgIGxhc3QgKyBhdG9tQ291bnQgLSAobnVtYmVycy5hdG9tQ291bnQgLSAyKSAtIDE7XG4gICAgICBib25kQmxvY2sgKz0gJ00gIFYzMCAnICsgYm9uZENvdW50ICsgJyAxICcgKyByaWdodFRlcm1pbmFsICsgJyAnICsgYXRvbUNvdW50ICsgJ1xcbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJpZ2h0VGVybWluYWwgPSAobGFzdCA+IHJlbUZpcnN0ICYmIGxhc3QgPiByZW1MYXN0KSA/IGxhc3QgKyBhdG9tQ291bnQgLSAobnVtYmVycy5hdG9tQ291bnQgLSAyKSAtIDI6XG4gICAgICAgIChsYXN0ID4gcmVtRmlyc3QgfHwgbGFzdCA+IHJlbUxhc3QpID8gbGFzdCArIGF0b21Db3VudCAtIChudW1iZXJzLmF0b21Db3VudCAtIDIpIC0gMSA6XG4gICAgICAgICAgbGFzdCArIGF0b21Db3VudCAtIChudW1iZXJzLmF0b21Db3VudCAtIDIpO1xuXG4gICAgICBjb25zdCBuZXh0ID0gbW9ub21lcnNbaSArIDFdWydpbmRpY2VzJ107XG4gICAgICBjb25zdCBuZXh0Rmlyc3QgPSBuZXh0WydmaXJzdCddO1xuICAgICAgY29uc3QgbmV4dFJlbUZpcnN0ID0gbmV4dFsncmVtRmlyc3QnXTtcbiAgICAgIGNvbnN0IG5leHRSZW1MYXN0ID0gbmV4dFsncmVtTGFzdCddO1xuXG4gICAgICBjb25zdCBsZWZ0VGVybWluYWwgPSAobmV4dEZpcnN0ID4gbmV4dFJlbUZpcnN0ICYmIG5leHRGaXJzdCA+IG5leHRSZW1MYXN0KSA/IG5leHRGaXJzdCArIGF0b21Db3VudCAtIDIgOlxuICAgICAgICAobmV4dEZpcnN0ID4gbmV4dFJlbUZpcnN0IHx8IG5leHRGaXJzdCA+IG5leHRSZW1MYXN0KSA/IG5leHRGaXJzdCArIGF0b21Db3VudCAtIDEgOlxuICAgICAgICAgIG5leHRGaXJzdCArIGF0b21Db3VudDtcblxuICAgICAgYm9uZEJsb2NrICs9ICdNICBWMzAgJyArIGJvbmRDb3VudCArICcgMSAnICsgcmlnaHRUZXJtaW5hbCArICcgJyArIGxlZnRUZXJtaW5hbCArICdcXG4nO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNvbnN0IGVudHJpZXMgPSA0O1xuICAvLyBjb25zdCBjb2xsTnVtYmVyID0gTWF0aC5jZWlsKGNvbGxlY3Rpb24ubGVuZ3RoIC8gZW50cmllcyk7XG4gIC8vIGNvbGxlY3Rpb25CbG9jayArPSAnTSAgVjMwIE1ETFYzMC9TVEVBQlMgQVRPTVM9KCcgKyBjb2xsZWN0aW9uLmxlbmd0aCArICcgLVxcbic7XG4gIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgY29sbE51bWJlcjsgaSsrKSB7XG4gIC8vICAgY29sbGVjdGlvbkJsb2NrICs9ICdNICBWMzAgJztcbiAgLy8gICBjb25zdCBlbnRyaWVzQ3VycmVudCA9IGkgKyAxID09PSBjb2xsTnVtYmVyID8gY29sbGVjdGlvbi5sZW5ndGggLSAoY29sbE51bWJlciAtIDEpKmVudHJpZXMgOiBlbnRyaWVzO1xuICAvLyAgIGZvciAobGV0IGogPSAwOyBqIDwgZW50cmllc0N1cnJlbnQ7IGorKykge1xuICAvLyAgICAgY29sbGVjdGlvbkJsb2NrICs9IChqICsgMSA9PT0gZW50cmllc0N1cnJlbnQpID9cbiAgLy8gICAgICAgKGkgPT09IGNvbGxOdW1iZXIgLSAxID8gY29sbGVjdGlvbltlbnRyaWVzKmkgKyBqXSArICcpXFxuJyA6IGNvbGxlY3Rpb25bZW50cmllcyppICsgal0gKyAnIC1cXG4nKSA6XG4gIC8vICAgICAgIGNvbGxlY3Rpb25bZW50cmllcyppICsgal0gKyAnICc7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgLy9nZW5lcmF0ZSBmaWxlXG4gIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBDT1VOVFMgJyArIGF0b21Db3VudCArICcgJyArIGJvbmRDb3VudCArICcgMCAwIDBcXG4nO1xuICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQVRPTVxcbic7XG4gIG1hY3JvTW9sQmxvY2sgKz0gYXRvbUJsb2NrO1xuICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgRU5EIEFUT01cXG4nO1xuICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQk9ORFxcbic7XG4gIG1hY3JvTW9sQmxvY2sgKz0gYm9uZEJsb2NrO1xuICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgRU5EIEJPTkRcXG4nO1xuICAvL21hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBCRUdJTiBDT0xMRUNUSU9OXFxuJztcbiAgLy9tYWNyb01vbEJsb2NrICs9IGNvbGxlY3Rpb25CbG9jaztcbiAgLy9tYWNyb01vbEJsb2NrICs9ICdNICBWMzAgRU5EIENPTExFQ1RJT05cXG4nO1xuICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgRU5EIENUQUJcXG4nO1xuICBtYWNyb01vbEJsb2NrICs9ICdNICBFTkRcXG4nO1xuXG4gIHJldHVybiBtYWNyb01vbEJsb2NrO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TWFjcm9Nb2wobW9ub21lcnM6IGFueVtdW10pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgbW9kdWxlUmRraXQgPSBhd2FpdCBncm9rLmZ1bmN0aW9ucy5jYWxsKCdDaGVtOmdldFJkS2l0TW9kdWxlJyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbW9ub21lcnMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG1vbm9tZXJzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCBtb2xPYmogPSBtb2R1bGVSZGtpdC5nZXRfbW9sKG1vbm9tZXJzW2ldW2pdWydtb2xmaWxlJ10pO1xuICAgICAgY29uc3QgdjNLTW9sYmxvY2sgPSBtb2xPYmouZ2V0X3YzS21vbGJsb2NrKCk7XG4gICAgICBjb25zdCBpbmRpY2VzID0gZ2V0SW5kaWNlcyhtb25vbWVyc1tpXVtqXVsnbW9sZmlsZSddLCB2M0tNb2xibG9jayk7XG4gICAgICBtb25vbWVyc1tpXVtqXVsnaW5kaWNlcyddID0gaW5kaWNlcztcblxuICAgICAgLy8gYSBuZXcgbW9sZmlsZSBmb3IgJ3JvdGF0ZWQnIGlzIG9idGFpbmVkIGluIHYzayBmb3JtYXRcbiAgICAgIG1vbm9tZXJzW2ldW2pdWydtb2xmaWxlJ10gPSBhd2FpdCByb3RhdGVCYWNrYm9uZVYzSyh2M0tNb2xibG9jaywgaW5kaWNlcyk7XG4gICAgICAvLyBtb25vbWVyc1tpXVtqXVsnbW9sZmlsZSddID0gdjNLTW9sYmxvY2s7XG4gICAgICBtb2xPYmo/LmRlbGV0ZSgpO1xuICAgIH1cbiAgICAvLyBzZWVtaW5nbHksIGF0IHRoaXMgc3RhZ2UgdGhlIGJvbmQgaXMgcmVjb25zdHJ1Y3RlZFxuICAgIHJlc3VsdC5wdXNoKGxpbmtWM0sobW9ub21lcnNbaV0pKTtcbiAgICAvLyByZXN1bHQucHVzaChtb25vbWVyc1tpXVswXVsnbW9sZmlsZSddKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"cell-renderer.d.ts","sourceRoot":"","sources":["cell-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAStC,oBAAY,SAAS;IACnB,GAAG,QAAQ;IACX,OAAO,YAAY;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAC1C,CAAC,EAAE,wBAAwB,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,MAAuB,EACtE,KAAK,GAAE,MAAU,EAAE,IAAI,UAAQ,EAAE,gBAAgB,GAAE,MAAY,EAC/D,SAAS,GAAE,MAAW,EAAE,IAAI,GAAE,OAAe,EAAE,SAAS,GAAE,SAA6B,EAAE,OAAO,GAAE;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAO,EAAE,OAAO,GAAE,MAAU,EAAE,QAAQ,GAAE,EAAE,CAAC,QAAQ,GAAG,IAAW,EAAE,iBAAiB,GAAE,MAAM,EAAO,EAAE,kBAAkB,GAAE,MAAM,GAAG,IAAW,GAAG,MAAM,CA0DlR"}
1
+ {"version":3,"file":"cell-renderer.d.ts","sourceRoot":"","sources":["cell-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAStC,oBAAY,SAAS;IACnB,GAAG,QAAQ;IACX,OAAO,YAAY;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAC1C,CAAC,EAAE,wBAAwB,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,MAAuB,EACtE,KAAK,GAAE,MAAU,EAAE,IAAI,UAAQ,EAAE,gBAAgB,GAAE,MAAY,EAC/D,SAAS,GAAE,MAAW,EAAE,IAAI,GAAE,OAAe,EAAE,SAAS,GAAE,SAA6B,EAAE,OAAO,GAAE;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAO,EAAE,OAAO,GAAE,MAAU,EAAE,QAAQ,GAAE,EAAE,CAAC,QAAQ,GAAG,IAAW,EAAE,iBAAiB,GAAE,MAAM,EAAO,EAAE,kBAAkB,GAAE,MAAM,GAAG,IAAW,GAAG,MAAM,CAgElR"}
@@ -32,7 +32,7 @@ export var DrawStyle;
32
32
  * @return {number} x coordinate to start printing at.
33
33
  */
34
34
  export function printLeftOrCentered(x, y, w, h, g, s, color = undefinedColor, pivot = 0, left = false, transparencyRate = 1.0, separator = '', last = false, drawStyle = DrawStyle.classic, maxWord = {}, wordIdx = 0, gridCell = null, referenceSequence = [], maxLengthOfMonomer = null) {
35
- var _a, _b;
35
+ var _a, _b, _c;
36
36
  g.textAlign = 'start';
37
37
  let colorPart = s.substring(0);
38
38
  let grayPart = last ? '' : separator;
@@ -41,14 +41,19 @@ export function printLeftOrCentered(x, y, w, h, g, s, color = undefinedColor, pi
41
41
  }
42
42
  let colorCode = true;
43
43
  let compareWithCurrent = true;
44
- if (gridCell != null) {
45
- colorCode = (((_a = gridCell.cell.column) === null || _a === void 0 ? void 0 : _a.temp['color-code']) != null) ? gridCell.cell.column.temp['color-code'] : true;
46
- compareWithCurrent = (((_b = gridCell.cell.column) === null || _b === void 0 ? void 0 : _b.temp['compare-with-current']) != null) ? gridCell.cell.column.temp['compare-with-current'] : true;
44
+ let highlightDifference = 'difference';
45
+ if ((gridCell != null) && (gridCell.cell.column != null)) {
46
+ colorCode = (_a = gridCell.cell.column.temp['color-code']) !== null && _a !== void 0 ? _a : true;
47
+ compareWithCurrent = (_b = gridCell.cell.column.temp['compare-with-current']) !== null && _b !== void 0 ? _b : true;
48
+ highlightDifference = (_c = gridCell.cell.column.temp['highlight-difference']) !== null && _c !== void 0 ? _c : 'difference';
47
49
  }
48
50
  const currentMonomer = referenceSequence[wordIdx];
49
- if (compareWithCurrent && (referenceSequence.length > 0)) {
51
+ if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'difference')) {
50
52
  transparencyRate = (colorPart == currentMonomer) ? 0.3 : transparencyRate;
51
53
  }
54
+ if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'equal')) {
55
+ transparencyRate = (colorPart != currentMonomer) ? 0.3 : transparencyRate;
56
+ }
52
57
  if (maxLengthOfMonomer != null) {
53
58
  colorPart = monomerToShortFunction(colorPart, maxLengthOfMonomer);
54
59
  }
@@ -86,4 +91,4 @@ export function printLeftOrCentered(x, y, w, h, g, s, color = undefinedColor, pi
86
91
  return x + dx + maxColorTextSize;
87
92
  }
88
93
  }
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC1yZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNlbGwtcmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFDO0FBQzFDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUM1QixNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUM7QUFDaEMsTUFBTSxzQkFBc0IsR0FBMEQsY0FBYyxDQUFDO0FBRXJHLE1BQU0sQ0FBTixJQUFZLFNBR1g7QUFIRCxXQUFZLFNBQVM7SUFDbkIsd0JBQVcsQ0FBQTtJQUNYLGdDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFIVyxTQUFTLEtBQVQsU0FBUyxRQUdwQjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQzFDLENBQTJCLEVBQUUsQ0FBUyxFQUFFLFFBQWdCLGNBQWMsRUFDdEUsUUFBZ0IsQ0FBQyxFQUFFLElBQUksR0FBRyxLQUFLLEVBQUUsbUJBQTJCLEdBQUcsRUFDL0QsWUFBb0IsRUFBRSxFQUFFLE9BQWdCLEtBQUssRUFBRSxZQUF1QixTQUFTLENBQUMsT0FBTyxFQUFFLFVBQXVDLEVBQUUsRUFBRSxVQUFrQixDQUFDLEVBQUUsV0FBK0IsSUFBSSxFQUFFLG9CQUE4QixFQUFFLEVBQUUscUJBQW9DLElBQUk7O0lBQ3hRLENBQUMsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO0lBQ3RCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNyQyxJQUFJLFNBQVMs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U0FBUyxHQUFHLFNBQVMsQ0FBQztZQUN4QixDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQ25GO0lBQ0gsQ0FBQztJQUVELElBQUksSUFBSSxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUU7UUFDeEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQztRQUN4QyxPQUFPLENBQUMsR0FBRyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQztLQUU3RDtTQUFNO1FBQ0wsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLGdCQUFnQixDQUFDLENBQUM7UUFDaEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLGdCQUFnQixDQUFDO0tBQ2xDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmltcG9ydCB7bW9ub21lclRvU2hvcnR9IGZyb20gJy4vbWFjcm9tb2xlY3VsZSc7XG5cbmNvbnN0IHVuZGVmaW5lZENvbG9yID0gJ3JnYigxMDAsMTAwLDEwMCknO1xuY29uc3QgZ3JheUNvbG9yID0gJyM4MDgwODAnO1xuY29uc3QgYmxhY2tDb2xvciA9ICdyZ2IoMCwwLDApJztcbmNvbnN0IG1vbm9tZXJUb1Nob3J0RnVuY3Rpb246IChhbWlubzogc3RyaW5nLCBtYXhMZW5ndGhPZk1vbm9tZXI6IG51bWJlcikgPT4gc3RyaW5nID0gbW9ub21lclRvU2hvcnQ7XG5cbmV4cG9ydCBlbnVtIERyYXdTdHlsZSB7XG4gIE1TQSA9ICdNU0EnLFxuICBjbGFzc2ljID0gJ2NsYXNzaWMnLFxufVxuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBwcmludHMgYSBzdHJpbmcgYWxpZ25lZCB0byBsZWZ0IG9yIGNlbnRlcmVkLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IHggY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB5IHkgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB3IFdpZHRoLlxuICogQHBhcmFtIHtudW1iZXJ9IGggSGVpZ2h0LlxuICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGcgQ2FudmFzIHJlbmRlcmluZyBjb250ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IHMgU3RyaW5nIHRvIHByaW50LlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvcj11bmRlZmluZWRDb2xvcl0gU3RyaW5nIGNvbG9yLlxuICogQHBhcmFtIHtudW1iZXJ9IFtwaXZvdD0wXSBQaXJ2b3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtsZWZ0PWZhbHNlXSBJcyBsZWZ0IGFsaWduZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gW3RyYW5zcGFyZW5jeVJhdGU9MC4wXSBUcmFuc3BhcmVuY3kgcmF0ZSB3aGVyZSAxLjAgaXMgZnVsbHkgdHJhbnNwYXJlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPScnXSBJcyBzZXBhcmF0b3IgZm9yIHNlcXVlbmNlLlxuICogQHBhcmFtIHtib29sZWFufSBbbGFzdD1mYWxzZV0gSXMgY2hlY2tlciBpZiBlbGVtZW50IGxhc3Qgb3Igbm90LlxuICogQHBhcmFtIGRyYXdTdHlsZSBJcyBkcmF3IHN0eWxlLiBNU0EgLSBmb3IgbXVsdGljaGFyU2VxLCBjbGFzc2ljIC0gZm9yIG90aGVyIHNlcS5cbiAqIEBwYXJhbSBtYXhXb3JkIElzIGFycmF5IG9mIG1heCB3b3JkcyBmb3IgZWFjaCBsaW5lLlxuICogQHBhcmFtIHdvcmRJZHggSXMgaW5kZXggb2Ygd29yZCB3ZSBjdXJyZW50bHkgZHJhdy5cbiAqIEBwYXJhbSBncmlkQ2VsbCBJcyBncmlkIGNlbGwuXG4gKiBAcGFyYW0gcmVmZXJlbmNlU2VxdWVuY2UgSXMgcmVmZXJlbmNlIHNlcXVlbmNlIGZvciBkaWZmIG1vZGUuXG4gKiBAcGFyYW0gbWF4TGVuZ3RoT2ZNb25vbWVyIElzIG1heCBsZW5ndGggb2YgbW9ub21lci5cbiAqIEByZXR1cm4ge251bWJlcn0geCBjb29yZGluYXRlIHRvIHN0YXJ0IHByaW50aW5nIGF0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRMZWZ0T3JDZW50ZXJlZChcbiAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICBnOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHM6IHN0cmluZywgY29sb3I6IHN0cmluZyA9IHVuZGVmaW5lZENvbG9yLFxuICBwaXZvdDogbnVtYmVyID0gMCwgbGVmdCA9IGZhbHNlLCB0cmFuc3BhcmVuY3lSYXRlOiBudW1iZXIgPSAxLjAsXG4gIHNlcGFyYXRvcjogc3RyaW5nID0gJycsIGxhc3Q6IGJvb2xlYW4gPSBmYWxzZSwgZHJhd1N0eWxlOiBEcmF3U3R5bGUgPSBEcmF3U3R5bGUuY2xhc3NpYywgbWF4V29yZDogeyBbaW5kZXg6IHN0cmluZ106IG51bWJlciB9ID0ge30sIHdvcmRJZHg6IG51bWJlciA9IDAsIGdyaWRDZWxsOiBERy5HcmlkQ2VsbCB8IG51bGwgPSBudWxsLCByZWZlcmVuY2VTZXF1ZW5jZTogc3RyaW5nW10gPSBbXSwgbWF4TGVuZ3RoT2ZNb25vbWVyOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IG51bWJlciB7XG4gIGcudGV4dEFsaWduID0gJ3N0YXJ0JztcbiAgbGV0IGNvbG9yUGFydCA9IHMuc3Vic3RyaW5nKDApO1xuICBsZXQgZ3JheVBhcnQgPSBsYXN0ID8gJycgOiBzZXBhcmF0b3I7XG4gIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICBncmF5UGFydCA9ICcnO1xuICB9XG4gIGxldCBjb2xvckNvZGUgPSB0cnVlO1xuICBsZXQgY29tcGFyZVdpdGhDdXJyZW50ID0gdHJ1ZTtcbiAgaWYgKGdyaWRDZWxsICE9IG51bGwpIHtcbiAgICBjb2xvckNvZGUgPSAoZ3JpZENlbGwuY2VsbC5jb2x1bW4/LnRlbXBbJ2NvbG9yLWNvZGUnXSAhPSBudWxsKSA/IGdyaWRDZWxsLmNlbGwuY29sdW1uLnRlbXBbJ2NvbG9yLWNvZGUnXSA6IHRydWU7XG4gICAgY29tcGFyZVdpdGhDdXJyZW50ID0gKGdyaWRDZWxsLmNlbGwuY29sdW1uPy50ZW1wWydjb21wYXJlLXdpdGgtY3VycmVudCddICE9IG51bGwpID8gZ3JpZENlbGwuY2VsbC5jb2x1bW4udGVtcFsnY29tcGFyZS13aXRoLWN1cnJlbnQnXSA6IHRydWU7XG4gIH1cbiAgY29uc3QgY3VycmVudE1vbm9tZXI6IHN0cmluZyA9IHJlZmVyZW5jZVNlcXVlbmNlW3dvcmRJZHhdO1xuICBpZiAoY29tcGFyZVdpdGhDdXJyZW50ICYmIChyZWZlcmVuY2VTZXF1ZW5jZS5sZW5ndGggPiAwKSkge1xuICAgIHRyYW5zcGFyZW5jeVJhdGUgPSAoY29sb3JQYXJ0ID09IGN1cnJlbnRNb25vbWVyKSA/IDAuMyA6IHRyYW5zcGFyZW5jeVJhdGU7XG4gIH1cbiAgaWYgKG1heExlbmd0aE9mTW9ub21lciAhPSBudWxsKSB7XG4gICAgY29sb3JQYXJ0ID0gbW9ub21lclRvU2hvcnRGdW5jdGlvbihjb2xvclBhcnQsIG1heExlbmd0aE9mTW9ub21lcik7XG4gIH1cblxuXG4gIGxldCB0ZXh0U2l6ZTogYW55ID0gZy5tZWFzdXJlVGV4dChjb2xvclBhcnQgKyBncmF5UGFydCk7XG4gIGNvbnN0IGluZGVudCA9IDU7XG5cbiAgbGV0IG1heENvbG9yVGV4dFNpemUgPSBnLm1lYXN1cmVUZXh0KGNvbG9yUGFydCkud2lkdGg7XG4gIGxldCBjb2xvclRleHRTaXplID0gZy5tZWFzdXJlVGV4dChjb2xvclBhcnQpLndpZHRoO1xuICBjb25zdCBkeSA9ICh0ZXh0U2l6ZS5mb250Qm91bmRpbmdCb3hBc2NlbnQgKyB0ZXh0U2l6ZS5mb250Qm91bmRpbmdCb3hEZXNjZW50KSAvIDI7XG4gIHRleHRTaXplID0gdGV4dFNpemUud2lkdGg7XG4gIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICBtYXhDb2xvclRleHRTaXplID0gbWF4V29yZFt3b3JkSWR4XTtcbiAgICB0ZXh0U2l6ZSA9IG1heFdvcmRbd29yZElkeF07XG4gIH1cblxuICBmdW5jdGlvbiBkcmF3KGR4MTogbnVtYmVyLCBkeDI6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGRyYXdDb2xvciA9IGNvbG9yQ29kZSA/IGNvbG9yIDogYmxhY2tDb2xvcjtcbiAgICBnLmZpbGxTdHlsZSA9IGRyYXdDb2xvcjtcbiAgICBnLmdsb2JhbEFscGhhID0gdHJhbnNwYXJlbmN5UmF0ZTtcbiAgICBpZiAoZHJhd1N0eWxlID09PSBEcmF3U3R5bGUuY2xhc3NpYykge1xuICAgICAgZy5maWxsVGV4dChjb2xvclBhcnQsIHggKyBkeDEsIHkgKyBkeSk7XG4gICAgICBnLmZpbGxTdHlsZSA9IGdyYXlDb2xvcjtcbiAgICAgIGcuZmlsbFRleHQoZ3JheVBhcnQsIHggKyBkeDIsIHkgKyBkeSk7XG4gICAgfVxuICAgIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICAgIGcuZmlsbFN0eWxlID0gZHJhd0NvbG9yO1xuICAgICAgZy5maWxsVGV4dChjb2xvclBhcnQsIHggKyBkeDEgKyAoKG1heFdvcmRbd29yZElkeF0gLSBjb2xvclRleHRTaXplKSAvIDIpLCB5ICsgZHkpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChsZWZ0IHx8IHRleHRTaXplID4gdykge1xuICAgIGRyYXcoaW5kZW50LCBpbmRlbnQgKyBtYXhDb2xvclRleHRTaXplKTtcbiAgICByZXR1cm4geCArIG1heENvbG9yVGV4dFNpemUgKyBnLm1lYXN1cmVUZXh0KGdyYXlQYXJ0KS53aWR0aDtcblxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGR4ID0gKHcgLSB0ZXh0U2l6ZSkgLyAyO1xuICAgIGRyYXcoZHgsIGR4ICsgbWF4Q29sb3JUZXh0U2l6ZSk7XG4gICAgcmV0dXJuIHggKyBkeCArIG1heENvbG9yVGV4dFNpemU7XG4gIH1cbn1cblxuIl19
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC1yZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNlbGwtcmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFDO0FBQzFDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUM1QixNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUM7QUFDaEMsTUFBTSxzQkFBc0IsR0FBMEQsY0FBYyxDQUFDO0FBRXJHLE1BQU0sQ0FBTixJQUFZLFNBR1g7QUFIRCxXQUFZLFNBQVM7SUFDbkIsd0JBQVcsQ0FBQTtJQUNYLGdDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFIVyxTQUFTLEtBQVQsU0FBUyxRQUdwQjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQzFDLENBQTJCLEVBQUUsQ0FBUyxFQUFFLFFBQWdCLGNBQWMsRUFDdEUsUUFBZ0IsQ0FBQyxFQUFFLElBQUksR0FBRyxLQUFLLEVBQUUsbUJBQTJCLEdBQUcsRUFDL0QsWUFBb0IsRUFBRSxFQUFFLE9BQWdCLEtBQUssRUFBRSxZQUF1QixTQUFTLENBQUMsT0FBTyxFQUFFLFVBQXVDLEVBQUUsRUFBRSxVQUFrQixDQUFDLEVBQUUsV0FBK0IsSUFBSSxFQUFFLG9CQUE4QixFQUFFLEVBQUUscUJBQW9DLElBQUk7O0lBQ3hRLENBQUMsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO0lBQ3RCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNyQyxJQUFJLFNBQVMs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RSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDdkMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDeEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDdkM7UUFDRCxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQy9CLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDbkY7SUFDSCxDQUFDO0lBRUQsSUFBSSxJQUFJLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRTtRQUN4QixJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxHQUFHLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDO0tBRTdEO1NBQU07UUFDTCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQztRQUNoQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsZ0JBQWdCLENBQUM7S0FDbEM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcblxuaW1wb3J0IHttb25vbWVyVG9TaG9ydH0gZnJvbSAnLi9tYWNyb21vbGVjdWxlJztcblxuY29uc3QgdW5kZWZpbmVkQ29sb3IgPSAncmdiKDEwMCwxMDAsMTAwKSc7XG5jb25zdCBncmF5Q29sb3IgPSAnIzgwODA4MCc7XG5jb25zdCBibGFja0NvbG9yID0gJ3JnYigwLDAsMCknO1xuY29uc3QgbW9ub21lclRvU2hvcnRGdW5jdGlvbjogKGFtaW5vOiBzdHJpbmcsIG1heExlbmd0aE9mTW9ub21lcjogbnVtYmVyKSA9PiBzdHJpbmcgPSBtb25vbWVyVG9TaG9ydDtcblxuZXhwb3J0IGVudW0gRHJhd1N0eWxlIHtcbiAgTVNBID0gJ01TQScsXG4gIGNsYXNzaWMgPSAnY2xhc3NpYycsXG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHByaW50cyBhIHN0cmluZyBhbGlnbmVkIHRvIGxlZnQgb3IgY2VudGVyZWQuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHggeCBjb29yZGluYXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IHkgeSBjb29yZGluYXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IHcgV2lkdGguXG4gKiBAcGFyYW0ge251bWJlcn0gaCBIZWlnaHQuXG4gKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gZyBDYW52YXMgcmVuZGVyaW5nIGNvbnRleHQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcyBTdHJpbmcgdG8gcHJpbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yPXVuZGVmaW5lZENvbG9yXSBTdHJpbmcgY29sb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gW3Bpdm90PTBdIFBpcnZvdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2xlZnQ9ZmFsc2VdIElzIGxlZnQgYWxpZ25lZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbdHJhbnNwYXJlbmN5UmF0ZT0wLjBdIFRyYW5zcGFyZW5jeSByYXRlIHdoZXJlIDEuMCBpcyBmdWxseSB0cmFuc3BhcmVudFxuICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9JyddIElzIHNlcGFyYXRvciBmb3Igc2VxdWVuY2UuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtsYXN0PWZhbHNlXSBJcyBjaGVja2VyIGlmIGVsZW1lbnQgbGFzdCBvciBub3QuXG4gKiBAcGFyYW0gZHJhd1N0eWxlIElzIGRyYXcgc3R5bGUuIE1TQSAtIGZvciBtdWx0aWNoYXJTZXEsIGNsYXNzaWMgLSBmb3Igb3RoZXIgc2VxLlxuICogQHBhcmFtIG1heFdvcmQgSXMgYXJyYXkgb2YgbWF4IHdvcmRzIGZvciBlYWNoIGxpbmUuXG4gKiBAcGFyYW0gd29yZElkeCBJcyBpbmRleCBvZiB3b3JkIHdlIGN1cnJlbnRseSBkcmF3LlxuICogQHBhcmFtIGdyaWRDZWxsIElzIGdyaWQgY2VsbC5cbiAqIEBwYXJhbSByZWZlcmVuY2VTZXF1ZW5jZSBJcyByZWZlcmVuY2Ugc2VxdWVuY2UgZm9yIGRpZmYgbW9kZS5cbiAqIEBwYXJhbSBtYXhMZW5ndGhPZk1vbm9tZXIgSXMgbWF4IGxlbmd0aCBvZiBtb25vbWVyLlxuICogQHJldHVybiB7bnVtYmVyfSB4IGNvb3JkaW5hdGUgdG8gc3RhcnQgcHJpbnRpbmcgYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmludExlZnRPckNlbnRlcmVkKFxuICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIsXG4gIGc6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgczogc3RyaW5nLCBjb2xvcjogc3RyaW5nID0gdW5kZWZpbmVkQ29sb3IsXG4gIHBpdm90OiBudW1iZXIgPSAwLCBsZWZ0ID0gZmFsc2UsIHRyYW5zcGFyZW5jeVJhdGU6IG51bWJlciA9IDEuMCxcbiAgc2VwYXJhdG9yOiBzdHJpbmcgPSAnJywgbGFzdDogYm9vbGVhbiA9IGZhbHNlLCBkcmF3U3R5bGU6IERyYXdTdHlsZSA9IERyYXdTdHlsZS5jbGFzc2ljLCBtYXhXb3JkOiB7IFtpbmRleDogc3RyaW5nXTogbnVtYmVyIH0gPSB7fSwgd29yZElkeDogbnVtYmVyID0gMCwgZ3JpZENlbGw6IERHLkdyaWRDZWxsIHwgbnVsbCA9IG51bGwsIHJlZmVyZW5jZVNlcXVlbmNlOiBzdHJpbmdbXSA9IFtdLCBtYXhMZW5ndGhPZk1vbm9tZXI6IG51bWJlciB8IG51bGwgPSBudWxsKTogbnVtYmVyIHtcbiAgZy50ZXh0QWxpZ24gPSAnc3RhcnQnO1xuICBsZXQgY29sb3JQYXJ0ID0gcy5zdWJzdHJpbmcoMCk7XG4gIGxldCBncmF5UGFydCA9IGxhc3QgPyAnJyA6IHNlcGFyYXRvcjtcbiAgaWYgKGRyYXdTdHlsZSA9PT0gRHJhd1N0eWxlLk1TQSkge1xuICAgIGdyYXlQYXJ0ID0gJyc7XG4gIH1cbiAgbGV0IGNvbG9yQ29kZSA9IHRydWU7XG4gIGxldCBjb21wYXJlV2l0aEN1cnJlbnQgPSB0cnVlO1xuICBsZXQgaGlnaGxpZ2h0RGlmZmVyZW5jZSA9ICdkaWZmZXJlbmNlJztcbiAgaWYgKChncmlkQ2VsbCAhPSBudWxsKSAmJiAoZ3JpZENlbGwuY2VsbC5jb2x1bW4gIT0gbnVsbCkpIHtcbiAgICBjb2xvckNvZGUgPSBncmlkQ2VsbC5jZWxsLmNvbHVtbi50ZW1wWydjb2xvci1jb2RlJ10gPz8gdHJ1ZTtcbiAgICBjb21wYXJlV2l0aEN1cnJlbnQgPSBncmlkQ2VsbC5jZWxsLmNvbHVtbi50ZW1wWydjb21wYXJlLXdpdGgtY3VycmVudCddID8/IHRydWU7XG4gICAgaGlnaGxpZ2h0RGlmZmVyZW5jZSA9IGdyaWRDZWxsLmNlbGwuY29sdW1uLnRlbXBbJ2hpZ2hsaWdodC1kaWZmZXJlbmNlJ10gPz8gJ2RpZmZlcmVuY2UnO1xuXG4gIH1cbiAgY29uc3QgY3VycmVudE1vbm9tZXI6IHN0cmluZyA9IHJlZmVyZW5jZVNlcXVlbmNlW3dvcmRJZHhdO1xuICBpZiAoY29tcGFyZVdpdGhDdXJyZW50ICYmIChyZWZlcmVuY2VTZXF1ZW5jZS5sZW5ndGggPiAwKSAmJiAoaGlnaGxpZ2h0RGlmZmVyZW5jZSA9PT0gJ2RpZmZlcmVuY2UnKSkge1xuICAgIHRyYW5zcGFyZW5jeVJhdGUgPSAoY29sb3JQYXJ0ID09IGN1cnJlbnRNb25vbWVyKSA/IDAuMyA6IHRyYW5zcGFyZW5jeVJhdGU7XG4gIH1cbiAgaWYgKGNvbXBhcmVXaXRoQ3VycmVudCAmJiAocmVmZXJlbmNlU2VxdWVuY2UubGVuZ3RoID4gMCkgJiYgKGhpZ2hsaWdodERpZmZlcmVuY2UgPT09ICdlcXVhbCcpKSB7XG4gICAgdHJhbnNwYXJlbmN5UmF0ZSA9IChjb2xvclBhcnQgIT0gY3VycmVudE1vbm9tZXIpID8gMC4zIDogdHJhbnNwYXJlbmN5UmF0ZTtcbiAgfVxuICBpZiAobWF4TGVuZ3RoT2ZNb25vbWVyICE9IG51bGwpIHtcbiAgICBjb2xvclBhcnQgPSBtb25vbWVyVG9TaG9ydEZ1bmN0aW9uKGNvbG9yUGFydCwgbWF4TGVuZ3RoT2ZNb25vbWVyKTtcbiAgfVxuXG5cbiAgbGV0IHRleHRTaXplOiBhbnkgPSBnLm1lYXN1cmVUZXh0KGNvbG9yUGFydCArIGdyYXlQYXJ0KTtcbiAgY29uc3QgaW5kZW50ID0gNTtcblxuICBsZXQgbWF4Q29sb3JUZXh0U2l6ZSA9IGcubWVhc3VyZVRleHQoY29sb3JQYXJ0KS53aWR0aDtcbiAgbGV0IGNvbG9yVGV4dFNpemUgPSBnLm1lYXN1cmVUZXh0KGNvbG9yUGFydCkud2lkdGg7XG4gIGNvbnN0IGR5ID0gKHRleHRTaXplLmZvbnRCb3VuZGluZ0JveEFzY2VudCArIHRleHRTaXplLmZvbnRCb3VuZGluZ0JveERlc2NlbnQpIC8gMjtcbiAgdGV4dFNpemUgPSB0ZXh0U2l6ZS53aWR0aDtcbiAgaWYgKGRyYXdTdHlsZSA9PT0gRHJhd1N0eWxlLk1TQSkge1xuICAgIG1heENvbG9yVGV4dFNpemUgPSBtYXhXb3JkW3dvcmRJZHhdO1xuICAgIHRleHRTaXplID0gbWF4V29yZFt3b3JkSWR4XTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRyYXcoZHgxOiBudW1iZXIsIGR4MjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZHJhd0NvbG9yID0gY29sb3JDb2RlID8gY29sb3IgOiBibGFja0NvbG9yO1xuICAgIGcuZmlsbFN0eWxlID0gZHJhd0NvbG9yO1xuICAgIGcuZ2xvYmFsQWxwaGEgPSB0cmFuc3BhcmVuY3lSYXRlO1xuICAgIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5jbGFzc2ljKSB7XG4gICAgICBnLmZpbGxUZXh0KGNvbG9yUGFydCwgeCArIGR4MSwgeSArIGR5KTtcbiAgICAgIGcuZmlsbFN0eWxlID0gZ3JheUNvbG9yO1xuICAgICAgZy5maWxsVGV4dChncmF5UGFydCwgeCArIGR4MiwgeSArIGR5KTtcbiAgICB9XG4gICAgaWYgKGRyYXdTdHlsZSA9PT0gRHJhd1N0eWxlLk1TQSkge1xuICAgICAgZy5maWxsU3R5bGUgPSBkcmF3Q29sb3I7XG4gICAgICBnLmZpbGxUZXh0KGNvbG9yUGFydCwgeCArIGR4MSArICgobWF4V29yZFt3b3JkSWR4XSAtIGNvbG9yVGV4dFNpemUpIC8gMiksIHkgKyBkeSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGxlZnQgfHwgdGV4dFNpemUgPiB3KSB7XG4gICAgZHJhdyhpbmRlbnQsIGluZGVudCArIG1heENvbG9yVGV4dFNpemUpO1xuICAgIHJldHVybiB4ICsgbWF4Q29sb3JUZXh0U2l6ZSArIGcubWVhc3VyZVRleHQoZ3JheVBhcnQpLndpZHRoO1xuXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZHggPSAodyAtIHRleHRTaXplKSAvIDI7XG4gICAgZHJhdyhkeCwgZHggKyBtYXhDb2xvclRleHRTaXplKTtcbiAgICByZXR1cm4geCArIGR4ICsgbWF4Q29sb3JUZXh0U2l6ZTtcbiAgfVxufVxuXG4iXX0=
@@ -0,0 +1,48 @@
1
+ export declare const HELM_CORE_LIB_FILENAME = "/data/HELMCoreLibrary.json";
2
+ export declare const enum HELM_FIELDS {
3
+ MONOMER_TYPE = "monomerType",
4
+ SMILES = "smiles",
5
+ NAME = "name",
6
+ AUTHOR = "author",
7
+ MOLFILE = "molfile",
8
+ NATURAL_ANALOG = "naturalAnalog",
9
+ RGROUPS = "rgroups",
10
+ CREATE_DATE = "createDate",
11
+ ID = "id",
12
+ POLYMER_TYPE = "polymerType",
13
+ SYMBOL = "symbol"
14
+ }
15
+ export declare const enum RGROUP_FIELDS {
16
+ CAP_GROUP_SMILES = "capGroupSmiles",
17
+ CAP_GROUP_SMILES_UPPERCASE = "capGroupSMILES",
18
+ ALTER_ID = "alternateId",
19
+ CAP_GROUP_NAME = "capGroupName",
20
+ LABEL = "label"
21
+ }
22
+ export declare const enum HELM_POLYMER_TYPE {
23
+ PEPTIDE = "PEPTIDE",
24
+ RNA = "RNA"
25
+ }
26
+ export declare const enum HELM_MONOMER_TYPE {
27
+ BACKBONE = "Backbone",
28
+ TERMINAL = "Terminal",
29
+ BRANCH = "Branch"
30
+ }
31
+ export declare const HELM_CORE_FIELDS: HELM_FIELDS[];
32
+ export declare const SDF_MONOMER_NAME = "MonomerName";
33
+ export declare const jsonSdfMonomerLibDict: {
34
+ monomerType: null;
35
+ smiles: null;
36
+ name: string;
37
+ author: null;
38
+ molfile: string;
39
+ naturalAnalog: string;
40
+ rgroups: string;
41
+ createDate: null;
42
+ id: null;
43
+ polymerType: string;
44
+ symbol: string;
45
+ };
46
+ export declare const MONOMER_ENCODE_MIN = 256;
47
+ export declare const MONOMER_ENCODE_MAX = 1034;
48
+ //# sourceMappingURL=const.d.ts.map