@datagrok/bio 2.8.6 → 2.10.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/CHANGELOG.md CHANGED
@@ -1,26 +1,41 @@
1
1
  # Bio changelog
2
2
 
3
- ## 2.9.0 (WIP)
3
+ ## 2.10.0 (2023-09-06)
4
4
 
5
- *Dependency: datagrok-api >= 1.13.3*
5
+ ### Features
6
+
7
+ * GetRegion for Macromolecule.
8
+ * Top menu Bio | Convert | GetRegion dialog.
9
+ * Add tests for UnitsHandler.getRegion.
10
+ * Maintain `.positionNames` tag for GetRegion derived column.
11
+ * Use `.regions` tag annotation for GetRegion dialog.
12
+ * Fix mistyping top menu path for Identity scoring.
13
+
14
+ ### Bug fixes
15
+
16
+ * Fixed UnitsHandler.posList length.
17
+
18
+ ## 2.9.0 (2023-08-30)
6
19
 
7
20
  ### Features
8
21
 
9
- * WebLogo: add property showPositionLabels
10
- * WebLogo: optimized with splitterAsFastaSimple
11
- * VdRegionsViewer: optimized preventing rebuild on positionWidth changed and resize
12
- * VdRegionsViewer: to fit WebLogo enclosed on positionWidth of value 0
13
- * WebLogo: disable userEditable for fixWidth
22
+ * WebLogo: add property `showPositionLabels`.
23
+ * WebLogo: optimized with `splitterAsFastaSimple`.
24
+ * WebLogo: disable `userEditable` for `fixWidth`.
25
+ * VdRegionsViewer: optimized preventing rebuild on `positionWidth` changed and resize.
26
+ * VdRegionsViewer: to fit WebLogo enclosed on `positionWidth` of value 0.
27
+ * Introduced sequence identity and similarity scoring.
14
28
 
15
- ### Bug fixes
29
+ ### Bug fixes
16
30
 
17
- * Fix vdRegionsViewer viewer package function name consistency
18
- * GROK-13310: Bio | Tools: Fix Split to monomers for multiple runs
19
- * GROK-12675: Bio | Tools: Fix Composition dialog error on selection column
20
- * Allow characters '(', ')', ',', '-', '_' in monomer names for fasta splitter
21
- * WebLogo: Fix horizontal alignment to left while fixWidth
22
- * WebLogo: Fix layout for fixWidth, fitArea, and normal modes
23
- * VdRegionsViewer: Fix postponed rendering for tests
31
+ * Fix vdRegionsViewer viewer package function name consistency.
32
+ * GROK-13310: Bio | Tools: Fix Split to monomers for multiple runs.
33
+ * GROK-12675: Bio | Tools: Fix the Composition dialog error on the selection column.
34
+ * Allow characters '(', ')', ',', '-', '_' in monomer names for fasta splitter.
35
+ * WebLogo: Fix horizontal alignment to the left while `fixWidth``.
36
+ * WebLogo: Fix layout for `fixWidth`, `fitArea`, and normal modes.
37
+ * VdRegionsViewer: Fix postponed rendering for tests.
38
+ * MacromoleculeDifferenceCellRenderer: Fix to not use `UnitsHandler`.
24
39
 
25
40
  ## 2.8.2 (2023-08-01)
26
41
 
@@ -30,12 +45,12 @@ This release focuses on improving the monomer cell renderer.
30
45
 
31
46
  ### Features
32
47
 
33
- * Added sample datasets for natural and synthetic peptide sequences
34
- * Added sample dataset for cyclic sequences with HELM notation
48
+ * Added sample datasets for natural and synthetic peptide sequences.
49
+ * Added sample dataset for cyclic sequences with HELM notation.
35
50
 
36
51
  ### Bug fixes
37
52
 
38
- * GROK-13659: Bio | Tools: Fix MaxMonomerLength for Macromolecule cell renderer
53
+ * GROK-13659: Bio | Tools: Fix MaxMonomerLength for Macromolecule cell renderer.
39
54
 
40
55
  ## 2.8.1 (2023-07-24)
41
56
 
@@ -76,7 +91,7 @@ This release focuses on improvements and bug fixes.
76
91
  * Added separator support for **Sequence Space** and **Activity Cliffs**.
77
92
  * Tooltip: shows monomer atomic structure for macromolecules.
78
93
  * For macromolecule cells, added the ability to show composition ratios in the property panel.
79
- * **Top menu**: organized the items into groups **SAR**, **Structure**, **Atomic level**, and **Search**.
94
+ * **Top menu**: organized the items into groups **SAR**, **Structure**, **Atomic level**, and **Search**.
80
95
 
81
96
  ### Bug Fixes
82
97
 
package/README.md CHANGED
@@ -1,14 +1,14 @@
1
1
  # Bio
2
2
 
3
- Bio is a bioinformatics support [package](https://datagrok.ai/help/develop/develop#packages) for the
4
- [Datagrok](https://datagrok.ai) platform with an extensive toolset supporting SAR analisys for small molecules
3
+ Bio is a bioinformatics support [package](https://datagrok.ai/help/develop/#packages) for the
4
+ [Datagrok](https://datagrok.ai) platform with an extensive toolset supporting SAR analysis for small molecules
5
5
  and antibodies.
6
6
 
7
7
  ## Notations
8
8
 
9
9
  [@datagrok/bio](https://github.com/datagrok-ai/public/tree/master/packages/Bio) can ingest data in multiple file
10
10
  formats (such as fasta or csv) and multiple notations for natural and modified residues, aligned and non-aligned forms,
11
- nucleotide and amino acid sequences. The sequences are automatically detected and classified, while preserving their
11
+ nucleotide and amino acid sequences. The sequences are automatically detected and classified while preserving their
12
12
  initial notation. Datagrok allows you to convert sequences between different notations as well.
13
13
 
14
14
  ![Notation converter](../../help/uploads/macromolecules/macromolecules-notation-converter-800.gif "Notation converter")
@@ -21,7 +21,7 @@ See:
21
21
  ## Atomic-Level structures from sequences
22
22
 
23
23
  For linear sequences, the linear form (see the illustration below) of molecules is reproduced. This is useful
24
- for better visual inspection of sequence and duplex comparison. Structure at atomic level could be saved in available
24
+ for better visual inspection of sequence and duplex comparison. Structure at the atomic level could be saved in available
25
25
  notations.
26
26
 
27
27
  ![Datagrok-generated atom structure for the ATGCATGC sequence](../../help/uploads/macromolecules/macromolecules-7.png "Datagrok-generated atom structure for the ATGCATGC sequence")
@@ -36,11 +36,10 @@ See:
36
36
 
37
37
  ## MSA
38
38
 
39
- For multiple-sequence alignment, Datagrok uses the “kalign” that relies on Wu-Manber string-matching algorithm
39
+ For multiple-sequence alignment, Datagrok uses the “kalign” that relies on the Wu-Manber string-matching algorithm
40
40
  [Lassmann, Timo. _Kalign 3: multiple sequence alignment of large data sets._ **Bioinformatics** (2019).pdf](https://academic.oup.com/bioinformatics/advance-article-pdf/doi/10.1093/bioinformatics/btz795/30314127/btz795.pdf).
41
- “kalign“ is suited for sequences containing only natural monomers. Sequences of a particular column can be analyzed
42
- using MSA algorithm available at the top menu. Aligned sequences can be inspected for base composition
43
- at the position of MSA result. User is also able to specify custom gap open, gap extend and terminal gap penalties for alignment.
41
+ “kalign“ is suited for sequences containing only natural monomers. Sequences of a particular column can be analyzed using the MSA algorithm available at the top menu. Aligned sequences can be inspected for base composition
42
+ at the position of the MSA result. User is also able to specify custom gap open, gap extend and terminal gap penalties for alignment.
44
43
 
45
44
  ![MSA and base composition analysis](
46
45
  ../../help/uploads/macromolecules/macromolecules-msa-and-composition-analysis-800.gif "MSA analysis")
@@ -71,11 +70,11 @@ The most helpful feature for exploration analysis with WebLogo in Datagrok is it
71
70
  on a dataset. Mouse click on a particular residue in a specific position will select rows of the dataset
72
71
  with sequences containing that residue at that position.
73
72
 
74
- You must specify the tag ```semType``` with value ```Macromolecule``` and tag `alphabet` of choice ('PT', 'DNA', 'RNA')
73
+ You must specify the tag `semType` with the value `Macromolecule` and tag `alphabet` of choice ('PT', 'DNA', 'RNA')
75
74
  for the data column with multiple alignment sequences, it is mandatory to select the palette for monomers' colors.
76
75
 
77
76
  You can customize the look of the viewer with properties. Properties ```startPosition``` and ```endPosition```)
78
- allow to display multiple alignment partially. If property ```startPosition``` (```endPosition```)
77
+ allow to display multiple alignments partially. If property ```startPosition``` (```endPosition```)
79
78
  is not specified, then the Logo will be plotted from the first (till the last) position of sequences.
80
79
 
81
80
  ### General
@@ -110,8 +109,8 @@ is not specified, then the Logo will be plotted from the first (till the last) p
110
109
  See also:
111
110
 
112
111
  * [WebLogo](../../libraries/)
113
- * [Viewers](../../help/visualize/viewers.md)
114
- * [Table view](../../help/datagrok/table-view.md)
112
+ * [Viewers](../../help/visualize/viewers/viewers.md)
113
+ * [Table view](../../help/datagrok/concepts/table.md)
115
114
 
116
115
  ## Sequence space
117
116
 
@@ -119,7 +118,7 @@ Datagrok allows visualizing multidimensional sequence space using a dimensionali
119
118
  Several distance-based dimensionality reduction algorithms are available, such as UMAP or t-SNE.
120
119
  The sequences are projected to 2D space closer if they correspond to similar structures, and farther
121
120
  otherwise. The tool for analyzing molecule collections is called 'Sequence space' and exists in
122
- the Bio package. Depending on the sequence type, different distance functions will be used, like [Levenstein](https://en.wikipedia.org/wiki/Levenshtein_distance) for DNA/RNA, [Needleman-Wunsch](https://en.wikipedia.org/wiki/Needleman%E2%80%93Wunsch_algorithm) for Proteins and [Hamming](https://en.wikipedia.org/wiki/Hamming_distance) for already aligned sequences. The process is conducted in web-workers and is parallelized, which yields very fast and non interupting computing.
121
+ the Bio package. Depending on the sequence type, different distance functions will be used, like [Levenstein](https://en.wikipedia.org/wiki/Levenshtein_distance) for DNA/RNA, [Needleman-Wunsch](https://en.wikipedia.org/wiki/Needleman%E2%80%93Wunsch_algorithm) for Proteins and [Hamming](https://en.wikipedia.org/wiki/Hamming_distance) for already aligned sequences. The process is conducted by web-workers and is parallelized, which yields very fast and non-interrupting computing.
123
122
 
124
123
  To launch the analysis from the top menu, select Bio | Structure | Sequence space.
125
124
 
@@ -127,15 +126,15 @@ To launch the analysis from the top menu, select Bio | Structure | Sequence spac
127
126
 
128
127
  See:
129
128
 
130
- * [sequenceSpace()](src/utils/sequence-space.ts)
129
+ * [sequenceSpace()](src/analysis/sequence-space.ts)
131
130
 
132
131
  ## Sequence activity cliffs
133
132
 
134
133
  Activity cliffs tool finds pairs of sequences where small changes in the sequence yield significant
135
- changes in activity or any other numerical property. open the tool from a top menu by selecting.
136
- Similarity cutoff and similarity metric are configurable. As in Sequence space, you can select
134
+ changes in activity or any other numerical property. Open the tool from the top menu by selecting.
135
+ Similarity cutoff and similarity metrics are configurable. As in Sequence space, you can select
137
136
  from different dimensionality reduction algorithms.
138
- A custom scatter plot with cliffs will be added to the right side of the grid. User has an option to show only cliffs and also to inspect them and highligh differences between simmilar sequences.
137
+ A custom scatter plot with cliffs will be added to the right side of the grid. The user has the option to show only cliffs and also to inspect them and highlight differences between similar sequences.
139
138
 
140
139
  To launch the analysis from the top menu, select Bio | SAR | Sequence Activity Cliffs.
141
140
 
@@ -147,16 +146,36 @@ See:
147
146
 
148
147
  ## Similarity Search
149
148
 
150
- Similarity Search tool allows user to find sequences that are most similar to target sequence. The tool can be accessed from the top menu of bio. It first constructs the distance matrix for all sequences, and then uses it to find most similar ones to the selection. Upon selecting similar sequences from the docked grid bellow, detailed difference will be shown in the context panel.
149
+ Similarity Search tool allows users to find sequences that are most similar to the target sequence. The tool can be accessed from the top menu of bio. It first constructs the distance matrix for all sequences and then uses it to find the most similar ones to the selection. Upon selecting similar sequences from the docked grid below, detailed differences will be shown in the context panel.
151
150
 
152
- To launch the searcg from the top menu, select Bio | Search | Similarity Search
151
+ To launch the search from the top menu, select Bio | Search | Similarity Search
153
152
 
154
153
  ![Running similarity search](../../help/uploads/macromolecules/similarity_search.gif)
155
154
 
156
155
  ## Diversity Search
157
156
 
158
- Diversity Search tool allows user to find sequences that are most diverse in given dataset. The tool can be accessed from the top menu of bio. By default, number of diverse sequneces will be 10.
157
+ Diversity Search tool allows users to find sequences that are most diverse in the given dataset. The tool can be accessed from the top menu of bio. By default, the number of diverse sequences will be 10.
159
158
 
160
159
  To launch the search from the top menu, select Bio | Search | Diversity Search
161
160
 
162
161
  ![Running diversity search](../../help/uploads/macromolecules/diversity_search.gif)
162
+
163
+ ## Sequence scoring
164
+
165
+ Sequence scoring allows users to calculate sequence identity and similarity scores, given the reference sequence and add the results as a column. Sequence scoring functionality can be found in the top menu: Bio → Calculate.
166
+
167
+ ### Identity
168
+
169
+ The identity score represents a fraction of the identical monomers in corresponding positions.
170
+
171
+ Identity scoring can be found in the top menu: **Bio → Calculate → Identity...**.
172
+
173
+ ![Running identity scoring](../../help/uploads/macromolecules/identity-scoring.gif)
174
+
175
+ ### Similarity
176
+
177
+ The similarity score represents the sum of fingerprint similarity of monomers in corresponding positions.
178
+
179
+ Similarity scoring can be found in the top menu: **Bio → Calculate → Similarity...**.
180
+
181
+ ![Running similarity scoring](../../help/uploads/macromolecules/similarity-scoring.gif)
package/dist/452.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkbio=self.webpackChunkbio||[]).push([[452],{5697:(t,n,u)=>{u.d(n,{Dz:()=>h,KR:()=>o,MI:()=>l,NB:()=>s,UX:()=>c,WI:()=>a,Zd:()=>i,_h:()=>e,aW:()=>C,bX:()=>m,fX:()=>k,s:()=>g,yU:()=>f});var r=u(1040);function o(t,n){return d(function(t,n){const u=t.trueCount()+n.trueCount();if(0==u)return 1;const r=t.andWithCountBits(n,!0);return r/(u-r)}(t,n))}function e(t,n){return d(function(t,n){const u=t.trueCount()+n.trueCount();return 0==u?0:2*t.andWithCountBits(n,!0)/u}(t,n))}function i(t,n){return d(function(t,n){const u=t.trueCount()*n.trueCount();return 0==u?0:t.andWithCountBits(n,!0)/Math.sqrt(u)}(t,n))}function a(t,n){return Math.sqrt(t.trueCount()+n.trueCount()-2*t.andWithCountBits(n,!0))}function c(t,n){return t.trueCount()+n.trueCount()-2*t.andWithCountBits(n,!0)}function s(t,n){return d(function(t,n){const u=t.trueCount()+n.trueCount(),r=t.andWithCountBits(n,!0);return r/(2*u-3*r)}(t,n))}function g(t,n){return d(function(t,n){const u=t.trueCount()+n.trueCount(),r=t.trueCount()*n.trueCount();return 0==r?0:t.andWithCountBits(n,!0)*u/(2*r)}(t,n))}function C(t,n){return d(function(t,n){const u=t.trueCount()+n.trueCount(),r=t.trueCount()*n.trueCount();return 0==r?0:(t.andWithCountBits(n,!0)*u-r)/r}(t,n))}function f(t,n){return d(function(t,n){const u=Math.min(t.trueCount(),n.trueCount());return 0==u?0:t.andWithCountBits(n,!0)/u}(t,n))}function h(t,n){return d(function(t,n){const u=Math.max(t.trueCount(),n.trueCount());return 0==u?0:t.andWithCountBits(n,!0)/u}(t,n))}function k(t,n){return d(function(t,n){return 0==t.length?0:t.andWithCountBits(n,!0)/t.length}(t,n))}function l(t,n){return d(function(t,n){const u=t.andWithCountBits(n,!0),r=t.countBits(!0)+n.countBits(!0),o=t.length,e=o-r+u;return u==o||e==o?1:u/r+e/(2*o-r)}(t,n))}function d(t){return 1/t-1}function m(t,n){return Math.abs(t-n)}r.gk.Tanimoto,r.gk.Dice,r.gk.Asymmetric,r.gk.BraunBlanquet,r.gk.Cosine,r.gk.Kulczynski,r.gk.McConnaughey,r.gk.RogotGoldberg,r.gk.Russel,r.gk.Sokal,r.gk.Hamming,r.gk.Euclidean,r.gk.Tanimoto,r.gk.Dice,r.gk.Asymmetric,r.gk.BraunBlanquet,r.gk.Cosine,r.gk.Kulczynski,r.gk.McConnaughey,r.gk.RogotGoldberg,r.gk.Russel,r.gk.Sokal,r.gk.Hamming,r.gk.Euclidean,r.gk.Tanimoto,r.gk.Dice,r.gk.Cosine,r.gk.Tanimoto,r.gk.Asymmetric,r.gk.Cosine,r.gk.Sokal},489:(t,n,u)=>{u.d(n,{U:()=>r.U,o:()=>r.o});var r=u(5540)},5540:(t,n,u)=>{u.d(n,{U:()=>r,o:()=>a});var r,o=u(779),e=u(458),i=u(6683);!function(t){t.HAMMING="Hamming",t.LEVENSHTEIN="Levenshtein",t.NEEDLEMANN_WUNSCH="Needlemann-Wunsch"}(r||(r={}));const a={[r.HAMMING]:o.j,[r.LEVENSHTEIN]:e.r,[r.NEEDLEMANN_WUNSCH]:i.n}},3659:(t,n,u)=>{u.d(n,{OW:()=>r});class r extends Float32Array{}},3979:(t,n)=>{n.H$=void 0,n.H$=function(t,n,u){var r=function(t,n,u){if(0===t.length||0===n.length)return 0;if(u&&!u.caseSensitive&&(t=t.toUpperCase(),n=n.toUpperCase()),t===n)return 1;for(var r=0,o=t.length,e=n.length,i=Math.floor(Math.max(o,e)/2)-1,a=new Array(o),c=new Array(e),s=0;s<o;s++)for(var g=Math.max(0,s-i);g<=Math.min(e,s+i+1);g++)if(!a[s]&&!c[g]&&t[s]===n[g]){++r,a[s]=c[g]=!0;break}if(0===r)return 0;var C=0,f=0;for(s=0;s<o;s++)if(a[s]){for(;!c[f];)f++;t.charAt(s)!==n.charAt(f++)&&C++}return(r/o+r/e+(r-(C/=2))/r)/3}(t,n,u),o=0;if(r>.7){for(var e=Math.min(t.length,n.length),i=0;t[i]===n[i]&&i<4&&i<e;)++o,i++;r+=.1*o*(1-r)}return r}}}]);
1
+ "use strict";(self.webpackChunkbio=self.webpackChunkbio||[]).push([[452],{5697:(t,n,u)=>{u.d(n,{Dz:()=>h,KR:()=>o,MI:()=>l,NB:()=>s,UX:()=>c,WI:()=>a,Zd:()=>i,_h:()=>e,aW:()=>C,bX:()=>m,fX:()=>k,s:()=>g,yU:()=>f});var r=u(1040);function o(t,n){return d(function(t,n){const u=t.trueCount()+n.trueCount();if(0==u)return 1;const r=t.andWithCountBits(n,!0);return r/(u-r)}(t,n))}function e(t,n){return d(function(t,n){const u=t.trueCount()+n.trueCount();return 0==u?0:2*t.andWithCountBits(n,!0)/u}(t,n))}function i(t,n){return d(function(t,n){const u=t.trueCount()*n.trueCount();return 0==u?0:t.andWithCountBits(n,!0)/Math.sqrt(u)}(t,n))}function a(t,n){return Math.sqrt(t.trueCount()+n.trueCount()-2*t.andWithCountBits(n,!0))}function c(t,n){return t.trueCount()+n.trueCount()-2*t.andWithCountBits(n,!0)}function s(t,n){return d(function(t,n){const u=t.trueCount()+n.trueCount(),r=t.andWithCountBits(n,!0);return r/(2*u-3*r)}(t,n))}function g(t,n){return d(function(t,n){const u=t.trueCount()+n.trueCount(),r=t.trueCount()*n.trueCount();return 0==r?0:t.andWithCountBits(n,!0)*u/(2*r)}(t,n))}function C(t,n){return d(function(t,n){const u=t.trueCount()+n.trueCount(),r=t.trueCount()*n.trueCount();return 0==r?0:(t.andWithCountBits(n,!0)*u-r)/r}(t,n))}function f(t,n){return d(function(t,n){const u=Math.min(t.trueCount(),n.trueCount());return 0==u?0:t.andWithCountBits(n,!0)/u}(t,n))}function h(t,n){return d(function(t,n){const u=Math.max(t.trueCount(),n.trueCount());return 0==u?0:t.andWithCountBits(n,!0)/u}(t,n))}function k(t,n){return d(function(t,n){return 0==t.length?0:t.andWithCountBits(n,!0)/t.length}(t,n))}function l(t,n){return d(function(t,n){const u=t.andWithCountBits(n,!0),r=t.countBits(!0)+n.countBits(!0),o=t.length,e=o-r+u;return u==o||e==o?1:u/r+e/(2*o-r)}(t,n))}function d(t){return 0===t?3402823e32:1/t-1}function m(t,n){return Math.abs(t-n)}r.gk.Tanimoto,r.gk.Dice,r.gk.Asymmetric,r.gk.BraunBlanquet,r.gk.Cosine,r.gk.Kulczynski,r.gk.McConnaughey,r.gk.RogotGoldberg,r.gk.Russel,r.gk.Sokal,r.gk.Hamming,r.gk.Euclidean,r.gk.Tanimoto,r.gk.Dice,r.gk.Asymmetric,r.gk.BraunBlanquet,r.gk.Cosine,r.gk.Kulczynski,r.gk.McConnaughey,r.gk.RogotGoldberg,r.gk.Russel,r.gk.Sokal,r.gk.Hamming,r.gk.Euclidean,r.gk.Tanimoto,r.gk.Dice,r.gk.Cosine,r.gk.Tanimoto,r.gk.Asymmetric,r.gk.Cosine,r.gk.Sokal},489:(t,n,u)=>{u.d(n,{U:()=>r.U,o:()=>r.o});var r=u(5540)},5540:(t,n,u)=>{u.d(n,{U:()=>r,o:()=>a});var r,o=u(779),e=u(458),i=u(6683);!function(t){t.HAMMING="Hamming",t.LEVENSHTEIN="Levenshtein",t.NEEDLEMANN_WUNSCH="Needlemann-Wunsch"}(r||(r={}));const a={[r.HAMMING]:o.j,[r.LEVENSHTEIN]:e.r,[r.NEEDLEMANN_WUNSCH]:i.n}},3659:(t,n,u)=>{u.d(n,{OW:()=>r});class r extends Float32Array{}},3979:(t,n)=>{n.H$=void 0,n.H$=function(t,n,u){var r=function(t,n,u){if(0===t.length||0===n.length)return 0;if(u&&!u.caseSensitive&&(t=t.toUpperCase(),n=n.toUpperCase()),t===n)return 1;for(var r=0,o=t.length,e=n.length,i=Math.floor(Math.max(o,e)/2)-1,a=new Array(o),c=new Array(e),s=0;s<o;s++)for(var g=Math.max(0,s-i);g<=Math.min(e,s+i+1);g++)if(!a[s]&&!c[g]&&t[s]===n[g]){++r,a[s]=c[g]=!0;break}if(0===r)return 0;var C=0,f=0;for(s=0;s<o;s++)if(a[s]){for(;!c[f];)f++;t.charAt(s)!==n.charAt(f++)&&C++}return(r/o+r/e+(r-(C/=2))/r)/3}(t,n,u),o=0;if(r>.7){for(var e=Math.min(t.length,n.length),i=0;t[i]===n[i]&&i<4&&i<e;)++o,i++;r+=.1*o*(1-r)}return r}}}]);
2
2
  //# sourceMappingURL=452.js.map
package/dist/452.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"452.js","mappings":"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","sources":["webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-metrics-methods.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/macromolecule-distance-functions.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://bio/./node_modules/jaro-winkler-typescript/lib/index.js"],"sourcesContent":["import { BitArrayMetricsNames } from './typed-metrics/consts';\nexport const similarityMetric = {\n [BitArrayMetricsNames.Tanimoto]: tanimotoSimilarity,\n [BitArrayMetricsNames.Dice]: diceSimilarity,\n [BitArrayMetricsNames.Asymmetric]: asymmetricSimilarity,\n [BitArrayMetricsNames.BraunBlanquet]: braunBlanquetSimilarity,\n [BitArrayMetricsNames.Cosine]: cosineSimilarity,\n [BitArrayMetricsNames.Kulczynski]: kulczynskiSimilarity,\n [BitArrayMetricsNames.McConnaughey]: mcConnaugheySimilarity,\n [BitArrayMetricsNames.RogotGoldberg]: rogotGoldbergSimilarity,\n [BitArrayMetricsNames.Russel]: russelSimilarity,\n [BitArrayMetricsNames.Sokal]: sokalSimilarity,\n [BitArrayMetricsNames.Hamming]: hammingSimilarity,\n [BitArrayMetricsNames.Euclidean]: euclideanSimilarity,\n};\nexport const distanceMetrics = {\n [BitArrayMetricsNames.Tanimoto]: tanimotoDistance,\n [BitArrayMetricsNames.Dice]: diceDistance,\n [BitArrayMetricsNames.Asymmetric]: asymmetricDistance,\n [BitArrayMetricsNames.BraunBlanquet]: braunBlanquetDistance,\n [BitArrayMetricsNames.Cosine]: cosineDistance,\n [BitArrayMetricsNames.Kulczynski]: kulczynskiDistance,\n [BitArrayMetricsNames.McConnaughey]: mcConnaugheyDistance,\n [BitArrayMetricsNames.RogotGoldberg]: rogotGoldbergDistance,\n [BitArrayMetricsNames.Russel]: russelDistance,\n [BitArrayMetricsNames.Sokal]: sokalDistance,\n [BitArrayMetricsNames.Hamming]: hammingDistance,\n [BitArrayMetricsNames.Euclidean]: euclideanDistance,\n};\nexport const CHEM_SIMILARITY_METRICS = [\n BitArrayMetricsNames.Tanimoto,\n BitArrayMetricsNames.Dice,\n BitArrayMetricsNames.Cosine\n];\nexport const SEQ_SPACE_SIMILARITY_METRICS = [\n BitArrayMetricsNames.Tanimoto,\n BitArrayMetricsNames.Asymmetric,\n BitArrayMetricsNames.Cosine,\n BitArrayMetricsNames.Sokal\n];\nexport function tanimotoSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n if (total == 0)\n return 1.0;\n const common = x.andWithCountBits(y, true);\n return common / (total - common);\n}\nexport function tanimotoDistance(x, y) {\n return getDistanceFromSimilarity(tanimotoSimilarity(x, y));\n}\nexport function diceSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n if (total == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return 2 * common / total;\n}\nexport function diceDistance(x, y) {\n return getDistanceFromSimilarity(diceSimilarity(x, y));\n}\nexport function cosineSimilarity(x, y) {\n const total = x.trueCount() * y.trueCount();\n if (total == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / Math.sqrt(total);\n}\nexport function cosineDistance(x, y) {\n return getDistanceFromSimilarity(cosineSimilarity(x, y));\n}\nexport function euclideanSimilarity(x, y) {\n return getSimilarityFromDistance(euclideanDistance(x, y));\n}\nexport function euclideanDistance(x, y) {\n return Math.sqrt(x.trueCount() + y.trueCount() - 2 * x.andWithCountBits(y, true));\n}\nexport function hammingSimilarity(x, y) {\n return getSimilarityFromDistance(hammingDistance(x, y));\n}\nexport function hammingDistance(x, y) {\n return x.trueCount() + y.trueCount() - 2 * x.andWithCountBits(y, true);\n}\nexport function sokalSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const common = x.andWithCountBits(y, true);\n return common / (2 * total - 3 * common);\n}\nexport function sokalDistance(x, y) {\n return getDistanceFromSimilarity(sokalSimilarity(x, y));\n}\nexport function kulczynskiSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const totalProd = x.trueCount() * y.trueCount();\n if (totalProd == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return (common * total) / (2 * totalProd);\n}\nexport function kulczynskiDistance(x, y) {\n return getDistanceFromSimilarity(kulczynskiSimilarity(x, y));\n}\nexport function mcConnaugheySimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const totalProd = x.trueCount() * y.trueCount();\n if (totalProd == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return (common * total - totalProd) / totalProd;\n}\nexport function mcConnaugheyDistance(x, y) {\n return getDistanceFromSimilarity(mcConnaugheySimilarity(x, y));\n}\nexport function asymmetricSimilarity(x, y) {\n const min = Math.min(x.trueCount(), y.trueCount());\n if (min == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / min;\n}\nexport function asymmetricDistance(x, y) {\n return getDistanceFromSimilarity(asymmetricSimilarity(x, y));\n}\nexport function braunBlanquetSimilarity(x, y) {\n const max = Math.max(x.trueCount(), y.trueCount());\n if (max == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / max;\n}\nexport function braunBlanquetDistance(x, y) {\n return getDistanceFromSimilarity(braunBlanquetSimilarity(x, y));\n}\nexport function russelSimilarity(x, y) {\n if (x.length == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / x.length;\n}\nexport function russelDistance(x, y) {\n return getDistanceFromSimilarity(russelSimilarity(x, y));\n}\nexport function rogotGoldbergSimilarity(x, y) {\n const common = x.andWithCountBits(y, true);\n const total = x.countBits(true) + y.countBits(true);\n const len = x.length;\n const diff = len - total + common;\n if ((common == len) || (diff == len))\n return 1.0;\n else\n return common / total + diff / (2 * len - total);\n}\nexport function rogotGoldbergDistance(x, y) {\n return getDistanceFromSimilarity(rogotGoldbergSimilarity(x, y));\n}\nexport function getSimilarityFromDistance(distance) {\n return 1 / (1 + distance);\n}\nexport function getDistanceFromSimilarity(similarity) {\n return 1 / similarity - 1;\n}\nexport function numericDistance(x, y) {\n return Math.abs(x - y);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRTVELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE2RDtJQUN4RixDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxFQUFFLGtCQUFrQjtJQUNuRCxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLGNBQWM7SUFDM0MsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxvQkFBb0I7SUFDdkQsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBRSx1QkFBdUI7SUFDN0QsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDL0MsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxvQkFBb0I7SUFDdkQsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxzQkFBc0I7SUFDM0QsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBRSx1QkFBdUI7SUFDN0QsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDL0MsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxlQUFlO0lBQzdDLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUUsaUJBQWlCO0lBQ2pELENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEVBQUUsbUJBQW1CO0NBQ3RELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQTZEO0lBQ3ZGLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEVBQUUsZ0JBQWdCO0lBQ2pELENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsWUFBWTtJQUN6QyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxFQUFFLGtCQUFrQjtJQUNyRCxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxFQUFFLHFCQUFxQjtJQUMzRCxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxFQUFFLGNBQWM7SUFDN0MsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxrQkFBa0I7SUFDckQsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxvQkFBb0I7SUFDekQsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBRSxxQkFBcUI7SUFDM0QsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxjQUFjO0lBQzdDLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEVBQUUsYUFBYTtJQUMzQyxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxFQUFFLGVBQWU7SUFDL0MsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxpQkFBaUI7Q0FDcEQsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHO0lBQ3JDLG9CQUFvQixDQUFDLFFBQVE7SUFDN0Isb0JBQW9CLENBQUMsSUFBSTtJQUN6QixvQkFBb0IsQ0FBQyxNQUFNO0NBQUMsQ0FBQztBQUMvQixNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRztJQUMxQyxvQkFBb0IsQ0FBQyxRQUFRO0lBQzdCLG9CQUFvQixDQUFDLFVBQVU7SUFDL0Isb0JBQW9CLENBQUMsTUFBTTtJQUMzQixvQkFBb0IsQ0FBQyxLQUFLO0NBQUMsQ0FBQztBQUU5QixNQUFNLFVBQVUsa0JBQWtCLENBQUMsQ0FBVyxFQUFFLENBQVc7SUFDekQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM1QyxJQUFJLEtBQUssSUFBSSxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDM0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzQyxPQUFPLE1BQU0sR0FBRyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLENBQVcsRUFBRSxDQUFXO0lBQ3ZELE9BQU8seUJBQXlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsQ0FBVyxFQUFFLENBQVc7SUFDckQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM1QyxJQUFJLEtBQUssSUFBSSxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDM0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzQyxPQUFPLENBQUMsR0FBRyxNQUFNLEdBQUcsS0FBSyxDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLENBQVcsRUFBRSxDQUFXO0lBQ25ELE9BQU8seUJBQXlCLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsQ0FBVyxFQUFFLENBQVc7SUFDdkQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM1QyxJQUFJLEtBQUssSUFBSSxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDM0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzQyxPQUFPLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLENBQVcsRUFBRSxDQUFXO0lBQ3JELE9BQU8seUJBQXlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxDQUFXLEVBQUUsQ0FBVztJQUMxRCxPQUFPLHlCQUF5QixDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsQ0FBVyxFQUFFLENBQVc7SUFDeEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNwRixDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLENBQVcsRUFBRSxDQUFXO0lBQ3hELE9BQU8seUJBQXlCLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFDLENBQVcsRUFBRSxDQUFXO0lBQ3RELE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxDQUFXLEVBQUUsQ0FBVztJQUN0RCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDM0MsT0FBTyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxDQUFXLEVBQUUsQ0FBVztJQUNwRCxPQUFPLHlCQUF5QixDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsTUFBTSxVQUFVLG9CQUFvQixDQUFDLENBQVcsRUFBRSxDQUFXO0lBQzNELE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDNUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNoRCxJQUFJLFNBQVMsSUFBSSxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDL0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzQyxPQUFPLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsQ0FBVyxFQUFFLENBQVc7SUFDekQsT0FBTyx5QkFBeUIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUFDLENBQVcsRUFBRSxDQUFXO0lBQzdELE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDNUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNoRCxJQUFJLFNBQVMsSUFBSSxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDL0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzQyxPQUFPLENBQUMsTUFBTSxHQUFHLEtBQUssR0FBRyxTQUFTLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDbEQsQ0FBQztBQUVELE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxDQUFXLEVBQUUsQ0FBVztJQUMzRCxPQUFPLHlCQUF5QixDQUFDLHNCQUFzQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsQ0FBVyxFQUFFLENBQVc7SUFDM0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDbkQsSUFBSSxHQUFHLElBQUksQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3pCLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDM0MsT0FBTyxNQUFNLEdBQUcsR0FBRyxDQUFDO0FBQ3RCLENBQUM7QUFFRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsQ0FBVyxFQUFFLENBQVc7SUFDekQsT0FBTyx5QkFBeUIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxVQUFVLHVCQUF1QixDQUFDLENBQVcsRUFBRSxDQUFXO0lBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELElBQUksR0FBRyxJQUFJLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUN6QixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNDLE9BQU8sTUFBTSxHQUFHLEdBQUcsQ0FBQztBQUN0QixDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLENBQVcsRUFBRSxDQUFXO0lBQzVELE9BQU8seUJBQXlCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxDQUFXLEVBQUUsQ0FBVztJQUN2RCxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQzlCLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDM0MsT0FBTyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUMzQixDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxDQUFXLEVBQUUsQ0FBVztJQUNyRCxPQUFPLHlCQUF5QixDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsQ0FBVyxFQUFFLENBQVc7SUFDOUQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyQixNQUFNLElBQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLE1BQU0sQ0FBQztJQUNsQyxJQUFJLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDOztRQUM1QyxPQUFPLE1BQU0sR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLENBQVcsRUFBRSxDQUFXO0lBQzVELE9BQU8seUJBQXlCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxRQUFnQjtJQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQsTUFBTSxVQUFVLHlCQUF5QixDQUFDLFVBQWtCO0lBQzFELE9BQU8sQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDbEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpdEFycmF5IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL2JpdC1hcnJheSc7XG5pbXBvcnQge0JpdEFycmF5TWV0cmljc05hbWVzfSBmcm9tICcuL3R5cGVkLW1ldHJpY3MvY29uc3RzJztcblxuZXhwb3J0IGNvbnN0IHNpbWlsYXJpdHlNZXRyaWM6IHsgW25hbWU6IHN0cmluZ106ICh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpID0+IG51bWJlciB9ID0ge1xuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dOiB0YW5pbW90b1NpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5EaWNlXTogZGljZVNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYXN5bW1ldHJpY1NpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5CcmF1bkJsYW5xdWV0XTogYnJhdW5CbGFucXVldFNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdOiBjb3NpbmVTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGt1bGN6eW5za2lTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuTWNDb25uYXVnaGV5XTogbWNDb25uYXVnaGV5U2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJvZ290R29sZGJlcmddOiByb2dvdEdvbGRiZXJnU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IHJ1c3NlbFNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF06IHNva2FsU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkhhbW1pbmddOiBoYW1taW5nU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGV1Y2xpZGVhblNpbWlsYXJpdHksXG59O1xuXG5leHBvcnQgY29uc3QgZGlzdGFuY2VNZXRyaWNzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KSA9PiBudW1iZXIgfSA9IHtcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvXTogdGFuaW1vdG9EaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdOiBkaWNlRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYXN5bW1ldHJpY0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQnJhdW5CbGFucXVldF06IGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV06IGNvc2luZURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGt1bGN6eW5za2lEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV06IG1jQ29ubmF1Z2hleURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ106IHJvZ290R29sZGJlcmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IHJ1c3NlbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuU29rYWxdOiBzb2thbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuSGFtbWluZ106IGhhbW1pbmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGV1Y2xpZGVhbkRpc3RhbmNlLFxufTtcblxuZXhwb3J0IGNvbnN0IENIRU1fU0lNSUxBUklUWV9NRVRSSUNTID0gW1xuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90byxcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuRGljZSxcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lXTtcbmV4cG9ydCBjb25zdCBTRVFfU1BBQ0VfU0lNSUxBUklUWV9NRVRSSUNTID0gW1xuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90byxcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuQXN5bW1ldHJpYyxcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lLFxuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF07XG5cbmV4cG9ydCBmdW5jdGlvbiB0YW5pbW90b1NpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsID09IDApIHJldHVybiAxLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvICh0b3RhbCAtIGNvbW1vbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0YW5pbW90b0Rpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KHRhbmltb3RvU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWNlU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBpZiAodG90YWwgPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gMiAqIGNvbW1vbiAvIHRvdGFsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGljZURpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KGRpY2VTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvc2luZVNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICogeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvIE1hdGguc3FydCh0b3RhbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3NpbmVEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShjb3NpbmVTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV1Y2xpZGVhblNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldFNpbWlsYXJpdHlGcm9tRGlzdGFuY2UoZXVjbGlkZWFuRGlzdGFuY2UoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXVjbGlkZWFuRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguc3FydCh4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKSAtIDIgKiB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFtbWluZ1NpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldFNpbWlsYXJpdHlGcm9tRGlzdGFuY2UoaGFtbWluZ0Rpc3RhbmNlKHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbW1pbmdEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCkgLSAyICogeC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29rYWxTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCk7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvICgyICogdG90YWwgLSAzICogY29tbW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNva2FsRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkoc29rYWxTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGt1bGN6eW5za2lTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCk7XG4gIGNvbnN0IHRvdGFsUHJvZCA9IHgudHJ1ZUNvdW50KCkgKiB5LnRydWVDb3VudCgpO1xuICBpZiAodG90YWxQcm9kID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIChjb21tb24gKiB0b3RhbCkgLyAoMiAqIHRvdGFsUHJvZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBrdWxjenluc2tpRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkoa3VsY3p5bnNraVNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWNDb25uYXVnaGV5U2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBjb25zdCB0b3RhbFByb2QgPSB4LnRydWVDb3VudCgpICogeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsUHJvZCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiAoY29tbW9uICogdG90YWwgLSB0b3RhbFByb2QpIC8gdG90YWxQcm9kO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWNDb25uYXVnaGV5RGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkobWNDb25uYXVnaGV5U2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3ltbWV0cmljU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCBtaW4gPSBNYXRoLm1pbih4LnRydWVDb3VudCgpLCB5LnRydWVDb3VudCgpKTtcbiAgaWYgKG1pbiA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyBtaW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3ltbWV0cmljRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkoYXN5bW1ldHJpY1NpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJhdW5CbGFucXVldFNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgoeC50cnVlQ291bnQoKSwgeS50cnVlQ291bnQoKSk7XG4gIGlmIChtYXggPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gbWF4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJhdW5CbGFucXVldERpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KGJyYXVuQmxhbnF1ZXRTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1c3NlbFNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgaWYgKHgubGVuZ3RoID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvIHgubGVuZ3RoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVzc2VsRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkocnVzc2VsU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByb2dvdEdvbGRiZXJnU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIGNvbnN0IHRvdGFsID0geC5jb3VudEJpdHModHJ1ZSkgKyB5LmNvdW50Qml0cyh0cnVlKTtcbiAgY29uc3QgbGVuID0geC5sZW5ndGg7XG4gIGNvbnN0IGRpZmYgPSBsZW4gLSB0b3RhbCArIGNvbW1vbjtcbiAgaWYgKChjb21tb24gPT0gbGVuKSB8fCAoZGlmZiA9PSBsZW4pKSByZXR1cm4gMS4wO1xuICBlbHNlIHJldHVybiBjb21tb24gLyB0b3RhbCArIGRpZmYgLyAoMiAqIGxlbiAtIHRvdGFsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJvZ290R29sZGJlcmdEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShyb2dvdEdvbGRiZXJnU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaW1pbGFyaXR5RnJvbURpc3RhbmNlKGRpc3RhbmNlOiBudW1iZXIpIHtcbiAgcmV0dXJuIDEgLyAoMSArIGRpc3RhbmNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkoc2ltaWxhcml0eTogbnVtYmVyKSB7XG4gIHJldHVybiAxIC8gc2ltaWxhcml0eSAtIDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBudW1lcmljRGlzdGFuY2UoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgcmV0dXJuIE1hdGguYWJzKHggLSB5KTtcbn1cbiJdfQ==","import { hamming } from './hamming';\nimport { levenstein } from './levenstein';\nimport { needlemanWunch } from './needleman-wunsch';\n/** Enum containing currently supported macromolecule distance functions\n * Hamming distance will be used if the sequences are already aligned\n * Needleman distance will be used for protein sequences with known BLOSUM62 matrix\n * Levenshtein distance will be used for nucleotide sequences as for them substitution matrix is same as identity matrix\n */\nexport var MmDistanceFunctionsNames;\n(function (MmDistanceFunctionsNames) {\n MmDistanceFunctionsNames[\"HAMMING\"] = \"Hamming\";\n MmDistanceFunctionsNames[\"LEVENSHTEIN\"] = \"Levenshtein\";\n MmDistanceFunctionsNames[\"NEEDLEMANN_WUNSCH\"] = \"Needlemann-Wunsch\";\n})(MmDistanceFunctionsNames || (MmDistanceFunctionsNames = {}));\n;\nexport const mmDistanceFunctions = {\n [MmDistanceFunctionsNames.HAMMING]: hamming,\n [MmDistanceFunctionsNames.LEVENSHTEIN]: levenstein,\n [MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH]: needlemanWunch\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjcm9tb2xlY3VsZS1kaXN0YW5jZS1mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNyb21vbGVjdWxlLWRpc3RhbmNlLWZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR2xEOzs7O0dBSUc7QUFDSCxNQUFNLENBQU4sSUFBWSx3QkFJWDtBQUpELFdBQVksd0JBQXdCO0lBQ2hDLCtDQUFtQixDQUFBO0lBQ25CLHVEQUEyQixDQUFBO0lBQzNCLG1FQUF1QyxDQUFBO0FBQzNDLENBQUMsRUFKVyx3QkFBd0IsS0FBeEIsd0JBQXdCLFFBSW5DO0FBQUEsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUE4RTtJQUM1RyxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU87SUFDM0MsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxVQUFVO0lBQ2xELENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxjQUFjO0NBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2hhbW1pbmd9IGZyb20gJy4vaGFtbWluZyc7XG5pbXBvcnQge2xldmVuc3RlaW59IGZyb20gJy4vbGV2ZW5zdGVpbic7XG5pbXBvcnQge25lZWRsZW1hbld1bmNofSBmcm9tICcuL25lZWRsZW1hbi13dW5zY2gnO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSBmcm9tICcuL3R5cGVzJztcblxuLyoqIEVudW0gY29udGFpbmluZyBjdXJyZW50bHkgc3VwcG9ydGVkIG1hY3JvbW9sZWN1bGUgZGlzdGFuY2UgZnVuY3Rpb25zXG4gKiBIYW1taW5nIGRpc3RhbmNlIHdpbGwgYmUgdXNlZCBpZiB0aGUgc2VxdWVuY2VzIGFyZSBhbHJlYWR5IGFsaWduZWRcbiAqIE5lZWRsZW1hbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIHByb3RlaW4gc2VxdWVuY2VzIHdpdGgga25vd24gQkxPU1VNNjIgbWF0cml4XG4gKiBMZXZlbnNodGVpbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIG51Y2xlb3RpZGUgc2VxdWVuY2VzIGFzIGZvciB0aGVtIHN1YnN0aXR1dGlvbiBtYXRyaXggaXMgc2FtZSBhcyBpZGVudGl0eSBtYXRyaXhcbiAqL1xuZXhwb3J0IGVudW0gTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzIHtcbiAgICBIQU1NSU5HID0gJ0hhbW1pbmcnLFxuICAgIExFVkVOU0hURUlOID0gJ0xldmVuc2h0ZWluJyxcbiAgICBORUVETEVNQU5OX1dVTlNDSCA9ICdOZWVkbGVtYW5uLVd1bnNjaCdcbn07XG5cbmV4cG9ydCBjb25zdCBtbURpc3RhbmNlRnVuY3Rpb25zOiBSZWNvcmQ8TW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLCAodmFsdWU/OiBhbnkpID0+IG1tRGlzdGFuY2VGdW5jdGlvblR5cGU+ID0ge1xuICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkhBTU1JTkddOiBoYW1taW5nLFxuICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkxFVkVOU0hURUlOXTogbGV2ZW5zdGVpbixcbiAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5ORUVETEVNQU5OX1dVTlNDSF06IG5lZWRsZW1hbld1bmNoXG59O1xuIl19","/**\n * Denotes a vector of floating poit values.\n *\n * @export\n * @class Vector\n * @extends {Float32Array}\n */\nexport class Vector extends Float32Array {\n}\n/**\n * Denotes a two-dimensional matrix.\n *\n * @export\n * @class Matrix\n * @extends {Array<Vector>}\n */\nexport class Matrix extends Array {\n}\n/**\n * Denotes cartesian coordinates.\n *\n * @export\n * @class Coordinates\n * @extends {Matrix}\n */\nexport class Coordinates extends Matrix {\n}\n/**\n * Denotes an array of arbitrary-typed vectors.\n *\n * @export\n * @class Vectors\n * @extends {Array<any>}\n */\nexport class Vectors extends Array {\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLWRlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbi8qKlxuICogRGVub3RlcyBhIHZlY3RvciBvZiBmbG9hdGluZyBwb2l0IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVmVjdG9yXG4gKiBAZXh0ZW5kcyB7RmxvYXQzMkFycmF5fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yIGV4dGVuZHMgRmxvYXQzMkFycmF5IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIHR3by1kaW1lbnNpb25hbCBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE1hdHJpeFxuICogQGV4dGVuZHMge0FycmF5PFZlY3Rvcj59XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBcnJheTxWZWN0b3I+IHt9XG5cbi8qKlxuICogRGVub3RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvb3JkaW5hdGVzXG4gKiBAZXh0ZW5kcyB7TWF0cml4fVxuICovXG5leHBvcnQgY2xhc3MgQ29vcmRpbmF0ZXMgZXh0ZW5kcyBNYXRyaXgge31cblxuLyoqXG4gKiBEZW5vdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeS10eXBlZCB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBWZWN0b3JzXG4gKiBAZXh0ZW5kcyB7QXJyYXk8YW55Pn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcnMgZXh0ZW5kcyBBcnJheTxhbnk+IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBmdW5jdGlvbiBvcHRpb25zLlxuICpcbiAqIEBleHBvcnRcbiAqIEB0eXBlIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcbiAqIEBwYXJhbSB7YW55fSB2MSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHthbnl9IHYyIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBEaXN0YW5jZU1ldHJpYyA9ICh2MTogYW55LCB2MjogYW55KSA9PiAobnVtYmVyKTtcblxuLyoqXG4gKiBEZW5vdGVzIGEgc2ltcGxlIHN0cmluZyB0byBzdHJpbmcgZGljdGlvbmFyeS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdHlwZSBTdHJpbmdEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0RpY3Rpb25hcnkgPSB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcblxuXG5leHBvcnQgdHlwZSBDb2x1bW5JbnB1dE9wdGlvbnMgPSB7XG4gICAgZmlsdGVyPzogKGNvbDogREcuQ29sdW1uKSA9PiBib29sZWFuIHwgbnVsbDtcbn07XG4iXX0=","\"use strict\";\n// Reference: https://www.geeksforgeeks.org/jaro-and-jaro-winkler-similarity/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.jaroWinkler = exports.jaro = void 0;\n/**\n *\n * @param str1 String 1 for compare\n * @param str2 String 2 for compare\n * @param options to control case sensitive or not\n */\nfunction jaro(str1, str2, options) {\n // Exit early if either are empty.\n if (str1.length === 0 || str2.length === 0) {\n return 0;\n }\n // Convert to upper if case-sensitive is false.\n if (options && !options.caseSensitive) {\n str1 = str1.toUpperCase();\n str2 = str2.toUpperCase();\n }\n // Exact match\n if (str1 === str2) {\n return 1;\n }\n // Number of matches\n var m = 0;\n // Length of two Strings\n var len1 = str1.length;\n var len2 = str2.length;\n // Maximum distance\n var window = Math.floor(Math.max(len1, len2) / 2) - 1;\n // Hash for matches\n var str1Hash = new Array(len1);\n var str2Hash = new Array(len2);\n for (var i = 0; i < len1; i++) {\n for (var j = Math.max(0, i - window); j <= Math.min(len2, i + window + 1); j++) {\n if (!str1Hash[i] && !str2Hash[j] && str1[i] === str2[j]) {\n ++m;\n str1Hash[i] = str2Hash[j] = true;\n break;\n }\n }\n }\n // Exit early if no matches were found.\n if (m === 0) {\n return 0;\n }\n // Count the transpositions.\n var t = 0;\n var point = 0;\n for (var i = 0; i < len1; i++) {\n if (str1Hash[i]) {\n while (!str2Hash[point]) {\n point++;\n }\n if (str1.charAt(i) !== str2.charAt(point++)) {\n t++;\n }\n }\n }\n t /= 2;\n return (m / len1 + m / len2 + (m - t) / m) / 3;\n}\nexports.jaro = jaro;\n/**\n *\n * @param str1 String 1 for compare\n * @param str2 String 2 for compare\n * @param options to control case sensitive or not\n */\nfunction jaroWinkler(str1, str2, options) {\n // Jaro Distance\n var jaroDist = jaro(str1, str2, options);\n // Same prefix length, maxium is 4\n var prefix = 0;\n if (jaroDist > 0.7) {\n var minIndex = Math.min(str1.length, str2.length);\n var i = 0;\n while (str1[i] === str2[i] && i < 4 && i < minIndex) {\n ++prefix;\n i++;\n }\n jaroDist += 0.1 * prefix * (1 - jaroDist);\n }\n return jaroDist;\n}\nexports.jaroWinkler = jaroWinkler;\n"],"names":["tanimotoDistance","x","y","getDistanceFromSimilarity","total","trueCount","common","andWithCountBits","tanimotoSimilarity","diceDistance","diceSimilarity","cosineDistance","Math","sqrt","cosineSimilarity","euclideanDistance","hammingDistance","sokalDistance","sokalSimilarity","kulczynskiDistance","totalProd","kulczynskiSimilarity","mcConnaugheyDistance","mcConnaugheySimilarity","asymmetricDistance","min","asymmetricSimilarity","braunBlanquetDistance","max","braunBlanquetSimilarity","russelDistance","length","russelSimilarity","rogotGoldbergDistance","countBits","len","diff","rogotGoldbergSimilarity","similarity","numericDistance","abs","Tanimoto","Dice","Asymmetric","BraunBlanquet","Cosine","Kulczynski","McConnaughey","RogotGoldberg","Russel","Sokal","Hamming","Euclidean","MmDistanceFunctionsNames","mmDistanceFunctions","HAMMING","LEVENSHTEIN","NEEDLEMANN_WUNSCH","n","Vector","Float32Array","exports","str1","str2","options","jaroDist","caseSensitive","toUpperCase","m","len1","len2","window","floor","str1Hash","Array","str2Hash","i","j","t","point","charAt","jaro","prefix","minIndex"],"sourceRoot":""}
1
+ {"version":3,"file":"452.js","mappings":"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","sources":["webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-metrics-methods.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/macromolecule-distance-functions.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://bio/./node_modules/jaro-winkler-typescript/lib/index.js"],"sourcesContent":["import { BitArrayMetricsNames } from './typed-metrics/consts';\nexport const similarityMetric = {\n [BitArrayMetricsNames.Tanimoto]: tanimotoSimilarity,\n [BitArrayMetricsNames.Dice]: diceSimilarity,\n [BitArrayMetricsNames.Asymmetric]: asymmetricSimilarity,\n [BitArrayMetricsNames.BraunBlanquet]: braunBlanquetSimilarity,\n [BitArrayMetricsNames.Cosine]: cosineSimilarity,\n [BitArrayMetricsNames.Kulczynski]: kulczynskiSimilarity,\n [BitArrayMetricsNames.McConnaughey]: mcConnaugheySimilarity,\n [BitArrayMetricsNames.RogotGoldberg]: rogotGoldbergSimilarity,\n [BitArrayMetricsNames.Russel]: russelSimilarity,\n [BitArrayMetricsNames.Sokal]: sokalSimilarity,\n [BitArrayMetricsNames.Hamming]: hammingSimilarity,\n [BitArrayMetricsNames.Euclidean]: euclideanSimilarity,\n};\nexport const distanceMetrics = {\n [BitArrayMetricsNames.Tanimoto]: tanimotoDistance,\n [BitArrayMetricsNames.Dice]: diceDistance,\n [BitArrayMetricsNames.Asymmetric]: asymmetricDistance,\n [BitArrayMetricsNames.BraunBlanquet]: braunBlanquetDistance,\n [BitArrayMetricsNames.Cosine]: cosineDistance,\n [BitArrayMetricsNames.Kulczynski]: kulczynskiDistance,\n [BitArrayMetricsNames.McConnaughey]: mcConnaugheyDistance,\n [BitArrayMetricsNames.RogotGoldberg]: rogotGoldbergDistance,\n [BitArrayMetricsNames.Russel]: russelDistance,\n [BitArrayMetricsNames.Sokal]: sokalDistance,\n [BitArrayMetricsNames.Hamming]: hammingDistance,\n [BitArrayMetricsNames.Euclidean]: euclideanDistance,\n};\nexport const CHEM_SIMILARITY_METRICS = [\n BitArrayMetricsNames.Tanimoto,\n BitArrayMetricsNames.Dice,\n BitArrayMetricsNames.Cosine\n];\nexport const SEQ_SPACE_SIMILARITY_METRICS = [\n BitArrayMetricsNames.Tanimoto,\n BitArrayMetricsNames.Asymmetric,\n BitArrayMetricsNames.Cosine,\n BitArrayMetricsNames.Sokal\n];\nexport function tanimotoSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n if (total == 0)\n return 1.0;\n const common = x.andWithCountBits(y, true);\n return common / (total - common);\n}\nexport function tanimotoDistance(x, y) {\n return getDistanceFromSimilarity(tanimotoSimilarity(x, y));\n}\nexport function diceSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n if (total == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return 2 * common / total;\n}\nexport function diceDistance(x, y) {\n return getDistanceFromSimilarity(diceSimilarity(x, y));\n}\nexport function cosineSimilarity(x, y) {\n const total = x.trueCount() * y.trueCount();\n if (total == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / Math.sqrt(total);\n}\nexport function cosineDistance(x, y) {\n return getDistanceFromSimilarity(cosineSimilarity(x, y));\n}\nexport function euclideanSimilarity(x, y) {\n return getSimilarityFromDistance(euclideanDistance(x, y));\n}\nexport function euclideanDistance(x, y) {\n return Math.sqrt(x.trueCount() + y.trueCount() - 2 * x.andWithCountBits(y, true));\n}\nexport function hammingSimilarity(x, y) {\n return getSimilarityFromDistance(hammingDistance(x, y));\n}\nexport function hammingDistance(x, y) {\n return x.trueCount() + y.trueCount() - 2 * x.andWithCountBits(y, true);\n}\nexport function sokalSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const common = x.andWithCountBits(y, true);\n return common / (2 * total - 3 * common);\n}\nexport function sokalDistance(x, y) {\n return getDistanceFromSimilarity(sokalSimilarity(x, y));\n}\nexport function kulczynskiSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const totalProd = x.trueCount() * y.trueCount();\n if (totalProd == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return (common * total) / (2 * totalProd);\n}\nexport function kulczynskiDistance(x, y) {\n return getDistanceFromSimilarity(kulczynskiSimilarity(x, y));\n}\nexport function mcConnaugheySimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const totalProd = x.trueCount() * y.trueCount();\n if (totalProd == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return (common * total - totalProd) / totalProd;\n}\nexport function mcConnaugheyDistance(x, y) {\n return getDistanceFromSimilarity(mcConnaugheySimilarity(x, y));\n}\nexport function asymmetricSimilarity(x, y) {\n const min = Math.min(x.trueCount(), y.trueCount());\n if (min == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / min;\n}\nexport function asymmetricDistance(x, y) {\n return getDistanceFromSimilarity(asymmetricSimilarity(x, y));\n}\nexport function braunBlanquetSimilarity(x, y) {\n const max = Math.max(x.trueCount(), y.trueCount());\n if (max == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / max;\n}\nexport function braunBlanquetDistance(x, y) {\n return getDistanceFromSimilarity(braunBlanquetSimilarity(x, y));\n}\nexport function russelSimilarity(x, y) {\n if (x.length == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / x.length;\n}\nexport function russelDistance(x, y) {\n return getDistanceFromSimilarity(russelSimilarity(x, y));\n}\nexport function rogotGoldbergSimilarity(x, y) {\n const common = x.andWithCountBits(y, true);\n const total = x.countBits(true) + y.countBits(true);\n const len = x.length;\n const diff = len - total + common;\n if ((common == len) || (diff == len))\n return 1.0;\n else\n return common / total + diff / (2 * len - total);\n}\nexport function rogotGoldbergDistance(x, y) {\n return getDistanceFromSimilarity(rogotGoldbergSimilarity(x, y));\n}\nexport function getSimilarityFromDistance(distance) {\n return 1 / (1 + distance);\n}\nexport function getDistanceFromSimilarity(similarity) {\n return similarity === 0 ? 3.402823E+38 : (1 / similarity) - 1;\n}\nexport function numericDistance(x, y) {\n return Math.abs(x - y);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRTVELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE2RDtJQUN4RixDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxFQUFFLGtCQUFrQjtJQUNuRCxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLGNBQWM7SUFDM0MsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxvQkFBb0I7SUFDdkQsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBRSx1QkFBdUI7SUFDN0QsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDL0MsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxvQkFBb0I7SUFDdkQsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxzQkFBc0I7SUFDM0QsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBRSx1QkFBdUI7SUFDN0QsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDL0MsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxlQUFlO0lBQzdDLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUUsaUJBQWlCO0lBQ2pELENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEVBQUUsbUJBQW1CO0NBQ3RELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQTZEO0lBQ3ZGLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEVBQUUsZ0JBQWdCO0lBQ2pELENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsWUFBWTtJQUN6QyxDQUFDLG9CQUFvQixDQUFDLFVB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RyxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLENBQVcsRUFBRSxDQUFXO0lBQzVELE9BQU8seUJBQXlCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxRQUFnQjtJQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQsTUFBTSxVQUFVLHlCQUF5QixDQUFDLFVBQWtCO0lBQzFELE9BQU8sVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDbEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpdEFycmF5IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL2JpdC1hcnJheSc7XG5pbXBvcnQge0JpdEFycmF5TWV0cmljc05hbWVzfSBmcm9tICcuL3R5cGVkLW1ldHJpY3MvY29uc3RzJztcblxuZXhwb3J0IGNvbnN0IHNpbWlsYXJpdHlNZXRyaWM6IHsgW25hbWU6IHN0cmluZ106ICh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpID0+IG51bWJlciB9ID0ge1xuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dOiB0YW5pbW90b1NpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5EaWNlXTogZGljZVNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYXN5bW1ldHJpY1NpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5CcmF1bkJsYW5xdWV0XTogYnJhdW5CbGFucXVldFNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdOiBjb3NpbmVTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGt1bGN6eW5za2lTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuTWNDb25uYXVnaGV5XTogbWNDb25uYXVnaGV5U2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJvZ290R29sZGJlcmddOiByb2dvdEdvbGRiZXJnU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IHJ1c3NlbFNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF06IHNva2FsU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkhhbW1pbmddOiBoYW1taW5nU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGV1Y2xpZGVhblNpbWlsYXJpdHksXG59O1xuXG5leHBvcnQgY29uc3QgZGlzdGFuY2VNZXRyaWNzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KSA9PiBudW1iZXIgfSA9IHtcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvXTogdGFuaW1vdG9EaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdOiBkaWNlRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYXN5bW1ldHJpY0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQnJhdW5CbGFucXVldF06IGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV06IGNvc2luZURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGt1bGN6eW5za2lEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV06IG1jQ29ubmF1Z2hleURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ106IHJvZ290R29sZGJlcmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IHJ1c3NlbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuU29rYWxdOiBzb2thbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuSGFtbWluZ106IGhhbW1pbmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGV1Y2xpZGVhbkRpc3RhbmNlLFxufTtcblxuZXhwb3J0IGNvbnN0IENIRU1fU0lNSUxBUklUWV9NRVRSSUNTID0gW1xuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90byxcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuRGljZSxcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lXTtcbmV4cG9ydCBjb25zdCBTRVFfU1BBQ0VfU0lNSUxBUklUWV9NRVRSSUNTID0gW1xuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90byxcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuQXN5bW1ldHJpYyxcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lLFxuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF07XG5cbmV4cG9ydCBmdW5jdGlvbiB0YW5pbW90b1NpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsID09IDApIHJldHVybiAxLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvICh0b3RhbCAtIGNvbW1vbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0YW5pbW90b0Rpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KHRhbmltb3RvU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWNlU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBpZiAodG90YWwgPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gMiAqIGNvbW1vbiAvIHRvdGFsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGljZURpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KGRpY2VTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvc2luZVNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICogeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvIE1hdGguc3FydCh0b3RhbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3NpbmVEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShjb3NpbmVTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV1Y2xpZGVhblNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldFNpbWlsYXJpdHlGcm9tRGlzdGFuY2UoZXVjbGlkZWFuRGlzdGFuY2UoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXVjbGlkZWFuRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguc3FydCh4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKSAtIDIgKiB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFtbWluZ1NpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldFNpbWlsYXJpdHlGcm9tRGlzdGFuY2UoaGFtbWluZ0Rpc3RhbmNlKHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbW1pbmdEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCkgLSAyICogeC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29rYWxTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCk7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvICgyICogdG90YWwgLSAzICogY29tbW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNva2FsRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkoc29rYWxTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGt1bGN6eW5za2lTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCk7XG4gIGNvbnN0IHRvdGFsUHJvZCA9IHgudHJ1ZUNvdW50KCkgKiB5LnRydWVDb3VudCgpO1xuICBpZiAodG90YWxQcm9kID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIChjb21tb24gKiB0b3RhbCkgLyAoMiAqIHRvdGFsUHJvZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBrdWxjenluc2tpRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkoa3VsY3p5bnNraVNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWNDb25uYXVnaGV5U2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBjb25zdCB0b3RhbFByb2QgPSB4LnRydWVDb3VudCgpICogeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsUHJvZCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiAoY29tbW9uICogdG90YWwgLSB0b3RhbFByb2QpIC8gdG90YWxQcm9kO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWNDb25uYXVnaGV5RGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkobWNDb25uYXVnaGV5U2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3ltbWV0cmljU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCBtaW4gPSBNYXRoLm1pbih4LnRydWVDb3VudCgpLCB5LnRydWVDb3VudCgpKTtcbiAgaWYgKG1pbiA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyBtaW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3ltbWV0cmljRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkoYXN5bW1ldHJpY1NpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJhdW5CbGFucXVldFNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgoeC50cnVlQ291bnQoKSwgeS50cnVlQ291bnQoKSk7XG4gIGlmIChtYXggPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gbWF4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJhdW5CbGFucXVldERpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KGJyYXVuQmxhbnF1ZXRTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1c3NlbFNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgaWYgKHgubGVuZ3RoID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvIHgubGVuZ3RoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVzc2VsRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkocnVzc2VsU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByb2dvdEdvbGRiZXJnU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIGNvbnN0IHRvdGFsID0geC5jb3VudEJpdHModHJ1ZSkgKyB5LmNvdW50Qml0cyh0cnVlKTtcbiAgY29uc3QgbGVuID0geC5sZW5ndGg7XG4gIGNvbnN0IGRpZmYgPSBsZW4gLSB0b3RhbCArIGNvbW1vbjtcbiAgaWYgKChjb21tb24gPT0gbGVuKSB8fCAoZGlmZiA9PSBsZW4pKSByZXR1cm4gMS4wO1xuICBlbHNlIHJldHVybiBjb21tb24gLyB0b3RhbCArIGRpZmYgLyAoMiAqIGxlbiAtIHRvdGFsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJvZ290R29sZGJlcmdEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShyb2dvdEdvbGRiZXJnU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaW1pbGFyaXR5RnJvbURpc3RhbmNlKGRpc3RhbmNlOiBudW1iZXIpIHtcbiAgcmV0dXJuIDEgLyAoMSArIGRpc3RhbmNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkoc2ltaWxhcml0eTogbnVtYmVyKSB7IC8vaW4gY2FzZSBzaW1pbGFyaXR5IGlzIDAsIHVzZSBtYXggbnVtYmVyIGZvciBmbG9hdDMyXG4gIHJldHVybiBzaW1pbGFyaXR5ID09PSAwID8gMy40MDI4MjNFKzM4IDogKDEgLyBzaW1pbGFyaXR5KSAtIDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBudW1lcmljRGlzdGFuY2UoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgcmV0dXJuIE1hdGguYWJzKHggLSB5KTtcbn1cbiJdfQ==","import { hamming } from './hamming';\nimport { levenstein } from './levenstein';\nimport { needlemanWunch } from './needleman-wunsch';\n/** Enum containing currently supported macromolecule distance functions\n * Hamming distance will be used if the sequences are already aligned\n * Needleman distance will be used for protein sequences with known BLOSUM62 matrix\n * Levenshtein distance will be used for nucleotide sequences as for them substitution matrix is same as identity matrix\n */\nexport var MmDistanceFunctionsNames;\n(function (MmDistanceFunctionsNames) {\n MmDistanceFunctionsNames[\"HAMMING\"] = \"Hamming\";\n MmDistanceFunctionsNames[\"LEVENSHTEIN\"] = \"Levenshtein\";\n MmDistanceFunctionsNames[\"NEEDLEMANN_WUNSCH\"] = \"Needlemann-Wunsch\";\n})(MmDistanceFunctionsNames || (MmDistanceFunctionsNames = {}));\n;\nexport const mmDistanceFunctions = {\n [MmDistanceFunctionsNames.HAMMING]: hamming,\n [MmDistanceFunctionsNames.LEVENSHTEIN]: levenstein,\n [MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH]: needlemanWunch\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjcm9tb2xlY3VsZS1kaXN0YW5jZS1mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNyb21vbGVjdWxlLWRpc3RhbmNlLWZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR2xEOzs7O0dBSUc7QUFDSCxNQUFNLENBQU4sSUFBWSx3QkFJWDtBQUpELFdBQVksd0JBQXdCO0lBQ2hDLCtDQUFtQixDQUFBO0lBQ25CLHVEQUEyQixDQUFBO0lBQzNCLG1FQUF1QyxDQUFBO0FBQzNDLENBQUMsRUFKVyx3QkFBd0IsS0FBeEIsd0JBQXdCLFFBSW5DO0FBQUEsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUE4RTtJQUM1RyxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU87SUFDM0MsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxVQUFVO0lBQ2xELENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxjQUFjO0NBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2hhbW1pbmd9IGZyb20gJy4vaGFtbWluZyc7XG5pbXBvcnQge2xldmVuc3RlaW59IGZyb20gJy4vbGV2ZW5zdGVpbic7XG5pbXBvcnQge25lZWRsZW1hbld1bmNofSBmcm9tICcuL25lZWRsZW1hbi13dW5zY2gnO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSBmcm9tICcuL3R5cGVzJztcblxuLyoqIEVudW0gY29udGFpbmluZyBjdXJyZW50bHkgc3VwcG9ydGVkIG1hY3JvbW9sZWN1bGUgZGlzdGFuY2UgZnVuY3Rpb25zXG4gKiBIYW1taW5nIGRpc3RhbmNlIHdpbGwgYmUgdXNlZCBpZiB0aGUgc2VxdWVuY2VzIGFyZSBhbHJlYWR5IGFsaWduZWRcbiAqIE5lZWRsZW1hbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIHByb3RlaW4gc2VxdWVuY2VzIHdpdGgga25vd24gQkxPU1VNNjIgbWF0cml4XG4gKiBMZXZlbnNodGVpbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIG51Y2xlb3RpZGUgc2VxdWVuY2VzIGFzIGZvciB0aGVtIHN1YnN0aXR1dGlvbiBtYXRyaXggaXMgc2FtZSBhcyBpZGVudGl0eSBtYXRyaXhcbiAqL1xuZXhwb3J0IGVudW0gTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzIHtcbiAgICBIQU1NSU5HID0gJ0hhbW1pbmcnLFxuICAgIExFVkVOU0hURUlOID0gJ0xldmVuc2h0ZWluJyxcbiAgICBORUVETEVNQU5OX1dVTlNDSCA9ICdOZWVkbGVtYW5uLVd1bnNjaCdcbn07XG5cbmV4cG9ydCBjb25zdCBtbURpc3RhbmNlRnVuY3Rpb25zOiBSZWNvcmQ8TW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLCAodmFsdWU/OiBhbnkpID0+IG1tRGlzdGFuY2VGdW5jdGlvblR5cGU+ID0ge1xuICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkhBTU1JTkddOiBoYW1taW5nLFxuICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkxFVkVOU0hURUlOXTogbGV2ZW5zdGVpbixcbiAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5ORUVETEVNQU5OX1dVTlNDSF06IG5lZWRsZW1hbld1bmNoXG59O1xuIl19","/**\n * Denotes a vector of floating poit values.\n *\n * @export\n * @class Vector\n * @extends {Float32Array}\n */\nexport class Vector extends Float32Array {\n}\n/**\n * Denotes a two-dimensional matrix.\n *\n * @export\n * @class Matrix\n * @extends {Array<Vector>}\n */\nexport class Matrix extends Array {\n}\n/**\n * Denotes cartesian coordinates.\n *\n * @export\n * @class Coordinates\n * @extends {Matrix}\n */\nexport class Coordinates extends Matrix {\n}\n/**\n * Denotes an array of arbitrary-typed vectors.\n *\n * @export\n * @class Vectors\n * @extends {Array<any>}\n */\nexport class Vectors extends Array {\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLWRlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbi8qKlxuICogRGVub3RlcyBhIHZlY3RvciBvZiBmbG9hdGluZyBwb2l0IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVmVjdG9yXG4gKiBAZXh0ZW5kcyB7RmxvYXQzMkFycmF5fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yIGV4dGVuZHMgRmxvYXQzMkFycmF5IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIHR3by1kaW1lbnNpb25hbCBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE1hdHJpeFxuICogQGV4dGVuZHMge0FycmF5PFZlY3Rvcj59XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBcnJheTxWZWN0b3I+IHt9XG5cbi8qKlxuICogRGVub3RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvb3JkaW5hdGVzXG4gKiBAZXh0ZW5kcyB7TWF0cml4fVxuICovXG5leHBvcnQgY2xhc3MgQ29vcmRpbmF0ZXMgZXh0ZW5kcyBNYXRyaXgge31cblxuLyoqXG4gKiBEZW5vdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeS10eXBlZCB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBWZWN0b3JzXG4gKiBAZXh0ZW5kcyB7QXJyYXk8YW55Pn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcnMgZXh0ZW5kcyBBcnJheTxhbnk+IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBmdW5jdGlvbiBvcHRpb25zLlxuICpcbiAqIEBleHBvcnRcbiAqIEB0eXBlIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcbiAqIEBwYXJhbSB7YW55fSB2MSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHthbnl9IHYyIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBEaXN0YW5jZU1ldHJpYyA9ICh2MTogYW55LCB2MjogYW55KSA9PiAobnVtYmVyKTtcblxuLyoqXG4gKiBEZW5vdGVzIGEgc2ltcGxlIHN0cmluZyB0byBzdHJpbmcgZGljdGlvbmFyeS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdHlwZSBTdHJpbmdEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0RpY3Rpb25hcnkgPSB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcblxuXG5leHBvcnQgdHlwZSBDb2x1bW5JbnB1dE9wdGlvbnMgPSB7XG4gICAgZmlsdGVyPzogKGNvbDogREcuQ29sdW1uKSA9PiBib29sZWFuIHwgbnVsbDtcbn07XG4iXX0=","\"use strict\";\n// Reference: https://www.geeksforgeeks.org/jaro-and-jaro-winkler-similarity/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.jaroWinkler = exports.jaro = void 0;\n/**\n *\n * @param str1 String 1 for compare\n * @param str2 String 2 for compare\n * @param options to control case sensitive or not\n */\nfunction jaro(str1, str2, options) {\n // Exit early if either are empty.\n if (str1.length === 0 || str2.length === 0) {\n return 0;\n }\n // Convert to upper if case-sensitive is false.\n if (options && !options.caseSensitive) {\n str1 = str1.toUpperCase();\n str2 = str2.toUpperCase();\n }\n // Exact match\n if (str1 === str2) {\n return 1;\n }\n // Number of matches\n var m = 0;\n // Length of two Strings\n var len1 = str1.length;\n var len2 = str2.length;\n // Maximum distance\n var window = Math.floor(Math.max(len1, len2) / 2) - 1;\n // Hash for matches\n var str1Hash = new Array(len1);\n var str2Hash = new Array(len2);\n for (var i = 0; i < len1; i++) {\n for (var j = Math.max(0, i - window); j <= Math.min(len2, i + window + 1); j++) {\n if (!str1Hash[i] && !str2Hash[j] && str1[i] === str2[j]) {\n ++m;\n str1Hash[i] = str2Hash[j] = true;\n break;\n }\n }\n }\n // Exit early if no matches were found.\n if (m === 0) {\n return 0;\n }\n // Count the transpositions.\n var t = 0;\n var point = 0;\n for (var i = 0; i < len1; i++) {\n if (str1Hash[i]) {\n while (!str2Hash[point]) {\n point++;\n }\n if (str1.charAt(i) !== str2.charAt(point++)) {\n t++;\n }\n }\n }\n t /= 2;\n return (m / len1 + m / len2 + (m - t) / m) / 3;\n}\nexports.jaro = jaro;\n/**\n *\n * @param str1 String 1 for compare\n * @param str2 String 2 for compare\n * @param options to control case sensitive or not\n */\nfunction jaroWinkler(str1, str2, options) {\n // Jaro Distance\n var jaroDist = jaro(str1, str2, options);\n // Same prefix length, maxium is 4\n var prefix = 0;\n if (jaroDist > 0.7) {\n var minIndex = Math.min(str1.length, str2.length);\n var i = 0;\n while (str1[i] === str2[i] && i < 4 && i < minIndex) {\n ++prefix;\n i++;\n }\n jaroDist += 0.1 * prefix * (1 - jaroDist);\n }\n return jaroDist;\n}\nexports.jaroWinkler = jaroWinkler;\n"],"names":["tanimotoDistance","x","y","getDistanceFromSimilarity","total","trueCount","common","andWithCountBits","tanimotoSimilarity","diceDistance","diceSimilarity","cosineDistance","Math","sqrt","cosineSimilarity","euclideanDistance","hammingDistance","sokalDistance","sokalSimilarity","kulczynskiDistance","totalProd","kulczynskiSimilarity","mcConnaugheyDistance","mcConnaugheySimilarity","asymmetricDistance","min","asymmetricSimilarity","braunBlanquetDistance","max","braunBlanquetSimilarity","russelDistance","length","russelSimilarity","rogotGoldbergDistance","countBits","len","diff","rogotGoldbergSimilarity","similarity","numericDistance","abs","Tanimoto","Dice","Asymmetric","BraunBlanquet","Cosine","Kulczynski","McConnaughey","RogotGoldberg","Russel","Sokal","Hamming","Euclidean","MmDistanceFunctionsNames","mmDistanceFunctions","HAMMING","LEVENSHTEIN","NEEDLEMANN_WUNSCH","n","Vector","Float32Array","exports","str1","str2","options","jaroDist","caseSensitive","toUpperCase","m","len1","len2","window","floor","str1Hash","Array","str2Hash","i","j","t","point","charAt","jaro","prefix","minIndex"],"sourceRoot":""}