@keymanapp/kmc-model 17.0.85-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/.nyc_output/coverage-10524-1681239236645-0.json +1 -0
  2. package/Makefile +38 -0
  3. package/build/cjs-src/lexical-model-compiler.cjs +152688 -0
  4. package/build/src/build-trie.d.ts +40 -0
  5. package/build/src/build-trie.d.ts.map +1 -0
  6. package/build/src/build-trie.js +362 -0
  7. package/build/src/build-trie.js.map +1 -0
  8. package/build/src/join-word-breaker-decorator.d.ts +10 -0
  9. package/build/src/join-word-breaker-decorator.d.ts.map +1 -0
  10. package/build/src/join-word-breaker-decorator.js +121 -0
  11. package/build/src/join-word-breaker-decorator.js.map +1 -0
  12. package/build/src/lexical-model-compiler.d.ts +19 -0
  13. package/build/src/lexical-model-compiler.d.ts.map +1 -0
  14. package/build/src/lexical-model-compiler.js +155 -0
  15. package/build/src/lexical-model-compiler.js.map +1 -0
  16. package/build/src/lexical-model.d.ts +135 -0
  17. package/build/src/lexical-model.d.ts.map +1 -0
  18. package/build/src/lexical-model.js +6 -0
  19. package/build/src/lexical-model.js.map +1 -0
  20. package/build/src/main.d.ts +15 -0
  21. package/build/src/main.d.ts.map +1 -0
  22. package/build/src/main.js +46 -0
  23. package/build/src/main.js.map +1 -0
  24. package/build/src/model-compiler-errors.d.ts +77 -0
  25. package/build/src/model-compiler-errors.d.ts.map +1 -0
  26. package/build/src/model-compiler-errors.js +156 -0
  27. package/build/src/model-compiler-errors.js.map +1 -0
  28. package/build/src/model-defaults.d.ts +56 -0
  29. package/build/src/model-defaults.d.ts.map +1 -0
  30. package/build/src/model-defaults.js +106 -0
  31. package/build/src/model-defaults.js.map +1 -0
  32. package/build/src/model-definitions.d.ts +71 -0
  33. package/build/src/model-definitions.d.ts.map +1 -0
  34. package/build/src/model-definitions.js +189 -0
  35. package/build/src/model-definitions.js.map +1 -0
  36. package/build/src/script-overrides-decorator.d.ts +4 -0
  37. package/build/src/script-overrides-decorator.d.ts.map +1 -0
  38. package/build/src/script-overrides-decorator.js +63 -0
  39. package/build/src/script-overrides-decorator.js.map +1 -0
  40. package/build/test/helpers/index.d.ts +69 -0
  41. package/build/test/helpers/index.d.ts.map +1 -0
  42. package/build/test/helpers/index.js +160 -0
  43. package/build/test/helpers/index.js.map +1 -0
  44. package/build/test/test-compile-model-with-pseudoclosure.d.ts +2 -0
  45. package/build/test/test-compile-model-with-pseudoclosure.d.ts.map +1 -0
  46. package/build/test/test-compile-model-with-pseudoclosure.js +200 -0
  47. package/build/test/test-compile-model-with-pseudoclosure.js.map +1 -0
  48. package/build/test/test-compile-model.d.ts +2 -0
  49. package/build/test/test-compile-model.d.ts.map +1 -0
  50. package/build/test/test-compile-model.js +30 -0
  51. package/build/test/test-compile-model.js.map +1 -0
  52. package/build/test/test-compile-trie.d.ts +2 -0
  53. package/build/test/test-compile-trie.d.ts.map +1 -0
  54. package/build/test/test-compile-trie.js +125 -0
  55. package/build/test/test-compile-trie.js.map +1 -0
  56. package/build/test/test-default-apply-case.d.ts +2 -0
  57. package/build/test/test-default-apply-case.d.ts.map +1 -0
  58. package/build/test/test-default-apply-case.js +105 -0
  59. package/build/test/test-default-apply-case.js.map +1 -0
  60. package/build/test/test-default-search-term-to-key.d.ts +2 -0
  61. package/build/test/test-default-search-term-to-key.d.ts.map +1 -0
  62. package/build/test/test-default-search-term-to-key.js +148 -0
  63. package/build/test/test-default-search-term-to-key.js.map +1 -0
  64. package/build/test/test-error-logger.d.ts +2 -0
  65. package/build/test/test-error-logger.d.ts.map +1 -0
  66. package/build/test/test-error-logger.js +26 -0
  67. package/build/test/test-error-logger.js.map +1 -0
  68. package/build/test/test-join-word-breaker.d.ts +2 -0
  69. package/build/test/test-join-word-breaker.d.ts.map +1 -0
  70. package/build/test/test-join-word-breaker.js +84 -0
  71. package/build/test/test-join-word-breaker.js.map +1 -0
  72. package/build/test/test-model-definitions.d.ts +2 -0
  73. package/build/test/test-model-definitions.d.ts.map +1 -0
  74. package/build/test/test-model-definitions.js +165 -0
  75. package/build/test/test-model-definitions.js.map +1 -0
  76. package/build/test/test-override-script-defaults.d.ts +2 -0
  77. package/build/test/test-override-script-defaults.d.ts.map +1 -0
  78. package/build/test/test-override-script-defaults.js +28 -0
  79. package/build/test/test-override-script-defaults.js.map +1 -0
  80. package/build/test/test-parse-wordlist.d.ts +2 -0
  81. package/build/test/test-parse-wordlist.d.ts.map +1 -0
  82. package/build/test/test-parse-wordlist.js +110 -0
  83. package/build/test/test-parse-wordlist.js.map +1 -0
  84. package/build/test/test-punctuation.d.ts +2 -0
  85. package/build/test/test-punctuation.d.ts.map +1 -0
  86. package/build/test/test-punctuation.js +31 -0
  87. package/build/test/test-punctuation.js.map +1 -0
  88. package/build/test/tsconfig.tsbuildinfo +1 -0
  89. package/build/test/wordbreakers/data.d.ts +35 -0
  90. package/build/test/wordbreakers/data.d.ts.map +1 -0
  91. package/build/test/wordbreakers/data.js +1778 -0
  92. package/build/test/wordbreakers/data.js.map +1 -0
  93. package/build/test/wordbreakers/default-wordbreaker-esm.d.ts +10 -0
  94. package/build/test/wordbreakers/default-wordbreaker-esm.d.ts.map +1 -0
  95. package/build/test/wordbreakers/default-wordbreaker-esm.js +354 -0
  96. package/build/test/wordbreakers/default-wordbreaker-esm.js.map +1 -0
  97. package/build/tsconfig.tsbuildinfo +1 -0
  98. package/build.sh +73 -0
  99. package/coverage/lcov-report/base.css +224 -0
  100. package/coverage/lcov-report/block-navigation.js +87 -0
  101. package/coverage/lcov-report/favicon.png +0 -0
  102. package/coverage/lcov-report/index.html +161 -0
  103. package/coverage/lcov-report/prettify.css +1 -0
  104. package/coverage/lcov-report/prettify.js +2 -0
  105. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  106. package/coverage/lcov-report/sorter.js +196 -0
  107. package/coverage/lcov-report/src/build-trie.ts.html +1618 -0
  108. package/coverage/lcov-report/src/index.html +221 -0
  109. package/coverage/lcov-report/src/join-word-breaker-decorator.ts.html +487 -0
  110. package/coverage/lcov-report/src/lexical-model-compiler.ts.html +622 -0
  111. package/coverage/lcov-report/src/main.ts.html +271 -0
  112. package/coverage/lcov-report/src/model-compiler-errors.ts.html +691 -0
  113. package/coverage/lcov-report/src/model-defaults.ts.html +415 -0
  114. package/coverage/lcov-report/src/model-definitions.ts.html +748 -0
  115. package/coverage/lcov-report/src/script-overrides-decorator.ts.html +310 -0
  116. package/coverage/lcov-report/test/helpers/index.html +116 -0
  117. package/coverage/lcov-report/test/helpers/index.ts.html +646 -0
  118. package/coverage/lcov-report/test/index.html +266 -0
  119. package/coverage/lcov-report/test/test-compile-model-with-pseudoclosure.ts.html +802 -0
  120. package/coverage/lcov-report/test/test-compile-model.ts.html +187 -0
  121. package/coverage/lcov-report/test/test-compile-trie.ts.html +541 -0
  122. package/coverage/lcov-report/test/test-default-apply-case.ts.html +466 -0
  123. package/coverage/lcov-report/test/test-default-search-term-to-key.ts.html +628 -0
  124. package/coverage/lcov-report/test/test-error-logger.ts.html +196 -0
  125. package/coverage/lcov-report/test/test-join-word-breaker.ts.html +376 -0
  126. package/coverage/lcov-report/test/test-model-definitions.ts.html +676 -0
  127. package/coverage/lcov-report/test/test-override-script-defaults.ts.html +184 -0
  128. package/coverage/lcov-report/test/test-parse-wordlist.ts.html +466 -0
  129. package/coverage/lcov-report/test/test-punctuation.ts.html +190 -0
  130. package/coverage/lcov-report/test/wordbreakers/data.ts.html +5413 -0
  131. package/coverage/lcov-report/test/wordbreakers/default-wordbreaker-esm.ts.html +1234 -0
  132. package/coverage/lcov-report/test/wordbreakers/index.html +131 -0
  133. package/coverage/lcov.info +5969 -0
  134. package/package.json +61 -0
  135. package/src/build-trie.ts +511 -0
  136. package/src/join-word-breaker-decorator.ts +134 -0
  137. package/src/lexical-model-compiler.ts +179 -0
  138. package/src/lexical-model.ts +150 -0
  139. package/src/main.ts +62 -0
  140. package/src/model-compiler-errors.ts +203 -0
  141. package/src/model-defaults.ts +111 -0
  142. package/src/model-definitions.ts +222 -0
  143. package/src/script-overrides-decorator.ts +75 -0
  144. package/test/README.md +15 -0
  145. package/test/fixtures/example.qaa.joinwordbreaker/example.qaa.joinwordbreaker.model.ts +10 -0
  146. package/test/fixtures/example.qaa.joinwordbreaker/wordlist.tsv +3 -0
  147. package/test/fixtures/example.qaa.scriptusesspaces/example.qaa.scriptusesspaces.model.ts +10 -0
  148. package/test/fixtures/example.qaa.scriptusesspaces/wordlist.tsv +8 -0
  149. package/test/fixtures/example.qaa.sencoten/example.qaa.sencoten.model.kmp.json +45 -0
  150. package/test/fixtures/example.qaa.sencoten/example.qaa.sencoten.model.kps +35 -0
  151. package/test/fixtures/example.qaa.sencoten/example.qaa.sencoten.model.ts +6 -0
  152. package/test/fixtures/example.qaa.sencoten/wordlist.tsv +10 -0
  153. package/test/fixtures/example.qaa.smp/example.qaa.smp.model.ts +6 -0
  154. package/test/fixtures/example.qaa.smp/wordlist.tsv +5 -0
  155. package/test/fixtures/example.qaa.trivial/example.qaa.trivial.model.ts +5 -0
  156. package/test/fixtures/example.qaa.trivial/wordlist.tsv +3 -0
  157. package/test/fixtures/example.qaa.utf16be/example.qaa.utf16be.model.ts +5 -0
  158. package/test/fixtures/example.qaa.utf16be/wordlist.txt +0 -0
  159. package/test/fixtures/example.qaa.utf16le/example.qaa.utf16le.model.ts +5 -0
  160. package/test/fixtures/example.qaa.utf16le/wordlist.txt +0 -0
  161. package/test/fixtures/example.qaa.wordbreaker/example.qaa.wordbreaker.model.ts +9 -0
  162. package/test/fixtures/example.qaa.wordbreaker/wordlist.tsv +3 -0
  163. package/test/helpers/index.ts +187 -0
  164. package/test/test-compile-model-with-pseudoclosure.ts +239 -0
  165. package/test/test-compile-model.ts +34 -0
  166. package/test/test-compile-trie.ts +152 -0
  167. package/test/test-default-apply-case.ts +128 -0
  168. package/test/test-default-search-term-to-key.ts +181 -0
  169. package/test/test-error-logger.ts +38 -0
  170. package/test/test-join-word-breaker.ts +97 -0
  171. package/test/test-model-definitions.ts +198 -0
  172. package/test/test-override-script-defaults.ts +33 -0
  173. package/test/test-parse-wordlist.ts +127 -0
  174. package/test/test-punctuation.ts +35 -0
  175. package/test/tsconfig.json +22 -0
  176. package/test/wordbreakers/README.md +3 -0
  177. package/test/wordbreakers/data.ts +1776 -0
  178. package/test/wordbreakers/default-wordbreaker-esm.ts +383 -0
  179. package/tools/create-override-script-regexp.ts +145 -0
  180. package/tsconfig.json +17 -0
@@ -0,0 +1,1234 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for test/wordbreakers/default-wordbreaker-esm.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">test/wordbreakers</a> default-wordbreaker-esm.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">90.33% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>346/383</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">69.16% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>83/120</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>14/14</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">90.33% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>346/383</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input oninput="onInput()" type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
450
+ <span class="cline-any cline-yes">1x</span>
451
+ <span class="cline-any cline-yes">1x</span>
452
+ <span class="cline-any cline-yes">1x</span>
453
+ <span class="cline-any cline-yes">1x</span>
454
+ <span class="cline-any cline-yes">1x</span>
455
+ <span class="cline-any cline-yes">1x</span>
456
+ <span class="cline-any cline-yes">1x</span>
457
+ <span class="cline-any cline-yes">1x</span>
458
+ <span class="cline-any cline-yes">1x</span>
459
+ <span class="cline-any cline-yes">1x</span>
460
+ <span class="cline-any cline-yes">1x</span>
461
+ <span class="cline-any cline-yes">1x</span>
462
+ <span class="cline-any cline-yes">26x</span>
463
+ <span class="cline-any cline-yes">26x</span>
464
+ <span class="cline-any cline-no">&nbsp;</span>
465
+ <span class="cline-any cline-no">&nbsp;</span>
466
+ <span class="cline-any cline-yes">26x</span>
467
+ <span class="cline-any cline-yes">26x</span>
468
+ <span class="cline-any cline-yes">26x</span>
469
+ <span class="cline-any cline-yes">26x</span>
470
+ <span class="cline-any cline-yes">26x</span>
471
+ <span class="cline-any cline-yes">204x</span>
472
+ <span class="cline-any cline-yes">204x</span>
473
+ <span class="cline-any cline-yes">204x</span>
474
+ <span class="cline-any cline-yes">204x</span>
475
+ <span class="cline-any cline-yes">204x</span>
476
+ <span class="cline-any cline-yes">166x</span>
477
+ <span class="cline-any cline-yes">166x</span>
478
+ <span class="cline-any cline-yes">204x</span>
479
+ <span class="cline-any cline-no">&nbsp;</span>
480
+ <span class="cline-any cline-no">&nbsp;</span>
481
+ <span class="cline-any cline-no">&nbsp;</span>
482
+ <span class="cline-any cline-no">&nbsp;</span>
483
+ <span class="cline-any cline-yes">204x</span>
484
+ <span class="cline-any cline-yes">26x</span>
485
+ <span class="cline-any cline-yes">26x</span>
486
+ <span class="cline-any cline-yes">1x</span>
487
+ <span class="cline-any cline-yes">1x</span>
488
+ <span class="cline-any cline-yes">1x</span>
489
+ <span class="cline-any cline-yes">1x</span>
490
+ <span class="cline-any cline-yes">1x</span>
491
+ <span class="cline-any cline-yes">1x</span>
492
+ <span class="cline-any cline-yes">1x</span>
493
+ <span class="cline-any cline-yes">1x</span>
494
+ <span class="cline-any cline-yes">1x</span>
495
+ <span class="cline-any cline-yes">1x</span>
496
+ <span class="cline-any cline-yes">1x</span>
497
+ <span class="cline-any cline-yes">1x</span>
498
+ <span class="cline-any cline-yes">1x</span>
499
+ <span class="cline-any cline-yes">204x</span>
500
+ <span class="cline-any cline-yes">1x</span>
501
+ <span class="cline-any cline-yes">1x</span>
502
+ <span class="cline-any cline-yes">204x</span>
503
+ <span class="cline-any cline-yes">204x</span>
504
+ <span class="cline-any cline-yes">204x</span>
505
+ <span class="cline-any cline-yes">204x</span>
506
+ <span class="cline-any cline-yes">1x</span>
507
+ <span class="cline-any cline-yes">1x</span>
508
+ <span class="cline-any cline-yes">426x</span>
509
+ <span class="cline-any cline-yes">426x</span>
510
+ <span class="cline-any cline-yes">1x</span>
511
+ <span class="cline-any cline-yes">1x</span>
512
+ <span class="cline-any cline-yes">68x</span>
513
+ <span class="cline-any cline-yes">68x</span>
514
+ <span class="cline-any cline-yes">1x</span>
515
+ <span class="cline-any cline-yes">1x</span>
516
+ <span class="cline-any cline-yes">1x</span>
517
+ <span class="cline-any cline-yes">1x</span>
518
+ <span class="cline-any cline-yes">1x</span>
519
+ <span class="cline-any cline-yes">1x</span>
520
+ <span class="cline-any cline-yes">1x</span>
521
+ <span class="cline-any cline-yes">1x</span>
522
+ <span class="cline-any cline-yes">204x</span>
523
+ <span class="cline-any cline-yes">204x</span>
524
+ <span class="cline-any cline-yes">204x</span>
525
+ <span class="cline-any cline-yes">204x</span>
526
+ <span class="cline-any cline-yes">204x</span>
527
+ <span class="cline-any cline-yes">204x</span>
528
+ <span class="cline-any cline-yes">204x</span>
529
+ <span class="cline-any cline-yes">1x</span>
530
+ <span class="cline-any cline-yes">1x</span>
531
+ <span class="cline-any cline-yes">1x</span>
532
+ <span class="cline-any cline-yes">1x</span>
533
+ <span class="cline-any cline-yes">1x</span>
534
+ <span class="cline-any cline-yes">1x</span>
535
+ <span class="cline-any cline-yes">1x</span>
536
+ <span class="cline-any cline-yes">1x</span>
537
+ <span class="cline-any cline-yes">1x</span>
538
+ <span class="cline-any cline-yes">26x</span>
539
+ <span class="cline-any cline-yes">26x</span>
540
+ <span class="cline-any cline-no">&nbsp;</span>
541
+ <span class="cline-any cline-no">&nbsp;</span>
542
+ <span class="cline-any cline-no">&nbsp;</span>
543
+ <span class="cline-any cline-yes">26x</span>
544
+ <span class="cline-any cline-yes">26x</span>
545
+ <span class="cline-any cline-yes">26x</span>
546
+ <span class="cline-any cline-yes">26x</span>
547
+ <span class="cline-any cline-yes">26x</span>
548
+ <span class="cline-any cline-yes">26x</span>
549
+ <span class="cline-any cline-yes">26x</span>
550
+ <span class="cline-any cline-yes">26x</span>
551
+ <span class="cline-any cline-yes">26x</span>
552
+ <span class="cline-any cline-yes">26x</span>
553
+ <span class="cline-any cline-yes">26x</span>
554
+ <span class="cline-any cline-yes">26x</span>
555
+ <span class="cline-any cline-yes">26x</span>
556
+ <span class="cline-any cline-yes">26x</span>
557
+ <span class="cline-any cline-yes">26x</span>
558
+ <span class="cline-any cline-yes">26x</span>
559
+ <span class="cline-any cline-yes">26x</span>
560
+ <span class="cline-any cline-yes">26x</span>
561
+ <span class="cline-any cline-yes">26x</span>
562
+ <span class="cline-any cline-yes">26x</span>
563
+ <span class="cline-any cline-yes">26x</span>
564
+ <span class="cline-any cline-yes">26x</span>
565
+ <span class="cline-any cline-yes">26x</span>
566
+ <span class="cline-any cline-yes">26x</span>
567
+ <span class="cline-any cline-yes">26x</span>
568
+ <span class="cline-any cline-yes">26x</span>
569
+ <span class="cline-any cline-yes">26x</span>
570
+ <span class="cline-any cline-yes">26x</span>
571
+ <span class="cline-any cline-yes">26x</span>
572
+ <span class="cline-any cline-yes">26x</span>
573
+ <span class="cline-any cline-yes">26x</span>
574
+ <span class="cline-any cline-yes">26x</span>
575
+ <span class="cline-any cline-yes">470x</span>
576
+ <span class="cline-any cline-yes">470x</span>
577
+ <span class="cline-any cline-yes">470x</span>
578
+ <span class="cline-any cline-yes">470x</span>
579
+ <span class="cline-any cline-yes">470x</span>
580
+ <span class="cline-any cline-yes">470x</span>
581
+ <span class="cline-any cline-yes">470x</span>
582
+ <span class="cline-any cline-yes">470x</span>
583
+ <span class="cline-any cline-yes">470x</span>
584
+ <span class="cline-any cline-yes">470x</span>
585
+ <span class="cline-any cline-yes">26x</span>
586
+ <span class="cline-any cline-yes">26x</span>
587
+ <span class="cline-any cline-yes">26x</span>
588
+ <span class="cline-any cline-yes">444x</span>
589
+ <span class="cline-any cline-yes">470x</span>
590
+ <span class="cline-any cline-yes">26x</span>
591
+ <span class="cline-any cline-yes">26x</span>
592
+ <span class="cline-any cline-yes">26x</span>
593
+ <span class="cline-any cline-yes">418x</span>
594
+ <span class="cline-any cline-yes">470x</span>
595
+ <span class="cline-any cline-yes">470x</span>
596
+ <span class="cline-any cline-yes">418x</span>
597
+ <span class="cline-any cline-yes">418x</span>
598
+ <span class="cline-any cline-yes">470x</span>
599
+ <span class="cline-any cline-yes">470x</span>
600
+ <span class="cline-any cline-no">&nbsp;</span>
601
+ <span class="cline-any cline-no">&nbsp;</span>
602
+ <span class="cline-any cline-no">&nbsp;</span>
603
+ <span class="cline-any cline-yes">418x</span>
604
+ <span class="cline-any cline-yes">418x</span>
605
+ <span class="cline-any cline-yes">470x</span>
606
+ <span class="cline-any cline-yes">470x</span>
607
+ <span class="cline-any cline-no">&nbsp;</span>
608
+ <span class="cline-any cline-no">&nbsp;</span>
609
+ <span class="cline-any cline-no">&nbsp;</span>
610
+ <span class="cline-any cline-yes">418x</span>
611
+ <span class="cline-any cline-yes">418x</span>
612
+ <span class="cline-any cline-yes">418x</span>
613
+ <span class="cline-any cline-yes">418x</span>
614
+ <span class="cline-any cline-yes">418x</span>
615
+ <span class="cline-any cline-yes">418x</span>
616
+ <span class="cline-any cline-yes">418x</span>
617
+ <span class="cline-any cline-yes">418x</span>
618
+ <span class="cline-any cline-yes">470x</span>
619
+ <span class="cline-any cline-yes">470x</span>
620
+ <span class="cline-any cline-yes">418x</span>
621
+ <span class="cline-any cline-yes">418x</span>
622
+ <span class="cline-any cline-yes">418x</span>
623
+ <span class="cline-any cline-yes">418x</span>
624
+ <span class="cline-any cline-yes">418x</span>
625
+ <span class="cline-any cline-yes">418x</span>
626
+ <span class="cline-any cline-yes">418x</span>
627
+ <span class="cline-any cline-yes">470x</span>
628
+ <span class="cline-any cline-yes">470x</span>
629
+ <span class="cline-any cline-no">&nbsp;</span>
630
+ <span class="cline-any cline-no">&nbsp;</span>
631
+ <span class="cline-any cline-no">&nbsp;</span>
632
+ <span class="cline-any cline-no">&nbsp;</span>
633
+ <span class="cline-any cline-no">&nbsp;</span>
634
+ <span class="cline-any cline-no">&nbsp;</span>
635
+ <span class="cline-any cline-yes">418x</span>
636
+ <span class="cline-any cline-yes">418x</span>
637
+ <span class="cline-any cline-yes">418x</span>
638
+ <span class="cline-any cline-yes">470x</span>
639
+ <span class="cline-any cline-no">&nbsp;</span>
640
+ <span class="cline-any cline-no">&nbsp;</span>
641
+ <span class="cline-any cline-no">&nbsp;</span>
642
+ <span class="cline-any cline-yes">418x</span>
643
+ <span class="cline-any cline-yes">418x</span>
644
+ <span class="cline-any cline-yes">418x</span>
645
+ <span class="cline-any cline-yes">470x</span>
646
+ <span class="cline-any cline-yes">470x</span>
647
+ <span class="cline-any cline-yes">8x</span>
648
+ <span class="cline-any cline-yes">8x</span>
649
+ <span class="cline-any cline-yes">8x</span>
650
+ <span class="cline-any cline-yes">8x</span>
651
+ <span class="cline-any cline-yes">8x</span>
652
+ <span class="cline-any cline-yes">8x</span>
653
+ <span class="cline-any cline-yes">418x</span>
654
+ <span class="cline-any cline-yes">418x</span>
655
+ <span class="cline-any cline-yes">470x</span>
656
+ <span class="cline-any cline-yes">470x</span>
657
+ <span class="cline-any cline-yes">186x</span>
658
+ <span class="cline-any cline-yes">186x</span>
659
+ <span class="cline-any cline-yes">470x</span>
660
+ <span class="cline-any cline-yes">470x</span>
661
+ <span class="cline-any cline-yes">470x</span>
662
+ <span class="cline-any cline-yes">182x</span>
663
+ <span class="cline-any cline-yes">470x</span>
664
+ <span class="cline-any cline-yes">470x</span>
665
+ <span class="cline-any cline-yes">470x</span>
666
+ <span class="cline-any cline-yes">178x</span>
667
+ <span class="cline-any cline-yes">470x</span>
668
+ <span class="cline-any cline-yes">470x</span>
669
+ <span class="cline-any cline-yes">178x</span>
670
+ <span class="cline-any cline-yes">470x</span>
671
+ <span class="cline-any cline-yes">470x</span>
672
+ <span class="cline-any cline-yes">470x</span>
673
+ <span class="cline-any cline-yes">178x</span>
674
+ <span class="cline-any cline-yes">470x</span>
675
+ <span class="cline-any cline-yes">470x</span>
676
+ <span class="cline-any cline-yes">470x</span>
677
+ <span class="cline-any cline-yes">178x</span>
678
+ <span class="cline-any cline-yes">178x</span>
679
+ <span class="cline-any cline-yes">178x</span>
680
+ <span class="cline-any cline-yes">470x</span>
681
+ <span class="cline-any cline-yes">470x</span>
682
+ <span class="cline-any cline-yes">178x</span>
683
+ <span class="cline-any cline-yes">470x</span>
684
+ <span class="cline-any cline-yes">470x</span>
685
+ <span class="cline-any cline-yes">178x</span>
686
+ <span class="cline-any cline-yes">470x</span>
687
+ <span class="cline-any cline-yes">470x</span>
688
+ <span class="cline-any cline-yes">178x</span>
689
+ <span class="cline-any cline-yes">178x</span>
690
+ <span class="cline-any cline-yes">470x</span>
691
+ <span class="cline-any cline-yes">470x</span>
692
+ <span class="cline-any cline-yes">470x</span>
693
+ <span class="cline-any cline-yes">178x</span>
694
+ <span class="cline-any cline-yes">470x</span>
695
+ <span class="cline-any cline-yes">470x</span>
696
+ <span class="cline-any cline-yes">470x</span>
697
+ <span class="cline-any cline-yes">178x</span>
698
+ <span class="cline-any cline-yes">470x</span>
699
+ <span class="cline-any cline-yes">470x</span>
700
+ <span class="cline-any cline-yes">178x</span>
701
+ <span class="cline-any cline-yes">178x</span>
702
+ <span class="cline-any cline-yes">178x</span>
703
+ <span class="cline-any cline-yes">470x</span>
704
+ <span class="cline-any cline-yes">470x</span>
705
+ <span class="cline-any cline-yes">470x</span>
706
+ <span class="cline-any cline-yes">470x</span>
707
+ <span class="cline-any cline-yes">470x</span>
708
+ <span class="cline-any cline-yes">178x</span>
709
+ <span class="cline-any cline-yes">178x</span>
710
+ <span class="cline-any cline-yes">470x</span>
711
+ <span class="cline-any cline-yes">470x</span>
712
+ <span class="cline-any cline-yes">470x</span>
713
+ <span class="cline-any cline-yes">178x</span>
714
+ <span class="cline-any cline-yes">178x</span>
715
+ <span class="cline-any cline-yes">178x</span>
716
+ <span class="cline-any cline-yes">178x</span>
717
+ <span class="cline-any cline-yes">178x</span>
718
+ <span class="cline-any cline-yes">470x</span>
719
+ <span class="cline-any cline-no">&nbsp;</span>
720
+ <span class="cline-any cline-no">&nbsp;</span>
721
+ <span class="cline-any cline-no">&nbsp;</span>
722
+ <span class="cline-any cline-no">&nbsp;</span>
723
+ <span class="cline-any cline-no">&nbsp;</span>
724
+ <span class="cline-any cline-no">&nbsp;</span>
725
+ <span class="cline-any cline-no">&nbsp;</span>
726
+ <span class="cline-any cline-no">&nbsp;</span>
727
+ <span class="cline-any cline-no">&nbsp;</span>
728
+ <span class="cline-any cline-no">&nbsp;</span>
729
+ <span class="cline-any cline-yes">470x</span>
730
+ <span class="cline-any cline-yes">178x</span>
731
+ <span class="cline-any cline-yes">178x</span>
732
+ <span class="cline-any cline-yes">178x</span>
733
+ <span class="cline-any cline-yes">178x</span>
734
+ <span class="cline-any cline-yes">26x</span>
735
+ <span class="cline-any cline-yes">26x</span>
736
+ <span class="cline-any cline-yes">26x</span>
737
+ <span class="cline-any cline-yes">26x</span>
738
+ <span class="cline-any cline-yes">26x</span>
739
+ <span class="cline-any cline-yes">26x</span>
740
+ <span class="cline-any cline-yes">26x</span>
741
+ <span class="cline-any cline-yes">26x</span>
742
+ <span class="cline-any cline-yes">26x</span>
743
+ <span class="cline-any cline-yes">26x</span>
744
+ <span class="cline-any cline-yes">26x</span>
745
+ <span class="cline-any cline-yes">26x</span>
746
+ <span class="cline-any cline-yes">26x</span>
747
+ <span class="cline-any cline-yes">26x</span>
748
+ <span class="cline-any cline-yes">478x</span>
749
+ <span class="cline-any cline-yes">26x</span>
750
+ <span class="cline-any cline-yes">478x</span>
751
+ <span class="cline-any cline-yes">2x</span>
752
+ <span class="cline-any cline-yes">2x</span>
753
+ <span class="cline-any cline-yes">450x</span>
754
+ <span class="cline-any cline-yes">450x</span>
755
+ <span class="cline-any cline-yes">26x</span>
756
+ <span class="cline-any cline-yes">26x</span>
757
+ <span class="cline-any cline-yes">26x</span>
758
+ <span class="cline-any cline-yes">26x</span>
759
+ <span class="cline-any cline-yes">26x</span>
760
+ <span class="cline-any cline-yes">26x</span>
761
+ <span class="cline-any cline-yes">504x</span>
762
+ <span class="cline-any cline-no">&nbsp;</span>
763
+ <span class="cline-any cline-yes">504x</span>
764
+ <span class="cline-any cline-yes">52x</span>
765
+ <span class="cline-any cline-yes">504x</span>
766
+ <span class="cline-any cline-yes">2x</span>
767
+ <span class="cline-any cline-yes">2x</span>
768
+ <span class="cline-any cline-yes">2x</span>
769
+ <span class="cline-any cline-yes">450x</span>
770
+ <span class="cline-any cline-yes">450x</span>
771
+ <span class="cline-any cline-yes">26x</span>
772
+ <span class="cline-any cline-yes">26x</span>
773
+ <span class="cline-any cline-yes">26x</span>
774
+ <span class="cline-any cline-yes">26x</span>
775
+ <span class="cline-any cline-yes">1750x</span>
776
+ <span class="cline-any cline-yes">1750x</span>
777
+ <span class="cline-any cline-yes">1750x</span>
778
+ <span class="cline-any cline-yes">26x</span>
779
+ <span class="cline-any cline-yes">26x</span>
780
+ <span class="cline-any cline-yes">68x</span>
781
+ <span class="cline-any cline-yes">68x</span>
782
+ <span class="cline-any cline-yes">68x</span>
783
+ <span class="cline-any cline-yes">26x</span>
784
+ <span class="cline-any cline-yes">1x</span>
785
+ <span class="cline-any cline-yes">1x</span>
786
+ <span class="cline-any cline-yes">904x</span>
787
+ <span class="cline-any cline-yes">904x</span>
788
+ <span class="cline-any cline-yes">904x</span>
789
+ <span class="cline-any cline-yes">1x</span>
790
+ <span class="cline-any cline-yes">1x</span>
791
+ <span class="cline-any cline-yes">1x</span>
792
+ <span class="cline-any cline-yes">1x</span>
793
+ <span class="cline-any cline-yes">1x</span>
794
+ <span class="cline-any cline-yes">1x</span>
795
+ <span class="cline-any cline-yes">1x</span>
796
+ <span class="cline-any cline-yes">904x</span>
797
+ <span class="cline-any cline-yes">904x</span>
798
+ <span class="cline-any cline-yes">904x</span>
799
+ <span class="cline-any cline-yes">904x</span>
800
+ <span class="cline-any cline-yes">904x</span>
801
+ <span class="cline-any cline-yes">1x</span>
802
+ <span class="cline-any cline-yes">1x</span>
803
+ <span class="cline-any cline-yes">1x</span>
804
+ <span class="cline-any cline-yes">1x</span>
805
+ <span class="cline-any cline-yes">1x</span>
806
+ <span class="cline-any cline-yes">1x</span>
807
+ <span class="cline-any cline-yes">1x</span>
808
+ <span class="cline-any cline-yes">1x</span>
809
+ <span class="cline-any cline-yes">1x</span>
810
+ <span class="cline-any cline-yes">1x</span>
811
+ <span class="cline-any cline-yes">1x</span>
812
+ <span class="cline-any cline-yes">9292x</span>
813
+ <span class="cline-any cline-yes">9292x</span>
814
+ <span class="cline-any cline-no">&nbsp;</span>
815
+ <span class="cline-any cline-no">&nbsp;</span>
816
+ <span class="cline-any cline-yes">9292x</span>
817
+ <span class="cline-any cline-yes">9292x</span>
818
+ <span class="cline-any cline-yes">9292x</span>
819
+ <span class="cline-any cline-yes">9292x</span>
820
+ <span class="cline-any cline-yes">9292x</span>
821
+ <span class="cline-any cline-yes">9292x</span>
822
+ <span class="cline-any cline-yes">9292x</span>
823
+ <span class="cline-any cline-yes">9292x</span>
824
+ <span class="cline-any cline-yes">5944x</span>
825
+ <span class="cline-any cline-yes">9292x</span>
826
+ <span class="cline-any cline-yes">2444x</span>
827
+ <span class="cline-any cline-yes">2444x</span>
828
+ <span class="cline-any cline-yes">904x</span>
829
+ <span class="cline-any cline-yes">904x</span>
830
+ <span class="cline-any cline-yes">904x</span>
831
+ <span class="cline-any cline-yes">904x</span>
832
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// TEMP: esm version of /common/models/wordbreakers/default/index.ts
833
+ &nbsp;
834
+ import { I, WORD_BREAK_PROPERTY, WordBreakProperty } from './data.js';
835
+ &nbsp;
836
+ &nbsp;
837
+ /**
838
+ * Word breaker based on Unicode Standard Annex #29, Section 4.1:
839
+ * Default Word Boundary Specification.
840
+ *
841
+ * @see http://unicode.org/reports/tr29/#Word_Boundaries
842
+ * @see https://github.com/eddieantonio/unicode-default-word-boundary/tree/v12.0.0
843
+ */
844
+ export default function default_(text: string): Span[] {
845
+ let boundaries = findBoundaries(text);
846
+ if (boundaries.length == 0) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
847
+ <span class="cstat-no" title="statement not covered" > return [];</span>
848
+ <span class="cstat-no" title="statement not covered" > }</span>
849
+ &nbsp;
850
+ // All non-empty strings have at least TWO boundaries: at the start and at the end of
851
+ // the string.
852
+ let spans = [];
853
+ for (let i = 0; i &lt; boundaries.length - 1; i++) {
854
+ let start = boundaries[i];
855
+ let end = boundaries[i + 1];
856
+ let span = new LazySpan(text, start, end);
857
+ &nbsp;
858
+ if (isNonSpace(span.text)) {
859
+ spans.push(span);
860
+ // Preserve a sequence-final space if it exists. Needed to signal "end of word".
861
+ } else if (i == boundaries.length - 2) <span class="branch-0 cbranch-no" title="branch not covered" >{ // if "we just checked the final boundary"...</span>
862
+ <span class="cstat-no" title="statement not covered" > // We don't want to return the whitespace itself; the correct token is simply ''.</span>
863
+ <span class="cstat-no" title="statement not covered" > span = new LazySpan(text, end, end);</span>
864
+ <span class="cstat-no" title="statement not covered" > spans.push(span);</span>
865
+ <span class="cstat-no" title="statement not covered" > }</span>
866
+ }
867
+ return spans;
868
+ }
869
+ &nbsp;
870
+ // Utilities //
871
+ // type WordBreakProperty = data.WordBreakProperty;
872
+ // const WordBreakProperty = data.WordBreakProperty;
873
+ // type I = data.I;
874
+ // const I = data.I;
875
+ // const WORD_BREAK_PROPERTY = data.WORD_BREAK_PROPERTY;
876
+ &nbsp;
877
+ /**
878
+ * A span that does not cut out the substring until it absolutely has to!
879
+ */
880
+ class LazySpan implements Span {
881
+ private _source: string;
882
+ readonly start: number;
883
+ readonly end: number;
884
+ constructor(source: string, start: number, end: number) {
885
+ this._source = source;
886
+ this.start = start;
887
+ this.end = end;
888
+ }
889
+ &nbsp;
890
+ get text(): string {
891
+ return this._source.substring(this.start, this.end);
892
+ }
893
+ &nbsp;
894
+ get length(): number {
895
+ return this.end - this.start;
896
+ }
897
+ }
898
+ &nbsp;
899
+ /**
900
+ * Returns true when the chunk does not solely consist of whitespace.
901
+ *
902
+ * @param chunk a chunk of text. Starts and ends at word boundaries.
903
+ */
904
+ function isNonSpace(chunk: string): boolean {
905
+ return !Array.from(chunk).map(property).every(wb =&gt; (
906
+ wb === WordBreakProperty.CR ||
907
+ wb === WordBreakProperty.LF ||
908
+ wb === WordBreakProperty.Newline ||
909
+ wb === WordBreakProperty.WSegSpace
910
+ ));
911
+ }
912
+ &nbsp;
913
+ /**
914
+ * Yields a series of string indices where a word break should
915
+ * occur. That is, there should be a break BEFORE each string
916
+ * index yielded by this generator.
917
+ *
918
+ * @param text Text to find word boundaries in.
919
+ */
920
+ function findBoundaries(text: string): number[] {
921
+ // WB1 and WB2: no boundaries if given an empty string.
922
+ if (text.length === 0) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
923
+ <span class="cstat-no" title="statement not covered" > // There are no boundaries in an empty string!</span>
924
+ <span class="cstat-no" title="statement not covered" > return [];</span>
925
+ <span class="cstat-no" title="statement not covered" > }</span>
926
+ &nbsp;
927
+ // This algorithm works by maintaining a sliding window of four SCALAR VALUES.
928
+ //
929
+ // - Scalar values? JavaScript strings are NOT actually a string of
930
+ // Unicode code points; some characters are made up of TWO
931
+ // JavaScript indices. e.g.,
932
+ // "💩".length === 2;
933
+ // "💩"[0] === '\uD83D';
934
+ // "💩"[1] === '\uDCA9';
935
+ //
936
+ // These characters that are represented by TWO indices are
937
+ // called "surrogate pairs". Since we don't want to be in the
938
+ // "middle" of a character, make sure we're always advancing
939
+ // by scalar values, and NOT indices. That means, we sometimes
940
+ // need to advance by TWO indices, not just one.
941
+ // - Four values? Some rules look at what's to the left of
942
+ // left, and some look at what's to the right of right. So
943
+ // keep track of this!
944
+ &nbsp;
945
+ let boundaries = [];
946
+ &nbsp;
947
+ let rightPos: number;
948
+ let lookaheadPos = 0; // lookahead, one scalar value to the right of right.
949
+ // Before the start of the string is also the start of the string.
950
+ let lookbehind: WordBreakProperty;
951
+ let left = WordBreakProperty.sot;
952
+ let right = WordBreakProperty.sot;
953
+ let lookahead = wordbreakPropertyAt(0);
954
+ // Count RIs to make sure we're not splitting emoji flags:
955
+ let nConsecutiveRegionalIndicators = 0;
956
+ &nbsp;
957
+ do {
958
+ // Shift all positions, one scalar value to the right.
959
+ rightPos = lookaheadPos;
960
+ lookaheadPos = positionAfter(lookaheadPos);
961
+ // Shift all properties, one scalar value to the right.
962
+ [lookbehind, left, right, lookahead] =
963
+ [left, right, lookahead, wordbreakPropertyAt(lookaheadPos)];
964
+ &nbsp;
965
+ // Break at the start and end of text, unless the text is empty.
966
+ // WB1: Break at start of text...
967
+ if (left === WordBreakProperty.sot) {
968
+ boundaries.push(rightPos);
969
+ continue;
970
+ }
971
+ // WB2: Break at the end of text...
972
+ if (right === WordBreakProperty.eot) {
973
+ boundaries.push(rightPos);
974
+ break; // Reached the end of the string. We're done!
975
+ }
976
+ // WB3: Do not break within CRLF:
977
+ if (left === WordBreakProperty.CR<span class="branch-0 cbranch-no" title="branch not covered" > &amp;&amp; right === WordBreakProperty.LF)</span>
978
+ <span class="branch-0 cbranch-no" title="branch not covered" > continue;</span>
979
+ // WB3b: Otherwise, break after...
980
+ if (left === WordBreakProperty.Newline ||
981
+ left === WordBreakProperty.CR ||
982
+ left === WordBreakProperty.LF) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
983
+ <span class="cstat-no" title="statement not covered" > boundaries.push(rightPos);</span>
984
+ <span class="cstat-no" title="statement not covered" > continue;</span>
985
+ <span class="cstat-no" title="statement not covered" > }</span>
986
+ // WB3a: ...and before newlines
987
+ if (right === WordBreakProperty.Newline ||
988
+ right === WordBreakProperty.CR ||
989
+ right === WordBreakProperty.LF) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
990
+ <span class="cstat-no" title="statement not covered" > boundaries.push(rightPos);</span>
991
+ <span class="cstat-no" title="statement not covered" > continue;</span>
992
+ <span class="cstat-no" title="statement not covered" > }</span>
993
+ &nbsp;
994
+ // TODO: WB3c is not implemented, due to its complex, error-prone
995
+ // implementation, requiring a ginormous regexp, and the fact that
996
+ // the only thing it does is prevent big emoji sequences from being
997
+ // split up, like 🧚🏼‍♂️
998
+ // https://www.unicode.org/Public/emoji/12.0/emoji-zwj-sequences.txt
999
+ &nbsp;
1000
+ // WB3d: Keep horizontal whitespace together
1001
+ if (left === WordBreakProperty.WSegSpace &amp;&amp; right == WordBreakProperty.WSegSpace)
1002
+ <span class="branch-0 cbranch-no" title="branch not covered" > continue;</span>
1003
+ &nbsp;
1004
+ // WB4: Ignore format and extend characters
1005
+ // This is to keep grapheme clusters together!
1006
+ // See: Section 6.2: https://unicode.org/reports/tr29/#Grapheme_Cluster_and_Format_Rules
1007
+ // N.B.: The rule about "except after sot, CR, LF, and
1008
+ // Newline" already been by WB1, WB2, WB3a, and WB3b above.
1009
+ while (right === WordBreakProperty.Format ||
1010
+ right === WordBreakProperty.Extend ||
1011
+ right === WordBreakProperty.ZWJ) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1012
+ <span class="cstat-no" title="statement not covered" > // Continue advancing in the string, as if these</span>
1013
+ <span class="cstat-no" title="statement not covered" > // characters do not exist. DO NOT update left and</span>
1014
+ <span class="cstat-no" title="statement not covered" > // lookbehind however!</span>
1015
+ <span class="cstat-no" title="statement not covered" > [rightPos, lookaheadPos] = [lookaheadPos, positionAfter(lookaheadPos)];</span>
1016
+ <span class="cstat-no" title="statement not covered" > [right, lookahead] = [lookahead, wordbreakPropertyAt(lookaheadPos)];</span>
1017
+ <span class="cstat-no" title="statement not covered" > }</span>
1018
+ // In ignoring the characters in the previous loop, we could
1019
+ // have fallen off the end of the string, so end the loop
1020
+ // prematurely if that happens!
1021
+ if (right === WordBreakProperty.eot) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1022
+ <span class="cstat-no" title="statement not covered" > boundaries.push(rightPos);</span>
1023
+ <span class="cstat-no" title="statement not covered" > break;</span>
1024
+ <span class="cstat-no" title="statement not covered" > }</span>
1025
+ // WB4 (continued): Lookahead must ALSO ignore these format,
1026
+ // extend, ZWJ characters!
1027
+ while (lookahead === WordBreakProperty.Format ||
1028
+ lookahead === WordBreakProperty.Extend ||
1029
+ lookahead === WordBreakProperty.ZWJ) {
1030
+ // Continue advancing in the string, as if these
1031
+ // characters do not exist. DO NOT update left and right,
1032
+ // however!
1033
+ lookaheadPos = positionAfter(lookaheadPos);
1034
+ lookahead = wordbreakPropertyAt(lookaheadPos);
1035
+ }
1036
+ &nbsp;
1037
+ // WB5: Do not break between most letters.
1038
+ if (isAHLetter(left) &amp;&amp; isAHLetter(right))
1039
+ continue;
1040
+ // Do not break across certain punctuation
1041
+ // WB6: (Don't break before apostrophes in contractions)
1042
+ if (isAHLetter(left) &amp;&amp; isAHLetter(lookahead) &amp;&amp;
1043
+ (right === WordBreakProperty.MidLetter || isMidNumLetQ(right)))
1044
+ continue;
1045
+ // WB7: (Don't break after apostrophes in contractions)
1046
+ if (isAHLetter(lookbehind) &amp;&amp; isAHLetter(right) &amp;&amp;
1047
+ (left === WordBreakProperty.MidLetter || isMidNumLetQ(left)))
1048
+ continue;
1049
+ // WB7a
1050
+ if (left === WordBreakProperty.Hebrew_Letter<span class="branch-0 cbranch-no" title="branch not covered" > &amp;&amp; right === WordBreakProperty.Single_Quote)</span>
1051
+ <span class="branch-0 cbranch-no" title="branch not covered" > continue;</span>
1052
+ // WB7b
1053
+ if (left === WordBreakProperty.Hebrew_Letter<span class="branch-0 cbranch-no" title="branch not covered" > &amp;&amp; right === WordBreakProperty.Double_Quote<span class="branch-0 cbranch-no" title="branch not covered" > </span>&amp;&amp;</span>
1054
+ lookahead === WordBreakProperty.Hebrew_Letter)
1055
+ <span class="branch-0 cbranch-no" title="branch not covered" > continue;</span>
1056
+ // WB7c
1057
+ if (lookbehind === WordBreakProperty.Hebrew_Letter<span class="branch-0 cbranch-no" title="branch not covered" > &amp;&amp; left === WordBreakProperty.Double_Quote<span class="branch-0 cbranch-no" title="branch not covered" > </span>&amp;&amp;</span>
1058
+ right === WordBreakProperty.Hebrew_Letter)
1059
+ <span class="branch-0 cbranch-no" title="branch not covered" > continue;</span>
1060
+ // Do not break within sequences of digits, or digits adjacent to letters.
1061
+ // e.g., "3a" or "A3"
1062
+ // WB8
1063
+ if (left === WordBreakProperty.Numeric<span class="branch-0 cbranch-no" title="branch not covered" > &amp;&amp; right === WordBreakProperty.Numeric)</span>
1064
+ <span class="branch-0 cbranch-no" title="branch not covered" > continue;</span>
1065
+ // WB9
1066
+ if (isAHLetter(left) &amp;&amp; right === WordBreakProperty.Numeric)
1067
+ <span class="branch-0 cbranch-no" title="branch not covered" > continue;</span>
1068
+ // WB10
1069
+ if (left === WordBreakProperty.Numeric<span class="branch-0 cbranch-no" title="branch not covered" > &amp;&amp; isAHLetter(right))</span>
1070
+ <span class="branch-0 cbranch-no" title="branch not covered" > continue;</span>
1071
+ // Do not break within sequences, such as 3.2, 3,456.789
1072
+ // WB11
1073
+ if (lookbehind === WordBreakProperty.Numeric<span class="branch-0 cbranch-no" title="branch not covered" > &amp;&amp; right === WordBreakProperty.Numeric<span class="branch-0 cbranch-no" title="branch not covered" > </span>&amp;&amp;</span>
1074
+ (left === WordBreakProperty.MidNum || isMidNumLetQ(left)))
1075
+ <span class="branch-0 cbranch-no" title="branch not covered" > continue;</span>
1076
+ // WB12
1077
+ if (left === WordBreakProperty.Numeric<span class="branch-0 cbranch-no" title="branch not covered" > &amp;&amp; lookahead === WordBreakProperty.Numeric<span class="branch-0 cbranch-no" title="branch not covered" > </span>&amp;&amp;</span>
1078
+ (right === WordBreakProperty.MidNum || isMidNumLetQ(right)))
1079
+ <span class="branch-0 cbranch-no" title="branch not covered" > continue;</span>
1080
+ // WB13: Do not break between Katakana
1081
+ if (left === WordBreakProperty.Katakana<span class="branch-0 cbranch-no" title="branch not covered" > &amp;&amp; right === WordBreakProperty.Katakana)</span>
1082
+ <span class="branch-0 cbranch-no" title="branch not covered" > continue;</span>
1083
+ // Do not break from extenders (e.g., U+202F NARROW NO-BREAK SPACE)
1084
+ // WB13a
1085
+ if ((isAHLetter(left) ||
1086
+ left === WordBreakProperty.Numeric ||
1087
+ left === WordBreakProperty.Katakana ||
1088
+ left === WordBreakProperty.ExtendNumLet) &amp;&amp;
1089
+ right === WordBreakProperty.ExtendNumLet)
1090
+ <span class="branch-0 cbranch-no" title="branch not covered" > continue;</span>
1091
+ // WB13b
1092
+ if ((isAHLetter(right) ||
1093
+ right === WordBreakProperty.Numeric ||
1094
+ right === WordBreakProperty.Katakana) &amp;&amp; left === WordBreakProperty.ExtendNumLet)
1095
+ <span class="branch-0 cbranch-no" title="branch not covered" > continue;</span>
1096
+ &nbsp;
1097
+ // WB15 &amp; WB16:
1098
+ // Do not break within emoji flag sequences. That is, do not break between
1099
+ // regional indicator (RI) symbols if there is an odd number of RI
1100
+ // characters before the break point.
1101
+ if (right === WordBreakProperty.Regional_Indicator) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1102
+ <span class="cstat-no" title="statement not covered" > // Emoji flags are actually composed of TWO scalar values, each being a</span>
1103
+ <span class="cstat-no" title="statement not covered" > // "regional indicator". These indicators correspond to Latin letters. Put</span>
1104
+ <span class="cstat-no" title="statement not covered" > // two of them together, and they spell out an ISO 3166-1-alpha-2 country</span>
1105
+ <span class="cstat-no" title="statement not covered" > // code. Since these always come in pairs, NEVER split the pairs! So, if</span>
1106
+ <span class="cstat-no" title="statement not covered" > // we happen to be inside the middle of an odd numbered of</span>
1107
+ <span class="cstat-no" title="statement not covered" > // Regional_Indicators, DON'T SPLIT IT!</span>
1108
+ <span class="cstat-no" title="statement not covered" > nConsecutiveRegionalIndicators += 1;</span>
1109
+ <span class="cstat-no" title="statement not covered" > if ((nConsecutiveRegionalIndicators % 2) == 1) {</span>
1110
+ <span class="cstat-no" title="statement not covered" > continue;</span>
1111
+ <span class="cstat-no" title="statement not covered" > }</span>
1112
+ } else {
1113
+ nConsecutiveRegionalIndicators = 0;
1114
+ }
1115
+ // WB999: Otherwise, break EVERYWHERE (including around ideographs)
1116
+ boundaries.push(rightPos);
1117
+ } while (rightPos &lt; text.length);
1118
+ &nbsp;
1119
+ return boundaries;
1120
+ &nbsp;
1121
+ ///// Internal utility functions /////
1122
+ &nbsp;
1123
+ /**
1124
+ * Returns the position of the start of the next scalar value. This jumps
1125
+ * over surrogate pairs.
1126
+ *
1127
+ * If asked for the character AFTER the end of the string, this always
1128
+ * returns the length of the string.
1129
+ */
1130
+ function positionAfter(pos: number): number {
1131
+ if (pos &gt;= text.length) {
1132
+ return text.length;
1133
+ } else if (isStartOfSurrogatePair(text[pos])) {
1134
+ return pos + 2;
1135
+ }
1136
+ return pos + 1;
1137
+ }
1138
+ &nbsp;
1139
+ /**
1140
+ * Return the value of the Word_Break property at the given string index.
1141
+ * @param pos position in the text.
1142
+ */
1143
+ function wordbreakPropertyAt(pos: number) {
1144
+ if (pos &lt; 0) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1145
+ <span class="cstat-no" title="statement not covered" > return WordBreakProperty.sot; // Always "start of string" before the string starts!</span>
1146
+ } else if (pos &gt;= text.length) {
1147
+ return WordBreakProperty.eot; // Always "end of string" after the string ends!
1148
+ } else if (isStartOfSurrogatePair(text[pos])) {
1149
+ // Surrogate pairs the next TWO items from the string!
1150
+ return property(text[pos] + text[pos + 1]);
1151
+ }
1152
+ return property(text[pos]);
1153
+ }
1154
+ &nbsp;
1155
+ // Word_Break rule macros
1156
+ // See: https://unicode.org/reports/tr29/#WB_Rule_Macros
1157
+ function isAHLetter(prop: WordBreakProperty): boolean {
1158
+ return prop === WordBreakProperty.ALetter ||
1159
+ prop === WordBreakProperty.Hebrew_Letter;
1160
+ }
1161
+ &nbsp;
1162
+ function isMidNumLetQ(prop: WordBreakProperty): boolean {
1163
+ return prop === WordBreakProperty.MidNumLet ||
1164
+ prop === WordBreakProperty.Single_Quote;
1165
+ }
1166
+ }
1167
+ &nbsp;
1168
+ function isStartOfSurrogatePair(character: string) {
1169
+ let codeUnit = character.charCodeAt(0);
1170
+ return codeUnit &gt;= 0xD800 &amp;&amp; codeUnit &lt;= 0xDBFF;
1171
+ }
1172
+ &nbsp;
1173
+ /**
1174
+ * Return the Word_Break property value for a character.
1175
+ * Note that
1176
+ * @param character a scalar value
1177
+ */
1178
+ function property(character: string): WordBreakProperty {
1179
+ // This MUST be a scalar value.
1180
+ // TODO: remove dependence on character.codepointAt()?
1181
+ let codepoint = character.codePointAt(0) as number;
1182
+ return searchForProperty(codepoint, 0, WORD_BREAK_PROPERTY.length - 1);
1183
+ }
1184
+ &nbsp;
1185
+ /**
1186
+ * Binary search for the word break property of a given CODE POINT.
1187
+ *
1188
+ * The auto-generated data.ts master array defines a **character range**
1189
+ * lookup table. If a character's codepoint is equal to or greater than
1190
+ * the I.Start value for an entry and exclusively less than the next entry,
1191
+ * it falls in the first entry's range bucket and is classified accordingly
1192
+ * by this method.
1193
+ */
1194
+ function searchForProperty(codePoint: number, left: number, right: number): WordBreakProperty {
1195
+ // All items that are not found in the array are assigned the 'Other' property.
1196
+ if (right &lt; left) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1197
+ <span class="cstat-no" title="statement not covered" > return WordBreakProperty.Other;</span>
1198
+ <span class="cstat-no" title="statement not covered" > }</span>
1199
+ &nbsp;
1200
+ let midpoint = left + ~~((right - left) / 2);
1201
+ let candidate = WORD_BREAK_PROPERTY[midpoint];
1202
+ &nbsp;
1203
+ let nextRange = WORD_BREAK_PROPERTY[midpoint + 1];
1204
+ let startOfNextRange = nextRange ? nextRange[I.Start] <span class="branch-0 cbranch-no" title="branch not covered" >: Infinity;</span>
1205
+ &nbsp;
1206
+ if (codePoint &lt; candidate[I.Start]) {
1207
+ return searchForProperty(codePoint, left, midpoint - 1);
1208
+ } else if (codePoint &gt;= startOfNextRange) {
1209
+ return searchForProperty(codePoint, midpoint + 1, right);
1210
+ }
1211
+ &nbsp;
1212
+ // We found it!
1213
+ return candidate[I.Value];
1214
+ }
1215
+ &nbsp;</pre></td></tr></table></pre>
1216
+
1217
+ <div class='push'></div><!-- for sticky footer -->
1218
+ </div><!-- /wrapper -->
1219
+ <div class='footer quiet pad2 space-top1 center small'>
1220
+ Code coverage generated by
1221
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1222
+ at 2023-04-11T18:53:57.094Z
1223
+ </div>
1224
+ <script src="../../prettify.js"></script>
1225
+ <script>
1226
+ window.onload = function () {
1227
+ prettyPrint();
1228
+ };
1229
+ </script>
1230
+ <script src="../../sorter.js"></script>
1231
+ <script src="../../block-navigation.js"></script>
1232
+ </body>
1233
+ </html>
1234
+