vg-coder-cli 2.0.9 → 2.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/DEVELOPMENT.md +95 -0
  2. package/README.md +19 -0
  3. package/SYSTEM_PROMPT.md +157 -0
  4. package/coverage/base.css +224 -0
  5. package/coverage/block-navigation.js +87 -0
  6. package/coverage/favicon.png +0 -0
  7. package/coverage/index.html +206 -0
  8. package/coverage/lcov-report/base.css +224 -0
  9. package/coverage/lcov-report/block-navigation.js +87 -0
  10. package/coverage/lcov-report/favicon.png +0 -0
  11. package/coverage/lcov-report/index.html +206 -0
  12. package/coverage/lcov-report/prettify.css +1 -0
  13. package/coverage/lcov-report/prettify.js +2 -0
  14. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  15. package/coverage/lcov-report/sorter.js +210 -0
  16. package/coverage/lcov-report/src/detectors/index.html +116 -0
  17. package/coverage/lcov-report/src/detectors/project-detector.js.html +1084 -0
  18. package/coverage/lcov-report/src/exporter/html-exporter.js.html +2839 -0
  19. package/coverage/lcov-report/src/exporter/index.html +116 -0
  20. package/coverage/lcov-report/src/ignore/ignore-manager.js.html +979 -0
  21. package/coverage/lcov-report/src/ignore/index.html +116 -0
  22. package/coverage/lcov-report/src/index.html +116 -0
  23. package/coverage/lcov-report/src/index.js.html +928 -0
  24. package/coverage/lcov-report/src/scanner/file-scanner.js.html +1903 -0
  25. package/coverage/lcov-report/src/scanner/index.html +116 -0
  26. package/coverage/lcov-report/src/tokenizer/index.html +116 -0
  27. package/coverage/lcov-report/src/tokenizer/token-manager.js.html +1252 -0
  28. package/coverage/lcov-report/src/utils/helpers.js.html +469 -0
  29. package/coverage/lcov-report/src/utils/index.html +116 -0
  30. package/coverage/lcov.info +1396 -0
  31. package/coverage/prettify.css +1 -0
  32. package/coverage/prettify.js +2 -0
  33. package/coverage/sort-arrow-sprite.png +0 -0
  34. package/coverage/sorter.js +210 -0
  35. package/coverage/src/detectors/index.html +116 -0
  36. package/coverage/src/detectors/project-detector.js.html +1084 -0
  37. package/coverage/src/exporter/html-exporter.js.html +2839 -0
  38. package/coverage/src/exporter/index.html +116 -0
  39. package/coverage/src/ignore/ignore-manager.js.html +979 -0
  40. package/coverage/src/ignore/index.html +116 -0
  41. package/coverage/src/index.html +116 -0
  42. package/coverage/src/index.js.html +928 -0
  43. package/coverage/src/scanner/file-scanner.js.html +1903 -0
  44. package/coverage/src/scanner/index.html +116 -0
  45. package/coverage/src/tokenizer/index.html +116 -0
  46. package/coverage/src/tokenizer/token-manager.js.html +1252 -0
  47. package/coverage/src/utils/helpers.js.html +469 -0
  48. package/coverage/src/utils/index.html +116 -0
  49. package/jest.config.js +16 -0
  50. package/package.json +5 -3
  51. package/scripts/build.js +40 -0
  52. package/src/server/api-server.js +15 -0
  53. package/src/server/views/css/iframe.css +84 -0
  54. package/src/server/views/css/structure.css +63 -37
  55. package/src/server/views/dashboard.css +127 -310
  56. package/src/server/views/dashboard.html +165 -119
  57. package/src/server/views/js/features/iframe-manager.js +56 -0
  58. package/src/server/views/js/main.js +64 -0
  59. package/src/server/views/vg-coder/assets/icon128.png +0 -0
  60. package/src/server/views/vg-coder/assets/icon16.png +0 -0
  61. package/src/server/views/vg-coder/assets/icon48.png +0 -0
  62. package/src/server/views/vg-coder/background.js +2 -0
  63. package/src/server/views/vg-coder/background.js.LICENSE.txt +118 -0
  64. package/src/server/views/vg-coder/controller.js +1 -0
  65. package/src/server/views/vg-coder/manifest.json +58 -0
  66. package/src/server/views/vg-coder/options.css +164 -0
  67. package/src/server/views/vg-coder/options.html +48 -0
  68. package/src/server/views/vg-coder/options.js +1 -0
  69. package/src/server/views/vg-coder/rules.json +23 -0
  70. package/vg-coder-cli-2.0.11.tgz +0 -0
  71. package/vg-coder.zip +0 -0
  72. package/vg-coder-cli-2.0.8.tgz +0 -0
  73. package/vg-coder-cli-2.0.9.tgz +0 -0
@@ -0,0 +1,1252 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/tokenizer/token-manager.js</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">src/tokenizer</a> token-manager.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">71.21% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>94/132</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">59.25% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>32/54</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">85.71% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>18/21</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">70.16% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>87/124</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 type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line medium'></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>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
456
+ <span class="cline-any cline-neutral">&nbsp;</span>
457
+ <span class="cline-any cline-neutral">&nbsp;</span>
458
+ <span class="cline-any cline-neutral">&nbsp;</span>
459
+ <span class="cline-any cline-neutral">&nbsp;</span>
460
+ <span class="cline-any cline-neutral">&nbsp;</span>
461
+ <span class="cline-any cline-neutral">&nbsp;</span>
462
+ <span class="cline-any cline-yes">1x</span>
463
+ <span class="cline-any cline-neutral">&nbsp;</span>
464
+ <span class="cline-any cline-neutral">&nbsp;</span>
465
+ <span class="cline-any cline-neutral">&nbsp;</span>
466
+ <span class="cline-any cline-neutral">&nbsp;</span>
467
+ <span class="cline-any cline-neutral">&nbsp;</span>
468
+ <span class="cline-any cline-neutral">&nbsp;</span>
469
+ <span class="cline-any cline-neutral">&nbsp;</span>
470
+ <span class="cline-any cline-yes">1x</span>
471
+ <span class="cline-any cline-yes">1x</span>
472
+ <span class="cline-any cline-neutral">&nbsp;</span>
473
+ <span class="cline-any cline-neutral">&nbsp;</span>
474
+ <span class="cline-any cline-neutral">&nbsp;</span>
475
+ <span class="cline-any cline-neutral">&nbsp;</span>
476
+ <span class="cline-any cline-neutral">&nbsp;</span>
477
+ <span class="cline-any cline-neutral">&nbsp;</span>
478
+ <span class="cline-any cline-yes">1x</span>
479
+ <span class="cline-any cline-neutral">&nbsp;</span>
480
+ <span class="cline-any cline-yes">1x</span>
481
+ <span class="cline-any cline-neutral">&nbsp;</span>
482
+ <span class="cline-any cline-yes">1x</span>
483
+ <span class="cline-any cline-neutral">&nbsp;</span>
484
+ <span class="cline-any cline-yes">1x</span>
485
+ <span class="cline-any cline-neutral">&nbsp;</span>
486
+ <span class="cline-any cline-neutral">&nbsp;</span>
487
+ <span class="cline-any cline-no">&nbsp;</span>
488
+ <span class="cline-any cline-neutral">&nbsp;</span>
489
+ <span class="cline-any cline-neutral">&nbsp;</span>
490
+ <span class="cline-any cline-neutral">&nbsp;</span>
491
+ <span class="cline-any cline-neutral">&nbsp;</span>
492
+ <span class="cline-any cline-neutral">&nbsp;</span>
493
+ <span class="cline-any cline-neutral">&nbsp;</span>
494
+ <span class="cline-any cline-neutral">&nbsp;</span>
495
+ <span class="cline-any cline-neutral">&nbsp;</span>
496
+ <span class="cline-any cline-yes">1887x</span>
497
+ <span class="cline-any cline-no">&nbsp;</span>
498
+ <span class="cline-any cline-neutral">&nbsp;</span>
499
+ <span class="cline-any cline-neutral">&nbsp;</span>
500
+ <span class="cline-any cline-yes">1887x</span>
501
+ <span class="cline-any cline-yes">1887x</span>
502
+ <span class="cline-any cline-yes">1887x</span>
503
+ <span class="cline-any cline-neutral">&nbsp;</span>
504
+ <span class="cline-any cline-neutral">&nbsp;</span>
505
+ <span class="cline-any cline-no">&nbsp;</span>
506
+ <span class="cline-any cline-neutral">&nbsp;</span>
507
+ <span class="cline-any cline-neutral">&nbsp;</span>
508
+ <span class="cline-any cline-neutral">&nbsp;</span>
509
+ <span class="cline-any cline-neutral">&nbsp;</span>
510
+ <span class="cline-any cline-neutral">&nbsp;</span>
511
+ <span class="cline-any cline-neutral">&nbsp;</span>
512
+ <span class="cline-any cline-neutral">&nbsp;</span>
513
+ <span class="cline-any cline-yes">173x</span>
514
+ <span class="cline-any cline-yes">173x</span>
515
+ <span class="cline-any cline-yes">173x</span>
516
+ <span class="cline-any cline-neutral">&nbsp;</span>
517
+ <span class="cline-any cline-yes">173x</span>
518
+ <span class="cline-any cline-neutral">&nbsp;</span>
519
+ <span class="cline-any cline-neutral">&nbsp;</span>
520
+ <span class="cline-any cline-neutral">&nbsp;</span>
521
+ <span class="cline-any cline-neutral">&nbsp;</span>
522
+ <span class="cline-any cline-neutral">&nbsp;</span>
523
+ <span class="cline-any cline-neutral">&nbsp;</span>
524
+ <span class="cline-any cline-neutral">&nbsp;</span>
525
+ <span class="cline-any cline-neutral">&nbsp;</span>
526
+ <span class="cline-any cline-neutral">&nbsp;</span>
527
+ <span class="cline-any cline-neutral">&nbsp;</span>
528
+ <span class="cline-any cline-neutral">&nbsp;</span>
529
+ <span class="cline-any cline-neutral">&nbsp;</span>
530
+ <span class="cline-any cline-neutral">&nbsp;</span>
531
+ <span class="cline-any cline-yes">173x</span>
532
+ <span class="cline-any cline-neutral">&nbsp;</span>
533
+ <span class="cline-any cline-yes">173x</span>
534
+ <span class="cline-any cline-yes">173x</span>
535
+ <span class="cline-any cline-yes">173x</span>
536
+ <span class="cline-any cline-neutral">&nbsp;</span>
537
+ <span class="cline-any cline-yes">1x</span>
538
+ <span class="cline-any cline-neutral">&nbsp;</span>
539
+ <span class="cline-any cline-neutral">&nbsp;</span>
540
+ <span class="cline-any cline-neutral">&nbsp;</span>
541
+ <span class="cline-any cline-neutral">&nbsp;</span>
542
+ <span class="cline-any cline-neutral">&nbsp;</span>
543
+ <span class="cline-any cline-neutral">&nbsp;</span>
544
+ <span class="cline-any cline-neutral">&nbsp;</span>
545
+ <span class="cline-any cline-neutral">&nbsp;</span>
546
+ <span class="cline-any cline-neutral">&nbsp;</span>
547
+ <span class="cline-any cline-neutral">&nbsp;</span>
548
+ <span class="cline-any cline-neutral">&nbsp;</span>
549
+ <span class="cline-any cline-neutral">&nbsp;</span>
550
+ <span class="cline-any cline-neutral">&nbsp;</span>
551
+ <span class="cline-any cline-neutral">&nbsp;</span>
552
+ <span class="cline-any cline-neutral">&nbsp;</span>
553
+ <span class="cline-any cline-neutral">&nbsp;</span>
554
+ <span class="cline-any cline-yes">1x</span>
555
+ <span class="cline-any cline-neutral">&nbsp;</span>
556
+ <span class="cline-any cline-yes">1x</span>
557
+ <span class="cline-any cline-no">&nbsp;</span>
558
+ <span class="cline-any cline-neutral">&nbsp;</span>
559
+ <span class="cline-any cline-neutral">&nbsp;</span>
560
+ <span class="cline-any cline-neutral">&nbsp;</span>
561
+ <span class="cline-any cline-neutral">&nbsp;</span>
562
+ <span class="cline-any cline-neutral">&nbsp;</span>
563
+ <span class="cline-any cline-neutral">&nbsp;</span>
564
+ <span class="cline-any cline-neutral">&nbsp;</span>
565
+ <span class="cline-any cline-neutral">&nbsp;</span>
566
+ <span class="cline-any cline-yes">1x</span>
567
+ <span class="cline-any cline-neutral">&nbsp;</span>
568
+ <span class="cline-any cline-neutral">&nbsp;</span>
569
+ <span class="cline-any cline-neutral">&nbsp;</span>
570
+ <span class="cline-any cline-neutral">&nbsp;</span>
571
+ <span class="cline-any cline-neutral">&nbsp;</span>
572
+ <span class="cline-any cline-neutral">&nbsp;</span>
573
+ <span class="cline-any cline-neutral">&nbsp;</span>
574
+ <span class="cline-any cline-neutral">&nbsp;</span>
575
+ <span class="cline-any cline-yes">1x</span>
576
+ <span class="cline-any cline-yes">1x</span>
577
+ <span class="cline-any cline-yes">1x</span>
578
+ <span class="cline-any cline-yes">1x</span>
579
+ <span class="cline-any cline-yes">1x</span>
580
+ <span class="cline-any cline-neutral">&nbsp;</span>
581
+ <span class="cline-any cline-neutral">&nbsp;</span>
582
+ <span class="cline-any cline-yes">1x</span>
583
+ <span class="cline-any cline-neutral">&nbsp;</span>
584
+ <span class="cline-any cline-yes">1x</span>
585
+ <span class="cline-any cline-yes">173x</span>
586
+ <span class="cline-any cline-yes">173x</span>
587
+ <span class="cline-any cline-yes">173x</span>
588
+ <span class="cline-any cline-neutral">&nbsp;</span>
589
+ <span class="cline-any cline-neutral">&nbsp;</span>
590
+ <span class="cline-any cline-yes">173x</span>
591
+ <span class="cline-any cline-neutral">&nbsp;</span>
592
+ <span class="cline-any cline-yes">24x</span>
593
+ <span class="cline-any cline-neutral">&nbsp;</span>
594
+ <span class="cline-any cline-neutral">&nbsp;</span>
595
+ <span class="cline-any cline-neutral">&nbsp;</span>
596
+ <span class="cline-any cline-neutral">&nbsp;</span>
597
+ <span class="cline-any cline-neutral">&nbsp;</span>
598
+ <span class="cline-any cline-neutral">&nbsp;</span>
599
+ <span class="cline-any cline-neutral">&nbsp;</span>
600
+ <span class="cline-any cline-yes">24x</span>
601
+ <span class="cline-any cline-yes">24x</span>
602
+ <span class="cline-any cline-neutral">&nbsp;</span>
603
+ <span class="cline-any cline-neutral">&nbsp;</span>
604
+ <span class="cline-any cline-neutral">&nbsp;</span>
605
+ <span class="cline-any cline-yes">173x</span>
606
+ <span class="cline-any cline-yes">4x</span>
607
+ <span class="cline-any cline-yes">8x</span>
608
+ <span class="cline-any cline-neutral">&nbsp;</span>
609
+ <span class="cline-any cline-neutral">&nbsp;</span>
610
+ <span class="cline-any cline-neutral">&nbsp;</span>
611
+ <span class="cline-any cline-neutral">&nbsp;</span>
612
+ <span class="cline-any cline-neutral">&nbsp;</span>
613
+ <span class="cline-any cline-yes">169x</span>
614
+ <span class="cline-any cline-yes">169x</span>
615
+ <span class="cline-any cline-neutral">&nbsp;</span>
616
+ <span class="cline-any cline-neutral">&nbsp;</span>
617
+ <span class="cline-any cline-neutral">&nbsp;</span>
618
+ <span class="cline-any cline-neutral">&nbsp;</span>
619
+ <span class="cline-any cline-yes">1x</span>
620
+ <span class="cline-any cline-yes">1x</span>
621
+ <span class="cline-any cline-neutral">&nbsp;</span>
622
+ <span class="cline-any cline-neutral">&nbsp;</span>
623
+ <span class="cline-any cline-neutral">&nbsp;</span>
624
+ <span class="cline-any cline-neutral">&nbsp;</span>
625
+ <span class="cline-any cline-neutral">&nbsp;</span>
626
+ <span class="cline-any cline-neutral">&nbsp;</span>
627
+ <span class="cline-any cline-neutral">&nbsp;</span>
628
+ <span class="cline-any cline-neutral">&nbsp;</span>
629
+ <span class="cline-any cline-neutral">&nbsp;</span>
630
+ <span class="cline-any cline-yes">1x</span>
631
+ <span class="cline-any cline-yes">33x</span>
632
+ <span class="cline-any cline-neutral">&nbsp;</span>
633
+ <span class="cline-any cline-neutral">&nbsp;</span>
634
+ <span class="cline-any cline-yes">1x</span>
635
+ <span class="cline-any cline-neutral">&nbsp;</span>
636
+ <span class="cline-any cline-neutral">&nbsp;</span>
637
+ <span class="cline-any cline-neutral">&nbsp;</span>
638
+ <span class="cline-any cline-neutral">&nbsp;</span>
639
+ <span class="cline-any cline-neutral">&nbsp;</span>
640
+ <span class="cline-any cline-neutral">&nbsp;</span>
641
+ <span class="cline-any cline-no">&nbsp;</span>
642
+ <span class="cline-any cline-no">&nbsp;</span>
643
+ <span class="cline-any cline-no">&nbsp;</span>
644
+ <span class="cline-any cline-no">&nbsp;</span>
645
+ <span class="cline-any cline-no">&nbsp;</span>
646
+ <span class="cline-any cline-neutral">&nbsp;</span>
647
+ <span class="cline-any cline-no">&nbsp;</span>
648
+ <span class="cline-any cline-no">&nbsp;</span>
649
+ <span class="cline-any cline-neutral">&nbsp;</span>
650
+ <span class="cline-any cline-no">&nbsp;</span>
651
+ <span class="cline-any cline-neutral">&nbsp;</span>
652
+ <span class="cline-any cline-no">&nbsp;</span>
653
+ <span class="cline-any cline-neutral">&nbsp;</span>
654
+ <span class="cline-any cline-neutral">&nbsp;</span>
655
+ <span class="cline-any cline-neutral">&nbsp;</span>
656
+ <span class="cline-any cline-neutral">&nbsp;</span>
657
+ <span class="cline-any cline-neutral">&nbsp;</span>
658
+ <span class="cline-any cline-neutral">&nbsp;</span>
659
+ <span class="cline-any cline-neutral">&nbsp;</span>
660
+ <span class="cline-any cline-neutral">&nbsp;</span>
661
+ <span class="cline-any cline-no">&nbsp;</span>
662
+ <span class="cline-any cline-no">&nbsp;</span>
663
+ <span class="cline-any cline-no">&nbsp;</span>
664
+ <span class="cline-any cline-no">&nbsp;</span>
665
+ <span class="cline-any cline-neutral">&nbsp;</span>
666
+ <span class="cline-any cline-no">&nbsp;</span>
667
+ <span class="cline-any cline-no">&nbsp;</span>
668
+ <span class="cline-any cline-neutral">&nbsp;</span>
669
+ <span class="cline-any cline-neutral">&nbsp;</span>
670
+ <span class="cline-any cline-neutral">&nbsp;</span>
671
+ <span class="cline-any cline-no">&nbsp;</span>
672
+ <span class="cline-any cline-no">&nbsp;</span>
673
+ <span class="cline-any cline-neutral">&nbsp;</span>
674
+ <span class="cline-any cline-neutral">&nbsp;</span>
675
+ <span class="cline-any cline-neutral">&nbsp;</span>
676
+ <span class="cline-any cline-no">&nbsp;</span>
677
+ <span class="cline-any cline-no">&nbsp;</span>
678
+ <span class="cline-any cline-neutral">&nbsp;</span>
679
+ <span class="cline-any cline-neutral">&nbsp;</span>
680
+ <span class="cline-any cline-neutral">&nbsp;</span>
681
+ <span class="cline-any cline-neutral">&nbsp;</span>
682
+ <span class="cline-any cline-neutral">&nbsp;</span>
683
+ <span class="cline-any cline-neutral">&nbsp;</span>
684
+ <span class="cline-any cline-neutral">&nbsp;</span>
685
+ <span class="cline-any cline-neutral">&nbsp;</span>
686
+ <span class="cline-any cline-neutral">&nbsp;</span>
687
+ <span class="cline-any cline-no">&nbsp;</span>
688
+ <span class="cline-any cline-no">&nbsp;</span>
689
+ <span class="cline-any cline-neutral">&nbsp;</span>
690
+ <span class="cline-any cline-neutral">&nbsp;</span>
691
+ <span class="cline-any cline-no">&nbsp;</span>
692
+ <span class="cline-any cline-neutral">&nbsp;</span>
693
+ <span class="cline-any cline-neutral">&nbsp;</span>
694
+ <span class="cline-any cline-neutral">&nbsp;</span>
695
+ <span class="cline-any cline-neutral">&nbsp;</span>
696
+ <span class="cline-any cline-neutral">&nbsp;</span>
697
+ <span class="cline-any cline-neutral">&nbsp;</span>
698
+ <span class="cline-any cline-yes">4x</span>
699
+ <span class="cline-any cline-yes">4x</span>
700
+ <span class="cline-any cline-yes">4x</span>
701
+ <span class="cline-any cline-yes">4x</span>
702
+ <span class="cline-any cline-yes">4x</span>
703
+ <span class="cline-any cline-neutral">&nbsp;</span>
704
+ <span class="cline-any cline-neutral">&nbsp;</span>
705
+ <span class="cline-any cline-yes">4x</span>
706
+ <span class="cline-any cline-neutral">&nbsp;</span>
707
+ <span class="cline-any cline-yes">4x</span>
708
+ <span class="cline-any cline-yes">1359x</span>
709
+ <span class="cline-any cline-neutral">&nbsp;</span>
710
+ <span class="cline-any cline-yes">1359x</span>
711
+ <span class="cline-any cline-yes">4x</span>
712
+ <span class="cline-any cline-yes">4x</span>
713
+ <span class="cline-any cline-neutral">&nbsp;</span>
714
+ <span class="cline-any cline-neutral">&nbsp;</span>
715
+ <span class="cline-any cline-neutral">&nbsp;</span>
716
+ <span class="cline-any cline-neutral">&nbsp;</span>
717
+ <span class="cline-any cline-neutral">&nbsp;</span>
718
+ <span class="cline-any cline-neutral">&nbsp;</span>
719
+ <span class="cline-any cline-neutral">&nbsp;</span>
720
+ <span class="cline-any cline-neutral">&nbsp;</span>
721
+ <span class="cline-any cline-neutral">&nbsp;</span>
722
+ <span class="cline-any cline-neutral">&nbsp;</span>
723
+ <span class="cline-any cline-neutral">&nbsp;</span>
724
+ <span class="cline-any cline-yes">4x</span>
725
+ <span class="cline-any cline-yes">4x</span>
726
+ <span class="cline-any cline-neutral">&nbsp;</span>
727
+ <span class="cline-any cline-neutral">&nbsp;</span>
728
+ <span class="cline-any cline-yes">1359x</span>
729
+ <span class="cline-any cline-yes">1359x</span>
730
+ <span class="cline-any cline-neutral">&nbsp;</span>
731
+ <span class="cline-any cline-neutral">&nbsp;</span>
732
+ <span class="cline-any cline-neutral">&nbsp;</span>
733
+ <span class="cline-any cline-yes">4x</span>
734
+ <span class="cline-any cline-yes">4x</span>
735
+ <span class="cline-any cline-yes">4x</span>
736
+ <span class="cline-any cline-neutral">&nbsp;</span>
737
+ <span class="cline-any cline-neutral">&nbsp;</span>
738
+ <span class="cline-any cline-neutral">&nbsp;</span>
739
+ <span class="cline-any cline-neutral">&nbsp;</span>
740
+ <span class="cline-any cline-neutral">&nbsp;</span>
741
+ <span class="cline-any cline-neutral">&nbsp;</span>
742
+ <span class="cline-any cline-neutral">&nbsp;</span>
743
+ <span class="cline-any cline-neutral">&nbsp;</span>
744
+ <span class="cline-any cline-neutral">&nbsp;</span>
745
+ <span class="cline-any cline-neutral">&nbsp;</span>
746
+ <span class="cline-any cline-neutral">&nbsp;</span>
747
+ <span class="cline-any cline-neutral">&nbsp;</span>
748
+ <span class="cline-any cline-neutral">&nbsp;</span>
749
+ <span class="cline-any cline-yes">4x</span>
750
+ <span class="cline-any cline-yes">8x</span>
751
+ <span class="cline-any cline-neutral">&nbsp;</span>
752
+ <span class="cline-any cline-neutral">&nbsp;</span>
753
+ <span class="cline-any cline-yes">4x</span>
754
+ <span class="cline-any cline-neutral">&nbsp;</span>
755
+ <span class="cline-any cline-neutral">&nbsp;</span>
756
+ <span class="cline-any cline-neutral">&nbsp;</span>
757
+ <span class="cline-any cline-neutral">&nbsp;</span>
758
+ <span class="cline-any cline-neutral">&nbsp;</span>
759
+ <span class="cline-any cline-neutral">&nbsp;</span>
760
+ <span class="cline-any cline-yes">1x</span>
761
+ <span class="cline-any cline-yes">1x</span>
762
+ <span class="cline-any cline-yes">1x</span>
763
+ <span class="cline-any cline-neutral">&nbsp;</span>
764
+ <span class="cline-any cline-yes">1x</span>
765
+ <span class="cline-any cline-yes">10376x</span>
766
+ <span class="cline-any cline-neutral">&nbsp;</span>
767
+ <span class="cline-any cline-neutral">&nbsp;</span>
768
+ <span class="cline-any cline-yes">10376x</span>
769
+ <span class="cline-any cline-yes">349x</span>
770
+ <span class="cline-any cline-neutral">&nbsp;</span>
771
+ <span class="cline-any cline-yes">173x</span>
772
+ <span class="cline-any cline-yes">172x</span>
773
+ <span class="cline-any cline-neutral">&nbsp;</span>
774
+ <span class="cline-any cline-neutral">&nbsp;</span>
775
+ <span class="cline-any cline-neutral">&nbsp;</span>
776
+ <span class="cline-any cline-neutral">&nbsp;</span>
777
+ <span class="cline-any cline-neutral">&nbsp;</span>
778
+ <span class="cline-any cline-neutral">&nbsp;</span>
779
+ <span class="cline-any cline-neutral">&nbsp;</span>
780
+ <span class="cline-any cline-yes">173x</span>
781
+ <span class="cline-any cline-yes">173x</span>
782
+ <span class="cline-any cline-neutral">&nbsp;</span>
783
+ <span class="cline-any cline-neutral">&nbsp;</span>
784
+ <span class="cline-any cline-neutral">&nbsp;</span>
785
+ <span class="cline-any cline-neutral">&nbsp;</span>
786
+ <span class="cline-any cline-neutral">&nbsp;</span>
787
+ <span class="cline-any cline-yes">1x</span>
788
+ <span class="cline-any cline-yes">1x</span>
789
+ <span class="cline-any cline-neutral">&nbsp;</span>
790
+ <span class="cline-any cline-neutral">&nbsp;</span>
791
+ <span class="cline-any cline-neutral">&nbsp;</span>
792
+ <span class="cline-any cline-neutral">&nbsp;</span>
793
+ <span class="cline-any cline-neutral">&nbsp;</span>
794
+ <span class="cline-any cline-neutral">&nbsp;</span>
795
+ <span class="cline-any cline-yes">1x</span>
796
+ <span class="cline-any cline-neutral">&nbsp;</span>
797
+ <span class="cline-any cline-neutral">&nbsp;</span>
798
+ <span class="cline-any cline-neutral">&nbsp;</span>
799
+ <span class="cline-any cline-neutral">&nbsp;</span>
800
+ <span class="cline-any cline-neutral">&nbsp;</span>
801
+ <span class="cline-any cline-neutral">&nbsp;</span>
802
+ <span class="cline-any cline-no">&nbsp;</span>
803
+ <span class="cline-any cline-no">&nbsp;</span>
804
+ <span class="cline-any cline-no">&nbsp;</span>
805
+ <span class="cline-any cline-neutral">&nbsp;</span>
806
+ <span class="cline-any cline-neutral">&nbsp;</span>
807
+ <span class="cline-any cline-no">&nbsp;</span>
808
+ <span class="cline-any cline-no">&nbsp;</span>
809
+ <span class="cline-any cline-no">&nbsp;</span>
810
+ <span class="cline-any cline-neutral">&nbsp;</span>
811
+ <span class="cline-any cline-no">&nbsp;</span>
812
+ <span class="cline-any cline-no">&nbsp;</span>
813
+ <span class="cline-any cline-neutral">&nbsp;</span>
814
+ <span class="cline-any cline-neutral">&nbsp;</span>
815
+ <span class="cline-any cline-no">&nbsp;</span>
816
+ <span class="cline-any cline-no">&nbsp;</span>
817
+ <span class="cline-any cline-neutral">&nbsp;</span>
818
+ <span class="cline-any cline-neutral">&nbsp;</span>
819
+ <span class="cline-any cline-no">&nbsp;</span>
820
+ <span class="cline-any cline-neutral">&nbsp;</span>
821
+ <span class="cline-any cline-neutral">&nbsp;</span>
822
+ <span class="cline-any cline-neutral">&nbsp;</span>
823
+ <span class="cline-any cline-neutral">&nbsp;</span>
824
+ <span class="cline-any cline-neutral">&nbsp;</span>
825
+ <span class="cline-any cline-neutral">&nbsp;</span>
826
+ <span class="cline-any cline-yes">173x</span>
827
+ <span class="cline-any cline-neutral">&nbsp;</span>
828
+ <span class="cline-any cline-neutral">&nbsp;</span>
829
+ <span class="cline-any cline-neutral">&nbsp;</span>
830
+ <span class="cline-any cline-neutral">&nbsp;</span>
831
+ <span class="cline-any cline-neutral">&nbsp;</span>
832
+ <span class="cline-any cline-neutral">&nbsp;</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-neutral">&nbsp;</span>
835
+ <span class="cline-any cline-neutral">&nbsp;</span>
836
+ <span class="cline-any cline-neutral">&nbsp;</span>
837
+ <span class="cline-any cline-yes">1x</span>
838
+ <span class="cline-any cline-yes">1x</span>
839
+ <span class="cline-any cline-neutral">&nbsp;</span>
840
+ <span class="cline-any cline-neutral">&nbsp;</span>
841
+ <span class="cline-any cline-neutral">&nbsp;</span>
842
+ <span class="cline-any cline-neutral">&nbsp;</span>
843
+ <span class="cline-any cline-yes">2x</span>
844
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const { encoding_for_model, get_encoding } = require('tiktoken');
845
+ &nbsp;
846
+ /**
847
+ * Quản lý token counting và chunking
848
+ */
849
+ class TokenManager {
850
+ constructor(options = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
851
+ this.options = {
852
+ model: options.model || 'gpt-4',
853
+ maxTokens: options.maxTokens || <span class="branch-1 cbranch-no" title="branch not covered" >8000,</span>
854
+ chunkOverlap: options.chunkOverlap || 200,
855
+ preserveStructure: options.preserveStructure !== false,
856
+ ...options
857
+ };
858
+
859
+ this.encoding = null;
860
+ this.initializeEncoding();
861
+ }
862
+ &nbsp;
863
+ /**
864
+ * Khởi tạo encoding
865
+ */
866
+ initializeEncoding() {
867
+ try {
868
+ // Thử sử dụng encoding cho model cụ thể
869
+ this.encoding = encoding_for_model(this.options.model);
870
+ } catch (error) {
871
+ try {
872
+ // Fallback to cl100k_base (GPT-4, GPT-3.5-turbo)
873
+ this.encoding = get_encoding('cl100k_base');
874
+ } catch (fallbackError) {
875
+ // Fallback to p50k_base (GPT-3)
876
+ <span class="cstat-no" title="statement not covered" > this.encoding = get_encoding('p50k_base');</span>
877
+ }
878
+ }
879
+ }
880
+ &nbsp;
881
+ /**
882
+ * Đếm tokens trong text
883
+ */
884
+ countTokens(text) {
885
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!text || typeof text !== 'string') {
886
+ <span class="cstat-no" title="statement not covered" > return 0;</span>
887
+ }
888
+
889
+ try {
890
+ const tokens = this.encoding.encode(text);
891
+ return tokens.length;
892
+ } catch (error) {
893
+ // Fallback: estimate based on characters (rough approximation)
894
+ <span class="cstat-no" title="statement not covered" > return Math.ceil(text.length / 4);</span>
895
+ }
896
+ }
897
+ &nbsp;
898
+ /**
899
+ * Phân tích token usage cho một file
900
+ */
901
+ analyzeFile(file) {
902
+ const headerTokens = this.countTokens(this.generateFileHeader(file));
903
+ const contentTokens = this.countTokens(file.content);
904
+ const totalTokens = headerTokens + contentTokens;
905
+
906
+ return {
907
+ file: file.relativePath,
908
+ headerTokens,
909
+ contentTokens,
910
+ totalTokens,
911
+ exceedsLimit: totalTokens &gt; this.options.maxTokens,
912
+ chunksNeeded: Math.ceil(totalTokens / this.options.maxTokens)
913
+ };
914
+ }
915
+ &nbsp;
916
+ /**
917
+ * Phân tích token usage cho tất cả files
918
+ */
919
+ analyzeFiles(files) {
920
+ const analyses = files.map(file =&gt; this.analyzeFile(file));
921
+
922
+ const totalTokens = analyses.reduce((sum, analysis) =&gt; sum + analysis.totalTokens, 0);
923
+ const filesExceedingLimit = analyses.filter(analysis =&gt; analysis.exceedsLimit);
924
+ const totalChunks = analyses.reduce((sum, analysis) =&gt; sum + analysis.chunksNeeded, 0);
925
+
926
+ return {
927
+ files: analyses,
928
+ summary: {
929
+ totalFiles: files.length,
930
+ totalTokens,
931
+ averageTokensPerFile: Math.round(totalTokens / files.length),
932
+ filesExceedingLimit: filesExceedingLimit.length,
933
+ totalChunks,
934
+ estimatedChunks: Math.ceil(totalTokens / this.options.maxTokens)
935
+ }
936
+ };
937
+ }
938
+ &nbsp;
939
+ /**
940
+ * Chia nhỏ content thành chunks
941
+ */
942
+ async chunkContent(content, metadata = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
943
+ const totalTokens = this.countTokens(content);
944
+
945
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (totalTokens &lt;= this.options.maxTokens) {
946
+ <span class="cstat-no" title="statement not covered" > return [{</span>
947
+ content,
948
+ tokens: totalTokens,
949
+ chunkIndex: 0,
950
+ totalChunks: 1,
951
+ metadata
952
+ }];
953
+ }
954
+
955
+ return this.options.preserveStructure
956
+ ? await this.chunkByStructure(content, metadata)
957
+ : <span class="branch-1 cbranch-no" title="branch not covered" >await this.chunkByTokens(content, metadata);</span>
958
+ }
959
+ &nbsp;
960
+ /**
961
+ * Chia nhỏ theo cấu trúc (ưu tiên giữ nguyên files)
962
+ */
963
+ async chunkByStructure(content, metadata = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
964
+ const chunks = [];
965
+ const lines = content.split('\n');
966
+ let currentChunk = '';
967
+ let currentTokens = 0;
968
+ let chunkIndex = 0;
969
+
970
+ // Tìm file boundaries
971
+ const fileBoundaries = this.findFileBoundaries(lines);
972
+
973
+ for (let i = 0; i &lt; fileBoundaries.length; i++) {
974
+ const boundary = fileBoundaries[i];
975
+ const fileContent = lines.slice(boundary.start, boundary.end).join('\n');
976
+ const fileTokens = this.countTokens(fileContent);
977
+
978
+ // Nếu file này làm chunk vượt quá limit
979
+ if (currentTokens + fileTokens &gt; this.options.maxTokens &amp;&amp; currentChunk) {
980
+ // Lưu chunk hiện tại
981
+ chunks.push({
982
+ content: currentChunk.trim(),
983
+ tokens: currentTokens,
984
+ chunkIndex: chunkIndex++,
985
+ totalChunks: 0, // Sẽ update sau
986
+ metadata: { ...metadata, type: 'structure' }
987
+ });
988
+
989
+ currentChunk = '';
990
+ currentTokens = 0;
991
+ }
992
+
993
+ // Nếu file quá lớn, chia nhỏ file này
994
+ if (fileTokens &gt; this.options.maxTokens) {
995
+ const fileChunks = await this.chunkLargeFile(fileContent, boundary.filePath);
996
+ chunks.push(...fileChunks.map(chunk =&gt; ({
997
+ ...chunk,
998
+ chunkIndex: chunkIndex++,
999
+ metadata: { ...metadata, ...chunk.metadata, type: 'large-file' }
1000
+ })));
1001
+ } else {
1002
+ currentChunk += fileContent + '\n';
1003
+ currentTokens += fileTokens;
1004
+ }
1005
+ }
1006
+
1007
+ // Thêm chunk cuối cùng
1008
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (currentChunk.trim()) {
1009
+ chunks.push({
1010
+ content: currentChunk.trim(),
1011
+ tokens: currentTokens,
1012
+ chunkIndex: chunkIndex++,
1013
+ totalChunks: 0,
1014
+ metadata: { ...metadata, type: 'structure' }
1015
+ });
1016
+ }
1017
+
1018
+ // Update totalChunks
1019
+ chunks.forEach(chunk =&gt; {
1020
+ chunk.totalChunks = chunks.length;
1021
+ });
1022
+
1023
+ return chunks;
1024
+ }
1025
+ &nbsp;
1026
+ /**
1027
+ * Chia nhỏ theo tokens (simple splitting)
1028
+ */
1029
+ <span class="fstat-no" title="function not covered" > as</span>ync chunkByTokens(content, metadata = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
1030
+ const chunks = <span class="cstat-no" title="statement not covered" >[];</span>
1031
+ const lines = <span class="cstat-no" title="statement not covered" >content.split('\n');</span>
1032
+ let currentChunk = <span class="cstat-no" title="statement not covered" >'';</span>
1033
+ let currentTokens = <span class="cstat-no" title="statement not covered" >0;</span>
1034
+ let chunkIndex = <span class="cstat-no" title="statement not covered" >0;</span>
1035
+
1036
+ <span class="cstat-no" title="statement not covered" > for (const line of lines) {</span>
1037
+ const lineTokens = <span class="cstat-no" title="statement not covered" >this.countTokens(line + '\n');</span>
1038
+
1039
+ <span class="cstat-no" title="statement not covered" > if (currentTokens + lineTokens &gt; this.options.maxTokens &amp;&amp; currentChunk) {</span>
1040
+ // Lưu chunk hiện tại
1041
+ <span class="cstat-no" title="statement not covered" > chunks.push({</span>
1042
+ content: currentChunk.trim(),
1043
+ tokens: currentTokens,
1044
+ chunkIndex: chunkIndex++,
1045
+ totalChunks: 0,
1046
+ metadata: { ...metadata, type: 'token-based' }
1047
+ });
1048
+
1049
+ // Bắt đầu chunk mới với overlap
1050
+ <span class="cstat-no" title="statement not covered" > if (this.options.chunkOverlap &gt; 0) {</span>
1051
+ const overlapLines = <span class="cstat-no" title="statement not covered" >this.getOverlapLines(currentChunk, this.options.chunkOverlap);</span>
1052
+ <span class="cstat-no" title="statement not covered" > currentChunk = overlapLines;</span>
1053
+ <span class="cstat-no" title="statement not covered" > currentTokens = this.countTokens(overlapLines);</span>
1054
+ } else {
1055
+ <span class="cstat-no" title="statement not covered" > currentChunk = '';</span>
1056
+ <span class="cstat-no" title="statement not covered" > currentTokens = 0;</span>
1057
+ }
1058
+ }
1059
+
1060
+ <span class="cstat-no" title="statement not covered" > currentChunk += line + '\n';</span>
1061
+ <span class="cstat-no" title="statement not covered" > currentTokens += lineTokens;</span>
1062
+ }
1063
+
1064
+ // Thêm chunk cuối cùng
1065
+ <span class="cstat-no" title="statement not covered" > if (currentChunk.trim()) {</span>
1066
+ <span class="cstat-no" title="statement not covered" > chunks.push({</span>
1067
+ content: currentChunk.trim(),
1068
+ tokens: currentTokens,
1069
+ chunkIndex: chunkIndex++,
1070
+ totalChunks: 0,
1071
+ metadata: { ...metadata, type: 'token-based' }
1072
+ });
1073
+ }
1074
+
1075
+ // Update totalChunks
1076
+ <span class="cstat-no" title="statement not covered" > chunks.forEach(<span class="fstat-no" title="function not covered" >ch</span>unk =&gt; {</span>
1077
+ <span class="cstat-no" title="statement not covered" > chunk.totalChunks = chunks.length;</span>
1078
+ });
1079
+
1080
+ <span class="cstat-no" title="statement not covered" > return chunks;</span>
1081
+ }
1082
+ &nbsp;
1083
+ /**
1084
+ * Chia nhỏ file lớn
1085
+ */
1086
+ async chunkLargeFile(fileContent, filePath) {
1087
+ const lines = fileContent.split('\n');
1088
+ const chunks = [];
1089
+ let currentChunk = '';
1090
+ let currentTokens = 0;
1091
+ let chunkIndex = 0;
1092
+
1093
+ // Thêm header cho file
1094
+ const header = `\n=== Large File: ${filePath} (Part {part}) ===\n`;
1095
+
1096
+ for (const line of lines) {
1097
+ const lineTokens = this.countTokens(line + '\n');
1098
+
1099
+ if (currentTokens + lineTokens &gt; this.options.maxTokens - 100 &amp;&amp; currentChunk) { // Reserve 100 tokens for header
1100
+ const partHeader = header.replace('{part}', (chunkIndex + 1).toString());
1101
+ chunks.push({
1102
+ content: partHeader + currentChunk.trim(),
1103
+ tokens: this.countTokens(partHeader + currentChunk.trim()),
1104
+ chunkIndex: chunkIndex++,
1105
+ totalChunks: 0,
1106
+ metadata: {
1107
+ filePath,
1108
+ partNumber: chunkIndex + 1,
1109
+ type: 'large-file-part'
1110
+ }
1111
+ });
1112
+
1113
+ currentChunk = '';
1114
+ currentTokens = 0;
1115
+ }
1116
+
1117
+ currentChunk += line + '\n';
1118
+ currentTokens += lineTokens;
1119
+ }
1120
+
1121
+ // Thêm chunk cuối cùng
1122
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (currentChunk.trim()) {
1123
+ const partHeader = header.replace('{part}', (chunkIndex + 1).toString());
1124
+ chunks.push({
1125
+ content: partHeader + currentChunk.trim(),
1126
+ tokens: this.countTokens(partHeader + currentChunk.trim()),
1127
+ chunkIndex: chunkIndex++,
1128
+ totalChunks: 0,
1129
+ metadata: {
1130
+ filePath,
1131
+ partNumber: chunkIndex + 1,
1132
+ type: 'large-file-part'
1133
+ }
1134
+ });
1135
+ }
1136
+
1137
+ // Update totalChunks
1138
+ chunks.forEach(chunk =&gt; {
1139
+ chunk.totalChunks = chunks.length;
1140
+ });
1141
+
1142
+ return chunks;
1143
+ }
1144
+ &nbsp;
1145
+ /**
1146
+ * Tìm file boundaries trong content
1147
+ */
1148
+ findFileBoundaries(lines) {
1149
+ const boundaries = [];
1150
+ let currentStart = 0;
1151
+ let currentFilePath = null;
1152
+
1153
+ for (let i = 0; i &lt; lines.length; i++) {
1154
+ const line = lines[i];
1155
+
1156
+ // Tìm file header pattern
1157
+ if (line.includes('================================================================================')) {
1158
+ if (i + 1 &lt; lines.length &amp;&amp; lines[i + 1].startsWith('File: ')) {
1159
+ // Lưu boundary trước đó
1160
+ if (currentFilePath) {
1161
+ boundaries.push({
1162
+ start: currentStart,
1163
+ end: i,
1164
+ filePath: currentFilePath
1165
+ });
1166
+ }
1167
+
1168
+ // Bắt đầu file mới
1169
+ currentStart = i;
1170
+ currentFilePath = lines[i + 1].replace('File: ', '').trim();
1171
+ }
1172
+ }
1173
+ }
1174
+
1175
+ // Thêm boundary cuối cùng
1176
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (currentFilePath) {
1177
+ boundaries.push({
1178
+ start: currentStart,
1179
+ end: lines.length,
1180
+ filePath: currentFilePath
1181
+ });
1182
+ }
1183
+
1184
+ return boundaries;
1185
+ }
1186
+ &nbsp;
1187
+ /**
1188
+ * Lấy overlap lines
1189
+ */
1190
+ <span class="fstat-no" title="function not covered" > ge</span>tOverlapLines(content, maxTokens) {
1191
+ const lines = <span class="cstat-no" title="statement not covered" >content.split('\n');</span>
1192
+ let overlapContent = <span class="cstat-no" title="statement not covered" >'';</span>
1193
+ let tokens = <span class="cstat-no" title="statement not covered" >0;</span>
1194
+
1195
+ // Lấy từ cuối lên
1196
+ <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >lines.length - 1;</span> i &gt;= 0; i--) {</span>
1197
+ const line = <span class="cstat-no" title="statement not covered" >lines[i] + '\n';</span>
1198
+ const lineTokens = <span class="cstat-no" title="statement not covered" >this.countTokens(line);</span>
1199
+
1200
+ <span class="cstat-no" title="statement not covered" > if (tokens + lineTokens &gt; maxTokens) {</span>
1201
+ <span class="cstat-no" title="statement not covered" > break;</span>
1202
+ }
1203
+
1204
+ <span class="cstat-no" title="statement not covered" > overlapContent = line + overlapContent;</span>
1205
+ <span class="cstat-no" title="statement not covered" > tokens += lineTokens;</span>
1206
+ }
1207
+
1208
+ <span class="cstat-no" title="statement not covered" > return overlapContent;</span>
1209
+ }
1210
+ &nbsp;
1211
+ /**
1212
+ * Tạo file header
1213
+ */
1214
+ generateFileHeader(file) {
1215
+ return `
1216
+ ================================================================================
1217
+ File: ${file.relativePath}
1218
+ Size: ${file.size} bytes | Lines: ${file.lines}
1219
+ ================================================================================`;
1220
+ }
1221
+ &nbsp;
1222
+ /**
1223
+ * Cleanup encoding
1224
+ */
1225
+ cleanup() {
1226
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (this.encoding) {
1227
+ this.encoding.free();
1228
+ }
1229
+ }
1230
+ }
1231
+ &nbsp;
1232
+ module.exports = TokenManager;
1233
+ &nbsp;</pre></td></tr></table></pre>
1234
+
1235
+ <div class='push'></div><!-- for sticky footer -->
1236
+ </div><!-- /wrapper -->
1237
+ <div class='footer quiet pad2 space-top1 center small'>
1238
+ Code coverage generated by
1239
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1240
+ at 2025-09-09T15:56:06.620Z
1241
+ </div>
1242
+ <script src="../../prettify.js"></script>
1243
+ <script>
1244
+ window.onload = function () {
1245
+ prettyPrint();
1246
+ };
1247
+ </script>
1248
+ <script src="../../sorter.js"></script>
1249
+ <script src="../../block-navigation.js"></script>
1250
+ </body>
1251
+ </html>
1252
+