@arela/uploader 1.0.2 → 1.0.4
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.
- package/.env.local +316 -0
- package/.env.template +70 -0
- package/coverage/IdentifyCommand.js.html +1462 -0
- package/coverage/PropagateCommand.js.html +1507 -0
- package/coverage/PushCommand.js.html +1504 -0
- package/coverage/ScanCommand.js.html +1654 -0
- package/coverage/UploadCommand.js.html +1846 -0
- package/coverage/WatchCommand.js.html +4111 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +191 -0
- package/coverage/lcov-report/IdentifyCommand.js.html +1462 -0
- package/coverage/lcov-report/PropagateCommand.js.html +1507 -0
- package/coverage/lcov-report/PushCommand.js.html +1504 -0
- package/coverage/lcov-report/ScanCommand.js.html +1654 -0
- package/coverage/lcov-report/UploadCommand.js.html +1846 -0
- package/coverage/lcov-report/WatchCommand.js.html +4111 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +191 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov.info +1937 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/docs/API_RETRY_MECHANISM.md +338 -0
- package/docs/ARELA_IDENTIFY_IMPLEMENTATION.md +489 -0
- package/docs/ARELA_IDENTIFY_QUICKREF.md +186 -0
- package/docs/ARELA_PROPAGATE_IMPLEMENTATION.md +581 -0
- package/docs/ARELA_PROPAGATE_QUICKREF.md +272 -0
- package/docs/ARELA_PUSH_IMPLEMENTATION.md +577 -0
- package/docs/ARELA_PUSH_QUICKREF.md +322 -0
- package/docs/ARELA_SCAN_IMPLEMENTATION.md +373 -0
- package/docs/ARELA_SCAN_QUICKREF.md +139 -0
- package/docs/CROSS_PLATFORM_PATH_HANDLING.md +593 -0
- package/docs/DETECTION_ATTEMPT_TRACKING.md +414 -0
- package/docs/MIGRATION_UPLOADER_TO_FILE_STATS.md +1020 -0
- package/docs/MULTI_LEVEL_DIRECTORY_SCANNING.md +494 -0
- package/docs/STATS_COMMAND_SEQUENCE_DIAGRAM.md +287 -0
- package/docs/STATS_COMMAND_SIMPLE.md +93 -0
- package/package.json +31 -3
- package/src/commands/IdentifyCommand.js +459 -0
- package/src/commands/PropagateCommand.js +474 -0
- package/src/commands/PushCommand.js +473 -0
- package/src/commands/ScanCommand.js +523 -0
- package/src/config/config.js +154 -7
- package/src/file-detection.js +9 -10
- package/src/index.js +150 -0
- package/src/services/ScanApiService.js +645 -0
- package/src/utils/PathNormalizer.js +220 -0
- package/tests/commands/IdentifyCommand.test.js +570 -0
- package/tests/commands/PropagateCommand.test.js +568 -0
- package/tests/commands/PushCommand.test.js +754 -0
- package/tests/commands/ScanCommand.test.js +382 -0
- package/tests/unit/PathAndTableNameGeneration.test.js +1211 -0
|
@@ -0,0 +1,4111 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for WatchCommand.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> WatchCommand.js</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">0% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>0/417</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">0% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>0/182</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">0% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>0/37</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">0% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>0/412</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 low'></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>
|
|
637
|
+
<a name='L572'></a><a href='#L572'>572</a>
|
|
638
|
+
<a name='L573'></a><a href='#L573'>573</a>
|
|
639
|
+
<a name='L574'></a><a href='#L574'>574</a>
|
|
640
|
+
<a name='L575'></a><a href='#L575'>575</a>
|
|
641
|
+
<a name='L576'></a><a href='#L576'>576</a>
|
|
642
|
+
<a name='L577'></a><a href='#L577'>577</a>
|
|
643
|
+
<a name='L578'></a><a href='#L578'>578</a>
|
|
644
|
+
<a name='L579'></a><a href='#L579'>579</a>
|
|
645
|
+
<a name='L580'></a><a href='#L580'>580</a>
|
|
646
|
+
<a name='L581'></a><a href='#L581'>581</a>
|
|
647
|
+
<a name='L582'></a><a href='#L582'>582</a>
|
|
648
|
+
<a name='L583'></a><a href='#L583'>583</a>
|
|
649
|
+
<a name='L584'></a><a href='#L584'>584</a>
|
|
650
|
+
<a name='L585'></a><a href='#L585'>585</a>
|
|
651
|
+
<a name='L586'></a><a href='#L586'>586</a>
|
|
652
|
+
<a name='L587'></a><a href='#L587'>587</a>
|
|
653
|
+
<a name='L588'></a><a href='#L588'>588</a>
|
|
654
|
+
<a name='L589'></a><a href='#L589'>589</a>
|
|
655
|
+
<a name='L590'></a><a href='#L590'>590</a>
|
|
656
|
+
<a name='L591'></a><a href='#L591'>591</a>
|
|
657
|
+
<a name='L592'></a><a href='#L592'>592</a>
|
|
658
|
+
<a name='L593'></a><a href='#L593'>593</a>
|
|
659
|
+
<a name='L594'></a><a href='#L594'>594</a>
|
|
660
|
+
<a name='L595'></a><a href='#L595'>595</a>
|
|
661
|
+
<a name='L596'></a><a href='#L596'>596</a>
|
|
662
|
+
<a name='L597'></a><a href='#L597'>597</a>
|
|
663
|
+
<a name='L598'></a><a href='#L598'>598</a>
|
|
664
|
+
<a name='L599'></a><a href='#L599'>599</a>
|
|
665
|
+
<a name='L600'></a><a href='#L600'>600</a>
|
|
666
|
+
<a name='L601'></a><a href='#L601'>601</a>
|
|
667
|
+
<a name='L602'></a><a href='#L602'>602</a>
|
|
668
|
+
<a name='L603'></a><a href='#L603'>603</a>
|
|
669
|
+
<a name='L604'></a><a href='#L604'>604</a>
|
|
670
|
+
<a name='L605'></a><a href='#L605'>605</a>
|
|
671
|
+
<a name='L606'></a><a href='#L606'>606</a>
|
|
672
|
+
<a name='L607'></a><a href='#L607'>607</a>
|
|
673
|
+
<a name='L608'></a><a href='#L608'>608</a>
|
|
674
|
+
<a name='L609'></a><a href='#L609'>609</a>
|
|
675
|
+
<a name='L610'></a><a href='#L610'>610</a>
|
|
676
|
+
<a name='L611'></a><a href='#L611'>611</a>
|
|
677
|
+
<a name='L612'></a><a href='#L612'>612</a>
|
|
678
|
+
<a name='L613'></a><a href='#L613'>613</a>
|
|
679
|
+
<a name='L614'></a><a href='#L614'>614</a>
|
|
680
|
+
<a name='L615'></a><a href='#L615'>615</a>
|
|
681
|
+
<a name='L616'></a><a href='#L616'>616</a>
|
|
682
|
+
<a name='L617'></a><a href='#L617'>617</a>
|
|
683
|
+
<a name='L618'></a><a href='#L618'>618</a>
|
|
684
|
+
<a name='L619'></a><a href='#L619'>619</a>
|
|
685
|
+
<a name='L620'></a><a href='#L620'>620</a>
|
|
686
|
+
<a name='L621'></a><a href='#L621'>621</a>
|
|
687
|
+
<a name='L622'></a><a href='#L622'>622</a>
|
|
688
|
+
<a name='L623'></a><a href='#L623'>623</a>
|
|
689
|
+
<a name='L624'></a><a href='#L624'>624</a>
|
|
690
|
+
<a name='L625'></a><a href='#L625'>625</a>
|
|
691
|
+
<a name='L626'></a><a href='#L626'>626</a>
|
|
692
|
+
<a name='L627'></a><a href='#L627'>627</a>
|
|
693
|
+
<a name='L628'></a><a href='#L628'>628</a>
|
|
694
|
+
<a name='L629'></a><a href='#L629'>629</a>
|
|
695
|
+
<a name='L630'></a><a href='#L630'>630</a>
|
|
696
|
+
<a name='L631'></a><a href='#L631'>631</a>
|
|
697
|
+
<a name='L632'></a><a href='#L632'>632</a>
|
|
698
|
+
<a name='L633'></a><a href='#L633'>633</a>
|
|
699
|
+
<a name='L634'></a><a href='#L634'>634</a>
|
|
700
|
+
<a name='L635'></a><a href='#L635'>635</a>
|
|
701
|
+
<a name='L636'></a><a href='#L636'>636</a>
|
|
702
|
+
<a name='L637'></a><a href='#L637'>637</a>
|
|
703
|
+
<a name='L638'></a><a href='#L638'>638</a>
|
|
704
|
+
<a name='L639'></a><a href='#L639'>639</a>
|
|
705
|
+
<a name='L640'></a><a href='#L640'>640</a>
|
|
706
|
+
<a name='L641'></a><a href='#L641'>641</a>
|
|
707
|
+
<a name='L642'></a><a href='#L642'>642</a>
|
|
708
|
+
<a name='L643'></a><a href='#L643'>643</a>
|
|
709
|
+
<a name='L644'></a><a href='#L644'>644</a>
|
|
710
|
+
<a name='L645'></a><a href='#L645'>645</a>
|
|
711
|
+
<a name='L646'></a><a href='#L646'>646</a>
|
|
712
|
+
<a name='L647'></a><a href='#L647'>647</a>
|
|
713
|
+
<a name='L648'></a><a href='#L648'>648</a>
|
|
714
|
+
<a name='L649'></a><a href='#L649'>649</a>
|
|
715
|
+
<a name='L650'></a><a href='#L650'>650</a>
|
|
716
|
+
<a name='L651'></a><a href='#L651'>651</a>
|
|
717
|
+
<a name='L652'></a><a href='#L652'>652</a>
|
|
718
|
+
<a name='L653'></a><a href='#L653'>653</a>
|
|
719
|
+
<a name='L654'></a><a href='#L654'>654</a>
|
|
720
|
+
<a name='L655'></a><a href='#L655'>655</a>
|
|
721
|
+
<a name='L656'></a><a href='#L656'>656</a>
|
|
722
|
+
<a name='L657'></a><a href='#L657'>657</a>
|
|
723
|
+
<a name='L658'></a><a href='#L658'>658</a>
|
|
724
|
+
<a name='L659'></a><a href='#L659'>659</a>
|
|
725
|
+
<a name='L660'></a><a href='#L660'>660</a>
|
|
726
|
+
<a name='L661'></a><a href='#L661'>661</a>
|
|
727
|
+
<a name='L662'></a><a href='#L662'>662</a>
|
|
728
|
+
<a name='L663'></a><a href='#L663'>663</a>
|
|
729
|
+
<a name='L664'></a><a href='#L664'>664</a>
|
|
730
|
+
<a name='L665'></a><a href='#L665'>665</a>
|
|
731
|
+
<a name='L666'></a><a href='#L666'>666</a>
|
|
732
|
+
<a name='L667'></a><a href='#L667'>667</a>
|
|
733
|
+
<a name='L668'></a><a href='#L668'>668</a>
|
|
734
|
+
<a name='L669'></a><a href='#L669'>669</a>
|
|
735
|
+
<a name='L670'></a><a href='#L670'>670</a>
|
|
736
|
+
<a name='L671'></a><a href='#L671'>671</a>
|
|
737
|
+
<a name='L672'></a><a href='#L672'>672</a>
|
|
738
|
+
<a name='L673'></a><a href='#L673'>673</a>
|
|
739
|
+
<a name='L674'></a><a href='#L674'>674</a>
|
|
740
|
+
<a name='L675'></a><a href='#L675'>675</a>
|
|
741
|
+
<a name='L676'></a><a href='#L676'>676</a>
|
|
742
|
+
<a name='L677'></a><a href='#L677'>677</a>
|
|
743
|
+
<a name='L678'></a><a href='#L678'>678</a>
|
|
744
|
+
<a name='L679'></a><a href='#L679'>679</a>
|
|
745
|
+
<a name='L680'></a><a href='#L680'>680</a>
|
|
746
|
+
<a name='L681'></a><a href='#L681'>681</a>
|
|
747
|
+
<a name='L682'></a><a href='#L682'>682</a>
|
|
748
|
+
<a name='L683'></a><a href='#L683'>683</a>
|
|
749
|
+
<a name='L684'></a><a href='#L684'>684</a>
|
|
750
|
+
<a name='L685'></a><a href='#L685'>685</a>
|
|
751
|
+
<a name='L686'></a><a href='#L686'>686</a>
|
|
752
|
+
<a name='L687'></a><a href='#L687'>687</a>
|
|
753
|
+
<a name='L688'></a><a href='#L688'>688</a>
|
|
754
|
+
<a name='L689'></a><a href='#L689'>689</a>
|
|
755
|
+
<a name='L690'></a><a href='#L690'>690</a>
|
|
756
|
+
<a name='L691'></a><a href='#L691'>691</a>
|
|
757
|
+
<a name='L692'></a><a href='#L692'>692</a>
|
|
758
|
+
<a name='L693'></a><a href='#L693'>693</a>
|
|
759
|
+
<a name='L694'></a><a href='#L694'>694</a>
|
|
760
|
+
<a name='L695'></a><a href='#L695'>695</a>
|
|
761
|
+
<a name='L696'></a><a href='#L696'>696</a>
|
|
762
|
+
<a name='L697'></a><a href='#L697'>697</a>
|
|
763
|
+
<a name='L698'></a><a href='#L698'>698</a>
|
|
764
|
+
<a name='L699'></a><a href='#L699'>699</a>
|
|
765
|
+
<a name='L700'></a><a href='#L700'>700</a>
|
|
766
|
+
<a name='L701'></a><a href='#L701'>701</a>
|
|
767
|
+
<a name='L702'></a><a href='#L702'>702</a>
|
|
768
|
+
<a name='L703'></a><a href='#L703'>703</a>
|
|
769
|
+
<a name='L704'></a><a href='#L704'>704</a>
|
|
770
|
+
<a name='L705'></a><a href='#L705'>705</a>
|
|
771
|
+
<a name='L706'></a><a href='#L706'>706</a>
|
|
772
|
+
<a name='L707'></a><a href='#L707'>707</a>
|
|
773
|
+
<a name='L708'></a><a href='#L708'>708</a>
|
|
774
|
+
<a name='L709'></a><a href='#L709'>709</a>
|
|
775
|
+
<a name='L710'></a><a href='#L710'>710</a>
|
|
776
|
+
<a name='L711'></a><a href='#L711'>711</a>
|
|
777
|
+
<a name='L712'></a><a href='#L712'>712</a>
|
|
778
|
+
<a name='L713'></a><a href='#L713'>713</a>
|
|
779
|
+
<a name='L714'></a><a href='#L714'>714</a>
|
|
780
|
+
<a name='L715'></a><a href='#L715'>715</a>
|
|
781
|
+
<a name='L716'></a><a href='#L716'>716</a>
|
|
782
|
+
<a name='L717'></a><a href='#L717'>717</a>
|
|
783
|
+
<a name='L718'></a><a href='#L718'>718</a>
|
|
784
|
+
<a name='L719'></a><a href='#L719'>719</a>
|
|
785
|
+
<a name='L720'></a><a href='#L720'>720</a>
|
|
786
|
+
<a name='L721'></a><a href='#L721'>721</a>
|
|
787
|
+
<a name='L722'></a><a href='#L722'>722</a>
|
|
788
|
+
<a name='L723'></a><a href='#L723'>723</a>
|
|
789
|
+
<a name='L724'></a><a href='#L724'>724</a>
|
|
790
|
+
<a name='L725'></a><a href='#L725'>725</a>
|
|
791
|
+
<a name='L726'></a><a href='#L726'>726</a>
|
|
792
|
+
<a name='L727'></a><a href='#L727'>727</a>
|
|
793
|
+
<a name='L728'></a><a href='#L728'>728</a>
|
|
794
|
+
<a name='L729'></a><a href='#L729'>729</a>
|
|
795
|
+
<a name='L730'></a><a href='#L730'>730</a>
|
|
796
|
+
<a name='L731'></a><a href='#L731'>731</a>
|
|
797
|
+
<a name='L732'></a><a href='#L732'>732</a>
|
|
798
|
+
<a name='L733'></a><a href='#L733'>733</a>
|
|
799
|
+
<a name='L734'></a><a href='#L734'>734</a>
|
|
800
|
+
<a name='L735'></a><a href='#L735'>735</a>
|
|
801
|
+
<a name='L736'></a><a href='#L736'>736</a>
|
|
802
|
+
<a name='L737'></a><a href='#L737'>737</a>
|
|
803
|
+
<a name='L738'></a><a href='#L738'>738</a>
|
|
804
|
+
<a name='L739'></a><a href='#L739'>739</a>
|
|
805
|
+
<a name='L740'></a><a href='#L740'>740</a>
|
|
806
|
+
<a name='L741'></a><a href='#L741'>741</a>
|
|
807
|
+
<a name='L742'></a><a href='#L742'>742</a>
|
|
808
|
+
<a name='L743'></a><a href='#L743'>743</a>
|
|
809
|
+
<a name='L744'></a><a href='#L744'>744</a>
|
|
810
|
+
<a name='L745'></a><a href='#L745'>745</a>
|
|
811
|
+
<a name='L746'></a><a href='#L746'>746</a>
|
|
812
|
+
<a name='L747'></a><a href='#L747'>747</a>
|
|
813
|
+
<a name='L748'></a><a href='#L748'>748</a>
|
|
814
|
+
<a name='L749'></a><a href='#L749'>749</a>
|
|
815
|
+
<a name='L750'></a><a href='#L750'>750</a>
|
|
816
|
+
<a name='L751'></a><a href='#L751'>751</a>
|
|
817
|
+
<a name='L752'></a><a href='#L752'>752</a>
|
|
818
|
+
<a name='L753'></a><a href='#L753'>753</a>
|
|
819
|
+
<a name='L754'></a><a href='#L754'>754</a>
|
|
820
|
+
<a name='L755'></a><a href='#L755'>755</a>
|
|
821
|
+
<a name='L756'></a><a href='#L756'>756</a>
|
|
822
|
+
<a name='L757'></a><a href='#L757'>757</a>
|
|
823
|
+
<a name='L758'></a><a href='#L758'>758</a>
|
|
824
|
+
<a name='L759'></a><a href='#L759'>759</a>
|
|
825
|
+
<a name='L760'></a><a href='#L760'>760</a>
|
|
826
|
+
<a name='L761'></a><a href='#L761'>761</a>
|
|
827
|
+
<a name='L762'></a><a href='#L762'>762</a>
|
|
828
|
+
<a name='L763'></a><a href='#L763'>763</a>
|
|
829
|
+
<a name='L764'></a><a href='#L764'>764</a>
|
|
830
|
+
<a name='L765'></a><a href='#L765'>765</a>
|
|
831
|
+
<a name='L766'></a><a href='#L766'>766</a>
|
|
832
|
+
<a name='L767'></a><a href='#L767'>767</a>
|
|
833
|
+
<a name='L768'></a><a href='#L768'>768</a>
|
|
834
|
+
<a name='L769'></a><a href='#L769'>769</a>
|
|
835
|
+
<a name='L770'></a><a href='#L770'>770</a>
|
|
836
|
+
<a name='L771'></a><a href='#L771'>771</a>
|
|
837
|
+
<a name='L772'></a><a href='#L772'>772</a>
|
|
838
|
+
<a name='L773'></a><a href='#L773'>773</a>
|
|
839
|
+
<a name='L774'></a><a href='#L774'>774</a>
|
|
840
|
+
<a name='L775'></a><a href='#L775'>775</a>
|
|
841
|
+
<a name='L776'></a><a href='#L776'>776</a>
|
|
842
|
+
<a name='L777'></a><a href='#L777'>777</a>
|
|
843
|
+
<a name='L778'></a><a href='#L778'>778</a>
|
|
844
|
+
<a name='L779'></a><a href='#L779'>779</a>
|
|
845
|
+
<a name='L780'></a><a href='#L780'>780</a>
|
|
846
|
+
<a name='L781'></a><a href='#L781'>781</a>
|
|
847
|
+
<a name='L782'></a><a href='#L782'>782</a>
|
|
848
|
+
<a name='L783'></a><a href='#L783'>783</a>
|
|
849
|
+
<a name='L784'></a><a href='#L784'>784</a>
|
|
850
|
+
<a name='L785'></a><a href='#L785'>785</a>
|
|
851
|
+
<a name='L786'></a><a href='#L786'>786</a>
|
|
852
|
+
<a name='L787'></a><a href='#L787'>787</a>
|
|
853
|
+
<a name='L788'></a><a href='#L788'>788</a>
|
|
854
|
+
<a name='L789'></a><a href='#L789'>789</a>
|
|
855
|
+
<a name='L790'></a><a href='#L790'>790</a>
|
|
856
|
+
<a name='L791'></a><a href='#L791'>791</a>
|
|
857
|
+
<a name='L792'></a><a href='#L792'>792</a>
|
|
858
|
+
<a name='L793'></a><a href='#L793'>793</a>
|
|
859
|
+
<a name='L794'></a><a href='#L794'>794</a>
|
|
860
|
+
<a name='L795'></a><a href='#L795'>795</a>
|
|
861
|
+
<a name='L796'></a><a href='#L796'>796</a>
|
|
862
|
+
<a name='L797'></a><a href='#L797'>797</a>
|
|
863
|
+
<a name='L798'></a><a href='#L798'>798</a>
|
|
864
|
+
<a name='L799'></a><a href='#L799'>799</a>
|
|
865
|
+
<a name='L800'></a><a href='#L800'>800</a>
|
|
866
|
+
<a name='L801'></a><a href='#L801'>801</a>
|
|
867
|
+
<a name='L802'></a><a href='#L802'>802</a>
|
|
868
|
+
<a name='L803'></a><a href='#L803'>803</a>
|
|
869
|
+
<a name='L804'></a><a href='#L804'>804</a>
|
|
870
|
+
<a name='L805'></a><a href='#L805'>805</a>
|
|
871
|
+
<a name='L806'></a><a href='#L806'>806</a>
|
|
872
|
+
<a name='L807'></a><a href='#L807'>807</a>
|
|
873
|
+
<a name='L808'></a><a href='#L808'>808</a>
|
|
874
|
+
<a name='L809'></a><a href='#L809'>809</a>
|
|
875
|
+
<a name='L810'></a><a href='#L810'>810</a>
|
|
876
|
+
<a name='L811'></a><a href='#L811'>811</a>
|
|
877
|
+
<a name='L812'></a><a href='#L812'>812</a>
|
|
878
|
+
<a name='L813'></a><a href='#L813'>813</a>
|
|
879
|
+
<a name='L814'></a><a href='#L814'>814</a>
|
|
880
|
+
<a name='L815'></a><a href='#L815'>815</a>
|
|
881
|
+
<a name='L816'></a><a href='#L816'>816</a>
|
|
882
|
+
<a name='L817'></a><a href='#L817'>817</a>
|
|
883
|
+
<a name='L818'></a><a href='#L818'>818</a>
|
|
884
|
+
<a name='L819'></a><a href='#L819'>819</a>
|
|
885
|
+
<a name='L820'></a><a href='#L820'>820</a>
|
|
886
|
+
<a name='L821'></a><a href='#L821'>821</a>
|
|
887
|
+
<a name='L822'></a><a href='#L822'>822</a>
|
|
888
|
+
<a name='L823'></a><a href='#L823'>823</a>
|
|
889
|
+
<a name='L824'></a><a href='#L824'>824</a>
|
|
890
|
+
<a name='L825'></a><a href='#L825'>825</a>
|
|
891
|
+
<a name='L826'></a><a href='#L826'>826</a>
|
|
892
|
+
<a name='L827'></a><a href='#L827'>827</a>
|
|
893
|
+
<a name='L828'></a><a href='#L828'>828</a>
|
|
894
|
+
<a name='L829'></a><a href='#L829'>829</a>
|
|
895
|
+
<a name='L830'></a><a href='#L830'>830</a>
|
|
896
|
+
<a name='L831'></a><a href='#L831'>831</a>
|
|
897
|
+
<a name='L832'></a><a href='#L832'>832</a>
|
|
898
|
+
<a name='L833'></a><a href='#L833'>833</a>
|
|
899
|
+
<a name='L834'></a><a href='#L834'>834</a>
|
|
900
|
+
<a name='L835'></a><a href='#L835'>835</a>
|
|
901
|
+
<a name='L836'></a><a href='#L836'>836</a>
|
|
902
|
+
<a name='L837'></a><a href='#L837'>837</a>
|
|
903
|
+
<a name='L838'></a><a href='#L838'>838</a>
|
|
904
|
+
<a name='L839'></a><a href='#L839'>839</a>
|
|
905
|
+
<a name='L840'></a><a href='#L840'>840</a>
|
|
906
|
+
<a name='L841'></a><a href='#L841'>841</a>
|
|
907
|
+
<a name='L842'></a><a href='#L842'>842</a>
|
|
908
|
+
<a name='L843'></a><a href='#L843'>843</a>
|
|
909
|
+
<a name='L844'></a><a href='#L844'>844</a>
|
|
910
|
+
<a name='L845'></a><a href='#L845'>845</a>
|
|
911
|
+
<a name='L846'></a><a href='#L846'>846</a>
|
|
912
|
+
<a name='L847'></a><a href='#L847'>847</a>
|
|
913
|
+
<a name='L848'></a><a href='#L848'>848</a>
|
|
914
|
+
<a name='L849'></a><a href='#L849'>849</a>
|
|
915
|
+
<a name='L850'></a><a href='#L850'>850</a>
|
|
916
|
+
<a name='L851'></a><a href='#L851'>851</a>
|
|
917
|
+
<a name='L852'></a><a href='#L852'>852</a>
|
|
918
|
+
<a name='L853'></a><a href='#L853'>853</a>
|
|
919
|
+
<a name='L854'></a><a href='#L854'>854</a>
|
|
920
|
+
<a name='L855'></a><a href='#L855'>855</a>
|
|
921
|
+
<a name='L856'></a><a href='#L856'>856</a>
|
|
922
|
+
<a name='L857'></a><a href='#L857'>857</a>
|
|
923
|
+
<a name='L858'></a><a href='#L858'>858</a>
|
|
924
|
+
<a name='L859'></a><a href='#L859'>859</a>
|
|
925
|
+
<a name='L860'></a><a href='#L860'>860</a>
|
|
926
|
+
<a name='L861'></a><a href='#L861'>861</a>
|
|
927
|
+
<a name='L862'></a><a href='#L862'>862</a>
|
|
928
|
+
<a name='L863'></a><a href='#L863'>863</a>
|
|
929
|
+
<a name='L864'></a><a href='#L864'>864</a>
|
|
930
|
+
<a name='L865'></a><a href='#L865'>865</a>
|
|
931
|
+
<a name='L866'></a><a href='#L866'>866</a>
|
|
932
|
+
<a name='L867'></a><a href='#L867'>867</a>
|
|
933
|
+
<a name='L868'></a><a href='#L868'>868</a>
|
|
934
|
+
<a name='L869'></a><a href='#L869'>869</a>
|
|
935
|
+
<a name='L870'></a><a href='#L870'>870</a>
|
|
936
|
+
<a name='L871'></a><a href='#L871'>871</a>
|
|
937
|
+
<a name='L872'></a><a href='#L872'>872</a>
|
|
938
|
+
<a name='L873'></a><a href='#L873'>873</a>
|
|
939
|
+
<a name='L874'></a><a href='#L874'>874</a>
|
|
940
|
+
<a name='L875'></a><a href='#L875'>875</a>
|
|
941
|
+
<a name='L876'></a><a href='#L876'>876</a>
|
|
942
|
+
<a name='L877'></a><a href='#L877'>877</a>
|
|
943
|
+
<a name='L878'></a><a href='#L878'>878</a>
|
|
944
|
+
<a name='L879'></a><a href='#L879'>879</a>
|
|
945
|
+
<a name='L880'></a><a href='#L880'>880</a>
|
|
946
|
+
<a name='L881'></a><a href='#L881'>881</a>
|
|
947
|
+
<a name='L882'></a><a href='#L882'>882</a>
|
|
948
|
+
<a name='L883'></a><a href='#L883'>883</a>
|
|
949
|
+
<a name='L884'></a><a href='#L884'>884</a>
|
|
950
|
+
<a name='L885'></a><a href='#L885'>885</a>
|
|
951
|
+
<a name='L886'></a><a href='#L886'>886</a>
|
|
952
|
+
<a name='L887'></a><a href='#L887'>887</a>
|
|
953
|
+
<a name='L888'></a><a href='#L888'>888</a>
|
|
954
|
+
<a name='L889'></a><a href='#L889'>889</a>
|
|
955
|
+
<a name='L890'></a><a href='#L890'>890</a>
|
|
956
|
+
<a name='L891'></a><a href='#L891'>891</a>
|
|
957
|
+
<a name='L892'></a><a href='#L892'>892</a>
|
|
958
|
+
<a name='L893'></a><a href='#L893'>893</a>
|
|
959
|
+
<a name='L894'></a><a href='#L894'>894</a>
|
|
960
|
+
<a name='L895'></a><a href='#L895'>895</a>
|
|
961
|
+
<a name='L896'></a><a href='#L896'>896</a>
|
|
962
|
+
<a name='L897'></a><a href='#L897'>897</a>
|
|
963
|
+
<a name='L898'></a><a href='#L898'>898</a>
|
|
964
|
+
<a name='L899'></a><a href='#L899'>899</a>
|
|
965
|
+
<a name='L900'></a><a href='#L900'>900</a>
|
|
966
|
+
<a name='L901'></a><a href='#L901'>901</a>
|
|
967
|
+
<a name='L902'></a><a href='#L902'>902</a>
|
|
968
|
+
<a name='L903'></a><a href='#L903'>903</a>
|
|
969
|
+
<a name='L904'></a><a href='#L904'>904</a>
|
|
970
|
+
<a name='L905'></a><a href='#L905'>905</a>
|
|
971
|
+
<a name='L906'></a><a href='#L906'>906</a>
|
|
972
|
+
<a name='L907'></a><a href='#L907'>907</a>
|
|
973
|
+
<a name='L908'></a><a href='#L908'>908</a>
|
|
974
|
+
<a name='L909'></a><a href='#L909'>909</a>
|
|
975
|
+
<a name='L910'></a><a href='#L910'>910</a>
|
|
976
|
+
<a name='L911'></a><a href='#L911'>911</a>
|
|
977
|
+
<a name='L912'></a><a href='#L912'>912</a>
|
|
978
|
+
<a name='L913'></a><a href='#L913'>913</a>
|
|
979
|
+
<a name='L914'></a><a href='#L914'>914</a>
|
|
980
|
+
<a name='L915'></a><a href='#L915'>915</a>
|
|
981
|
+
<a name='L916'></a><a href='#L916'>916</a>
|
|
982
|
+
<a name='L917'></a><a href='#L917'>917</a>
|
|
983
|
+
<a name='L918'></a><a href='#L918'>918</a>
|
|
984
|
+
<a name='L919'></a><a href='#L919'>919</a>
|
|
985
|
+
<a name='L920'></a><a href='#L920'>920</a>
|
|
986
|
+
<a name='L921'></a><a href='#L921'>921</a>
|
|
987
|
+
<a name='L922'></a><a href='#L922'>922</a>
|
|
988
|
+
<a name='L923'></a><a href='#L923'>923</a>
|
|
989
|
+
<a name='L924'></a><a href='#L924'>924</a>
|
|
990
|
+
<a name='L925'></a><a href='#L925'>925</a>
|
|
991
|
+
<a name='L926'></a><a href='#L926'>926</a>
|
|
992
|
+
<a name='L927'></a><a href='#L927'>927</a>
|
|
993
|
+
<a name='L928'></a><a href='#L928'>928</a>
|
|
994
|
+
<a name='L929'></a><a href='#L929'>929</a>
|
|
995
|
+
<a name='L930'></a><a href='#L930'>930</a>
|
|
996
|
+
<a name='L931'></a><a href='#L931'>931</a>
|
|
997
|
+
<a name='L932'></a><a href='#L932'>932</a>
|
|
998
|
+
<a name='L933'></a><a href='#L933'>933</a>
|
|
999
|
+
<a name='L934'></a><a href='#L934'>934</a>
|
|
1000
|
+
<a name='L935'></a><a href='#L935'>935</a>
|
|
1001
|
+
<a name='L936'></a><a href='#L936'>936</a>
|
|
1002
|
+
<a name='L937'></a><a href='#L937'>937</a>
|
|
1003
|
+
<a name='L938'></a><a href='#L938'>938</a>
|
|
1004
|
+
<a name='L939'></a><a href='#L939'>939</a>
|
|
1005
|
+
<a name='L940'></a><a href='#L940'>940</a>
|
|
1006
|
+
<a name='L941'></a><a href='#L941'>941</a>
|
|
1007
|
+
<a name='L942'></a><a href='#L942'>942</a>
|
|
1008
|
+
<a name='L943'></a><a href='#L943'>943</a>
|
|
1009
|
+
<a name='L944'></a><a href='#L944'>944</a>
|
|
1010
|
+
<a name='L945'></a><a href='#L945'>945</a>
|
|
1011
|
+
<a name='L946'></a><a href='#L946'>946</a>
|
|
1012
|
+
<a name='L947'></a><a href='#L947'>947</a>
|
|
1013
|
+
<a name='L948'></a><a href='#L948'>948</a>
|
|
1014
|
+
<a name='L949'></a><a href='#L949'>949</a>
|
|
1015
|
+
<a name='L950'></a><a href='#L950'>950</a>
|
|
1016
|
+
<a name='L951'></a><a href='#L951'>951</a>
|
|
1017
|
+
<a name='L952'></a><a href='#L952'>952</a>
|
|
1018
|
+
<a name='L953'></a><a href='#L953'>953</a>
|
|
1019
|
+
<a name='L954'></a><a href='#L954'>954</a>
|
|
1020
|
+
<a name='L955'></a><a href='#L955'>955</a>
|
|
1021
|
+
<a name='L956'></a><a href='#L956'>956</a>
|
|
1022
|
+
<a name='L957'></a><a href='#L957'>957</a>
|
|
1023
|
+
<a name='L958'></a><a href='#L958'>958</a>
|
|
1024
|
+
<a name='L959'></a><a href='#L959'>959</a>
|
|
1025
|
+
<a name='L960'></a><a href='#L960'>960</a>
|
|
1026
|
+
<a name='L961'></a><a href='#L961'>961</a>
|
|
1027
|
+
<a name='L962'></a><a href='#L962'>962</a>
|
|
1028
|
+
<a name='L963'></a><a href='#L963'>963</a>
|
|
1029
|
+
<a name='L964'></a><a href='#L964'>964</a>
|
|
1030
|
+
<a name='L965'></a><a href='#L965'>965</a>
|
|
1031
|
+
<a name='L966'></a><a href='#L966'>966</a>
|
|
1032
|
+
<a name='L967'></a><a href='#L967'>967</a>
|
|
1033
|
+
<a name='L968'></a><a href='#L968'>968</a>
|
|
1034
|
+
<a name='L969'></a><a href='#L969'>969</a>
|
|
1035
|
+
<a name='L970'></a><a href='#L970'>970</a>
|
|
1036
|
+
<a name='L971'></a><a href='#L971'>971</a>
|
|
1037
|
+
<a name='L972'></a><a href='#L972'>972</a>
|
|
1038
|
+
<a name='L973'></a><a href='#L973'>973</a>
|
|
1039
|
+
<a name='L974'></a><a href='#L974'>974</a>
|
|
1040
|
+
<a name='L975'></a><a href='#L975'>975</a>
|
|
1041
|
+
<a name='L976'></a><a href='#L976'>976</a>
|
|
1042
|
+
<a name='L977'></a><a href='#L977'>977</a>
|
|
1043
|
+
<a name='L978'></a><a href='#L978'>978</a>
|
|
1044
|
+
<a name='L979'></a><a href='#L979'>979</a>
|
|
1045
|
+
<a name='L980'></a><a href='#L980'>980</a>
|
|
1046
|
+
<a name='L981'></a><a href='#L981'>981</a>
|
|
1047
|
+
<a name='L982'></a><a href='#L982'>982</a>
|
|
1048
|
+
<a name='L983'></a><a href='#L983'>983</a>
|
|
1049
|
+
<a name='L984'></a><a href='#L984'>984</a>
|
|
1050
|
+
<a name='L985'></a><a href='#L985'>985</a>
|
|
1051
|
+
<a name='L986'></a><a href='#L986'>986</a>
|
|
1052
|
+
<a name='L987'></a><a href='#L987'>987</a>
|
|
1053
|
+
<a name='L988'></a><a href='#L988'>988</a>
|
|
1054
|
+
<a name='L989'></a><a href='#L989'>989</a>
|
|
1055
|
+
<a name='L990'></a><a href='#L990'>990</a>
|
|
1056
|
+
<a name='L991'></a><a href='#L991'>991</a>
|
|
1057
|
+
<a name='L992'></a><a href='#L992'>992</a>
|
|
1058
|
+
<a name='L993'></a><a href='#L993'>993</a>
|
|
1059
|
+
<a name='L994'></a><a href='#L994'>994</a>
|
|
1060
|
+
<a name='L995'></a><a href='#L995'>995</a>
|
|
1061
|
+
<a name='L996'></a><a href='#L996'>996</a>
|
|
1062
|
+
<a name='L997'></a><a href='#L997'>997</a>
|
|
1063
|
+
<a name='L998'></a><a href='#L998'>998</a>
|
|
1064
|
+
<a name='L999'></a><a href='#L999'>999</a>
|
|
1065
|
+
<a name='L1000'></a><a href='#L1000'>1000</a>
|
|
1066
|
+
<a name='L1001'></a><a href='#L1001'>1001</a>
|
|
1067
|
+
<a name='L1002'></a><a href='#L1002'>1002</a>
|
|
1068
|
+
<a name='L1003'></a><a href='#L1003'>1003</a>
|
|
1069
|
+
<a name='L1004'></a><a href='#L1004'>1004</a>
|
|
1070
|
+
<a name='L1005'></a><a href='#L1005'>1005</a>
|
|
1071
|
+
<a name='L1006'></a><a href='#L1006'>1006</a>
|
|
1072
|
+
<a name='L1007'></a><a href='#L1007'>1007</a>
|
|
1073
|
+
<a name='L1008'></a><a href='#L1008'>1008</a>
|
|
1074
|
+
<a name='L1009'></a><a href='#L1009'>1009</a>
|
|
1075
|
+
<a name='L1010'></a><a href='#L1010'>1010</a>
|
|
1076
|
+
<a name='L1011'></a><a href='#L1011'>1011</a>
|
|
1077
|
+
<a name='L1012'></a><a href='#L1012'>1012</a>
|
|
1078
|
+
<a name='L1013'></a><a href='#L1013'>1013</a>
|
|
1079
|
+
<a name='L1014'></a><a href='#L1014'>1014</a>
|
|
1080
|
+
<a name='L1015'></a><a href='#L1015'>1015</a>
|
|
1081
|
+
<a name='L1016'></a><a href='#L1016'>1016</a>
|
|
1082
|
+
<a name='L1017'></a><a href='#L1017'>1017</a>
|
|
1083
|
+
<a name='L1018'></a><a href='#L1018'>1018</a>
|
|
1084
|
+
<a name='L1019'></a><a href='#L1019'>1019</a>
|
|
1085
|
+
<a name='L1020'></a><a href='#L1020'>1020</a>
|
|
1086
|
+
<a name='L1021'></a><a href='#L1021'>1021</a>
|
|
1087
|
+
<a name='L1022'></a><a href='#L1022'>1022</a>
|
|
1088
|
+
<a name='L1023'></a><a href='#L1023'>1023</a>
|
|
1089
|
+
<a name='L1024'></a><a href='#L1024'>1024</a>
|
|
1090
|
+
<a name='L1025'></a><a href='#L1025'>1025</a>
|
|
1091
|
+
<a name='L1026'></a><a href='#L1026'>1026</a>
|
|
1092
|
+
<a name='L1027'></a><a href='#L1027'>1027</a>
|
|
1093
|
+
<a name='L1028'></a><a href='#L1028'>1028</a>
|
|
1094
|
+
<a name='L1029'></a><a href='#L1029'>1029</a>
|
|
1095
|
+
<a name='L1030'></a><a href='#L1030'>1030</a>
|
|
1096
|
+
<a name='L1031'></a><a href='#L1031'>1031</a>
|
|
1097
|
+
<a name='L1032'></a><a href='#L1032'>1032</a>
|
|
1098
|
+
<a name='L1033'></a><a href='#L1033'>1033</a>
|
|
1099
|
+
<a name='L1034'></a><a href='#L1034'>1034</a>
|
|
1100
|
+
<a name='L1035'></a><a href='#L1035'>1035</a>
|
|
1101
|
+
<a name='L1036'></a><a href='#L1036'>1036</a>
|
|
1102
|
+
<a name='L1037'></a><a href='#L1037'>1037</a>
|
|
1103
|
+
<a name='L1038'></a><a href='#L1038'>1038</a>
|
|
1104
|
+
<a name='L1039'></a><a href='#L1039'>1039</a>
|
|
1105
|
+
<a name='L1040'></a><a href='#L1040'>1040</a>
|
|
1106
|
+
<a name='L1041'></a><a href='#L1041'>1041</a>
|
|
1107
|
+
<a name='L1042'></a><a href='#L1042'>1042</a>
|
|
1108
|
+
<a name='L1043'></a><a href='#L1043'>1043</a>
|
|
1109
|
+
<a name='L1044'></a><a href='#L1044'>1044</a>
|
|
1110
|
+
<a name='L1045'></a><a href='#L1045'>1045</a>
|
|
1111
|
+
<a name='L1046'></a><a href='#L1046'>1046</a>
|
|
1112
|
+
<a name='L1047'></a><a href='#L1047'>1047</a>
|
|
1113
|
+
<a name='L1048'></a><a href='#L1048'>1048</a>
|
|
1114
|
+
<a name='L1049'></a><a href='#L1049'>1049</a>
|
|
1115
|
+
<a name='L1050'></a><a href='#L1050'>1050</a>
|
|
1116
|
+
<a name='L1051'></a><a href='#L1051'>1051</a>
|
|
1117
|
+
<a name='L1052'></a><a href='#L1052'>1052</a>
|
|
1118
|
+
<a name='L1053'></a><a href='#L1053'>1053</a>
|
|
1119
|
+
<a name='L1054'></a><a href='#L1054'>1054</a>
|
|
1120
|
+
<a name='L1055'></a><a href='#L1055'>1055</a>
|
|
1121
|
+
<a name='L1056'></a><a href='#L1056'>1056</a>
|
|
1122
|
+
<a name='L1057'></a><a href='#L1057'>1057</a>
|
|
1123
|
+
<a name='L1058'></a><a href='#L1058'>1058</a>
|
|
1124
|
+
<a name='L1059'></a><a href='#L1059'>1059</a>
|
|
1125
|
+
<a name='L1060'></a><a href='#L1060'>1060</a>
|
|
1126
|
+
<a name='L1061'></a><a href='#L1061'>1061</a>
|
|
1127
|
+
<a name='L1062'></a><a href='#L1062'>1062</a>
|
|
1128
|
+
<a name='L1063'></a><a href='#L1063'>1063</a>
|
|
1129
|
+
<a name='L1064'></a><a href='#L1064'>1064</a>
|
|
1130
|
+
<a name='L1065'></a><a href='#L1065'>1065</a>
|
|
1131
|
+
<a name='L1066'></a><a href='#L1066'>1066</a>
|
|
1132
|
+
<a name='L1067'></a><a href='#L1067'>1067</a>
|
|
1133
|
+
<a name='L1068'></a><a href='#L1068'>1068</a>
|
|
1134
|
+
<a name='L1069'></a><a href='#L1069'>1069</a>
|
|
1135
|
+
<a name='L1070'></a><a href='#L1070'>1070</a>
|
|
1136
|
+
<a name='L1071'></a><a href='#L1071'>1071</a>
|
|
1137
|
+
<a name='L1072'></a><a href='#L1072'>1072</a>
|
|
1138
|
+
<a name='L1073'></a><a href='#L1073'>1073</a>
|
|
1139
|
+
<a name='L1074'></a><a href='#L1074'>1074</a>
|
|
1140
|
+
<a name='L1075'></a><a href='#L1075'>1075</a>
|
|
1141
|
+
<a name='L1076'></a><a href='#L1076'>1076</a>
|
|
1142
|
+
<a name='L1077'></a><a href='#L1077'>1077</a>
|
|
1143
|
+
<a name='L1078'></a><a href='#L1078'>1078</a>
|
|
1144
|
+
<a name='L1079'></a><a href='#L1079'>1079</a>
|
|
1145
|
+
<a name='L1080'></a><a href='#L1080'>1080</a>
|
|
1146
|
+
<a name='L1081'></a><a href='#L1081'>1081</a>
|
|
1147
|
+
<a name='L1082'></a><a href='#L1082'>1082</a>
|
|
1148
|
+
<a name='L1083'></a><a href='#L1083'>1083</a>
|
|
1149
|
+
<a name='L1084'></a><a href='#L1084'>1084</a>
|
|
1150
|
+
<a name='L1085'></a><a href='#L1085'>1085</a>
|
|
1151
|
+
<a name='L1086'></a><a href='#L1086'>1086</a>
|
|
1152
|
+
<a name='L1087'></a><a href='#L1087'>1087</a>
|
|
1153
|
+
<a name='L1088'></a><a href='#L1088'>1088</a>
|
|
1154
|
+
<a name='L1089'></a><a href='#L1089'>1089</a>
|
|
1155
|
+
<a name='L1090'></a><a href='#L1090'>1090</a>
|
|
1156
|
+
<a name='L1091'></a><a href='#L1091'>1091</a>
|
|
1157
|
+
<a name='L1092'></a><a href='#L1092'>1092</a>
|
|
1158
|
+
<a name='L1093'></a><a href='#L1093'>1093</a>
|
|
1159
|
+
<a name='L1094'></a><a href='#L1094'>1094</a>
|
|
1160
|
+
<a name='L1095'></a><a href='#L1095'>1095</a>
|
|
1161
|
+
<a name='L1096'></a><a href='#L1096'>1096</a>
|
|
1162
|
+
<a name='L1097'></a><a href='#L1097'>1097</a>
|
|
1163
|
+
<a name='L1098'></a><a href='#L1098'>1098</a>
|
|
1164
|
+
<a name='L1099'></a><a href='#L1099'>1099</a>
|
|
1165
|
+
<a name='L1100'></a><a href='#L1100'>1100</a>
|
|
1166
|
+
<a name='L1101'></a><a href='#L1101'>1101</a>
|
|
1167
|
+
<a name='L1102'></a><a href='#L1102'>1102</a>
|
|
1168
|
+
<a name='L1103'></a><a href='#L1103'>1103</a>
|
|
1169
|
+
<a name='L1104'></a><a href='#L1104'>1104</a>
|
|
1170
|
+
<a name='L1105'></a><a href='#L1105'>1105</a>
|
|
1171
|
+
<a name='L1106'></a><a href='#L1106'>1106</a>
|
|
1172
|
+
<a name='L1107'></a><a href='#L1107'>1107</a>
|
|
1173
|
+
<a name='L1108'></a><a href='#L1108'>1108</a>
|
|
1174
|
+
<a name='L1109'></a><a href='#L1109'>1109</a>
|
|
1175
|
+
<a name='L1110'></a><a href='#L1110'>1110</a>
|
|
1176
|
+
<a name='L1111'></a><a href='#L1111'>1111</a>
|
|
1177
|
+
<a name='L1112'></a><a href='#L1112'>1112</a>
|
|
1178
|
+
<a name='L1113'></a><a href='#L1113'>1113</a>
|
|
1179
|
+
<a name='L1114'></a><a href='#L1114'>1114</a>
|
|
1180
|
+
<a name='L1115'></a><a href='#L1115'>1115</a>
|
|
1181
|
+
<a name='L1116'></a><a href='#L1116'>1116</a>
|
|
1182
|
+
<a name='L1117'></a><a href='#L1117'>1117</a>
|
|
1183
|
+
<a name='L1118'></a><a href='#L1118'>1118</a>
|
|
1184
|
+
<a name='L1119'></a><a href='#L1119'>1119</a>
|
|
1185
|
+
<a name='L1120'></a><a href='#L1120'>1120</a>
|
|
1186
|
+
<a name='L1121'></a><a href='#L1121'>1121</a>
|
|
1187
|
+
<a name='L1122'></a><a href='#L1122'>1122</a>
|
|
1188
|
+
<a name='L1123'></a><a href='#L1123'>1123</a>
|
|
1189
|
+
<a name='L1124'></a><a href='#L1124'>1124</a>
|
|
1190
|
+
<a name='L1125'></a><a href='#L1125'>1125</a>
|
|
1191
|
+
<a name='L1126'></a><a href='#L1126'>1126</a>
|
|
1192
|
+
<a name='L1127'></a><a href='#L1127'>1127</a>
|
|
1193
|
+
<a name='L1128'></a><a href='#L1128'>1128</a>
|
|
1194
|
+
<a name='L1129'></a><a href='#L1129'>1129</a>
|
|
1195
|
+
<a name='L1130'></a><a href='#L1130'>1130</a>
|
|
1196
|
+
<a name='L1131'></a><a href='#L1131'>1131</a>
|
|
1197
|
+
<a name='L1132'></a><a href='#L1132'>1132</a>
|
|
1198
|
+
<a name='L1133'></a><a href='#L1133'>1133</a>
|
|
1199
|
+
<a name='L1134'></a><a href='#L1134'>1134</a>
|
|
1200
|
+
<a name='L1135'></a><a href='#L1135'>1135</a>
|
|
1201
|
+
<a name='L1136'></a><a href='#L1136'>1136</a>
|
|
1202
|
+
<a name='L1137'></a><a href='#L1137'>1137</a>
|
|
1203
|
+
<a name='L1138'></a><a href='#L1138'>1138</a>
|
|
1204
|
+
<a name='L1139'></a><a href='#L1139'>1139</a>
|
|
1205
|
+
<a name='L1140'></a><a href='#L1140'>1140</a>
|
|
1206
|
+
<a name='L1141'></a><a href='#L1141'>1141</a>
|
|
1207
|
+
<a name='L1142'></a><a href='#L1142'>1142</a>
|
|
1208
|
+
<a name='L1143'></a><a href='#L1143'>1143</a>
|
|
1209
|
+
<a name='L1144'></a><a href='#L1144'>1144</a>
|
|
1210
|
+
<a name='L1145'></a><a href='#L1145'>1145</a>
|
|
1211
|
+
<a name='L1146'></a><a href='#L1146'>1146</a>
|
|
1212
|
+
<a name='L1147'></a><a href='#L1147'>1147</a>
|
|
1213
|
+
<a name='L1148'></a><a href='#L1148'>1148</a>
|
|
1214
|
+
<a name='L1149'></a><a href='#L1149'>1149</a>
|
|
1215
|
+
<a name='L1150'></a><a href='#L1150'>1150</a>
|
|
1216
|
+
<a name='L1151'></a><a href='#L1151'>1151</a>
|
|
1217
|
+
<a name='L1152'></a><a href='#L1152'>1152</a>
|
|
1218
|
+
<a name='L1153'></a><a href='#L1153'>1153</a>
|
|
1219
|
+
<a name='L1154'></a><a href='#L1154'>1154</a>
|
|
1220
|
+
<a name='L1155'></a><a href='#L1155'>1155</a>
|
|
1221
|
+
<a name='L1156'></a><a href='#L1156'>1156</a>
|
|
1222
|
+
<a name='L1157'></a><a href='#L1157'>1157</a>
|
|
1223
|
+
<a name='L1158'></a><a href='#L1158'>1158</a>
|
|
1224
|
+
<a name='L1159'></a><a href='#L1159'>1159</a>
|
|
1225
|
+
<a name='L1160'></a><a href='#L1160'>1160</a>
|
|
1226
|
+
<a name='L1161'></a><a href='#L1161'>1161</a>
|
|
1227
|
+
<a name='L1162'></a><a href='#L1162'>1162</a>
|
|
1228
|
+
<a name='L1163'></a><a href='#L1163'>1163</a>
|
|
1229
|
+
<a name='L1164'></a><a href='#L1164'>1164</a>
|
|
1230
|
+
<a name='L1165'></a><a href='#L1165'>1165</a>
|
|
1231
|
+
<a name='L1166'></a><a href='#L1166'>1166</a>
|
|
1232
|
+
<a name='L1167'></a><a href='#L1167'>1167</a>
|
|
1233
|
+
<a name='L1168'></a><a href='#L1168'>1168</a>
|
|
1234
|
+
<a name='L1169'></a><a href='#L1169'>1169</a>
|
|
1235
|
+
<a name='L1170'></a><a href='#L1170'>1170</a>
|
|
1236
|
+
<a name='L1171'></a><a href='#L1171'>1171</a>
|
|
1237
|
+
<a name='L1172'></a><a href='#L1172'>1172</a>
|
|
1238
|
+
<a name='L1173'></a><a href='#L1173'>1173</a>
|
|
1239
|
+
<a name='L1174'></a><a href='#L1174'>1174</a>
|
|
1240
|
+
<a name='L1175'></a><a href='#L1175'>1175</a>
|
|
1241
|
+
<a name='L1176'></a><a href='#L1176'>1176</a>
|
|
1242
|
+
<a name='L1177'></a><a href='#L1177'>1177</a>
|
|
1243
|
+
<a name='L1178'></a><a href='#L1178'>1178</a>
|
|
1244
|
+
<a name='L1179'></a><a href='#L1179'>1179</a>
|
|
1245
|
+
<a name='L1180'></a><a href='#L1180'>1180</a>
|
|
1246
|
+
<a name='L1181'></a><a href='#L1181'>1181</a>
|
|
1247
|
+
<a name='L1182'></a><a href='#L1182'>1182</a>
|
|
1248
|
+
<a name='L1183'></a><a href='#L1183'>1183</a>
|
|
1249
|
+
<a name='L1184'></a><a href='#L1184'>1184</a>
|
|
1250
|
+
<a name='L1185'></a><a href='#L1185'>1185</a>
|
|
1251
|
+
<a name='L1186'></a><a href='#L1186'>1186</a>
|
|
1252
|
+
<a name='L1187'></a><a href='#L1187'>1187</a>
|
|
1253
|
+
<a name='L1188'></a><a href='#L1188'>1188</a>
|
|
1254
|
+
<a name='L1189'></a><a href='#L1189'>1189</a>
|
|
1255
|
+
<a name='L1190'></a><a href='#L1190'>1190</a>
|
|
1256
|
+
<a name='L1191'></a><a href='#L1191'>1191</a>
|
|
1257
|
+
<a name='L1192'></a><a href='#L1192'>1192</a>
|
|
1258
|
+
<a name='L1193'></a><a href='#L1193'>1193</a>
|
|
1259
|
+
<a name='L1194'></a><a href='#L1194'>1194</a>
|
|
1260
|
+
<a name='L1195'></a><a href='#L1195'>1195</a>
|
|
1261
|
+
<a name='L1196'></a><a href='#L1196'>1196</a>
|
|
1262
|
+
<a name='L1197'></a><a href='#L1197'>1197</a>
|
|
1263
|
+
<a name='L1198'></a><a href='#L1198'>1198</a>
|
|
1264
|
+
<a name='L1199'></a><a href='#L1199'>1199</a>
|
|
1265
|
+
<a name='L1200'></a><a href='#L1200'>1200</a>
|
|
1266
|
+
<a name='L1201'></a><a href='#L1201'>1201</a>
|
|
1267
|
+
<a name='L1202'></a><a href='#L1202'>1202</a>
|
|
1268
|
+
<a name='L1203'></a><a href='#L1203'>1203</a>
|
|
1269
|
+
<a name='L1204'></a><a href='#L1204'>1204</a>
|
|
1270
|
+
<a name='L1205'></a><a href='#L1205'>1205</a>
|
|
1271
|
+
<a name='L1206'></a><a href='#L1206'>1206</a>
|
|
1272
|
+
<a name='L1207'></a><a href='#L1207'>1207</a>
|
|
1273
|
+
<a name='L1208'></a><a href='#L1208'>1208</a>
|
|
1274
|
+
<a name='L1209'></a><a href='#L1209'>1209</a>
|
|
1275
|
+
<a name='L1210'></a><a href='#L1210'>1210</a>
|
|
1276
|
+
<a name='L1211'></a><a href='#L1211'>1211</a>
|
|
1277
|
+
<a name='L1212'></a><a href='#L1212'>1212</a>
|
|
1278
|
+
<a name='L1213'></a><a href='#L1213'>1213</a>
|
|
1279
|
+
<a name='L1214'></a><a href='#L1214'>1214</a>
|
|
1280
|
+
<a name='L1215'></a><a href='#L1215'>1215</a>
|
|
1281
|
+
<a name='L1216'></a><a href='#L1216'>1216</a>
|
|
1282
|
+
<a name='L1217'></a><a href='#L1217'>1217</a>
|
|
1283
|
+
<a name='L1218'></a><a href='#L1218'>1218</a>
|
|
1284
|
+
<a name='L1219'></a><a href='#L1219'>1219</a>
|
|
1285
|
+
<a name='L1220'></a><a href='#L1220'>1220</a>
|
|
1286
|
+
<a name='L1221'></a><a href='#L1221'>1221</a>
|
|
1287
|
+
<a name='L1222'></a><a href='#L1222'>1222</a>
|
|
1288
|
+
<a name='L1223'></a><a href='#L1223'>1223</a>
|
|
1289
|
+
<a name='L1224'></a><a href='#L1224'>1224</a>
|
|
1290
|
+
<a name='L1225'></a><a href='#L1225'>1225</a>
|
|
1291
|
+
<a name='L1226'></a><a href='#L1226'>1226</a>
|
|
1292
|
+
<a name='L1227'></a><a href='#L1227'>1227</a>
|
|
1293
|
+
<a name='L1228'></a><a href='#L1228'>1228</a>
|
|
1294
|
+
<a name='L1229'></a><a href='#L1229'>1229</a>
|
|
1295
|
+
<a name='L1230'></a><a href='#L1230'>1230</a>
|
|
1296
|
+
<a name='L1231'></a><a href='#L1231'>1231</a>
|
|
1297
|
+
<a name='L1232'></a><a href='#L1232'>1232</a>
|
|
1298
|
+
<a name='L1233'></a><a href='#L1233'>1233</a>
|
|
1299
|
+
<a name='L1234'></a><a href='#L1234'>1234</a>
|
|
1300
|
+
<a name='L1235'></a><a href='#L1235'>1235</a>
|
|
1301
|
+
<a name='L1236'></a><a href='#L1236'>1236</a>
|
|
1302
|
+
<a name='L1237'></a><a href='#L1237'>1237</a>
|
|
1303
|
+
<a name='L1238'></a><a href='#L1238'>1238</a>
|
|
1304
|
+
<a name='L1239'></a><a href='#L1239'>1239</a>
|
|
1305
|
+
<a name='L1240'></a><a href='#L1240'>1240</a>
|
|
1306
|
+
<a name='L1241'></a><a href='#L1241'>1241</a>
|
|
1307
|
+
<a name='L1242'></a><a href='#L1242'>1242</a>
|
|
1308
|
+
<a name='L1243'></a><a href='#L1243'>1243</a>
|
|
1309
|
+
<a name='L1244'></a><a href='#L1244'>1244</a>
|
|
1310
|
+
<a name='L1245'></a><a href='#L1245'>1245</a>
|
|
1311
|
+
<a name='L1246'></a><a href='#L1246'>1246</a>
|
|
1312
|
+
<a name='L1247'></a><a href='#L1247'>1247</a>
|
|
1313
|
+
<a name='L1248'></a><a href='#L1248'>1248</a>
|
|
1314
|
+
<a name='L1249'></a><a href='#L1249'>1249</a>
|
|
1315
|
+
<a name='L1250'></a><a href='#L1250'>1250</a>
|
|
1316
|
+
<a name='L1251'></a><a href='#L1251'>1251</a>
|
|
1317
|
+
<a name='L1252'></a><a href='#L1252'>1252</a>
|
|
1318
|
+
<a name='L1253'></a><a href='#L1253'>1253</a>
|
|
1319
|
+
<a name='L1254'></a><a href='#L1254'>1254</a>
|
|
1320
|
+
<a name='L1255'></a><a href='#L1255'>1255</a>
|
|
1321
|
+
<a name='L1256'></a><a href='#L1256'>1256</a>
|
|
1322
|
+
<a name='L1257'></a><a href='#L1257'>1257</a>
|
|
1323
|
+
<a name='L1258'></a><a href='#L1258'>1258</a>
|
|
1324
|
+
<a name='L1259'></a><a href='#L1259'>1259</a>
|
|
1325
|
+
<a name='L1260'></a><a href='#L1260'>1260</a>
|
|
1326
|
+
<a name='L1261'></a><a href='#L1261'>1261</a>
|
|
1327
|
+
<a name='L1262'></a><a href='#L1262'>1262</a>
|
|
1328
|
+
<a name='L1263'></a><a href='#L1263'>1263</a>
|
|
1329
|
+
<a name='L1264'></a><a href='#L1264'>1264</a>
|
|
1330
|
+
<a name='L1265'></a><a href='#L1265'>1265</a>
|
|
1331
|
+
<a name='L1266'></a><a href='#L1266'>1266</a>
|
|
1332
|
+
<a name='L1267'></a><a href='#L1267'>1267</a>
|
|
1333
|
+
<a name='L1268'></a><a href='#L1268'>1268</a>
|
|
1334
|
+
<a name='L1269'></a><a href='#L1269'>1269</a>
|
|
1335
|
+
<a name='L1270'></a><a href='#L1270'>1270</a>
|
|
1336
|
+
<a name='L1271'></a><a href='#L1271'>1271</a>
|
|
1337
|
+
<a name='L1272'></a><a href='#L1272'>1272</a>
|
|
1338
|
+
<a name='L1273'></a><a href='#L1273'>1273</a>
|
|
1339
|
+
<a name='L1274'></a><a href='#L1274'>1274</a>
|
|
1340
|
+
<a name='L1275'></a><a href='#L1275'>1275</a>
|
|
1341
|
+
<a name='L1276'></a><a href='#L1276'>1276</a>
|
|
1342
|
+
<a name='L1277'></a><a href='#L1277'>1277</a>
|
|
1343
|
+
<a name='L1278'></a><a href='#L1278'>1278</a>
|
|
1344
|
+
<a name='L1279'></a><a href='#L1279'>1279</a>
|
|
1345
|
+
<a name='L1280'></a><a href='#L1280'>1280</a>
|
|
1346
|
+
<a name='L1281'></a><a href='#L1281'>1281</a>
|
|
1347
|
+
<a name='L1282'></a><a href='#L1282'>1282</a>
|
|
1348
|
+
<a name='L1283'></a><a href='#L1283'>1283</a>
|
|
1349
|
+
<a name='L1284'></a><a href='#L1284'>1284</a>
|
|
1350
|
+
<a name='L1285'></a><a href='#L1285'>1285</a>
|
|
1351
|
+
<a name='L1286'></a><a href='#L1286'>1286</a>
|
|
1352
|
+
<a name='L1287'></a><a href='#L1287'>1287</a>
|
|
1353
|
+
<a name='L1288'></a><a href='#L1288'>1288</a>
|
|
1354
|
+
<a name='L1289'></a><a href='#L1289'>1289</a>
|
|
1355
|
+
<a name='L1290'></a><a href='#L1290'>1290</a>
|
|
1356
|
+
<a name='L1291'></a><a href='#L1291'>1291</a>
|
|
1357
|
+
<a name='L1292'></a><a href='#L1292'>1292</a>
|
|
1358
|
+
<a name='L1293'></a><a href='#L1293'>1293</a>
|
|
1359
|
+
<a name='L1294'></a><a href='#L1294'>1294</a>
|
|
1360
|
+
<a name='L1295'></a><a href='#L1295'>1295</a>
|
|
1361
|
+
<a name='L1296'></a><a href='#L1296'>1296</a>
|
|
1362
|
+
<a name='L1297'></a><a href='#L1297'>1297</a>
|
|
1363
|
+
<a name='L1298'></a><a href='#L1298'>1298</a>
|
|
1364
|
+
<a name='L1299'></a><a href='#L1299'>1299</a>
|
|
1365
|
+
<a name='L1300'></a><a href='#L1300'>1300</a>
|
|
1366
|
+
<a name='L1301'></a><a href='#L1301'>1301</a>
|
|
1367
|
+
<a name='L1302'></a><a href='#L1302'>1302</a>
|
|
1368
|
+
<a name='L1303'></a><a href='#L1303'>1303</a>
|
|
1369
|
+
<a name='L1304'></a><a href='#L1304'>1304</a>
|
|
1370
|
+
<a name='L1305'></a><a href='#L1305'>1305</a>
|
|
1371
|
+
<a name='L1306'></a><a href='#L1306'>1306</a>
|
|
1372
|
+
<a name='L1307'></a><a href='#L1307'>1307</a>
|
|
1373
|
+
<a name='L1308'></a><a href='#L1308'>1308</a>
|
|
1374
|
+
<a name='L1309'></a><a href='#L1309'>1309</a>
|
|
1375
|
+
<a name='L1310'></a><a href='#L1310'>1310</a>
|
|
1376
|
+
<a name='L1311'></a><a href='#L1311'>1311</a>
|
|
1377
|
+
<a name='L1312'></a><a href='#L1312'>1312</a>
|
|
1378
|
+
<a name='L1313'></a><a href='#L1313'>1313</a>
|
|
1379
|
+
<a name='L1314'></a><a href='#L1314'>1314</a>
|
|
1380
|
+
<a name='L1315'></a><a href='#L1315'>1315</a>
|
|
1381
|
+
<a name='L1316'></a><a href='#L1316'>1316</a>
|
|
1382
|
+
<a name='L1317'></a><a href='#L1317'>1317</a>
|
|
1383
|
+
<a name='L1318'></a><a href='#L1318'>1318</a>
|
|
1384
|
+
<a name='L1319'></a><a href='#L1319'>1319</a>
|
|
1385
|
+
<a name='L1320'></a><a href='#L1320'>1320</a>
|
|
1386
|
+
<a name='L1321'></a><a href='#L1321'>1321</a>
|
|
1387
|
+
<a name='L1322'></a><a href='#L1322'>1322</a>
|
|
1388
|
+
<a name='L1323'></a><a href='#L1323'>1323</a>
|
|
1389
|
+
<a name='L1324'></a><a href='#L1324'>1324</a>
|
|
1390
|
+
<a name='L1325'></a><a href='#L1325'>1325</a>
|
|
1391
|
+
<a name='L1326'></a><a href='#L1326'>1326</a>
|
|
1392
|
+
<a name='L1327'></a><a href='#L1327'>1327</a>
|
|
1393
|
+
<a name='L1328'></a><a href='#L1328'>1328</a>
|
|
1394
|
+
<a name='L1329'></a><a href='#L1329'>1329</a>
|
|
1395
|
+
<a name='L1330'></a><a href='#L1330'>1330</a>
|
|
1396
|
+
<a name='L1331'></a><a href='#L1331'>1331</a>
|
|
1397
|
+
<a name='L1332'></a><a href='#L1332'>1332</a>
|
|
1398
|
+
<a name='L1333'></a><a href='#L1333'>1333</a>
|
|
1399
|
+
<a name='L1334'></a><a href='#L1334'>1334</a>
|
|
1400
|
+
<a name='L1335'></a><a href='#L1335'>1335</a>
|
|
1401
|
+
<a name='L1336'></a><a href='#L1336'>1336</a>
|
|
1402
|
+
<a name='L1337'></a><a href='#L1337'>1337</a>
|
|
1403
|
+
<a name='L1338'></a><a href='#L1338'>1338</a>
|
|
1404
|
+
<a name='L1339'></a><a href='#L1339'>1339</a>
|
|
1405
|
+
<a name='L1340'></a><a href='#L1340'>1340</a>
|
|
1406
|
+
<a name='L1341'></a><a href='#L1341'>1341</a>
|
|
1407
|
+
<a name='L1342'></a><a href='#L1342'>1342</a>
|
|
1408
|
+
<a name='L1343'></a><a href='#L1343'>1343</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
1409
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1410
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1411
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1412
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1413
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1414
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1415
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1416
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1417
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1418
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1419
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1420
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1421
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1422
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1423
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1424
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1425
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1426
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1427
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1428
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1429
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1430
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1431
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1432
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1433
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1434
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1435
|
+
<span class="cline-any cline-no"> </span>
|
|
1436
|
+
<span class="cline-any cline-no"> </span>
|
|
1437
|
+
<span class="cline-any cline-no"> </span>
|
|
1438
|
+
<span class="cline-any cline-no"> </span>
|
|
1439
|
+
<span class="cline-any cline-no"> </span>
|
|
1440
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1441
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1442
|
+
<span class="cline-any cline-no"> </span>
|
|
1443
|
+
<span class="cline-any cline-no"> </span>
|
|
1444
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1445
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1446
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1447
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1448
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1449
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1450
|
+
<span class="cline-any cline-no"> </span>
|
|
1451
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1452
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1453
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1454
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1455
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1456
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1457
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1458
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1459
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1460
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1461
|
+
<span class="cline-any cline-no"> </span>
|
|
1462
|
+
<span class="cline-any cline-no"> </span>
|
|
1463
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1464
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1465
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1466
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1467
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1468
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1469
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1470
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1471
|
+
<span class="cline-any cline-no"> </span>
|
|
1472
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1473
|
+
<span class="cline-any cline-no"> </span>
|
|
1474
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1475
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1476
|
+
<span class="cline-any cline-no"> </span>
|
|
1477
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1478
|
+
<span class="cline-any cline-no"> </span>
|
|
1479
|
+
<span class="cline-any cline-no"> </span>
|
|
1480
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1481
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1482
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1483
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1484
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1485
|
+
<span class="cline-any cline-no"> </span>
|
|
1486
|
+
<span class="cline-any cline-no"> </span>
|
|
1487
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1488
|
+
<span class="cline-any cline-no"> </span>
|
|
1489
|
+
<span class="cline-any cline-no"> </span>
|
|
1490
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1491
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1492
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1493
|
+
<span class="cline-any cline-no"> </span>
|
|
1494
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1495
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1496
|
+
<span class="cline-any cline-no"> </span>
|
|
1497
|
+
<span class="cline-any cline-no"> </span>
|
|
1498
|
+
<span class="cline-any cline-no"> </span>
|
|
1499
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1500
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1501
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1502
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1503
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1504
|
+
<span class="cline-any cline-no"> </span>
|
|
1505
|
+
<span class="cline-any cline-no"> </span>
|
|
1506
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1507
|
+
<span class="cline-any cline-no"> </span>
|
|
1508
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1509
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1510
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1511
|
+
<span class="cline-any cline-no"> </span>
|
|
1512
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1513
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1514
|
+
<span class="cline-any cline-no"> </span>
|
|
1515
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1516
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1517
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1518
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1519
|
+
<span class="cline-any cline-no"> </span>
|
|
1520
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1521
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1522
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1523
|
+
<span class="cline-any cline-no"> </span>
|
|
1524
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1525
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1526
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1527
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1528
|
+
<span class="cline-any cline-no"> </span>
|
|
1529
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1530
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1531
|
+
<span class="cline-any cline-no"> </span>
|
|
1532
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1533
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1534
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1535
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1536
|
+
<span class="cline-any cline-no"> </span>
|
|
1537
|
+
<span class="cline-any cline-no"> </span>
|
|
1538
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1539
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1540
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1541
|
+
<span class="cline-any cline-no"> </span>
|
|
1542
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1543
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1544
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1545
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1546
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1547
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1548
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1549
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1550
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1551
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1552
|
+
<span class="cline-any cline-no"> </span>
|
|
1553
|
+
<span class="cline-any cline-no"> </span>
|
|
1554
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1555
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1556
|
+
<span class="cline-any cline-no"> </span>
|
|
1557
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1558
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1559
|
+
<span class="cline-any cline-no"> </span>
|
|
1560
|
+
<span class="cline-any cline-no"> </span>
|
|
1561
|
+
<span class="cline-any cline-no"> </span>
|
|
1562
|
+
<span class="cline-any cline-no"> </span>
|
|
1563
|
+
<span class="cline-any cline-no"> </span>
|
|
1564
|
+
<span class="cline-any cline-no"> </span>
|
|
1565
|
+
<span class="cline-any cline-no"> </span>
|
|
1566
|
+
<span class="cline-any cline-no"> </span>
|
|
1567
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1568
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1569
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1570
|
+
<span class="cline-any cline-no"> </span>
|
|
1571
|
+
<span class="cline-any cline-no"> </span>
|
|
1572
|
+
<span class="cline-any cline-no"> </span>
|
|
1573
|
+
<span class="cline-any cline-no"> </span>
|
|
1574
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1575
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1576
|
+
<span class="cline-any cline-no"> </span>
|
|
1577
|
+
<span class="cline-any cline-no"> </span>
|
|
1578
|
+
<span class="cline-any cline-no"> </span>
|
|
1579
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1580
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1581
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1582
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1583
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1584
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1585
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1586
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1587
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1588
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1589
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1590
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1591
|
+
<span class="cline-any cline-no"> </span>
|
|
1592
|
+
<span class="cline-any cline-no"> </span>
|
|
1593
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1594
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1595
|
+
<span class="cline-any cline-no"> </span>
|
|
1596
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1597
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1598
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1599
|
+
<span class="cline-any cline-no"> </span>
|
|
1600
|
+
<span class="cline-any cline-no"> </span>
|
|
1601
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1602
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1603
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1604
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1605
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1606
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1607
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1608
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1609
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1610
|
+
<span class="cline-any cline-no"> </span>
|
|
1611
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1612
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1613
|
+
<span class="cline-any cline-no"> </span>
|
|
1614
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1615
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1616
|
+
<span class="cline-any cline-no"> </span>
|
|
1617
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1618
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1619
|
+
<span class="cline-any cline-no"> </span>
|
|
1620
|
+
<span class="cline-any cline-no"> </span>
|
|
1621
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1622
|
+
<span class="cline-any cline-no"> </span>
|
|
1623
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1624
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1625
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1626
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1627
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1628
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1629
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1630
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1631
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1632
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1633
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1634
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1635
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1636
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1637
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1638
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1639
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1640
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1641
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1642
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1643
|
+
<span class="cline-any cline-no"> </span>
|
|
1644
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1645
|
+
<span class="cline-any cline-no"> </span>
|
|
1646
|
+
<span class="cline-any cline-no"> </span>
|
|
1647
|
+
<span class="cline-any cline-no"> </span>
|
|
1648
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1649
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1650
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1651
|
+
<span class="cline-any cline-no"> </span>
|
|
1652
|
+
<span class="cline-any cline-no"> </span>
|
|
1653
|
+
<span class="cline-any cline-no"> </span>
|
|
1654
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1655
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1656
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1657
|
+
<span class="cline-any cline-no"> </span>
|
|
1658
|
+
<span class="cline-any cline-no"> </span>
|
|
1659
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1660
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1661
|
+
<span class="cline-any cline-no"> </span>
|
|
1662
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1663
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1664
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1665
|
+
<span class="cline-any cline-no"> </span>
|
|
1666
|
+
<span class="cline-any cline-no"> </span>
|
|
1667
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1668
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1669
|
+
<span class="cline-any cline-no"> </span>
|
|
1670
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1671
|
+
<span class="cline-any cline-no"> </span>
|
|
1672
|
+
<span class="cline-any cline-no"> </span>
|
|
1673
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1674
|
+
<span class="cline-any cline-no"> </span>
|
|
1675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1677
|
+
<span class="cline-any cline-no"> </span>
|
|
1678
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1679
|
+
<span class="cline-any cline-no"> </span>
|
|
1680
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1681
|
+
<span class="cline-any cline-no"> </span>
|
|
1682
|
+
<span class="cline-any cline-no"> </span>
|
|
1683
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1684
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1685
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1686
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1687
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1688
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1689
|
+
<span class="cline-any cline-no"> </span>
|
|
1690
|
+
<span class="cline-any cline-no"> </span>
|
|
1691
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1692
|
+
<span class="cline-any cline-no"> </span>
|
|
1693
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1694
|
+
<span class="cline-any cline-no"> </span>
|
|
1695
|
+
<span class="cline-any cline-no"> </span>
|
|
1696
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1698
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1699
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1700
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1702
|
+
<span class="cline-any cline-no"> </span>
|
|
1703
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1704
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1705
|
+
<span class="cline-any cline-no"> </span>
|
|
1706
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1707
|
+
<span class="cline-any cline-no"> </span>
|
|
1708
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1709
|
+
<span class="cline-any cline-no"> </span>
|
|
1710
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1711
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1712
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1713
|
+
<span class="cline-any cline-no"> </span>
|
|
1714
|
+
<span class="cline-any cline-no"> </span>
|
|
1715
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1716
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1717
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1718
|
+
<span class="cline-any cline-no"> </span>
|
|
1719
|
+
<span class="cline-any cline-no"> </span>
|
|
1720
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1721
|
+
<span class="cline-any cline-no"> </span>
|
|
1722
|
+
<span class="cline-any cline-no"> </span>
|
|
1723
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1724
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1725
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1726
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1727
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1728
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1729
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1730
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1731
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1732
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1733
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1734
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1735
|
+
<span class="cline-any cline-no"> </span>
|
|
1736
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1737
|
+
<span class="cline-any cline-no"> </span>
|
|
1738
|
+
<span class="cline-any cline-no"> </span>
|
|
1739
|
+
<span class="cline-any cline-no"> </span>
|
|
1740
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1741
|
+
<span class="cline-any cline-no"> </span>
|
|
1742
|
+
<span class="cline-any cline-no"> </span>
|
|
1743
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1744
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1745
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1746
|
+
<span class="cline-any cline-no"> </span>
|
|
1747
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1748
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1749
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1750
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1751
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1752
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1753
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1754
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1755
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1756
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1757
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1758
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1759
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1760
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1761
|
+
<span class="cline-any cline-no"> </span>
|
|
1762
|
+
<span class="cline-any cline-no"> </span>
|
|
1763
|
+
<span class="cline-any cline-no"> </span>
|
|
1764
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1765
|
+
<span class="cline-any cline-no"> </span>
|
|
1766
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1767
|
+
<span class="cline-any cline-no"> </span>
|
|
1768
|
+
<span class="cline-any cline-no"> </span>
|
|
1769
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1770
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1771
|
+
<span class="cline-any cline-no"> </span>
|
|
1772
|
+
<span class="cline-any cline-no"> </span>
|
|
1773
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1774
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1775
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1776
|
+
<span class="cline-any cline-no"> </span>
|
|
1777
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1778
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1779
|
+
<span class="cline-any cline-no"> </span>
|
|
1780
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1781
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1782
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1783
|
+
<span class="cline-any cline-no"> </span>
|
|
1784
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1785
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1786
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1787
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1788
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1789
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1790
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1791
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1792
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1793
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1794
|
+
<span class="cline-any cline-no"> </span>
|
|
1795
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1796
|
+
<span class="cline-any cline-no"> </span>
|
|
1797
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1798
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1799
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1800
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1801
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1802
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1803
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1804
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1805
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1806
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1807
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1808
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1809
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1810
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1811
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1812
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1813
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1814
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1815
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1816
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1817
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1818
|
+
<span class="cline-any cline-no"> </span>
|
|
1819
|
+
<span class="cline-any cline-no"> </span>
|
|
1820
|
+
<span class="cline-any cline-no"> </span>
|
|
1821
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1822
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1823
|
+
<span class="cline-any cline-no"> </span>
|
|
1824
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1825
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1826
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1827
|
+
<span class="cline-any cline-no"> </span>
|
|
1828
|
+
<span class="cline-any cline-no"> </span>
|
|
1829
|
+
<span class="cline-any cline-no"> </span>
|
|
1830
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1831
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1832
|
+
<span class="cline-any cline-no"> </span>
|
|
1833
|
+
<span class="cline-any cline-no"> </span>
|
|
1834
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1835
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1836
|
+
<span class="cline-any cline-no"> </span>
|
|
1837
|
+
<span class="cline-any cline-no"> </span>
|
|
1838
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1839
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1840
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1841
|
+
<span class="cline-any cline-no"> </span>
|
|
1842
|
+
<span class="cline-any cline-no"> </span>
|
|
1843
|
+
<span class="cline-any cline-no"> </span>
|
|
1844
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1845
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1846
|
+
<span class="cline-any cline-no"> </span>
|
|
1847
|
+
<span class="cline-any cline-no"> </span>
|
|
1848
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1849
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1850
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1851
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1852
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1853
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1854
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1855
|
+
<span class="cline-any cline-no"> </span>
|
|
1856
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1857
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1858
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1859
|
+
<span class="cline-any cline-no"> </span>
|
|
1860
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1861
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1862
|
+
<span class="cline-any cline-no"> </span>
|
|
1863
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1864
|
+
<span class="cline-any cline-no"> </span>
|
|
1865
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1866
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1867
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1868
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1869
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1870
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1871
|
+
<span class="cline-any cline-no"> </span>
|
|
1872
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1873
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1874
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1875
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1876
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1877
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1878
|
+
<span class="cline-any cline-no"> </span>
|
|
1879
|
+
<span class="cline-any cline-no"> </span>
|
|
1880
|
+
<span class="cline-any cline-no"> </span>
|
|
1881
|
+
<span class="cline-any cline-no"> </span>
|
|
1882
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1883
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1884
|
+
<span class="cline-any cline-no"> </span>
|
|
1885
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1886
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1887
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1888
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1889
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1890
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1891
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1892
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1893
|
+
<span class="cline-any cline-no"> </span>
|
|
1894
|
+
<span class="cline-any cline-no"> </span>
|
|
1895
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1896
|
+
<span class="cline-any cline-no"> </span>
|
|
1897
|
+
<span class="cline-any cline-no"> </span>
|
|
1898
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1899
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1900
|
+
<span class="cline-any cline-no"> </span>
|
|
1901
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1902
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1903
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1904
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1905
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1906
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1907
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1908
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1909
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1910
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1911
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1912
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1913
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1914
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1915
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1916
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1917
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1918
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1919
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1920
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1921
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1922
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1923
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1924
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1925
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1926
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1927
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1928
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1929
|
+
<span class="cline-any cline-no"> </span>
|
|
1930
|
+
<span class="cline-any cline-no"> </span>
|
|
1931
|
+
<span class="cline-any cline-no"> </span>
|
|
1932
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1933
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1934
|
+
<span class="cline-any cline-no"> </span>
|
|
1935
|
+
<span class="cline-any cline-no"> </span>
|
|
1936
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1937
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1938
|
+
<span class="cline-any cline-no"> </span>
|
|
1939
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1940
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1941
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1942
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1943
|
+
<span class="cline-any cline-no"> </span>
|
|
1944
|
+
<span class="cline-any cline-no"> </span>
|
|
1945
|
+
<span class="cline-any cline-no"> </span>
|
|
1946
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1947
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1948
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1949
|
+
<span class="cline-any cline-no"> </span>
|
|
1950
|
+
<span class="cline-any cline-no"> </span>
|
|
1951
|
+
<span class="cline-any cline-no"> </span>
|
|
1952
|
+
<span class="cline-any cline-no"> </span>
|
|
1953
|
+
<span class="cline-any cline-no"> </span>
|
|
1954
|
+
<span class="cline-any cline-no"> </span>
|
|
1955
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1956
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1957
|
+
<span class="cline-any cline-no"> </span>
|
|
1958
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1959
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1960
|
+
<span class="cline-any cline-no"> </span>
|
|
1961
|
+
<span class="cline-any cline-no"> </span>
|
|
1962
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1963
|
+
<span class="cline-any cline-no"> </span>
|
|
1964
|
+
<span class="cline-any cline-no"> </span>
|
|
1965
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1966
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1967
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1968
|
+
<span class="cline-any cline-no"> </span>
|
|
1969
|
+
<span class="cline-any cline-no"> </span>
|
|
1970
|
+
<span class="cline-any cline-no"> </span>
|
|
1971
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1972
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1973
|
+
<span class="cline-any cline-no"> </span>
|
|
1974
|
+
<span class="cline-any cline-no"> </span>
|
|
1975
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1976
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1977
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1978
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1979
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1980
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1981
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1982
|
+
<span class="cline-any cline-no"> </span>
|
|
1983
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1984
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1985
|
+
<span class="cline-any cline-no"> </span>
|
|
1986
|
+
<span class="cline-any cline-no"> </span>
|
|
1987
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1988
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1989
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1990
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1991
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1992
|
+
<span class="cline-any cline-no"> </span>
|
|
1993
|
+
<span class="cline-any cline-no"> </span>
|
|
1994
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1995
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1996
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1997
|
+
<span class="cline-any cline-no"> </span>
|
|
1998
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1999
|
+
<span class="cline-any cline-no"> </span>
|
|
2000
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2001
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2002
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2003
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2004
|
+
<span class="cline-any cline-no"> </span>
|
|
2005
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2006
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2007
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2008
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2009
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2010
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2011
|
+
<span class="cline-any cline-no"> </span>
|
|
2012
|
+
<span class="cline-any cline-no"> </span>
|
|
2013
|
+
<span class="cline-any cline-no"> </span>
|
|
2014
|
+
<span class="cline-any cline-no"> </span>
|
|
2015
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2016
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2017
|
+
<span class="cline-any cline-no"> </span>
|
|
2018
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2019
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2020
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2021
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2022
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2023
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2024
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2025
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2026
|
+
<span class="cline-any cline-no"> </span>
|
|
2027
|
+
<span class="cline-any cline-no"> </span>
|
|
2028
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2029
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2030
|
+
<span class="cline-any cline-no"> </span>
|
|
2031
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2032
|
+
<span class="cline-any cline-no"> </span>
|
|
2033
|
+
<span class="cline-any cline-no"> </span>
|
|
2034
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2035
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2036
|
+
<span class="cline-any cline-no"> </span>
|
|
2037
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2038
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2039
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2040
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2041
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2042
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2043
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2044
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2045
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2046
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2047
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2048
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2049
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2050
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2051
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2052
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2053
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2054
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2055
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2056
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2057
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2058
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2059
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2060
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2061
|
+
<span class="cline-any cline-no"> </span>
|
|
2062
|
+
<span class="cline-any cline-no"> </span>
|
|
2063
|
+
<span class="cline-any cline-no"> </span>
|
|
2064
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2065
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2066
|
+
<span class="cline-any cline-no"> </span>
|
|
2067
|
+
<span class="cline-any cline-no"> </span>
|
|
2068
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2069
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2070
|
+
<span class="cline-any cline-no"> </span>
|
|
2071
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2072
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2073
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2074
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2075
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2076
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2077
|
+
<span class="cline-any cline-no"> </span>
|
|
2078
|
+
<span class="cline-any cline-no"> </span>
|
|
2079
|
+
<span class="cline-any cline-no"> </span>
|
|
2080
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2081
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2082
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2083
|
+
<span class="cline-any cline-no"> </span>
|
|
2084
|
+
<span class="cline-any cline-no"> </span>
|
|
2085
|
+
<span class="cline-any cline-no"> </span>
|
|
2086
|
+
<span class="cline-any cline-no"> </span>
|
|
2087
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2088
|
+
<span class="cline-any cline-no"> </span>
|
|
2089
|
+
<span class="cline-any cline-no"> </span>
|
|
2090
|
+
<span class="cline-any cline-no"> </span>
|
|
2091
|
+
<span class="cline-any cline-no"> </span>
|
|
2092
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2093
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2094
|
+
<span class="cline-any cline-no"> </span>
|
|
2095
|
+
<span class="cline-any cline-no"> </span>
|
|
2096
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2097
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2098
|
+
<span class="cline-any cline-no"> </span>
|
|
2099
|
+
<span class="cline-any cline-no"> </span>
|
|
2100
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2101
|
+
<span class="cline-any cline-no"> </span>
|
|
2102
|
+
<span class="cline-any cline-no"> </span>
|
|
2103
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2104
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2105
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2106
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2107
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2108
|
+
<span class="cline-any cline-no"> </span>
|
|
2109
|
+
<span class="cline-any cline-no"> </span>
|
|
2110
|
+
<span class="cline-any cline-no"> </span>
|
|
2111
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2112
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2113
|
+
<span class="cline-any cline-no"> </span>
|
|
2114
|
+
<span class="cline-any cline-no"> </span>
|
|
2115
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2116
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2117
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2118
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2119
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2120
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2121
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2122
|
+
<span class="cline-any cline-no"> </span>
|
|
2123
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2124
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2125
|
+
<span class="cline-any cline-no"> </span>
|
|
2126
|
+
<span class="cline-any cline-no"> </span>
|
|
2127
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2128
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2129
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2130
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2131
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2132
|
+
<span class="cline-any cline-no"> </span>
|
|
2133
|
+
<span class="cline-any cline-no"> </span>
|
|
2134
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2135
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2136
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2137
|
+
<span class="cline-any cline-no"> </span>
|
|
2138
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2139
|
+
<span class="cline-any cline-no"> </span>
|
|
2140
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2141
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2142
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2143
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2144
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2145
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2146
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2147
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2148
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2149
|
+
<span class="cline-any cline-no"> </span>
|
|
2150
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2151
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2152
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2153
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2154
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2155
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2156
|
+
<span class="cline-any cline-no"> </span>
|
|
2157
|
+
<span class="cline-any cline-no"> </span>
|
|
2158
|
+
<span class="cline-any cline-no"> </span>
|
|
2159
|
+
<span class="cline-any cline-no"> </span>
|
|
2160
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2161
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2162
|
+
<span class="cline-any cline-no"> </span>
|
|
2163
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2164
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2165
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2166
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2167
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2168
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2169
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2170
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2171
|
+
<span class="cline-any cline-no"> </span>
|
|
2172
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2173
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2174
|
+
<span class="cline-any cline-no"> </span>
|
|
2175
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2176
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2177
|
+
<span class="cline-any cline-no"> </span>
|
|
2178
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2179
|
+
<span class="cline-any cline-no"> </span>
|
|
2180
|
+
<span class="cline-any cline-no"> </span>
|
|
2181
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2182
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2183
|
+
<span class="cline-any cline-no"> </span>
|
|
2184
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2185
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2186
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2187
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2188
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2189
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2190
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2191
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2192
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2193
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2194
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2195
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2196
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2197
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2198
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2199
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2200
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2201
|
+
<span class="cline-any cline-no"> </span>
|
|
2202
|
+
<span class="cline-any cline-no"> </span>
|
|
2203
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2204
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2205
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2206
|
+
<span class="cline-any cline-no"> </span>
|
|
2207
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2208
|
+
<span class="cline-any cline-no"> </span>
|
|
2209
|
+
<span class="cline-any cline-no"> </span>
|
|
2210
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2211
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2212
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2213
|
+
<span class="cline-any cline-no"> </span>
|
|
2214
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2215
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2216
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2217
|
+
<span class="cline-any cline-no"> </span>
|
|
2218
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2219
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2220
|
+
<span class="cline-any cline-no"> </span>
|
|
2221
|
+
<span class="cline-any cline-no"> </span>
|
|
2222
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2223
|
+
<span class="cline-any cline-no"> </span>
|
|
2224
|
+
<span class="cline-any cline-no"> </span>
|
|
2225
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2226
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2227
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2228
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2229
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2230
|
+
<span class="cline-any cline-no"> </span>
|
|
2231
|
+
<span class="cline-any cline-no"> </span>
|
|
2232
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2233
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2234
|
+
<span class="cline-any cline-no"> </span>
|
|
2235
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2236
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2237
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2238
|
+
<span class="cline-any cline-no"> </span>
|
|
2239
|
+
<span class="cline-any cline-no"> </span>
|
|
2240
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2241
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2242
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2243
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2244
|
+
<span class="cline-any cline-no"> </span>
|
|
2245
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2246
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2247
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2248
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2249
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2250
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2251
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2252
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2253
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2254
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2255
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2256
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2257
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2258
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2259
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2260
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2261
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2262
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2263
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2264
|
+
<span class="cline-any cline-no"> </span>
|
|
2265
|
+
<span class="cline-any cline-no"> </span>
|
|
2266
|
+
<span class="cline-any cline-no"> </span>
|
|
2267
|
+
<span class="cline-any cline-no"> </span>
|
|
2268
|
+
<span class="cline-any cline-no"> </span>
|
|
2269
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2270
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2271
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2272
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2273
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2274
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2275
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2276
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2277
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2278
|
+
<span class="cline-any cline-no"> </span>
|
|
2279
|
+
<span class="cline-any cline-no"> </span>
|
|
2280
|
+
<span class="cline-any cline-no"> </span>
|
|
2281
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2282
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2283
|
+
<span class="cline-any cline-no"> </span>
|
|
2284
|
+
<span class="cline-any cline-no"> </span>
|
|
2285
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2286
|
+
<span class="cline-any cline-no"> </span>
|
|
2287
|
+
<span class="cline-any cline-no"> </span>
|
|
2288
|
+
<span class="cline-any cline-no"> </span>
|
|
2289
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2290
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2291
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2292
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2293
|
+
<span class="cline-any cline-no"> </span>
|
|
2294
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2295
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2296
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2297
|
+
<span class="cline-any cline-no"> </span>
|
|
2298
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2299
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2300
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2301
|
+
<span class="cline-any cline-no"> </span>
|
|
2302
|
+
<span class="cline-any cline-no"> </span>
|
|
2303
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2304
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2305
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2306
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2307
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2308
|
+
<span class="cline-any cline-no"> </span>
|
|
2309
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2310
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2311
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2312
|
+
<span class="cline-any cline-no"> </span>
|
|
2313
|
+
<span class="cline-any cline-no"> </span>
|
|
2314
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2315
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2316
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2317
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2318
|
+
<span class="cline-any cline-no"> </span>
|
|
2319
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2320
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2321
|
+
<span class="cline-any cline-no"> </span>
|
|
2322
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2323
|
+
<span class="cline-any cline-no"> </span>
|
|
2324
|
+
<span class="cline-any cline-no"> </span>
|
|
2325
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2326
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2327
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2328
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2329
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2330
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2331
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2332
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2333
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2334
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2335
|
+
<span class="cline-any cline-no"> </span>
|
|
2336
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2337
|
+
<span class="cline-any cline-no"> </span>
|
|
2338
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2339
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2340
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2341
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2342
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2343
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2344
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2345
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2346
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2347
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2348
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2349
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2350
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2351
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2352
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2353
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2354
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2355
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2356
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2357
|
+
<span class="cline-any cline-no"> </span>
|
|
2358
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2359
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2360
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2361
|
+
<span class="cline-any cline-no"> </span>
|
|
2362
|
+
<span class="cline-any cline-no"> </span>
|
|
2363
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2364
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2365
|
+
<span class="cline-any cline-no"> </span>
|
|
2366
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2367
|
+
<span class="cline-any cline-no"> </span>
|
|
2368
|
+
<span class="cline-any cline-no"> </span>
|
|
2369
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2370
|
+
<span class="cline-any cline-no"> </span>
|
|
2371
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2372
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2373
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2374
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2375
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2376
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2377
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2378
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2379
|
+
<span class="cline-any cline-no"> </span>
|
|
2380
|
+
<span class="cline-any cline-no"> </span>
|
|
2381
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2382
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2383
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2384
|
+
<span class="cline-any cline-no"> </span>
|
|
2385
|
+
<span class="cline-any cline-no"> </span>
|
|
2386
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2387
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2388
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2389
|
+
<span class="cline-any cline-no"> </span>
|
|
2390
|
+
<span class="cline-any cline-no"> </span>
|
|
2391
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2392
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2393
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2394
|
+
<span class="cline-any cline-no"> </span>
|
|
2395
|
+
<span class="cline-any cline-no"> </span>
|
|
2396
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2397
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2398
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2399
|
+
<span class="cline-any cline-no"> </span>
|
|
2400
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2401
|
+
<span class="cline-any cline-no"> </span>
|
|
2402
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2403
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2404
|
+
<span class="cline-any cline-no"> </span>
|
|
2405
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2406
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2407
|
+
<span class="cline-any cline-no"> </span>
|
|
2408
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2409
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2410
|
+
<span class="cline-any cline-no"> </span>
|
|
2411
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2412
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2413
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2414
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2415
|
+
<span class="cline-any cline-no"> </span>
|
|
2416
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2417
|
+
<span class="cline-any cline-no"> </span>
|
|
2418
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2419
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2420
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2421
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2422
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2423
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2424
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2425
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2426
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2427
|
+
<span class="cline-any cline-no"> </span>
|
|
2428
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2429
|
+
<span class="cline-any cline-no"> </span>
|
|
2430
|
+
<span class="cline-any cline-no"> </span>
|
|
2431
|
+
<span class="cline-any cline-no"> </span>
|
|
2432
|
+
<span class="cline-any cline-no"> </span>
|
|
2433
|
+
<span class="cline-any cline-no"> </span>
|
|
2434
|
+
<span class="cline-any cline-no"> </span>
|
|
2435
|
+
<span class="cline-any cline-no"> </span>
|
|
2436
|
+
<span class="cline-any cline-no"> </span>
|
|
2437
|
+
<span class="cline-any cline-no"> </span>
|
|
2438
|
+
<span class="cline-any cline-no"> </span>
|
|
2439
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2440
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2441
|
+
<span class="cline-any cline-no"> </span>
|
|
2442
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2443
|
+
<span class="cline-any cline-no"> </span>
|
|
2444
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2445
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2446
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2447
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2448
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2449
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2450
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2451
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2452
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2453
|
+
<span class="cline-any cline-no"> </span>
|
|
2454
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2455
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2456
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2457
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2458
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2459
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2460
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2461
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2462
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2463
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2464
|
+
<span class="cline-any cline-no"> </span>
|
|
2465
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2466
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2467
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2468
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2469
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2470
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2471
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2472
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2473
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2474
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2475
|
+
<span class="cline-any cline-no"> </span>
|
|
2476
|
+
<span class="cline-any cline-no"> </span>
|
|
2477
|
+
<span class="cline-any cline-no"> </span>
|
|
2478
|
+
<span class="cline-any cline-no"> </span>
|
|
2479
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2480
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2481
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2482
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2483
|
+
<span class="cline-any cline-no"> </span>
|
|
2484
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2485
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2486
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2487
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2488
|
+
<span class="cline-any cline-no"> </span>
|
|
2489
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2490
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2491
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2492
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2493
|
+
<span class="cline-any cline-no"> </span>
|
|
2494
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2495
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2496
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2497
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2498
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2499
|
+
<span class="cline-any cline-no"> </span>
|
|
2500
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2501
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2502
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2503
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2504
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2505
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2506
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2507
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2508
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2509
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2510
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2511
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2512
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2513
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2514
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2515
|
+
<span class="cline-any cline-no"> </span>
|
|
2516
|
+
<span class="cline-any cline-no"> </span>
|
|
2517
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2518
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2519
|
+
<span class="cline-any cline-no"> </span>
|
|
2520
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2521
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2522
|
+
<span class="cline-any cline-no"> </span>
|
|
2523
|
+
<span class="cline-any cline-no"> </span>
|
|
2524
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2525
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2526
|
+
<span class="cline-any cline-no"> </span>
|
|
2527
|
+
<span class="cline-any cline-no"> </span>
|
|
2528
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2529
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2530
|
+
<span class="cline-any cline-no"> </span>
|
|
2531
|
+
<span class="cline-any cline-no"> </span>
|
|
2532
|
+
<span class="cline-any cline-no"> </span>
|
|
2533
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2534
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2535
|
+
<span class="cline-any cline-no"> </span>
|
|
2536
|
+
<span class="cline-any cline-no"> </span>
|
|
2537
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2538
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2539
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2540
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2541
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2542
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2543
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2544
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2545
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2546
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2547
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2548
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2549
|
+
<span class="cline-any cline-no"> </span>
|
|
2550
|
+
<span class="cline-any cline-no"> </span>
|
|
2551
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2552
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2553
|
+
<span class="cline-any cline-no"> </span>
|
|
2554
|
+
<span class="cline-any cline-no"> </span>
|
|
2555
|
+
<span class="cline-any cline-no"> </span>
|
|
2556
|
+
<span class="cline-any cline-no"> </span>
|
|
2557
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2558
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2559
|
+
<span class="cline-any cline-no"> </span>
|
|
2560
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2561
|
+
<span class="cline-any cline-no"> </span>
|
|
2562
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2563
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2564
|
+
<span class="cline-any cline-no"> </span>
|
|
2565
|
+
<span class="cline-any cline-no"> </span>
|
|
2566
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2567
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2568
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2569
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2570
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2571
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2572
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2573
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2574
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2575
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2576
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2577
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2578
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2579
|
+
<span class="cline-any cline-no"> </span>
|
|
2580
|
+
<span class="cline-any cline-no"> </span>
|
|
2581
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2582
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2583
|
+
<span class="cline-any cline-no"> </span>
|
|
2584
|
+
<span class="cline-any cline-no"> </span>
|
|
2585
|
+
<span class="cline-any cline-no"> </span>
|
|
2586
|
+
<span class="cline-any cline-no"> </span>
|
|
2587
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2588
|
+
<span class="cline-any cline-no"> </span>
|
|
2589
|
+
<span class="cline-any cline-no"> </span>
|
|
2590
|
+
<span class="cline-any cline-no"> </span>
|
|
2591
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2592
|
+
<span class="cline-any cline-no"> </span>
|
|
2593
|
+
<span class="cline-any cline-no"> </span>
|
|
2594
|
+
<span class="cline-any cline-no"> </span>
|
|
2595
|
+
<span class="cline-any cline-no"> </span>
|
|
2596
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2597
|
+
<span class="cline-any cline-no"> </span>
|
|
2598
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2599
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2600
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2601
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2602
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2603
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2604
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2605
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2606
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2607
|
+
<span class="cline-any cline-no"> </span>
|
|
2608
|
+
<span class="cline-any cline-no"> </span>
|
|
2609
|
+
<span class="cline-any cline-no"> </span>
|
|
2610
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2611
|
+
<span class="cline-any cline-no"> </span>
|
|
2612
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2613
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2614
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2615
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2616
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2617
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2618
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2619
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2620
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2621
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2622
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2623
|
+
<span class="cline-any cline-no"> </span>
|
|
2624
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2625
|
+
<span class="cline-any cline-no"> </span>
|
|
2626
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2627
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2628
|
+
<span class="cline-any cline-no"> </span>
|
|
2629
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2630
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2631
|
+
<span class="cline-any cline-no"> </span>
|
|
2632
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2633
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2634
|
+
<span class="cline-any cline-no"> </span>
|
|
2635
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2636
|
+
<span class="cline-any cline-no"> </span>
|
|
2637
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2638
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2639
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2640
|
+
<span class="cline-any cline-no"> </span>
|
|
2641
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2642
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2643
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2644
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2645
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2646
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2647
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2648
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2649
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2650
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2651
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2652
|
+
<span class="cline-any cline-no"> </span>
|
|
2653
|
+
<span class="cline-any cline-no"> </span>
|
|
2654
|
+
<span class="cline-any cline-no"> </span>
|
|
2655
|
+
<span class="cline-any cline-no"> </span>
|
|
2656
|
+
<span class="cline-any cline-no"> </span>
|
|
2657
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2658
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2659
|
+
<span class="cline-any cline-no"> </span>
|
|
2660
|
+
<span class="cline-any cline-no"> </span>
|
|
2661
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2662
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2663
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2664
|
+
<span class="cline-any cline-no"> </span>
|
|
2665
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2666
|
+
<span class="cline-any cline-no"> </span>
|
|
2667
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2668
|
+
<span class="cline-any cline-no"> </span>
|
|
2669
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2670
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2671
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2672
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2673
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2674
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2677
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2678
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2679
|
+
<span class="cline-any cline-no"> </span>
|
|
2680
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2681
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2682
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2683
|
+
<span class="cline-any cline-no"> </span>
|
|
2684
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2685
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2686
|
+
<span class="cline-any cline-no"> </span>
|
|
2687
|
+
<span class="cline-any cline-no"> </span>
|
|
2688
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2689
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2690
|
+
<span class="cline-any cline-no"> </span>
|
|
2691
|
+
<span class="cline-any cline-no"> </span>
|
|
2692
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2693
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2694
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2695
|
+
<span class="cline-any cline-no"> </span>
|
|
2696
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2698
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2699
|
+
<span class="cline-any cline-no"> </span>
|
|
2700
|
+
<span class="cline-any cline-no"> </span>
|
|
2701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2702
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2703
|
+
<span class="cline-any cline-no"> </span>
|
|
2704
|
+
<span class="cline-any cline-no"> </span>
|
|
2705
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2706
|
+
<span class="cline-any cline-no"> </span>
|
|
2707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2708
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2709
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2710
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2711
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2712
|
+
<span class="cline-any cline-no"> </span>
|
|
2713
|
+
<span class="cline-any cline-no"> </span>
|
|
2714
|
+
<span class="cline-any cline-no"> </span>
|
|
2715
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2716
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2717
|
+
<span class="cline-any cline-no"> </span>
|
|
2718
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2719
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2720
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2721
|
+
<span class="cline-any cline-no"> </span>
|
|
2722
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2723
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2724
|
+
<span class="cline-any cline-no"> </span>
|
|
2725
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2726
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2727
|
+
<span class="cline-any cline-no"> </span>
|
|
2728
|
+
<span class="cline-any cline-no"> </span>
|
|
2729
|
+
<span class="cline-any cline-no"> </span>
|
|
2730
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2731
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2732
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2733
|
+
<span class="cline-any cline-no"> </span>
|
|
2734
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2735
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2736
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2737
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2738
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2739
|
+
<span class="cline-any cline-no"> </span>
|
|
2740
|
+
<span class="cline-any cline-no"> </span>
|
|
2741
|
+
<span class="cline-any cline-no"> </span>
|
|
2742
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2743
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2744
|
+
<span class="cline-any cline-no"> </span>
|
|
2745
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2746
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2747
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2748
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2749
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2750
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import cliProgress from 'cli-progress';
|
|
2751
|
+
import { randomUUID } from 'crypto';
|
|
2752
|
+
import FormData from 'form-data';
|
|
2753
|
+
import fs from 'fs';
|
|
2754
|
+
import mime from 'mime-types';
|
|
2755
|
+
import path from 'path';
|
|
2756
|
+
|
|
2757
|
+
import databaseService from '../services/DatabaseService.js';
|
|
2758
|
+
import logger from '../services/LoggingService.js';
|
|
2759
|
+
import { createSignalHandler } from '../services/SignalHandler.js';
|
|
2760
|
+
import watchService from '../services/WatchService.js';
|
|
2761
|
+
import uploadServiceFactory from '../services/upload/UploadServiceFactory.js';
|
|
2762
|
+
|
|
2763
|
+
import appConfig from '../config/config.js';
|
|
2764
|
+
import ErrorHandler from '../errors/ErrorHandler.js';
|
|
2765
|
+
import { cleanupManager } from '../utils/CleanupManager.js';
|
|
2766
|
+
import FileOperations from '../utils/FileOperations.js';
|
|
2767
|
+
import fileSanitizer from '../utils/FileSanitizer.js';
|
|
2768
|
+
import watchEventHandler from '../utils/WatchEventHandler.js';
|
|
2769
|
+
import UploadCommand from './UploadCommand.js';
|
|
2770
|
+
|
|
2771
|
+
/**
|
|
2772
|
+
* Watch Command Handler
|
|
2773
|
+
* Monitors directories for changes and triggers uploads
|
|
2774
|
+
*/
|
|
2775
|
+
export class WatchCommand {
|
|
2776
|
+
<span class="fstat-no" title="function not covered" > co</span>nstructor() {
|
|
2777
|
+
<span class="cstat-no" title="statement not covered" > this.errorHandler = new ErrorHandler(logger);</span>
|
|
2778
|
+
<span class="cstat-no" title="statement not covered" > this.uploadCommand = new UploadCommand();</span>
|
|
2779
|
+
<span class="cstat-no" title="statement not covered" > this.uploadService = null;</span>
|
|
2780
|
+
<span class="cstat-no" title="statement not covered" > this.databaseService = databaseService;</span>
|
|
2781
|
+
<span class="cstat-no" title="statement not covered" > this.isShuttingDown = false;</span>
|
|
2782
|
+
|
|
2783
|
+
// Progress bars tracking
|
|
2784
|
+
<span class="cstat-no" title="statement not covered" > this.progressBars = null;</span>
|
|
2785
|
+
<span class="cstat-no" title="statement not covered" > this.progressMetrics = {</span>
|
|
2786
|
+
individual: { start: null, processed: 0, total: 0 },
|
|
2787
|
+
batch: { start: null, processed: 0, total: 0 },
|
|
2788
|
+
'full-structure': { start: null, processed: 0, total: 0 },
|
|
2789
|
+
};
|
|
2790
|
+
|
|
2791
|
+
// Upload statistics tracking
|
|
2792
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats = {</span>
|
|
2793
|
+
totalUploads: 0,
|
|
2794
|
+
totalFiles: 0,
|
|
2795
|
+
successCount: 0,
|
|
2796
|
+
failureCount: 0,
|
|
2797
|
+
retryCount: 0,
|
|
2798
|
+
lastUploadTime: null,
|
|
2799
|
+
uploadDetails: [],
|
|
2800
|
+
};
|
|
2801
|
+
|
|
2802
|
+
// Signal handling
|
|
2803
|
+
<span class="cstat-no" title="statement not covered" > this.signalHandler = createSignalHandler(logger, cleanupManager);</span>
|
|
2804
|
+
<span class="cstat-no" title="statement not covered" > this.sessionId = null;</span>
|
|
2805
|
+
}
|
|
2806
|
+
|
|
2807
|
+
/**
|
|
2808
|
+
* Execute the watch command
|
|
2809
|
+
* @param {Object} options - Command options
|
|
2810
|
+
* @returns {Promise<void>}
|
|
2811
|
+
*/
|
|
2812
|
+
<span class="fstat-no" title="function not covered" > as</span>ync execute(options) {
|
|
2813
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2814
|
+
// Validate configuration
|
|
2815
|
+
<span class="cstat-no" title="statement not covered" > this.#validateOptions(options); </span>// TDOO: Looks like this function is empty
|
|
2816
|
+
|
|
2817
|
+
// Parse directories to watch
|
|
2818
|
+
const directories = <span class="cstat-no" title="statement not covered" >this.#parseDirectories(options.directories);</span>
|
|
2819
|
+
|
|
2820
|
+
<span class="cstat-no" title="statement not covered" > if (directories.length === 0) {</span>
|
|
2821
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(</span>
|
|
2822
|
+
'No directories specified. Use --directories or WATCH_DIRECTORIES env var',
|
|
2823
|
+
);
|
|
2824
|
+
}
|
|
2825
|
+
|
|
2826
|
+
// Validate watch configuration
|
|
2827
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2828
|
+
<span class="cstat-no" title="statement not covered" > appConfig.validateWatchConfig(directories);</span>
|
|
2829
|
+
} catch (error) {
|
|
2830
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`Configuration error: ${error.message}`);</span>
|
|
2831
|
+
<span class="cstat-no" title="statement not covered" > throw error;</span>
|
|
2832
|
+
}
|
|
2833
|
+
|
|
2834
|
+
// Parse watch options
|
|
2835
|
+
const watchOptions = <span class="cstat-no" title="statement not covered" >this.#parseWatchOptions(options);</span>
|
|
2836
|
+
|
|
2837
|
+
// Clear log if requested
|
|
2838
|
+
<span class="cstat-no" title="statement not covered" > if (options.clearLog) {</span>
|
|
2839
|
+
<span class="cstat-no" title="statement not covered" > logger.clearLogFile();</span>
|
|
2840
|
+
<span class="cstat-no" title="statement not covered" > logger.info('Log file cleared');</span>
|
|
2841
|
+
}
|
|
2842
|
+
|
|
2843
|
+
// Initialize upload service
|
|
2844
|
+
// In cross-tenant mode, use the sourceApi for initial connection check
|
|
2845
|
+
// In single API mode, use the specified API target or default
|
|
2846
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2847
|
+
<span class="cstat-no" title="statement not covered" > if (appConfig.isCrossTenantMode()) {</span>
|
|
2848
|
+
// Cross-tenant mode: use sourceApi for the upload service
|
|
2849
|
+
<span class="cstat-no" title="statement not covered" > this.uploadService =</span>
|
|
2850
|
+
await uploadServiceFactory.getApiServiceForTarget(
|
|
2851
|
+
appConfig.api.sourceTarget,
|
|
2852
|
+
);
|
|
2853
|
+
<span class="cstat-no" title="statement not covered" > logger.info(</span>
|
|
2854
|
+
`Upload service initialized for cross-tenant mode (source: ${appConfig.api.sourceTarget})`,
|
|
2855
|
+
);
|
|
2856
|
+
} else <span class="cstat-no" title="statement not covered" >if (</span>
|
|
2857
|
+
appConfig.api.activeTarget &&
|
|
2858
|
+
appConfig.api.activeTarget !== 'default'
|
|
2859
|
+
) {
|
|
2860
|
+
// Single API mode with specific target
|
|
2861
|
+
<span class="cstat-no" title="statement not covered" > this.uploadService =</span>
|
|
2862
|
+
await uploadServiceFactory.getApiServiceForTarget(
|
|
2863
|
+
appConfig.api.activeTarget,
|
|
2864
|
+
);
|
|
2865
|
+
<span class="cstat-no" title="statement not covered" > logger.info(</span>
|
|
2866
|
+
`Upload service initialized for API target: ${appConfig.api.activeTarget}`,
|
|
2867
|
+
);
|
|
2868
|
+
} else {
|
|
2869
|
+
// Default mode
|
|
2870
|
+
<span class="cstat-no" title="statement not covered" > this.uploadService = await uploadServiceFactory.getUploadService(</span>
|
|
2871
|
+
options.forceSupabase,
|
|
2872
|
+
);
|
|
2873
|
+
<span class="cstat-no" title="statement not covered" > logger.info(</span>
|
|
2874
|
+
`Upload service initialized: ${this.uploadService.getServiceName()}`,
|
|
2875
|
+
);
|
|
2876
|
+
}
|
|
2877
|
+
} catch (error) {
|
|
2878
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`Failed to initialize upload service: ${error.message}`);</span>
|
|
2879
|
+
<span class="cstat-no" title="statement not covered" > throw error;</span>
|
|
2880
|
+
}
|
|
2881
|
+
|
|
2882
|
+
// Reset upload statistics
|
|
2883
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats = {</span>
|
|
2884
|
+
totalUploads: 0,
|
|
2885
|
+
totalFiles: 0,
|
|
2886
|
+
successCount: 0,
|
|
2887
|
+
failureCount: 0,
|
|
2888
|
+
retryCount: 0,
|
|
2889
|
+
lastUploadTime: null,
|
|
2890
|
+
uploadDetails: [],
|
|
2891
|
+
};
|
|
2892
|
+
|
|
2893
|
+
// Initialize session tracking
|
|
2894
|
+
const sessionId = <span class="cstat-no" title="statement not covered" >randomUUID();</span>
|
|
2895
|
+
<span class="cstat-no" title="statement not covered" > logger.initializeSession(sessionId);</span>
|
|
2896
|
+
|
|
2897
|
+
// Initialize progress bars
|
|
2898
|
+
<span class="cstat-no" title="statement not covered" > this.#initializeProgressBars();</span>
|
|
2899
|
+
|
|
2900
|
+
// Log startup
|
|
2901
|
+
<span class="cstat-no" title="statement not covered" > logger.info('═══════════════════════════════════════════════════════');</span>
|
|
2902
|
+
<span class="cstat-no" title="statement not covered" > logger.info('🟢 WATCH MODE STARTED');</span>
|
|
2903
|
+
<span class="cstat-no" title="statement not covered" > logger.info('═══════════════════════════════════════════════════════');</span>
|
|
2904
|
+
<span class="cstat-no" title="statement not covered" > logger.info(`📁 Watching ${directories.length} director(y/ies):`);</span>
|
|
2905
|
+
<span class="cstat-no" title="statement not covered" > directories.forEach(<span class="fstat-no" title="function not covered" >(d</span>irConfig) => {</span>
|
|
2906
|
+
const dirPath = <span class="cstat-no" title="statement not covered" >dirConfig.path || dirConfig;</span>
|
|
2907
|
+
const folderStructure = <span class="cstat-no" title="statement not covered" >dirConfig.folderStructure || 'default';</span>
|
|
2908
|
+
<span class="cstat-no" title="statement not covered" > logger.info(</span>
|
|
2909
|
+
` → ${path.resolve(dirPath)} [structure: ${folderStructure}]`,
|
|
2910
|
+
);
|
|
2911
|
+
});
|
|
2912
|
+
<span class="cstat-no" title="statement not covered" > logger.info(`🎯 Strategy: ${watchOptions.strategy}`);</span>
|
|
2913
|
+
<span class="cstat-no" title="statement not covered" > logger.info(`⏱️ Debounce: ${watchOptions.debounceMs}ms`);</span>
|
|
2914
|
+
<span class="cstat-no" title="statement not covered" > logger.info(`📦 Batch size: ${watchOptions.batchSize}`);</span>
|
|
2915
|
+
<span class="cstat-no" title="statement not covered" > logger.info('═══════════════════════════════════════════════════════\n');</span>
|
|
2916
|
+
|
|
2917
|
+
// Initialize watchers with directory configurations
|
|
2918
|
+
<span class="cstat-no" title="statement not covered" > for (const dirConfig of directories) {</span>
|
|
2919
|
+
const dirPath = <span class="cstat-no" title="statement not covered" >dirConfig.path || dirConfig;</span>
|
|
2920
|
+
<span class="cstat-no" title="statement not covered" > await watchService.addWatcher(</span>
|
|
2921
|
+
dirPath,
|
|
2922
|
+
{
|
|
2923
|
+
usePolling: watchOptions.usePolling,
|
|
2924
|
+
interval: watchOptions.interval,
|
|
2925
|
+
stabilityThreshold: watchOptions.stabilityThreshold,
|
|
2926
|
+
ignored: this.#parseIgnorePatterns(options.ignore),
|
|
2927
|
+
},
|
|
2928
|
+
dirConfig,
|
|
2929
|
+
);
|
|
2930
|
+
}
|
|
2931
|
+
|
|
2932
|
+
// Enable auto-processing if configured
|
|
2933
|
+
<span class="cstat-no" title="statement not covered" > if (options.autoProcessing !== false) {</span>
|
|
2934
|
+
<span class="cstat-no" title="statement not covered" > watchService.enableAutoProcessing({</span>
|
|
2935
|
+
batchSize: watchOptions.batchSize,
|
|
2936
|
+
});
|
|
2937
|
+
<span class="cstat-no" title="statement not covered" > logger.info('🔄 Auto-processing pipeline enabled');</span>
|
|
2938
|
+
}
|
|
2939
|
+
|
|
2940
|
+
// Set event handler with directory configurations
|
|
2941
|
+
<span class="cstat-no" title="statement not covered" > watchService.setEventHandler(<span class="fstat-no" title="function not covered" >as</span>ync (eventType, filePath) => {</span>
|
|
2942
|
+
<span class="cstat-no" title="statement not covered" > await this.#handleFileEvent(</span>
|
|
2943
|
+
eventType,
|
|
2944
|
+
filePath,
|
|
2945
|
+
options,
|
|
2946
|
+
watchOptions,
|
|
2947
|
+
directories,
|
|
2948
|
+
);
|
|
2949
|
+
});
|
|
2950
|
+
|
|
2951
|
+
// Start watching
|
|
2952
|
+
<span class="cstat-no" title="statement not covered" > await watchService.start();</span>
|
|
2953
|
+
|
|
2954
|
+
// Wait for all watchers to complete initial scan before processing
|
|
2955
|
+
<span class="cstat-no" title="statement not covered" > await watchService.waitForWatchersReady();</span>
|
|
2956
|
+
|
|
2957
|
+
// Setup signal handlers for graceful shutdown
|
|
2958
|
+
<span class="cstat-no" title="statement not covered" > this.#setupSignalHandlers();</span>
|
|
2959
|
+
|
|
2960
|
+
// Keep process alive
|
|
2961
|
+
<span class="cstat-no" title="statement not covered" > logger.info('💡 Press Ctrl+C to stop watching\n');</span>
|
|
2962
|
+
<span class="cstat-no" title="statement not covered" > await this.#keepProcessAlive();</span>
|
|
2963
|
+
} catch (error) {
|
|
2964
|
+
<span class="cstat-no" title="statement not covered" > this.errorHandler.handleFatalError(error, { command: 'watch' });</span>
|
|
2965
|
+
}
|
|
2966
|
+
}
|
|
2967
|
+
|
|
2968
|
+
/**
|
|
2969
|
+
* Handle file events
|
|
2970
|
+
* @private
|
|
2971
|
+
* @param {string} eventType - Type of event
|
|
2972
|
+
* @param {string} filePath - Path to file
|
|
2973
|
+
* @param {Object} options - Command options
|
|
2974
|
+
* @param {Object} watchOptions - Parsed watch options
|
|
2975
|
+
* @param {Array<Object>} directories - Array of directory configurations
|
|
2976
|
+
* @returns {Promise<void>}
|
|
2977
|
+
*/
|
|
2978
|
+
async #handleFileEvent(
|
|
2979
|
+
eventType,
|
|
2980
|
+
filePath,
|
|
2981
|
+
options,
|
|
2982
|
+
watchOptions,
|
|
2983
|
+
directories = <span class="branch-0 cbranch-no" title="branch not covered" >[],</span>
|
|
2984
|
+
) {
|
|
2985
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2986
|
+
// Skip if dry-run
|
|
2987
|
+
<span class="cstat-no" title="statement not covered" > if (options.dryRun) {</span>
|
|
2988
|
+
<span class="cstat-no" title="statement not covered" > logger.info(`[DRY RUN] Would upload: ${filePath}`);</span>
|
|
2989
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
2990
|
+
}
|
|
2991
|
+
|
|
2992
|
+
// Skip remove events
|
|
2993
|
+
<span class="cstat-no" title="statement not covered" > if (eventType === 'remove' || eventType === 'unlink') {</span>
|
|
2994
|
+
<span class="cstat-no" title="statement not covered" > logger.debug(`Skipping file removal event: ${filePath}`);</span>
|
|
2995
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
2996
|
+
}
|
|
2997
|
+
|
|
2998
|
+
// Skip if auto-processing is enabled (it handles file processing)
|
|
2999
|
+
<span class="cstat-no" title="statement not covered" > if (options.autoProcessing !== false) {</span>
|
|
3000
|
+
<span class="cstat-no" title="statement not covered" > logger.debug(</span>
|
|
3001
|
+
`[AutoProcessing] File event skipped (auto-processing is handling it): ${filePath}`,
|
|
3002
|
+
);
|
|
3003
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
3004
|
+
}
|
|
3005
|
+
|
|
3006
|
+
// Find which directory this file belongs to
|
|
3007
|
+
const watchDir = <span class="cstat-no" title="statement not covered" >this.#findWatchDirectory(filePath, directories);</span>
|
|
3008
|
+
const folderStructure = <span class="cstat-no" title="statement not covered" >watchDir?.folderStructure || 'default';</span>
|
|
3009
|
+
|
|
3010
|
+
// Execute upload based on strategy
|
|
3011
|
+
<span class="cstat-no" title="statement not covered" > switch (watchOptions.strategy) {</span>
|
|
3012
|
+
case 'individual':
|
|
3013
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3014
|
+
<span class="cstat-no" title="statement not covered" > await this.#uploadIndividual(filePath, options);</span>
|
|
3015
|
+
} catch (strategyError) {
|
|
3016
|
+
<span class="cstat-no" title="statement not covered" > logger.error(</span>
|
|
3017
|
+
`Error in individual upload: ${strategyError.message}`,
|
|
3018
|
+
);
|
|
3019
|
+
<span class="cstat-no" title="statement not covered" > throw strategyError;</span>
|
|
3020
|
+
}
|
|
3021
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3022
|
+
case 'batch':
|
|
3023
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3024
|
+
<span class="cstat-no" title="statement not covered" > await this.#uploadBatch(</span>
|
|
3025
|
+
filePath,
|
|
3026
|
+
options,
|
|
3027
|
+
watchOptions,
|
|
3028
|
+
directories,
|
|
3029
|
+
);
|
|
3030
|
+
} catch (strategyError) {
|
|
3031
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`Error in batch upload: ${strategyError.message}`);</span>
|
|
3032
|
+
<span class="cstat-no" title="statement not covered" > throw strategyError;</span>
|
|
3033
|
+
}
|
|
3034
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3035
|
+
case 'full-structure':
|
|
3036
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3037
|
+
<span class="cstat-no" title="statement not covered" > await this.#uploadFullStructure(</span>
|
|
3038
|
+
filePath,
|
|
3039
|
+
options,
|
|
3040
|
+
watchOptions,
|
|
3041
|
+
directories,
|
|
3042
|
+
);
|
|
3043
|
+
} catch (strategyError) {
|
|
3044
|
+
<span class="cstat-no" title="statement not covered" > logger.error(</span>
|
|
3045
|
+
`Error in full-structure upload: ${strategyError.message}`,
|
|
3046
|
+
);
|
|
3047
|
+
<span class="cstat-no" title="statement not covered" > throw strategyError;</span>
|
|
3048
|
+
}
|
|
3049
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3050
|
+
default:
|
|
3051
|
+
<span class="cstat-no" title="statement not covered" > logger.warn(`Unknown strategy: ${watchOptions.strategy}`);</span>
|
|
3052
|
+
}
|
|
3053
|
+
|
|
3054
|
+
// Increment upload counter
|
|
3055
|
+
const stats = <span class="cstat-no" title="statement not covered" >watchService.getStats();</span>
|
|
3056
|
+
<span class="cstat-no" title="statement not covered" > logger.info(</span>
|
|
3057
|
+
`📊 Stats: +${stats.filesAdded} files, +${stats.filesModified} modified`,
|
|
3058
|
+
);
|
|
3059
|
+
} catch (error) {
|
|
3060
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`Error handling file event: ${error.message}`);</span>
|
|
3061
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`Stack: ${error.stack}`);</span>
|
|
3062
|
+
// Log the full error for debugging
|
|
3063
|
+
<span class="cstat-no" title="statement not covered" > if (error.code) {</span>
|
|
3064
|
+
<span class="cstat-no" title="statement not covered" > logger.debug(`Error code: ${error.code}`);</span>
|
|
3065
|
+
}
|
|
3066
|
+
}
|
|
3067
|
+
}
|
|
3068
|
+
|
|
3069
|
+
/**
|
|
3070
|
+
* Find which watch directory a file belongs to
|
|
3071
|
+
* @private
|
|
3072
|
+
* @param {string} filePath - Path to file
|
|
3073
|
+
* @param {Array<Object>} directories - Array of directory configurations
|
|
3074
|
+
* @returns {Object|null} Directory configuration or null
|
|
3075
|
+
*/
|
|
3076
|
+
#findWatchDirectory(filePath, directories) {
|
|
3077
|
+
const normalizedFilePath = <span class="cstat-no" title="statement not covered" >path.resolve(filePath);</span>
|
|
3078
|
+
|
|
3079
|
+
<span class="cstat-no" title="statement not covered" > for (const dirConfig of directories) {</span>
|
|
3080
|
+
const dirPath = <span class="cstat-no" title="statement not covered" >dirConfig.path || dirConfig;</span>
|
|
3081
|
+
const normalizedDirPath = <span class="cstat-no" title="statement not covered" >path.resolve(dirPath);</span>
|
|
3082
|
+
|
|
3083
|
+
<span class="cstat-no" title="statement not covered" > if (normalizedFilePath.startsWith(normalizedDirPath)) {</span>
|
|
3084
|
+
<span class="cstat-no" title="statement not covered" > return dirConfig;</span>
|
|
3085
|
+
}
|
|
3086
|
+
}
|
|
3087
|
+
|
|
3088
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
3089
|
+
}
|
|
3090
|
+
|
|
3091
|
+
/**
|
|
3092
|
+
* Retry upload with exponential backoff
|
|
3093
|
+
* @private
|
|
3094
|
+
* @param {Function} uploadFn - Function that performs the upload
|
|
3095
|
+
* @param {number} maxRetries - Maximum number of retries
|
|
3096
|
+
* @param {number} initialBackoffMs - Initial backoff in milliseconds
|
|
3097
|
+
* @returns {Promise<any>} Upload result
|
|
3098
|
+
* @throws {Error} If all retries fail
|
|
3099
|
+
*/
|
|
3100
|
+
async #retryUpload(uploadFn, maxRetries = <span class="branch-0 cbranch-no" title="branch not covered" >3,</span> initialBackoffMs = <span class="branch-0 cbranch-no" title="branch not covered" >1000)</span> {
|
|
3101
|
+
let lastError;
|
|
3102
|
+
|
|
3103
|
+
<span class="cstat-no" title="statement not covered" > for (let attempt = <span class="cstat-no" title="statement not covered" >1;</span> attempt <= maxRetries; attempt++) {</span>
|
|
3104
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3105
|
+
<span class="cstat-no" title="statement not covered" > return await uploadFn();</span>
|
|
3106
|
+
} catch (error) {
|
|
3107
|
+
<span class="cstat-no" title="statement not covered" > lastError = error;</span>
|
|
3108
|
+
|
|
3109
|
+
<span class="cstat-no" title="statement not covered" > if (attempt === maxRetries) {</span>
|
|
3110
|
+
<span class="cstat-no" title="statement not covered" > throw error;</span>
|
|
3111
|
+
}
|
|
3112
|
+
|
|
3113
|
+
const backoffMs = <span class="cstat-no" title="statement not covered" >initialBackoffMs * Math.pow(2, attempt - 1);</span>
|
|
3114
|
+
<span class="cstat-no" title="statement not covered" > logger.warn(</span>
|
|
3115
|
+
`Upload failed (attempt ${attempt}/${maxRetries}), retrying in ${backoffMs}ms: ${error.message}`,
|
|
3116
|
+
);
|
|
3117
|
+
|
|
3118
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.retryCount++;</span>
|
|
3119
|
+
|
|
3120
|
+
// Wait before retrying
|
|
3121
|
+
<span class="cstat-no" title="statement not covered" > await new Promise(<span class="fstat-no" title="function not covered" >(r</span>esolve) => <span class="cstat-no" title="statement not covered" >setTimeout(resolve, backoffMs))</span>;</span>
|
|
3122
|
+
}
|
|
3123
|
+
}
|
|
3124
|
+
|
|
3125
|
+
<span class="cstat-no" title="statement not covered" > throw lastError;</span>
|
|
3126
|
+
}
|
|
3127
|
+
|
|
3128
|
+
/**
|
|
3129
|
+
* Prepare a file for upload with metadata
|
|
3130
|
+
* @private
|
|
3131
|
+
* @param {string} filePath - Absolute path to file
|
|
3132
|
+
* @param {Object} options - Command options
|
|
3133
|
+
* @returns {Object} File object for upload
|
|
3134
|
+
*/
|
|
3135
|
+
#prepareFileForUpload(filePath, options) {
|
|
3136
|
+
const stats = <span class="cstat-no" title="statement not covered" >FileOperations.getFileStats(filePath);</span>
|
|
3137
|
+
|
|
3138
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
3139
|
+
path: filePath,
|
|
3140
|
+
name: path.basename(filePath),
|
|
3141
|
+
relativePath: path.basename(filePath),
|
|
3142
|
+
contentType: mime.lookup(filePath) || 'application/octet-stream',
|
|
3143
|
+
size: stats?.size || 0,
|
|
3144
|
+
metadata: {
|
|
3145
|
+
source: 'watch-mode',
|
|
3146
|
+
timestamp: new Date().toISOString(),
|
|
3147
|
+
watchSource: path.dirname(filePath),
|
|
3148
|
+
},
|
|
3149
|
+
};
|
|
3150
|
+
}
|
|
3151
|
+
|
|
3152
|
+
/**
|
|
3153
|
+
* Upload individual file
|
|
3154
|
+
* @private
|
|
3155
|
+
* @param {string} filePath - File path to upload
|
|
3156
|
+
* @param {Object} options - Command options
|
|
3157
|
+
* @returns {Promise<void>}
|
|
3158
|
+
*/
|
|
3159
|
+
async #uploadIndividual(filePath, options) {
|
|
3160
|
+
const startTime = <span class="cstat-no" title="statement not covered" >Date.now();</span>
|
|
3161
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3162
|
+
<span class="cstat-no" title="statement not covered" > logger.info(`📤 [INDIVIDUAL] Uploading: ${filePath}`);</span>
|
|
3163
|
+
|
|
3164
|
+
// Get file object from event handler
|
|
3165
|
+
const files = <span class="cstat-no" title="statement not covered" >await watchEventHandler.getFilesForUpload('individual', {</span>
|
|
3166
|
+
sourceDir: path.dirname(filePath),
|
|
3167
|
+
});
|
|
3168
|
+
|
|
3169
|
+
<span class="cstat-no" title="statement not covered" > if (files.length === 0) {</span>
|
|
3170
|
+
<span class="cstat-no" title="statement not covered" > logger.warn(`No valid files to upload for: ${filePath}`);</span>
|
|
3171
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
3172
|
+
}
|
|
3173
|
+
|
|
3174
|
+
const file = <span class="cstat-no" title="statement not covered" >files[0];</span>
|
|
3175
|
+
<span class="cstat-no" title="statement not covered" > logger.info(` File: ${file.name} (${this.#formatFileSize(file.size)})`);</span>
|
|
3176
|
+
|
|
3177
|
+
// Validate file exists and is accessible
|
|
3178
|
+
<span class="cstat-no" title="statement not covered" > if (!FileOperations.fileExists(file.path)) {</span>
|
|
3179
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`File not accessible: ${file.path}`);</span>
|
|
3180
|
+
}
|
|
3181
|
+
|
|
3182
|
+
// ✅ CRITICAL: Validate file has been evaluated by watcher
|
|
3183
|
+
const validatedFiles = <span class="cstat-no" title="statement not covered" >this.#validateFilesAreWatched([file]);</span>
|
|
3184
|
+
<span class="cstat-no" title="statement not covered" > if (validatedFiles.length === 0) {</span>
|
|
3185
|
+
<span class="cstat-no" title="statement not covered" > logger.warn(</span>
|
|
3186
|
+
`⚠️ File was not properly evaluated by watcher: ${file.name}`,
|
|
3187
|
+
);
|
|
3188
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.failureCount++;</span>
|
|
3189
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.uploadDetails.push({</span>
|
|
3190
|
+
timestamp: new Date().toISOString(),
|
|
3191
|
+
fileName: file.name,
|
|
3192
|
+
strategy: 'individual',
|
|
3193
|
+
status: 'rejected',
|
|
3194
|
+
reason: 'Not evaluated by watcher',
|
|
3195
|
+
duration: Date.now() - startTime,
|
|
3196
|
+
});
|
|
3197
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
3198
|
+
}
|
|
3199
|
+
|
|
3200
|
+
// Prepare file for upload with metadata
|
|
3201
|
+
const fileForUpload = <span class="cstat-no" title="statement not covered" >this.#prepareFileForUpload(file.path, options);</span>
|
|
3202
|
+
|
|
3203
|
+
// Create upload with retries
|
|
3204
|
+
const result = <span class="cstat-no" title="statement not covered" >await this.#retryUpload(</span>
|
|
3205
|
+
<span class="fstat-no" title="function not covered" > as</span>ync () => {
|
|
3206
|
+
const uploadResult = <span class="cstat-no" title="statement not covered" >await this.uploadService.upload(</span>
|
|
3207
|
+
[fileForUpload],
|
|
3208
|
+
{
|
|
3209
|
+
strategy: 'individual',
|
|
3210
|
+
sourceType: 'watch-mode',
|
|
3211
|
+
},
|
|
3212
|
+
);
|
|
3213
|
+
<span class="cstat-no" title="statement not covered" > return uploadResult;</span>
|
|
3214
|
+
},
|
|
3215
|
+
3,
|
|
3216
|
+
1000,
|
|
3217
|
+
);
|
|
3218
|
+
|
|
3219
|
+
// Update statistics
|
|
3220
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.totalUploads++;</span>
|
|
3221
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.totalFiles++;</span>
|
|
3222
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.successCount++;</span>
|
|
3223
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.lastUploadTime = new Date();</span>
|
|
3224
|
+
|
|
3225
|
+
// Record upload details
|
|
3226
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.uploadDetails.push({</span>
|
|
3227
|
+
timestamp: new Date().toISOString(),
|
|
3228
|
+
fileName: file.name,
|
|
3229
|
+
size: file.size,
|
|
3230
|
+
strategy: 'individual',
|
|
3231
|
+
status: 'success',
|
|
3232
|
+
duration: Date.now() - startTime,
|
|
3233
|
+
});
|
|
3234
|
+
|
|
3235
|
+
<span class="cstat-no" title="statement not covered" > logger.info(`✅ Upload successful: ${file.name}`);</span>
|
|
3236
|
+
<span class="cstat-no" title="statement not covered" > watchService.stats.uploadsTriggered++;</span>
|
|
3237
|
+
} catch (error) {
|
|
3238
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.failureCount++;</span>
|
|
3239
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`❌ Error uploading individual file: ${error.message}`);</span>
|
|
3240
|
+
|
|
3241
|
+
// Record failed upload
|
|
3242
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.uploadDetails.push({</span>
|
|
3243
|
+
timestamp: new Date().toISOString(),
|
|
3244
|
+
fileName: path.basename(filePath),
|
|
3245
|
+
strategy: 'individual',
|
|
3246
|
+
status: 'failed',
|
|
3247
|
+
error: error.message,
|
|
3248
|
+
duration: Date.now() - startTime,
|
|
3249
|
+
});
|
|
3250
|
+
}
|
|
3251
|
+
}
|
|
3252
|
+
|
|
3253
|
+
/**
|
|
3254
|
+
* Upload batch of files
|
|
3255
|
+
* @private
|
|
3256
|
+
* @param {string} filePath - Triggering file path
|
|
3257
|
+
* @param {Object} options - Command options
|
|
3258
|
+
* @param {Object} watchOptions - Watch options
|
|
3259
|
+
* @returns {Promise<void>}
|
|
3260
|
+
*/
|
|
3261
|
+
/**
|
|
3262
|
+
* Upload batch of files
|
|
3263
|
+
* @private
|
|
3264
|
+
* @param {string} filePath - Triggering file path
|
|
3265
|
+
* @param {Object} options - Command options
|
|
3266
|
+
* @param {Object} watchOptions - Watch options
|
|
3267
|
+
* @param {Array<Object>} directories - Array of directory configurations
|
|
3268
|
+
* @returns {Promise<void>}
|
|
3269
|
+
*/
|
|
3270
|
+
async #uploadBatch(filePath, options, watchOptions, directories = <span class="branch-0 cbranch-no" title="branch not covered" >[])</span> {
|
|
3271
|
+
const startTime = <span class="cstat-no" title="statement not covered" >Date.now();</span>
|
|
3272
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3273
|
+
<span class="cstat-no" title="statement not covered" > logger.info(`📤 [BATCH] Upload triggered by: ${filePath}`);</span>
|
|
3274
|
+
|
|
3275
|
+
// Find the watch directory for this file
|
|
3276
|
+
const watchDirConfig = <span class="cstat-no" title="statement not covered" >this.#findWatchDirectory(filePath, directories);</span>
|
|
3277
|
+
const folderStructure = <span class="cstat-no" title="statement not covered" >watchDirConfig?.folderStructure || 'default';</span>
|
|
3278
|
+
|
|
3279
|
+
// Get batch of files from event handler
|
|
3280
|
+
const files = <span class="cstat-no" title="statement not covered" >await watchEventHandler.getFilesForUpload('batch', {</span>
|
|
3281
|
+
batchSize: watchOptions.batchSize,
|
|
3282
|
+
sourceDir: path.dirname(filePath),
|
|
3283
|
+
});
|
|
3284
|
+
|
|
3285
|
+
<span class="cstat-no" title="statement not covered" > if (files.length === 0) {</span>
|
|
3286
|
+
<span class="cstat-no" title="statement not covered" > logger.warn('No valid files found for batch upload');</span>
|
|
3287
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
3288
|
+
}
|
|
3289
|
+
|
|
3290
|
+
// Log batch details
|
|
3291
|
+
<span class="cstat-no" title="statement not covered" > logger.info(` Batch size: ${files.length} files`);</span>
|
|
3292
|
+
<span class="cstat-no" title="statement not covered" > logger.info(` Folder structure: ${folderStructure}`);</span>
|
|
3293
|
+
let totalSize = <span class="cstat-no" title="statement not covered" >0;</span>
|
|
3294
|
+
<span class="cstat-no" title="statement not covered" > files.forEach(<span class="fstat-no" title="function not covered" >(f</span>ile) => {</span>
|
|
3295
|
+
<span class="cstat-no" title="statement not covered" > totalSize += file.size;</span>
|
|
3296
|
+
<span class="cstat-no" title="statement not covered" > logger.debug(` - ${file.name} (${this.#formatFileSize(file.size)})`);</span>
|
|
3297
|
+
});
|
|
3298
|
+
|
|
3299
|
+
<span class="cstat-no" title="statement not covered" > logger.info(` Total size: ${this.#formatFileSize(totalSize)}`);</span>
|
|
3300
|
+
|
|
3301
|
+
// Validate all files exist
|
|
3302
|
+
const invalidFiles = <span class="cstat-no" title="statement not covered" >files.filter(</span>
|
|
3303
|
+
<span class="fstat-no" title="function not covered" > (f</span>) => <span class="cstat-no" title="statement not covered" >!FileOperations.fileExists(f.path),</span>
|
|
3304
|
+
);
|
|
3305
|
+
<span class="cstat-no" title="statement not covered" > if (invalidFiles.length > 0) {</span>
|
|
3306
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`${invalidFiles.length} file(s) not accessible`);</span>
|
|
3307
|
+
}
|
|
3308
|
+
|
|
3309
|
+
// ✅ CRITICAL: Validate files have been evaluated by watcher
|
|
3310
|
+
const validatedFiles = <span class="cstat-no" title="statement not covered" >this.#validateFilesAreWatched(files);</span>
|
|
3311
|
+
<span class="cstat-no" title="statement not covered" > if (validatedFiles.length === 0) {</span>
|
|
3312
|
+
<span class="cstat-no" title="statement not covered" > logger.warn(</span>
|
|
3313
|
+
`⚠️ None of the ${files.length} files were properly evaluated by watcher`,
|
|
3314
|
+
);
|
|
3315
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.failureCount += files.length;</span>
|
|
3316
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.uploadDetails.push({</span>
|
|
3317
|
+
timestamp: new Date().toISOString(),
|
|
3318
|
+
fileCount: files.length,
|
|
3319
|
+
strategy: 'batch',
|
|
3320
|
+
status: 'rejected',
|
|
3321
|
+
reason: 'No files evaluated by watcher',
|
|
3322
|
+
duration: Date.now() - startTime,
|
|
3323
|
+
});
|
|
3324
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
3325
|
+
}
|
|
3326
|
+
|
|
3327
|
+
<span class="cstat-no" title="statement not covered" > if (validatedFiles.length < files.length) {</span>
|
|
3328
|
+
<span class="cstat-no" title="statement not covered" > logger.warn(</span>
|
|
3329
|
+
`⚠️ Only ${validatedFiles.length}/${files.length} files were properly evaluated by watcher. Uploading only validated files.`,
|
|
3330
|
+
);
|
|
3331
|
+
}
|
|
3332
|
+
|
|
3333
|
+
// Prepare files for upload
|
|
3334
|
+
const filesForUpload = <span class="cstat-no" title="statement not covered" >validatedFiles.map(<span class="fstat-no" title="function not covered" >(f</span>) =></span>
|
|
3335
|
+
<span class="cstat-no" title="statement not covered" > this.#prepareFileForUpload(f.path, options),</span>
|
|
3336
|
+
);
|
|
3337
|
+
|
|
3338
|
+
// Create upload with retries
|
|
3339
|
+
const result = <span class="cstat-no" title="statement not covered" >await this.#retryUpload(</span>
|
|
3340
|
+
<span class="fstat-no" title="function not covered" > as</span>ync () => {
|
|
3341
|
+
const uploadResult = <span class="cstat-no" title="statement not covered" >await this.uploadService.upload(filesForUpload, {</span>
|
|
3342
|
+
strategy: 'batch',
|
|
3343
|
+
batchSize: watchOptions.batchSize,
|
|
3344
|
+
sourceType: 'watch-mode',
|
|
3345
|
+
});
|
|
3346
|
+
<span class="cstat-no" title="statement not covered" > return uploadResult;</span>
|
|
3347
|
+
},
|
|
3348
|
+
3,
|
|
3349
|
+
1000,
|
|
3350
|
+
);
|
|
3351
|
+
|
|
3352
|
+
// Update statistics
|
|
3353
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.totalUploads++;</span>
|
|
3354
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.totalFiles += files.length;</span>
|
|
3355
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.successCount += files.length;</span>
|
|
3356
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.lastUploadTime = new Date();</span>
|
|
3357
|
+
|
|
3358
|
+
// Record upload details
|
|
3359
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.uploadDetails.push({</span>
|
|
3360
|
+
timestamp: new Date().toISOString(),
|
|
3361
|
+
fileCount: files.length,
|
|
3362
|
+
strategy: 'batch',
|
|
3363
|
+
folderStructure,
|
|
3364
|
+
status: 'success',
|
|
3365
|
+
duration: Date.now() - startTime,
|
|
3366
|
+
});
|
|
3367
|
+
|
|
3368
|
+
<span class="cstat-no" title="statement not covered" > logger.info(`✅ Batch upload successful: ${files.length} files`);</span>
|
|
3369
|
+
<span class="cstat-no" title="statement not covered" > watchService.stats.uploadsTriggered++;</span>
|
|
3370
|
+
|
|
3371
|
+
// Clear processed events
|
|
3372
|
+
<span class="cstat-no" title="statement not covered" > watchEventHandler.clearProcessed();</span>
|
|
3373
|
+
} catch (error) {
|
|
3374
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.failureCount += files?.length || 1;</span>
|
|
3375
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`❌ Error uploading batch: ${error.message}`);</span>
|
|
3376
|
+
|
|
3377
|
+
// Record failed upload
|
|
3378
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.uploadDetails.push({</span>
|
|
3379
|
+
timestamp: new Date().toISOString(),
|
|
3380
|
+
strategy: 'batch',
|
|
3381
|
+
status: 'failed',
|
|
3382
|
+
error: error.message,
|
|
3383
|
+
duration: Date.now() - startTime,
|
|
3384
|
+
});
|
|
3385
|
+
}
|
|
3386
|
+
}
|
|
3387
|
+
|
|
3388
|
+
/**
|
|
3389
|
+
* Upload full directory structure
|
|
3390
|
+
* @private
|
|
3391
|
+
* @param {string} filePath - Triggering file path
|
|
3392
|
+
* @param {Object} options - Command options
|
|
3393
|
+
* @param {Object} watchOptions - Watch options
|
|
3394
|
+
* @param {Array<Object>} directories - Array of directory configurations
|
|
3395
|
+
* @returns {Promise<void>}
|
|
3396
|
+
*/
|
|
3397
|
+
async #uploadFullStructure(
|
|
3398
|
+
filePath,
|
|
3399
|
+
options,
|
|
3400
|
+
watchOptions,
|
|
3401
|
+
directories = <span class="branch-0 cbranch-no" title="branch not covered" >[],</span>
|
|
3402
|
+
) {
|
|
3403
|
+
const startTime = <span class="cstat-no" title="statement not covered" >Date.now();</span>
|
|
3404
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3405
|
+
<span class="cstat-no" title="statement not covered" > logger.info(`📤 [FULL-STRUCTURE] Upload triggered by: ${filePath}`);</span>
|
|
3406
|
+
|
|
3407
|
+
// Find the watch directory for this file
|
|
3408
|
+
const watchDirConfig = <span class="cstat-no" title="statement not covered" >this.#findWatchDirectory(filePath, directories);</span>
|
|
3409
|
+
const folderStructure = <span class="cstat-no" title="statement not covered" >watchDirConfig?.folderStructure || 'default';</span>
|
|
3410
|
+
|
|
3411
|
+
// Get full structure from event handler
|
|
3412
|
+
const files = <span class="cstat-no" title="statement not covered" >await watchEventHandler.getFilesForUpload(</span>
|
|
3413
|
+
'full-structure',
|
|
3414
|
+
{
|
|
3415
|
+
sourceDir: path.dirname(filePath),
|
|
3416
|
+
},
|
|
3417
|
+
);
|
|
3418
|
+
|
|
3419
|
+
<span class="cstat-no" title="statement not covered" > if (files.length === 0) {</span>
|
|
3420
|
+
<span class="cstat-no" title="statement not covered" > logger.warn('No valid files found for full structure upload');</span>
|
|
3421
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
3422
|
+
}
|
|
3423
|
+
|
|
3424
|
+
// Log structure details
|
|
3425
|
+
<span class="cstat-no" title="statement not covered" > logger.info(` Structure size: ${files.length} files`);</span>
|
|
3426
|
+
<span class="cstat-no" title="statement not covered" > logger.info(` Folder structure: ${folderStructure}`);</span>
|
|
3427
|
+
let totalSize = <span class="cstat-no" title="statement not covered" >0;</span>
|
|
3428
|
+
const directoriesInStructure = <span class="cstat-no" title="statement not covered" >new Set();</span>
|
|
3429
|
+
|
|
3430
|
+
<span class="cstat-no" title="statement not covered" > files.forEach(<span class="fstat-no" title="function not covered" >(f</span>ile) => {</span>
|
|
3431
|
+
<span class="cstat-no" title="statement not covered" > totalSize += file.size;</span>
|
|
3432
|
+
const dir = <span class="cstat-no" title="statement not covered" >path.dirname(file.path);</span>
|
|
3433
|
+
<span class="cstat-no" title="statement not covered" > directoriesInStructure.add(dir);</span>
|
|
3434
|
+
});
|
|
3435
|
+
|
|
3436
|
+
<span class="cstat-no" title="statement not covered" > logger.info(` Directories: ${directoriesInStructure.size}`);</span>
|
|
3437
|
+
<span class="cstat-no" title="statement not covered" > logger.info(` Total size: ${this.#formatFileSize(totalSize)}`);</span>
|
|
3438
|
+
|
|
3439
|
+
// Validate all files exist
|
|
3440
|
+
const invalidFiles = <span class="cstat-no" title="statement not covered" >files.filter(</span>
|
|
3441
|
+
<span class="fstat-no" title="function not covered" > (f</span>) => <span class="cstat-no" title="statement not covered" >!FileOperations.fileExists(f.path),</span>
|
|
3442
|
+
);
|
|
3443
|
+
<span class="cstat-no" title="statement not covered" > if (invalidFiles.length > 0) {</span>
|
|
3444
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(</span>
|
|
3445
|
+
`${invalidFiles.length} file(s) not accessible in structure`,
|
|
3446
|
+
);
|
|
3447
|
+
}
|
|
3448
|
+
|
|
3449
|
+
// ✅ CRITICAL: Validate files have been evaluated by watcher
|
|
3450
|
+
const validatedFiles = <span class="cstat-no" title="statement not covered" >this.#validateFilesAreWatched(files);</span>
|
|
3451
|
+
<span class="cstat-no" title="statement not covered" > if (validatedFiles.length === 0) {</span>
|
|
3452
|
+
<span class="cstat-no" title="statement not covered" > logger.warn(</span>
|
|
3453
|
+
`⚠️ None of the ${files.length} files were properly evaluated by watcher`,
|
|
3454
|
+
);
|
|
3455
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.failureCount += files.length;</span>
|
|
3456
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.uploadDetails.push({</span>
|
|
3457
|
+
timestamp: new Date().toISOString(),
|
|
3458
|
+
fileCount: files.length,
|
|
3459
|
+
strategy: 'full-structure',
|
|
3460
|
+
status: 'rejected',
|
|
3461
|
+
reason: 'No files evaluated by watcher',
|
|
3462
|
+
duration: Date.now() - startTime,
|
|
3463
|
+
});
|
|
3464
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
3465
|
+
}
|
|
3466
|
+
|
|
3467
|
+
<span class="cstat-no" title="statement not covered" > if (validatedFiles.length < files.length) {</span>
|
|
3468
|
+
<span class="cstat-no" title="statement not covered" > logger.warn(</span>
|
|
3469
|
+
`⚠️ Only ${validatedFiles.length}/${files.length} files were properly evaluated by watcher. Uploading only validated files.`,
|
|
3470
|
+
);
|
|
3471
|
+
}
|
|
3472
|
+
|
|
3473
|
+
// Prepare files for upload
|
|
3474
|
+
const filesForUpload = <span class="cstat-no" title="statement not covered" >validatedFiles.map(<span class="fstat-no" title="function not covered" >(f</span>) =></span>
|
|
3475
|
+
<span class="cstat-no" title="statement not covered" > this.#prepareFileForUpload(f.path, options),</span>
|
|
3476
|
+
);
|
|
3477
|
+
|
|
3478
|
+
// Create upload with retries
|
|
3479
|
+
const result = <span class="cstat-no" title="statement not covered" >await this.#retryUpload(</span>
|
|
3480
|
+
<span class="fstat-no" title="function not covered" > as</span>ync () => {
|
|
3481
|
+
const uploadResult = <span class="cstat-no" title="statement not covered" >await this.uploadService.upload(filesForUpload, {</span>
|
|
3482
|
+
strategy: 'full-structure',
|
|
3483
|
+
sourceType: 'watch-mode',
|
|
3484
|
+
metadata: {
|
|
3485
|
+
totalFiles: files.length,
|
|
3486
|
+
totalDirectories: directoriesInStructure.size,
|
|
3487
|
+
totalSize: totalSize,
|
|
3488
|
+
folderStructure: folderStructure,
|
|
3489
|
+
},
|
|
3490
|
+
});
|
|
3491
|
+
<span class="cstat-no" title="statement not covered" > return uploadResult;</span>
|
|
3492
|
+
},
|
|
3493
|
+
3,
|
|
3494
|
+
1000,
|
|
3495
|
+
);
|
|
3496
|
+
|
|
3497
|
+
// Update statistics
|
|
3498
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.totalUploads++;</span>
|
|
3499
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.totalFiles += files.length;</span>
|
|
3500
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.successCount += files.length;</span>
|
|
3501
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.lastUploadTime = new Date();</span>
|
|
3502
|
+
|
|
3503
|
+
// Record upload details
|
|
3504
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.uploadDetails.push({</span>
|
|
3505
|
+
timestamp: new Date().toISOString(),
|
|
3506
|
+
fileCount: files.length,
|
|
3507
|
+
dirCount: directories.size,
|
|
3508
|
+
strategy: 'full-structure',
|
|
3509
|
+
status: 'success',
|
|
3510
|
+
duration: Date.now() - startTime,
|
|
3511
|
+
});
|
|
3512
|
+
|
|
3513
|
+
<span class="cstat-no" title="statement not covered" > logger.info(</span>
|
|
3514
|
+
`✅ Full structure upload successful: ${files.length} files in ${directories.size} directories`,
|
|
3515
|
+
);
|
|
3516
|
+
<span class="cstat-no" title="statement not covered" > watchService.stats.uploadsTriggered++;</span>
|
|
3517
|
+
|
|
3518
|
+
// Clear processed events
|
|
3519
|
+
<span class="cstat-no" title="statement not covered" > watchEventHandler.clearProcessed();</span>
|
|
3520
|
+
} catch (error) {
|
|
3521
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.failureCount += files?.length || 1;</span>
|
|
3522
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`❌ Error uploading full structure: ${error.message}`);</span>
|
|
3523
|
+
|
|
3524
|
+
// Record failed upload
|
|
3525
|
+
<span class="cstat-no" title="statement not covered" > this.uploadStats.uploadDetails.push({</span>
|
|
3526
|
+
timestamp: new Date().toISOString(),
|
|
3527
|
+
strategy: 'full-structure',
|
|
3528
|
+
status: 'failed',
|
|
3529
|
+
error: error.message,
|
|
3530
|
+
duration: Date.now() - startTime,
|
|
3531
|
+
});
|
|
3532
|
+
}
|
|
3533
|
+
}
|
|
3534
|
+
|
|
3535
|
+
/**
|
|
3536
|
+
* Validate that files have been properly evaluated by the watcher
|
|
3537
|
+
* CRITICAL: Ensures NO files are uploaded without watcher evaluation
|
|
3538
|
+
* @private
|
|
3539
|
+
* @param {Array<Object>} files - Files to validate
|
|
3540
|
+
* @returns {Array<Object>} Only files that have been evaluated by watcher
|
|
3541
|
+
*/
|
|
3542
|
+
#validateFilesAreWatched(files) {
|
|
3543
|
+
<span class="cstat-no" title="statement not covered" > if (!files || files.length === 0) {</span>
|
|
3544
|
+
<span class="cstat-no" title="statement not covered" > return [];</span>
|
|
3545
|
+
}
|
|
3546
|
+
|
|
3547
|
+
// Get watched directories from WatchService
|
|
3548
|
+
const watchedDirs = <span class="cstat-no" title="statement not covered" >watchService.getWatchedDirs();</span>
|
|
3549
|
+
|
|
3550
|
+
<span class="cstat-no" title="statement not covered" > if (!watchedDirs || watchedDirs.length === 0) {</span>
|
|
3551
|
+
<span class="cstat-no" title="statement not covered" > logger.warn(</span>
|
|
3552
|
+
'⚠️ No directories are being watched. Cannot validate files.',
|
|
3553
|
+
);
|
|
3554
|
+
// ALLOW all files if no watch dirs configured (fail-safe)
|
|
3555
|
+
<span class="cstat-no" title="statement not covered" > return files;</span>
|
|
3556
|
+
}
|
|
3557
|
+
|
|
3558
|
+
// Normalize all watched directories for comparison
|
|
3559
|
+
const normalizedWatchedDirs = <span class="cstat-no" title="statement not covered" >watchedDirs.map(<span class="fstat-no" title="function not covered" >(d</span>ir) => <span class="cstat-no" title="statement not covered" >path.resolve(dir))</span>;</span>
|
|
3560
|
+
|
|
3561
|
+
// Filter files that are within watched directories
|
|
3562
|
+
const validatedFiles = <span class="cstat-no" title="statement not covered" >files.filter(<span class="fstat-no" title="function not covered" >(f</span>ile) => {</span>
|
|
3563
|
+
const normalizedFilePath = <span class="cstat-no" title="statement not covered" >path.resolve(file.path);</span>
|
|
3564
|
+
|
|
3565
|
+
const isWatched = <span class="cstat-no" title="statement not covered" >normalizedWatchedDirs.some(<span class="fstat-no" title="function not covered" >(w</span>atchDir) => {</span>
|
|
3566
|
+
<span class="cstat-no" title="statement not covered" > return (</span>
|
|
3567
|
+
normalizedFilePath.startsWith(watchDir + path.sep) ||
|
|
3568
|
+
normalizedFilePath.startsWith(watchDir)
|
|
3569
|
+
);
|
|
3570
|
+
});
|
|
3571
|
+
|
|
3572
|
+
<span class="cstat-no" title="statement not covered" > if (!isWatched) {</span>
|
|
3573
|
+
<span class="cstat-no" title="statement not covered" > logger.debug(`📍 File not in watched directories: ${file.path}`);</span>
|
|
3574
|
+
}
|
|
3575
|
+
|
|
3576
|
+
<span class="cstat-no" title="statement not covered" > return isWatched;</span>
|
|
3577
|
+
});
|
|
3578
|
+
|
|
3579
|
+
// Log validation results
|
|
3580
|
+
<span class="cstat-no" title="statement not covered" > if (validatedFiles.length < files.length) {</span>
|
|
3581
|
+
<span class="cstat-no" title="statement not covered" > logger.warn(</span>
|
|
3582
|
+
`⚠️ Only ${validatedFiles.length}/${files.length} files passed watcher validation`,
|
|
3583
|
+
);
|
|
3584
|
+
}
|
|
3585
|
+
|
|
3586
|
+
<span class="cstat-no" title="statement not covered" > return validatedFiles;</span>
|
|
3587
|
+
}
|
|
3588
|
+
|
|
3589
|
+
/**
|
|
3590
|
+
* Validate command options
|
|
3591
|
+
* @private
|
|
3592
|
+
* @param {Object} options - Options to validate
|
|
3593
|
+
* @throws {Error} If validation fails
|
|
3594
|
+
*/
|
|
3595
|
+
#validateOptions(options) {
|
|
3596
|
+
// Options are validated during parsing
|
|
3597
|
+
}
|
|
3598
|
+
|
|
3599
|
+
/**
|
|
3600
|
+
* Format file size for display
|
|
3601
|
+
* @private
|
|
3602
|
+
* @param {number} bytes - Number of bytes
|
|
3603
|
+
* @returns {string} Formatted file size
|
|
3604
|
+
*/
|
|
3605
|
+
#formatFileSize(bytes) {
|
|
3606
|
+
<span class="cstat-no" title="statement not covered" > if (bytes === 0) <span class="cstat-no" title="statement not covered" >return '0 B';</span></span>
|
|
3607
|
+
const k = <span class="cstat-no" title="statement not covered" >1024;</span>
|
|
3608
|
+
const sizes = <span class="cstat-no" title="statement not covered" >['B', 'KB', 'MB', 'GB'];</span>
|
|
3609
|
+
const i = <span class="cstat-no" title="statement not covered" >Math.floor(Math.log(bytes) / Math.log(k));</span>
|
|
3610
|
+
<span class="cstat-no" title="statement not covered" > return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];</span>
|
|
3611
|
+
}
|
|
3612
|
+
|
|
3613
|
+
/**
|
|
3614
|
+
* Parse directories from string or array
|
|
3615
|
+
* @private
|
|
3616
|
+
* @param {string|Array} directoriesStr - Directories string or array
|
|
3617
|
+
* @returns {Array<Object>} Parsed directory configurations
|
|
3618
|
+
*/
|
|
3619
|
+
#parseDirectories(directoriesStr) {
|
|
3620
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3621
|
+
const config = <span class="cstat-no" title="statement not covered" >appConfig.getWatchConfig();</span>
|
|
3622
|
+
let directoriesArray = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
3623
|
+
|
|
3624
|
+
// Priority 1: CLI option
|
|
3625
|
+
<span class="cstat-no" title="statement not covered" > if (directoriesStr) {</span>
|
|
3626
|
+
<span class="cstat-no" title="statement not covered" > directoriesArray = directoriesStr</span>
|
|
3627
|
+
.split(',')
|
|
3628
|
+
.map(<span class="fstat-no" title="function not covered" >(d</span>ir) => <span class="cstat-no" title="statement not covered" >dir.trim())</span>
|
|
3629
|
+
.filter(<span class="fstat-no" title="function not covered" >(d</span>ir) => <span class="cstat-no" title="statement not covered" >dir.length > 0)</span>
|
|
3630
|
+
.map(<span class="fstat-no" title="function not covered" >(d</span>ir) => (<span class="cstat-no" title="statement not covered" >{</span>
|
|
3631
|
+
path: dir,
|
|
3632
|
+
folderStructure: 'default',
|
|
3633
|
+
}));
|
|
3634
|
+
|
|
3635
|
+
<span class="cstat-no" title="statement not covered" > return directoriesArray;</span>
|
|
3636
|
+
}
|
|
3637
|
+
|
|
3638
|
+
// Priority 2: Environment config with JSON format
|
|
3639
|
+
<span class="cstat-no" title="statement not covered" > if (</span>
|
|
3640
|
+
config.directoryConfigs &&
|
|
3641
|
+
Object.keys(config.directoryConfigs).length > 0
|
|
3642
|
+
) {
|
|
3643
|
+
<span class="cstat-no" title="statement not covered" > directoriesArray = Object.entries(config.directoryConfigs).map(</span>
|
|
3644
|
+
<span class="fstat-no" title="function not covered" > ([</span>dirPath, folderStructure]) => (<span class="cstat-no" title="statement not covered" >{</span>
|
|
3645
|
+
path: dirPath,
|
|
3646
|
+
folderStructure: folderStructure || 'default',
|
|
3647
|
+
}),
|
|
3648
|
+
);
|
|
3649
|
+
|
|
3650
|
+
<span class="cstat-no" title="statement not covered" > return directoriesArray;</span>
|
|
3651
|
+
}
|
|
3652
|
+
|
|
3653
|
+
// Priority 3: Environment config with legacy format
|
|
3654
|
+
<span class="cstat-no" title="statement not covered" > if (config.directories && config.directories.length > 0) {</span>
|
|
3655
|
+
<span class="cstat-no" title="statement not covered" > directoriesArray = config.directories.map(<span class="fstat-no" title="function not covered" >(d</span>ir) => (<span class="cstat-no" title="statement not covered" >{</span></span>
|
|
3656
|
+
path: dir,
|
|
3657
|
+
folderStructure: 'default',
|
|
3658
|
+
}));
|
|
3659
|
+
|
|
3660
|
+
<span class="cstat-no" title="statement not covered" > return directoriesArray;</span>
|
|
3661
|
+
}
|
|
3662
|
+
|
|
3663
|
+
<span class="cstat-no" title="statement not covered" > return [];</span>
|
|
3664
|
+
} catch (error) {
|
|
3665
|
+
<span class="cstat-no" title="statement not covered" > logger.debug(`Error parsing directories: ${error.message}`);</span>
|
|
3666
|
+
<span class="cstat-no" title="statement not covered" > return [];</span>
|
|
3667
|
+
}
|
|
3668
|
+
}
|
|
3669
|
+
|
|
3670
|
+
/**
|
|
3671
|
+
* Parse watch-specific options
|
|
3672
|
+
* @private
|
|
3673
|
+
* @param {Object} options - Command options
|
|
3674
|
+
* @returns {Object} Parsed watch options
|
|
3675
|
+
*/
|
|
3676
|
+
#parseWatchOptions(options) {
|
|
3677
|
+
const config = <span class="cstat-no" title="statement not covered" >appConfig.getWatchConfig();</span>
|
|
3678
|
+
|
|
3679
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
3680
|
+
strategy: options.strategy || config.strategy || 'batch',
|
|
3681
|
+
debounceMs: parseInt(options.debounce) || config.debounceMs || 1000,
|
|
3682
|
+
batchSize: parseInt(options.batchSize) || config.batchSize || 10,
|
|
3683
|
+
usePolling:
|
|
3684
|
+
options.poll !== undefined ? true : config.usePolling || false,
|
|
3685
|
+
interval: parseInt(options.poll) || config.pollInterval || 100,
|
|
3686
|
+
stabilityThreshold: config.stabilityThreshold || 300,
|
|
3687
|
+
autoDetect: options.autoDetect || config.autoDetect || false,
|
|
3688
|
+
autoOrganize: options.autoOrganize || config.autoOrganize || false,
|
|
3689
|
+
};
|
|
3690
|
+
}
|
|
3691
|
+
|
|
3692
|
+
/**
|
|
3693
|
+
* Parse ignore patterns from CLI
|
|
3694
|
+
* @private
|
|
3695
|
+
* @param {string|undefined} ignoreStr - Comma-separated patterns
|
|
3696
|
+
* @returns {Array<string>} Ignore patterns
|
|
3697
|
+
*/
|
|
3698
|
+
#parseIgnorePatterns(ignoreStr) {
|
|
3699
|
+
const defaultPatterns = <span class="cstat-no" title="statement not covered" >[</span>
|
|
3700
|
+
'/(^|[\\/\\\\])\\.|node_modules|\\.git/', // Hidden files, node_modules, .git
|
|
3701
|
+
];
|
|
3702
|
+
|
|
3703
|
+
<span class="cstat-no" title="statement not covered" > if (!ignoreStr && !process.env.WATCH_IGNORE_PATTERNS) {</span>
|
|
3704
|
+
<span class="cstat-no" title="statement not covered" > return defaultPatterns;</span>
|
|
3705
|
+
}
|
|
3706
|
+
|
|
3707
|
+
const patterns = <span class="cstat-no" title="statement not covered" >(ignoreStr || process.env.WATCH_IGNORE_PATTERNS || '')</span>
|
|
3708
|
+
.split(',')
|
|
3709
|
+
.map(<span class="fstat-no" title="function not covered" >(p</span>) => <span class="cstat-no" title="statement not covered" >p.trim())</span>
|
|
3710
|
+
.filter(<span class="fstat-no" title="function not covered" >(p</span>) => <span class="cstat-no" title="statement not covered" >p.length > 0)</span>;
|
|
3711
|
+
|
|
3712
|
+
<span class="cstat-no" title="statement not covered" > return [...defaultPatterns, ...patterns];</span>
|
|
3713
|
+
}
|
|
3714
|
+
|
|
3715
|
+
/**
|
|
3716
|
+
* Setup signal handlers for graceful shutdown
|
|
3717
|
+
* @private
|
|
3718
|
+
*/
|
|
3719
|
+
#setupSignalHandlers() {
|
|
3720
|
+
// Register database cleanup
|
|
3721
|
+
<span class="cstat-no" title="statement not covered" > cleanupManager.registerResource('Database', databaseService, <span class="fstat-no" title="function not covered" >as</span>ync () => {</span>
|
|
3722
|
+
<span class="cstat-no" title="statement not covered" > return await databaseService.cleanup();</span>
|
|
3723
|
+
});
|
|
3724
|
+
|
|
3725
|
+
// Register watch service cleanup
|
|
3726
|
+
<span class="cstat-no" title="statement not covered" > cleanupManager.registerResource('WatchService', watchService, <span class="fstat-no" title="function not covered" >as</span>ync () => {</span>
|
|
3727
|
+
<span class="cstat-no" title="statement not covered" > return await watchService.stop('signal-received');</span>
|
|
3728
|
+
});
|
|
3729
|
+
|
|
3730
|
+
// Register logging flush
|
|
3731
|
+
<span class="cstat-no" title="statement not covered" > cleanupManager.registerResource('Logging', logger, <span class="fstat-no" title="function not covered" >()</span> => {</span>
|
|
3732
|
+
<span class="cstat-no" title="statement not covered" > logger.flush();</span>
|
|
3733
|
+
});
|
|
3734
|
+
|
|
3735
|
+
// Register progress bars cleanup
|
|
3736
|
+
<span class="cstat-no" title="statement not covered" > cleanupManager.registerResource('ProgressBars', this.progressBars, <span class="fstat-no" title="function not covered" >()</span> => {</span>
|
|
3737
|
+
<span class="cstat-no" title="statement not covered" > this.#stopProgressBars();</span>
|
|
3738
|
+
});
|
|
3739
|
+
|
|
3740
|
+
// Create signal handlers
|
|
3741
|
+
const signalHandlers = <span class="cstat-no" title="statement not covered" >{</span>
|
|
3742
|
+
SIGINT: <span class="fstat-no" title="function not covered" >as</span>ync () => {
|
|
3743
|
+
<span class="cstat-no" title="statement not covered" > await this.#onShutdown('SIGINT');</span>
|
|
3744
|
+
},
|
|
3745
|
+
SIGTERM: <span class="fstat-no" title="function not covered" >as</span>ync () => {
|
|
3746
|
+
<span class="cstat-no" title="statement not covered" > await this.#onShutdown('SIGTERM');</span>
|
|
3747
|
+
},
|
|
3748
|
+
SIGHUP: <span class="fstat-no" title="function not covered" >as</span>ync () => {
|
|
3749
|
+
<span class="cstat-no" title="statement not covered" > await this.#onShutdown('SIGHUP');</span>
|
|
3750
|
+
},
|
|
3751
|
+
SIGQUIT: <span class="fstat-no" title="function not covered" >as</span>ync () => {
|
|
3752
|
+
<span class="cstat-no" title="statement not covered" > await this.#onShutdown('SIGQUIT');</span>
|
|
3753
|
+
},
|
|
3754
|
+
};
|
|
3755
|
+
|
|
3756
|
+
// Register with signal handler
|
|
3757
|
+
<span class="cstat-no" title="statement not covered" > this.signalHandler.registerSignalHandlers(signalHandlers);</span>
|
|
3758
|
+
|
|
3759
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('WatchCommand: Signal handlers configured');</span>
|
|
3760
|
+
}
|
|
3761
|
+
|
|
3762
|
+
/**
|
|
3763
|
+
* Handle graceful shutdown triggered by signal
|
|
3764
|
+
* @private
|
|
3765
|
+
* @param {string} signal - Signal name that triggered shutdown
|
|
3766
|
+
* @returns {Promise<void>}
|
|
3767
|
+
*/
|
|
3768
|
+
async #onShutdown(signal) {
|
|
3769
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3770
|
+
// Print final statistics
|
|
3771
|
+
const stats = <span class="cstat-no" title="statement not covered" >watchService.getStats();</span>
|
|
3772
|
+
<span class="cstat-no" title="statement not covered" > logger.info('\n═══════════════════════════════════════════════════════');</span>
|
|
3773
|
+
<span class="cstat-no" title="statement not covered" > logger.info('📊 WATCH SESSION SUMMARY');</span>
|
|
3774
|
+
<span class="cstat-no" title="statement not covered" > logger.info('═══════════════════════════════════════════════════════');</span>
|
|
3775
|
+
<span class="cstat-no" title="statement not covered" > logger.info(`📄 Files added: ${stats.filesAdded}`);</span>
|
|
3776
|
+
<span class="cstat-no" title="statement not covered" > logger.info(`✏️ Files modified: ${stats.filesModified}`);</span>
|
|
3777
|
+
<span class="cstat-no" title="statement not covered" > logger.info(`🗑️ Files removed: ${stats.filesRemoved}`);</span>
|
|
3778
|
+
<span class="cstat-no" title="statement not covered" > logger.info(`📤 Uploads triggered: ${stats.uploadsTriggered}`);</span>
|
|
3779
|
+
<span class="cstat-no" title="statement not covered" > logger.info(`⚠️ Errors encountered: ${stats.errorsEncountered}`);</span>
|
|
3780
|
+
<span class="cstat-no" title="statement not covered" > logger.info('═══════════════════════════════════════════════════════\n');</span>
|
|
3781
|
+
|
|
3782
|
+
// Generate and display final session report
|
|
3783
|
+
<span class="cstat-no" title="statement not covered" > await this.#generateAndDisplaySessionReport(this.sessionId);</span>
|
|
3784
|
+
} catch (error) {
|
|
3785
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`Error during shutdown handling: ${error.message}`);</span>
|
|
3786
|
+
}
|
|
3787
|
+
}
|
|
3788
|
+
|
|
3789
|
+
/**
|
|
3790
|
+
* Keep process alive indefinitely
|
|
3791
|
+
* @private
|
|
3792
|
+
* @returns {Promise<void>}
|
|
3793
|
+
*/
|
|
3794
|
+
#keepProcessAlive() {
|
|
3795
|
+
<span class="cstat-no" title="statement not covered" > return new Promise(<span class="fstat-no" title="function not covered" >()</span> => {</span>
|
|
3796
|
+
// Never resolves - process will run until signal is received
|
|
3797
|
+
});
|
|
3798
|
+
}
|
|
3799
|
+
|
|
3800
|
+
/**
|
|
3801
|
+
* Initialize progress bars for upload tracking
|
|
3802
|
+
* @private
|
|
3803
|
+
* @returns {void}
|
|
3804
|
+
*/
|
|
3805
|
+
#initializeProgressBars() {
|
|
3806
|
+
<span class="cstat-no" title="statement not covered" > this.progressBars = new cliProgress.MultiBar({</span>
|
|
3807
|
+
clearOnComplete: false,
|
|
3808
|
+
hideCursor: true,
|
|
3809
|
+
fps: 5,
|
|
3810
|
+
stopOnComplete: false,
|
|
3811
|
+
format:
|
|
3812
|
+
'{name} | {bar} | {percentage}% | {value}/{total} | ⏱️ ETA: {eta_formatted} | 🚀 {speed}',
|
|
3813
|
+
barCompleteChar: '█',
|
|
3814
|
+
barIncompleteChar: '░',
|
|
3815
|
+
hideCursor: true,
|
|
3816
|
+
formatBar: <span class="fstat-no" title="function not covered" >(p</span>rocessed, total, width) => {
|
|
3817
|
+
const ratio = <span class="cstat-no" title="statement not covered" >processed / total;</span>
|
|
3818
|
+
const filled = <span class="cstat-no" title="statement not covered" >Math.round(ratio * width);</span>
|
|
3819
|
+
const empty = <span class="cstat-no" title="statement not covered" >width - filled;</span>
|
|
3820
|
+
<span class="cstat-no" title="statement not covered" > return '█'.repeat(filled) + '░'.repeat(empty);</span>
|
|
3821
|
+
},
|
|
3822
|
+
});
|
|
3823
|
+
|
|
3824
|
+
// Create bars for each strategy
|
|
3825
|
+
<span class="cstat-no" title="statement not covered" > this.progressBars.individual = this.progressBars.create(0, 0, {</span>
|
|
3826
|
+
name: '📁 Individual',
|
|
3827
|
+
speed: '0 files/min',
|
|
3828
|
+
});
|
|
3829
|
+
|
|
3830
|
+
<span class="cstat-no" title="statement not covered" > this.progressBars.batch = this.progressBars.create(0, 0, {</span>
|
|
3831
|
+
name: '📦 Batch ',
|
|
3832
|
+
speed: '0 files/min',
|
|
3833
|
+
});
|
|
3834
|
+
|
|
3835
|
+
<span class="cstat-no" title="statement not covered" > this.progressBars['full-structure'] = this.progressBars.create(0, 0, {</span>
|
|
3836
|
+
name: '🗂️ Full-Str ',
|
|
3837
|
+
speed: '0 files/min',
|
|
3838
|
+
});
|
|
3839
|
+
|
|
3840
|
+
// Initialize metrics
|
|
3841
|
+
<span class="cstat-no" title="statement not covered" > this.progressMetrics = {</span>
|
|
3842
|
+
individual: { start: null, processed: 0, total: 0 },
|
|
3843
|
+
batch: { start: null, processed: 0, total: 0 },
|
|
3844
|
+
'full-structure': { start: null, processed: 0, total: 0 },
|
|
3845
|
+
};
|
|
3846
|
+
}
|
|
3847
|
+
|
|
3848
|
+
/**
|
|
3849
|
+
* Update progress bar for a specific strategy
|
|
3850
|
+
* @private
|
|
3851
|
+
* @param {string} strategy - Upload strategy name
|
|
3852
|
+
* @param {number} processed - Number of processed files
|
|
3853
|
+
* @param {number} total - Total number of files
|
|
3854
|
+
* @returns {void}
|
|
3855
|
+
*/
|
|
3856
|
+
#updateProgressBar(strategy, processed, total) {
|
|
3857
|
+
<span class="cstat-no" title="statement not covered" > if (!this.progressBars || !this.progressBars[strategy]) {</span>
|
|
3858
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
3859
|
+
}
|
|
3860
|
+
|
|
3861
|
+
const metrics = <span class="cstat-no" title="statement not covered" >this.progressMetrics[strategy];</span>
|
|
3862
|
+
|
|
3863
|
+
// Initialize start time if not already done
|
|
3864
|
+
<span class="cstat-no" title="statement not covered" > if (metrics.start === null) {</span>
|
|
3865
|
+
<span class="cstat-no" title="statement not covered" > metrics.start = Date.now();</span>
|
|
3866
|
+
}
|
|
3867
|
+
|
|
3868
|
+
<span class="cstat-no" title="statement not covered" > metrics.processed = processed;</span>
|
|
3869
|
+
<span class="cstat-no" title="statement not covered" > metrics.total = total;</span>
|
|
3870
|
+
|
|
3871
|
+
// Calculate speed (files per minute)
|
|
3872
|
+
const elapsedMs = <span class="cstat-no" title="statement not covered" >Date.now() - metrics.start;</span>
|
|
3873
|
+
const elapsedMin = <span class="cstat-no" title="statement not covered" >elapsedMs / 60000;</span>
|
|
3874
|
+
const speed = <span class="cstat-no" title="statement not covered" >elapsedMin > 0 ? (processed / elapsedMin).toFixed(1) : '0';</span>
|
|
3875
|
+
|
|
3876
|
+
// Update bar
|
|
3877
|
+
<span class="cstat-no" title="statement not covered" > this.progressBars[strategy].setTotal(total);</span>
|
|
3878
|
+
<span class="cstat-no" title="statement not covered" > this.progressBars[strategy].update(processed, {</span>
|
|
3879
|
+
speed: `${speed} files/min`,
|
|
3880
|
+
});
|
|
3881
|
+
}
|
|
3882
|
+
|
|
3883
|
+
/**
|
|
3884
|
+
* Complete a progress bar for a strategy
|
|
3885
|
+
* @private
|
|
3886
|
+
* @param {string} strategy - Upload strategy name
|
|
3887
|
+
* @param {Object} results - Upload results (successCount, failureCount, duration)
|
|
3888
|
+
* @returns {void}
|
|
3889
|
+
*/
|
|
3890
|
+
#completeProgressBar(strategy, results) {
|
|
3891
|
+
<span class="cstat-no" title="statement not covered" > if (!this.progressBars || !this.progressBars[strategy]) {</span>
|
|
3892
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
3893
|
+
}
|
|
3894
|
+
|
|
3895
|
+
const metrics = <span class="cstat-no" title="statement not covered" >this.progressMetrics[strategy];</span>
|
|
3896
|
+
const bar = <span class="cstat-no" title="statement not covered" >this.progressBars[strategy];</span>
|
|
3897
|
+
const total = <span class="cstat-no" title="statement not covered" >results.fileCount || metrics.total;</span>
|
|
3898
|
+
const duration = <span class="cstat-no" title="statement not covered" >results.duration || 0;</span>
|
|
3899
|
+
|
|
3900
|
+
// Calculate final speed
|
|
3901
|
+
const durationSec = <span class="cstat-no" title="statement not covered" >duration / 1000;</span>
|
|
3902
|
+
const speed =
|
|
3903
|
+
<span class="cstat-no" title="statement not covered" > durationSec > 0 ? (total / (durationSec / 60)).toFixed(1) : '0';</span>
|
|
3904
|
+
|
|
3905
|
+
// Set to complete
|
|
3906
|
+
<span class="cstat-no" title="statement not covered" > bar.setTotal(total);</span>
|
|
3907
|
+
<span class="cstat-no" title="statement not covered" > bar.update(total, {</span>
|
|
3908
|
+
speed: `${speed} files/min`,
|
|
3909
|
+
});
|
|
3910
|
+
}
|
|
3911
|
+
|
|
3912
|
+
/**
|
|
3913
|
+
* Calculate ETA (Estimated Time to Arrival)
|
|
3914
|
+
* @private
|
|
3915
|
+
* @param {number} startTime - Start timestamp
|
|
3916
|
+
* @param {number} processed - Number of processed items
|
|
3917
|
+
* @param {number} total - Total number of items
|
|
3918
|
+
* @returns {string} Formatted ETA string
|
|
3919
|
+
*/
|
|
3920
|
+
#calculateETA(startTime, processed, total) {
|
|
3921
|
+
<span class="cstat-no" title="statement not covered" > if (processed === 0 || total === 0) {</span>
|
|
3922
|
+
<span class="cstat-no" title="statement not covered" > return '--:--:--';</span>
|
|
3923
|
+
}
|
|
3924
|
+
|
|
3925
|
+
const elapsedMs = <span class="cstat-no" title="statement not covered" >Date.now() - startTime;</span>
|
|
3926
|
+
const avgTimePerItem = <span class="cstat-no" title="statement not covered" >elapsedMs / processed;</span>
|
|
3927
|
+
const remainingItems = <span class="cstat-no" title="statement not covered" >total - processed;</span>
|
|
3928
|
+
const remainingMs = <span class="cstat-no" title="statement not covered" >remainingItems * avgTimePerItem;</span>
|
|
3929
|
+
|
|
3930
|
+
const hours = <span class="cstat-no" title="statement not covered" >Math.floor(remainingMs / 3600000);</span>
|
|
3931
|
+
const minutes = <span class="cstat-no" title="statement not covered" >Math.floor((remainingMs % 3600000) / 60000);</span>
|
|
3932
|
+
const seconds = <span class="cstat-no" title="statement not covered" >Math.floor((remainingMs % 60000) / 1000);</span>
|
|
3933
|
+
|
|
3934
|
+
<span class="cstat-no" title="statement not covered" > if (hours > 0) {</span>
|
|
3935
|
+
<span class="cstat-no" title="statement not covered" > return `${hours}h ${minutes}m`;</span>
|
|
3936
|
+
} else <span class="cstat-no" title="statement not covered" >if (minutes > 0) {</span>
|
|
3937
|
+
<span class="cstat-no" title="statement not covered" > return `${minutes}m ${seconds}s`;</span>
|
|
3938
|
+
} else {
|
|
3939
|
+
<span class="cstat-no" title="statement not covered" > return `${seconds}s`;</span>
|
|
3940
|
+
}
|
|
3941
|
+
}
|
|
3942
|
+
|
|
3943
|
+
/**
|
|
3944
|
+
* Stop and cleanup progress bars
|
|
3945
|
+
* @private
|
|
3946
|
+
* @returns {void}
|
|
3947
|
+
*/
|
|
3948
|
+
#stopProgressBars() {
|
|
3949
|
+
<span class="cstat-no" title="statement not covered" > if (this.progressBars) {</span>
|
|
3950
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3951
|
+
<span class="cstat-no" title="statement not covered" > this.progressBars.stop();</span>
|
|
3952
|
+
} catch (error) {
|
|
3953
|
+
<span class="cstat-no" title="statement not covered" > logger.debug(`Error stopping progress bars: ${error.message}`);</span>
|
|
3954
|
+
}
|
|
3955
|
+
}
|
|
3956
|
+
}
|
|
3957
|
+
|
|
3958
|
+
/**
|
|
3959
|
+
* Generate and display final session report
|
|
3960
|
+
* @private
|
|
3961
|
+
* @param {string} sessionId - Session ID to generate report for
|
|
3962
|
+
* @returns {Promise<void>}
|
|
3963
|
+
*/
|
|
3964
|
+
async #generateAndDisplaySessionReport(sessionId) {
|
|
3965
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3966
|
+
// Get final statistics from DatabaseService
|
|
3967
|
+
const stats = <span class="cstat-no" title="statement not covered" >await databaseService.getSessionStatistics(sessionId);</span>
|
|
3968
|
+
|
|
3969
|
+
// Generate formatted report
|
|
3970
|
+
const report = <span class="cstat-no" title="statement not covered" >logger.formatSessionReport();</span>
|
|
3971
|
+
|
|
3972
|
+
// Display report in console
|
|
3973
|
+
<span class="cstat-no" title="statement not covered" > console.log(report);</span>
|
|
3974
|
+
|
|
3975
|
+
// Save report to file
|
|
3976
|
+
<span class="cstat-no" title="statement not covered" > await this.#saveReportToFile(sessionId, report);</span>
|
|
3977
|
+
|
|
3978
|
+
<span class="cstat-no" title="statement not covered" > logger.info(</span>
|
|
3979
|
+
`Session report generated successfully for session: ${sessionId}`,
|
|
3980
|
+
);
|
|
3981
|
+
} catch (error) {
|
|
3982
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`Error generating session report: ${error.message}`);</span>
|
|
3983
|
+
}
|
|
3984
|
+
}
|
|
3985
|
+
|
|
3986
|
+
/**
|
|
3987
|
+
* Save session report to file
|
|
3988
|
+
* @private
|
|
3989
|
+
* @param {string} sessionId - Session ID
|
|
3990
|
+
* @param {string} report - Report content to save
|
|
3991
|
+
* @returns {Promise<void>}
|
|
3992
|
+
*/
|
|
3993
|
+
async #saveReportToFile(sessionId, report) {
|
|
3994
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3995
|
+
const logDir = <span class="cstat-no" title="statement not covered" >path.join(process.cwd(), 'logs', 'sessions');</span>
|
|
3996
|
+
const timestamp = <span class="cstat-no" title="statement not covered" >Date.now();</span>
|
|
3997
|
+
const fileName = <span class="cstat-no" title="statement not covered" >`session-${sessionId}-${timestamp}.log`;</span>
|
|
3998
|
+
const filePath = <span class="cstat-no" title="statement not covered" >path.join(logDir, fileName);</span>
|
|
3999
|
+
|
|
4000
|
+
// Create directory if it doesn't exist
|
|
4001
|
+
<span class="cstat-no" title="statement not covered" > if (!fs.existsSync(logDir)) {</span>
|
|
4002
|
+
<span class="cstat-no" title="statement not covered" > fs.mkdirSync(logDir, { recursive: true });</span>
|
|
4003
|
+
}
|
|
4004
|
+
|
|
4005
|
+
// Write report to file
|
|
4006
|
+
<span class="cstat-no" title="statement not covered" > fs.writeFileSync(filePath, report, 'utf-8');</span>
|
|
4007
|
+
|
|
4008
|
+
<span class="cstat-no" title="statement not covered" > logger.info(`Session report saved to: ${filePath}`);</span>
|
|
4009
|
+
} catch (error) {
|
|
4010
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`Error saving report to file: ${error.message}`);</span>
|
|
4011
|
+
}
|
|
4012
|
+
}
|
|
4013
|
+
|
|
4014
|
+
/**
|
|
4015
|
+
* Generate intelligent recommendations based on session statistics
|
|
4016
|
+
* @private
|
|
4017
|
+
* @param {Object} stats - Session statistics object
|
|
4018
|
+
* @returns {string} Formatted recommendations
|
|
4019
|
+
*/
|
|
4020
|
+
#generateRecommendations(stats) {
|
|
4021
|
+
const recommendations = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
4022
|
+
|
|
4023
|
+
// Analyze success rate
|
|
4024
|
+
const successRate =
|
|
4025
|
+
<span class="cstat-no" title="statement not covered" > (stats.totalSuccessCount /</span>
|
|
4026
|
+
(stats.totalSuccessCount + stats.totalFailureCount)) *
|
|
4027
|
+
100;
|
|
4028
|
+
<span class="cstat-no" title="statement not covered" > if (successRate >= 95) {</span>
|
|
4029
|
+
<span class="cstat-no" title="statement not covered" > recommendations.push(</span>
|
|
4030
|
+
'✅ Excellent performance! Success rate is outstanding.',
|
|
4031
|
+
);
|
|
4032
|
+
} else <span class="cstat-no" title="statement not covered" >if (successRate >= 80) {</span>
|
|
4033
|
+
<span class="cstat-no" title="statement not covered" > recommendations.push(</span>
|
|
4034
|
+
'⚠️ Good performance, but there is room for improvement.',
|
|
4035
|
+
);
|
|
4036
|
+
} else {
|
|
4037
|
+
<span class="cstat-no" title="statement not covered" > recommendations.push('❌ Poor performance. Check logs for issues.');</span>
|
|
4038
|
+
}
|
|
4039
|
+
|
|
4040
|
+
// Analyze retries
|
|
4041
|
+
<span class="cstat-no" title="statement not covered" > if (stats.retryStats.totalRetries === 0) {</span>
|
|
4042
|
+
<span class="cstat-no" title="statement not covered" > recommendations.push(</span>
|
|
4043
|
+
'✅ No retries needed - upload system is very stable.',
|
|
4044
|
+
);
|
|
4045
|
+
} else <span class="cstat-no" title="statement not covered" >if (stats.retryStats.totalRetries <= 5) {</span>
|
|
4046
|
+
<span class="cstat-no" title="statement not covered" > recommendations.push('ℹ️ Low retry count - system is fairly stable.');</span>
|
|
4047
|
+
} else {
|
|
4048
|
+
<span class="cstat-no" title="statement not covered" > recommendations.push(</span>
|
|
4049
|
+
'⚠️ High retry count - consider optimizing upload settings.',
|
|
4050
|
+
);
|
|
4051
|
+
}
|
|
4052
|
+
|
|
4053
|
+
// Analyze strategies
|
|
4054
|
+
const byStrategy = <span class="cstat-no" title="statement not covered" >stats.byStrategy;</span>
|
|
4055
|
+
const strategies = <span class="cstat-no" title="statement not covered" >Object.entries(byStrategy)</span>
|
|
4056
|
+
.filter(<span class="fstat-no" title="function not covered" >([</span>_, s]) => <span class="cstat-no" title="statement not covered" >s.uploadCount > 0)</span>
|
|
4057
|
+
.sort(<span class="fstat-no" title="function not covered" >(a</span>, b) => {
|
|
4058
|
+
const aSpeed =
|
|
4059
|
+
<span class="cstat-no" title="statement not covered" > a[1].totalDuration > 0</span>
|
|
4060
|
+
? a[1].totalFiles / (a[1].totalDuration / 60000)
|
|
4061
|
+
: 0;
|
|
4062
|
+
const bSpeed =
|
|
4063
|
+
<span class="cstat-no" title="statement not covered" > b[1].totalDuration > 0</span>
|
|
4064
|
+
? b[1].totalFiles / (b[1].totalDuration / 60000)
|
|
4065
|
+
: 0;
|
|
4066
|
+
<span class="cstat-no" title="statement not covered" > return bSpeed - aSpeed;</span>
|
|
4067
|
+
});
|
|
4068
|
+
|
|
4069
|
+
<span class="cstat-no" title="statement not covered" > if (strategies.length > 0) {</span>
|
|
4070
|
+
const fastest = <span class="cstat-no" title="statement not covered" >strategies[0];</span>
|
|
4071
|
+
const speed = <span class="cstat-no" title="statement not covered" >(</span>
|
|
4072
|
+
fastest[1].totalFiles /
|
|
4073
|
+
(fastest[1].totalDuration / 60000)
|
|
4074
|
+
).toFixed(1);
|
|
4075
|
+
<span class="cstat-no" title="statement not covered" > recommendations.push(</span>
|
|
4076
|
+
`💡 Most efficient strategy: ${fastest[0]} (${speed} files/min)`,
|
|
4077
|
+
);
|
|
4078
|
+
}
|
|
4079
|
+
|
|
4080
|
+
// Format recommendations for display
|
|
4081
|
+
let result = <span class="cstat-no" title="statement not covered" >'';</span>
|
|
4082
|
+
<span class="cstat-no" title="statement not covered" > recommendations.forEach(<span class="fstat-no" title="function not covered" >(r</span>ec, idx) => {</span>
|
|
4083
|
+
<span class="cstat-no" title="statement not covered" > result += `│ ${rec}\n`;</span>
|
|
4084
|
+
});
|
|
4085
|
+
|
|
4086
|
+
<span class="cstat-no" title="statement not covered" > return result;</span>
|
|
4087
|
+
}
|
|
4088
|
+
}
|
|
4089
|
+
|
|
4090
|
+
// Export singleton instance
|
|
4091
|
+
export default new WatchCommand();
|
|
4092
|
+
</pre></td></tr></table></pre>
|
|
4093
|
+
|
|
4094
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
4095
|
+
</div><!-- /wrapper -->
|
|
4096
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
4097
|
+
Code coverage generated by
|
|
4098
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
4099
|
+
at 2026-01-20T02:38:34.273Z
|
|
4100
|
+
</div>
|
|
4101
|
+
<script src="prettify.js"></script>
|
|
4102
|
+
<script>
|
|
4103
|
+
window.onload = function () {
|
|
4104
|
+
prettyPrint();
|
|
4105
|
+
};
|
|
4106
|
+
</script>
|
|
4107
|
+
<script src="sorter.js"></script>
|
|
4108
|
+
<script src="block-navigation.js"></script>
|
|
4109
|
+
</body>
|
|
4110
|
+
</html>
|
|
4111
|
+
|