islamic-date-adjustment 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1795 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for adjustmentEngine.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> adjustmentEngine.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">94.03% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>205/218</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">82.03% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>105/128</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'>36/36</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">97.2% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>174/179</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>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a></td><td class="line-coverage quiet"><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-neutral">&nbsp;</span>
642
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</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-neutral">&nbsp;</span>
649
+ <span class="cline-any cline-neutral">&nbsp;</span>
650
+ <span class="cline-any cline-neutral">&nbsp;</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-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-neutral">&nbsp;</span>
662
+ <span class="cline-any cline-neutral">&nbsp;</span>
663
+ <span class="cline-any cline-neutral">&nbsp;</span>
664
+ <span class="cline-any cline-neutral">&nbsp;</span>
665
+ <span class="cline-any cline-neutral">&nbsp;</span>
666
+ <span class="cline-any cline-neutral">&nbsp;</span>
667
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
672
+ <span class="cline-any cline-neutral">&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-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-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-yes">1x</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-neutral">&nbsp;</span>
688
+ <span class="cline-any cline-yes">1x</span>
689
+ <span class="cline-any cline-yes">1x</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-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-neutral">&nbsp;</span>
699
+ <span class="cline-any cline-neutral">&nbsp;</span>
700
+ <span class="cline-any cline-neutral">&nbsp;</span>
701
+ <span class="cline-any cline-neutral">&nbsp;</span>
702
+ <span class="cline-any cline-neutral">&nbsp;</span>
703
+ <span class="cline-any cline-neutral">&nbsp;</span>
704
+ <span class="cline-any cline-yes">92x</span>
705
+ <span class="cline-any cline-yes">92x</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-yes">92x</span>
709
+ <span class="cline-any cline-neutral">&nbsp;</span>
710
+ <span class="cline-any cline-neutral">&nbsp;</span>
711
+ <span class="cline-any cline-yes">1104x</span>
712
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">92x</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-neutral">&nbsp;</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-yes">92x</span>
727
+ <span class="cline-any cline-yes">994x</span>
728
+ <span class="cline-any cline-yes">6478x</span>
729
+ <span class="cline-any cline-yes">994x</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">92x</span>
734
+ <span class="cline-any cline-yes">1012x</span>
735
+ <span class="cline-any cline-yes">1012x</span>
736
+ <span class="cline-any cline-yes">1012x</span>
737
+ <span class="cline-any cline-yes">38x</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-yes">92x</span>
743
+ <span class="cline-any cline-yes">1012x</span>
744
+ <span class="cline-any cline-yes">1012x</span>
745
+ <span class="cline-any cline-yes">1012x</span>
746
+ <span class="cline-any cline-yes">72x</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-neutral">&nbsp;</span>
750
+ <span class="cline-any cline-neutral">&nbsp;</span>
751
+ <span class="cline-any cline-yes">92x</span>
752
+ <span class="cline-any cline-neutral">&nbsp;</span>
753
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">156x</span>
759
+ <span class="cline-any cline-yes">1872x</span>
760
+ <span class="cline-any cline-yes">1872x</span>
761
+ <span class="cline-any cline-neutral">&nbsp;</span>
762
+ <span class="cline-any cline-yes">1872x</span>
763
+ <span class="cline-any cline-neutral">&nbsp;</span>
764
+ <span class="cline-any cline-neutral">&nbsp;</span>
765
+ <span class="cline-any cline-neutral">&nbsp;</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">156x</span>
769
+ <span class="cline-any cline-yes">2x</span>
770
+ <span class="cline-any cline-no">&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">156x</span>
774
+ <span class="cline-any cline-yes">36x</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-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-neutral">&nbsp;</span>
786
+ <span class="cline-any cline-neutral">&nbsp;</span>
787
+ <span class="cline-any cline-neutral">&nbsp;</span>
788
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">36x</span>
795
+ <span class="cline-any cline-neutral">&nbsp;</span>
796
+ <span class="cline-any cline-yes">351x</span>
797
+ <span class="cline-any cline-yes">36x</span>
798
+ <span class="cline-any cline-neutral">&nbsp;</span>
799
+ <span class="cline-any cline-yes">36x</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-yes">36x</span>
803
+ <span class="cline-any cline-yes">36x</span>
804
+ <span class="cline-any cline-yes">36x</span>
805
+ <span class="cline-any cline-neutral">&nbsp;</span>
806
+ <span class="cline-any cline-yes">35x</span>
807
+ <span class="cline-any cline-neutral">&nbsp;</span>
808
+ <span class="cline-any cline-neutral">&nbsp;</span>
809
+ <span class="cline-any cline-yes">24x</span>
810
+ <span class="cline-any cline-yes">24x</span>
811
+ <span class="cline-any cline-yes">24x</span>
812
+ <span class="cline-any cline-yes">18x</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-yes">18x</span>
816
+ <span class="cline-any cline-yes">18x</span>
817
+ <span class="cline-any cline-yes">11x</span>
818
+ <span class="cline-any cline-neutral">&nbsp;</span>
819
+ <span class="cline-any cline-neutral">&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-yes">10x</span>
823
+ <span class="cline-any cline-yes">9x</span>
824
+ <span class="cline-any cline-yes">9x</span>
825
+ <span class="cline-any cline-yes">9x</span>
826
+ <span class="cline-any cline-yes">6x</span>
827
+ <span class="cline-any cline-yes">6x</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-yes">1x</span>
831
+ <span class="cline-any cline-neutral">&nbsp;</span>
832
+ <span class="cline-any cline-yes">7x</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-yes">1x</span>
836
+ <span class="cline-any cline-yes">1x</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
844
+ <span class="cline-any cline-neutral">&nbsp;</span>
845
+ <span class="cline-any cline-yes">26x</span>
846
+ <span class="cline-any cline-yes">61x</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-neutral">&nbsp;</span>
853
+ <span class="cline-any cline-neutral">&nbsp;</span>
854
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">33x</span>
859
+ <span class="cline-any cline-yes">9x</span>
860
+ <span class="cline-any cline-neutral">&nbsp;</span>
861
+ <span class="cline-any cline-neutral">&nbsp;</span>
862
+ <span class="cline-any cline-neutral">&nbsp;</span>
863
+ <span class="cline-any cline-neutral">&nbsp;</span>
864
+ <span class="cline-any cline-neutral">&nbsp;</span>
865
+ <span class="cline-any cline-neutral">&nbsp;</span>
866
+ <span class="cline-any cline-neutral">&nbsp;</span>
867
+ <span class="cline-any cline-neutral">&nbsp;</span>
868
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">24x</span>
876
+ <span class="cline-any cline-yes">23x</span>
877
+ <span class="cline-any cline-yes">21x</span>
878
+ <span class="cline-any cline-yes">21x</span>
879
+ <span class="cline-any cline-yes">21x</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-neutral">&nbsp;</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-neutral">&nbsp;</span>
889
+ <span class="cline-any cline-neutral">&nbsp;</span>
890
+ <span class="cline-any cline-yes">38x</span>
891
+ <span class="cline-any cline-yes">38x</span>
892
+ <span class="cline-any cline-neutral">&nbsp;</span>
893
+ <span class="cline-any cline-yes">37x</span>
894
+ <span class="cline-any cline-yes">37x</span>
895
+ <span class="cline-any cline-neutral">&nbsp;</span>
896
+ <span class="cline-any cline-yes">37x</span>
897
+ <span class="cline-any cline-yes">36x</span>
898
+ <span class="cline-any cline-neutral">&nbsp;</span>
899
+ <span class="cline-any cline-yes">36x</span>
900
+ <span class="cline-any cline-yes">2x</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-neutral">&nbsp;</span>
906
+ <span class="cline-any cline-neutral">&nbsp;</span>
907
+ <span class="cline-any cline-neutral">&nbsp;</span>
908
+ <span class="cline-any cline-yes">34x</span>
909
+ <span class="cline-any cline-neutral">&nbsp;</span>
910
+ <span class="cline-any cline-neutral">&nbsp;</span>
911
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
915
+ <span class="cline-any cline-neutral">&nbsp;</span>
916
+ <span class="cline-any cline-neutral">&nbsp;</span>
917
+ <span class="cline-any cline-yes">34x</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">34x</span>
921
+ <span class="cline-any cline-yes">34x</span>
922
+ <span class="cline-any cline-neutral">&nbsp;</span>
923
+ <span class="cline-any cline-yes">34x</span>
924
+ <span class="cline-any cline-yes">34x</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-yes">9x</span>
928
+ <span class="cline-any cline-yes">9x</span>
929
+ <span class="cline-any cline-yes">9x</span>
930
+ <span class="cline-any cline-neutral">&nbsp;</span>
931
+ <span class="cline-any cline-neutral">&nbsp;</span>
932
+ <span class="cline-any cline-yes">25x</span>
933
+ <span class="cline-any cline-neutral">&nbsp;</span>
934
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</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">6x</span>
944
+ <span class="cline-any cline-yes">6x</span>
945
+ <span class="cline-any cline-neutral">&nbsp;</span>
946
+ <span class="cline-any cline-yes">4x</span>
947
+ <span class="cline-any cline-yes">4x</span>
948
+ <span class="cline-any cline-neutral">&nbsp;</span>
949
+ <span class="cline-any cline-neutral">&nbsp;</span>
950
+ <span class="cline-any cline-yes">40x</span>
951
+ <span class="cline-any cline-yes">4x</span>
952
+ <span class="cline-any cline-yes">4x</span>
953
+ <span class="cline-any cline-yes">4x</span>
954
+ <span class="cline-any cline-neutral">&nbsp;</span>
955
+ <span class="cline-any cline-neutral">&nbsp;</span>
956
+ <span class="cline-any cline-yes">4x</span>
957
+ <span class="cline-any cline-yes">4x</span>
958
+ <span class="cline-any cline-yes">26x</span>
959
+ <span class="cline-any cline-neutral">&nbsp;</span>
960
+ <span class="cline-any cline-neutral">&nbsp;</span>
961
+ <span class="cline-any cline-yes">26x</span>
962
+ <span class="cline-any cline-yes">26x</span>
963
+ <span class="cline-any cline-yes">22x</span>
964
+ <span class="cline-any cline-yes">22x</span>
965
+ <span class="cline-any cline-yes">18x</span>
966
+ <span class="cline-any cline-neutral">&nbsp;</span>
967
+ <span class="cline-any cline-neutral">&nbsp;</span>
968
+ <span class="cline-any cline-neutral">&nbsp;</span>
969
+ <span class="cline-any cline-yes">26x</span>
970
+ <span class="cline-any cline-neutral">&nbsp;</span>
971
+ <span class="cline-any cline-neutral">&nbsp;</span>
972
+ <span class="cline-any cline-neutral">&nbsp;</span>
973
+ <span class="cline-any cline-neutral">&nbsp;</span>
974
+ <span class="cline-any cline-neutral">&nbsp;</span>
975
+ <span class="cline-any cline-neutral">&nbsp;</span>
976
+ <span class="cline-any cline-neutral">&nbsp;</span>
977
+ <span class="cline-any cline-neutral">&nbsp;</span>
978
+ <span class="cline-any cline-neutral">&nbsp;</span>
979
+ <span class="cline-any cline-neutral">&nbsp;</span>
980
+ <span class="cline-any cline-yes">4x</span>
981
+ <span class="cline-any cline-neutral">&nbsp;</span>
982
+ <span class="cline-any cline-neutral">&nbsp;</span>
983
+ <span class="cline-any cline-neutral">&nbsp;</span>
984
+ <span class="cline-any cline-neutral">&nbsp;</span>
985
+ <span class="cline-any cline-neutral">&nbsp;</span>
986
+ <span class="cline-any cline-neutral">&nbsp;</span>
987
+ <span class="cline-any cline-yes">127x</span>
988
+ <span class="cline-any cline-yes">127x</span>
989
+ <span class="cline-any cline-neutral">&nbsp;</span>
990
+ <span class="cline-any cline-yes">1124x</span>
991
+ <span class="cline-any cline-yes">126x</span>
992
+ <span class="cline-any cline-neutral">&nbsp;</span>
993
+ <span class="cline-any cline-yes">126x</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-neutral">&nbsp;</span>
999
+ <span class="cline-any cline-neutral">&nbsp;</span>
1000
+ <span class="cline-any cline-yes">780x</span>
1001
+ <span class="cline-any cline-yes">109x</span>
1002
+ <span class="cline-any cline-neutral">&nbsp;</span>
1003
+ <span class="cline-any cline-neutral">&nbsp;</span>
1004
+ <span class="cline-any cline-neutral">&nbsp;</span>
1005
+ <span class="cline-any cline-neutral">&nbsp;</span>
1006
+ <span class="cline-any cline-neutral">&nbsp;</span>
1007
+ <span class="cline-any cline-neutral">&nbsp;</span>
1008
+ <span class="cline-any cline-yes">228x</span>
1009
+ <span class="cline-any cline-yes">36x</span>
1010
+ <span class="cline-any cline-yes">36x</span>
1011
+ <span class="cline-any cline-neutral">&nbsp;</span>
1012
+ <span class="cline-any cline-neutral">&nbsp;</span>
1013
+ <span class="cline-any cline-neutral">&nbsp;</span>
1014
+ <span class="cline-any cline-neutral">&nbsp;</span>
1015
+ <span class="cline-any cline-neutral">&nbsp;</span>
1016
+ <span class="cline-any cline-neutral">&nbsp;</span>
1017
+ <span class="cline-any cline-yes">438x</span>
1018
+ <span class="cline-any cline-yes">58x</span>
1019
+ <span class="cline-any cline-neutral">&nbsp;</span>
1020
+ <span class="cline-any cline-neutral">&nbsp;</span>
1021
+ <span class="cline-any cline-neutral">&nbsp;</span>
1022
+ <span class="cline-any cline-neutral">&nbsp;</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">36x</span>
1026
+ <span class="cline-any cline-neutral">&nbsp;</span>
1027
+ <span class="cline-any cline-neutral">&nbsp;</span>
1028
+ <span class="cline-any cline-neutral">&nbsp;</span>
1029
+ <span class="cline-any cline-neutral">&nbsp;</span>
1030
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">360x</span>
1035
+ <span class="cline-any cline-yes">30x</span>
1036
+ <span class="cline-any cline-neutral">&nbsp;</span>
1037
+ <span class="cline-any cline-neutral">&nbsp;</span>
1038
+ <span class="cline-any cline-neutral">&nbsp;</span>
1039
+ <span class="cline-any cline-neutral">&nbsp;</span>
1040
+ <span class="cline-any cline-neutral">&nbsp;</span>
1041
+ <span class="cline-any cline-neutral">&nbsp;</span>
1042
+ <span class="cline-any cline-neutral">&nbsp;</span>
1043
+ <span class="cline-any cline-neutral">&nbsp;</span>
1044
+ <span class="cline-any cline-neutral">&nbsp;</span>
1045
+ <span class="cline-any cline-neutral">&nbsp;</span>
1046
+ <span class="cline-any cline-neutral">&nbsp;</span>
1047
+ <span class="cline-any cline-neutral">&nbsp;</span>
1048
+ <span class="cline-any cline-yes">5x</span>
1049
+ <span class="cline-any cline-yes">5x</span>
1050
+ <span class="cline-any cline-yes">27x</span>
1051
+ <span class="cline-any cline-yes">27x</span>
1052
+ <span class="cline-any cline-yes">4x</span>
1053
+ <span class="cline-any cline-yes">4x</span>
1054
+ <span class="cline-any cline-yes">4x</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">1x</span>
1059
+ <span class="cline-any cline-neutral">&nbsp;</span>
1060
+ <span class="cline-any cline-neutral">&nbsp;</span>
1061
+ <span class="cline-any cline-neutral">&nbsp;</span>
1062
+ <span class="cline-any cline-neutral">&nbsp;</span>
1063
+ <span class="cline-any cline-neutral">&nbsp;</span>
1064
+ <span class="cline-any cline-neutral">&nbsp;</span>
1065
+ <span class="cline-any cline-yes">4x</span>
1066
+ <span class="cline-any cline-yes">4x</span>
1067
+ <span class="cline-any cline-neutral">&nbsp;</span>
1068
+ <span class="cline-any cline-yes">4x</span>
1069
+ <span class="cline-any cline-yes">40x</span>
1070
+ <span class="cline-any cline-yes">40x</span>
1071
+ <span class="cline-any cline-yes">40x</span>
1072
+ <span class="cline-any cline-yes">40x</span>
1073
+ <span class="cline-any cline-yes">4x</span>
1074
+ <span class="cline-any cline-neutral">&nbsp;</span>
1075
+ <span class="cline-any cline-neutral">&nbsp;</span>
1076
+ <span class="cline-any cline-neutral">&nbsp;</span>
1077
+ <span class="cline-any cline-neutral">&nbsp;</span>
1078
+ <span class="cline-any cline-neutral">&nbsp;</span>
1079
+ <span class="cline-any cline-neutral">&nbsp;</span>
1080
+ <span class="cline-any cline-neutral">&nbsp;</span>
1081
+ <span class="cline-any cline-yes">4x</span>
1082
+ <span class="cline-any cline-neutral">&nbsp;</span>
1083
+ <span class="cline-any cline-neutral">&nbsp;</span>
1084
+ <span class="cline-any cline-neutral">&nbsp;</span>
1085
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1089
+ <span class="cline-any cline-yes">54x</span>
1090
+ <span class="cline-any cline-yes">6x</span>
1091
+ <span class="cline-any cline-yes">6x</span>
1092
+ <span class="cline-any cline-yes">6x</span>
1093
+ <span class="cline-any cline-yes">6x</span>
1094
+ <span class="cline-any cline-yes">4x</span>
1095
+ <span class="cline-any cline-neutral">&nbsp;</span>
1096
+ <span class="cline-any cline-neutral">&nbsp;</span>
1097
+ <span class="cline-any cline-neutral">&nbsp;</span>
1098
+ <span class="cline-any cline-neutral">&nbsp;</span>
1099
+ <span class="cline-any cline-neutral">&nbsp;</span>
1100
+ <span class="cline-any cline-neutral">&nbsp;</span>
1101
+ <span class="cline-any cline-neutral">&nbsp;</span>
1102
+ <span class="cline-any cline-yes">8x</span>
1103
+ <span class="cline-any cline-yes">8x</span>
1104
+ <span class="cline-any cline-neutral">&nbsp;</span>
1105
+ <span class="cline-any cline-yes">7x</span>
1106
+ <span class="cline-any cline-yes">7x</span>
1107
+ <span class="cline-any cline-neutral">&nbsp;</span>
1108
+ <span class="cline-any cline-yes">7x</span>
1109
+ <span class="cline-any cline-yes">7x</span>
1110
+ <span class="cline-any cline-neutral">&nbsp;</span>
1111
+ <span class="cline-any cline-neutral">&nbsp;</span>
1112
+ <span class="cline-any cline-yes">7x</span>
1113
+ <span class="cline-any cline-neutral">&nbsp;</span>
1114
+ <span class="cline-any cline-neutral">&nbsp;</span>
1115
+ <span class="cline-any cline-neutral">&nbsp;</span>
1116
+ <span class="cline-any cline-neutral">&nbsp;</span>
1117
+ <span class="cline-any cline-neutral">&nbsp;</span>
1118
+ <span class="cline-any cline-neutral">&nbsp;</span>
1119
+ <span class="cline-any cline-neutral">&nbsp;</span>
1120
+ <span class="cline-any cline-neutral">&nbsp;</span>
1121
+ <span class="cline-any cline-neutral">&nbsp;</span>
1122
+ <span class="cline-any cline-yes">7x</span>
1123
+ <span class="cline-any cline-yes">1x</span>
1124
+ <span class="cline-any cline-yes">1x</span>
1125
+ <span class="cline-any cline-neutral">&nbsp;</span>
1126
+ <span class="cline-any cline-neutral">&nbsp;</span>
1127
+ <span class="cline-any cline-neutral">&nbsp;</span>
1128
+ <span class="cline-any cline-yes">60x</span>
1129
+ <span class="cline-any cline-neutral">&nbsp;</span>
1130
+ <span class="cline-any cline-neutral">&nbsp;</span>
1131
+ <span class="cline-any cline-yes">6x</span>
1132
+ <span class="cline-any cline-yes">54x</span>
1133
+ <span class="cline-any cline-neutral">&nbsp;</span>
1134
+ <span class="cline-any cline-neutral">&nbsp;</span>
1135
+ <span class="cline-any cline-neutral">&nbsp;</span>
1136
+ <span class="cline-any cline-neutral">&nbsp;</span>
1137
+ <span class="cline-any cline-yes">6x</span>
1138
+ <span class="cline-any cline-yes">6x</span>
1139
+ <span class="cline-any cline-yes">6x</span>
1140
+ <span class="cline-any cline-neutral">&nbsp;</span>
1141
+ <span class="cline-any cline-yes">54x</span>
1142
+ <span class="cline-any cline-neutral">&nbsp;</span>
1143
+ <span class="cline-any cline-yes">6x</span>
1144
+ <span class="cline-any cline-yes">6x</span>
1145
+ <span class="cline-any cline-neutral">&nbsp;</span>
1146
+ <span class="cline-any cline-neutral">&nbsp;</span>
1147
+ <span class="cline-any cline-neutral">&nbsp;</span>
1148
+ <span class="cline-any cline-neutral">&nbsp;</span>
1149
+ <span class="cline-any cline-neutral">&nbsp;</span>
1150
+ <span class="cline-any cline-neutral">&nbsp;</span>
1151
+ <span class="cline-any cline-neutral">&nbsp;</span>
1152
+ <span class="cline-any cline-neutral">&nbsp;</span>
1153
+ <span class="cline-any cline-yes">6x</span>
1154
+ <span class="cline-any cline-no">&nbsp;</span>
1155
+ <span class="cline-any cline-neutral">&nbsp;</span>
1156
+ <span class="cline-any cline-no">&nbsp;</span>
1157
+ <span class="cline-any cline-neutral">&nbsp;</span>
1158
+ <span class="cline-any cline-neutral">&nbsp;</span>
1159
+ <span class="cline-any cline-neutral">&nbsp;</span>
1160
+ <span class="cline-any cline-neutral">&nbsp;</span>
1161
+ <span class="cline-any cline-neutral">&nbsp;</span>
1162
+ <span class="cline-any cline-neutral">&nbsp;</span>
1163
+ <span class="cline-any cline-no">&nbsp;</span>
1164
+ <span class="cline-any cline-neutral">&nbsp;</span>
1165
+ <span class="cline-any cline-no">&nbsp;</span>
1166
+ <span class="cline-any cline-neutral">&nbsp;</span>
1167
+ <span class="cline-any cline-neutral">&nbsp;</span>
1168
+ <span class="cline-any cline-neutral">&nbsp;</span>
1169
+ <span class="cline-any cline-yes">6x</span>
1170
+ <span class="cline-any cline-yes">12x</span>
1171
+ <span class="cline-any cline-neutral">&nbsp;</span>
1172
+ <span class="cline-any cline-neutral">&nbsp;</span>
1173
+ <span class="cline-any cline-yes">6x</span>
1174
+ <span class="cline-any cline-neutral">&nbsp;</span>
1175
+ <span class="cline-any cline-neutral">&nbsp;</span>
1176
+ <span class="cline-any cline-neutral">&nbsp;</span>
1177
+ <span class="cline-any cline-neutral">&nbsp;</span>
1178
+ <span class="cline-any cline-neutral">&nbsp;</span>
1179
+ <span class="cline-any cline-yes">25x</span>
1180
+ <span class="cline-any cline-yes">25x</span>
1181
+ <span class="cline-any cline-yes">25x</span>
1182
+ <span class="cline-any cline-neutral">&nbsp;</span>
1183
+ <span class="cline-any cline-neutral">&nbsp;</span>
1184
+ <span class="cline-any cline-neutral">&nbsp;</span>
1185
+ <span class="cline-any cline-neutral">&nbsp;</span>
1186
+ <span class="cline-any cline-yes">25x</span>
1187
+ <span class="cline-any cline-yes">25x</span>
1188
+ <span class="cline-any cline-yes">23x</span>
1189
+ <span class="cline-any cline-yes">23x</span>
1190
+ <span class="cline-any cline-yes">17x</span>
1191
+ <span class="cline-any cline-neutral">&nbsp;</span>
1192
+ <span class="cline-any cline-neutral">&nbsp;</span>
1193
+ <span class="cline-any cline-neutral">&nbsp;</span>
1194
+ <span class="cline-any cline-yes">6x</span>
1195
+ <span class="cline-any cline-neutral">&nbsp;</span>
1196
+ <span class="cline-any cline-neutral">&nbsp;</span>
1197
+ <span class="cline-any cline-neutral">&nbsp;</span>
1198
+ <span class="cline-any cline-neutral">&nbsp;</span>
1199
+ <span class="cline-any cline-neutral">&nbsp;</span>
1200
+ <span class="cline-any cline-yes">25x</span>
1201
+ <span class="cline-any cline-yes">25x</span>
1202
+ <span class="cline-any cline-neutral">&nbsp;</span>
1203
+ <span class="cline-any cline-neutral">&nbsp;</span>
1204
+ <span class="cline-any cline-neutral">&nbsp;</span>
1205
+ <span class="cline-any cline-yes">1x</span>
1206
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
1207
+ * adjustmentEngine.js
1208
+ *
1209
+ * The core brain of the utility.
1210
+ *
1211
+ * Concepts
1212
+ * --------
1213
+ * 1. **HijriYear**: an ordered list of Hijri months, each with:
1214
+ * - a standard Gregorian start date (from authority / published calendar)
1215
+ * - the number of days in that month
1216
+ * Together they form a contiguous timeline for one Hijri year.
1217
+ *
1218
+ * 2. **Global offset**: a single integer applied to EVERY month's start date
1219
+ * uniformly. E.g. offset = -2 → every month starts 2 days earlier.
1220
+ * This is what a user sets at the beginning of the year based on their
1221
+ * local moon sighting.
1222
+ *
1223
+ * 3. **Event-based adjustment**: when a specific event (e.g. Eid al-Fitr)
1224
+ * is confirmed on a date that differs from (standard + global offset),
1225
+ * we compute a *local* correction that applies FROM that event's Hijri
1226
+ * day onward — without retroactively changing days the user already
1227
+ * observed (e.g. fasting days already completed).
1228
+ *
1229
+ * Edge-case handling
1230
+ * ------------------
1231
+ * • The user has already been fasting since their adjusted Ramadan start.
1232
+ * If Eid is moved by -1, we do NOT move Ramadan start — we shorten
1233
+ * Ramadan by 1 day (29 instead of 30) or extend it by 1 day, exactly
1234
+ * as real moon-sighting works.
1235
+ * • Adjustments propagate forward: months AFTER the event get shifted,
1236
+ * months BEFORE (and days already passed) stay fixed.
1237
+ * • Multiple adjustments can stack — each one is anchored to a specific
1238
+ * event and only affects that event's day onward.
1239
+ * • Year-boundary wrapping is handled (Dhul Hijjah → next Muharram).
1240
+ */
1241
+ &nbsp;
1242
+ 'use strict';
1243
+ &nbsp;
1244
+ const {
1245
+ ISLAMIC_MONTHS,
1246
+ SPECIAL_EVENTS,
1247
+ getMonth,
1248
+ getEvent,
1249
+ parseDate,
1250
+ formatDate,
1251
+ addDays,
1252
+ diffDays,
1253
+ } = require('./islamicCalendar');
1254
+ &nbsp;
1255
+ // ──────────────────────────────────────────────
1256
+ // Islamic month length constraints
1257
+ // ──────────────────────────────────────────────
1258
+ const MIN_MONTH_DAYS = 29;
1259
+ const MAX_MONTH_DAYS = 30;
1260
+ &nbsp;
1261
+ // ──────────────────────────────────────────────
1262
+ // HijriYear class
1263
+ // ──────────────────────────────────────────────
1264
+ &nbsp;
1265
+ class HijriYear {
1266
+ /**
1267
+ * @param {number} year – Hijri year number (e.g. 1447)
1268
+ * @param {Object&lt;number, string&gt;} monthStarts
1269
+ * Map of hijriMonthIndex → "YYYY-MM-DD" Gregorian start date (standard)
1270
+ * You must supply at least month 1. Missing months are auto-computed
1271
+ * from the previous month's start + days.
1272
+ */
1273
+ constructor(year, monthStarts) {
1274
+ this.year = year;
1275
+ this.globalOffset = 0;
1276
+ &nbsp;
1277
+ // adjustments: array of { eventId, eventHijriMonth, eventHijriDay, offsetDelta }
1278
+ this.adjustments = [];
1279
+ &nbsp;
1280
+ // Build internal month array
1281
+ this._months = ISLAMIC_MONTHS.map((m) =&gt; ({
1282
+ ...m,
1283
+ standardStart: null, // Gregorian Date (before any offset)
1284
+ adjustedStart: null, // Gregorian Date (after offsets)
1285
+ adjustedDays: m.days, // may change when an event adjustment truncates/extends
1286
+ }));
1287
+ &nbsp;
1288
+ // Populate standard starts from supplied data
1289
+ this._applyMonthStarts(monthStarts);
1290
+ }
1291
+ &nbsp;
1292
+ // ──── internal: populate standard starts ────
1293
+ &nbsp;
1294
+ _applyMonthStarts(monthStarts) {
1295
+ // Set explicitly provided starts
1296
+ for (const [idx, dateStr] of Object.entries(monthStarts)) {
1297
+ const mi = Number(idx);
1298
+ const m = this._months.find((x) =&gt; x.index === mi);
1299
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (m) m.standardStart = parseDate(dateStr);
1300
+ }
1301
+ &nbsp;
1302
+ // Fill gaps forward: if month N+1 has no start, derive from month N
1303
+ for (let i = 0; i &lt; this._months.length - 1; i++) {
1304
+ const cur = this._months[i];
1305
+ const next = this._months[i + 1];
1306
+ if (cur.standardStart &amp;&amp; !next.standardStart) {
1307
+ next.standardStart = addDays(cur.standardStart, cur.days);
1308
+ }
1309
+ }
1310
+ &nbsp;
1311
+ // Fill gaps backward (in case only later months were provided)
1312
+ for (let i = this._months.length - 1; i &gt; 0; i--) {
1313
+ const cur = this._months[i];
1314
+ const prev = this._months[i - 1];
1315
+ if (cur.standardStart &amp;&amp; !prev.standardStart) {
1316
+ prev.standardStart = addDays(cur.standardStart, -prev.days);
1317
+ }
1318
+ }
1319
+ &nbsp;
1320
+ // Copy standard → adjusted (will be modified by offsets)
1321
+ this._recalculate();
1322
+ }
1323
+ &nbsp;
1324
+ // ──── recalculate all adjusted dates ────
1325
+ &nbsp;
1326
+ _recalculate() {
1327
+ // Step 1: apply global offset to every month independently, reset day counts
1328
+ for (const m of this._months) {
1329
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (m.standardStart) {
1330
+ m.adjustedStart = addDays(m.standardStart, this.globalOffset);
1331
+ }
1332
+ m.adjustedDays = m.days; // reset to standard
1333
+ }
1334
+ &nbsp;
1335
+ // Step 2: apply event-based adjustments (in chronological order)
1336
+ // Each adjustment stores the absolute target Gregorian date for the event.
1337
+ // We compute the delta fresh against the current (global-offset-applied) position.
1338
+ const sorted = [...this.adjustments].sort((a, b) =&gt; {
1339
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (a.eventHijriMonth !== b.eventHijriMonth) return a.eventHijriMonth - b.eventHijriMonth;
1340
+ <span class="cstat-no" title="statement not covered" > return a.eventHijriDay - b.eventHijriDay;</span>
1341
+ });
1342
+ &nbsp;
1343
+ for (const adj of sorted) {
1344
+ this._applyEventAdjustment(adj);
1345
+ }
1346
+ }
1347
+ &nbsp;
1348
+ /**
1349
+ * Apply a single event adjustment.
1350
+ *
1351
+ * Each adjustment stores `targetDate` — the absolute Gregorian date the user
1352
+ * wants the event to land on. We compute the delta between the target and
1353
+ * the event's *current* adjusted position (which already includes the global
1354
+ * offset and any earlier adjustments).
1355
+ *
1356
+ * Rules:
1357
+ * - The month CONTAINING the event (or the previous month for day-1 events)
1358
+ * has its `adjustedDays` changed by the delta.
1359
+ * - All months AFTER that point are re-chained forward so the calendar
1360
+ * stays contiguous.
1361
+ * - Months BEFORE the event are UNTOUCHED.
1362
+ */
1363
+ _applyEventAdjustment(adj) {
1364
+ const { eventHijriMonth, eventHijriDay, targetDate } = adj;
1365
+ &nbsp;
1366
+ const eventMonthIdx = this._months.findIndex((m) =&gt; m.index === eventHijriMonth);
1367
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (eventMonthIdx === -1) <span class="cstat-no" title="statement not covered" >return;</span>
1368
+ &nbsp;
1369
+ const eventMonth = this._months[eventMonthIdx];
1370
+ &nbsp;
1371
+ // Where does this event currently sit (after global offset + earlier adj)?
1372
+ const currentEventDate = addDays(eventMonth.adjustedStart, eventHijriDay - 1);
1373
+ const offsetDelta = diffDays(targetDate, currentEventDate);
1374
+ if (offsetDelta === 0) return; // nothing to do
1375
+ &nbsp;
1376
+ if (eventHijriDay === 1 &amp;&amp; eventMonthIdx &gt; 0) {
1377
+ // Day-1 events (e.g. Eid al-Fitr = 1 Shawwal):
1378
+ // adjust the PREVIOUS month's day count, then re-chain forward.
1379
+ const prevMonth = this._months[eventMonthIdx - 1];
1380
+ const newDays = prevMonth.adjustedDays + offsetDelta;
1381
+ HijriYear._validateMonthDays(prevMonth.name, newDays);
1382
+ prevMonth.adjustedDays = newDays;
1383
+ &nbsp;
1384
+ // Re-chain from the event month onward
1385
+ eventMonth.adjustedStart = addDays(prevMonth.adjustedStart, prevMonth.adjustedDays);
1386
+ this._rechainFrom(eventMonthIdx + 1);
1387
+ } else if (eventHijriDay &gt; 1) {
1388
+ // Mid-month events (e.g. Eid al-Adha = 10 Dhul Hijjah):
1389
+ // To move the event, we must move the month's start date.
1390
+ // The previous month absorbs the delta (its length changes)
1391
+ // so that the calendar remains contiguous.
1392
+ if (eventMonthIdx &gt; 0) {
1393
+ const prevMonth = this._months[eventMonthIdx - 1];
1394
+ const newDays = prevMonth.adjustedDays + offsetDelta;
1395
+ HijriYear._validateMonthDays(prevMonth.name, newDays);
1396
+ prevMonth.adjustedDays = newDays;
1397
+ eventMonth.adjustedStart = addDays(prevMonth.adjustedStart, prevMonth.adjustedDays);
1398
+ } else {
1399
+ // First month in the year — shift the start directly
1400
+ eventMonth.adjustedStart = addDays(eventMonth.adjustedStart, offsetDelta);
1401
+ }
1402
+ this._rechainFrom(eventMonthIdx + 1);
1403
+ } else {
1404
+ // Day 1 of month 1 (no previous month) — shift start directly
1405
+ eventMonth.adjustedStart = addDays(eventMonth.adjustedStart, offsetDelta);
1406
+ this._rechainFrom(eventMonthIdx + 1);
1407
+ }
1408
+ }
1409
+ &nbsp;
1410
+ /**
1411
+ * Re-chain month start dates from index `fromIdx` onward,
1412
+ * based on previous month's adjustedStart + adjustedDays.
1413
+ */
1414
+ _rechainFrom(fromIdx) {
1415
+ for (let i = fromIdx; i &lt; this._months.length; i++) {
1416
+ this._months[i].adjustedStart = addDays(
1417
+ this._months[i - 1].adjustedStart,
1418
+ this._months[i - 1].adjustedDays
1419
+ );
1420
+ }
1421
+ }
1422
+ &nbsp;
1423
+ /**
1424
+ * Validate that a month's day count is within Islamic calendar bounds (29–30).
1425
+ * @throws {Error} if days &lt; 29 or days &gt; 30
1426
+ */
1427
+ static _validateMonthDays(monthName, days) {
1428
+ if (days &lt; MIN_MONTH_DAYS || days &gt; MAX_MONTH_DAYS) {
1429
+ throw new Error(
1430
+ `Invalid adjustment: ${monthName} would have ${days} days, ` +
1431
+ `but Islamic months must be ${MIN_MONTH_DAYS}–${MAX_MONTH_DAYS} days.`
1432
+ );
1433
+ }
1434
+ }
1435
+ &nbsp;
1436
+ // ══════════════════════════════════════════════
1437
+ // PUBLIC API
1438
+ // ══════════════════════════════════════════════
1439
+ &nbsp;
1440
+ /**
1441
+ * Set the global offset (days). Positive = later, negative = earlier.
1442
+ * This replaces any previous global offset.
1443
+ */
1444
+ setGlobalOffset(offset) {
1445
+ if (!Number.isInteger(offset)) throw new Error('Offset must be an integer');
1446
+ if (Math.abs(offset) &gt; 15) throw new Error('Offset magnitude &gt; 15 days is unreasonable');
1447
+ this.globalOffset = offset;
1448
+ this._recalculate();
1449
+ return this;
1450
+ }
1451
+ &nbsp;
1452
+ /**
1453
+ * Apply an event-based adjustment.
1454
+ *
1455
+ * @param {string} eventId – one of the SPECIAL_EVENTS ids
1456
+ * @param {string} actualGregorianDate – "YYYY-MM-DD" the user says the event really falls on
1457
+ * @returns {{ adjustment, message }}
1458
+ */
1459
+ adjustEvent(eventId, actualGregorianDate) {
1460
+ const event = getEvent(eventId);
1461
+ if (!event) throw new Error(`Unknown event: "${eventId}"`);
1462
+ &nbsp;
1463
+ const currentDate = this.getEventDate(eventId);
1464
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!currentDate) <span class="cstat-no" title="statement not covered" >throw new Error(`Cannot compute current date for event "${eventId}"`);</span>
1465
+ &nbsp;
1466
+ const targetDate = parseDate(actualGregorianDate);
1467
+ const offsetDelta = diffDays(targetDate, currentDate);
1468
+ &nbsp;
1469
+ if (offsetDelta === 0) {
1470
+ return {
1471
+ adjustment: null,
1472
+ message: `${event.name} is already on ${formatDate(currentDate)}. No adjustment needed.`,
1473
+ };
1474
+ }
1475
+ &nbsp;
1476
+ // Store the adjustment as an absolute target date so that
1477
+ // _recalculate() can always recompute deltas from scratch.
1478
+ const adj = {
1479
+ eventId,
1480
+ eventHijriMonth: event.hijriMonth,
1481
+ eventHijriDay: event.hijriDay,
1482
+ targetDate, // absolute Date object
1483
+ offsetDelta, // for display purposes only
1484
+ };
1485
+ &nbsp;
1486
+ // Save previous state so we can roll back on validation failure
1487
+ const prevAdjustments = [...this.adjustments];
1488
+ &nbsp;
1489
+ // Remove any previous adjustment for same event
1490
+ this.adjustments = this.adjustments.filter((a) =&gt; a.eventId !== eventId);
1491
+ this.adjustments.push(adj);
1492
+ &nbsp;
1493
+ try {
1494
+ this._recalculate();
1495
+ } catch (err) {
1496
+ // Roll back to previous state
1497
+ this.adjustments = prevAdjustments;
1498
+ this._recalculate();
1499
+ throw err;
1500
+ }
1501
+ &nbsp;
1502
+ return {
1503
+ adjustment: adj,
1504
+ message: this._buildAdjustmentSummary(event, currentDate, targetDate, offsetDelta),
1505
+ };
1506
+ }
1507
+ &nbsp;
1508
+ /**
1509
+ * Get the list of valid offsets a user can choose for an event.
1510
+ * Typically ±3 days from the current adjusted date (real-world moon sighting variance).
1511
+ */
1512
+ getValidOffsets(eventId, range = 3) {
1513
+ const event = getEvent(eventId);
1514
+ if (!event) throw new Error(`Unknown event: "${eventId}"`);
1515
+ &nbsp;
1516
+ const currentDate = this.getEventDate(eventId);
1517
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!currentDate) <span class="cstat-no" title="statement not covered" >return [];</span>
1518
+ &nbsp;
1519
+ // Determine which month absorbs the length change
1520
+ const eventMonthIdx = this._months.findIndex((m) =&gt; m.index === event.hijriMonth);
1521
+ let affectedMonth = null;
1522
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (eventMonthIdx &gt; 0) {
1523
+ affectedMonth = this._months[eventMonthIdx - 1];
1524
+ }
1525
+ &nbsp;
1526
+ const offsets = [];
1527
+ for (let d = -range; d &lt;= range; d++) {
1528
+ const date = addDays(currentDate, d);
1529
+ &nbsp;
1530
+ // Check if this offset would produce a valid month length
1531
+ let valid = true;
1532
+ if (affectedMonth &amp;&amp; d !== 0) {
1533
+ const newDays = affectedMonth.adjustedDays + d;
1534
+ if (newDays &lt; MIN_MONTH_DAYS || newDays &gt; MAX_MONTH_DAYS) {
1535
+ valid = false;
1536
+ }
1537
+ }
1538
+ &nbsp;
1539
+ offsets.push({
1540
+ offset: d,
1541
+ date: formatDate(date),
1542
+ valid,
1543
+ label: d === 0
1544
+ ? '(current)'
1545
+ : d &gt; 0
1546
+ ? `(+${d} day${d &gt; 1 ? 's' : ''})`
1547
+ : `(${d} day${d &lt; -1 ? 's' : ''})`,
1548
+ });
1549
+ }
1550
+ return offsets;
1551
+ }
1552
+ &nbsp;
1553
+ /**
1554
+ * Get the Gregorian date for a specific event, after all adjustments.
1555
+ */
1556
+ getEventDate(eventId) {
1557
+ const event = getEvent(eventId);
1558
+ if (!event) return null;
1559
+ &nbsp;
1560
+ const month = this._months.find((m) =&gt; m.index === event.hijriMonth);
1561
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!month || !month.adjustedStart) <span class="cstat-no" title="statement not covered" >return null;</span>
1562
+ &nbsp;
1563
+ return addDays(month.adjustedStart, event.hijriDay - 1);
1564
+ }
1565
+ &nbsp;
1566
+ /**
1567
+ * Get the adjusted start date of a Hijri month (by index 1-12).
1568
+ */
1569
+ getMonthStart(hijriMonthIndex) {
1570
+ const m = this._months.find((x) =&gt; x.index === hijriMonthIndex);
1571
+ return m ? m.adjustedStart : null;
1572
+ }
1573
+ &nbsp;
1574
+ /**
1575
+ * Get the adjusted end date of a Hijri month (last day).
1576
+ */
1577
+ getMonthEnd(hijriMonthIndex) {
1578
+ const m = this._months.find((x) =&gt; x.index === hijriMonthIndex);
1579
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!m || !m.adjustedStart) <span class="cstat-no" title="statement not covered" >return null;</span>
1580
+ return addDays(m.adjustedStart, m.adjustedDays - 1);
1581
+ }
1582
+ &nbsp;
1583
+ /**
1584
+ * Get the adjusted number of days in a Hijri month.
1585
+ */
1586
+ getMonthDays(hijriMonthIndex) {
1587
+ const m = this._months.find((x) =&gt; x.index === hijriMonthIndex);
1588
+ return m ? m.adjustedDays : null;
1589
+ }
1590
+ &nbsp;
1591
+ /**
1592
+ * Return a full calendar view of the Hijri year.
1593
+ */
1594
+ getCalendar() {
1595
+ return this._months.map((m) =&gt; ({
1596
+ index: m.index,
1597
+ name: m.name,
1598
+ standardStart: m.standardStart ? formatDate(m.standardStart) : <span class="branch-1 cbranch-no" title="branch not covered" >null,</span>
1599
+ adjustedStart: m.adjustedStart ? formatDate(m.adjustedStart) : <span class="branch-1 cbranch-no" title="branch not covered" >null,</span>
1600
+ standardDays: m.days,
1601
+ adjustedDays: m.adjustedDays,
1602
+ adjustedEnd: m.adjustedStart ? formatDate(addDays(m.adjustedStart, m.adjustedDays - 1)) : <span class="branch-1 cbranch-no" title="branch not covered" >null,</span>
1603
+ events: SPECIAL_EVENTS
1604
+ .filter((e) =&gt; e.hijriMonth === m.index)
1605
+ .map((e) =&gt; ({
1606
+ ...e,
1607
+ adjustedDate: m.adjustedStart
1608
+ ? formatDate(addDays(m.adjustedStart, e.hijriDay - 1))
1609
+ : <span class="branch-1 cbranch-no" title="branch not covered" >null,</span>
1610
+ })),
1611
+ }));
1612
+ }
1613
+ &nbsp;
1614
+ /**
1615
+ * Find which Hijri month a Gregorian date falls in.
1616
+ */
1617
+ getHijriMonthForDate(gregorianDateStr) {
1618
+ const target = parseDate(gregorianDateStr);
1619
+ for (let i = this._months.length - 1; i &gt;= 0; i--) {
1620
+ const m = this._months[i];
1621
+ if (m.adjustedStart &amp;&amp; target &gt;= m.adjustedStart) {
1622
+ const dayInMonth = diffDays(target, m.adjustedStart) + 1;
1623
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (dayInMonth &lt;= m.adjustedDays) {
1624
+ return { month: m.name, monthIndex: m.index, day: dayInMonth };
1625
+ }
1626
+ }
1627
+ }
1628
+ return null;
1629
+ }
1630
+ &nbsp;
1631
+ /**
1632
+ * Get upcoming events within the next N days from a reference date.
1633
+ */
1634
+ getUpcomingEvents(referenceDateStr, withinDays = <span class="branch-0 cbranch-no" title="branch not covered" >7)</span> {
1635
+ const refDate = parseDate(referenceDateStr);
1636
+ const results = [];
1637
+ &nbsp;
1638
+ for (const event of SPECIAL_EVENTS) {
1639
+ const eventDate = this.getEventDate(event.id);
1640
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!eventDate) <span class="cstat-no" title="statement not covered" >continue;</span>
1641
+ const daysUntil = diffDays(eventDate, refDate);
1642
+ if (daysUntil &gt;= 0 &amp;&amp; daysUntil &lt;= withinDays) {
1643
+ results.push({
1644
+ ...event,
1645
+ adjustedDate: formatDate(eventDate),
1646
+ daysUntil,
1647
+ });
1648
+ }
1649
+ }
1650
+ &nbsp;
1651
+ return results.sort((a, b) =&gt; a.daysUntil - b.daysUntil);
1652
+ }
1653
+ &nbsp;
1654
+ /**
1655
+ * Get the days the user has already observed in a given month
1656
+ * (from adjusted start up to and including the reference date).
1657
+ */
1658
+ getDaysObserved(hijriMonthIndex, referenceDateStr) {
1659
+ const m = this._months.find((x) =&gt; x.index === hijriMonthIndex);
1660
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!m || !m.adjustedStart) <span class="cstat-no" title="statement not covered" >return 0;</span>
1661
+ const ref = parseDate(referenceDateStr);
1662
+ const diff = diffDays(ref, m.adjustedStart);
1663
+ if (diff &lt; 0) return 0;
1664
+ return Math.min(diff + 1, m.adjustedDays);
1665
+ }
1666
+ &nbsp;
1667
+ /**
1668
+ * Simulate what would happen if an event adjustment is applied,
1669
+ * WITHOUT actually changing state. Returns impact analysis.
1670
+ */
1671
+ simulateEventAdjustment(eventId, actualGregorianDate) {
1672
+ const event = getEvent(eventId);
1673
+ if (!event) throw new Error(`Unknown event: "${eventId}"`);
1674
+ &nbsp;
1675
+ const currentDate = this.getEventDate(eventId);
1676
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!currentDate) <span class="cstat-no" title="statement not covered" >throw new Error(`Cannot compute date for event "${eventId}"`);</span>
1677
+ &nbsp;
1678
+ const targetDate = parseDate(actualGregorianDate);
1679
+ const offsetDelta = diffDays(targetDate, currentDate);
1680
+ &nbsp;
1681
+ // Build impact report
1682
+ const impact = {
1683
+ event: event.name,
1684
+ currentDate: formatDate(currentDate),
1685
+ proposedDate: actualGregorianDate,
1686
+ offsetDelta,
1687
+ affectedMonths: [],
1688
+ preservedMonths: [],
1689
+ monthLengthChanges: [],
1690
+ };
1691
+ &nbsp;
1692
+ if (offsetDelta === 0) {
1693
+ impact.noChange = true;
1694
+ return impact;
1695
+ }
1696
+ &nbsp;
1697
+ // Which month is the event in?
1698
+ const eventMonthIdx = this._months.findIndex((m) =&gt; m.index === event.hijriMonth);
1699
+ &nbsp;
1700
+ // Months before are preserved
1701
+ for (let i = 0; i &lt; eventMonthIdx; i++) {
1702
+ impact.preservedMonths.push(this._months[i].name);
1703
+ }
1704
+ &nbsp;
1705
+ // The previous month absorbs the length change for both day-1 and mid-month events
1706
+ // (except for day 1 of month 1 which has no previous month).
1707
+ if (eventMonthIdx &gt; 0) {
1708
+ const prevMonth = this._months[eventMonthIdx - 1];
1709
+ const newDays = prevMonth.adjustedDays + offsetDelta;
1710
+ // Remove the previous month from preserved list if it was added
1711
+ impact.preservedMonths = impact.preservedMonths.filter((n) =&gt; n !== prevMonth.name);
1712
+ &nbsp;
1713
+ const isValid = newDays &gt;= MIN_MONTH_DAYS &amp;&amp; newDays &lt;= MAX_MONTH_DAYS;
1714
+ impact.monthLengthChanges.push({
1715
+ month: prevMonth.name,
1716
+ originalDays: prevMonth.adjustedDays,
1717
+ newDays,
1718
+ valid: isValid,
1719
+ reason: isValid
1720
+ ? `${event.name} moved by ${offsetDelta} day(s)`
1721
+ : `${event.name} moved by ${offsetDelta} day(s) — INVALID: ${newDays} days is outside ${MIN_MONTH_DAYS}–${MAX_MONTH_DAYS} range`,
1722
+ });
1723
+ impact.valid = isValid;
1724
+ } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (event.hijriDay &gt; 1) {</span>
1725
+ // First month, mid-month event: month start shifts, no length change
1726
+ <span class="cstat-no" title="statement not covered" > impact.monthLengthChanges.push({</span>
1727
+ month: this._months[0].name,
1728
+ originalDays: this._months[0].adjustedDays,
1729
+ newDays: this._months[0].adjustedDays,
1730
+ valid: true,
1731
+ reason: `${event.name} moved by ${offsetDelta} day(s) — month start shifts`,
1732
+ });
1733
+ <span class="cstat-no" title="statement not covered" > impact.valid = true;</span>
1734
+ } else {
1735
+ <span class="cstat-no" title="statement not covered" > impact.valid = true;</span>
1736
+ }
1737
+ &nbsp;
1738
+ // Months after are shifted
1739
+ for (let i = eventMonthIdx + 1; i &lt; this._months.length; i++) {
1740
+ impact.affectedMonths.push(this._months[i].name);
1741
+ }
1742
+ &nbsp;
1743
+ return impact;
1744
+ }
1745
+ &nbsp;
1746
+ // ──── internal helpers ────
1747
+ &nbsp;
1748
+ _buildAdjustmentSummary(event, oldDate, newDate, delta) {
1749
+ const direction = delta &gt; 0 ? 'later' : 'earlier';
1750
+ const absDelta = Math.abs(delta);
1751
+ const lines = [
1752
+ `✅ ${event.name} adjusted: ${formatDate(oldDate)} → ${formatDate(newDate)} (${absDelta} day${absDelta !== 1 ? <span class="branch-0 cbranch-no" title="branch not covered" >'s' </span>: ''} ${direction})`,
1753
+ ];
1754
+ &nbsp;
1755
+ // Explain month-length impact
1756
+ const prevMonth = getMonth(event.hijriMonth - 1);
1757
+ if (prevMonth) {
1758
+ const newLen = prevMonth.days + delta;
1759
+ if (event.hijriDay === 1) {
1760
+ lines.push(
1761
+ ` 📅 ${prevMonth.name} is now ${newLen} days (was ${prevMonth.days}) to preserve your already-observed days.`
1762
+ );
1763
+ } else {
1764
+ lines.push(
1765
+ ` 📅 ${prevMonth.name} absorbs the shift: ${newLen} days (was ${prevMonth.days}).`
1766
+ );
1767
+ }
1768
+ }
1769
+ &nbsp;
1770
+ lines.push(` 📆 All months after ${getMonth(event.hijriMonth)?.name || <span class="branch-1 cbranch-no" title="branch not covered" >'this month'}</span> are shifted accordingly.`);
1771
+ return lines.join('\n');
1772
+ }
1773
+ }
1774
+ &nbsp;
1775
+ module.exports = { HijriYear };
1776
+ &nbsp;</pre></td></tr></table></pre>
1777
+
1778
+ <div class='push'></div><!-- for sticky footer -->
1779
+ </div><!-- /wrapper -->
1780
+ <div class='footer quiet pad2 space-top1 center small'>
1781
+ Code coverage generated by
1782
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1783
+ at 2026-03-18T14:14:39.359Z
1784
+ </div>
1785
+ <script src="prettify.js"></script>
1786
+ <script>
1787
+ window.onload = function () {
1788
+ prettyPrint();
1789
+ };
1790
+ </script>
1791
+ <script src="sorter.js"></script>
1792
+ <script src="block-navigation.js"></script>
1793
+ </body>
1794
+ </html>
1795
+