slimjson 1.1.1 → 1.1.2

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.
@@ -0,0 +1,1630 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for compress.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> compress.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">100% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>354/354</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">100% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>295/295</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'>33/33</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">100% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>266/266</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 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>
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>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
582
+ <span class="cline-any cline-neutral">&nbsp;</span>
583
+ <span class="cline-any cline-neutral">&nbsp;</span>
584
+ <span class="cline-any cline-neutral">&nbsp;</span>
585
+ <span class="cline-any cline-neutral">&nbsp;</span>
586
+ <span class="cline-any cline-neutral">&nbsp;</span>
587
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
591
+ <span class="cline-any cline-neutral">&nbsp;</span>
592
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">34x</span>
596
+ <span class="cline-any cline-yes">32x</span>
597
+ <span class="cline-any cline-yes">32x</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">32x</span>
601
+ <span class="cline-any cline-neutral">&nbsp;</span>
602
+ <span class="cline-any cline-yes">32x</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">32x</span>
606
+ <span class="cline-any cline-yes">16x</span>
607
+ <span class="cline-any cline-yes">16x</span>
608
+ <span class="cline-any cline-yes">16x</span>
609
+ <span class="cline-any cline-yes">36x</span>
610
+ <span class="cline-any cline-neutral">&nbsp;</span>
611
+ <span class="cline-any cline-yes">16x</span>
612
+ <span class="cline-any cline-yes">28x</span>
613
+ <span class="cline-any cline-yes">28x</span>
614
+ <span class="cline-any cline-yes">6x</span>
615
+ <span class="cline-any cline-yes">6x</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-yes">16x</span>
619
+ <span class="cline-any cline-neutral">&nbsp;</span>
620
+ <span class="cline-any cline-neutral">&nbsp;</span>
621
+ <span class="cline-any cline-neutral">&nbsp;</span>
622
+ <span class="cline-any cline-yes">16x</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-yes">117x</span>
630
+ <span class="cline-any cline-yes">115x</span>
631
+ <span class="cline-any cline-yes">113x</span>
632
+ <span class="cline-any cline-yes">113x</span>
633
+ <span class="cline-any cline-neutral">&nbsp;</span>
634
+ <span class="cline-any cline-yes">81x</span>
635
+ <span class="cline-any cline-neutral">&nbsp;</span>
636
+ <span class="cline-any cline-yes">32x</span>
637
+ <span class="cline-any cline-neutral">&nbsp;</span>
638
+ <span class="cline-any cline-yes">20x</span>
639
+ <span class="cline-any cline-yes">20x</span>
640
+ <span class="cline-any cline-yes">36x</span>
641
+ <span class="cline-any cline-yes">36x</span>
642
+ <span class="cline-any cline-yes">32x</span>
643
+ <span class="cline-any cline-neutral">&nbsp;</span>
644
+ <span class="cline-any cline-neutral">&nbsp;</span>
645
+ <span class="cline-any cline-yes">20x</span>
646
+ <span class="cline-any cline-neutral">&nbsp;</span>
647
+ <span class="cline-any cline-neutral">&nbsp;</span>
648
+ <span class="cline-any cline-yes">28x</span>
649
+ <span class="cline-any cline-yes">12x</span>
650
+ <span class="cline-any cline-yes">6x</span>
651
+ <span class="cline-any cline-neutral">&nbsp;</span>
652
+ <span class="cline-any cline-neutral">&nbsp;</span>
653
+ <span class="cline-any cline-yes">6x</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-yes">2x</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-neutral">&nbsp;</span>
662
+ <span class="cline-any cline-neutral">&nbsp;</span>
663
+ <span class="cline-any cline-yes">145x</span>
664
+ <span class="cline-any cline-yes">145x</span>
665
+ <span class="cline-any cline-neutral">&nbsp;</span>
666
+ <span class="cline-any cline-yes">145x</span>
667
+ <span class="cline-any cline-yes">272x</span>
668
+ <span class="cline-any cline-yes">270x</span>
669
+ <span class="cline-any cline-yes">603x</span>
670
+ <span class="cline-any cline-yes">329x</span>
671
+ <span class="cline-any cline-yes">329x</span>
672
+ <span class="cline-any cline-neutral">&nbsp;</span>
673
+ <span class="cline-any cline-yes">603x</span>
674
+ <span class="cline-any cline-yes">603x</span>
675
+ <span class="cline-any cline-yes">595x</span>
676
+ <span class="cline-any cline-neutral">&nbsp;</span>
677
+ <span class="cline-any cline-neutral">&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-yes">145x</span>
681
+ <span class="cline-any cline-yes">329x</span>
682
+ <span class="cline-any cline-yes">329x</span>
683
+ <span class="cline-any cline-neutral">&nbsp;</span>
684
+ <span class="cline-any cline-yes">323x</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-yes">323x</span>
688
+ <span class="cline-any cline-yes">42x</span>
689
+ <span class="cline-any cline-yes">22x</span>
690
+ <span class="cline-any cline-neutral">&nbsp;</span>
691
+ <span class="cline-any cline-neutral">&nbsp;</span>
692
+ <span class="cline-any cline-neutral">&nbsp;</span>
693
+ <span class="cline-any cline-yes">301x</span>
694
+ <span class="cline-any cline-neutral">&nbsp;</span>
695
+ <span class="cline-any cline-yes">56x</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">54x</span>
699
+ <span class="cline-any cline-yes">34x</span>
700
+ <span class="cline-any cline-yes">34x</span>
701
+ <span class="cline-any cline-yes">64x</span>
702
+ <span class="cline-any cline-yes">62x</span>
703
+ <span class="cline-any cline-yes">102x</span>
704
+ <span class="cline-any cline-yes">98x</span>
705
+ <span class="cline-any cline-neutral">&nbsp;</span>
706
+ <span class="cline-any cline-neutral">&nbsp;</span>
707
+ <span class="cline-any cline-neutral">&nbsp;</span>
708
+ <span class="cline-any cline-neutral">&nbsp;</span>
709
+ <span class="cline-any cline-yes">34x</span>
710
+ <span class="cline-any cline-neutral">&nbsp;</span>
711
+ <span class="cline-any cline-neutral">&nbsp;</span>
712
+ <span class="cline-any cline-neutral">&nbsp;</span>
713
+ <span class="cline-any cline-yes">20x</span>
714
+ <span class="cline-any cline-neutral">&nbsp;</span>
715
+ <span class="cline-any cline-yes">8x</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-yes">6x</span>
719
+ <span class="cline-any cline-yes">6x</span>
720
+ <span class="cline-any cline-yes">12x</span>
721
+ <span class="cline-any cline-yes">10x</span>
722
+ <span class="cline-any cline-yes">10x</span>
723
+ <span class="cline-any cline-yes">10x</span>
724
+ <span class="cline-any cline-neutral">&nbsp;</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-neutral">&nbsp;</span>
727
+ <span class="cline-any cline-yes">6x</span>
728
+ <span class="cline-any cline-neutral">&nbsp;</span>
729
+ <span class="cline-any cline-neutral">&nbsp;</span>
730
+ <span class="cline-any cline-neutral">&nbsp;</span>
731
+ <span class="cline-any cline-yes">12x</span>
732
+ <span class="cline-any cline-neutral">&nbsp;</span>
733
+ <span class="cline-any cline-neutral">&nbsp;</span>
734
+ <span class="cline-any cline-neutral">&nbsp;</span>
735
+ <span class="cline-any cline-yes">245x</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-yes">948x</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-yes">471x</span>
747
+ <span class="cline-any cline-yes">179x</span>
748
+ <span class="cline-any cline-yes">179x</span>
749
+ <span class="cline-any cline-yes">284x</span>
750
+ <span class="cline-any cline-neutral">&nbsp;</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">292x</span>
754
+ <span class="cline-any cline-yes">270x</span>
755
+ <span class="cline-any cline-neutral">&nbsp;</span>
756
+ <span class="cline-any cline-yes">758x</span>
757
+ <span class="cline-any cline-yes">626x</span>
758
+ <span class="cline-any cline-yes">626x</span>
759
+ <span class="cline-any cline-neutral">&nbsp;</span>
760
+ <span class="cline-any cline-yes">132x</span>
761
+ <span class="cline-any cline-yes">132x</span>
762
+ <span class="cline-any cline-neutral">&nbsp;</span>
763
+ <span class="cline-any cline-yes">758x</span>
764
+ <span class="cline-any cline-yes">758x</span>
765
+ <span class="cline-any cline-yes">595x</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-neutral">&nbsp;</span>
769
+ <span class="cline-any cline-neutral">&nbsp;</span>
770
+ <span class="cline-any cline-neutral">&nbsp;</span>
771
+ <span class="cline-any cline-neutral">&nbsp;</span>
772
+ <span class="cline-any cline-neutral">&nbsp;</span>
773
+ <span class="cline-any cline-yes">196x</span>
774
+ <span class="cline-any cline-yes">174x</span>
775
+ <span class="cline-any cline-yes">99x</span>
776
+ <span class="cline-any cline-yes">113x</span>
777
+ <span class="cline-any cline-neutral">&nbsp;</span>
778
+ <span class="cline-any cline-yes">10x</span>
779
+ <span class="cline-any cline-neutral">&nbsp;</span>
780
+ <span class="cline-any cline-neutral">&nbsp;</span>
781
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">580x</span>
786
+ <span class="cline-any cline-yes">546x</span>
787
+ <span class="cline-any cline-yes">234x</span>
788
+ <span class="cline-any cline-yes">57x</span>
789
+ <span class="cline-any cline-neutral">&nbsp;</span>
790
+ <span class="cline-any cline-yes">234x</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-neutral">&nbsp;</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-yes">75x</span>
802
+ <span class="cline-any cline-yes">69x</span>
803
+ <span class="cline-any cline-yes">69x</span>
804
+ <span class="cline-any cline-yes">69x</span>
805
+ <span class="cline-any cline-yes">34x</span>
806
+ <span class="cline-any cline-neutral">&nbsp;</span>
807
+ <span class="cline-any cline-yes">69x</span>
808
+ <span class="cline-any cline-neutral">&nbsp;</span>
809
+ <span class="cline-any cline-neutral">&nbsp;</span>
810
+ <span class="cline-any cline-neutral">&nbsp;</span>
811
+ <span class="cline-any cline-neutral">&nbsp;</span>
812
+ <span class="cline-any cline-neutral">&nbsp;</span>
813
+ <span class="cline-any cline-neutral">&nbsp;</span>
814
+ <span class="cline-any cline-yes">1932x</span>
815
+ <span class="cline-any cline-yes">824x</span>
816
+ <span class="cline-any cline-neutral">&nbsp;</span>
817
+ <span class="cline-any cline-neutral">&nbsp;</span>
818
+ <span class="cline-any cline-yes">800x</span>
819
+ <span class="cline-any cline-yes">293x</span>
820
+ <span class="cline-any cline-yes">483x</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-yes">507x</span>
825
+ <span class="cline-any cline-neutral">&nbsp;</span>
826
+ <span class="cline-any cline-neutral">&nbsp;</span>
827
+ <span class="cline-any cline-yes">485x</span>
828
+ <span class="cline-any cline-yes">485x</span>
829
+ <span class="cline-any cline-yes">1442x</span>
830
+ <span class="cline-any cline-neutral">&nbsp;</span>
831
+ <span class="cline-any cline-yes">1442x</span>
832
+ <span class="cline-any cline-yes">1207x</span>
833
+ <span class="cline-any cline-yes">1207x</span>
834
+ <span class="cline-any cline-yes">235x</span>
835
+ <span class="cline-any cline-yes">234x</span>
836
+ <span class="cline-any cline-yes">234x</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">1441x</span>
841
+ <span class="cline-any cline-yes">1441x</span>
842
+ <span class="cline-any cline-yes">1333x</span>
843
+ <span class="cline-any cline-neutral">&nbsp;</span>
844
+ <span class="cline-any cline-yes">485x</span>
845
+ <span class="cline-any cline-neutral">&nbsp;</span>
846
+ <span class="cline-any cline-neutral">&nbsp;</span>
847
+ <span class="cline-any cline-neutral">&nbsp;</span>
848
+ <span class="cline-any cline-neutral">&nbsp;</span>
849
+ <span class="cline-any cline-neutral">&nbsp;</span>
850
+ <span class="cline-any cline-neutral">&nbsp;</span>
851
+ <span class="cline-any cline-neutral">&nbsp;</span>
852
+ <span class="cline-any cline-yes">121x</span>
853
+ <span class="cline-any cline-yes">117x</span>
854
+ <span class="cline-any cline-yes">116x</span>
855
+ <span class="cline-any cline-neutral">&nbsp;</span>
856
+ <span class="cline-any cline-neutral">&nbsp;</span>
857
+ <span class="cline-any cline-neutral">&nbsp;</span>
858
+ <span class="cline-any cline-neutral">&nbsp;</span>
859
+ <span class="cline-any cline-neutral">&nbsp;</span>
860
+ <span class="cline-any cline-yes">831x</span>
861
+ <span class="cline-any cline-yes">830x</span>
862
+ <span class="cline-any cline-neutral">&nbsp;</span>
863
+ <span class="cline-any cline-yes">824x</span>
864
+ <span class="cline-any cline-neutral">&nbsp;</span>
865
+ <span class="cline-any cline-yes">815x</span>
866
+ <span class="cline-any cline-neutral">&nbsp;</span>
867
+ <span class="cline-any cline-yes">794x</span>
868
+ <span class="cline-any cline-yes">780x</span>
869
+ <span class="cline-any cline-neutral">&nbsp;</span>
870
+ <span class="cline-any cline-neutral">&nbsp;</span>
871
+ <span class="cline-any cline-neutral">&nbsp;</span>
872
+ <span class="cline-any cline-neutral">&nbsp;</span>
873
+ <span class="cline-any cline-neutral">&nbsp;</span>
874
+ <span class="cline-any cline-neutral">&nbsp;</span>
875
+ <span class="cline-any cline-neutral">&nbsp;</span>
876
+ <span class="cline-any cline-neutral">&nbsp;</span>
877
+ <span class="cline-any cline-neutral">&nbsp;</span>
878
+ <span class="cline-any cline-neutral">&nbsp;</span>
879
+ <span class="cline-any cline-neutral">&nbsp;</span>
880
+ <span class="cline-any cline-neutral">&nbsp;</span>
881
+ <span class="cline-any cline-neutral">&nbsp;</span>
882
+ <span class="cline-any cline-neutral">&nbsp;</span>
883
+ <span class="cline-any cline-yes">117x</span>
884
+ <span class="cline-any cline-neutral">&nbsp;</span>
885
+ <span class="cline-any cline-neutral">&nbsp;</span>
886
+ <span class="cline-any cline-neutral">&nbsp;</span>
887
+ <span class="cline-any cline-neutral">&nbsp;</span>
888
+ <span class="cline-any cline-yes">1757x</span>
889
+ <span class="cline-any cline-yes">1756x</span>
890
+ <span class="cline-any cline-yes">607x</span>
891
+ <span class="cline-any cline-yes">50x</span>
892
+ <span class="cline-any cline-neutral">&nbsp;</span>
893
+ <span class="cline-any cline-yes">1149x</span>
894
+ <span class="cline-any cline-yes">219x</span>
895
+ <span class="cline-any cline-yes">1x</span>
896
+ <span class="cline-any cline-neutral">&nbsp;</span>
897
+ <span class="cline-any cline-yes">930x</span>
898
+ <span class="cline-any cline-yes">920x</span>
899
+ <span class="cline-any cline-yes">147x</span>
900
+ <span class="cline-any cline-yes">1x</span>
901
+ <span class="cline-any cline-neutral">&nbsp;</span>
902
+ <span class="cline-any cline-neutral">&nbsp;</span>
903
+ <span class="cline-any cline-neutral">&nbsp;</span>
904
+ <span class="cline-any cline-neutral">&nbsp;</span>
905
+ <span class="cline-any cline-yes">773x</span>
906
+ <span class="cline-any cline-yes">761x</span>
907
+ <span class="cline-any cline-yes">1568x</span>
908
+ <span class="cline-any cline-yes">1416x</span>
909
+ <span class="cline-any cline-neutral">&nbsp;</span>
910
+ <span class="cline-any cline-yes">761x</span>
911
+ <span class="cline-any cline-yes">761x</span>
912
+ <span class="cline-any cline-neutral">&nbsp;</span>
913
+ <span class="cline-any cline-neutral">&nbsp;</span>
914
+ <span class="cline-any cline-yes">761x</span>
915
+ <span class="cline-any cline-yes">756x</span>
916
+ <span class="cline-any cline-neutral">&nbsp;</span>
917
+ <span class="cline-any cline-neutral">&nbsp;</span>
918
+ <span class="cline-any cline-neutral">&nbsp;</span>
919
+ <span class="cline-any cline-neutral">&nbsp;</span>
920
+ <span class="cline-any cline-yes">146x</span>
921
+ <span class="cline-any cline-yes">224x</span>
922
+ <span class="cline-any cline-yes">224x</span>
923
+ <span class="cline-any cline-neutral">&nbsp;</span>
924
+ <span class="cline-any cline-yes">146x</span>
925
+ <span class="cline-any cline-neutral">&nbsp;</span>
926
+ <span class="cline-any cline-neutral">&nbsp;</span>
927
+ <span class="cline-any cline-neutral">&nbsp;</span>
928
+ <span class="cline-any cline-neutral">&nbsp;</span>
929
+ <span class="cline-any cline-neutral">&nbsp;</span>
930
+ <span class="cline-any cline-neutral">&nbsp;</span>
931
+ <span class="cline-any cline-yes">169x</span>
932
+ <span class="cline-any cline-neutral">&nbsp;</span>
933
+ <span class="cline-any cline-neutral">&nbsp;</span>
934
+ <span class="cline-any cline-yes">7x</span>
935
+ <span class="cline-any cline-neutral">&nbsp;</span>
936
+ <span class="cline-any cline-neutral">&nbsp;</span>
937
+ <span class="cline-any cline-neutral">&nbsp;</span>
938
+ <span class="cline-any cline-yes">11366x</span>
939
+ <span class="cline-any cline-neutral">&nbsp;</span>
940
+ <span class="cline-any cline-neutral">&nbsp;</span>
941
+ <span class="cline-any cline-neutral">&nbsp;</span>
942
+ <span class="cline-any cline-neutral">&nbsp;</span>
943
+ <span class="cline-any cline-yes">24x</span>
944
+ <span class="cline-any cline-neutral">&nbsp;</span>
945
+ <span class="cline-any cline-neutral">&nbsp;</span>
946
+ <span class="cline-any cline-neutral">&nbsp;</span>
947
+ <span class="cline-any cline-yes">3075x</span>
948
+ <span class="cline-any cline-yes">3075x</span>
949
+ <span class="cline-any cline-yes">3074x</span>
950
+ <span class="cline-any cline-yes">3074x</span>
951
+ <span class="cline-any cline-yes">2996x</span>
952
+ <span class="cline-any cline-yes">2755x</span>
953
+ <span class="cline-any cline-neutral">&nbsp;</span>
954
+ <span class="cline-any cline-yes">1456x</span>
955
+ <span class="cline-any cline-yes">1448x</span>
956
+ <span class="cline-any cline-yes">1440x</span>
957
+ <span class="cline-any cline-yes">1434x</span>
958
+ <span class="cline-any cline-neutral">&nbsp;</span>
959
+ <span class="cline-any cline-yes">1035x</span>
960
+ <span class="cline-any cline-neutral">&nbsp;</span>
961
+ <span class="cline-any cline-neutral">&nbsp;</span>
962
+ <span class="cline-any cline-neutral">&nbsp;</span>
963
+ <span class="cline-any cline-yes">80x</span>
964
+ <span class="cline-any cline-yes">80x</span>
965
+ <span class="cline-any cline-yes">80x</span>
966
+ <span class="cline-any cline-yes">413x</span>
967
+ <span class="cline-any cline-yes">413x</span>
968
+ <span class="cline-any cline-yes">334x</span>
969
+ <span class="cline-any cline-yes">12x</span>
970
+ <span class="cline-any cline-yes">12x</span>
971
+ <span class="cline-any cline-yes">12x</span>
972
+ <span class="cline-any cline-yes">2x</span>
973
+ <span class="cline-any cline-yes">1x</span>
974
+ <span class="cline-any cline-yes">1x</span>
975
+ <span class="cline-any cline-yes">1x</span>
976
+ <span class="cline-any cline-yes">1x</span>
977
+ <span class="cline-any cline-yes">1x</span>
978
+ <span class="cline-any cline-yes">1x</span>
979
+ <span class="cline-any cline-yes">1x</span>
980
+ <span class="cline-any cline-neutral">&nbsp;</span>
981
+ <span class="cline-any cline-yes">2x</span>
982
+ <span class="cline-any cline-yes">2x</span>
983
+ <span class="cline-any cline-yes">2x</span>
984
+ <span class="cline-any cline-yes">2x</span>
985
+ <span class="cline-any cline-neutral">&nbsp;</span>
986
+ <span class="cline-any cline-yes">1x</span>
987
+ <span class="cline-any cline-neutral">&nbsp;</span>
988
+ <span class="cline-any cline-neutral">&nbsp;</span>
989
+ <span class="cline-any cline-yes">322x</span>
990
+ <span class="cline-any cline-neutral">&nbsp;</span>
991
+ <span class="cline-any cline-yes">334x</span>
992
+ <span class="cline-any cline-neutral">&nbsp;</span>
993
+ <span class="cline-any cline-yes">1x</span>
994
+ <span class="cline-any cline-neutral">&nbsp;</span>
995
+ <span class="cline-any cline-neutral">&nbsp;</span>
996
+ <span class="cline-any cline-neutral">&nbsp;</span>
997
+ <span class="cline-any cline-neutral">&nbsp;</span>
998
+ <span class="cline-any cline-yes">1299x</span>
999
+ <span class="cline-any cline-yes">1299x</span>
1000
+ <span class="cline-any cline-yes">1299x</span>
1001
+ <span class="cline-any cline-yes">1299x</span>
1002
+ <span class="cline-any cline-neutral">&nbsp;</span>
1003
+ <span class="cline-any cline-yes">1282x</span>
1004
+ <span class="cline-any cline-yes">2768x</span>
1005
+ <span class="cline-any cline-yes">2768x</span>
1006
+ <span class="cline-any cline-neutral">&nbsp;</span>
1007
+ <span class="cline-any cline-yes">2768x</span>
1008
+ <span class="cline-any cline-neutral">&nbsp;</span>
1009
+ <span class="cline-any cline-yes">228x</span>
1010
+ <span class="cline-any cline-yes">48x</span>
1011
+ <span class="cline-any cline-yes">48x</span>
1012
+ <span class="cline-any cline-yes">48x</span>
1013
+ <span class="cline-any cline-neutral">&nbsp;</span>
1014
+ <span class="cline-any cline-yes">180x</span>
1015
+ <span class="cline-any cline-yes">180x</span>
1016
+ <span class="cline-any cline-yes">180x</span>
1017
+ <span class="cline-any cline-yes">180x</span>
1018
+ <span class="cline-any cline-yes">25x</span>
1019
+ <span class="cline-any cline-yes">25x</span>
1020
+ <span class="cline-any cline-yes">25x</span>
1021
+ <span class="cline-any cline-neutral">&nbsp;</span>
1022
+ <span class="cline-any cline-yes">155x</span>
1023
+ <span class="cline-any cline-neutral">&nbsp;</span>
1024
+ <span class="cline-any cline-neutral">&nbsp;</span>
1025
+ <span class="cline-any cline-yes">2540x</span>
1026
+ <span class="cline-any cline-yes">2539x</span>
1027
+ <span class="cline-any cline-neutral">&nbsp;</span>
1028
+ <span class="cline-any cline-yes">2539x</span>
1029
+ <span class="cline-any cline-yes">1332x</span>
1030
+ <span class="cline-any cline-yes">1x</span>
1031
+ <span class="cline-any cline-neutral">&nbsp;</span>
1032
+ <span class="cline-any cline-neutral">&nbsp;</span>
1033
+ <span class="cline-any cline-neutral">&nbsp;</span>
1034
+ <span class="cline-any cline-neutral">&nbsp;</span>
1035
+ <span class="cline-any cline-yes">241x</span>
1036
+ <span class="cline-any cline-yes">241x</span>
1037
+ <span class="cline-any cline-yes">241x</span>
1038
+ <span class="cline-any cline-yes">241x</span>
1039
+ <span class="cline-any cline-neutral">&nbsp;</span>
1040
+ <span class="cline-any cline-yes">240x</span>
1041
+ <span class="cline-any cline-yes">368x</span>
1042
+ <span class="cline-any cline-neutral">&nbsp;</span>
1043
+ <span class="cline-any cline-yes">368x</span>
1044
+ <span class="cline-any cline-yes">367x</span>
1045
+ <span class="cline-any cline-yes">367x</span>
1046
+ <span class="cline-any cline-yes">366x</span>
1047
+ <span class="cline-any cline-yes">366x</span>
1048
+ <span class="cline-any cline-yes">366x</span>
1049
+ <span class="cline-any cline-yes">366x</span>
1050
+ <span class="cline-any cline-yes">366x</span>
1051
+ <span class="cline-any cline-yes">129x</span>
1052
+ <span class="cline-any cline-yes">1x</span>
1053
+ <span class="cline-any cline-neutral">&nbsp;</span>
1054
+ <span class="cline-any cline-neutral">&nbsp;</span>
1055
+ <span class="cline-any cline-neutral">&nbsp;</span>
1056
+ <span class="cline-any cline-neutral">&nbsp;</span>
1057
+ <span class="cline-any cline-neutral">&nbsp;</span>
1058
+ <span class="cline-any cline-yes">1401x</span>
1059
+ <span class="cline-any cline-yes">1401x</span>
1060
+ <span class="cline-any cline-yes">5251x</span>
1061
+ <span class="cline-any cline-neutral">&nbsp;</span>
1062
+ <span class="cline-any cline-yes">1401x</span>
1063
+ <span class="cline-any cline-yes">1401x</span>
1064
+ <span class="cline-any cline-yes">1400x</span>
1065
+ <span class="cline-any cline-yes">1399x</span>
1066
+ <span class="cline-any cline-yes">1398x</span>
1067
+ <span class="cline-any cline-yes">1397x</span>
1068
+ <span class="cline-any cline-neutral">&nbsp;</span>
1069
+ <span class="cline-any cline-neutral">&nbsp;</span>
1070
+ <span class="cline-any cline-neutral">&nbsp;</span>
1071
+ <span class="cline-any cline-yes">399x</span>
1072
+ <span class="cline-any cline-yes">399x</span>
1073
+ <span class="cline-any cline-yes">661x</span>
1074
+ <span class="cline-any cline-yes">399x</span>
1075
+ <span class="cline-any cline-yes">2x</span>
1076
+ <span class="cline-any cline-yes">3x</span>
1077
+ <span class="cline-any cline-neutral">&nbsp;</span>
1078
+ <span class="cline-any cline-yes">399x</span>
1079
+ <span class="cline-any cline-yes">4x</span>
1080
+ <span class="cline-any cline-yes">4x</span>
1081
+ <span class="cline-any cline-yes">8x</span>
1082
+ <span class="cline-any cline-neutral">&nbsp;</span>
1083
+ <span class="cline-any cline-yes">399x</span>
1084
+ <span class="cline-any cline-yes">399x</span>
1085
+ <span class="cline-any cline-yes">398x</span>
1086
+ <span class="cline-any cline-neutral">&nbsp;</span>
1087
+ <span class="cline-any cline-neutral">&nbsp;</span>
1088
+ <span class="cline-any cline-yes">169x</span>
1089
+ <span class="cline-any cline-yes">163x</span>
1090
+ <span class="cline-any cline-yes">163x</span>
1091
+ <span class="cline-any cline-yes">162x</span>
1092
+ <span class="cline-any cline-neutral">&nbsp;</span>
1093
+ <span class="cline-any cline-neutral">&nbsp;</span>
1094
+ <span class="cline-any cline-yes">1x</span>
1095
+ <span class="cline-any cline-yes">1x</span>
1096
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
1097
+ * 对象数组压缩转换工具
1098
+ *
1099
+ * 支持:不同对象有不同 key(后端未返回 null 字段时)
1100
+ * - buildKeys 扫描所有对象取 key 并集
1101
+ * - 嵌套对象/数组递归时同样合并子结构
1102
+ * - 缺失的 key 在 rows 中填充 null
1103
+ */
1104
+ &nbsp;
1105
+ /**
1106
+ * 合并两个 schema(取键的并集,保持顺序)
1107
+ * 对象 schema 合并键,嵌套数组 schema 递归合并内层,原始值数组取第一个
1108
+ */
1109
+ function mergeSchemas(s1, s2) {
1110
+ if (!Array.isArray(s1) || !Array.isArray(s2)) return s1;
1111
+ const first1 = s1[0];
1112
+ const first2 = s2[0];
1113
+ &nbsp;
1114
+ // 两者都是对象 schema(元素是字符串或 {key: sub} 对象)→ 合并字段
1115
+ const isObj1 = s1.length === 0 || typeof first1 === 'string' ||
1116
+ (typeof first1 === 'object' &amp;&amp; first1 !== null &amp;&amp; !Array.isArray(first1));
1117
+ const isObj2 = s2.length === 0 || typeof first2 === 'string' ||
1118
+ (typeof first2 === 'object' &amp;&amp; first2 !== null &amp;&amp; !Array.isArray(first2));
1119
+ &nbsp;
1120
+ if (isObj1 &amp;&amp; isObj2) {
1121
+ const merged = [...s1];
1122
+ const existingKeys = new Set();
1123
+ for (const field of merged) {
1124
+ existingKeys.add(typeof field === 'string' ? field : Object.keys(field)[0]);
1125
+ }
1126
+ for (const field of s2) {
1127
+ const key = typeof field === 'string' ? field : Object.keys(field)[0];
1128
+ if (!existingKeys.has(key)) {
1129
+ merged.push(field);
1130
+ existingKeys.add(key);
1131
+ }
1132
+ }
1133
+ return merged;
1134
+ }
1135
+ &nbsp;
1136
+ // 两者都是数组(不是对象 schema)→ 递归合并第一个元素
1137
+ return [mergeSchemas(first1, first2)];
1138
+ }
1139
+ &nbsp;
1140
+ /**
1141
+ * 推断值的 schema(从所有数据中收集完整结构)
1142
+ */
1143
+ function inferSchema(value) {
1144
+ if (Array.isArray(value)) {
1145
+ if (value.length === 0) return [[]];
1146
+ const first = value[0];
1147
+ if (typeof first === 'object' &amp;&amp; first !== null &amp;&amp; !Array.isArray(first)) {
1148
+ // 对象数组
1149
+ return [inferObjectSchema(value)];
1150
+ }
1151
+ if (Array.isArray(first)) {
1152
+ // 数组的数组:对每个内层数组递归推断 schema,然后合并
1153
+ let merged = null;
1154
+ for (const inner of value) {
1155
+ const s = inferSchema(inner);
1156
+ if (s) {
1157
+ merged = merged ? mergeSchemas(merged, s) : s;
1158
+ }
1159
+ }
1160
+ return [merged || inferSchema(first)];
1161
+ }
1162
+ // 检查是否含对象(混合数组)
1163
+ const objects = value.filter(v =&gt; v &amp;&amp; typeof v === 'object' &amp;&amp; !Array.isArray(v));
1164
+ if (objects.length &gt; 0) {
1165
+ return [inferObjectSchema(objects)];
1166
+ }
1167
+ // 原始值数组 - 不压缩,由父级处理
1168
+ return;
1169
+ }
1170
+ // value 是单个对象
1171
+ return inferObjectSchema([value]);
1172
+ }
1173
+ &nbsp;
1174
+ /**
1175
+ * 从多个对象中推断对象 schema(取所有 key 的并集)
1176
+ */
1177
+ function inferObjectSchema(objects) {
1178
+ const keyOrder = [];
1179
+ const keyValues = new Map();
1180
+ &nbsp;
1181
+ for (const obj of objects) {
1182
+ if (!obj || typeof obj !== 'object' || Array.isArray(obj)) continue;
1183
+ for (const key of Object.keys(obj)) {
1184
+ if (!keyValues.has(key)) {
1185
+ keyOrder.push(key);
1186
+ keyValues.set(key, []);
1187
+ }
1188
+ const val = obj[key];
1189
+ if (val != null) {
1190
+ keyValues.get(key).push(val);
1191
+ }
1192
+ }
1193
+ }
1194
+ &nbsp;
1195
+ return keyOrder.map(key =&gt; {
1196
+ const values = keyValues.get(key);
1197
+ if (values.length === 0) return key;
1198
+ &nbsp;
1199
+ const sample = values[0];
1200
+ &nbsp;
1201
+ // 值是对象 → 递归推断对象 schema(单对象,非数组)
1202
+ if (typeof sample === 'object' &amp;&amp; sample !== null &amp;&amp; !Array.isArray(sample)) {
1203
+ const subObjects = values.filter(v =&gt; typeof v === 'object' &amp;&amp; v !== null &amp;&amp; !Array.isArray(v));
1204
+ return { [key]: inferObjectSchema(subObjects) };
1205
+ }
1206
+ &nbsp;
1207
+ // 值是数组
1208
+ if (Array.isArray(sample)) {
1209
+ // 空数组 → 无法推断,用 key 名
1210
+ if (sample.length === 0) return key;
1211
+ &nbsp;
1212
+ // 数组元素是对象 → 对象数组:{ key: [objectSchema] }
1213
+ if (typeof sample[0] === 'object' &amp;&amp; sample[0] !== null &amp;&amp; !Array.isArray(sample[0])) {
1214
+ const allItems = [];
1215
+ for (const v of values) {
1216
+ if (Array.isArray(v)) {
1217
+ for (const item of v) {
1218
+ if (item &amp;&amp; typeof item === 'object' &amp;&amp; !Array.isArray(item)) {
1219
+ allItems.push(item);
1220
+ }
1221
+ }
1222
+ }
1223
+ }
1224
+ return { [key]: [inferObjectSchema(allItems)] };
1225
+ }
1226
+ &nbsp;
1227
+ // 数组元素是数组 → 检查是否含对象
1228
+ if (Array.isArray(sample[0])) {
1229
+ // 不含对象的嵌套数组(如 [[1,2],[3,4]])→ 不压缩,直接用 key 名
1230
+ if (!containsObject(sample)) return key;
1231
+ &nbsp;
1232
+ // 含对象的嵌套数组 → 递归推断内层 schema 并合并
1233
+ let merged = null;
1234
+ for (const v of values) {
1235
+ if (Array.isArray(v)) {
1236
+ const s = inferSchema(v);
1237
+ const inner = s[0];
1238
+ merged = merged ? mergeSchemas(merged, inner) : inner;
1239
+ }
1240
+ }
1241
+ // 再包一层 [] 表示"数组的数组"
1242
+ return { [key]: [merged] };
1243
+ }
1244
+ &nbsp;
1245
+ // 原始值数组(如 ["张三","李四"])→ 不压缩,直接用 key 名
1246
+ return key;
1247
+ }
1248
+ &nbsp;
1249
+ // 原始值 → 直接用 key 名
1250
+ return key;
1251
+ });
1252
+ }
1253
+ &nbsp;
1254
+ /**
1255
+ * 使用已知 schema 压缩值为 data
1256
+ */
1257
+ function compressWithSchema(value, schema) {
1258
+ if (schema === undefined) return value;
1259
+ &nbsp;
1260
+ // schema 是 [innerSchema] → 值是数组
1261
+ if (Array.isArray(schema) &amp;&amp; schema.length === 1 &amp;&amp; Array.isArray(schema[0])) {
1262
+ const inner = schema[0];
1263
+ if (!Array.isArray(value)) return null;
1264
+ return value.map(item =&gt; compressWithSchema(item, inner));
1265
+ }
1266
+ &nbsp;
1267
+ // schema 是数组(对象 schema)→ 值是对象
1268
+ if (!value || typeof value !== 'object') return value;
1269
+ return schema.map(fieldDef =&gt; {
1270
+ let key, valueSchema;
1271
+ if (typeof fieldDef === 'string') {
1272
+ key = fieldDef;
1273
+ valueSchema = undefined;
1274
+ } else {
1275
+ key = Object.keys(fieldDef)[0];
1276
+ valueSchema = fieldDef[key];
1277
+ }
1278
+ const val = value[key];
1279
+ if (val == null) return null;
1280
+ return compressWithSchema(val, valueSchema);
1281
+ });
1282
+ }
1283
+ &nbsp;
1284
+ /**
1285
+ * 判断值是否包含对象(递归检查)
1286
+ */
1287
+ function containsObject(value) {
1288
+ if (value === null || typeof value !== 'object') return false;
1289
+ if (!Array.isArray(value)) return true;
1290
+ for (const item of value) {
1291
+ if (containsObject(item)) return true;
1292
+ }
1293
+ return false;
1294
+ }
1295
+ &nbsp;
1296
+ /**
1297
+ * 递归去掉数组尾部连续 null
1298
+ */
1299
+ function trimTrailingNullsDeep(data) {
1300
+ if (!Array.isArray(data)) return data;
1301
+ const trimmed = data.map(item =&gt; trimTrailingNullsDeep(item));
1302
+ while (trimmed.length &gt; 0 &amp;&amp; trimmed[trimmed.length - 1] === null) {
1303
+ trimmed.pop();
1304
+ }
1305
+ return trimmed;
1306
+ }
1307
+ &nbsp;
1308
+ /**
1309
+ * 压缩任意 JSON 值为 { schema, data } 格式
1310
+ * 不含对象的数组和非对象非数组的值直接返回
1311
+ * @param {any} value - 要压缩的值
1312
+ * @param {object} [options] - 选项
1313
+ * @param {boolean} [options.trimTrailingNulls=false] - 去掉数组尾部连续 null
1314
+ */
1315
+ function compress(value, options) {
1316
+ if (!containsObject(value)) return value;
1317
+ const schema = inferSchema(value);
1318
+ let data = compressWithSchema(value, schema);
1319
+ if (options &amp;&amp; options.trimTrailingNulls) {
1320
+ data = trimTrailingNullsDeep(data);
1321
+ }
1322
+ return { schema, data };
1323
+ }
1324
+ &nbsp;
1325
+ /**
1326
+ * 使用 schema 还原 data 为原始对象
1327
+ */
1328
+ function decompressWithSchema(data, schema) {
1329
+ if (schema === undefined) return data;
1330
+ if (data == null) return null;
1331
+ &nbsp;
1332
+ // schema 是 [innerSchema] → 还原为数组
1333
+ if (Array.isArray(schema) &amp;&amp; schema.length === 1 &amp;&amp; Array.isArray(schema[0])) {
1334
+ const inner = schema[0];
1335
+ return data.map(item =&gt; decompressWithSchema(item, inner));
1336
+ }
1337
+ &nbsp;
1338
+ // 原始值(混合数组中的原始元素)→ 直接返回
1339
+ if (typeof data !== 'object' || data === null) return data;
1340
+ &nbsp;
1341
+ // 对象 schema → 还原为对象
1342
+ const obj = {};
1343
+ for (let i = 0; i &lt; schema.length; i++) {
1344
+ const fieldDef = schema[i];
1345
+ let key, valueSchema;
1346
+ if (typeof fieldDef === 'string') {
1347
+ key = fieldDef;
1348
+ valueSchema = undefined;
1349
+ } else if (typeof fieldDef === 'object' &amp;&amp; fieldDef !== null) {
1350
+ key = Object.keys(fieldDef)[0];
1351
+ valueSchema = fieldDef[key];
1352
+ } else {
1353
+ continue;
1354
+ }
1355
+ const val = data[i];
1356
+ if (val === undefined) { obj[key] = null; continue; }
1357
+ obj[key] = decompressWithSchema(val, valueSchema);
1358
+ }
1359
+ return obj;
1360
+ }
1361
+ &nbsp;
1362
+ /**
1363
+ * 从 { schema, data } 还原为原始值
1364
+ * 如果输入不含 schema(直接值),原样返回
1365
+ */
1366
+ function decompress(compressed) {
1367
+ if (compressed === null || typeof compressed !== 'object' || Array.isArray(compressed)) return compressed;
1368
+ if (!('data' in compressed)) return compressed;
1369
+ return decompressWithSchema(compressed.data, compressed.schema);
1370
+ }
1371
+ /* ============================================================
1372
+ 判断字符串是否可安全省略引号
1373
+ ============================================================ */
1374
+ function isSafeBareString(s) {
1375
+ if (s === '') return false;
1376
+ if (s === 'null' || s === 'true' || s === 'false') return false;
1377
+ // 看起来像数字的不省略
1378
+ if (/^-?(0|[1-9]\d*)(\.\d+)?([eE][+-]?\d+)?$/.test(s)) return false;
1379
+ // 以数字或减号开头的也不省略(避免 parseValue 的数字分支误吞)
1380
+ if (/^[-\d]/.test(s)) return false;
1381
+ // 含分隔符、空白的不省略
1382
+ if (/[\s\[\]{},:"]/.test(s)) return false;
1383
+ return true;
1384
+ }
1385
+ &nbsp;
1386
+ /* ============================================================
1387
+ stringify / parse — 省略 null 的文本化与还原
1388
+ ============================================================ */
1389
+ &nbsp;
1390
+ /**
1391
+ * 将 compress 结果文本化
1392
+ * - 数组中的 null 被省略为逗号空槽:[null, 1, null] → [,1,]
1393
+ * - 安全的字符串省略引号:"hello" → hello
1394
+ *
1395
+ * @param {*} compressed 待序列化的值
1396
+ */
1397
+ function stringify(compressed) {
1398
+ return serializeValue(compressed);
1399
+ }
1400
+ &nbsp;
1401
+ /** 序列化单个值 */
1402
+ function serializeValue(v) {
1403
+ if (v === null || v === undefined) return 'null';
1404
+ if (typeof v === 'string') {
1405
+ if (isSafeBareString(v)) return v;
1406
+ return JSON.stringify(v);
1407
+ }
1408
+ if (typeof v === 'number') {
1409
+ if (Number.isFinite(v)) return String(v);
1410
+ return 'null'; // NaN, Infinity → null
1411
+ }
1412
+ if (typeof v === 'boolean') return String(v);
1413
+ if (Array.isArray(v)) return serializeArray(v);
1414
+ if (typeof v === 'object') return serializeObject(v);
1415
+ return 'null';
1416
+ }
1417
+ &nbsp;
1418
+ /** 序列化数组:null 变为空槽(保留逗号) */
1419
+ function serializeArray(arr) {
1420
+ if (arr.length === 0) return '[]';
1421
+ const parts = arr.map(item =&gt; {
1422
+ if (item === null || item === undefined) return '';
1423
+ return serializeValue(item);
1424
+ });
1425
+ const inner = parts.join(',');
1426
+ const result = '[' + inner + ']';
1427
+ // 特殊边界:单 null 元素无法用逗号表示
1428
+ // [,] 在本格式中代表 2 个 null,所以 [null] 必须保留 null 文字
1429
+ if (result === '[]') return '[null]';
1430
+ return result;
1431
+ }
1432
+ &nbsp;
1433
+ /** 序列化对象(用于 keys 中的嵌套结构) */
1434
+ function serializeObject(obj) {
1435
+ const pairs = Object.entries(obj).map(([k, v]) =&gt; {
1436
+ const keyStr = isSafeBareString(k) ? k : JSON.stringify(k);
1437
+ return keyStr + ':' + serializeValue(v);
1438
+ });
1439
+ return '{' + pairs.join(',') + '}';
1440
+ }
1441
+ &nbsp;
1442
+ /**
1443
+ * 解析 stringify 产生的文本,恢复省略的 null
1444
+ */
1445
+ function parse(text) {
1446
+ let pos = 0;
1447
+ &nbsp;
1448
+ function error(msg) {
1449
+ throw new Error(`Parse error at ${pos}: ${msg} — near "${text.slice(Math.max(0, pos - 5), pos + 10)}"`);
1450
+ }
1451
+ &nbsp;
1452
+ function skipWs() {
1453
+ while (pos &lt; text.length &amp;&amp; /\s/.test(text[pos])) pos++;
1454
+ }
1455
+ &nbsp;
1456
+ /** 判断字符是否为值边界(分隔符或 EOF) */
1457
+ function isBoundaryChar(c) {
1458
+ return c === undefined || /[\s\[\]{},:]/.test(c);
1459
+ }
1460
+ &nbsp;
1461
+ function parseValue() {
1462
+ skipWs();
1463
+ if (pos &gt;= text.length) error('Unexpected end');
1464
+ const ch = text[pos];
1465
+ if (ch === '"') return parseString();
1466
+ if (ch === '{') return parseObject();
1467
+ if (ch === '[') return parseArray();
1468
+ // 关键字:精确匹配且后接边界符或 EOF,否则归为裸字符串
1469
+ if (text.startsWith('null', pos) &amp;&amp; isBoundaryChar(text[pos + 4])) { pos += 4; return null; }
1470
+ if (text.startsWith('true', pos) &amp;&amp; isBoundaryChar(text[pos + 4])) { pos += 4; return true; }
1471
+ if (text.startsWith('false', pos) &amp;&amp; isBoundaryChar(text[pos + 5])) { pos += 5; return false; }
1472
+ if (ch === '-' || (ch &gt;= '0' &amp;&amp; ch &lt;= '9')) return parseNumber();
1473
+ // 裸字符串(无引号标识符)
1474
+ return parseBareString();
1475
+ }
1476
+ &nbsp;
1477
+ function parseString() {
1478
+ let result = '';
1479
+ pos++; // skip opening "
1480
+ while (pos &lt; text.length) {
1481
+ const ch = text[pos];
1482
+ if (ch === '"') { pos++; return result; }
1483
+ if (ch === '\\') {
1484
+ pos++;
1485
+ const esc = text[pos];
1486
+ switch (esc) {
1487
+ case '"': result += '"'; break;
1488
+ case '\\': result += '\\'; break;
1489
+ case '/': result += '/'; break;
1490
+ case 'b': result += '\b'; break;
1491
+ case 'f': result += '\f'; break;
1492
+ case 'n': result += '\n'; break;
1493
+ case 'r': result += '\r'; break;
1494
+ case 't': result += '\t'; break;
1495
+ case 'u': {
1496
+ const hex = text.substring(pos + 1, pos + 5);
1497
+ result += String.fromCharCode(parseInt(hex, 16));
1498
+ pos += 4;
1499
+ break;
1500
+ }
1501
+ default: result += esc;
1502
+ }
1503
+ } else {
1504
+ result += ch;
1505
+ }
1506
+ pos++;
1507
+ }
1508
+ error('Unterminated string');
1509
+ }
1510
+ &nbsp;
1511
+ /** 解析数组:逗号 = null,空槽 = null */
1512
+ function parseArray() {
1513
+ pos++; // skip [
1514
+ const result = [];
1515
+ skipWs();
1516
+ if (text[pos] === ']') { pos++; return result; }
1517
+ &nbsp;
1518
+ while (true) {
1519
+ skipWs();
1520
+ const ch = text[pos];
1521
+ &nbsp;
1522
+ if (ch === ',' || ch === ']') {
1523
+ // 空槽 → null
1524
+ if (ch === ']') {
1525
+ result.push(null);
1526
+ pos++;
1527
+ return result;
1528
+ }
1529
+ result.push(null);
1530
+ pos++; // skip comma
1531
+ skipWs();
1532
+ if (text[pos] === ']') {
1533
+ result.push(null); // 尾部空槽
1534
+ pos++;
1535
+ return result;
1536
+ }
1537
+ continue;
1538
+ }
1539
+ &nbsp;
1540
+ result.push(parseValue());
1541
+ skipWs();
1542
+ &nbsp;
1543
+ if (text[pos] === ']') { pos++; return result; }
1544
+ if (text[pos] === ',') { pos++; continue; }
1545
+ error(`Expected , or ], got: ${text[pos]}`);
1546
+ }
1547
+ }
1548
+ &nbsp;
1549
+ function parseObject() {
1550
+ pos++; // skip {
1551
+ const obj = {};
1552
+ skipWs();
1553
+ if (text[pos] === '}') { pos++; return obj; }
1554
+ &nbsp;
1555
+ while (true) {
1556
+ skipWs();
1557
+ // key 支持引号字符串或裸字符串
1558
+ const key = text[pos] === '"' ? parseString() : parseBareString();
1559
+ skipWs();
1560
+ if (text[pos] !== ':') error('Expected :');
1561
+ pos++;
1562
+ const val = parseValue();
1563
+ obj[key] = val;
1564
+ skipWs();
1565
+ if (text[pos] === '}') { pos++; return obj; }
1566
+ if (text[pos] === ',') { pos++; continue; }
1567
+ error(`Expected , or }`);
1568
+ }
1569
+ }
1570
+ &nbsp;
1571
+ /** 解析裸字符串(无引号标识符),读到分隔符或 EOF 为止 */
1572
+ function parseBareString() {
1573
+ const start = pos;
1574
+ while (pos &lt; text.length &amp;&amp; !/[\s\[\]{},:]/.test(text[pos])) {
1575
+ pos++;
1576
+ }
1577
+ const result = text.substring(start, pos);
1578
+ if (result === '') error('Expected value');
1579
+ if (result === 'null') return null;
1580
+ if (result === 'true') return true;
1581
+ if (result === 'false') return false;
1582
+ return result;
1583
+ }
1584
+ &nbsp;
1585
+ function parseNumber() {
1586
+ const start = pos;
1587
+ if (text[pos] === '-') pos++;
1588
+ while (pos &lt; text.length &amp;&amp; text[pos] &gt;= '0' &amp;&amp; text[pos] &lt;= '9') pos++;
1589
+ if (text[pos] === '.') {
1590
+ pos++;
1591
+ while (pos &lt; text.length &amp;&amp; text[pos] &gt;= '0' &amp;&amp; text[pos] &lt;= '9') pos++;
1592
+ }
1593
+ if (text[pos] === 'e' || text[pos] === 'E') {
1594
+ pos++;
1595
+ if (text[pos] === '+' || text[pos] === '-') pos++;
1596
+ while (pos &lt; text.length &amp;&amp; text[pos] &gt;= '0' &amp;&amp; text[pos] &lt;= '9') pos++;
1597
+ }
1598
+ const num = Number(text.substring(start, pos));
1599
+ if (!Number.isFinite(num)) return null;
1600
+ return num;
1601
+ }
1602
+ &nbsp;
1603
+ const result = parseValue();
1604
+ skipWs();
1605
+ if (pos &lt; text.length) error(`Unexpected trailing: "${text.slice(pos)}"`);
1606
+ return result;
1607
+ }
1608
+ &nbsp;
1609
+ module.exports = { compress, decompress, stringify, parse };
1610
+ module.exports.default = module.exports;
1611
+ &nbsp;</pre></td></tr></table></pre>
1612
+
1613
+ <div class='push'></div><!-- for sticky footer -->
1614
+ </div><!-- /wrapper -->
1615
+ <div class='footer quiet pad2 space-top1 center small'>
1616
+ Code coverage generated by
1617
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1618
+ at 2026-05-23T04:55:14.135Z
1619
+ </div>
1620
+ <script src="prettify.js"></script>
1621
+ <script>
1622
+ window.onload = function () {
1623
+ prettyPrint();
1624
+ };
1625
+ </script>
1626
+ <script src="sorter.js"></script>
1627
+ <script src="block-navigation.js"></script>
1628
+ </body>
1629
+ </html>
1630
+