Grammalecte  Hex Artifact Content

Artifact 508f46740ca320f9e546a10e2e377a30bdde4040291db7ffa6206bba7f4a4420:


0000: 2f 2f 2f 2f 20 49 42 44 41 57 47 0a 2f 2a 6a 73  //// IBDAWG./*js
0010: 6c 69 6e 74 20 65 73 76 65 72 73 69 6f 6e 3a 20  lint esversion: 
0020: 36 2a 2f 0a 2f 2a 67 6c 6f 62 61 6c 20 63 6f 6e  6*/./*global con
0030: 73 6f 6c 65 2c 72 65 71 75 69 72 65 2c 65 78 70  sole,require,exp
0040: 6f 72 74 73 2a 2f 0a 0a 22 75 73 65 20 73 74 72  orts*/.."use str
0050: 69 63 74 22 3b 0a 0a 0a 69 66 20 28 74 79 70 65  ict";...if (type
0060: 6f 66 28 72 65 71 75 69 72 65 29 20 21 3d 3d 20  of(require) !== 
0070: 27 75 6e 64 65 66 69 6e 65 64 27 29 20 7b 0a 20  'undefined') {. 
0080: 20 20 20 76 61 72 20 73 74 72 5f 74 72 61 6e 73     var str_trans
0090: 66 6f 72 6d 20 3d 20 72 65 71 75 69 72 65 28 22  form = require("
00a0: 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d  resource://gramm
00b0: 61 6c 65 63 74 65 2f 67 72 61 70 68 73 70 65 6c  alecte/graphspel
00c0: 6c 2f 73 74 72 5f 74 72 61 6e 73 66 6f 72 6d 2e  l/str_transform.
00d0: 6a 73 22 29 3b 0a 20 20 20 20 76 61 72 20 68 65  js");.    var he
00e0: 6c 70 65 72 73 20 3d 20 72 65 71 75 69 72 65 28  lpers = require(
00f0: 22 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61 6d  "resource://gram
0100: 6d 61 6c 65 63 74 65 2f 67 72 61 70 68 73 70 65  malecte/graphspe
0110: 6c 6c 2f 68 65 6c 70 65 72 73 2e 6a 73 22 29 3b  ll/helpers.js");
0120: 0a 20 20 20 20 76 61 72 20 63 68 61 72 5f 70 6c  .    var char_pl
0130: 61 79 65 72 20 3d 20 72 65 71 75 69 72 65 28 22  ayer = require("
0140: 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d  resource://gramm
0150: 61 6c 65 63 74 65 2f 67 72 61 70 68 73 70 65 6c  alecte/graphspel
0160: 6c 2f 63 68 61 72 5f 70 6c 61 79 65 72 2e 6a 73  l/char_player.js
0170: 22 29 3b 0a 7d 0a 0a 0a 2f 2f 20 44 6f 6e e2 80  ");.}...// Don..
0180: 99 74 20 72 65 6d 6f 76 65 20 3c 73 74 72 69 6e  .t remove <strin
0190: 67 3e 2e 20 4e 65 63 65 73 73 61 72 79 20 69 6e  g>. Necessary in
01a0: 20 54 42 2e 0a 24 7b 73 74 72 69 6e 67 7d 0a 24   TB..${string}.$
01b0: 7b 6d 61 70 7d 0a 24 7b 73 65 74 7d 0a 0a 0a 63  {map}.${set}...c
01c0: 6c 61 73 73 20 53 75 67 67 52 65 73 75 6c 74 20  lass SuggResult 
01d0: 7b 0a 20 20 20 20 2f 2f 20 53 74 72 75 63 74 75  {.    // Structu
01e0: 72 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 2c 20  re for storing, 
01f0: 63 6c 61 73 73 69 66 79 69 6e 67 20 61 6e 64 20  classifying and 
0200: 66 69 6c 74 65 72 69 6e 67 20 73 75 67 67 65 73  filtering sugges
0210: 74 69 6f 6e 73 0a 0a 20 20 20 20 63 6f 6e 73 74  tions..    const
0220: 72 75 63 74 6f 72 20 28 73 57 6f 72 64 2c 20 6e  ructor (sWord, n
0230: 44 69 73 74 4c 69 6d 69 74 3d 2d 31 29 20 7b 0a  DistLimit=-1) {.
0240: 20 20 20 20 20 20 20 20 74 68 69 73 2e 73 57 6f          this.sWo
0250: 72 64 20 3d 20 73 57 6f 72 64 3b 0a 20 20 20 20  rd = sWord;.    
0260: 20 20 20 20 74 68 69 73 2e 73 53 69 6d 70 6c 69      this.sSimpli
0270: 66 69 65 64 57 6f 72 64 20 3d 20 63 68 61 72 5f  fiedWord = char_
0280: 70 6c 61 79 65 72 2e 73 69 6d 70 6c 69 66 79 57  player.simplifyW
0290: 6f 72 64 28 73 57 6f 72 64 29 3b 0a 20 20 20 20  ord(sWord);.    
02a0: 20 20 20 20 74 68 69 73 2e 6e 44 69 73 74 4c 69      this.nDistLi
02b0: 6d 69 74 20 3d 20 28 6e 44 69 73 74 4c 69 6d 69  mit = (nDistLimi
02c0: 74 20 3e 3d 20 30 29 20 3f 20 6e 44 69 73 74 4c  t >= 0) ? nDistL
02d0: 69 6d 69 74 20 3a 20 20 4d 61 74 68 2e 66 6c 6f  imit :  Math.flo
02e0: 6f 72 28 73 57 6f 72 64 2e 6c 65 6e 67 74 68 20  or(sWord.length 
02f0: 2f 20 33 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  / 3) + 1;.      
0300: 20 20 74 68 69 73 2e 6e 4d 69 6e 44 69 73 74 20    this.nMinDist 
0310: 3d 20 31 30 30 30 3b 0a 20 20 20 20 20 20 20 20  = 1000;.        
0320: 74 68 69 73 2e 61 53 75 67 67 20 3d 20 6e 65 77  this.aSugg = new
0330: 20 53 65 74 28 29 3b 0a 20 20 20 20 20 20 20 20   Set();.        
0340: 74 68 69 73 2e 64 53 75 67 67 20 3d 20 6e 65 77  this.dSugg = new
0350: 20 4d 61 70 28 5b 20 5b 30 2c 20 5b 5d 5d 2c 20   Map([ [0, []], 
0360: 20 5b 31 2c 20 5b 5d 5d 2c 20 20 5b 32 2c 20 5b   [1, []],  [2, [
0370: 5d 5d 20 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ]] ]);.    }..  
0380: 20 20 61 64 64 53 75 67 67 20 28 73 53 75 67 67    addSugg (sSugg
0390: 2c 20 6e 44 65 65 70 3d 30 29 20 7b 0a 20 20 20  , nDeep=0) {.   
03a0: 20 20 20 20 20 2f 2f 20 61 64 64 20 61 20 73 75       // add a su
03b0: 67 67 65 73 74 69 6f 6e 0a 20 20 20 20 20 20 20  ggestion.       
03c0: 20 69 66 20 28 21 74 68 69 73 2e 61 53 75 67 67   if (!this.aSugg
03d0: 2e 68 61 73 28 73 53 75 67 67 29 29 20 7b 0a 20  .has(sSugg)) {. 
03e0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e             let n
03f0: 44 69 73 74 20 3d 20 73 74 72 5f 74 72 61 6e 73  Dist = str_trans
0400: 66 6f 72 6d 2e 64 69 73 74 61 6e 63 65 44 61 6d  form.distanceDam
0410: 65 72 61 75 4c 65 76 65 6e 73 68 74 65 69 6e 28  erauLevenshtein(
0420: 74 68 69 73 2e 73 53 69 6d 70 6c 69 66 69 65 64  this.sSimplified
0430: 57 6f 72 64 2c 20 63 68 61 72 5f 70 6c 61 79 65  Word, char_playe
0440: 72 2e 73 69 6d 70 6c 69 66 79 57 6f 72 64 28 73  r.simplifyWord(s
0450: 53 75 67 67 29 29 3b 0a 20 20 20 20 20 20 20 20  Sugg));.        
0460: 20 20 20 20 69 66 20 28 6e 44 69 73 74 20 3c 3d      if (nDist <=
0470: 20 74 68 69 73 2e 6e 44 69 73 74 4c 69 6d 69 74   this.nDistLimit
0480: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
0490: 20 20 20 20 69 66 20 28 21 74 68 69 73 2e 64 53      if (!this.dS
04a0: 75 67 67 2e 68 61 73 28 6e 44 69 73 74 29 29 20  ugg.has(nDist)) 
04b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
04c0: 20 20 20 20 20 20 74 68 69 73 2e 64 53 75 67 67        this.dSugg
04d0: 2e 73 65 74 28 6e 44 69 73 74 2c 20 5b 5d 29 3b  .set(nDist, []);
04e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
04f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
0500: 20 20 20 74 68 69 73 2e 64 53 75 67 67 2e 67 65     this.dSugg.ge
0510: 74 28 6e 44 69 73 74 29 2e 70 75 73 68 28 73 53  t(nDist).push(sS
0520: 75 67 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ugg);.          
0530: 20 20 20 20 20 20 74 68 69 73 2e 61 53 75 67 67        this.aSugg
0540: 2e 61 64 64 28 73 53 75 67 67 29 3b 0a 20 20 20  .add(sSugg);.   
0550: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
0560: 28 6e 44 69 73 74 20 3c 20 74 68 69 73 2e 6e 4d  (nDist < this.nM
0570: 69 6e 44 69 73 74 29 20 7b 0a 20 20 20 20 20 20  inDist) {.      
0580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
0590: 69 73 2e 6e 4d 69 6e 44 69 73 74 20 3d 20 6e 44  is.nMinDist = nD
05a0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ist;.           
05b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
05c0: 20 20 20 20 20 20 20 74 68 69 73 2e 6e 44 69 73         this.nDis
05d0: 74 4c 69 6d 69 74 20 3d 20 4d 61 74 68 2e 6d 69  tLimit = Math.mi
05e0: 6e 28 74 68 69 73 2e 6e 44 69 73 74 4c 69 6d 69  n(this.nDistLimi
05f0: 74 2c 20 74 68 69 73 2e 6e 4d 69 6e 44 69 73 74  t, this.nMinDist
0600: 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +2);.           
0610: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
0620: 20 7d 0a 0a 20 20 20 20 67 65 74 53 75 67 67 65   }..    getSugge
0630: 73 74 69 6f 6e 73 20 28 6e 53 75 67 67 4c 69 6d  stions (nSuggLim
0640: 69 74 3d 31 30 2c 20 6e 44 69 73 74 4c 69 6d 69  it=10, nDistLimi
0650: 74 3d 2d 31 29 20 7b 0a 20 20 20 20 20 20 20 20  t=-1) {.        
0660: 2f 2f 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74  // return a list
0670: 20 6f 66 20 73 75 67 67 65 73 74 69 6f 6e 73 0a   of suggestions.
0680: 20 20 20 20 20 20 20 20 6c 65 74 20 6c 52 65 73          let lRes
0690: 20 3d 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20 69   = [];.        i
06a0: 66 20 28 74 68 69 73 2e 64 53 75 67 67 2e 67 65  f (this.dSugg.ge
06b0: 74 28 30 29 2e 6c 65 6e 67 74 68 29 20 7b 0a 20  t(0).length) {. 
06c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 77 65             // we
06d0: 20 73 6f 72 74 20 74 68 65 20 62 65 74 74 65 72   sort the better
06e0: 20 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68   results with th
06f0: 65 20 6f 72 69 67 69 6e 61 6c 20 77 6f 72 64 0a  e original word.
0700: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
0710: 64 44 69 73 74 54 65 6d 70 20 3d 20 6e 65 77 20  dDistTemp = new 
0720: 4d 61 70 28 29 3b 0a 20 20 20 20 20 20 20 20 20  Map();.         
0730: 20 20 20 6c 52 65 73 2e 66 6f 72 45 61 63 68 28     lRes.forEach(
0740: 28 73 53 75 67 67 29 20 3d 3e 20 7b 20 64 44 69  (sSugg) => { dDi
0750: 73 74 54 65 6d 70 2e 73 65 74 28 73 53 75 67 67  stTemp.set(sSugg
0760: 2c 20 73 74 72 5f 74 72 61 6e 73 66 6f 72 6d 2e  , str_transform.
0770: 64 69 73 74 61 6e 63 65 44 61 6d 65 72 61 75 4c  distanceDamerauL
0780: 65 76 65 6e 73 68 74 65 69 6e 28 74 68 69 73 2e  evenshtein(this.
0790: 73 57 6f 72 64 2c 20 73 53 75 67 67 29 29 3b 20  sWord, sSugg)); 
07a0: 7d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  });.            
07b0: 6c 52 65 73 20 3d 20 6c 52 65 73 2e 73 6f 72 74  lRes = lRes.sort
07c0: 28 28 73 41 2c 20 73 42 29 20 3d 3e 20 7b 20 72  ((sA, sB) => { r
07d0: 65 74 75 72 6e 20 64 44 69 73 74 54 65 6d 70 2e  eturn dDistTemp.
07e0: 67 65 74 28 73 41 29 20 2d 20 64 44 69 73 74 54  get(sA) - dDistT
07f0: 65 6d 70 2e 67 65 74 28 73 42 29 3b 20 7d 29 3b  emp.get(sB); });
0800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 44 69  .            dDi
0810: 73 74 54 65 6d 70 2e 63 6c 65 61 72 28 29 3b 0a  stTemp.clear();.
0820: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0830: 20 20 66 6f 72 20 28 6c 65 74 20 6c 53 75 67 67    for (let lSugg
0840: 20 6f 66 20 74 68 69 73 2e 64 53 75 67 67 2e 76   of this.dSugg.v
0850: 61 6c 75 65 73 28 29 29 20 7b 0a 20 20 20 20 20  alues()) {.     
0860: 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20         for (let 
0870: 73 53 75 67 67 20 6f 66 20 6c 53 75 67 67 29 20  sSugg of lSugg) 
0880: 7b 20 6c 52 65 73 2e 70 75 73 68 28 73 53 75 67  { lRes.push(sSug
0890: 67 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  g); }.          
08a0: 20 20 69 66 20 28 6c 52 65 73 2e 6c 65 6e 67 74    if (lRes.lengt
08b0: 68 20 3e 20 6e 53 75 67 67 4c 69 6d 69 74 29 20  h > nSuggLimit) 
08c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
08d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
08e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
08f0: 0a 20 20 20 20 20 20 20 20 6c 52 65 73 20 3d 20  .        lRes = 
0900: 63 68 61 72 5f 70 6c 61 79 65 72 2e 66 69 6c 74  char_player.filt
0910: 65 72 53 75 67 67 28 6c 52 65 73 29 3b 0a 20 20  erSugg(lRes);.  
0920: 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 73        if (this.s
0930: 57 6f 72 64 2e 67 6c 5f 69 73 54 69 74 6c 65 28  Word.gl_isTitle(
0940: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
0950: 20 6c 52 65 73 20 3d 20 6c 52 65 73 2e 6d 61 70   lRes = lRes.map
0960: 28 28 73 53 75 67 67 29 20 3d 3e 20 7b 20 72 65  ((sSugg) => { re
0970: 74 75 72 6e 20 73 53 75 67 67 2e 67 6c 5f 74 6f  turn sSugg.gl_to
0980: 43 61 70 69 74 61 6c 69 7a 65 28 29 3b 20 7d 29  Capitalize(); })
0990: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
09a0: 20 20 20 20 65 6c 73 65 20 69 66 20 28 74 68 69      else if (thi
09b0: 73 2e 73 57 6f 72 64 2e 67 6c 5f 69 73 55 70 70  s.sWord.gl_isUpp
09c0: 65 72 43 61 73 65 28 29 29 20 7b 0a 20 20 20 20  erCase()) {.    
09d0: 20 20 20 20 20 20 20 20 6c 52 65 73 20 3d 20 6c          lRes = l
09e0: 52 65 73 2e 6d 61 70 28 28 73 53 75 67 67 29 20  Res.map((sSugg) 
09f0: 3d 3e 20 7b 20 72 65 74 75 72 6e 20 73 53 75 67  => { return sSug
0a00: 67 2e 74 6f 55 70 70 65 72 43 61 73 65 28 29 3b  g.toUpperCase();
0a10: 20 7d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   });.        }. 
0a20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 52         return lR
0a30: 65 73 2e 73 6c 69 63 65 28 30 2c 20 6e 53 75 67  es.slice(0, nSug
0a40: 67 4c 69 6d 69 74 29 3b 0a 20 20 20 20 7d 0a 0a  gLimit);.    }..
0a50: 20 20 20 20 72 65 73 65 74 20 28 29 20 7b 0a 20      reset () {. 
0a60: 20 20 20 20 20 20 20 74 68 69 73 2e 61 53 75 67         this.aSug
0a70: 67 2e 63 6c 65 61 72 28 29 3b 0a 20 20 20 20 20  g.clear();.     
0a80: 20 20 20 74 68 69 73 2e 64 53 75 67 67 2e 63 6c     this.dSugg.cl
0a90: 65 61 72 28 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a  ear();.    }.}..
0aa0: 0a 63 6c 61 73 73 20 49 42 44 41 57 47 20 7b 0a  .class IBDAWG {.
0ab0: 20 20 20 20 2f 2f 20 49 4e 44 45 58 41 42 4c 45      // INDEXABLE
0ac0: 20 42 49 4e 41 52 59 20 44 49 52 45 43 54 20 41   BINARY DIRECT A
0ad0: 43 59 43 4c 49 43 20 57 4f 52 44 20 47 52 41 50  CYCLIC WORD GRAP
0ae0: 48 0a 0a 20 20 20 20 63 6f 6e 73 74 72 75 63 74  H..    construct
0af0: 6f 72 20 28 70 61 72 61 6d 31 2c 20 73 50 61 74  or (param1, sPat
0b00: 68 3d 22 22 29 20 7b 0a 20 20 20 20 20 20 20 20  h="") {.        
0b10: 2f 2f 20 70 61 72 61 6d 31 20 63 61 6e 20 62 65  // param1 can be
0b20: 20 61 20 66 69 6c 65 6e 61 6d 65 20 6f 72 20 61   a filename or a
0b30: 20 6f 62 6a 65 63 74 20 77 69 74 68 20 61 6c 6c   object with all
0b40: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 64   the necessary d
0b50: 61 74 61 2e 0a 20 20 20 20 20 20 20 20 74 72 79  ata..        try
0b60: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c   {.            l
0b70: 65 74 20 6f 44 61 74 61 20 3d 20 6e 75 6c 6c 3b  et oData = null;
0b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
0b90: 28 74 79 70 65 6f 66 28 70 61 72 61 6d 31 29 20  (typeof(param1) 
0ba0: 3d 3d 20 22 73 74 72 69 6e 67 22 29 20 7b 0a 20  == "string") {. 
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
0bc0: 65 74 20 73 55 52 4c 20 3d 20 28 73 50 61 74 68  et sURL = (sPath
0bd0: 20 21 3d 3d 20 22 22 29 20 3f 20 73 50 61 74 68   !== "") ? sPath
0be0: 20 2b 20 22 2f 22 20 2b 20 70 61 72 61 6d 31 20   + "/" + param1 
0bf0: 3a 20 22 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72  : "resource://gr
0c00: 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70 68 73  ammalecte/graphs
0c10: 70 65 6c 6c 2f 5f 64 69 63 74 69 6f 6e 61 72 69  pell/_dictionari
0c20: 65 73 2f 22 2b 70 61 72 61 6d 31 3b 0a 20 20 20  es/"+param1;.   
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 44 61               oDa
0c40: 74 61 20 3d 20 4a 53 4f 4e 2e 70 61 72 73 65 28  ta = JSON.parse(
0c50: 68 65 6c 70 65 72 73 2e 6c 6f 61 64 46 69 6c 65  helpers.loadFile
0c60: 28 73 55 52 4c 29 29 3b 0a 20 20 20 20 20 20 20  (sURL));.       
0c70: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 44                oD
0c90: 61 74 61 20 3d 20 70 61 72 61 6d 31 3b 0a 20 20  ata = param1;.  
0ca0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
0cb0: 20 20 20 20 20 20 20 20 4f 62 6a 65 63 74 2e 61          Object.a
0cc0: 73 73 69 67 6e 28 74 68 69 73 2c 20 6f 44 61 74  ssign(this, oDat
0cd0: 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  a);.        }.  
0ce0: 20 20 20 20 20 20 63 61 74 63 68 20 28 65 29 20        catch (e) 
0cf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68  {.            th
0d00: 72 6f 77 20 45 72 72 6f 72 28 22 23 20 45 72 72  row Error("# Err
0d10: 6f 72 2e 20 46 69 6c 65 20 6e 6f 74 20 66 6f 75  or. File not fou
0d20: 6e 64 20 6f 72 20 6e 6f 74 20 6c 6f 61 64 61 62  nd or not loadab
0d30: 6c 65 2e 5c 6e 22 20 2b 20 65 2e 6d 65 73 73 61  le.\n" + e.messa
0d40: 67 65 20 2b 20 22 5c 6e 22 29 3b 0a 20 20 20 20  ge + "\n");.    
0d50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
0d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 50 72 6f  .            Pro
0d70: 70 65 72 74 69 65 73 3a 0a 20 20 20 20 20 20 20  perties:.       
0d80: 20 20 20 20 20 73 4e 61 6d 65 2c 20 6e 43 6f 6d       sName, nCom
0d90: 70 72 65 73 73 69 6f 6e 4d 65 74 68 6f 64 2c 20  pressionMethod, 
0da0: 73 48 65 61 64 65 72 2c 20 6c 41 72 63 56 61 6c  sHeader, lArcVal
0db0: 2c 20 6e 41 72 63 56 61 6c 2c 20 73 42 79 44 69  , nArcVal, sByDi
0dc0: 63 2c 20 73 4c 61 6e 67 2c 20 6e 43 68 61 72 2c  c, sLang, nChar,
0dd0: 20 6e 42 79 74 65 73 41 72 63 2c 20 6e 42 79 74   nBytesArc, nByt
0de0: 65 73 4e 6f 64 65 41 64 64 72 65 73 73 2c 0a 20  esNodeAddress,. 
0df0: 20 20 20 20 20 20 20 20 20 20 20 6e 45 6e 74 72             nEntr
0e00: 79 2c 20 6e 4e 6f 64 65 2c 20 6e 41 72 63 2c 20  y, nNode, nArc, 
0e10: 6e 41 66 66 2c 20 63 53 74 65 6d 6d 69 6e 67 2c  nAff, cStemming,
0e20: 20 6e 54 61 67 2c 20 64 43 68 61 72 2c 20 6e 42   nTag, dChar, nB
0e30: 79 74 65 73 4f 66 66 73 65 74 2c 0a 20 20 20 20  ytesOffset,.    
0e40: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20      */..        
0e50: 2f 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 42  /*.            B
0e60: 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 2e 0a 20  ug workaround.. 
0e70: 20 20 20 20 20 20 20 20 20 20 20 4d 6f 7a 69 6c             Mozil
0e80: 6c 61 e2 80 99 73 20 4a 53 20 70 61 72 73 65 72  la...s JS parser
0e90: 20 73 75 63 6b 73 2e 20 43 61 6e e2 80 99 74 20   sucks. Can...t 
0ea0: 72 65 61 64 20 66 69 6c 65 20 62 69 67 67 65 72  read file bigger
0eb0: 20 74 68 61 6e 20 34 20 4d 62 21 0a 20 20 20 20   than 4 Mb!.    
0ec0: 20 20 20 20 20 20 20 20 53 6f 20 77 65 20 63 6f          So we co
0ed0: 6e 76 65 72 74 20 68 75 67 65 20 68 65 78 61 64  nvert huge hexad
0ee0: 65 63 69 6d 61 6c 20 73 74 72 69 6e 67 20 74 6f  ecimal string to
0ef0: 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62 65 72 73   list of numbers
0f00: e2 80 a6 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
0f10: 68 74 74 70 73 3a 2f 2f 67 69 74 68 75 62 2e 63  https://github.c
0f20: 6f 6d 2f 6d 6f 7a 69 6c 6c 61 2f 61 64 64 6f 6e  om/mozilla/addon
0f30: 73 2d 6c 69 6e 74 65 72 2f 69 73 73 75 65 73 2f  s-linter/issues/
0f40: 31 33 36 31 0a 20 20 20 20 20 20 20 20 2a 2f 0a  1361.        */.
0f50: 20 20 20 20 20 20 20 20 6c 65 74 20 6c 54 65 6d          let lTem
0f60: 70 20 3d 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20  p = [];.        
0f70: 66 6f 72 20 28 6c 65 74 20 69 20 3d 20 30 3b 20  for (let i = 0; 
0f80: 20 69 20 3c 20 74 68 69 73 2e 73 42 79 44 69 63   i < this.sByDic
0f90: 2e 6c 65 6e 67 74 68 3b 20 20 69 2b 3d 32 29 20  .length;  i+=2) 
0fa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 54  {.            lT
0fb0: 65 6d 70 2e 70 75 73 68 28 70 61 72 73 65 49 6e  emp.push(parseIn
0fc0: 74 28 74 68 69 73 2e 73 42 79 44 69 63 2e 73 6c  t(this.sByDic.sl
0fd0: 69 63 65 28 69 2c 20 69 2b 32 29 2c 20 31 36 29  ice(i, i+2), 16)
0fe0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
0ff0: 20 20 20 20 20 74 68 69 73 2e 62 79 44 69 63 20       this.byDic 
1000: 3d 20 6c 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = lTemp;.       
1010: 20 2f 2f 74 68 69 73 2e 62 79 44 69 63 20 3d 20   //this.byDic = 
1020: 6e 65 77 20 55 69 6e 74 38 41 72 72 61 79 28 6c  new Uint8Array(l
1030: 54 65 6d 70 29 3b 20 20 2f 2f 20 6e 6f 74 20 71  Temp);  // not q
1040: 75 69 63 6b 65 72 2c 20 65 76 65 6e 20 73 6c 6f  uicker, even slo
1050: 77 65 72 0a 20 20 20 20 20 20 20 20 2f 2a 20 65  wer.        /* e
1060: 6e 64 20 6f 66 20 62 75 67 20 77 6f 72 6b 61 72  nd of bug workar
1070: 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ound */..       
1080: 20 69 66 20 28 21 74 68 69 73 2e 73 48 65 61 64   if (!this.sHead
1090: 65 72 2e 73 74 61 72 74 73 57 69 74 68 28 22 2f  er.startsWith("/
10a0: 70 79 66 73 61 2f 22 29 29 20 7b 0a 20 20 20 20  pyfsa/")) {.    
10b0: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 54 79          throw Ty
10c0: 70 65 45 72 72 6f 72 28 22 23 20 45 72 72 6f 72  peError("# Error
10d0: 2e 20 4e 6f 74 20 61 20 70 79 66 73 61 20 62 69  . Not a pyfsa bi
10e0: 6e 61 72 79 20 64 69 63 74 69 6f 6e 61 72 79 2e  nary dictionary.
10f0: 20 48 65 61 64 65 72 3a 20 22 20 2b 20 74 68 69   Header: " + thi
1100: 73 2e 73 48 65 61 64 65 72 29 3b 0a 20 20 20 20  s.sHeader);.    
1110: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1120: 20 28 21 28 74 68 69 73 2e 6e 43 6f 6d 70 72 65   (!(this.nCompre
1130: 73 73 69 6f 6e 4d 65 74 68 6f 64 20 3d 3d 20 22  ssionMethod == "
1140: 31 22 20 7c 7c 20 74 68 69 73 2e 6e 43 6f 6d 70  1" || this.nComp
1150: 72 65 73 73 69 6f 6e 4d 65 74 68 6f 64 20 3d 3d  ressionMethod ==
1160: 20 22 32 22 20 7c 7c 20 74 68 69 73 2e 6e 43 6f   "2" || this.nCo
1170: 6d 70 72 65 73 73 69 6f 6e 4d 65 74 68 6f 64 20  mpressionMethod 
1180: 3d 3d 20 22 33 22 29 29 20 7b 0a 20 20 20 20 20  == "3")) {.     
1190: 20 20 20 20 20 20 20 74 68 72 6f 77 20 52 61 6e         throw Ran
11a0: 67 65 45 72 72 6f 72 28 22 23 20 45 72 72 6f 72  geError("# Error
11b0: 2e 20 55 6e 6b 6e 6f 77 6e 20 64 69 63 74 69 6f  . Unknown dictio
11c0: 6e 61 72 79 20 63 6f 6d 70 72 65 73 73 69 6f 6e  nary compression
11d0: 20 6d 65 74 68 6f 64 3a 20 22 20 2b 20 74 68 69   method: " + thi
11e0: 73 2e 6e 43 6f 6d 70 72 65 73 73 69 6f 6e 4d 65  s.nCompressionMe
11f0: 74 68 6f 64 29 3b 0a 20 20 20 20 20 20 20 20 7d  thod);.        }
1200: 0a 20 20 20 20 20 20 20 20 2f 2f 20 3c 64 43 68  .        // <dCh
1210: 61 72 3e 20 74 6f 20 67 65 74 20 74 68 65 20 76  ar> to get the v
1220: 61 6c 75 65 20 6f 66 20 61 6e 20 61 72 63 2c 20  alue of an arc, 
1230: 3c 64 43 68 61 72 56 61 6c 3e 20 74 6f 20 67 65  <dCharVal> to ge
1240: 74 20 74 68 65 20 63 68 61 72 20 6f 66 20 61 6e  t the char of an
1250: 20 61 72 63 20 77 69 74 68 20 69 74 73 20 76 61   arc with its va
1260: 6c 75 65 0a 20 20 20 20 20 20 20 20 74 68 69 73  lue.        this
1270: 2e 64 43 68 61 72 20 3d 20 68 65 6c 70 65 72 73  .dChar = helpers
1280: 2e 6f 62 6a 65 63 74 54 6f 4d 61 70 28 74 68 69  .objectToMap(thi
1290: 73 2e 64 43 68 61 72 29 3b 0a 20 20 20 20 20 20  s.dChar);.      
12a0: 20 20 74 68 69 73 2e 64 43 68 61 72 56 61 6c 20    this.dCharVal 
12b0: 3d 20 74 68 69 73 2e 64 43 68 61 72 2e 67 6c 5f  = this.dChar.gl_
12c0: 72 65 76 65 72 73 65 28 29 3b 0a 0a 20 20 20 20  reverse();..    
12d0: 20 20 20 20 69 66 20 28 74 68 69 73 2e 63 53 74      if (this.cSt
12e0: 65 6d 6d 69 6e 67 20 3d 3d 20 22 53 22 29 20 7b  emming == "S") {
12f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69  .            thi
1300: 73 2e 66 75 6e 63 53 74 65 6d 6d 69 6e 67 20 3d  s.funcStemming =
1310: 20 73 74 72 5f 74 72 61 6e 73 66 6f 72 6d 2e 63   str_transform.c
1320: 68 61 6e 67 65 57 6f 72 64 57 69 74 68 53 75 66  hangeWordWithSuf
1330: 66 69 78 43 6f 64 65 3b 0a 20 20 20 20 20 20 20  fixCode;.       
1340: 20 7d 20 65 6c 73 65 20 69 66 20 28 74 68 69 73   } else if (this
1350: 2e 63 53 74 65 6d 6d 69 6e 67 20 3d 3d 20 22 41  .cStemming == "A
1360: 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ") {.           
1370: 20 74 68 69 73 2e 66 75 6e 63 53 74 65 6d 6d 69   this.funcStemmi
1380: 6e 67 20 3d 20 73 74 72 5f 74 72 61 6e 73 66 6f  ng = str_transfo
1390: 72 6d 2e 63 68 61 6e 67 65 57 6f 72 64 57 69 74  rm.changeWordWit
13a0: 68 41 66 66 69 78 43 6f 64 65 3b 0a 20 20 20 20  hAffixCode;.    
13b0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
13c0: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 66 75           this.fu
13d0: 6e 63 53 74 65 6d 6d 69 6e 67 20 3d 20 73 74 72  ncStemming = str
13e0: 5f 74 72 61 6e 73 66 6f 72 6d 2e 6e 6f 53 74 65  _transform.noSte
13f0: 6d 6d 69 6e 67 3b 0a 20 20 20 20 20 20 20 20 7d  mming;.        }
1400: 0a 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f  ..        this._
1410: 61 72 63 4d 61 73 6b 20 3d 20 28 32 20 2a 2a 20  arcMask = (2 ** 
1420: 28 28 74 68 69 73 2e 6e 42 79 74 65 73 41 72 63  ((this.nBytesArc
1430: 20 2a 20 38 29 20 2d 20 33 29 29 20 2d 20 31 3b   * 8) - 3)) - 1;
1440: 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f 66  .        this._f
1450: 69 6e 61 6c 4e 6f 64 65 4d 61 73 6b 20 3d 20 31  inalNodeMask = 1
1460: 20 3c 3c 20 28 28 74 68 69 73 2e 6e 42 79 74 65   << ((this.nByte
1470: 73 41 72 63 20 2a 20 38 29 20 2d 20 31 29 3b 0a  sArc * 8) - 1);.
1480: 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f 6c 61          this._la
1490: 73 74 41 72 63 4d 61 73 6b 20 3d 20 31 20 3c 3c  stArcMask = 1 <<
14a0: 20 28 28 74 68 69 73 2e 6e 42 79 74 65 73 41 72   ((this.nBytesAr
14b0: 63 20 2a 20 38 29 20 2d 20 32 29 3b 0a 0a 0a 20  c * 8) - 2);... 
14c0: 20 20 20 20 20 20 20 2f 2f 20 43 6f 6e 66 69 67         // Config
14d0: 75 72 69 6e 67 20 44 41 57 47 20 66 75 6e 63 74  uring DAWG funct
14e0: 69 6f 6e 73 20 61 63 63 6f 72 64 69 6e 67 20 74  ions according t
14f0: 6f 20 6e 43 6f 6d 70 72 65 73 73 69 6f 6e 4d 65  o nCompressionMe
1500: 74 68 6f 64 0a 20 20 20 20 20 20 20 20 73 77 69  thod.        swi
1510: 74 63 68 20 28 74 68 69 73 2e 6e 43 6f 6d 70 72  tch (this.nCompr
1520: 65 73 73 69 6f 6e 4d 65 74 68 6f 64 29 20 7b 0a  essionMethod) {.
1530: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
1540: 20 31 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20   1:.            
1550: 20 20 20 20 74 68 69 73 2e 6d 6f 72 70 68 20 3d      this.morph =
1560: 20 74 68 69 73 2e 5f 6d 6f 72 70 68 31 3b 0a 20   this._morph1;. 
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1580: 68 69 73 2e 73 74 65 6d 20 3d 20 74 68 69 73 2e  his.stem = this.
1590: 5f 73 74 65 6d 31 3b 0a 20 20 20 20 20 20 20 20  _stem1;.        
15a0: 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f 6c 6f          this._lo
15b0: 6f 6b 75 70 41 72 63 4e 6f 64 65 20 3d 20 74 68  okupArcNode = th
15c0: 69 73 2e 5f 6c 6f 6f 6b 75 70 41 72 63 4e 6f 64  is._lookupArcNod
15d0: 65 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e1;.            
15e0: 20 20 20 20 74 68 69 73 2e 5f 67 65 74 41 72 63      this._getArc
15f0: 73 20 3d 20 74 68 69 73 2e 5f 67 65 74 41 72 63  s = this._getArc
1600: 73 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s1;.            
1610: 20 20 20 20 74 68 69 73 2e 5f 77 72 69 74 65 4e      this._writeN
1620: 6f 64 65 73 20 3d 20 74 68 69 73 2e 5f 77 72 69  odes = this._wri
1630: 74 65 4e 6f 64 65 73 31 3b 0a 20 20 20 20 20 20  teNodes1;.      
1640: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
1660: 65 20 32 3a 0a 20 20 20 20 20 20 20 20 20 20 20  e 2:.           
1670: 20 20 20 20 20 74 68 69 73 2e 6d 6f 72 70 68 20       this.morph 
1680: 3d 20 74 68 69 73 2e 5f 6d 6f 72 70 68 32 3b 0a  = this._morph2;.
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 74 68 69 73 2e 73 74 65 6d 20 3d 20 74 68 69 73  this.stem = this
16b0: 2e 5f 73 74 65 6d 32 3b 0a 20 20 20 20 20 20 20  ._stem2;.       
16c0: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f 6c           this._l
16d0: 6f 6f 6b 75 70 41 72 63 4e 6f 64 65 20 3d 20 74  ookupArcNode = t
16e0: 68 69 73 2e 5f 6c 6f 6f 6b 75 70 41 72 63 4e 6f  his._lookupArcNo
16f0: 64 65 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  de2;.           
1700: 20 20 20 20 20 74 68 69 73 2e 5f 67 65 74 41 72       this._getAr
1710: 63 73 20 3d 20 74 68 69 73 2e 5f 67 65 74 41 72  cs = this._getAr
1720: 63 73 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  cs2;.           
1730: 20 20 20 20 20 74 68 69 73 2e 5f 77 72 69 74 65       this._write
1740: 4e 6f 64 65 73 20 3d 20 74 68 69 73 2e 5f 77 72  Nodes = this._wr
1750: 69 74 65 4e 6f 64 65 73 32 3b 0a 20 20 20 20 20  iteNodes2;.     
1760: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1770: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  ;.            ca
1780: 73 65 20 33 3a 0a 20 20 20 20 20 20 20 20 20 20  se 3:.          
1790: 20 20 20 20 20 20 74 68 69 73 2e 6d 6f 72 70 68        this.morph
17a0: 20 3d 20 74 68 69 73 2e 5f 6d 6f 72 70 68 33 3b   = this._morph3;
17b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17c0: 20 74 68 69 73 2e 73 74 65 6d 20 3d 20 74 68 69   this.stem = thi
17d0: 73 2e 5f 73 74 65 6d 33 3b 0a 20 20 20 20 20 20  s._stem3;.      
17e0: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f            this._
17f0: 6c 6f 6f 6b 75 70 41 72 63 4e 6f 64 65 20 3d 20  lookupArcNode = 
1800: 74 68 69 73 2e 5f 6c 6f 6f 6b 75 70 41 72 63 4e  this._lookupArcN
1810: 6f 64 65 33 3b 0a 20 20 20 20 20 20 20 20 20 20  ode3;.          
1820: 20 20 20 20 20 20 74 68 69 73 2e 5f 67 65 74 41        this._getA
1830: 72 63 73 20 3d 20 74 68 69 73 2e 5f 67 65 74 41  rcs = this._getA
1840: 72 63 73 33 3b 0a 20 20 20 20 20 20 20 20 20 20  rcs3;.          
1850: 20 20 20 20 20 20 74 68 69 73 2e 5f 77 72 69 74        this._writ
1860: 65 4e 6f 64 65 73 20 3d 20 74 68 69 73 2e 5f 77  eNodes = this._w
1870: 72 69 74 65 4e 6f 64 65 73 33 3b 0a 20 20 20 20  riteNodes3;.    
1880: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1890: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  k;.            d
18a0: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
18b0: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 56 61          throw Va
18c0: 6c 75 65 45 72 72 6f 72 28 22 23 20 45 72 72 6f  lueError("# Erro
18d0: 72 3a 20 75 6e 6b 6e 6f 77 6e 20 63 6f 64 65 3a  r: unknown code:
18e0: 20 22 20 2b 20 74 68 69 73 2e 6e 43 6f 6d 70 72   " + this.nCompr
18f0: 65 73 73 69 6f 6e 4d 65 74 68 6f 64 29 3b 0a 20  essionMethod);. 
1900: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1910: 20 2f 2f 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 74   //console.log(t
1920: 68 69 73 2e 67 65 74 49 6e 66 6f 28 29 29 3b 0a  his.getInfo());.
1930: 20 20 20 20 20 20 20 20 74 68 69 73 2e 62 4f 70          this.bOp
1940: 74 4e 75 6d 53 69 67 6c 65 20 3d 20 74 72 75 65  tNumSigle = true
1950: 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 62  ;.        this.b
1960: 4f 70 74 4e 75 6d 41 74 4c 61 73 74 20 3d 20 66  OptNumAtLast = f
1970: 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  alse;.    }..   
1980: 20 67 65 74 49 6e 66 6f 20 28 29 20 7b 0a 20 20   getInfo () {.  
1990: 20 20 20 20 20 20 72 65 74 75 72 6e 20 20 60 20        return  ` 
19a0: 20 4c 61 6e 67 75 61 67 65 3a 20 24 7b 74 68 69   Language: ${thi
19b0: 73 2e 73 4c 61 6e 67 4e 61 6d 65 7d 20 20 20 4c  s.sLangName}   L
19c0: 61 6e 67 20 63 6f 64 65 3a 20 24 7b 74 68 69 73  ang code: ${this
19d0: 2e 73 4c 61 6e 67 43 6f 64 65 7d 20 20 20 44 69  .sLangCode}   Di
19e0: 63 74 69 6f 6e 61 72 79 20 6e 61 6d 65 3a 20 24  ctionary name: $
19f0: 7b 74 68 69 73 2e 73 44 69 63 4e 61 6d 65 7d 5c  {this.sDicName}\
1a00: 6e 60 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  n` +.           
1a10: 20 20 20 20 20 60 20 20 43 6f 6d 70 72 65 73 73       `  Compress
1a20: 69 6f 6e 20 6d 65 74 68 6f 64 3a 20 24 7b 74 68  ion method: ${th
1a30: 69 73 2e 6e 43 6f 6d 70 72 65 73 73 69 6f 6e 4d  is.nCompressionM
1a40: 65 74 68 6f 64 7d 20 20 20 44 61 74 65 3a 20 24  ethod}   Date: $
1a50: 7b 74 68 69 73 2e 73 44 61 74 65 7d 20 20 20 53  {this.sDate}   S
1a60: 74 65 6d 6d 69 6e 67 3a 20 24 7b 74 68 69 73 2e  temming: ${this.
1a70: 63 53 74 65 6d 6d 69 6e 67 7d 46 58 5c 6e 60 20  cStemming}FX\n` 
1a80: 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
1a90: 20 20 60 20 20 41 72 63 73 20 76 61 6c 75 65 73    `  Arcs values
1aa0: 3a 20 20 24 7b 74 68 69 73 2e 6e 41 72 63 56 61  :  ${this.nArcVa
1ab0: 6c 7d 20 3d 20 24 7b 74 68 69 73 2e 6e 43 68 61  l} = ${this.nCha
1ac0: 72 7d 20 63 68 61 72 61 63 74 65 72 73 2c 20 20  r} characters,  
1ad0: 24 7b 74 68 69 73 2e 6e 41 66 66 7d 20 61 66 66  ${this.nAff} aff
1ae0: 69 78 65 73 2c 20 20 24 7b 74 68 69 73 2e 6e 54  ixes,  ${this.nT
1af0: 61 67 7d 20 74 61 67 73 5c 6e 60 20 2b 0a 20 20  ag} tags\n` +.  
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 20                ` 
1b10: 20 44 69 63 74 69 6f 6e 61 72 79 3a 20 24 7b 74   Dictionary: ${t
1b20: 68 69 73 2e 6e 45 6e 74 72 79 7d 20 65 6e 74 72  his.nEntry} entr
1b30: 69 65 73 2c 20 20 20 20 24 7b 74 68 69 73 2e 6e  ies,    ${this.n
1b40: 4e 6f 64 65 7d 20 6e 6f 64 65 73 2c 20 20 20 24  Node} nodes,   $
1b50: 7b 74 68 69 73 2e 6e 41 72 63 7d 20 61 72 63 73  {this.nArc} arcs
1b60: 5c 6e 60 20 2b 0a 20 20 20 20 20 20 20 20 20 20  \n` +.          
1b70: 20 20 20 20 20 20 60 20 20 41 64 64 72 65 73 73        `  Address
1b80: 20 73 69 7a 65 3a 20 24 7b 74 68 69 73 2e 6e 42   size: ${this.nB
1b90: 79 74 65 73 4e 6f 64 65 41 64 64 72 65 73 73 7d  ytesNodeAddress}
1ba0: 20 62 79 74 65 73 2c 20 20 41 72 63 20 73 69 7a   bytes,  Arc siz
1bb0: 65 3a 20 24 7b 74 68 69 73 2e 6e 42 79 74 65 73  e: ${this.nBytes
1bc0: 41 72 63 7d 20 62 79 74 65 73 5c 6e 60 3b 0a 20  Arc} bytes\n`;. 
1bd0: 20 20 20 7d 0a 0a 20 20 20 20 67 65 74 4a 53 4f     }..    getJSO
1be0: 4e 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20 6c  N () {.        l
1bf0: 65 74 20 6f 4a 53 4f 4e 20 3d 20 7b 0a 20 20 20  et oJSON = {.   
1c00: 20 20 20 20 20 20 20 20 20 22 73 48 65 61 64 65           "sHeade
1c10: 72 22 3a 20 22 2f 70 79 66 73 61 2f 22 2c 0a 20  r": "/pyfsa/",. 
1c20: 20 20 20 20 20 20 20 20 20 20 20 22 73 4c 61 6e             "sLan
1c30: 67 43 6f 64 65 22 3a 20 74 68 69 73 2e 73 4c 61  gCode": this.sLa
1c40: 6e 67 43 6f 64 65 2c 0a 20 20 20 20 20 20 20 20  ngCode,.        
1c50: 20 20 20 20 22 73 4c 61 6e 67 4e 61 6d 65 22 3a      "sLangName":
1c60: 20 74 68 69 73 2e 73 4c 61 6e 67 4e 61 6d 65 2c   this.sLangName,
1c70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73 44  .            "sD
1c80: 69 63 4e 61 6d 65 22 3a 20 74 68 69 73 2e 73 44  icName": this.sD
1c90: 69 63 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  icName,.        
1ca0: 20 20 20 20 22 73 46 69 6c 65 4e 61 6d 65 22 3a      "sFileName":
1cb0: 20 74 68 69 73 2e 73 46 69 6c 65 4e 61 6d 65 2c   this.sFileName,
1cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73 44  .            "sD
1cd0: 61 74 65 22 3a 20 74 68 69 73 2e 73 44 61 74 65  ate": this.sDate
1ce0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ,.            "n
1cf0: 45 6e 74 72 79 22 3a 20 74 68 69 73 2e 6e 45 6e  Entry": this.nEn
1d00: 74 72 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  try,.           
1d10: 20 22 6e 43 68 61 72 22 3a 20 74 68 69 73 2e 6e   "nChar": this.n
1d20: 43 68 61 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Char,.          
1d30: 20 20 22 6e 41 66 66 22 3a 20 74 68 69 73 2e 6e    "nAff": this.n
1d40: 41 66 66 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Aff,.           
1d50: 20 22 6e 54 61 67 22 3a 20 74 68 69 73 2e 6e 54   "nTag": this.nT
1d60: 61 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ag,.            
1d70: 22 63 53 74 65 6d 6d 69 6e 67 22 3a 20 74 68 69  "cStemming": thi
1d80: 73 2e 63 53 74 65 6d 6d 69 6e 67 2c 0a 20 20 20  s.cStemming,.   
1d90: 20 20 20 20 20 20 20 20 20 22 64 43 68 61 72 22           "dChar"
1da0: 3a 20 68 65 6c 70 65 72 73 2e 6d 61 70 54 6f 4f  : helpers.mapToO
1db0: 62 6a 65 63 74 28 74 68 69 73 2e 64 43 68 61 72  bject(this.dChar
1dc0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  ),.            "
1dd0: 6e 4e 6f 64 65 22 3a 20 74 68 69 73 2e 6e 4e 6f  nNode": this.nNo
1de0: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
1df0: 22 6e 41 72 63 22 3a 20 74 68 69 73 2e 6e 41 72  "nArc": this.nAr
1e00: 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  c,.            "
1e10: 6c 41 72 63 56 61 6c 22 3a 20 74 68 69 73 2e 6c  lArcVal": this.l
1e20: 41 72 63 56 61 6c 2c 0a 20 20 20 20 20 20 20 20  ArcVal,.        
1e30: 20 20 20 20 22 6e 41 72 63 56 61 6c 22 3a 20 74      "nArcVal": t
1e40: 68 69 73 2e 6e 41 72 63 56 61 6c 2c 0a 20 20 20  his.nArcVal,.   
1e50: 20 20 20 20 20 20 20 20 20 22 6e 43 6f 6d 70 72           "nCompr
1e60: 65 73 73 69 6f 6e 4d 65 74 68 6f 64 22 3a 20 74  essionMethod": t
1e70: 68 69 73 2e 6e 43 6f 6d 70 72 65 73 73 69 6f 6e  his.nCompression
1e80: 4d 65 74 68 6f 64 2c 0a 20 20 20 20 20 20 20 20  Method,.        
1e90: 20 20 20 20 22 6e 42 79 74 65 73 41 72 63 22 3a      "nBytesArc":
1ea0: 20 74 68 69 73 2e 6e 42 79 74 65 73 41 72 63 2c   this.nBytesArc,
1eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 42  .            "nB
1ec0: 79 74 65 73 4e 6f 64 65 41 64 64 72 65 73 73 22  ytesNodeAddress"
1ed0: 3a 20 74 68 69 73 2e 6e 42 79 74 65 73 4e 6f 64  : this.nBytesNod
1ee0: 65 41 64 64 72 65 73 73 2c 0a 20 20 20 20 20 20  eAddress,.      
1ef0: 20 20 20 20 20 20 22 6e 42 79 74 65 73 4f 66 66        "nBytesOff
1f00: 73 65 74 22 3a 20 74 68 69 73 2e 6e 42 79 74 65  set": this.nByte
1f10: 73 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20  sOffset,.       
1f20: 20 20 20 20 20 22 73 42 79 44 69 63 22 3a 20 74       "sByDic": t
1f30: 68 69 73 2e 73 42 79 44 69 63 20 20 20 20 2f 2f  his.sByDic    //
1f40: 20 62 69 6e 61 72 79 20 77 6f 72 64 20 67 72 61   binary word gra
1f50: 70 68 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20  ph.        };.  
1f60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6f 4a 53        return oJS
1f70: 4f 4e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ON;.    }..    i
1f80: 73 56 61 6c 69 64 54 6f 6b 65 6e 20 28 73 54 6f  sValidToken (sTo
1f90: 6b 65 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  ken) {.        /
1fa0: 2f 20 63 68 65 63 6b 73 20 69 66 20 73 54 6f 6b  / checks if sTok
1fb0: 65 6e 20 69 73 20 76 61 6c 69 64 20 28 69 66 20  en is valid (if 
1fc0: 74 68 65 72 65 20 69 73 20 68 79 70 68 65 6e 73  there is hyphens
1fd0: 20 69 6e 20 73 54 6f 6b 65 6e 2c 20 73 54 6f 6b   in sToken, sTok
1fe0: 65 6e 20 69 73 20 73 70 6c 69 74 2c 20 65 61 63  en is split, eac
1ff0: 68 20 70 61 72 74 20 69 73 20 63 68 65 63 6b 65  h part is checke
2000: 64 29 0a 20 20 20 20 20 20 20 20 69 66 20 28 74  d).        if (t
2010: 68 69 73 2e 69 73 56 61 6c 69 64 28 73 54 6f 6b  his.isValid(sTok
2020: 65 6e 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  en)) {.         
2030: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a     return true;.
2040: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2050: 20 20 69 66 20 28 73 54 6f 6b 65 6e 2e 69 6e 63    if (sToken.inc
2060: 6c 75 64 65 73 28 22 2d 22 29 29 20 7b 0a 20 20  ludes("-")) {.  
2070: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73 54            if (sT
2080: 6f 6b 65 6e 2e 67 6c 5f 63 6f 75 6e 74 28 22 2d  oken.gl_count("-
2090: 22 29 20 3e 20 34 29 20 7b 0a 20 20 20 20 20 20  ") > 4) {.      
20a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
20b0: 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20   true;.         
20c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
20d0: 20 72 65 74 75 72 6e 20 73 54 6f 6b 65 6e 2e 73   return sToken.s
20e0: 70 6c 69 74 28 22 2d 22 29 2e 65 76 65 72 79 28  plit("-").every(
20f0: 73 57 6f 72 64 20 20 3d 3e 20 20 74 68 69 73 2e  sWord  =>  this.
2100: 69 73 56 61 6c 69 64 28 73 57 6f 72 64 29 29 3b  isValid(sWord));
2110: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
2120: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
2130: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 73 56  ;.    }..    isV
2140: 61 6c 69 64 20 28 73 57 6f 72 64 29 20 7b 0a 20  alid (sWord) {. 
2150: 20 20 20 20 20 20 20 2f 2f 20 63 68 65 63 6b 73         // checks
2160: 20 69 66 20 73 57 6f 72 64 20 69 73 20 76 61 6c   if sWord is val
2170: 69 64 20 28 64 69 66 66 65 72 65 6e 74 20 63 61  id (different ca
2180: 73 69 6e 67 20 74 65 73 74 65 64 20 69 66 20 74  sing tested if t
2190: 68 65 20 66 69 72 73 74 20 6c 65 74 74 65 72 20  he first letter 
21a0: 69 73 20 61 20 63 61 70 69 74 61 6c 29 0a 20 20  is a capital).  
21b0: 20 20 20 20 20 20 69 66 20 28 21 73 57 6f 72 64        if (!sWord
21c0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
21d0: 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20  return null;.   
21e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
21f0: 66 20 28 73 57 6f 72 64 2e 69 6e 63 6c 75 64 65  f (sWord.include
2200: 73 28 22 e2 80 99 22 29 29 20 7b 20 2f 2f 20 75  s("...")) { // u
2210: 67 6c 79 20 68 61 63 6b 0a 20 20 20 20 20 20 20  gly hack.       
2220: 20 20 20 20 20 73 57 6f 72 64 20 3d 20 73 57 6f       sWord = sWo
2230: 72 64 2e 72 65 70 6c 61 63 65 28 22 e2 80 99 22  rd.replace("..."
2240: 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20  , "'");.        
2250: 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28 74 68  }.        if (th
2260: 69 73 2e 6c 6f 6f 6b 75 70 28 73 57 6f 72 64 29  is.lookup(sWord)
2270: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2280: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20  return true;.   
2290: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
22a0: 66 20 28 73 57 6f 72 64 2e 63 68 61 72 41 74 28  f (sWord.charAt(
22b0: 30 29 2e 67 6c 5f 69 73 55 70 70 65 72 43 61 73  0).gl_isUpperCas
22c0: 65 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  e()) {.         
22d0: 20 20 20 69 66 20 28 73 57 6f 72 64 2e 6c 65 6e     if (sWord.len
22e0: 67 74 68 20 3e 20 31 29 20 7b 0a 20 20 20 20 20  gth > 1) {.     
22f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73             if (s
2300: 57 6f 72 64 2e 67 6c 5f 69 73 54 69 74 6c 65 28  Word.gl_isTitle(
2310: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
2320: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2330: 21 21 74 68 69 73 2e 6c 6f 6f 6b 75 70 28 73 57  !!this.lookup(sW
2340: 6f 72 64 2e 74 6f 4c 6f 77 65 72 43 61 73 65 28  ord.toLowerCase(
2350: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
2360: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2370: 20 20 20 20 20 20 69 66 20 28 73 57 6f 72 64 2e        if (sWord.
2380: 67 6c 5f 69 73 55 70 70 65 72 43 61 73 65 28 29  gl_isUpperCase()
2390: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
23a0: 20 20 20 20 20 20 20 20 69 66 20 28 74 68 69 73          if (this
23b0: 2e 62 4f 70 74 4e 75 6d 53 69 67 6c 65 29 20 7b  .bOptNumSigle) {
23c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23d0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
23e0: 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  true;.          
23f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 72 65 74 75 72 6e 20 21 21 28 74 68 69 73 2e 6c  return !!(this.l
2420: 6f 6f 6b 75 70 28 73 57 6f 72 64 2e 74 6f 4c 6f  ookup(sWord.toLo
2430: 77 65 72 43 61 73 65 28 29 29 20 7c 7c 20 74 68  werCase()) || th
2440: 69 73 2e 6c 6f 6f 6b 75 70 28 73 57 6f 72 64 2e  is.lookup(sWord.
2450: 67 6c 5f 74 6f 43 61 70 69 74 61 6c 69 7a 65 28  gl_toCapitalize(
2460: 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )));.           
2470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2480: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 21 21         return !!
2490: 74 68 69 73 2e 6c 6f 6f 6b 75 70 28 73 57 6f 72  this.lookup(sWor
24a0: 64 2e 73 6c 69 63 65 28 30 2c 20 31 29 2e 74 6f  d.slice(0, 1).to
24b0: 4c 6f 77 65 72 43 61 73 65 28 29 20 2b 20 73 57  LowerCase() + sW
24c0: 6f 72 64 2e 73 6c 69 63 65 28 31 29 29 3b 0a 20  ord.slice(1));. 
24d0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
24e0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
24f0: 20 20 20 20 72 65 74 75 72 6e 20 21 21 74 68 69      return !!thi
2500: 73 2e 6c 6f 6f 6b 75 70 28 73 57 6f 72 64 2e 74  s.lookup(sWord.t
2510: 6f 4c 6f 77 65 72 43 61 73 65 28 29 29 3b 0a 20  oLowerCase());. 
2520: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2530: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2540: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20  eturn false;.   
2550: 20 7d 0a 0a 20 20 20 20 5f 63 6f 6e 76 42 79 74   }..    _convByt
2560: 65 73 54 6f 49 6e 74 65 67 65 72 20 28 61 42 79  esToInteger (aBy
2570: 74 65 73 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  tes) {.        /
2580: 2f 20 42 79 74 65 20 6f 72 64 65 72 20 3d 20 42  / Byte order = B
2590: 69 67 20 45 6e 64 69 61 6e 20 28 62 69 67 67 65  ig Endian (bigge
25a0: 72 20 66 69 72 73 74 29 0a 20 20 20 20 20 20 20  r first).       
25b0: 20 6c 65 74 20 6e 56 61 6c 20 3d 20 30 3b 0a 20   let nVal = 0;. 
25c0: 20 20 20 20 20 20 20 6c 65 74 20 6e 57 65 69 67         let nWeig
25d0: 68 74 20 3d 20 28 61 42 79 74 65 73 2e 6c 65 6e  ht = (aBytes.len
25e0: 67 74 68 20 2d 20 31 29 20 2a 20 38 3b 0a 20 20  gth - 1) * 8;.  
25f0: 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 6e        for (let n
2600: 20 6f 66 20 61 42 79 74 65 73 29 20 7b 0a 20 20   of aBytes) {.  
2610: 20 20 20 20 20 20 20 20 20 20 6e 56 61 6c 20 2b            nVal +
2620: 3d 20 6e 20 3c 3c 20 6e 57 65 69 67 68 74 3b 0a  = n << nWeight;.
2630: 20 20 20 20 20 20 20 20 20 20 20 20 6e 57 65 69              nWei
2640: 67 68 74 20 3d 20 6e 57 65 69 67 68 74 20 2d 20  ght = nWeight - 
2650: 38 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  8;.        }.   
2660: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 56 61 6c       return nVal
2670: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c 6f 6f  ;.    }..    loo
2680: 6b 75 70 20 28 73 57 6f 72 64 29 20 7b 0a 20 20  kup (sWord) {.  
2690: 20 20 20 20 20 20 2f 2f 20 72 65 74 75 72 6e 73        // returns
26a0: 20 74 72 75 65 20 69 66 20 73 57 6f 72 64 20 69   true if sWord i
26b0: 6e 20 64 69 63 74 69 6f 6e 61 72 79 20 28 73 74  n dictionary (st
26c0: 72 69 63 74 20 76 65 72 69 66 69 63 61 74 69 6f  rict verificatio
26d0: 6e 29 0a 20 20 20 20 20 20 20 20 6c 65 74 20 69  n).        let i
26e0: 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Addr = 0;.      
26f0: 20 20 66 6f 72 20 28 6c 65 74 20 63 20 6f 66 20    for (let c of 
2700: 73 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20  sWord) {.       
2710: 20 20 20 20 20 69 66 20 28 21 74 68 69 73 2e 64       if (!this.d
2720: 43 68 61 72 2e 68 61 73 28 63 29 29 20 7b 0a 20  Char.has(c)) {. 
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
2740: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20  eturn false;.   
2750: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2760: 20 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 74         iAddr = t
2770: 68 69 73 2e 5f 6c 6f 6f 6b 75 70 41 72 63 4e 6f  his._lookupArcNo
2780: 64 65 28 74 68 69 73 2e 64 43 68 61 72 2e 67 65  de(this.dChar.ge
2790: 74 28 63 29 2c 20 69 41 64 64 72 29 3b 0a 20 20  t(c), iAddr);.  
27a0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 69 41            if (iA
27b0: 64 64 72 20 3d 3d 3d 20 6e 75 6c 6c 29 20 7b 0a  ddr === null) {.
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20  return false;.  
27e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
2800: 74 75 72 6e 20 42 6f 6f 6c 65 61 6e 28 74 68 69  turn Boolean(thi
2810: 73 2e 5f 63 6f 6e 76 42 79 74 65 73 54 6f 49 6e  s._convBytesToIn
2820: 74 65 67 65 72 28 74 68 69 73 2e 62 79 44 69 63  teger(this.byDic
2830: 2e 73 6c 69 63 65 28 69 41 64 64 72 2c 20 69 41  .slice(iAddr, iA
2840: 64 64 72 2b 74 68 69 73 2e 6e 42 79 74 65 73 41  ddr+this.nBytesA
2850: 72 63 29 29 20 26 20 74 68 69 73 2e 5f 66 69 6e  rc)) & this._fin
2860: 61 6c 4e 6f 64 65 4d 61 73 6b 29 3b 0a 20 20 20  alNodeMask);.   
2870: 20 7d 0a 0a 20 20 20 20 67 65 74 4d 6f 72 70 68   }..    getMorph
2880: 20 28 73 57 6f 72 64 29 20 7b 0a 20 20 20 20 20   (sWord) {.     
2890: 20 20 20 2f 2f 20 72 65 74 72 69 65 76 65 73 20     // retrieves 
28a0: 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20 6c 69 73  morphologies lis
28b0: 74 2c 20 64 69 66 66 65 72 65 6e 74 20 63 61 73  t, different cas
28c0: 69 6e 67 20 61 6c 6c 6f 77 65 64 0a 20 20 20 20  ing allowed.    
28d0: 20 20 20 20 6c 65 74 20 6c 20 3d 20 74 68 69 73      let l = this
28e0: 2e 6d 6f 72 70 68 28 73 57 6f 72 64 29 3b 0a 20  .morph(sWord);. 
28f0: 20 20 20 20 20 20 20 69 66 20 28 73 57 6f 72 64         if (sWord
2900: 5b 30 5d 2e 67 6c 5f 69 73 55 70 70 65 72 43 61  [0].gl_isUpperCa
2910: 73 65 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20  se()) {.        
2920: 20 20 20 20 6c 20 3d 20 6c 2e 63 6f 6e 63 61 74      l = l.concat
2930: 28 74 68 69 73 2e 6d 6f 72 70 68 28 73 57 6f 72  (this.morph(sWor
2940: 64 2e 74 6f 4c 6f 77 65 72 43 61 73 65 28 29 29  d.toLowerCase())
2950: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2960: 66 20 28 73 57 6f 72 64 2e 67 6c 5f 69 73 55 70  f (sWord.gl_isUp
2970: 70 65 72 43 61 73 65 28 29 20 26 26 20 73 57 6f  perCase() && sWo
2980: 72 64 2e 6c 65 6e 67 74 68 20 3e 20 31 29 20 7b  rd.length > 1) {
2990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29a0: 20 6c 20 3d 20 6c 2e 63 6f 6e 63 61 74 28 74 68   l = l.concat(th
29b0: 69 73 2e 6d 6f 72 70 68 28 73 57 6f 72 64 2e 67  is.morph(sWord.g
29c0: 6c 5f 74 6f 43 61 70 69 74 61 6c 69 7a 65 28 29  l_toCapitalize()
29d0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
29e0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
29f0: 20 20 20 20 72 65 74 75 72 6e 20 6c 3b 0a 20 20      return l;.  
2a00: 20 20 7d 0a 0a 20 20 20 20 73 75 67 67 65 73 74    }..    suggest
2a10: 20 28 73 57 6f 72 64 2c 20 6e 53 75 67 67 4c 69   (sWord, nSuggLi
2a20: 6d 69 74 3d 31 30 29 20 7b 0a 20 20 20 20 20 20  mit=10) {.      
2a30: 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 61 20 61    // returns a a
2a40: 72 72 61 79 20 6f 66 20 73 75 67 67 65 73 74 69  rray of suggesti
2a50: 6f 6e 73 20 66 6f 72 20 3c 73 57 6f 72 64 3e 0a  ons for <sWord>.
2a60: 20 20 20 20 20 20 20 20 6c 65 74 20 73 50 66 78          let sPfx
2a70: 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 6c   = "";.        l
2a80: 65 74 20 73 53 66 78 20 3d 20 22 22 3b 0a 20 20  et sSfx = "";.  
2a90: 20 20 20 20 20 20 5b 73 50 66 78 2c 20 73 57 6f        [sPfx, sWo
2aa0: 72 64 2c 20 73 53 66 78 5d 20 3d 20 63 68 61 72  rd, sSfx] = char
2ab0: 5f 70 6c 61 79 65 72 2e 63 75 74 28 73 57 6f 72  _player.cut(sWor
2ac0: 64 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  d);.        let 
2ad0: 6e 4d 61 78 53 77 69 74 63 68 20 3d 20 4d 61 74  nMaxSwitch = Mat
2ae0: 68 2e 6d 61 78 28 4d 61 74 68 2e 66 6c 6f 6f 72  h.max(Math.floor
2af0: 28 73 57 6f 72 64 2e 6c 65 6e 67 74 68 20 2f 20  (sWord.length / 
2b00: 33 29 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  3), 1);.        
2b10: 6c 65 74 20 6e 4d 61 78 44 65 6c 20 3d 20 4d 61  let nMaxDel = Ma
2b20: 74 68 2e 66 6c 6f 6f 72 28 73 57 6f 72 64 2e 6c  th.floor(sWord.l
2b30: 65 6e 67 74 68 20 2f 20 35 29 3b 0a 20 20 20 20  ength / 5);.    
2b40: 20 20 20 20 6c 65 74 20 6e 4d 61 78 48 61 72 64      let nMaxHard
2b50: 52 65 70 6c 20 3d 20 4d 61 74 68 2e 6d 61 78 28  Repl = Math.max(
2b60: 4d 61 74 68 2e 66 6c 6f 6f 72 28 28 73 57 6f 72  Math.floor((sWor
2b70: 64 2e 6c 65 6e 67 74 68 20 2d 20 35 29 20 2f 20  d.length - 5) / 
2b80: 34 29 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  4), 1);.        
2b90: 6c 65 74 20 6f 53 75 67 67 52 65 73 75 6c 74 20  let oSuggResult 
2ba0: 3d 20 6e 65 77 20 53 75 67 67 52 65 73 75 6c 74  = new SuggResult
2bb0: 28 73 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  (sWord);.       
2bc0: 20 74 68 69 73 2e 5f 73 75 67 67 65 73 74 28 6f   this._suggest(o
2bd0: 53 75 67 67 52 65 73 75 6c 74 2c 20 73 57 6f 72  SuggResult, sWor
2be0: 64 2c 20 6e 4d 61 78 53 77 69 74 63 68 2c 20 6e  d, nMaxSwitch, n
2bf0: 4d 61 78 44 65 6c 2c 20 6e 4d 61 78 48 61 72 64  MaxDel, nMaxHard
2c00: 52 65 70 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  Repl);.        i
2c10: 66 20 28 73 57 6f 72 64 2e 67 6c 5f 69 73 54 69  f (sWord.gl_isTi
2c20: 74 6c 65 28 29 29 20 7b 0a 20 20 20 20 20 20 20  tle()) {.       
2c30: 20 20 20 20 20 74 68 69 73 2e 5f 73 75 67 67 65       this._sugge
2c40: 73 74 28 6f 53 75 67 67 52 65 73 75 6c 74 2c 20  st(oSuggResult, 
2c50: 73 57 6f 72 64 2e 74 6f 4c 6f 77 65 72 43 61 73  sWord.toLowerCas
2c60: 65 28 29 2c 20 6e 4d 61 78 53 77 69 74 63 68 2c  e(), nMaxSwitch,
2c70: 20 6e 4d 61 78 44 65 6c 2c 20 6e 4d 61 78 48 61   nMaxDel, nMaxHa
2c80: 72 64 52 65 70 6c 29 3b 0a 20 20 20 20 20 20 20  rdRepl);.       
2c90: 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20   }.        else 
2ca0: 69 66 20 28 73 57 6f 72 64 2e 67 6c 5f 69 73 4c  if (sWord.gl_isL
2cb0: 6f 77 65 72 43 61 73 65 28 29 29 20 7b 0a 20 20  owerCase()) {.  
2cc0: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f            this._
2cd0: 73 75 67 67 65 73 74 28 6f 53 75 67 67 52 65 73  suggest(oSuggRes
2ce0: 75 6c 74 2c 20 73 57 6f 72 64 2e 67 6c 5f 74 6f  ult, sWord.gl_to
2cf0: 43 61 70 69 74 61 6c 69 7a 65 28 29 2c 20 6e 4d  Capitalize(), nM
2d00: 61 78 53 77 69 74 63 68 2c 20 6e 4d 61 78 44 65  axSwitch, nMaxDe
2d10: 6c 2c 20 6e 4d 61 78 48 61 72 64 52 65 70 6c 29  l, nMaxHardRepl)
2d20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d30: 20 20 20 20 6c 65 74 20 61 53 75 67 67 20 3d 20      let aSugg = 
2d40: 6f 53 75 67 67 52 65 73 75 6c 74 2e 67 65 74 53  oSuggResult.getS
2d50: 75 67 67 65 73 74 69 6f 6e 73 28 6e 53 75 67 67  uggestions(nSugg
2d60: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20  Limit);.        
2d70: 69 66 20 28 73 53 66 78 20 7c 7c 20 73 50 66 78  if (sSfx || sPfx
2d80: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2d90: 2f 2f 20 77 65 20 61 64 64 20 77 68 61 74 20 77  // we add what w
2da0: 65 20 72 65 6d 6f 76 65 64 0a 20 20 20 20 20 20  e removed.      
2db0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 53 75        return aSu
2dc0: 67 67 2e 6d 61 70 28 20 28 73 53 75 67 67 29 20  gg.map( (sSugg) 
2dd0: 3d 3e 20 7b 20 72 65 74 75 72 6e 20 73 50 66 78  => { return sPfx
2de0: 20 2b 20 73 53 75 67 67 20 2b 20 73 53 66 78 20   + sSugg + sSfx 
2df0: 7d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  } );.        }. 
2e00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 53         return aS
2e10: 75 67 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ugg;.    }..    
2e20: 5f 73 75 67 67 65 73 74 20 28 6f 53 75 67 67 52  _suggest (oSuggR
2e30: 65 73 75 6c 74 2c 20 73 52 65 6d 61 69 6e 2c 20  esult, sRemain, 
2e40: 6e 4d 61 78 53 77 69 74 63 68 3d 30 2c 20 6e 4d  nMaxSwitch=0, nM
2e50: 61 78 44 65 6c 3d 30 2c 20 6e 4d 61 78 48 61 72  axDel=0, nMaxHar
2e60: 64 52 65 70 6c 3d 30 2c 20 6e 44 65 65 70 3d 30  dRepl=0, nDeep=0
2e70: 2c 20 69 41 64 64 72 3d 30 2c 20 73 4e 65 77 57  , iAddr=0, sNewW
2e80: 6f 72 64 3d 22 22 2c 20 62 41 76 6f 69 64 4c 6f  ord="", bAvoidLo
2e90: 6f 70 3d 66 61 6c 73 65 29 20 7b 0a 20 20 20 20  op=false) {.    
2ea0: 20 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 61      // returns a
2eb0: 20 73 65 74 20 6f 66 20 73 75 67 67 65 73 74 69   set of suggesti
2ec0: 6f 6e 73 0a 20 20 20 20 20 20 20 20 2f 2f 20 72  ons.        // r
2ed0: 65 63 75 72 73 69 76 65 20 66 75 6e 63 74 69 6f  ecursive functio
2ee0: 6e 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 52  n.        if (sR
2ef0: 65 6d 61 69 6e 20 3d 3d 20 22 22 29 20 7b 0a 20  emain == "") {. 
2f00: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74             if (t
2f10: 68 69 73 2e 5f 63 6f 6e 76 42 79 74 65 73 54 6f  his._convBytesTo
2f20: 49 6e 74 65 67 65 72 28 74 68 69 73 2e 62 79 44  Integer(this.byD
2f30: 69 63 2e 73 6c 69 63 65 28 69 41 64 64 72 2c 20  ic.slice(iAddr, 
2f40: 69 41 64 64 72 2b 74 68 69 73 2e 6e 42 79 74 65  iAddr+this.nByte
2f50: 73 41 72 63 29 29 20 26 20 74 68 69 73 2e 5f 66  sArc)) & this._f
2f60: 69 6e 61 6c 4e 6f 64 65 4d 61 73 6b 29 20 7b 0a  inalNodeMask) {.
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f80: 6f 53 75 67 67 52 65 73 75 6c 74 2e 61 64 64 53  oSuggResult.addS
2f90: 75 67 67 28 73 4e 65 77 57 6f 72 64 29 3b 0a 20  ugg(sNewWord);. 
2fa0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2fb0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65           for (le
2fc0: 74 20 73 54 61 69 6c 20 6f 66 20 74 68 69 73 2e  t sTail of this.
2fd0: 5f 67 65 74 54 61 69 6c 73 28 69 41 64 64 72 29  _getTails(iAddr)
2fe0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2ff0: 20 20 20 20 6f 53 75 67 67 52 65 73 75 6c 74 2e      oSuggResult.
3000: 61 64 64 53 75 67 67 28 73 4e 65 77 57 6f 72 64  addSugg(sNewWord
3010: 2b 73 54 61 69 6c 29 3b 0a 20 20 20 20 20 20 20  +sTail);.       
3020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3030: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
3040: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 65 74     }.        let
3050: 20 63 43 75 72 72 65 6e 74 20 3d 20 73 52 65 6d   cCurrent = sRem
3060: 61 69 6e 2e 73 6c 69 63 65 28 30 2c 20 31 29 3b  ain.slice(0, 1);
3070: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65  .        for (le
3080: 74 20 5b 63 43 68 61 72 2c 20 6a 41 64 64 72 5d  t [cChar, jAddr]
3090: 20 6f 66 20 74 68 69 73 2e 5f 67 65 74 43 68 61   of this._getCha
30a0: 72 41 72 63 73 28 69 41 64 64 72 29 29 20 7b 0a  rArcs(iAddr)) {.
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
30c0: 63 68 61 72 5f 70 6c 61 79 65 72 2e 64 31 74 6f  char_player.d1to
30d0: 31 2e 67 6c 5f 67 65 74 28 63 43 75 72 72 65 6e  1.gl_get(cCurren
30e0: 74 2c 20 63 43 75 72 72 65 6e 74 29 2e 69 6e 64  t, cCurrent).ind
30f0: 65 78 4f 66 28 63 43 68 61 72 29 20 21 3d 20 2d  exOf(cChar) != -
3100: 31 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1) {.           
3110: 20 20 20 20 20 74 68 69 73 2e 5f 73 75 67 67 65       this._sugge
3120: 73 74 28 6f 53 75 67 67 52 65 73 75 6c 74 2c 20  st(oSuggResult, 
3130: 73 52 65 6d 61 69 6e 2e 73 6c 69 63 65 28 31 29  sRemain.slice(1)
3140: 2c 20 6e 4d 61 78 53 77 69 74 63 68 2c 20 6e 4d  , nMaxSwitch, nM
3150: 61 78 44 65 6c 2c 20 6e 4d 61 78 48 61 72 64 52  axDel, nMaxHardR
3160: 65 70 6c 2c 20 6e 44 65 65 70 2b 31 2c 20 6a 41  epl, nDeep+1, jA
3170: 64 64 72 2c 20 73 4e 65 77 57 6f 72 64 2b 63 43  ddr, sNewWord+cC
3180: 68 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  har);.          
3190: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
31a0: 65 6c 73 65 20 69 66 20 28 21 62 41 76 6f 69 64  else if (!bAvoid
31b0: 4c 6f 6f 70 20 26 26 20 6e 4d 61 78 48 61 72 64  Loop && nMaxHard
31c0: 52 65 70 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  Repl) {.        
31d0: 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f 73 75          this._su
31e0: 67 67 65 73 74 28 6f 53 75 67 67 52 65 73 75 6c  ggest(oSuggResul
31f0: 74 2c 20 73 52 65 6d 61 69 6e 2e 73 6c 69 63 65  t, sRemain.slice
3200: 28 31 29 2c 20 6e 4d 61 78 53 77 69 74 63 68 2c  (1), nMaxSwitch,
3210: 20 6e 4d 61 78 44 65 6c 2c 20 6e 4d 61 78 48 61   nMaxDel, nMaxHa
3220: 72 64 52 65 70 6c 2d 31 2c 20 6e 44 65 65 70 2b  rdRepl-1, nDeep+
3230: 31 2c 20 6a 41 64 64 72 2c 20 73 4e 65 77 57 6f  1, jAddr, sNewWo
3240: 72 64 2b 63 43 68 61 72 2c 20 74 72 75 65 29 3b  rd+cChar, true);
3250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3260: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3270: 20 69 66 20 28 21 62 41 76 6f 69 64 4c 6f 6f 70   if (!bAvoidLoop
3280: 29 20 7b 20 2f 2f 20 61 76 6f 69 64 20 69 6e 66  ) { // avoid inf
3290: 69 6e 69 74 65 20 6c 6f 6f 70 0a 20 20 20 20 20  inite loop.     
32a0: 20 20 20 20 20 20 20 69 66 20 28 73 52 65 6d 61         if (sRema
32b0: 69 6e 2e 6c 65 6e 67 74 68 20 3e 20 31 29 20 7b  in.length > 1) {
32c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32d0: 20 69 66 20 28 63 43 75 72 72 65 6e 74 20 3d 3d   if (cCurrent ==
32e0: 20 73 52 65 6d 61 69 6e 2e 73 6c 69 63 65 28 31   sRemain.slice(1
32f0: 2c 20 32 29 29 20 7b 0a 20 20 20 20 20 20 20 20  , 2)) {.        
3300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73              // s
3310: 61 6d 65 20 63 68 61 72 2c 20 77 65 20 72 65 6d  ame char, we rem
3320: 6f 76 65 20 31 20 63 68 61 72 20 77 69 74 68 6f  ove 1 char witho
3330: 75 74 20 61 64 64 69 6e 67 20 31 20 74 6f 20 3c  ut adding 1 to <
3340: 73 4e 65 77 57 6f 72 64 3e 0a 20 20 20 20 20 20  sNewWord>.      
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
3360: 69 73 2e 5f 73 75 67 67 65 73 74 28 6f 53 75 67  is._suggest(oSug
3370: 67 52 65 73 75 6c 74 2c 20 73 52 65 6d 61 69 6e  gResult, sRemain
3380: 2e 73 6c 69 63 65 28 31 29 2c 20 6e 4d 61 78 53  .slice(1), nMaxS
3390: 77 69 74 63 68 2c 20 6e 4d 61 78 44 65 6c 2c 20  witch, nMaxDel, 
33a0: 6e 4d 61 78 48 61 72 64 52 65 70 6c 2c 20 6e 44  nMaxHardRepl, nD
33b0: 65 65 70 2b 31 2c 20 69 41 64 64 72 2c 20 73 4e  eep+1, iAddr, sN
33c0: 65 77 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  ewWord);.       
33d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33e0: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
33f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3400: 20 20 20 20 20 20 2f 2f 20 73 77 69 74 63 68 69        // switchi
3410: 6e 67 20 63 68 61 72 73 0a 20 20 20 20 20 20 20  ng chars.       
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
3430: 28 6e 4d 61 78 53 77 69 74 63 68 20 3e 20 30 29  (nMaxSwitch > 0)
3440: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
3450: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
3460: 5f 73 75 67 67 65 73 74 28 6f 53 75 67 67 52 65  _suggest(oSuggRe
3470: 73 75 6c 74 2c 20 73 52 65 6d 61 69 6e 2e 73 6c  sult, sRemain.sl
3480: 69 63 65 28 31 2c 20 32 29 2b 73 52 65 6d 61 69  ice(1, 2)+sRemai
3490: 6e 2e 73 6c 69 63 65 28 30 2c 20 31 29 2b 73 52  n.slice(0, 1)+sR
34a0: 65 6d 61 69 6e 2e 73 6c 69 63 65 28 32 29 2c 20  emain.slice(2), 
34b0: 6e 4d 61 78 53 77 69 74 63 68 2d 31 2c 20 6e 4d  nMaxSwitch-1, nM
34c0: 61 78 44 65 6c 2c 20 6e 4d 61 78 48 61 72 64 52  axDel, nMaxHardR
34d0: 65 70 6c 2c 20 6e 44 65 65 70 2b 31 2c 20 69 41  epl, nDeep+1, iA
34e0: 64 64 72 2c 20 73 4e 65 77 57 6f 72 64 2c 20 74  ddr, sNewWord, t
34f0: 72 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rue);.          
3500: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3520: 2f 2f 20 64 65 6c 65 74 65 20 63 68 61 72 0a 20  // delete char. 
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3540: 20 20 20 69 66 20 28 6e 4d 61 78 44 65 6c 20 3e     if (nMaxDel >
3550: 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   0) {.          
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
3570: 69 73 2e 5f 73 75 67 67 65 73 74 28 6f 53 75 67  is._suggest(oSug
3580: 67 52 65 73 75 6c 74 2c 20 73 52 65 6d 61 69 6e  gResult, sRemain
3590: 2e 73 6c 69 63 65 28 31 29 2c 20 6e 4d 61 78 53  .slice(1), nMaxS
35a0: 77 69 74 63 68 2c 20 6e 4d 61 78 44 65 6c 2d 31  witch, nMaxDel-1
35b0: 2c 20 6e 4d 61 78 48 61 72 64 52 65 70 6c 2c 20  , nMaxHardRepl, 
35c0: 6e 44 65 65 70 2b 31 2c 20 69 41 64 64 72 2c 20  nDeep+1, iAddr, 
35d0: 73 4e 65 77 57 6f 72 64 2c 20 74 72 75 65 29 3b  sNewWord, true);
35e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3600: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3610: 20 20 20 20 20 20 20 20 20 2f 2f 20 50 68 6f 6e           // Phon
3620: 65 74 69 63 20 72 65 70 6c 61 63 65 6d 65 6e 74  etic replacement
3630: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
3640: 20 20 66 6f 72 20 28 6c 65 74 20 73 52 65 70 6c    for (let sRepl
3650: 20 6f 66 20 63 68 61 72 5f 70 6c 61 79 65 72 2e   of char_player.
3660: 67 65 74 31 74 6f 58 52 65 70 6c 61 63 65 6d 65  get1toXReplaceme
3670: 6e 74 28 73 4e 65 77 57 6f 72 64 2e 73 6c 69 63  nt(sNewWord.slic
3680: 65 28 2d 31 29 2c 20 63 43 75 72 72 65 6e 74 2c  e(-1), cCurrent,
3690: 20 73 52 65 6d 61 69 6e 2e 73 6c 69 63 65 28 31   sRemain.slice(1
36a0: 2c 32 29 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ,2))) {.        
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
36c0: 2e 5f 73 75 67 67 65 73 74 28 6f 53 75 67 67 52  ._suggest(oSuggR
36d0: 65 73 75 6c 74 2c 20 73 52 65 70 6c 20 2b 20 73  esult, sRepl + s
36e0: 52 65 6d 61 69 6e 2e 73 6c 69 63 65 28 31 29 2c  Remain.slice(1),
36f0: 20 6e 4d 61 78 53 77 69 74 63 68 2c 20 6e 4d 61   nMaxSwitch, nMa
3700: 78 44 65 6c 2c 20 6e 4d 61 78 48 61 72 64 52 65  xDel, nMaxHardRe
3710: 70 6c 2c 20 6e 44 65 65 70 2b 31 2c 20 69 41 64  pl, nDeep+1, iAd
3720: 64 72 2c 20 73 4e 65 77 57 6f 72 64 2c 20 74 72  dr, sNewWord, tr
3730: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ue);.           
3740: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3750: 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20         for (let 
3760: 73 52 65 70 6c 20 6f 66 20 63 68 61 72 5f 70 6c  sRepl of char_pl
3770: 61 79 65 72 2e 64 32 74 6f 58 2e 67 6c 5f 67 65  ayer.d2toX.gl_ge
3780: 74 28 73 52 65 6d 61 69 6e 2e 73 6c 69 63 65 28  t(sRemain.slice(
3790: 30 2c 20 32 29 2c 20 5b 5d 29 29 20 7b 0a 20 20  0, 2), [])) {.  
37a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b0: 20 20 74 68 69 73 2e 5f 73 75 67 67 65 73 74 28    this._suggest(
37c0: 6f 53 75 67 67 52 65 73 75 6c 74 2c 20 73 52 65  oSuggResult, sRe
37d0: 70 6c 20 2b 20 73 52 65 6d 61 69 6e 2e 73 6c 69  pl + sRemain.sli
37e0: 63 65 28 32 29 2c 20 6e 4d 61 78 53 77 69 74 63  ce(2), nMaxSwitc
37f0: 68 2c 20 6e 4d 61 78 44 65 6c 2c 20 6e 4d 61 78  h, nMaxDel, nMax
3800: 48 61 72 64 52 65 70 6c 2c 20 6e 44 65 65 70 2b  HardRepl, nDeep+
3810: 31 2c 20 69 41 64 64 72 2c 20 73 4e 65 77 57 6f  1, iAddr, sNewWo
3820: 72 64 2c 20 74 72 75 65 29 3b 0a 20 20 20 20 20  rd, true);.     
3830: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3840: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3850: 20 20 20 20 20 20 20 2f 2f 20 65 6e 64 20 6f 66         // end of
3860: 20 77 6f 72 64 0a 20 20 20 20 20 20 20 20 20 20   word.          
3870: 20 20 69 66 20 28 73 52 65 6d 61 69 6e 2e 6c 65    if (sRemain.le
3880: 6e 67 74 68 20 3d 3d 20 32 29 20 7b 0a 20 20 20  ngth == 2) {.   
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
38a0: 20 28 6c 65 74 20 73 52 65 70 6c 20 6f 66 20 63   (let sRepl of c
38b0: 68 61 72 5f 70 6c 61 79 65 72 2e 64 46 69 6e 61  har_player.dFina
38c0: 6c 32 2e 67 6c 5f 67 65 74 28 73 52 65 6d 61 69  l2.gl_get(sRemai
38d0: 6e 2c 20 5b 5d 29 29 20 7b 0a 20 20 20 20 20 20  n, [])) {.      
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
38f0: 69 73 2e 5f 73 75 67 67 65 73 74 28 6f 53 75 67  is._suggest(oSug
3900: 67 52 65 73 75 6c 74 2c 20 73 52 65 70 6c 2c 20  gResult, sRepl, 
3910: 6e 4d 61 78 53 77 69 74 63 68 2c 20 6e 4d 61 78  nMaxSwitch, nMax
3920: 44 65 6c 2c 20 6e 4d 61 78 48 61 72 64 52 65 70  Del, nMaxHardRep
3930: 6c 2c 20 6e 44 65 65 70 2b 31 2c 20 69 41 64 64  l, nDeep+1, iAdd
3940: 72 2c 20 73 4e 65 77 57 6f 72 64 2c 20 74 72 75  r, sNewWord, tru
3950: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
3960: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3970: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3980: 65 6c 73 65 20 69 66 20 28 73 52 65 6d 61 69 6e  else if (sRemain
3990: 2e 6c 65 6e 67 74 68 20 3d 3d 20 31 29 20 7b 0a  .length == 1) {.
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 74 68 69 73 2e 5f 73 75 67 67 65 73 74 28 6f 53  this._suggest(oS
39c0: 75 67 67 52 65 73 75 6c 74 2c 20 22 22 2c 20 6e  uggResult, "", n
39d0: 4d 61 78 53 77 69 74 63 68 2c 20 6e 4d 61 78 44  MaxSwitch, nMaxD
39e0: 65 6c 2c 20 6e 4d 61 78 48 61 72 64 52 65 70 6c  el, nMaxHardRepl
39f0: 2c 20 6e 44 65 65 70 2b 31 2c 20 69 41 64 64 72  , nDeep+1, iAddr
3a00: 2c 20 73 4e 65 77 57 6f 72 64 2c 20 74 72 75 65  , sNewWord, true
3a10: 29 3b 20 2f 2f 20 72 65 6d 6f 76 65 20 6c 61 73  ); // remove las
3a20: 74 20 63 68 61 72 20 61 6e 64 20 67 6f 20 6f 6e  t char and go on
3a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3a40: 20 66 6f 72 20 28 6c 65 74 20 73 52 65 70 6c 20   for (let sRepl 
3a50: 6f 66 20 63 68 61 72 5f 70 6c 61 79 65 72 2e 64  of char_player.d
3a60: 46 69 6e 61 6c 31 2e 67 6c 5f 67 65 74 28 73 52  Final1.gl_get(sR
3a70: 65 6d 61 69 6e 2c 20 5b 5d 29 29 20 7b 0a 20 20  emain, [])) {.  
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 74 68 69 73 2e 5f 73 75 67 67 65 73 74 28    this._suggest(
3aa0: 6f 53 75 67 67 52 65 73 75 6c 74 2c 20 73 52 65  oSuggResult, sRe
3ab0: 70 6c 2c 20 6e 4d 61 78 53 77 69 74 63 68 2c 20  pl, nMaxSwitch, 
3ac0: 6e 4d 61 78 44 65 6c 2c 20 6e 4d 61 78 48 61 72  nMaxDel, nMaxHar
3ad0: 64 52 65 70 6c 2c 20 6e 44 65 65 70 2b 31 2c 20  dRepl, nDeep+1, 
3ae0: 69 41 64 64 72 2c 20 73 4e 65 77 57 6f 72 64 2c  iAddr, sNewWord,
3af0: 20 74 72 75 65 29 3b 0a 20 20 20 20 20 20 20 20   true);.        
3b00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3b10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3b20: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a 20 5f  }.    }..    * _
3b30: 67 65 74 43 68 61 72 41 72 63 73 20 28 69 41 64  getCharArcs (iAd
3b40: 64 72 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f  dr) {.        //
3b50: 20 67 65 6e 65 72 61 74 6f 72 3a 20 79 69 65 6c   generator: yiel
3b60: 64 20 61 6c 6c 20 63 68 61 72 73 20 61 6e 64 20  d all chars and 
3b70: 61 64 64 72 65 73 73 65 73 20 66 72 6f 6d 20 6e  addresses from n
3b80: 6f 64 65 20 61 74 20 61 64 64 72 65 73 73 20 3c  ode at address <
3b90: 69 41 64 64 72 3e 0a 20 20 20 20 20 20 20 20 66  iAddr>.        f
3ba0: 6f 72 20 28 6c 65 74 20 5b 6e 56 61 6c 2c 20 6a  or (let [nVal, j
3bb0: 41 64 64 72 5d 20 6f 66 20 74 68 69 73 2e 5f 67  Addr] of this._g
3bc0: 65 74 41 72 63 73 28 69 41 64 64 72 29 29 20 7b  etArcs(iAddr)) {
3bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
3be0: 28 6e 56 61 6c 20 3c 3d 20 74 68 69 73 2e 6e 43  (nVal <= this.nC
3bf0: 68 61 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20  har) {.         
3c00: 20 20 20 20 20 20 20 79 69 65 6c 64 20 5b 74 68         yield [th
3c10: 69 73 2e 64 43 68 61 72 56 61 6c 2e 67 65 74 28  is.dCharVal.get(
3c20: 6e 56 61 6c 29 2c 20 6a 41 64 64 72 5d 3b 0a 20  nVal), jAddr];. 
3c30: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3c40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
3c50: 20 20 2a 20 5f 67 65 74 53 69 6d 69 6c 61 72 43    * _getSimilarC
3c60: 68 61 72 41 72 63 73 20 28 63 43 68 61 72 2c 20  harArcs (cChar, 
3c70: 69 41 64 64 72 29 20 7b 0a 20 20 20 20 20 20 20  iAddr) {.       
3c80: 20 2f 2f 20 67 65 6e 65 72 61 74 6f 72 3a 20 79   // generator: y
3c90: 69 65 6c 64 20 73 69 6d 69 6c 61 72 20 63 68 61  ield similar cha
3ca0: 72 20 6f 66 20 3c 63 43 68 61 72 3e 20 61 6e 64  r of <cChar> and
3cb0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
3cc0: 66 6f 6c 6c 6f 77 69 6e 67 20 6e 6f 64 65 0a 20  following node. 
3cd0: 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20         for (let 
3ce0: 63 20 6f 66 20 63 68 61 72 5f 70 6c 61 79 65 72  c of char_player
3cf0: 2e 64 31 74 6f 31 2e 67 6c 5f 67 65 74 28 63 43  .d1to1.gl_get(cC
3d00: 68 61 72 2c 20 5b 63 43 68 61 72 5d 29 29 20 7b  har, [cChar])) {
3d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
3d20: 28 74 68 69 73 2e 64 43 68 61 72 2e 68 61 73 28  (this.dChar.has(
3d30: 63 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  c)) {.          
3d40: 20 20 20 20 20 20 6c 65 74 20 6a 41 64 64 72 20        let jAddr 
3d50: 3d 20 74 68 69 73 2e 5f 6c 6f 6f 6b 75 70 41 72  = this._lookupAr
3d60: 63 4e 6f 64 65 28 74 68 69 73 2e 64 43 68 61 72  cNode(this.dChar
3d70: 2e 67 65 74 28 63 29 2c 20 69 41 64 64 72 29 3b  .get(c), iAddr);
3d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3d90: 20 69 66 20 28 6a 41 64 64 72 29 20 7b 0a 20 20   if (jAddr) {.  
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3db0: 20 20 79 69 65 6c 64 20 5b 63 2c 20 6a 41 64 64    yield [c, jAdd
3dc0: 72 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r];.            
3dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3de0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
3df0: 20 20 7d 0a 0a 20 20 20 20 5f 67 65 74 54 61 69    }..    _getTai
3e00: 6c 73 20 28 69 41 64 64 72 2c 20 73 54 61 69 6c  ls (iAddr, sTail
3e10: 3d 22 22 2c 20 6e 3d 32 29 20 7b 0a 20 20 20 20  ="", n=2) {.    
3e20: 20 20 20 20 2f 2f 20 72 65 74 75 72 6e 20 61 20      // return a 
3e30: 6c 69 73 74 20 6f 66 20 73 75 66 66 69 78 65 73  list of suffixes
3e40: 20 65 6e 64 69 6e 67 20 61 74 20 61 20 64 69 73   ending at a dis
3e50: 74 61 6e 63 65 20 6f 66 20 3c 6e 3e 20 66 72 6f  tance of <n> fro
3e60: 6d 20 3c 69 41 64 64 72 3e 0a 20 20 20 20 20 20  m <iAddr>.      
3e70: 20 20 6c 65 74 20 61 54 61 69 6c 73 20 3d 20 6e    let aTails = n
3e80: 65 77 20 53 65 74 28 29 3b 0a 20 20 20 20 20 20  ew Set();.      
3e90: 20 20 66 6f 72 20 28 6c 65 74 20 5b 6e 56 61 6c    for (let [nVal
3ea0: 2c 20 6a 41 64 64 72 5d 20 6f 66 20 74 68 69 73  , jAddr] of this
3eb0: 2e 5f 67 65 74 41 72 63 73 28 69 41 64 64 72 29  ._getArcs(iAddr)
3ec0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3ed0: 69 66 20 28 6e 56 61 6c 20 3c 3d 20 74 68 69 73  if (nVal <= this
3ee0: 2e 6e 43 68 61 72 29 20 7b 0a 20 20 20 20 20 20  .nChar) {.      
3ef0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74 68            if (th
3f00: 69 73 2e 5f 63 6f 6e 76 42 79 74 65 73 54 6f 49  is._convBytesToI
3f10: 6e 74 65 67 65 72 28 74 68 69 73 2e 62 79 44 69  nteger(this.byDi
3f20: 63 2e 73 6c 69 63 65 28 6a 41 64 64 72 2c 20 6a  c.slice(jAddr, j
3f30: 41 64 64 72 2b 74 68 69 73 2e 6e 42 79 74 65 73  Addr+this.nBytes
3f40: 41 72 63 29 29 20 26 20 74 68 69 73 2e 5f 66 69  Arc)) & this._fi
3f50: 6e 61 6c 4e 6f 64 65 4d 61 73 6b 29 20 7b 0a 20  nalNodeMask) {. 
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f70: 20 20 20 61 54 61 69 6c 73 2e 61 64 64 28 73 54     aTails.add(sT
3f80: 61 69 6c 20 2b 20 74 68 69 73 2e 64 43 68 61 72  ail + this.dChar
3f90: 56 61 6c 2e 67 65 74 28 6e 56 61 6c 29 29 3b 0a  Val.get(nVal));.
3fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fb0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
3fc0: 20 20 69 66 20 28 6e 20 26 26 20 61 54 61 69 6c    if (n && aTail
3fd0: 73 2e 73 69 7a 65 20 3d 3d 20 30 29 20 7b 0a 20  s.size == 0) {. 
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ff0: 20 20 20 61 54 61 69 6c 73 2e 67 6c 5f 75 70 64     aTails.gl_upd
4000: 61 74 65 28 74 68 69 73 2e 5f 67 65 74 54 61 69  ate(this._getTai
4010: 6c 73 28 6a 41 64 64 72 2c 20 73 54 61 69 6c 2b  ls(jAddr, sTail+
4020: 74 68 69 73 2e 64 43 68 61 72 56 61 6c 2e 67 65  this.dCharVal.ge
4030: 74 28 6e 56 61 6c 29 2c 20 6e 2d 31 29 29 3b 0a  t(nVal), n-1));.
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4050: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
4060: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4070: 20 20 72 65 74 75 72 6e 20 61 54 61 69 6c 73 3b    return aTails;
4080: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 6d  .    }..    // m
4090: 6f 72 70 68 20 28 73 57 6f 72 64 29 20 7b 0a 20  orph (sWord) {. 
40a0: 20 20 20 2f 2f 20 20 20 20 20 69 73 20 64 65 66     //     is def
40b0: 69 6e 65 64 20 69 6e 20 63 6f 6e 73 74 72 75 63  ined in construc
40c0: 74 6f 72 0a 20 20 20 20 2f 2f 20 7d 0a 20 20 20  tor.    // }.   
40d0: 20 0a 20 20 20 20 2a 20 73 65 6c 65 63 74 20 28   .    * select (
40e0: 73 50 61 74 74 65 72 6e 3d 22 22 29 20 7b 0a 20  sPattern="") {. 
40f0: 20 20 20 20 20 20 20 2f 2f 20 67 65 6e 65 72 61         // genera
4100: 74 6f 72 3a 20 72 65 74 75 72 6e 73 20 61 6c 6c  tor: returns all
4110: 20 65 6e 74 72 69 65 73 20 77 68 69 63 68 20 6d   entries which m
4120: 6f 72 70 68 6f 6c 6f 67 79 20 66 69 74 73 20 3c  orphology fits <
4130: 73 50 61 74 74 65 72 6e 3e 0a 20 20 20 20 20 20  sPattern>.      
4140: 20 20 6c 65 74 20 7a 50 61 74 74 65 72 6e 20 3d    let zPattern =
4150: 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69   null;.        i
4160: 66 20 28 73 50 61 74 74 65 72 6e 20 21 3d 3d 20  f (sPattern !== 
4170: 22 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  "") {.          
4180: 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20    try {.        
4190: 20 20 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e          zPattern
41a0: 20 3d 20 6e 65 77 20 52 65 67 45 78 70 28 73 50   = new RegExp(sP
41b0: 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20  attern);.       
41c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
41d0: 20 20 20 63 61 74 63 68 20 28 65 29 20 7b 0a 20     catch (e) {. 
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
41f0: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 45 72 72 6f  onsole.log("Erro
4200: 72 20 69 6e 20 72 65 67 65 78 20 70 61 74 74 65  r in regex patte
4210: 72 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rn");.          
4220: 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f        console.lo
4230: 67 28 65 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20  g(e.message);.  
4240: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4250: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 79 69      }.        yi
4260: 65 6c 64 2a 20 74 68 69 73 2e 5f 73 65 6c 65 63  eld* this._selec
4270: 74 31 28 7a 50 61 74 74 65 72 6e 2c 20 30 2c 20  t1(zPattern, 0, 
4280: 22 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  "");.    }..    
4290: 2f 2f 20 56 45 52 53 49 4f 4e 20 31 0a 0a 20 20  // VERSION 1..  
42a0: 20 20 2a 20 5f 73 65 6c 65 63 74 31 20 28 7a 50    * _select1 (zP
42b0: 61 74 74 65 72 6e 2c 20 69 41 64 64 72 2c 20 73  attern, iAddr, s
42c0: 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20  Word) {.        
42d0: 2f 2f 20 72 65 63 75 72 73 69 76 65 20 67 65 6e  // recursive gen
42e0: 65 72 61 74 6f 72 0a 20 20 20 20 20 20 20 20 66  erator.        f
42f0: 6f 72 20 28 6c 65 74 20 5b 6e 56 61 6c 2c 20 6a  or (let [nVal, j
4300: 41 64 64 72 5d 20 6f 66 20 74 68 69 73 2e 5f 67  Addr] of this._g
4310: 65 74 41 72 63 73 31 28 69 41 64 64 72 29 29 20  etArcs1(iAddr)) 
4320: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
4330: 20 28 6e 56 61 6c 20 3c 3d 20 74 68 69 73 2e 6e   (nVal <= this.n
4340: 43 68 61 72 29 20 7b 0a 20 20 20 20 20 20 20 20  Char) {.        
4350: 20 20 20 20 20 20 20 20 2f 2f 20 73 69 6d 70 6c          // simpl
4360: 65 20 63 68 61 72 61 63 74 65 72 0a 20 20 20 20  e character.    
4370: 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c              yiel
4380: 64 2a 20 74 68 69 73 2e 5f 73 65 6c 65 63 74 31  d* this._select1
4390: 28 7a 50 61 74 74 65 72 6e 2c 20 6a 41 64 64 72  (zPattern, jAddr
43a0: 2c 20 73 57 6f 72 64 20 2b 20 74 68 69 73 2e 6c  , sWord + this.l
43b0: 41 72 63 56 61 6c 5b 6e 56 61 6c 5d 29 3b 0a 20  ArcVal[nVal]);. 
43c0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
43d0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
43e0: 20 20 20 20 6c 65 74 20 73 45 6e 74 72 79 20 3d      let sEntry =
43f0: 20 73 57 6f 72 64 20 2b 20 22 5c 74 22 20 2b 20   sWord + "\t" + 
4400: 74 68 69 73 2e 66 75 6e 63 53 74 65 6d 6d 69 6e  this.funcStemmin
4410: 67 28 73 57 6f 72 64 2c 20 74 68 69 73 2e 6c 41  g(sWord, this.lA
4420: 72 63 56 61 6c 5b 6e 56 61 6c 5d 29 3b 0a 20 20  rcVal[nVal]);.  
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
4440: 72 20 28 6c 65 74 20 5b 6e 4d 6f 72 70 68 56 61  r (let [nMorphVa
4450: 6c 2c 20 5f 5d 20 6f 66 20 74 68 69 73 2e 5f 67  l, _] of this._g
4460: 65 74 41 72 63 73 31 28 6a 41 64 64 72 29 29 20  etArcs1(jAddr)) 
4470: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4480: 20 20 20 20 20 20 69 66 20 28 21 7a 50 61 74 74        if (!zPatt
4490: 65 72 6e 20 7c 7c 20 7a 50 61 74 74 65 72 6e 2e  ern || zPattern.
44a0: 74 65 73 74 28 74 68 69 73 2e 6c 41 72 63 56 61  test(this.lArcVa
44b0: 6c 5b 6e 4d 6f 72 70 68 56 61 6c 5d 29 29 20 7b  l[nMorphVal])) {
44c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
44d0: 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 73           yield s
44e0: 45 6e 74 72 79 20 2b 20 22 5c 74 22 20 2b 20 74  Entry + "\t" + t
44f0: 68 69 73 2e 6c 41 72 63 56 61 6c 5b 6e 4d 6f 72  his.lArcVal[nMor
4500: 70 68 56 61 6c 5d 3b 0a 20 20 20 20 20 20 20 20  phVal];.        
4510: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
4530: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
4540: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 20 20        }.    }   
4550: 20 20 20 20 20 20 20 20 20 0a 0a 20 20 20 20 5f           ..    _
4560: 6d 6f 72 70 68 31 20 28 73 57 6f 72 64 29 20 7b  morph1 (sWord) {
4570: 0a 20 20 20 20 20 20 20 20 2f 2f 20 72 65 74 75  .        // retu
4580: 72 6e 73 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73  rns morphologies
4590: 20 6f 66 20 73 57 6f 72 64 0a 20 20 20 20 20 20   of sWord.      
45a0: 20 20 6c 65 74 20 69 41 64 64 72 20 3d 20 30 3b    let iAddr = 0;
45b0: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65  .        for (le
45c0: 74 20 63 20 6f 66 20 73 57 6f 72 64 29 20 7b 0a  t c of sWord) {.
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
45e0: 21 74 68 69 73 2e 64 43 68 61 72 2e 68 61 73 28  !this.dChar.has(
45f0: 63 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  c)) {.          
4600: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 5d 3b        return [];
4610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
4620: 20 20 20 20 20 20 20 20 20 20 20 69 41 64 64 72             iAddr
4630: 20 3d 20 74 68 69 73 2e 5f 6c 6f 6f 6b 75 70 41   = this._lookupA
4640: 72 63 4e 6f 64 65 28 74 68 69 73 2e 64 43 68 61  rcNode(this.dCha
4650: 72 2e 67 65 74 28 63 29 2c 20 69 41 64 64 72 29  r.get(c), iAddr)
4660: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
4670: 20 28 69 41 64 64 72 20 3d 3d 3d 20 6e 75 6c 6c   (iAddr === null
4680: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
4690: 20 20 20 20 72 65 74 75 72 6e 20 5b 5d 3b 0a 20      return [];. 
46a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
46b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
46c0: 66 20 28 74 68 69 73 2e 5f 63 6f 6e 76 42 79 74  f (this._convByt
46d0: 65 73 54 6f 49 6e 74 65 67 65 72 28 74 68 69 73  esToInteger(this
46e0: 2e 62 79 44 69 63 2e 73 6c 69 63 65 28 69 41 64  .byDic.slice(iAd
46f0: 64 72 2c 20 69 41 64 64 72 2b 74 68 69 73 2e 6e  dr, iAddr+this.n
4700: 42 79 74 65 73 41 72 63 29 29 20 26 20 74 68 69  BytesArc)) & thi
4710: 73 2e 5f 66 69 6e 61 6c 4e 6f 64 65 4d 61 73 6b  s._finalNodeMask
4720: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
4730: 6c 65 74 20 6c 20 3d 20 5b 5d 3b 0a 20 20 20 20  let l = [];.    
4740: 20 20 20 20 20 20 20 20 6c 65 74 20 6e 52 61 77          let nRaw
4750: 41 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Arc = 0;.       
4760: 20 20 20 20 20 77 68 69 6c 65 20 28 21 28 6e 52       while (!(nR
4770: 61 77 41 72 63 20 26 20 74 68 69 73 2e 5f 6c 61  awArc & this._la
4780: 73 74 41 72 63 4d 61 73 6b 29 29 20 7b 0a 20 20  stArcMask)) {.  
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
47a0: 74 20 69 45 6e 64 41 72 63 41 64 64 72 20 3d 20  t iEndArcAddr = 
47b0: 69 41 64 64 72 20 2b 20 74 68 69 73 2e 6e 42 79  iAddr + this.nBy
47c0: 74 65 73 41 72 63 3b 0a 20 20 20 20 20 20 20 20  tesArc;.        
47d0: 20 20 20 20 20 20 20 20 6e 52 61 77 41 72 63 20          nRawArc 
47e0: 3d 20 74 68 69 73 2e 5f 63 6f 6e 76 42 79 74 65  = this._convByte
47f0: 73 54 6f 49 6e 74 65 67 65 72 28 74 68 69 73 2e  sToInteger(this.
4800: 62 79 44 69 63 2e 73 6c 69 63 65 28 69 41 64 64  byDic.slice(iAdd
4810: 72 2c 20 69 45 6e 64 41 72 63 41 64 64 72 29 29  r, iEndArcAddr))
4820: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4830: 20 20 6c 65 74 20 6e 41 72 63 20 3d 20 6e 52 61    let nArc = nRa
4840: 77 41 72 63 20 26 20 74 68 69 73 2e 5f 61 72 63  wArc & this._arc
4850: 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  Mask;.          
4860: 20 20 20 20 20 20 69 66 20 28 6e 41 72 63 20 3e        if (nArc >
4870: 20 74 68 69 73 2e 6e 43 68 61 72 29 20 7b 0a 20   this.nChar) {. 
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 20 20 20 2f 2f 20 54 68 69 73 20 76 61 6c 75 65     // This value
48a0: 20 69 73 20 6e 6f 74 20 61 20 63 68 61 72 2c 20   is not a char, 
48b0: 74 68 69 73 20 69 73 20 61 20 73 74 65 6d 6d 69  this is a stemmi
48c0: 6e 67 20 63 6f 64 65 20 0a 20 20 20 20 20 20 20  ng code .       
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
48e0: 20 73 53 74 65 6d 20 3d 20 22 3e 22 20 2b 20 74   sStem = ">" + t
48f0: 68 69 73 2e 66 75 6e 63 53 74 65 6d 6d 69 6e 67  his.funcStemming
4900: 28 73 57 6f 72 64 2c 20 74 68 69 73 2e 6c 41 72  (sWord, this.lAr
4910: 63 56 61 6c 5b 6e 41 72 63 5d 29 3b 0a 20 20 20  cVal[nArc]);.   
4920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4930: 20 2f 2f 20 4e 6f 77 20 2c 20 77 65 20 67 6f 20   // Now , we go 
4940: 74 6f 20 74 68 65 20 6e 65 78 74 20 6e 6f 64 65  to the next node
4950: 20 61 6e 64 20 72 65 74 72 69 65 76 65 20 61 6c   and retrieve al
4960: 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 63 73  l following arcs
4970: 20 76 61 6c 75 65 73 2c 20 61 6c 6c 20 6f 66 20   values, all of 
4980: 74 68 65 6d 20 61 72 65 20 74 61 67 73 0a 20 20  them are tags.  
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49a0: 20 20 6c 65 74 20 69 41 64 64 72 32 20 3d 20 74    let iAddr2 = t
49b0: 68 69 73 2e 5f 63 6f 6e 76 42 79 74 65 73 54 6f  his._convBytesTo
49c0: 49 6e 74 65 67 65 72 28 74 68 69 73 2e 62 79 44  Integer(this.byD
49d0: 69 63 2e 73 6c 69 63 65 28 69 45 6e 64 41 72 63  ic.slice(iEndArc
49e0: 41 64 64 72 2c 20 69 45 6e 64 41 72 63 41 64 64  Addr, iEndArcAdd
49f0: 72 2b 74 68 69 73 2e 6e 42 79 74 65 73 4e 6f 64  r+this.nBytesNod
4a00: 65 41 64 64 72 65 73 73 29 29 3b 0a 20 20 20 20  eAddress));.    
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 6c 65 74 20 6e 52 61 77 41 72 63 32 20 3d 20 30  let nRawArc2 = 0
4a30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4a40: 20 20 20 20 20 20 77 68 69 6c 65 20 28 21 28 6e        while (!(n
4a50: 52 61 77 41 72 63 32 20 26 20 74 68 69 73 2e 5f  RawArc2 & this._
4a60: 6c 61 73 74 41 72 63 4d 61 73 6b 29 29 20 7b 0a  lastArcMask)) {.
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a80: 20 20 20 20 20 20 20 20 6c 65 74 20 69 45 6e 64          let iEnd
4a90: 41 72 63 41 64 64 72 32 20 3d 20 69 41 64 64 72  ArcAddr2 = iAddr
4aa0: 32 20 2b 20 74 68 69 73 2e 6e 42 79 74 65 73 41  2 + this.nBytesA
4ab0: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  rc;.            
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 61 77              nRaw
4ad0: 41 72 63 32 20 3d 20 74 68 69 73 2e 5f 63 6f 6e  Arc2 = this._con
4ae0: 76 42 79 74 65 73 54 6f 49 6e 74 65 67 65 72 28  vBytesToInteger(
4af0: 74 68 69 73 2e 62 79 44 69 63 2e 73 6c 69 63 65  this.byDic.slice
4b00: 28 69 41 64 64 72 32 2c 20 69 45 6e 64 41 72 63  (iAddr2, iEndArc
4b10: 41 64 64 72 32 29 29 3b 0a 20 20 20 20 20 20 20  Addr2));.       
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 20 6c 2e 70 75 73 68 28 73 53 74 65 6d 20 2b 20   l.push(sStem + 
4b40: 22 20 22 20 2b 20 74 68 69 73 2e 6c 41 72 63 56  " " + this.lArcV
4b50: 61 6c 5b 6e 52 61 77 41 72 63 32 20 26 20 74 68  al[nRawArc2 & th
4b60: 69 73 2e 5f 61 72 63 4d 61 73 6b 5d 29 3b 0a 20  is._arcMask]);. 
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b80: 20 20 20 20 20 20 20 69 41 64 64 72 32 20 3d 20         iAddr2 = 
4b90: 69 45 6e 64 41 72 63 41 64 64 72 32 2b 74 68 69  iEndArcAddr2+thi
4ba0: 73 2e 6e 42 79 74 65 73 4e 6f 64 65 41 64 64 72  s.nBytesNodeAddr
4bb0: 65 73 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ess;.           
4bc0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4bd0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 41 64               iAd
4bf0: 64 72 20 3d 20 69 45 6e 64 41 72 63 41 64 64 72  dr = iEndArcAddr
4c00: 20 2b 20 74 68 69 73 2e 6e 42 79 74 65 73 4e 6f   + this.nBytesNo
4c10: 64 65 41 64 64 72 65 73 73 3b 0a 20 20 20 20 20  deAddress;.     
4c20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4c30: 20 20 20 20 20 72 65 74 75 72 6e 20 6c 3b 0a 20       return l;. 
4c40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4c50: 20 72 65 74 75 72 6e 20 5b 5d 3b 0a 20 20 20 20   return [];.    
4c60: 7d 0a 0a 20 20 20 20 5f 73 74 65 6d 31 20 28 73  }..    _stem1 (s
4c70: 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20  Word) {.        
4c80: 2f 2f 20 72 65 74 75 72 6e 73 20 73 74 65 6d 73  // returns stems
4c90: 20 6c 69 73 74 20 6f 66 20 73 57 6f 72 64 0a 20   list of sWord. 
4ca0: 20 20 20 20 20 20 20 6c 65 74 20 69 41 64 64 72         let iAddr
4cb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
4cc0: 72 20 28 6c 65 74 20 63 20 6f 66 20 73 57 6f 72  r (let c of sWor
4cd0: 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d) {.           
4ce0: 20 69 66 20 28 21 74 68 69 73 2e 64 43 68 61 72   if (!this.dChar
4cf0: 2e 68 61 73 28 63 29 29 20 7b 0a 20 20 20 20 20  .has(c)) {.     
4d00: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
4d10: 6e 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n [];.          
4d20: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
4d30: 69 41 64 64 72 20 3d 20 74 68 69 73 2e 5f 6c 6f  iAddr = this._lo
4d40: 6f 6b 75 70 41 72 63 4e 6f 64 65 28 74 68 69 73  okupArcNode(this
4d50: 2e 64 43 68 61 72 2e 67 65 74 28 63 29 2c 20 69  .dChar.get(c), i
4d60: 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Addr);.         
4d70: 20 20 20 69 66 20 28 69 41 64 64 72 20 3d 3d 3d     if (iAddr ===
4d80: 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20   null) {.       
4d90: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
4da0: 5b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  [];.            
4db0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
4dc0: 20 20 20 20 69 66 20 28 74 68 69 73 2e 5f 63 6f      if (this._co
4dd0: 6e 76 42 79 74 65 73 54 6f 49 6e 74 65 67 65 72  nvBytesToInteger
4de0: 28 74 68 69 73 2e 62 79 44 69 63 2e 73 6c 69 63  (this.byDic.slic
4df0: 65 28 69 41 64 64 72 2c 20 69 41 64 64 72 2b 74  e(iAddr, iAddr+t
4e00: 68 69 73 2e 6e 42 79 74 65 73 41 72 63 29 29 20  his.nBytesArc)) 
4e10: 26 20 74 68 69 73 2e 5f 66 69 6e 61 6c 4e 6f 64  & this._finalNod
4e20: 65 4d 61 73 6b 29 20 7b 0a 20 20 20 20 20 20 20  eMask) {.       
4e30: 20 20 20 20 20 6c 65 74 20 6c 20 3d 20 5b 5d 3b       let l = [];
4e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74  .            let
4e50: 20 6e 52 61 77 41 72 63 20 3d 20 30 3b 0a 20 20   nRawArc = 0;.  
4e60: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 20            while 
4e70: 28 21 28 6e 52 61 77 41 72 63 20 26 20 74 68 69  (!(nRawArc & thi
4e80: 73 2e 5f 6c 61 73 74 41 72 63 4d 61 73 6b 29 29  s._lastArcMask))
4e90: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
4ea0: 20 20 20 6c 65 74 20 69 45 6e 64 41 72 63 41 64     let iEndArcAd
4eb0: 64 72 20 3d 20 69 41 64 64 72 20 2b 20 74 68 69  dr = iAddr + thi
4ec0: 73 2e 6e 42 79 74 65 73 41 72 63 3b 0a 20 20 20  s.nBytesArc;.   
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 61               nRa
4ee0: 77 41 72 63 20 3d 20 74 68 69 73 2e 5f 63 6f 6e  wArc = this._con
4ef0: 76 42 79 74 65 73 54 6f 49 6e 74 65 67 65 72 28  vBytesToInteger(
4f00: 74 68 69 73 2e 62 79 44 69 63 2e 73 6c 69 63 65  this.byDic.slice
4f10: 28 69 41 64 64 72 2c 20 69 45 6e 64 41 72 63 41  (iAddr, iEndArcA
4f20: 64 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ddr));.         
4f30: 20 20 20 20 20 20 20 6c 65 74 20 6e 41 72 63 20         let nArc 
4f40: 3d 20 6e 52 61 77 41 72 63 20 26 20 74 68 69 73  = nRawArc & this
4f50: 2e 5f 61 72 63 4d 61 73 6b 3b 0a 20 20 20 20 20  ._arcMask;.     
4f60: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6e             if (n
4f70: 41 72 63 20 3e 20 74 68 69 73 2e 6e 43 68 61 72  Arc > this.nChar
4f80: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
4f90: 20 20 20 20 20 20 20 20 2f 2f 20 54 68 69 73 20          // This 
4fa0: 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 61 20 63  value is not a c
4fb0: 68 61 72 2c 20 74 68 69 73 20 69 73 20 61 20 73  har, this is a s
4fc0: 74 65 6d 6d 69 6e 67 20 63 6f 64 65 20 0a 20 20  temming code .  
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 20 20 6c 2e 70 75 73 68 28 74 68 69 73 2e 66 75    l.push(this.fu
4ff0: 6e 63 53 74 65 6d 6d 69 6e 67 28 73 57 6f 72 64  ncStemming(sWord
5000: 2c 20 74 68 69 73 2e 6c 41 72 63 56 61 6c 5b 6e  , this.lArcVal[n
5010: 41 72 63 5d 29 29 3b 0a 20 20 20 20 20 20 20 20  Arc]));.        
5020: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5030: 20 20 20 20 20 20 20 20 20 20 69 41 64 64 72 20            iAddr 
5040: 3d 20 69 45 6e 64 41 72 63 41 64 64 72 20 2b 20  = iEndArcAddr + 
5050: 74 68 69 73 2e 6e 42 79 74 65 73 4e 6f 64 65 41  this.nBytesNodeA
5060: 64 64 72 65 73 73 3b 0a 20 20 20 20 20 20 20 20  ddress;.        
5070: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5080: 20 20 72 65 74 75 72 6e 20 6c 3b 0a 20 20 20 20    return l;.    
5090: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
50a0: 74 75 72 6e 20 5b 5d 3b 0a 20 20 20 20 7d 0a 0a  turn [];.    }..
50b0: 20 20 20 20 5f 6c 6f 6f 6b 75 70 41 72 63 4e 6f      _lookupArcNo
50c0: 64 65 31 20 28 6e 56 61 6c 2c 20 69 41 64 64 72  de1 (nVal, iAddr
50d0: 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 6c  ) {.        // l
50e0: 6f 6f 6b 73 20 69 66 20 6e 56 61 6c 20 69 73 20  ooks if nVal is 
50f0: 61 6e 20 61 72 63 20 61 74 20 74 68 65 20 6e 6f  an arc at the no
5100: 64 65 20 61 74 20 69 41 64 64 72 2c 20 69 66 20  de at iAddr, if 
5110: 79 65 73 2c 20 72 65 74 75 72 6e 73 20 61 64 64  yes, returns add
5120: 72 65 73 73 20 6f 66 20 6e 65 78 74 20 6e 6f 64  ress of next nod
5130: 65 20 65 6c 73 65 20 4e 6f 6e 65 0a 20 20 20 20  e else None.    
5140: 20 20 20 20 77 68 69 6c 65 20 28 74 72 75 65 29      while (true)
5150: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c   {.            l
5160: 65 74 20 69 45 6e 64 41 72 63 41 64 64 72 20 3d  et iEndArcAddr =
5170: 20 69 41 64 64 72 2b 74 68 69 73 2e 6e 42 79 74   iAddr+this.nByt
5180: 65 73 41 72 63 3b 0a 20 20 20 20 20 20 20 20 20  esArc;.         
5190: 20 20 20 6c 65 74 20 6e 52 61 77 41 72 63 20 3d     let nRawArc =
51a0: 20 74 68 69 73 2e 5f 63 6f 6e 76 42 79 74 65 73   this._convBytes
51b0: 54 6f 49 6e 74 65 67 65 72 28 74 68 69 73 2e 62  ToInteger(this.b
51c0: 79 44 69 63 2e 73 6c 69 63 65 28 69 41 64 64 72  yDic.slice(iAddr
51d0: 2c 20 69 45 6e 64 41 72 63 41 64 64 72 29 29 3b  , iEndArcAddr));
51e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
51f0: 28 6e 56 61 6c 20 3d 3d 20 28 6e 52 61 77 41 72  (nVal == (nRawAr
5200: 63 20 26 20 74 68 69 73 2e 5f 61 72 63 4d 61 73  c & this._arcMas
5210: 6b 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  k)) {.          
5220: 20 20 20 20 20 20 2f 2f 20 74 68 65 20 76 61 6c        // the val
5230: 75 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  ue we are lookin
5240: 67 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20 20  g for .         
5250: 20 20 20 20 20 20 20 2f 2f 20 77 65 20 72 65 74         // we ret
5260: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
5270: 6f 66 20 74 68 65 20 6e 65 78 74 20 6e 6f 64 65  of the next node
5280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5290: 20 72 65 74 75 72 6e 20 74 68 69 73 2e 5f 63 6f   return this._co
52a0: 6e 76 42 79 74 65 73 54 6f 49 6e 74 65 67 65 72  nvBytesToInteger
52b0: 28 74 68 69 73 2e 62 79 44 69 63 2e 73 6c 69 63  (this.byDic.slic
52c0: 65 28 69 45 6e 64 41 72 63 41 64 64 72 2c 20 69  e(iEndArcAddr, i
52d0: 45 6e 64 41 72 63 41 64 64 72 2b 74 68 69 73 2e  EndArcAddr+this.
52e0: 6e 42 79 74 65 73 4e 6f 64 65 41 64 64 72 65 73  nBytesNodeAddres
52f0: 73 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  s));.           
5300: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65   }.            e
5310: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
5320: 20 20 20 20 20 20 2f 2f 20 76 61 6c 75 65 20 6e        // value n
5330: 6f 74 20 66 6f 75 6e 64 0a 20 20 20 20 20 20 20  ot found.       
5340: 20 20 20 20 20 20 20 20 20 69 66 20 28 6e 52 61           if (nRa
5350: 77 41 72 63 20 26 20 74 68 69 73 2e 5f 6c 61 73  wArc & this._las
5360: 74 41 72 63 4d 61 73 6b 29 20 7b 0a 20 20 20 20  tArcMask) {.    
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5380: 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20  return null;.   
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
53b0: 41 64 64 72 20 3d 20 69 45 6e 64 41 72 63 41 64  Addr = iEndArcAd
53c0: 64 72 20 2b 20 74 68 69 73 2e 6e 42 79 74 65 73  dr + this.nBytes
53d0: 4e 6f 64 65 41 64 64 72 65 73 73 3b 0a 20 20 20  NodeAddress;.   
53e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
53f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
5400: 2a 20 5f 67 65 74 41 72 63 73 31 20 28 69 41 64  * _getArcs1 (iAd
5410: 64 72 29 20 7b 0a 20 20 20 20 20 20 20 20 22 67  dr) {.        "g
5420: 65 6e 65 72 61 74 6f 72 3a 20 72 65 74 75 72 6e  enerator: return
5430: 20 61 6c 6c 20 61 72 63 73 20 61 74 20 3c 69 41   all arcs at <iA
5440: 64 64 72 3e 20 61 73 20 74 75 70 6c 65 73 20 6f  ddr> as tuples o
5450: 66 20 28 6e 56 61 6c 2c 20 69 41 64 64 72 29 22  f (nVal, iAddr)"
5460: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28  .        while (
5470: 74 72 75 65 29 20 7b 0a 20 20 20 20 20 20 20 20  true) {.        
5480: 20 20 20 20 6c 65 74 20 69 45 6e 64 41 72 63 41      let iEndArcA
5490: 64 64 72 20 3d 20 69 41 64 64 72 2b 74 68 69 73  ddr = iAddr+this
54a0: 2e 6e 42 79 74 65 73 41 72 63 3b 0a 20 20 20 20  .nBytesArc;.    
54b0: 20 20 20 20 20 20 20 20 6c 65 74 20 6e 52 61 77          let nRaw
54c0: 41 72 63 20 3d 20 74 68 69 73 2e 5f 63 6f 6e 76  Arc = this._conv
54d0: 42 79 74 65 73 54 6f 49 6e 74 65 67 65 72 28 74  BytesToInteger(t
54e0: 68 69 73 2e 62 79 44 69 63 2e 73 6c 69 63 65 28  his.byDic.slice(
54f0: 69 41 64 64 72 2c 20 69 45 6e 64 41 72 63 41 64  iAddr, iEndArcAd
5500: 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dr));.          
5510: 20 20 79 69 65 6c 64 20 5b 6e 52 61 77 41 72 63    yield [nRawArc
5520: 20 26 20 74 68 69 73 2e 5f 61 72 63 4d 61 73 6b   & this._arcMask
5530: 2c 20 74 68 69 73 2e 5f 63 6f 6e 76 42 79 74 65  , this._convByte
5540: 73 54 6f 49 6e 74 65 67 65 72 28 74 68 69 73 2e  sToInteger(this.
5550: 62 79 44 69 63 2e 73 6c 69 63 65 28 69 45 6e 64  byDic.slice(iEnd
5560: 41 72 63 41 64 64 72 2c 20 69 45 6e 64 41 72 63  ArcAddr, iEndArc
5570: 41 64 64 72 2b 74 68 69 73 2e 6e 42 79 74 65 73  Addr+this.nBytes
5580: 4e 6f 64 65 41 64 64 72 65 73 73 29 29 5d 3b 0a  NodeAddress))];.
5590: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
55a0: 6e 52 61 77 41 72 63 20 26 20 74 68 69 73 2e 5f  nRawArc & this._
55b0: 6c 61 73 74 41 72 63 4d 61 73 6b 29 20 7b 0a 20  lastArcMask) {. 
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
55d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
55e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
55f0: 69 41 64 64 72 20 3d 20 69 45 6e 64 41 72 63 41  iAddr = iEndArcA
5600: 64 64 72 2b 74 68 69 73 2e 6e 42 79 74 65 73 4e  ddr+this.nBytesN
5610: 6f 64 65 41 64 64 72 65 73 73 3b 0a 20 20 20 20  odeAddress;.    
5620: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
5630: 20 2f 2f 20 56 45 52 53 49 4f 4e 20 32 0a 20 20   // VERSION 2.  
5640: 20 20 5f 6d 6f 72 70 68 32 20 28 73 57 6f 72 64    _morph2 (sWord
5650: 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 74  ) {.        // t
5660: 6f 20 64 6f 0a 20 20 20 20 7d 0a 0a 20 20 20 20  o do.    }..    
5670: 5f 73 74 65 6d 32 20 28 73 57 6f 72 64 29 20 7b  _stem2 (sWord) {
5680: 0a 20 20 20 20 20 20 20 20 2f 2f 20 74 6f 20 64  .        // to d
5690: 6f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 5f 6c 6f  o.    }..    _lo
56a0: 6f 6b 75 70 41 72 63 4e 6f 64 65 32 20 28 6e 56  okupArcNode2 (nV
56b0: 61 6c 2c 20 69 41 64 64 72 29 20 7b 0a 20 20 20  al, iAddr) {.   
56c0: 20 20 20 20 20 2f 2f 20 74 6f 20 64 6f 0a 20 20       // to do.  
56d0: 20 20 7d 0a 0a 0a 20 20 20 20 2f 2f 20 56 45 52    }...    // VER
56e0: 53 49 4f 4e 20 33 0a 20 20 20 20 5f 6d 6f 72 70  SION 3.    _morp
56f0: 68 33 20 28 73 57 6f 72 64 29 20 7b 0a 20 20 20  h3 (sWord) {.   
5700: 20 20 20 20 20 2f 2f 20 74 6f 20 64 6f 0a 20 20       // to do.  
5710: 20 20 7d 0a 0a 20 20 20 20 5f 73 74 65 6d 33 20    }..    _stem3 
5720: 28 73 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20  (sWord) {.      
5730: 20 20 2f 2f 20 74 6f 20 64 6f 0a 20 20 20 20 7d    // to do.    }
5740: 0a 0a 20 20 20 20 5f 6c 6f 6f 6b 75 70 41 72 63  ..    _lookupArc
5750: 4e 6f 64 65 33 20 28 6e 56 61 6c 2c 20 69 41 64  Node3 (nVal, iAd
5760: 64 72 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f  dr) {.        //
5770: 20 74 6f 20 64 6f 0a 20 20 20 20 7d 0a 7d 0a 0a   to do.    }.}..
5780: 0a 69 66 20 28 74 79 70 65 6f 66 28 65 78 70 6f  .if (typeof(expo
5790: 72 74 73 29 20 21 3d 3d 20 27 75 6e 64 65 66 69  rts) !== 'undefi
57a0: 6e 65 64 27 29 20 7b 0a 20 20 20 20 65 78 70 6f  ned') {.    expo
57b0: 72 74 73 2e 49 42 44 41 57 47 20 3d 20 49 42 44  rts.IBDAWG = IBD
57c0: 41 57 47 3b 0a 7d 0a                             AWG;.}.