@autofleet/rabbit 4.0.2 → 4.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/coverage/clover.xml +669 -0
- package/coverage/coverage-final.json +9 -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 +131 -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 +196 -0
- package/coverage/lcov-report/src/index.html +131 -0
- package/coverage/lcov-report/src/index.ts.html +3826 -0
- package/coverage/lcov-report/src/lib/celery.ts.html +352 -0
- package/coverage/lcov-report/src/lib/consts.ts.html +142 -0
- package/coverage/lcov-report/src/lib/index.html +191 -0
- package/coverage/lcov-report/src/lib/rabbitError.ts.html +103 -0
- package/coverage/lcov-report/src/lib/redis.ts.html +133 -0
- package/coverage/lcov-report/src/lib/types.ts.html +268 -0
- package/coverage/lcov-report/src/lib/utils.ts.html +142 -0
- package/coverage/lcov-report/src/logger.ts.html +100 -0
- package/coverage/lcov.info +1076 -0
- package/dist/index.d.ts +19 -33
- package/dist/index.js +217 -341
- package/dist/lib/celery.js +0 -1
- package/dist/lib/consts.d.ts +2 -10
- package/dist/lib/consts.js +3 -12
- package/dist/lib/rabbitError.js +0 -1
- package/dist/lib/redis.js +0 -1
- package/dist/lib/types.d.ts +0 -8
- package/dist/lib/types.js +0 -1
- package/dist/lib/utils.d.ts +0 -5
- package/dist/lib/utils.js +1 -9
- package/dist/logger.js +0 -1
- package/dist/{mock/index.d.ts → mock.d.ts} +1 -1
- package/dist/{mock/index.js → mock.js} +1 -2
- package/package.json +16 -23
- package/src/index.ts +243 -417
- package/src/lib/consts.ts +2 -11
- package/src/lib/types.ts +0 -10
- package/src/lib/utils.ts +0 -10
- package/src/{mock/index.ts → mock.ts} +2 -2
- package/tsconfig.json +2 -2
- package/dist/index.js.map +0 -1
- package/dist/lib/celery.js.map +0 -1
- package/dist/lib/consts.js.map +0 -1
- package/dist/lib/rabbitError.js.map +0 -1
- package/dist/lib/redis.js.map +0 -1
- package/dist/lib/types.js.map +0 -1
- package/dist/lib/utils.js.map +0 -1
- package/dist/logger.js.map +0 -1
- package/dist/mock/index.js.map +0 -1
- package/dist/mock/vitest.d.ts +0 -13
- package/dist/mock/vitest.js +0 -18
- package/dist/mock/vitest.js.map +0 -1
- package/src/mock/vitest.ts +0 -24
- package/tsconfig.build.json +0 -5
- package/vitest.config.ts +0 -17
|
@@ -0,0 +1,3826 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/index.ts</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../index.html">All files</a> / <a href="index.html">src</a> index.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">71.28% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>422/592</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">65.53% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>116/177</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">77.38% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>65/84</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">71.13% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>414/582</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line medium'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
1314
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1315
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1316
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1317
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1318
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1319
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1320
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1321
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1322
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1323
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1324
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1325
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1326
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1327
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1328
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1329
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1330
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1331
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1332
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1333
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1334
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1335
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1336
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1337
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1338
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1339
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1340
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1341
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1342
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1343
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1344
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1345
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1346
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1347
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1348
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1349
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1350
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1351
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1352
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1353
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1354
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1355
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1356
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1357
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1358
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1359
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1360
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1361
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1362
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1363
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1364
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1365
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1366
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1367
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1368
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1369
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1370
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1371
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1372
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1373
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1374
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1375
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1376
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1377
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1378
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1379
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1380
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1381
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1382
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1383
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1384
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1385
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1386
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1387
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1388
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1389
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1390
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1391
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1392
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1393
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1394
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1395
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1396
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1397
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1398
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1399
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1400
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1401
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1402
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1403
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1404
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1405
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1406
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1407
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1408
|
+
<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-yes">1x</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-yes">57x</span>
|
|
1422
|
+
<span class="cline-any cline-yes">57x</span>
|
|
1423
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1424
|
+
<span class="cline-any cline-yes">57x</span>
|
|
1425
|
+
<span class="cline-any cline-yes">57x</span>
|
|
1426
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1427
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1428
|
+
<span class="cline-any cline-yes">57x</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-yes">217x</span>
|
|
1436
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1437
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1438
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1439
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1440
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1441
|
+
<span class="cline-any cline-yes">56x</span>
|
|
1442
|
+
<span class="cline-any cline-yes">56x</span>
|
|
1443
|
+
<span class="cline-any cline-yes">56x</span>
|
|
1444
|
+
<span class="cline-any cline-yes">56x</span>
|
|
1445
|
+
<span class="cline-any cline-yes">56x</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-neutral"> </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-yes">4x</span>
|
|
1458
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1459
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1460
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1461
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1462
|
+
<span class="cline-any cline-neutral"> </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-neutral"> </span>
|
|
1472
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1473
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1474
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1475
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1476
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1477
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1478
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1479
|
+
<span class="cline-any cline-neutral"> </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-neutral"> </span>
|
|
1486
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1487
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1488
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1489
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1490
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1491
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1492
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1493
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1494
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1495
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1496
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1497
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1498
|
+
<span class="cline-any cline-neutral"> </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-neutral"> </span>
|
|
1505
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1506
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1507
|
+
<span class="cline-any cline-neutral"> </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-neutral"> </span>
|
|
1512
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1513
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1514
|
+
<span class="cline-any cline-neutral"> </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-yes">4x</span>
|
|
1519
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1520
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1521
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1522
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1523
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1524
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1525
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1526
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1527
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1528
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1529
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1530
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1531
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1532
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1533
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1534
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1535
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1536
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1537
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1538
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1539
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1540
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1541
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1542
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1543
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1544
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1545
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1546
|
+
<span class="cline-any cline-no"> </span>
|
|
1547
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1548
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1549
|
+
<span class="cline-any cline-no"> </span>
|
|
1550
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1551
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1552
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1553
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1554
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1555
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1556
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1557
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1558
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1559
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1560
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1561
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1562
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1563
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1564
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1565
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1566
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1567
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1568
|
+
<span class="cline-any cline-yes">78x</span>
|
|
1569
|
+
<span class="cline-any cline-yes">74x</span>
|
|
1570
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1571
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1572
|
+
<span class="cline-any cline-yes">4x</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-yes">4x</span>
|
|
1577
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1578
|
+
<span class="cline-any cline-neutral"> </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-yes">4x</span>
|
|
1584
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1585
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1586
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1587
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1588
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1589
|
+
<span class="cline-any cline-no"> </span>
|
|
1590
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1591
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1592
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1593
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1594
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1595
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1596
|
+
<span class="cline-any cline-no"> </span>
|
|
1597
|
+
<span class="cline-any cline-no"> </span>
|
|
1598
|
+
<span class="cline-any cline-no"> </span>
|
|
1599
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1600
|
+
<span class="cline-any cline-neutral"> </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-no"> </span>
|
|
1607
|
+
<span class="cline-any cline-no"> </span>
|
|
1608
|
+
<span class="cline-any cline-no"> </span>
|
|
1609
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1610
|
+
<span class="cline-any cline-no"> </span>
|
|
1611
|
+
<span class="cline-any cline-no"> </span>
|
|
1612
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1613
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1614
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1615
|
+
<span class="cline-any cline-no"> </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-neutral"> </span>
|
|
1620
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1621
|
+
<span class="cline-any cline-yes">44x</span>
|
|
1622
|
+
<span class="cline-any cline-yes">44x</span>
|
|
1623
|
+
<span class="cline-any cline-yes">44x</span>
|
|
1624
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1625
|
+
<span class="cline-any cline-yes">44x</span>
|
|
1626
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1627
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1628
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1629
|
+
<span class="cline-any cline-yes">37x</span>
|
|
1630
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1631
|
+
<span class="cline-any cline-no"> </span>
|
|
1632
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1633
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1634
|
+
<span class="cline-any cline-yes">31x</span>
|
|
1635
|
+
<span class="cline-any cline-yes">31x</span>
|
|
1636
|
+
<span class="cline-any cline-yes">31x</span>
|
|
1637
|
+
<span class="cline-any cline-yes">31x</span>
|
|
1638
|
+
<span class="cline-any cline-yes">31x</span>
|
|
1639
|
+
<span class="cline-any cline-yes">31x</span>
|
|
1640
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1641
|
+
<span class="cline-any cline-yes">31x</span>
|
|
1642
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1643
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1644
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1645
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1646
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1647
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1648
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1649
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1650
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1651
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1652
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1653
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1654
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1655
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1656
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1657
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1658
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1659
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1660
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1661
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1662
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1663
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1664
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1665
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1666
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1667
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1668
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1669
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1670
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1671
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1672
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1673
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1674
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1677
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1678
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1679
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1680
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1681
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1682
|
+
<span class="cline-any cline-neutral"> </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-yes">13x</span>
|
|
1687
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1688
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1689
|
+
<span class="cline-any cline-no"> </span>
|
|
1690
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1691
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1692
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1693
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1694
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1695
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1696
|
+
<span class="cline-any cline-yes">34x</span>
|
|
1697
|
+
<span class="cline-any cline-yes">34x</span>
|
|
1698
|
+
<span class="cline-any cline-no"> </span>
|
|
1699
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1700
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1701
|
+
<span class="cline-any cline-no"> </span>
|
|
1702
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1703
|
+
<span class="cline-any cline-yes">34x</span>
|
|
1704
|
+
<span class="cline-any cline-yes">30x</span>
|
|
1705
|
+
<span class="cline-any cline-yes">30x</span>
|
|
1706
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1708
|
+
<span class="cline-any cline-yes">30x</span>
|
|
1709
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1710
|
+
<span class="cline-any cline-no"> </span>
|
|
1711
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1712
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1713
|
+
<span class="cline-any cline-no"> </span>
|
|
1714
|
+
<span class="cline-any cline-no"> </span>
|
|
1715
|
+
<span class="cline-any cline-no"> </span>
|
|
1716
|
+
<span class="cline-any cline-no"> </span>
|
|
1717
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1718
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1719
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1720
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1721
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1722
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1723
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1724
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1725
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1726
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1727
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1728
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1729
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1730
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1731
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1732
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1733
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1734
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1735
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1736
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1737
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1738
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1739
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1740
|
+
<span class="cline-any cline-no"> </span>
|
|
1741
|
+
<span class="cline-any cline-no"> </span>
|
|
1742
|
+
<span class="cline-any cline-no"> </span>
|
|
1743
|
+
<span class="cline-any cline-no"> </span>
|
|
1744
|
+
<span class="cline-any cline-no"> </span>
|
|
1745
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1746
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1747
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1748
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1749
|
+
<span class="cline-any cline-no"> </span>
|
|
1750
|
+
<span class="cline-any cline-no"> </span>
|
|
1751
|
+
<span class="cline-any cline-no"> </span>
|
|
1752
|
+
<span class="cline-any cline-no"> </span>
|
|
1753
|
+
<span class="cline-any cline-no"> </span>
|
|
1754
|
+
<span class="cline-any cline-no"> </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-yes">4x</span>
|
|
1759
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1760
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1761
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1762
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1763
|
+
<span class="cline-any cline-no"> </span>
|
|
1764
|
+
<span class="cline-any cline-no"> </span>
|
|
1765
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1766
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1767
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1768
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1769
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1770
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1771
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1772
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1773
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1774
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1775
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1776
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1777
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1778
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1779
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1780
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1781
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1782
|
+
<span class="cline-any cline-yes">34x</span>
|
|
1783
|
+
<span class="cline-any cline-yes">34x</span>
|
|
1784
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1785
|
+
<span class="cline-any cline-no"> </span>
|
|
1786
|
+
<span class="cline-any cline-no"> </span>
|
|
1787
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1788
|
+
<span class="cline-any cline-yes">34x</span>
|
|
1789
|
+
<span class="cline-any cline-yes">34x</span>
|
|
1790
|
+
<span class="cline-any cline-no"> </span>
|
|
1791
|
+
<span class="cline-any cline-no"> </span>
|
|
1792
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1793
|
+
<span class="cline-any cline-yes">34x</span>
|
|
1794
|
+
<span class="cline-any cline-yes">34x</span>
|
|
1795
|
+
<span class="cline-any cline-yes">34x</span>
|
|
1796
|
+
<span class="cline-any cline-yes">34x</span>
|
|
1797
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1798
|
+
<span class="cline-any cline-no"> </span>
|
|
1799
|
+
<span class="cline-any cline-no"> </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-yes">24x</span>
|
|
1805
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1806
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1807
|
+
<span class="cline-any cline-no"> </span>
|
|
1808
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1809
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1810
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1811
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1812
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1813
|
+
<span class="cline-any cline-no"> </span>
|
|
1814
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1815
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1816
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1817
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1818
|
+
<span class="cline-any cline-no"> </span>
|
|
1819
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1820
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1821
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1822
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1823
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1824
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1825
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1826
|
+
<span class="cline-any cline-no"> </span>
|
|
1827
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1828
|
+
<span class="cline-any cline-no"> </span>
|
|
1829
|
+
<span class="cline-any cline-no"> </span>
|
|
1830
|
+
<span class="cline-any cline-no"> </span>
|
|
1831
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1832
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1833
|
+
<span class="cline-any cline-no"> </span>
|
|
1834
|
+
<span class="cline-any cline-no"> </span>
|
|
1835
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1836
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1837
|
+
<span class="cline-any cline-no"> </span>
|
|
1838
|
+
<span class="cline-any cline-no"> </span>
|
|
1839
|
+
<span class="cline-any cline-no"> </span>
|
|
1840
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1841
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1842
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1843
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1844
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1845
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1846
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1847
|
+
<span class="cline-any cline-no"> </span>
|
|
1848
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1849
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1850
|
+
<span class="cline-any cline-yes">8x</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-no"> </span>
|
|
1855
|
+
<span class="cline-any cline-no"> </span>
|
|
1856
|
+
<span class="cline-any cline-no"> </span>
|
|
1857
|
+
<span class="cline-any cline-no"> </span>
|
|
1858
|
+
<span class="cline-any cline-no"> </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-neutral"> </span>
|
|
1863
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1864
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1865
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1866
|
+
<span class="cline-any cline-yes">1x</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-yes">21x</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-neutral"> </span>
|
|
1879
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1880
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1881
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1882
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1883
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1884
|
+
<span class="cline-any cline-yes">22x</span>
|
|
1885
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1886
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1887
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1888
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1889
|
+
<span class="cline-any cline-no"> </span>
|
|
1890
|
+
<span class="cline-any cline-no"> </span>
|
|
1891
|
+
<span class="cline-any cline-no"> </span>
|
|
1892
|
+
<span class="cline-any cline-no"> </span>
|
|
1893
|
+
<span class="cline-any cline-no"> </span>
|
|
1894
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1895
|
+
<span class="cline-any cline-no"> </span>
|
|
1896
|
+
<span class="cline-any cline-no"> </span>
|
|
1897
|
+
<span class="cline-any cline-no"> </span>
|
|
1898
|
+
<span class="cline-any cline-no"> </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-yes">21x</span>
|
|
1905
|
+
<span class="cline-any cline-yes">21x</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-yes">26x</span>
|
|
1911
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1912
|
+
<span class="cline-any cline-yes">26x</span>
|
|
1913
|
+
<span class="cline-any cline-no"> </span>
|
|
1914
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1915
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1916
|
+
<span class="cline-any cline-yes">26x</span>
|
|
1917
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1918
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1919
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1920
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1921
|
+
<span class="cline-any cline-yes">2x</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-yes">26x</span>
|
|
1926
|
+
<span class="cline-any cline-yes">26x</span>
|
|
1927
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1928
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1929
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1930
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1931
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1932
|
+
<span class="cline-any cline-no"> </span>
|
|
1933
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1934
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1935
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1936
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1937
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1938
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1939
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1940
|
+
<span class="cline-any cline-yes">250x</span>
|
|
1941
|
+
<span class="cline-any cline-yes">30x</span>
|
|
1942
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1943
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1944
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1945
|
+
<span class="cline-any cline-neutral"> </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-neutral"> </span>
|
|
1950
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1951
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1952
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1953
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1954
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1955
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1956
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1957
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1958
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1959
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1960
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1961
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1962
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1963
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1964
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1965
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1966
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1967
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1968
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1969
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1970
|
+
<span class="cline-any cline-yes">44x</span>
|
|
1971
|
+
<span class="cline-any cline-yes">44x</span>
|
|
1972
|
+
<span class="cline-any cline-yes">44x</span>
|
|
1973
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1974
|
+
<span class="cline-any cline-yes">44x</span>
|
|
1975
|
+
<span class="cline-any cline-yes">4x</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-yes">44x</span>
|
|
1981
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1982
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1983
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1984
|
+
<span class="cline-any cline-yes">20x</span>
|
|
1985
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1986
|
+
<span class="cline-any cline-neutral"> </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-yes">21x</span>
|
|
1991
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1992
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1993
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1994
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1995
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1996
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1997
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1998
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1999
|
+
<span class="cline-any cline-no"> </span>
|
|
2000
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2001
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2002
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2003
|
+
<span class="cline-any cline-yes">21x</span>
|
|
2004
|
+
<span class="cline-any cline-yes">21x</span>
|
|
2005
|
+
<span class="cline-any cline-yes">22x</span>
|
|
2006
|
+
<span class="cline-any cline-yes">22x</span>
|
|
2007
|
+
<span class="cline-any cline-yes">22x</span>
|
|
2008
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2009
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2010
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2011
|
+
<span class="cline-any cline-no"> </span>
|
|
2012
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2013
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2014
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2015
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2016
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2017
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2018
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2019
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2020
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2021
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2022
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2023
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2024
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2025
|
+
<span class="cline-any cline-no"> </span>
|
|
2026
|
+
<span class="cline-any cline-no"> </span>
|
|
2027
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2028
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2029
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2030
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2031
|
+
<span class="cline-any cline-no"> </span>
|
|
2032
|
+
<span class="cline-any cline-no"> </span>
|
|
2033
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2034
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2035
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2036
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2037
|
+
<span class="cline-any cline-no"> </span>
|
|
2038
|
+
<span class="cline-any cline-no"> </span>
|
|
2039
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2040
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2041
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2042
|
+
<span class="cline-any cline-no"> </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-yes">5x</span>
|
|
2048
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2049
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2050
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2051
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2052
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2053
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2054
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2055
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2056
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2057
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2058
|
+
<span class="cline-any cline-no"> </span>
|
|
2059
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2060
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2061
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2062
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2063
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2064
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2065
|
+
<span class="cline-any cline-no"> </span>
|
|
2066
|
+
<span class="cline-any cline-no"> </span>
|
|
2067
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2068
|
+
<span class="cline-any cline-no"> </span>
|
|
2069
|
+
<span class="cline-any cline-no"> </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-yes">3x</span>
|
|
2074
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2075
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2076
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2077
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2078
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2079
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2080
|
+
<span class="cline-any cline-no"> </span>
|
|
2081
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2082
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2083
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2084
|
+
<span class="cline-any cline-yes">22x</span>
|
|
2085
|
+
<span class="cline-any cline-no"> </span>
|
|
2086
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2087
|
+
<span class="cline-any cline-yes">22x</span>
|
|
2088
|
+
<span class="cline-any cline-yes">22x</span>
|
|
2089
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2090
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2091
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2092
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2093
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2094
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2095
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2096
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2097
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2098
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2099
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2100
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2101
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2102
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2103
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2104
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2105
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2106
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2107
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2108
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2109
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2110
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2111
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2112
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2113
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2114
|
+
<span class="cline-any cline-neutral"> </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-yes">9x</span>
|
|
2120
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2121
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2122
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2123
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2124
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2125
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2126
|
+
<span class="cline-any cline-yes">9x</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-neutral"> </span>
|
|
2133
|
+
<span class="cline-any cline-neutral"> </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-neutral"> </span>
|
|
2138
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2139
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2140
|
+
<span class="cline-any cline-yes">14x</span>
|
|
2141
|
+
<span class="cline-any cline-yes">14x</span>
|
|
2142
|
+
<span class="cline-any cline-yes">14x</span>
|
|
2143
|
+
<span class="cline-any cline-yes">13x</span>
|
|
2144
|
+
<span class="cline-any cline-yes">13x</span>
|
|
2145
|
+
<span class="cline-any cline-yes">13x</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-neutral"> </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-neutral"> </span>
|
|
2157
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2158
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2159
|
+
<span class="cline-any cline-yes">43x</span>
|
|
2160
|
+
<span class="cline-any cline-yes">43x</span>
|
|
2161
|
+
<span class="cline-any cline-yes">43x</span>
|
|
2162
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2163
|
+
<span class="cline-any cline-no"> </span>
|
|
2164
|
+
<span class="cline-any cline-no"> </span>
|
|
2165
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2166
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2167
|
+
<span class="cline-any cline-yes">43x</span>
|
|
2168
|
+
<span class="cline-any cline-yes">43x</span>
|
|
2169
|
+
<span class="cline-any cline-yes">43x</span>
|
|
2170
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2171
|
+
<span class="cline-any cline-no"> </span>
|
|
2172
|
+
<span class="cline-any cline-no"> </span>
|
|
2173
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2174
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2175
|
+
<span class="cline-any cline-yes">43x</span>
|
|
2176
|
+
<span class="cline-any cline-yes">43x</span>
|
|
2177
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2178
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2179
|
+
<span class="cline-any cline-yes">43x</span>
|
|
2180
|
+
<span class="cline-any cline-yes">43x</span>
|
|
2181
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2182
|
+
<span class="cline-any cline-no"> </span>
|
|
2183
|
+
<span class="cline-any cline-no"> </span>
|
|
2184
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
2191
|
+
<span class="cline-any cline-no"> </span>
|
|
2192
|
+
<span class="cline-any cline-no"> </span>
|
|
2193
|
+
<span class="cline-any cline-no"> </span>
|
|
2194
|
+
<span class="cline-any cline-no"> </span>
|
|
2195
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2196
|
+
<span class="cline-any cline-no"> </span>
|
|
2197
|
+
<span class="cline-any cline-no"> </span>
|
|
2198
|
+
<span class="cline-any cline-no"> </span>
|
|
2199
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2200
|
+
<span class="cline-any cline-no"> </span>
|
|
2201
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2202
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2203
|
+
<span class="cline-any cline-no"> </span>
|
|
2204
|
+
<span class="cline-any cline-no"> </span>
|
|
2205
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2206
|
+
<span class="cline-any cline-no"> </span>
|
|
2207
|
+
<span class="cline-any cline-no"> </span>
|
|
2208
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2209
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2210
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2211
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2212
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2213
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2214
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2215
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2216
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2217
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2218
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2219
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2220
|
+
<span class="cline-any cline-yes">36x</span>
|
|
2221
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2222
|
+
<span class="cline-any cline-no"> </span>
|
|
2223
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2224
|
+
<span class="cline-any cline-yes">3x</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-yes">21x</span>
|
|
2230
|
+
<span class="cline-any cline-yes">21x</span>
|
|
2231
|
+
<span class="cline-any cline-yes">21x</span>
|
|
2232
|
+
<span class="cline-any cline-yes">21x</span>
|
|
2233
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2234
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2235
|
+
<span class="cline-any cline-yes">21x</span>
|
|
2236
|
+
<span class="cline-any cline-yes">21x</span>
|
|
2237
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2238
|
+
<span class="cline-any cline-no"> </span>
|
|
2239
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2240
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2241
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2242
|
+
<span class="cline-any cline-yes">21x</span>
|
|
2243
|
+
<span class="cline-any cline-yes">21x</span>
|
|
2244
|
+
<span class="cline-any cline-yes">22x</span>
|
|
2245
|
+
<span class="cline-any cline-yes">22x</span>
|
|
2246
|
+
<span class="cline-any cline-yes">22x</span>
|
|
2247
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2248
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2249
|
+
<span class="cline-any cline-yes">39x</span>
|
|
2250
|
+
<span class="cline-any cline-no"> </span>
|
|
2251
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2252
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2253
|
+
<span class="cline-any cline-yes">39x</span>
|
|
2254
|
+
<span class="cline-any cline-yes">39x</span>
|
|
2255
|
+
<span class="cline-any cline-yes">39x</span>
|
|
2256
|
+
<span class="cline-any cline-yes">39x</span>
|
|
2257
|
+
<span class="cline-any cline-yes">39x</span>
|
|
2258
|
+
<span class="cline-any cline-yes">39x</span>
|
|
2259
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2260
|
+
<span class="cline-any cline-yes">39x</span>
|
|
2261
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2262
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2263
|
+
<span class="cline-any cline-yes">39x</span>
|
|
2264
|
+
<span class="cline-any cline-no"> </span>
|
|
2265
|
+
<span class="cline-any cline-no"> </span>
|
|
2266
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2267
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2268
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2269
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2270
|
+
<span class="cline-any cline-no"> </span>
|
|
2271
|
+
<span class="cline-any cline-no"> </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-yes">39x</span>
|
|
2276
|
+
<span class="cline-any cline-no"> </span>
|
|
2277
|
+
<span class="cline-any cline-no"> </span>
|
|
2278
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2279
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2280
|
+
<span class="cline-any cline-yes">39x</span>
|
|
2281
|
+
<span class="cline-any cline-no"> </span>
|
|
2282
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2283
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2284
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2285
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2286
|
+
<span class="cline-any cline-yes">39x</span>
|
|
2287
|
+
<span class="cline-any cline-yes">39x</span>
|
|
2288
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2289
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2290
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2291
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2292
|
+
<span class="cline-any cline-yes">38x</span>
|
|
2293
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2294
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2295
|
+
<span class="cline-any cline-yes">38x</span>
|
|
2296
|
+
<span class="cline-any cline-yes">29x</span>
|
|
2297
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2298
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2299
|
+
<span class="cline-any cline-yes">25x</span>
|
|
2300
|
+
<span class="cline-any cline-yes">25x</span>
|
|
2301
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2302
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2303
|
+
<span class="cline-any cline-yes">38x</span>
|
|
2304
|
+
<span class="cline-any cline-yes">17x</span>
|
|
2305
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2306
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2307
|
+
<span class="cline-any cline-yes">13x</span>
|
|
2308
|
+
<span class="cline-any cline-yes">13x</span>
|
|
2309
|
+
<span class="cline-any cline-yes">13x</span>
|
|
2310
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2311
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2312
|
+
<span class="cline-any cline-yes">38x</span>
|
|
2313
|
+
<span class="cline-any cline-yes">38x</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-neutral"> </span>
|
|
2319
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2320
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2321
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2322
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2323
|
+
<span class="cline-any cline-yes">22x</span>
|
|
2324
|
+
<span class="cline-any cline-no"> </span>
|
|
2325
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2326
|
+
<span class="cline-any cline-yes">22x</span>
|
|
2327
|
+
<span class="cline-any cline-yes">22x</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-yes">34x</span>
|
|
2336
|
+
<span class="cline-any cline-yes">34x</span>
|
|
2337
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2338
|
+
<span class="cline-any cline-no"> </span>
|
|
2339
|
+
<span class="cline-any cline-no"> </span>
|
|
2340
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2341
|
+
<span class="cline-any cline-yes">34x</span>
|
|
2342
|
+
<span class="cline-any cline-yes">34x</span>
|
|
2343
|
+
<span class="cline-any cline-no"> </span>
|
|
2344
|
+
<span class="cline-any cline-no"> </span>
|
|
2345
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2346
|
+
<span class="cline-any cline-yes">34x</span>
|
|
2347
|
+
<span class="cline-any cline-yes">34x</span>
|
|
2348
|
+
<span class="cline-any cline-yes">34x</span>
|
|
2349
|
+
<span class="cline-any cline-yes">34x</span>
|
|
2350
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2351
|
+
<span class="cline-any cline-no"> </span>
|
|
2352
|
+
<span class="cline-any cline-no"> </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-yes">34x</span>
|
|
2358
|
+
<span class="cline-any cline-yes">34x</span>
|
|
2359
|
+
<span class="cline-any cline-no"> </span>
|
|
2360
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2361
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2362
|
+
<span class="cline-any cline-no"> </span>
|
|
2363
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2364
|
+
<span class="cline-any cline-yes">34x</span>
|
|
2365
|
+
<span class="cline-any cline-yes">30x</span>
|
|
2366
|
+
<span class="cline-any cline-yes">30x</span>
|
|
2367
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2368
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2369
|
+
<span class="cline-any cline-yes">30x</span>
|
|
2370
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2371
|
+
<span class="cline-any cline-no"> </span>
|
|
2372
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2373
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2374
|
+
<span class="cline-any cline-no"> </span>
|
|
2375
|
+
<span class="cline-any cline-no"> </span>
|
|
2376
|
+
<span class="cline-any cline-no"> </span>
|
|
2377
|
+
<span class="cline-any cline-no"> </span>
|
|
2378
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2379
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2380
|
+
<span class="cline-any cline-yes">4x</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-neutral"> </span>
|
|
2385
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2386
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2387
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2388
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2389
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2390
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2391
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2392
|
+
<span class="cline-any cline-yes">9x</span>
|
|
2393
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2394
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2395
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2396
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2397
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2398
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2399
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2400
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2401
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2402
|
+
<span class="cline-any cline-no"> </span>
|
|
2403
|
+
<span class="cline-any cline-no"> </span>
|
|
2404
|
+
<span class="cline-any cline-no"> </span>
|
|
2405
|
+
<span class="cline-any cline-no"> </span>
|
|
2406
|
+
<span class="cline-any cline-no"> </span>
|
|
2407
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2408
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2409
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2410
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2411
|
+
<span class="cline-any cline-no"> </span>
|
|
2412
|
+
<span class="cline-any cline-no"> </span>
|
|
2413
|
+
<span class="cline-any cline-no"> </span>
|
|
2414
|
+
<span class="cline-any cline-no"> </span>
|
|
2415
|
+
<span class="cline-any cline-no"> </span>
|
|
2416
|
+
<span class="cline-any cline-no"> </span>
|
|
2417
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2418
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2419
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2420
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2421
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2422
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2423
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2424
|
+
<span class="cline-any cline-no"> </span>
|
|
2425
|
+
<span class="cline-any cline-no"> </span>
|
|
2426
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2427
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2428
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2429
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2430
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2431
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2432
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2433
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2434
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2435
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2436
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2437
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2438
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2439
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2440
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2441
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2442
|
+
<span class="cline-any cline-yes">250x</span>
|
|
2443
|
+
<span class="cline-any cline-yes">30x</span>
|
|
2444
|
+
<span class="cline-any cline-yes">21x</span>
|
|
2445
|
+
<span class="cline-any cline-yes">21x</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-neutral"> </span>
|
|
2454
|
+
<span class="cline-any cline-yes">66x</span>
|
|
2455
|
+
<span class="cline-any cline-yes">66x</span>
|
|
2456
|
+
<span class="cline-any cline-yes">40x</span>
|
|
2457
|
+
<span class="cline-any cline-yes">40x</span>
|
|
2458
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2459
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2460
|
+
<span class="cline-any cline-yes">26x</span>
|
|
2461
|
+
<span class="cline-any cline-no"> </span>
|
|
2462
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2463
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2464
|
+
<span class="cline-any cline-yes">26x</span>
|
|
2465
|
+
<span class="cline-any cline-yes">26x</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-yes">26x</span>
|
|
2471
|
+
<span class="cline-any cline-yes">26x</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-neutral"> </span>
|
|
2476
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2477
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2478
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2479
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2480
|
+
<span class="cline-any cline-yes">26x</span>
|
|
2481
|
+
<span class="cline-any cline-yes">26x</span>
|
|
2482
|
+
<span class="cline-any cline-yes">26x</span>
|
|
2483
|
+
<span class="cline-any cline-yes">27x</span>
|
|
2484
|
+
<span class="cline-any cline-yes">26x</span>
|
|
2485
|
+
<span class="cline-any cline-yes">26x</span>
|
|
2486
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2487
|
+
<span class="cline-any cline-no"> </span>
|
|
2488
|
+
<span class="cline-any cline-no"> </span>
|
|
2489
|
+
<span class="cline-any cline-no"> </span>
|
|
2490
|
+
<span class="cline-any cline-no"> </span>
|
|
2491
|
+
<span class="cline-any cline-no"> </span>
|
|
2492
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2493
|
+
<span class="cline-any cline-no"> </span>
|
|
2494
|
+
<span class="cline-any cline-no"> </span>
|
|
2495
|
+
<span class="cline-any cline-no"> </span>
|
|
2496
|
+
<span class="cline-any cline-no"> </span>
|
|
2497
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2498
|
+
<span class="cline-any cline-no"> </span>
|
|
2499
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2500
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2501
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2502
|
+
<span class="cline-any cline-yes">26x</span>
|
|
2503
|
+
<span class="cline-any cline-yes">26x</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-yes">97x</span>
|
|
2508
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2509
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2510
|
+
<span class="cline-any cline-no"> </span>
|
|
2511
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2512
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2513
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2514
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2515
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2516
|
+
<span class="cline-any cline-no"> </span>
|
|
2517
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2518
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2519
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2520
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2521
|
+
<span class="cline-any cline-no"> </span>
|
|
2522
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2523
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2524
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2525
|
+
<span class="cline-any cline-yes">97x</span>
|
|
2526
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2527
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2528
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2529
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
2534
|
+
<span class="cline-any cline-no"> </span>
|
|
2535
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2536
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2537
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2538
|
+
<span class="cline-any cline-yes">14x</span>
|
|
2539
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2540
|
+
<span class="cline-any cline-yes">14x</span>
|
|
2541
|
+
<span class="cline-any cline-yes">13x</span>
|
|
2542
|
+
<span class="cline-any cline-yes">13x</span>
|
|
2543
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2544
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2545
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2546
|
+
<span class="cline-any cline-no"> </span>
|
|
2547
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2548
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2549
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2550
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2551
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2552
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2553
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2554
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2555
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2556
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2557
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2558
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2559
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2560
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/* eslint-disable no-empty,consistent-return,no-async-promise-executor,@typescript-eslint/no-unused-vars */
|
|
2561
|
+
|
|
2562
|
+
import { EventEmitter, once } from 'events';
|
|
2563
|
+
import { promisify } from 'util';
|
|
2564
|
+
import moment from 'moment';
|
|
2565
|
+
import RedisLock from 'redis-lock';
|
|
2566
|
+
import {
|
|
2567
|
+
AmqpConnectionManager, ChannelWrapper, connect, CreateChannelOpts,
|
|
2568
|
+
} from 'amqp-connection-manager';
|
|
2569
|
+
import {
|
|
2570
|
+
ConfirmChannel, ConsumeMessage, Options, Replies,
|
|
2571
|
+
} from 'amqplib';
|
|
2572
|
+
import {
|
|
2573
|
+
getCurrentPayload, newTrace, traceTypes, createOrSetRabbitTrace, outbreak,
|
|
2574
|
+
} from '@autofleet/zehut';
|
|
2575
|
+
import { randomUUID } from 'node:crypto';
|
|
2576
|
+
import axios from 'axios';
|
|
2577
|
+
import logger from './logger';
|
|
2578
|
+
import RabbitError from './lib/rabbitError';
|
|
2579
|
+
import getRedisInstance, { RedisConfig } from './lib/redis';
|
|
2580
|
+
import { assertExchangeFanout, rand, wrapSetImmediate } from './lib/utils';
|
|
2581
|
+
import {
|
|
2582
|
+
AUTOMATION_ID_HEADER,
|
|
2583
|
+
CONNECTION_CREATED_CONST,
|
|
2584
|
+
CONNECTION_FAILED_CONST,
|
|
2585
|
+
DEFAULT_LOCK_TIMEOUT,
|
|
2586
|
+
DEFAULT_OPTIONS,
|
|
2587
|
+
RETRY_HEADER,
|
|
2588
|
+
TRACING_HEADER,
|
|
2589
|
+
USER_OBJECT,
|
|
2590
|
+
USER_TRACING_HEADER,
|
|
2591
|
+
} from './lib/consts';
|
|
2592
|
+
import {
|
|
2593
|
+
CallbackFunction,
|
|
2594
|
+
ConsumeMessageOrNull,
|
|
2595
|
+
ConsumeOptions,
|
|
2596
|
+
CustomMessageHeaders,
|
|
2597
|
+
QueuesCache,
|
|
2598
|
+
RedisLockType,
|
|
2599
|
+
ExchangesCache,
|
|
2600
|
+
CONSUMER_DEFAULT_OPTIONS,
|
|
2601
|
+
QueueSetupPromisesDictionary,
|
|
2602
|
+
AssertExchangePromisesDictionary,
|
|
2603
|
+
} from './lib/types';
|
|
2604
|
+
|
|
2605
|
+
// const debug = nodeDebug('af-rabbitmq')
|
|
2606
|
+
const debug = logger.debug.bind(logger);
|
|
2607
|
+
|
|
2608
|
+
const PUBLISH_TIMEOUT = 1000 * 10;
|
|
2609
|
+
|
|
2610
|
+
export interface IAfRabbitMq {
|
|
2611
|
+
ack: any;
|
|
2612
|
+
nack: any;
|
|
2613
|
+
assertChannel: any;
|
|
2614
|
+
assertExchange: any;
|
|
2615
|
+
assertQueue: any;
|
|
2616
|
+
consume: any;
|
|
2617
|
+
consumeFromExchange: any;
|
|
2618
|
+
publish: any;
|
|
2619
|
+
sendToQueue: any;
|
|
2620
|
+
redisClient?: any;
|
|
2621
|
+
}
|
|
2622
|
+
|
|
2623
|
+
interface NackOptions {
|
|
2624
|
+
skipRetry?: boolean;
|
|
2625
|
+
}
|
|
2626
|
+
|
|
2627
|
+
export interface AfRabbitOptions {
|
|
2628
|
+
disableReconnect?: boolean;
|
|
2629
|
+
|
|
2630
|
+
/**
|
|
2631
|
+
* When you want your own grace-full shutdown, set this to true.
|
|
2632
|
+
* @default false
|
|
2633
|
+
*/
|
|
2634
|
+
dontGracefulShutdown?: boolean;
|
|
2635
|
+
|
|
2636
|
+
/**
|
|
2637
|
+
* dont retry on creation error
|
|
2638
|
+
* @default false
|
|
2639
|
+
*/
|
|
2640
|
+
dontRetryAssert?: boolean;
|
|
2641
|
+
|
|
2642
|
+
rabbitHost?: string;
|
|
2643
|
+
|
|
2644
|
+
vhost?: string;
|
|
2645
|
+
}
|
|
2646
|
+
|
|
2647
|
+
type newChannelOpts = {
|
|
2648
|
+
name?: string;
|
|
2649
|
+
onClose?: null | ((args: any | null) => void);
|
|
2650
|
+
options?: CreateChannelOpts | undefined;
|
|
2651
|
+
};
|
|
2652
|
+
|
|
2653
|
+
type assertChannelOpts = {
|
|
2654
|
+
channelName?: string;
|
|
2655
|
+
force?: boolean;
|
|
2656
|
+
}
|
|
2657
|
+
|
|
2658
|
+
type AfConsumer = {
|
|
2659
|
+
queue: string;
|
|
2660
|
+
callback: CallbackFunction;
|
|
2661
|
+
options: ConsumeOptions | undefined;
|
|
2662
|
+
}
|
|
2663
|
+
|
|
2664
|
+
const HEARTBEAT = '60';
|
|
2665
|
+
|
|
2666
|
+
class RabbitMq implements IAfRabbitMq {
|
|
2667
|
+
static parseMsg(msg: any) : any {
|
|
2668
|
+
let { content } = msg;
|
|
2669
|
+
content = content.toString();
|
|
2670
|
+
|
|
2671
|
+
try {
|
|
2672
|
+
content = JSON.parse(content);
|
|
2673
|
+
} catch (e) { }
|
|
2674
|
+
|
|
2675
|
+
return {
|
|
2676
|
+
...msg,
|
|
2677
|
+
content,
|
|
2678
|
+
};
|
|
2679
|
+
}
|
|
2680
|
+
|
|
2681
|
+
static validateName(type: string, name: string): void {
|
|
2682
|
+
if (!name || name === '') {
|
|
2683
|
+
throw new RabbitError(`error while using ${type} with no name`);
|
|
2684
|
+
}
|
|
2685
|
+
}
|
|
2686
|
+
|
|
2687
|
+
static getPublishOptions(customHeaders: CustomMessageHeaders = {}) {
|
|
2688
|
+
const trace = getCurrentPayload();
|
|
2689
|
+
const user = trace?.context?.get(USER_OBJECT);
|
|
2690
|
+
const traceId = trace?.context?.get(TRACING_HEADER);
|
|
2691
|
+
const outbreakTrace = outbreak.getCurrentContext();
|
|
2692
|
+
return {
|
|
2693
|
+
timestamp: moment().unix(),
|
|
2694
|
+
timeout: PUBLISH_TIMEOUT,
|
|
2695
|
+
headers: {
|
|
2696
|
+
creationTimestamp: moment().valueOf(),
|
|
2697
|
+
...customHeaders,
|
|
2698
|
+
[USER_TRACING_HEADER]: user?.id,
|
|
2699
|
+
[TRACING_HEADER]: traceId || outbreakTrace?.context?.get(TRACING_HEADER),
|
|
2700
|
+
},
|
|
2701
|
+
};
|
|
2702
|
+
}
|
|
2703
|
+
|
|
2704
|
+
DISCONNECT_MSG = 'rabbit: connection disconnect';
|
|
2705
|
+
|
|
2706
|
+
RECONNECT_MSG = 'rabbit: connection disconnect - reconnecting';
|
|
2707
|
+
|
|
2708
|
+
channel: ChannelWrapper | null;
|
|
2709
|
+
|
|
2710
|
+
publishChannelSetupPromise: Promise<ChannelWrapper> | null;
|
|
2711
|
+
|
|
2712
|
+
blockReconnect: boolean | null | undefined
|
|
2713
|
+
|
|
2714
|
+
connection: AmqpConnectionManager | null | undefined
|
|
2715
|
+
|
|
2716
|
+
em: EventEmitter;
|
|
2717
|
+
|
|
2718
|
+
creatingConnection: boolean;
|
|
2719
|
+
|
|
2720
|
+
exchanges: ExchangesCache;
|
|
2721
|
+
|
|
2722
|
+
queues: QueuesCache;
|
|
2723
|
+
|
|
2724
|
+
queueSetupPromises: QueueSetupPromisesDictionary;
|
|
2725
|
+
|
|
2726
|
+
assertExchangePromises: AssertExchangePromisesDictionary;
|
|
2727
|
+
|
|
2728
|
+
options: AfRabbitOptions | undefined;
|
|
2729
|
+
|
|
2730
|
+
redisClient: any;
|
|
2731
|
+
|
|
2732
|
+
redisLock?: RedisLockType;
|
|
2733
|
+
|
|
2734
|
+
/** Array of consumers tags used for canceling consumption */
|
|
2735
|
+
consumersTags: Array<[ConfirmChannel, string]>;
|
|
2736
|
+
|
|
2737
|
+
private consumers: Array<AfConsumer> = [];
|
|
2738
|
+
|
|
2739
|
+
private isVHostExist = false;
|
|
2740
|
+
|
|
2741
|
+
// TODO: DELETE OLD PROPERTIES
|
|
2742
|
+
|
|
2743
|
+
oldChannel: ChannelWrapper | null;
|
|
2744
|
+
|
|
2745
|
+
oldPublishChannelSetupPromise: Promise<ChannelWrapper> | null;
|
|
2746
|
+
|
|
2747
|
+
oldBlockReconnect: boolean | null | undefined
|
|
2748
|
+
|
|
2749
|
+
oldConnection: AmqpConnectionManager | null | undefined
|
|
2750
|
+
|
|
2751
|
+
oldEm: EventEmitter;
|
|
2752
|
+
|
|
2753
|
+
oldCreatingConnection: boolean;
|
|
2754
|
+
|
|
2755
|
+
oldExchanges: ExchangesCache;
|
|
2756
|
+
|
|
2757
|
+
oldQueues: QueuesCache;
|
|
2758
|
+
|
|
2759
|
+
oldQueueSetupPromises: QueueSetupPromisesDictionary;
|
|
2760
|
+
|
|
2761
|
+
oldAssertExchangePromises: AssertExchangePromisesDictionary;
|
|
2762
|
+
|
|
2763
|
+
oldConsumersTags: Array<[ConfirmChannel, string]>;
|
|
2764
|
+
|
|
2765
|
+
private oldConsumers: Array<AfConsumer> = [];
|
|
2766
|
+
|
|
2767
|
+
constructor(options: AfRabbitOptions = {}, redisConfig?: RedisConfig) {
|
|
2768
|
+
this.em = new EventEmitter();
|
|
2769
|
+
this.channel = null;
|
|
2770
|
+
this.publishChannelSetupPromise = null;
|
|
2771
|
+
this.connection = null;
|
|
2772
|
+
this.creatingConnection = false;
|
|
2773
|
+
this.exchanges = {};
|
|
2774
|
+
this.queues = {};
|
|
2775
|
+
this.queueSetupPromises = {};
|
|
2776
|
+
this.assertExchangePromises = {};
|
|
2777
|
+
this.consumers = [];
|
|
2778
|
+
this.options = options;
|
|
2779
|
+
|
|
2780
|
+
if (!options?.vhost) {
|
|
2781
|
+
// TODO: Change the name of the vhost
|
|
2782
|
+
this.options.vhost = 'test-vhost';
|
|
2783
|
+
}
|
|
2784
|
+
|
|
2785
|
+
this.redisClient = redisConfig && getRedisInstance(redisConfig);
|
|
2786
|
+
if (this.redisClient) {
|
|
2787
|
+
this.redisLock = promisify(RedisLock(this.redisClient)) as RedisLockType;
|
|
2788
|
+
}
|
|
2789
|
+
this.consumersTags = [];
|
|
2790
|
+
logger.info(`rabbit: [gracefully-shutdown] adding gracefully shutdown for process.pid ${process.pid}`);
|
|
2791
|
+
if (!this.options?.dontGracefulShutdown) {
|
|
2792
|
+
process.on('SIGTERM', <span class="fstat-no" title="function not covered" >async </span>() => {
|
|
2793
|
+
<span class="cstat-no" title="statement not covered" > await this.gracefulShutdown('SIGTERM');</span>
|
|
2794
|
+
});
|
|
2795
|
+
process.on('SIGINT', <span class="fstat-no" title="function not covered" >async </span>() => {
|
|
2796
|
+
<span class="cstat-no" title="statement not covered" > await this.gracefulShutdown('SIGINT');</span>
|
|
2797
|
+
});
|
|
2798
|
+
}
|
|
2799
|
+
|
|
2800
|
+
// TODO: DELETE OLD PROPERTIES
|
|
2801
|
+
this.oldEm = new EventEmitter();
|
|
2802
|
+
this.oldChannel = null;
|
|
2803
|
+
this.oldPublishChannelSetupPromise = null;
|
|
2804
|
+
this.oldConnection = null;
|
|
2805
|
+
this.oldCreatingConnection = false;
|
|
2806
|
+
this.oldExchanges = {};
|
|
2807
|
+
this.oldQueues = {};
|
|
2808
|
+
this.oldQueueSetupPromises = {};
|
|
2809
|
+
this.oldAssertExchangePromises = {};
|
|
2810
|
+
this.oldConsumers = [];
|
|
2811
|
+
this.oldConsumersTags = [];
|
|
2812
|
+
}
|
|
2813
|
+
|
|
2814
|
+
private assertVHost = async () => {
|
|
2815
|
+
if (this.isVHostExist) {
|
|
2816
|
+
return;
|
|
2817
|
+
}
|
|
2818
|
+
|
|
2819
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!this.options?.vhost) {
|
|
2820
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('vhost is not defined');</span>
|
|
2821
|
+
}
|
|
2822
|
+
|
|
2823
|
+
const { vhost } = this.options;
|
|
2824
|
+
const auth = {
|
|
2825
|
+
auth: {
|
|
2826
|
+
username: process.env.RABBITMQ_USERNAME || 'guest',
|
|
2827
|
+
password: process.env.RABBITMQ_PASSWORD || 'guest',
|
|
2828
|
+
},
|
|
2829
|
+
};
|
|
2830
|
+
const rabbitHost = `http://${(this.options.rabbitHost || process.env.RABBITMQ_SERVICE_HOST || <span class="branch-2 cbranch-no" title="branch not covered" >'localhost')</span>.split(':')[0]}:15672`;
|
|
2831
|
+
|
|
2832
|
+
try {
|
|
2833
|
+
const response = await axios.get(`${rabbitHost}/api/vhosts/${encodeURIComponent(vhost)}`, auth);
|
|
2834
|
+
|
|
2835
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (response.status !== 200) {
|
|
2836
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('Failed to check vhost');</span>
|
|
2837
|
+
}
|
|
2838
|
+
|
|
2839
|
+
this.isVHostExist = true;
|
|
2840
|
+
logger.info('Vhost exists', { vhost: this.options?.vhost });
|
|
2841
|
+
} catch (error) {
|
|
2842
|
+
// If the vhost does not exist, create it
|
|
2843
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (error instanceof axios.AxiosError && error.response?.status === 404) {</span>
|
|
2844
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2845
|
+
<span class="cstat-no" title="statement not covered" > await axios.put(</span>
|
|
2846
|
+
`${rabbitHost}/api/vhosts/${encodeURIComponent(vhost)}`,
|
|
2847
|
+
{
|
|
2848
|
+
default_queue_type: 'quorum',
|
|
2849
|
+
},
|
|
2850
|
+
auth,
|
|
2851
|
+
);
|
|
2852
|
+
|
|
2853
|
+
<span class="cstat-no" title="statement not covered" > this.isVHostExist = true;</span>
|
|
2854
|
+
<span class="cstat-no" title="statement not covered" > logger.info('Vhost created', { vhost: this.options?.vhost });</span>
|
|
2855
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
2856
|
+
} catch (createError) {
|
|
2857
|
+
<span class="cstat-no" title="statement not covered" > logger.error('Failed to create vhost', { error: createError });</span>
|
|
2858
|
+
<span class="cstat-no" title="statement not covered" > throw createError;</span>
|
|
2859
|
+
}
|
|
2860
|
+
}
|
|
2861
|
+
|
|
2862
|
+
<span class="cstat-no" title="statement not covered" > logger.error('Failed to check vhost', { error });</span>
|
|
2863
|
+
<span class="cstat-no" title="statement not covered" > throw error;</span>
|
|
2864
|
+
}
|
|
2865
|
+
}
|
|
2866
|
+
|
|
2867
|
+
private shouldConsumeMessageByTimestamp = async (msg: ConsumeMessageOrNull) => {
|
|
2868
|
+
if (msg) {
|
|
2869
|
+
const { properties: { headers } } = msg;
|
|
2870
|
+
const timestamp = headers?.creationTimestamp;
|
|
2871
|
+
|
|
2872
|
+
if (timestamp && headers?.redisTimestampValidationKey && this.redisClient) {
|
|
2873
|
+
const lastMessageTimestamp = await this.redisClient.getAsync(headers.redisTimestampValidationKey);
|
|
2874
|
+
return !lastMessageTimestamp || (parseInt(lastMessageTimestamp, 10) <= parseInt(timestamp, 10));
|
|
2875
|
+
}
|
|
2876
|
+
return true;
|
|
2877
|
+
}
|
|
2878
|
+
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
2879
|
+
}
|
|
2880
|
+
|
|
2881
|
+
public ack = (channel: ConfirmChannel, msg: ConsumeMessageOrNull, shouldUpdateRedisTimestamp = false, releaseLock = null) => async (userMsg: ConsumeMessage) : Promise<any> => {
|
|
2882
|
+
if (msg) {
|
|
2883
|
+
debug('rabbit acking message', { deliveryTag: msg.fields.deliveryTag });
|
|
2884
|
+
await channel.ack(msg);
|
|
2885
|
+
const { properties: { headers } } = msg;
|
|
2886
|
+
const timestamp = headers?.creationTimestamp;
|
|
2887
|
+
|
|
2888
|
+
if (shouldUpdateRedisTimestamp && timestamp && headers?.redisTimestampValidationKey && this.redisClient) {
|
|
2889
|
+
const parsedTimestamp = parseInt(timestamp, 10);
|
|
2890
|
+
await this.redisClient.setAsync(headers.redisTimestampValidationKey, parsedTimestamp, 'EX', 3600);
|
|
2891
|
+
await this.unlockRedisIfNeeded(releaseLock);
|
|
2892
|
+
}
|
|
2893
|
+
}
|
|
2894
|
+
}
|
|
2895
|
+
|
|
2896
|
+
public nack = (
|
|
2897
|
+
channel: ConfirmChannel,
|
|
2898
|
+
queue: string,
|
|
2899
|
+
options: any,
|
|
2900
|
+
deadQueueOptions: Options.AssertQueue,
|
|
2901
|
+
msg: ConsumeMessageOrNull,
|
|
2902
|
+
releaseLock: any,
|
|
2903
|
+
) => async (
|
|
2904
|
+
userMsg: ConsumeMessageOrNull,
|
|
2905
|
+
{
|
|
2906
|
+
skipRetry = false,
|
|
2907
|
+
}: NackOptions = <span class="branch-0 cbranch-no" title="branch not covered" >{ },</span>
|
|
2908
|
+
) : Promise<any> => {
|
|
2909
|
+
await this.unlockRedisIfNeeded(releaseLock);
|
|
2910
|
+
if (channel && msg) {
|
|
2911
|
+
if (
|
|
2912
|
+
!skipRetry
|
|
2913
|
+
&& (
|
|
2914
|
+
!msg.properties.headers[RETRY_HEADER]
|
|
2915
|
+
|| parseInt(msg.properties.headers[RETRY_HEADER], 10) < options.retries
|
|
2916
|
+
)
|
|
2917
|
+
) {
|
|
2918
|
+
await this.sendToQueue(queue, RabbitMq.parseMsg(msg).content, options, {
|
|
2919
|
+
...msg.properties.headers,
|
|
2920
|
+
[RETRY_HEADER]: msg.properties.headers[RETRY_HEADER]
|
|
2921
|
+
? msg.properties.headers[RETRY_HEADER] + 1
|
|
2922
|
+
: 1,
|
|
2923
|
+
});
|
|
2924
|
+
} else {
|
|
2925
|
+
const deadQueue = `${queue}-dead`;
|
|
2926
|
+
await this.sendToQueue(deadQueue, RabbitMq.parseMsg(msg).content, deadQueueOptions, {
|
|
2927
|
+
...msg.properties.headers,
|
|
2928
|
+
[RETRY_HEADER]: msg.properties.headers[RETRY_HEADER]
|
|
2929
|
+
? msg.properties.headers[RETRY_HEADER] + 1
|
|
2930
|
+
: 1,
|
|
2931
|
+
});
|
|
2932
|
+
}
|
|
2933
|
+
debug('rabbit nacking message', { deliveryTag: msg.fields.deliveryTag });
|
|
2934
|
+
await channel.ack(msg);
|
|
2935
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
|
|
2936
|
+
<span class="cstat-no" title="statement not covered" > logger.error('no channel or msg', {</span>
|
|
2937
|
+
msg,
|
|
2938
|
+
});
|
|
2939
|
+
}
|
|
2940
|
+
}
|
|
2941
|
+
|
|
2942
|
+
async getConnection() {
|
|
2943
|
+
return new Promise<AmqpConnectionManager>(async (resolve, reject) => {
|
|
2944
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (this.blockReconnect) {
|
|
2945
|
+
<span class="cstat-no" title="statement not covered" > debug('rabbit: block reconnect');</span>
|
|
2946
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
2947
|
+
// @ts-ignore
|
|
2948
|
+
<span class="cstat-no" title="statement not covered" > return resolve();</span>
|
|
2949
|
+
}
|
|
2950
|
+
if (this.connection !== null) {
|
|
2951
|
+
if (this.options?.disableReconnect || this.connection?.isConnected()) {
|
|
2952
|
+
debug('rabbit: connection - is connected');
|
|
2953
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
2954
|
+
// @ts-ignore
|
|
2955
|
+
return resolve(this.connection);
|
|
2956
|
+
}
|
|
2957
|
+
<span class="cstat-no" title="statement not covered" > debug('rabbit: connection - reconnecting');</span>
|
|
2958
|
+
}
|
|
2959
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (this.creatingConnection) {
|
|
2960
|
+
<span class="cstat-no" title="statement not covered" > debug('rabbit: creating connection emi');</span>
|
|
2961
|
+
<span class="cstat-no" title="statement not covered" > this.em.once(CONNECTION_CREATED_CONST, resolve);</span>
|
|
2962
|
+
<span class="cstat-no" title="statement not covered" > this.em.once(CONNECTION_FAILED_CONST, reject);</span>
|
|
2963
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
2964
|
+
}
|
|
2965
|
+
this.creatingConnection = true;
|
|
2966
|
+
let isResolved = false;
|
|
2967
|
+
|
|
2968
|
+
// It is import to use it as a function and not as a variable
|
|
2969
|
+
// because of k8s changes the env variables
|
|
2970
|
+
// and we want to use the new values
|
|
2971
|
+
const findServers = () => {
|
|
2972
|
+
const userName = process.env.RABBITMQ_USERNAME || 'guest';
|
|
2973
|
+
const password = process.env.RABBITMQ_PASSWORD || 'guest';
|
|
2974
|
+
const host = this.options?.rabbitHost || process.env.RABBITMQ_SERVICE_HOST || <span class="branch-2 cbranch-no" title="branch not covered" >'localhost';</span>
|
|
2975
|
+
|
|
2976
|
+
debug('rabbit: creating connection', { host, userName, HEARTBEAT });
|
|
2977
|
+
return [`amqp://${userName}:${password}@${host}/${this.options?.vhost}?heartbeat=${HEARTBEAT}`];
|
|
2978
|
+
};
|
|
2979
|
+
|
|
2980
|
+
const defaultUrls = findServers();
|
|
2981
|
+
const connection: AmqpConnectionManager = await connect(defaultUrls, {
|
|
2982
|
+
findServers,
|
|
2983
|
+
});
|
|
2984
|
+
|
|
2985
|
+
this.connection = connection;
|
|
2986
|
+
this.connection.on('error', <span class="fstat-no" title="function not covered" >(e</span>rr) => {
|
|
2987
|
+
<span class="cstat-no" title="statement not covered" > logger.error('rabbit: connection error', { err });</span>
|
|
2988
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isResolved) {</span>
|
|
2989
|
+
<span class="cstat-no" title="statement not covered" > isResolved = true;</span>
|
|
2990
|
+
<span class="cstat-no" title="statement not covered" > reject(err);</span>
|
|
2991
|
+
<span class="cstat-no" title="statement not covered" > this.em.emit(CONNECTION_FAILED_CONST, err);</span>
|
|
2992
|
+
}
|
|
2993
|
+
});
|
|
2994
|
+
|
|
2995
|
+
this.connection.on('connectFailed', <span class="fstat-no" title="function not covered" >(e</span>rr) => {
|
|
2996
|
+
<span class="cstat-no" title="statement not covered" > this.consumersTags = [];</span>
|
|
2997
|
+
<span class="cstat-no" title="statement not covered" > logger.error('rabbit: connection connectFailed', { err, advice: 'Check if the vhost exist', vhost: this.options?.vhost });</span>
|
|
2998
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isResolved) {</span>
|
|
2999
|
+
<span class="cstat-no" title="statement not covered" > isResolved = true;</span>
|
|
3000
|
+
<span class="cstat-no" title="statement not covered" > reject(err);</span>
|
|
3001
|
+
<span class="cstat-no" title="statement not covered" > this.em.emit(CONNECTION_FAILED_CONST, err);</span>
|
|
3002
|
+
}
|
|
3003
|
+
});
|
|
3004
|
+
|
|
3005
|
+
this.connection.on('disconnect', ({ err }) => {
|
|
3006
|
+
// this.channel = null;
|
|
3007
|
+
this.consumersTags = [];
|
|
3008
|
+
debug('rabbit: connection closed');
|
|
3009
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (this.options?.disableReconnect) {
|
|
3010
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`${this.DISCONNECT_MSG}${err && ` - ${err}`}`);</span>
|
|
3011
|
+
<span class="cstat-no" title="statement not covered" > this.blockReconnect = true;</span>
|
|
3012
|
+
} else {
|
|
3013
|
+
logger.error(`${this.RECONNECT_MSG}${err && ` - ${err}`}`);
|
|
3014
|
+
}
|
|
3015
|
+
});
|
|
3016
|
+
|
|
3017
|
+
this.connection.once('connect', async () => {
|
|
3018
|
+
debug('rabbit: connection established');
|
|
3019
|
+
this.creatingConnection = false;
|
|
3020
|
+
this.em.emit(CONNECTION_CREATED_CONST, connection);
|
|
3021
|
+
isResolved = true;
|
|
3022
|
+
resolve(connection);
|
|
3023
|
+
});
|
|
3024
|
+
});
|
|
3025
|
+
}
|
|
3026
|
+
|
|
3027
|
+
async getNewChannel({ name = rand().toString(), onClose = null, options = {} }: newChannelOpts = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
|
|
3028
|
+
let connection!: AmqpConnectionManager;
|
|
3029
|
+
try {
|
|
3030
|
+
connection = await this.getConnection();
|
|
3031
|
+
} catch (e) {
|
|
3032
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`rabbit: error on get connection for new channel ${name} `, { e });</span>
|
|
3033
|
+
<span class="cstat-no" title="statement not covered" > throw e;</span>
|
|
3034
|
+
}
|
|
3035
|
+
const channel = connection.createChannel({ ...options });
|
|
3036
|
+
once(channel, 'close').then(<span class="fstat-no" title="function not covered" >(a</span>rgs) => {
|
|
3037
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`rabbit: channel ${name} closed`);</span>
|
|
3038
|
+
<span class="cstat-no" title="statement not covered" > onClose?.(args);</span>
|
|
3039
|
+
});
|
|
3040
|
+
try {
|
|
3041
|
+
await once(channel, 'connect');
|
|
3042
|
+
debug(`rabbit: channel ${name} CONNECTED`);
|
|
3043
|
+
return channel;
|
|
3044
|
+
} catch (err) {
|
|
3045
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`rabbit: channel error ${name} error`, { err });</span>
|
|
3046
|
+
<span class="cstat-no" title="statement not covered" > throw err;</span>
|
|
3047
|
+
}
|
|
3048
|
+
}
|
|
3049
|
+
|
|
3050
|
+
async assertChannel({ force = false } : assertChannelOpts = {}): Promise<ChannelWrapper> {
|
|
3051
|
+
if (!this.publishChannelSetupPromise) {
|
|
3052
|
+
this.publishChannelSetupPromise = new Promise<ChannelWrapper>(async (resolve, reject) => {
|
|
3053
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (this.channel && <span class="branch-1 cbranch-no" title="branch not covered" >!force)</span> {
|
|
3054
|
+
<span class="cstat-no" title="statement not covered" > return resolve(this.channel);</span>
|
|
3055
|
+
}
|
|
3056
|
+
|
|
3057
|
+
try {
|
|
3058
|
+
const channel = await this.getNewChannel({});
|
|
3059
|
+
channel.on('error', <span class="fstat-no" title="function not covered" >(e</span>rr) => {
|
|
3060
|
+
<span class="cstat-no" title="statement not covered" > logger.error('rabbit: channel error', { err });</span>
|
|
3061
|
+
});
|
|
3062
|
+
this.channel = channel;
|
|
3063
|
+
resolve(channel);
|
|
3064
|
+
} catch (e) {
|
|
3065
|
+
<span class="cstat-no" title="statement not covered" > reject(e);</span>
|
|
3066
|
+
}
|
|
3067
|
+
});
|
|
3068
|
+
}
|
|
3069
|
+
return this.publishChannelSetupPromise;
|
|
3070
|
+
}
|
|
3071
|
+
|
|
3072
|
+
<span class="fstat-no" title="function not covered" > async </span>assertExchange(exchangeName: string, options?: any) {
|
|
3073
|
+
const channel: ChannelWrapper = <span class="cstat-no" title="statement not covered" >await this.assertChannel();</span>
|
|
3074
|
+
|
|
3075
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.exchanges[exchangeName]) {</span>
|
|
3076
|
+
<span class="cstat-no" title="statement not covered" > delete this.assertExchangePromises[exchangeName];</span>
|
|
3077
|
+
<span class="cstat-no" title="statement not covered" > return this.exchanges[exchangeName];</span>
|
|
3078
|
+
}
|
|
3079
|
+
|
|
3080
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.assertExchangePromises[exchangeName]) {</span>
|
|
3081
|
+
<span class="cstat-no" title="statement not covered" > return this.assertExchangePromises[exchangeName];</span>
|
|
3082
|
+
}
|
|
3083
|
+
|
|
3084
|
+
<span class="cstat-no" title="statement not covered" > this.assertExchangePromises[exchangeName] = assertExchangeFanout(channel, exchangeName);</span>
|
|
3085
|
+
<span class="cstat-no" title="statement not covered" > this.exchanges[exchangeName] = await this.assertExchangePromises[exchangeName];</span>
|
|
3086
|
+
<span class="cstat-no" title="statement not covered" > return this.exchanges[exchangeName];</span>
|
|
3087
|
+
}
|
|
3088
|
+
|
|
3089
|
+
// TODO: Change the implementation to the new one
|
|
3090
|
+
async getQueueLength(queue: string) {
|
|
3091
|
+
RabbitMq.validateName('queue', queue);
|
|
3092
|
+
const { oldChannel: channel } = this;
|
|
3093
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!channel) {
|
|
3094
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('channel is not defined');</span>
|
|
3095
|
+
}
|
|
3096
|
+
debug('rabbit: getting queue length', { queue, connected: this.connection?.isConnected() });
|
|
3097
|
+
return channel?.checkQueue(queue);
|
|
3098
|
+
}
|
|
3099
|
+
|
|
3100
|
+
private <span class="fstat-no" title="function not covered" >async </span>deleteQueue(queue: string) {
|
|
3101
|
+
<span class="cstat-no" title="statement not covered" > RabbitMq.validateName('queue', queue);</span>
|
|
3102
|
+
const channel: ChannelWrapper = <span class="cstat-no" title="statement not covered" >await this.assertChannel();</span>
|
|
3103
|
+
<span class="cstat-no" title="statement not covered" > logger.info('rabbit: deleting queue', { queue });</span>
|
|
3104
|
+
const deleteQueueRes = <span class="cstat-no" title="statement not covered" >await channel.deleteQueue(queue);</span>
|
|
3105
|
+
<span class="cstat-no" title="statement not covered" > debug('queue deleted', deleteQueueRes);</span>
|
|
3106
|
+
<span class="cstat-no" title="statement not covered" > return deleteQueueRes;</span>
|
|
3107
|
+
}
|
|
3108
|
+
|
|
3109
|
+
// TODO: Change the implementation to the new one
|
|
3110
|
+
async bindQueue(queue: string, exchange: string) {
|
|
3111
|
+
const channel: ChannelWrapper = await this.assertChannelOld();
|
|
3112
|
+
await channel.addSetup((setupChannel: ConfirmChannel) => setupChannel.bindQueue(queue, exchange, ''));
|
|
3113
|
+
return channel.bindQueue(queue, exchange, '');
|
|
3114
|
+
}
|
|
3115
|
+
|
|
3116
|
+
async setupQueue(queueName: string, options?: Options.AssertQueue): Promise<Replies.AssertQueue> {
|
|
3117
|
+
let queue: Replies.AssertQueue;
|
|
3118
|
+
const localeOptions = {
|
|
3119
|
+
...options,
|
|
3120
|
+
durable: true,
|
|
3121
|
+
arguments: {
|
|
3122
|
+
...options?.arguments,
|
|
3123
|
+
'x-consumer-timeout': 1000 * 60 * 60 * 24,
|
|
3124
|
+
'x-queue-type': 'quorum',
|
|
3125
|
+
},
|
|
3126
|
+
};
|
|
3127
|
+
try {
|
|
3128
|
+
const channel: ChannelWrapper = await this.assertChannel();
|
|
3129
|
+
debug('assertQueue->channel.addSetup', { queueName });
|
|
3130
|
+
await channel.addSetup(async (setupChannel: ConfirmChannel) => {
|
|
3131
|
+
await setupChannel.assertQueue(queueName, localeOptions);
|
|
3132
|
+
});
|
|
3133
|
+
debug('assertQueue->channel.assertQueue', { queueName });
|
|
3134
|
+
queue = await channel.assertQueue(queueName, localeOptions);
|
|
3135
|
+
} catch (e) {
|
|
3136
|
+
<span class="cstat-no" title="statement not covered" > logger.error('rabbit: assertQueue error', { queueName, options, error: e });</span>
|
|
3137
|
+
<span class="cstat-no" title="statement not covered" > if (!this.options?.dontRetryAssert) {</span>
|
|
3138
|
+
<span class="cstat-no" title="statement not covered" > debug('retrying assertQueue', { queueName });</span>
|
|
3139
|
+
const channel = <span class="cstat-no" title="statement not covered" >await this.assertChannel({ force: true });</span>
|
|
3140
|
+
<span class="cstat-no" title="statement not covered" > await this.deleteQueue(queueName);</span>
|
|
3141
|
+
|
|
3142
|
+
<span class="cstat-no" title="statement not covered" > debug('retrying assertQueue->channel.addSetup', { queueName });</span>
|
|
3143
|
+
<span class="cstat-no" title="statement not covered" > await channel.addSetup(<span class="fstat-no" title="function not covered" >(s</span>etupChannel: ConfirmChannel) => <span class="cstat-no" title="statement not covered" >setupChannel.assertQueue(queueName, localeOptions))</span>;</span>
|
|
3144
|
+
<span class="cstat-no" title="statement not covered" > debug('retrying assertQueue->channel.assertQueue', { queueName });</span>
|
|
3145
|
+
<span class="cstat-no" title="statement not covered" > queue = await channel.assertQueue(queueName, localeOptions);</span>
|
|
3146
|
+
} else {
|
|
3147
|
+
<span class="cstat-no" title="statement not covered" > throw e;</span>
|
|
3148
|
+
}
|
|
3149
|
+
}
|
|
3150
|
+
|
|
3151
|
+
this.queues[queueName] = queue;
|
|
3152
|
+
return queue;
|
|
3153
|
+
}
|
|
3154
|
+
|
|
3155
|
+
// TODO: Can be deleted after deleting the old consumers
|
|
3156
|
+
static shouldUseQuorum(queueName: string): boolean {
|
|
3157
|
+
const envQuorumQueuesWhitelist = process.env.QUORUM_QUEUES_WHITELIST;
|
|
3158
|
+
|
|
3159
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (envQuorumQueuesWhitelist === '*') {
|
|
3160
|
+
<span class="cstat-no" title="statement not covered" > return true;</span>
|
|
3161
|
+
}
|
|
3162
|
+
|
|
3163
|
+
if (envQuorumQueuesWhitelist) {
|
|
3164
|
+
const whitelist = envQuorumQueuesWhitelist.split(',');
|
|
3165
|
+
return whitelist.includes(queueName);
|
|
3166
|
+
}
|
|
3167
|
+
|
|
3168
|
+
return false;
|
|
3169
|
+
}
|
|
3170
|
+
|
|
3171
|
+
async assertQueue(queueName: string, options?: Options.AssertQueue): Promise<any> {
|
|
3172
|
+
RabbitMq.validateName('queue', queueName);
|
|
3173
|
+
if (this.queues[queueName]) {
|
|
3174
|
+
delete this.queueSetupPromises[queueName];
|
|
3175
|
+
return this.queues[queueName];
|
|
3176
|
+
}
|
|
3177
|
+
|
|
3178
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (this.queueSetupPromises[queueName]) {
|
|
3179
|
+
<span class="cstat-no" title="statement not covered" > return this.queueSetupPromises[queueName];</span>
|
|
3180
|
+
}
|
|
3181
|
+
|
|
3182
|
+
this.queueSetupPromises[queueName] = this.setupQueue(queueName, options);
|
|
3183
|
+
return this.queueSetupPromises[queueName];
|
|
3184
|
+
}
|
|
3185
|
+
|
|
3186
|
+
private saveConsumer(queue: string, callback: CallbackFunction, options: ConsumeOptions | undefined) {
|
|
3187
|
+
const isConsumerExist :boolean = this.consumers.some((consumer) => consumer.queue === queue);
|
|
3188
|
+
if (!isConsumerExist) {
|
|
3189
|
+
logger.info(`rabbit: consumer: ${queue} saved in consumer array`);
|
|
3190
|
+
this.consumers.push({
|
|
3191
|
+
queue,
|
|
3192
|
+
callback,
|
|
3193
|
+
options,
|
|
3194
|
+
});
|
|
3195
|
+
}
|
|
3196
|
+
}
|
|
3197
|
+
|
|
3198
|
+
// Used by the microservices to consume messages from the queue
|
|
3199
|
+
async consume(queue: string, callback: CallbackFunction, options?: ConsumeOptions): Promise<any> {
|
|
3200
|
+
await this.assertVHost();
|
|
3201
|
+
// TODO: USE THE IMPLEMENTATION OF THE NEW CONSUME AND DELETE THE NEW AND OLD
|
|
3202
|
+
await this.consumeNew(queue, callback, options);
|
|
3203
|
+
await this.consumeOld(queue, callback, options);
|
|
3204
|
+
}
|
|
3205
|
+
|
|
3206
|
+
// TODO: DELETE
|
|
3207
|
+
async consumeNew(queue: string, callback: CallbackFunction, options?: ConsumeOptions): Promise<any> {
|
|
3208
|
+
await this.consumeFromRabbit(queue, callback, options);
|
|
3209
|
+
}
|
|
3210
|
+
|
|
3211
|
+
// TODO: DELETE
|
|
3212
|
+
async consumeOld(queue: string, callback: CallbackFunction, options?: ConsumeOptions): Promise<any> {
|
|
3213
|
+
await this.consumeFromRabbitOld(queue, callback, options);
|
|
3214
|
+
}
|
|
3215
|
+
|
|
3216
|
+
private async lockRedisIfNeeded(msg: any, options: any) {
|
|
3217
|
+
const { properties: { headers } } = msg;
|
|
3218
|
+
const timestamp = headers?.creationTimestamp;
|
|
3219
|
+
let releaseLock = null;
|
|
3220
|
+
|
|
3221
|
+
if (options.useConsumeWithLock && timestamp && headers?.redisTimestampValidationKey && this.redisLock) {
|
|
3222
|
+
releaseLock = await this.redisLock(
|
|
3223
|
+
headers.redisTimestampValidationKey,
|
|
3224
|
+
options?.lockTimeout || <span class="branch-1 cbranch-no" title="branch not covered" >DEFAULT_LOCK_TIMEOUT,</span>
|
|
3225
|
+
);
|
|
3226
|
+
}
|
|
3227
|
+
return releaseLock;
|
|
3228
|
+
}
|
|
3229
|
+
|
|
3230
|
+
private async unlockRedisIfNeeded(releaseLock: any) {
|
|
3231
|
+
if (this.redisLock && releaseLock) {
|
|
3232
|
+
await releaseLock();
|
|
3233
|
+
}
|
|
3234
|
+
}
|
|
3235
|
+
|
|
3236
|
+
private async consumeFromRabbit(queue: string, callback: CallbackFunction, options?: ConsumeOptions): Promise<any> {
|
|
3237
|
+
const optionsWithDefaults = { ...DEFAULT_OPTIONS, ...options };
|
|
3238
|
+
RabbitMq.validateName('queue', queue);
|
|
3239
|
+
this.saveConsumer(queue, callback, options);
|
|
3240
|
+
const uniqueId = randomUUID();
|
|
3241
|
+
const {
|
|
3242
|
+
limit, deadMessageTtl, useConsumeWithLock, lockTimeout, auditContext, enableRabbitTrace,
|
|
3243
|
+
} = optionsWithDefaults;
|
|
3244
|
+
if (useConsumeWithLock) {
|
|
3245
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!this.redisLock) {
|
|
3246
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('Usage of consumeWithLock requires RedisInstance');</span>
|
|
3247
|
+
}
|
|
3248
|
+
logger.info(`rabbit: Consuming with lock from queue ${queue} with lockTimeout: ${lockTimeout}ms`);
|
|
3249
|
+
}
|
|
3250
|
+
const channel = await this.getNewChannel({});
|
|
3251
|
+
return channel.addSetup(async (confirmChannel: ConfirmChannel) => {
|
|
3252
|
+
const q = await this.assertQueue(queue, optionsWithDefaults);
|
|
3253
|
+
await confirmChannel.prefetch(limit, false);
|
|
3254
|
+
const { consumerTag } = await confirmChannel.consume(
|
|
3255
|
+
queue,
|
|
3256
|
+
async (msg: ConsumeMessageOrNull) => {
|
|
3257
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!msg) {
|
|
3258
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
3259
|
+
}
|
|
3260
|
+
|
|
3261
|
+
const traceId = msg.properties.headers[TRACING_HEADER];
|
|
3262
|
+
const userId = msg.properties.headers[USER_TRACING_HEADER];
|
|
3263
|
+
const automationId = msg.properties.headers[AUTOMATION_ID_HEADER];
|
|
3264
|
+
const parsedMessage = RabbitMq.parseMsg(msg);
|
|
3265
|
+
const releaseLock = await this.lockRedisIfNeeded(parsedMessage, optionsWithDefaults);
|
|
3266
|
+
const trace = newTrace(traceTypes.RABBIT);
|
|
3267
|
+
// setting also outbreak trace as part of legacy code
|
|
3268
|
+
const outbreakTrace = outbreak.newTrace(traceTypes.RABBIT);
|
|
3269
|
+
// enableRabbitTrace is a flag to protect from different flows that doesn't work with permission
|
|
3270
|
+
// and we don't want to fail the flow because of it
|
|
3271
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (userId && <span class="branch-1 cbranch-no" title="branch not covered" >enableRabbitTrace)</span> {
|
|
3272
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3273
|
+
<span class="cstat-no" title="statement not covered" > await Promise.all([</span>
|
|
3274
|
+
createOrSetRabbitTrace(trace, userId),
|
|
3275
|
+
createOrSetRabbitTrace(outbreakTrace, userId),
|
|
3276
|
+
]);
|
|
3277
|
+
} catch (e) {
|
|
3278
|
+
<span class="cstat-no" title="statement not covered" > logger.error('rabbit: failed to setRabbitTrace', { userId, e });</span>
|
|
3279
|
+
<span class="cstat-no" title="statement not covered" > return this.nack(confirmChannel, queue, optionsWithDefaults, { messageTtl: deadMessageTtl }, msg, releaseLock)(msg);</span>
|
|
3280
|
+
}
|
|
3281
|
+
}
|
|
3282
|
+
|
|
3283
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (traceId) {
|
|
3284
|
+
(<span class="cstat-no" title="statement not covered" >trace as any)?.context?.set(TRACING_HEADER, traceId);</span>
|
|
3285
|
+
(<span class="cstat-no" title="statement not covered" >outbreakTrace as any)?.context.set(TRACING_HEADER, traceId);</span>
|
|
3286
|
+
}
|
|
3287
|
+
|
|
3288
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (auditContext) {
|
|
3289
|
+
<span class="cstat-no" title="statement not covered" > await auditContext(queue, {</span>
|
|
3290
|
+
userId,
|
|
3291
|
+
automationId,
|
|
3292
|
+
});
|
|
3293
|
+
}
|
|
3294
|
+
const shouldConsume = await this.shouldConsumeMessageByTimestamp(parsedMessage);
|
|
3295
|
+
if (!shouldConsume) {
|
|
3296
|
+
await this.unlockRedisIfNeeded(releaseLock);
|
|
3297
|
+
return this.ack(confirmChannel, msg)(msg);
|
|
3298
|
+
}
|
|
3299
|
+
|
|
3300
|
+
let messageAcked = false;
|
|
3301
|
+
// setting the localAck function to be used in the callback
|
|
3302
|
+
|
|
3303
|
+
const localAck = async () => {
|
|
3304
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (messageAcked) {
|
|
3305
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
3306
|
+
}
|
|
3307
|
+
messageAcked = true;
|
|
3308
|
+
return this.ack(confirmChannel, msg, true, releaseLock)(msg);
|
|
3309
|
+
};
|
|
3310
|
+
|
|
3311
|
+
const localNack = <span class="fstat-no" title="function not covered" >async </span>(_: ConsumeMessageOrNull, nackOptions: NackOptions = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> => {
|
|
3312
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (messageAcked) {</span>
|
|
3313
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
3314
|
+
}
|
|
3315
|
+
<span class="cstat-no" title="statement not covered" > debug('rabbit localNack', { messageAcked, uniqueId, deliveryTag: msg.fields.deliveryTag });</span>
|
|
3316
|
+
<span class="cstat-no" title="statement not covered" > messageAcked = true;</span>
|
|
3317
|
+
<span class="cstat-no" title="statement not covered" > return this.nack(confirmChannel, queue, optionsWithDefaults, { messageTtl: deadMessageTtl }, msg, releaseLock)(msg, nackOptions);</span>
|
|
3318
|
+
};
|
|
3319
|
+
|
|
3320
|
+
try {
|
|
3321
|
+
await callback(
|
|
3322
|
+
parsedMessage,
|
|
3323
|
+
localAck,
|
|
3324
|
+
localNack,
|
|
3325
|
+
);
|
|
3326
|
+
} catch (e) {
|
|
3327
|
+
<span class="cstat-no" title="statement not covered" > await localNack(msg);</span>
|
|
3328
|
+
}
|
|
3329
|
+
}, CONSUMER_DEFAULT_OPTIONS,
|
|
3330
|
+
);
|
|
3331
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!consumerTag) {
|
|
3332
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`rabbit: failed to consume from queue ${queue}`);</span>
|
|
3333
|
+
} else {
|
|
3334
|
+
logger.info(`rabbit: adding tag ${consumerTag} to the array.`);
|
|
3335
|
+
this.consumersTags.push([confirmChannel, consumerTag]);
|
|
3336
|
+
}
|
|
3337
|
+
});
|
|
3338
|
+
}
|
|
3339
|
+
|
|
3340
|
+
// Used by the microservices to consume messages from the exchange
|
|
3341
|
+
async consumeFromExchange(queue: string, exchange: string, callback: CallbackFunction, options?: ConsumeOptions) : Promise<any> {
|
|
3342
|
+
await this.assertVHost();
|
|
3343
|
+
const optionsWithDefaults = { ...DEFAULT_OPTIONS, ...options };
|
|
3344
|
+
RabbitMq.validateName('exchange', exchange);
|
|
3345
|
+
RabbitMq.validateName('queue', queue);
|
|
3346
|
+
const { limit, deadMessageTtl } = optionsWithDefaults;
|
|
3347
|
+
await this.saveConsumer(queue, callback, options);
|
|
3348
|
+
const channel: ChannelWrapper = await this.getNewChannel({ name: `consume-exchange-${exchange}-queue-${queue}` });
|
|
3349
|
+
|
|
3350
|
+
await channel.addSetup(async (c: ConfirmChannel) => {
|
|
3351
|
+
const assertExchange = await assertExchangeFanout(c, exchange);
|
|
3352
|
+
await c.assertQueue(queue);
|
|
3353
|
+
this.exchanges[exchange] = assertExchange;
|
|
3354
|
+
await c.prefetch(limit, false);
|
|
3355
|
+
return Promise.all([
|
|
3356
|
+
c.bindQueue(queue, exchange, ''),
|
|
3357
|
+
this.consumeNew(
|
|
3358
|
+
queue,
|
|
3359
|
+
callback,
|
|
3360
|
+
options,
|
|
3361
|
+
),
|
|
3362
|
+
]);
|
|
3363
|
+
});
|
|
3364
|
+
|
|
3365
|
+
// TODO: DELETE OLD
|
|
3366
|
+
await this.saveConsumerOld(queue, callback, options);
|
|
3367
|
+
const channelOld: ChannelWrapper = await this.getNewChannelOld({ name: `consume-exchange-${exchange}-queue-${queue}-old` });
|
|
3368
|
+
await channelOld.addSetup(async (c: ConfirmChannel) => {
|
|
3369
|
+
const assertExchange = await assertExchangeFanout(c, exchange);
|
|
3370
|
+
await c.assertQueue(queue);
|
|
3371
|
+
this.oldExchanges[exchange] = assertExchange;
|
|
3372
|
+
await c.prefetch(limit, false);
|
|
3373
|
+
return Promise.all([
|
|
3374
|
+
c.bindQueue(queue, exchange, ''),
|
|
3375
|
+
this.consumeOld(
|
|
3376
|
+
queue,
|
|
3377
|
+
callback,
|
|
3378
|
+
options,
|
|
3379
|
+
),
|
|
3380
|
+
]);
|
|
3381
|
+
});
|
|
3382
|
+
}
|
|
3383
|
+
|
|
3384
|
+
// Used by the microservices to publish messages to the exchange
|
|
3385
|
+
// TODO: Change the implementation to the new one
|
|
3386
|
+
async publish(exchange: string, content: any, customHeaders?: any) : Promise<boolean> {
|
|
3387
|
+
return wrapSetImmediate(async () => {
|
|
3388
|
+
await this.assertVHost();
|
|
3389
|
+
RabbitMq.validateName('exchange', exchange);
|
|
3390
|
+
const channel: ChannelWrapper = await this.assertChannelOld();
|
|
3391
|
+
await this.assertExchangeOld(exchange);
|
|
3392
|
+
await channel.publish(exchange, '',
|
|
3393
|
+
Buffer.from(JSON.stringify(content)),
|
|
3394
|
+
RabbitMq.getPublishOptions(customHeaders));
|
|
3395
|
+
});
|
|
3396
|
+
}
|
|
3397
|
+
|
|
3398
|
+
// Used by the microservices to send messages to the queue
|
|
3399
|
+
// TODO: Change the implementation to the new one
|
|
3400
|
+
async sendToQueue(
|
|
3401
|
+
queue: string,
|
|
3402
|
+
content: any,
|
|
3403
|
+
options?: any,
|
|
3404
|
+
customHeaders?: any,
|
|
3405
|
+
): Promise<boolean | undefined> {
|
|
3406
|
+
try {
|
|
3407
|
+
await this.assertVHost();
|
|
3408
|
+
await this.assertChannelOld();
|
|
3409
|
+
} catch (e) {
|
|
3410
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`rabbit sendToQueue: failed to send assert channel when sending to queue ${queue}`, { e });</span>
|
|
3411
|
+
<span class="cstat-no" title="statement not covered" > throw e;</span>
|
|
3412
|
+
}
|
|
3413
|
+
|
|
3414
|
+
try {
|
|
3415
|
+
RabbitMq.validateName('queue', queue);
|
|
3416
|
+
await this.assertQueueOld(queue, options);
|
|
3417
|
+
} catch (e) {
|
|
3418
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`rabbit sendToQueue: failed to assert queue ${queue}`, { e });</span>
|
|
3419
|
+
<span class="cstat-no" title="statement not covered" > throw e;</span>
|
|
3420
|
+
}
|
|
3421
|
+
|
|
3422
|
+
try {
|
|
3423
|
+
const res = await this.oldChannel?.sendToQueue(queue,
|
|
3424
|
+
Buffer.from(JSON.stringify(content)),
|
|
3425
|
+
RabbitMq.getPublishOptions(customHeaders));
|
|
3426
|
+
debug(`rabbit: sending to queue ${queue}`, { res });
|
|
3427
|
+
return res;
|
|
3428
|
+
} catch (e) {
|
|
3429
|
+
const isConnected = <span class="cstat-no" title="statement not covered" >await this.isConnected();</span>
|
|
3430
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`rabbit sendToQueue: failed to send to queue ${queue}, isConnected: ${isConnected}`, { e });</span>
|
|
3431
|
+
<span class="cstat-no" title="statement not covered" > throw e;</span>
|
|
3432
|
+
}
|
|
3433
|
+
}
|
|
3434
|
+
|
|
3435
|
+
// TODO: After changing the publish to the new implementation change the from the old to the new
|
|
3436
|
+
<span class="fstat-no" title="function not covered" > async </span>isConnected() : Promise<boolean> {
|
|
3437
|
+
const connection = <span class="cstat-no" title="statement not covered" >await this.getConnectionOld();</span>
|
|
3438
|
+
const isConnected = <span class="cstat-no" title="statement not covered" >connection.isConnected();</span>
|
|
3439
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isConnected) {</span>
|
|
3440
|
+
<span class="cstat-no" title="statement not covered" > logger.error('rabbit: isConnected - false');</span>
|
|
3441
|
+
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
3442
|
+
}
|
|
3443
|
+
const channel: any = <span class="cstat-no" title="statement not covered" >await this.assertChannelOld();</span>
|
|
3444
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3445
|
+
<span class="cstat-no" title="statement not covered" > await Promise.all([</span>
|
|
3446
|
+
channel.waitForConnect(),
|
|
3447
|
+
...this.oldConsumers.map(<span class="fstat-no" title="function not covered" >(c</span>: AfConsumer) => <span class="cstat-no" title="statement not covered" >channel.checkQueue(c.queue))</span>,
|
|
3448
|
+
]);
|
|
3449
|
+
} catch (e) {
|
|
3450
|
+
<span class="cstat-no" title="statement not covered" > logger.error('rabbit: isConnected - false');</span>
|
|
3451
|
+
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
3452
|
+
}
|
|
3453
|
+
<span class="cstat-no" title="statement not covered" > logger.info('rabbit: isConnected - true');</span>
|
|
3454
|
+
<span class="cstat-no" title="statement not covered" > return true;</span>
|
|
3455
|
+
}
|
|
3456
|
+
|
|
3457
|
+
async gracefulShutdown(signal: string) : Promise<void> {
|
|
3458
|
+
// TODO: DELETE OLD
|
|
3459
|
+
const tagsNumber = this.consumersTags.length + this.oldConsumersTags.length;
|
|
3460
|
+
logger.info(`rabbit: [gracefully-shutdown] received ${signal}! canceling #${tagsNumber} tags...`);
|
|
3461
|
+
const cancelTagPromises = this.consumersTags.map(([channel, tag]) => channel.cancel(tag));
|
|
3462
|
+
const cancelTagPromisesOld = this.oldConsumersTags.map(([channel, tag]) => channel.cancel(tag));
|
|
3463
|
+
// Clean the array to avoid race
|
|
3464
|
+
this.consumersTags = [];
|
|
3465
|
+
this.oldConsumersTags = [];
|
|
3466
|
+
const results = await Promise.allSettled([...cancelTagPromises, ...cancelTagPromisesOld]);
|
|
3467
|
+
const rejected = results.filter((p) => p.status === 'rejected');
|
|
3468
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (rejected.length > 0) {
|
|
3469
|
+
<span class="cstat-no" title="statement not covered" > logger.warn(`rabbit: [gracefully-shutdown] #${rejected.length}/${tagsNumber} tags failed to cancel: ${rejected}`);</span>
|
|
3470
|
+
} else {
|
|
3471
|
+
logger.info('rabbit: [gracefully-shutdown] all tags successfully canceled.');
|
|
3472
|
+
}
|
|
3473
|
+
}
|
|
3474
|
+
|
|
3475
|
+
private async consumeFromRabbitOld(queue: string, callback: CallbackFunction, options?: ConsumeOptions): Promise<any> {
|
|
3476
|
+
const optionsWithDefaults = { ...DEFAULT_OPTIONS, ...options };
|
|
3477
|
+
RabbitMq.validateName('queue', queue);
|
|
3478
|
+
this.saveConsumerOld(queue, callback, options);
|
|
3479
|
+
const uniqueId = randomUUID();
|
|
3480
|
+
const {
|
|
3481
|
+
limit, deadMessageTtl, useConsumeWithLock, lockTimeout, auditContext, enableRabbitTrace,
|
|
3482
|
+
} = optionsWithDefaults;
|
|
3483
|
+
if (useConsumeWithLock) {
|
|
3484
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!this.redisLock) {
|
|
3485
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('Usage of consumeWithLock requires RedisInstance');</span>
|
|
3486
|
+
}
|
|
3487
|
+
logger.info(`rabbit: Consuming with lock from queue ${queue} with lockTimeout: ${lockTimeout}ms`);
|
|
3488
|
+
}
|
|
3489
|
+
const channel = await this.getNewChannelOld({});
|
|
3490
|
+
return channel.addSetup(async (confirmChannel: ConfirmChannel) => {
|
|
3491
|
+
const q = await this.assertQueueOld(queue, optionsWithDefaults);
|
|
3492
|
+
await confirmChannel.prefetch(limit, false);
|
|
3493
|
+
const { consumerTag } = await confirmChannel.consume(
|
|
3494
|
+
queue,
|
|
3495
|
+
async (msg: ConsumeMessageOrNull) => {
|
|
3496
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!msg) {
|
|
3497
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
3498
|
+
}
|
|
3499
|
+
|
|
3500
|
+
const traceId = msg.properties.headers[TRACING_HEADER];
|
|
3501
|
+
const userId = msg.properties.headers[USER_TRACING_HEADER];
|
|
3502
|
+
const automationId = msg.properties.headers[AUTOMATION_ID_HEADER];
|
|
3503
|
+
const parsedMessage = RabbitMq.parseMsg(msg);
|
|
3504
|
+
const releaseLock = await this.lockRedisIfNeeded(parsedMessage, optionsWithDefaults);
|
|
3505
|
+
const trace = newTrace(traceTypes.RABBIT);
|
|
3506
|
+
// setting also outbreak trace as part of legacy code
|
|
3507
|
+
const outbreakTrace = outbreak.newTrace(traceTypes.RABBIT);
|
|
3508
|
+
// enableRabbitTrace is a flag to protect from different flows that doesn't work with permission
|
|
3509
|
+
// and we don't want to fail the flow because of it
|
|
3510
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (userId && <span class="branch-1 cbranch-no" title="branch not covered" >enableRabbitTrace)</span> {
|
|
3511
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3512
|
+
<span class="cstat-no" title="statement not covered" > await Promise.all([</span>
|
|
3513
|
+
createOrSetRabbitTrace(trace, userId),
|
|
3514
|
+
createOrSetRabbitTrace(outbreakTrace, userId),
|
|
3515
|
+
]);
|
|
3516
|
+
} catch (e) {
|
|
3517
|
+
<span class="cstat-no" title="statement not covered" > logger.error('rabbit: failed to setRabbitTrace', { userId, e });</span>
|
|
3518
|
+
<span class="cstat-no" title="statement not covered" > return this.nack(confirmChannel, queue, optionsWithDefaults, { messageTtl: deadMessageTtl }, msg, releaseLock)(msg);</span>
|
|
3519
|
+
}
|
|
3520
|
+
}
|
|
3521
|
+
|
|
3522
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (traceId) {
|
|
3523
|
+
(<span class="cstat-no" title="statement not covered" >trace as any)?.context?.set(TRACING_HEADER, traceId);</span>
|
|
3524
|
+
(<span class="cstat-no" title="statement not covered" >outbreakTrace as any)?.context.set(TRACING_HEADER, traceId);</span>
|
|
3525
|
+
}
|
|
3526
|
+
|
|
3527
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (auditContext) {
|
|
3528
|
+
<span class="cstat-no" title="statement not covered" > await auditContext(queue, {</span>
|
|
3529
|
+
userId,
|
|
3530
|
+
automationId,
|
|
3531
|
+
});
|
|
3532
|
+
}
|
|
3533
|
+
const shouldConsume = await this.shouldConsumeMessageByTimestamp(parsedMessage);
|
|
3534
|
+
if (!shouldConsume) {
|
|
3535
|
+
await this.unlockRedisIfNeeded(releaseLock);
|
|
3536
|
+
return this.ack(confirmChannel, msg)(msg);
|
|
3537
|
+
}
|
|
3538
|
+
|
|
3539
|
+
let messageAcked = false;
|
|
3540
|
+
// setting the localAck function to be used in the callback
|
|
3541
|
+
|
|
3542
|
+
const localAck = async () => {
|
|
3543
|
+
if (messageAcked) {
|
|
3544
|
+
return;
|
|
3545
|
+
}
|
|
3546
|
+
messageAcked = true;
|
|
3547
|
+
return this.ack(confirmChannel, msg, true, releaseLock)(msg);
|
|
3548
|
+
};
|
|
3549
|
+
|
|
3550
|
+
const localNack = async (_: ConsumeMessageOrNull, nackOptions: NackOptions = {}) => {
|
|
3551
|
+
if (messageAcked) {
|
|
3552
|
+
return;
|
|
3553
|
+
}
|
|
3554
|
+
debug('rabbit localNack', { messageAcked, uniqueId, deliveryTag: msg.fields.deliveryTag });
|
|
3555
|
+
messageAcked = true;
|
|
3556
|
+
return this.nack(confirmChannel, queue, optionsWithDefaults, { messageTtl: deadMessageTtl }, msg, releaseLock)(msg, nackOptions);
|
|
3557
|
+
};
|
|
3558
|
+
|
|
3559
|
+
try {
|
|
3560
|
+
await callback(
|
|
3561
|
+
parsedMessage,
|
|
3562
|
+
localAck,
|
|
3563
|
+
localNack,
|
|
3564
|
+
);
|
|
3565
|
+
} catch (e) {
|
|
3566
|
+
await localNack(msg);
|
|
3567
|
+
}
|
|
3568
|
+
}, CONSUMER_DEFAULT_OPTIONS,
|
|
3569
|
+
);
|
|
3570
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!consumerTag) {
|
|
3571
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`rabbit: failed to consume from queue ${queue}`);</span>
|
|
3572
|
+
} else {
|
|
3573
|
+
logger.info(`rabbit: adding tag ${consumerTag} to the array.`);
|
|
3574
|
+
this.oldConsumersTags.push([confirmChannel, consumerTag]);
|
|
3575
|
+
}
|
|
3576
|
+
});
|
|
3577
|
+
}
|
|
3578
|
+
|
|
3579
|
+
// TODO: DELETE OLD PROPERTIES UNDER THIS LINE
|
|
3580
|
+
async getNewChannelOld({ name = rand().toString(), onClose = null, options = {} }: newChannelOpts = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
|
|
3581
|
+
let connection!: AmqpConnectionManager;
|
|
3582
|
+
try {
|
|
3583
|
+
connection = await this.getConnectionOld();
|
|
3584
|
+
} catch (e) {
|
|
3585
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`rabbit: error on get connection for new channel ${name} `, { e });</span>
|
|
3586
|
+
<span class="cstat-no" title="statement not covered" > throw e;</span>
|
|
3587
|
+
}
|
|
3588
|
+
const channel = connection.createChannel({ ...options });
|
|
3589
|
+
once(channel, 'close').then(<span class="fstat-no" title="function not covered" >(a</span>rgs) => {
|
|
3590
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`rabbit: channel ${name} closed`);</span>
|
|
3591
|
+
<span class="cstat-no" title="statement not covered" > onClose?.(args);</span>
|
|
3592
|
+
});
|
|
3593
|
+
try {
|
|
3594
|
+
await once(channel, 'connect');
|
|
3595
|
+
debug(`rabbit: channel ${name} CONNECTED`);
|
|
3596
|
+
return channel;
|
|
3597
|
+
} catch (err) {
|
|
3598
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`rabbit: channel error ${name} error`, { err });</span>
|
|
3599
|
+
<span class="cstat-no" title="statement not covered" > throw err;</span>
|
|
3600
|
+
}
|
|
3601
|
+
}
|
|
3602
|
+
|
|
3603
|
+
async getConnectionOld() {
|
|
3604
|
+
return new Promise<AmqpConnectionManager>(async (resolve, reject) => {
|
|
3605
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (this.oldBlockReconnect) {
|
|
3606
|
+
<span class="cstat-no" title="statement not covered" > debug('rabbit: block reconnect');</span>
|
|
3607
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
3608
|
+
// @ts-ignore
|
|
3609
|
+
<span class="cstat-no" title="statement not covered" > return resolve();</span>
|
|
3610
|
+
}
|
|
3611
|
+
if (this.oldConnection !== null) {
|
|
3612
|
+
if (this.options?.disableReconnect || this.oldConnection?.isConnected()) {
|
|
3613
|
+
debug('rabbit: connection - is connected');
|
|
3614
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
3615
|
+
// @ts-ignore
|
|
3616
|
+
return resolve(this.oldConnection);
|
|
3617
|
+
}
|
|
3618
|
+
<span class="cstat-no" title="statement not covered" > debug('rabbit: connection - reconnecting');</span>
|
|
3619
|
+
}
|
|
3620
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (this.oldCreatingConnection) {
|
|
3621
|
+
<span class="cstat-no" title="statement not covered" > debug('rabbit: creating connection emi');</span>
|
|
3622
|
+
<span class="cstat-no" title="statement not covered" > this.oldEm.once(CONNECTION_CREATED_CONST, resolve);</span>
|
|
3623
|
+
<span class="cstat-no" title="statement not covered" > this.oldEm.once(CONNECTION_FAILED_CONST, reject);</span>
|
|
3624
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
3625
|
+
}
|
|
3626
|
+
this.oldCreatingConnection = true;
|
|
3627
|
+
let isResolved = false;
|
|
3628
|
+
|
|
3629
|
+
// It is import to use it as a function and not as a variable
|
|
3630
|
+
// because of k8s changes the env variables
|
|
3631
|
+
// and we want to use the new values
|
|
3632
|
+
const findServers = () => {
|
|
3633
|
+
const userName = process.env.RABBITMQ_USERNAME || 'guest';
|
|
3634
|
+
const password = process.env.RABBITMQ_PASSWORD || 'guest';
|
|
3635
|
+
const host = this.options?.rabbitHost || process.env.RABBITMQ_SERVICE_HOST || <span class="branch-2 cbranch-no" title="branch not covered" >'localhost';</span>
|
|
3636
|
+
|
|
3637
|
+
debug('rabbit: creating connection', { host, userName, HEARTBEAT });
|
|
3638
|
+
|
|
3639
|
+
return [`amqp://${userName}:${password}@${host}?heartbeat=${HEARTBEAT}`];
|
|
3640
|
+
};
|
|
3641
|
+
|
|
3642
|
+
const defaultUrls = findServers();
|
|
3643
|
+
const connection: AmqpConnectionManager = await connect(defaultUrls, {
|
|
3644
|
+
findServers,
|
|
3645
|
+
});
|
|
3646
|
+
|
|
3647
|
+
this.oldConnection = connection;
|
|
3648
|
+
this.oldConnection.on('error', <span class="fstat-no" title="function not covered" >(e</span>rr) => {
|
|
3649
|
+
<span class="cstat-no" title="statement not covered" > logger.error('rabbit: connection error', { err });</span>
|
|
3650
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isResolved) {</span>
|
|
3651
|
+
<span class="cstat-no" title="statement not covered" > isResolved = true;</span>
|
|
3652
|
+
<span class="cstat-no" title="statement not covered" > reject(err);</span>
|
|
3653
|
+
<span class="cstat-no" title="statement not covered" > this.oldEm.emit(CONNECTION_FAILED_CONST, err);</span>
|
|
3654
|
+
}
|
|
3655
|
+
});
|
|
3656
|
+
|
|
3657
|
+
this.oldConnection.on('connectFailed', <span class="fstat-no" title="function not covered" >(e</span>rr) => {
|
|
3658
|
+
<span class="cstat-no" title="statement not covered" > this.oldConsumersTags = [];</span>
|
|
3659
|
+
<span class="cstat-no" title="statement not covered" > logger.error('rabbit: connection connectFailed', { err });</span>
|
|
3660
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isResolved) {</span>
|
|
3661
|
+
<span class="cstat-no" title="statement not covered" > isResolved = true;</span>
|
|
3662
|
+
<span class="cstat-no" title="statement not covered" > reject(err);</span>
|
|
3663
|
+
<span class="cstat-no" title="statement not covered" > this.oldEm.emit(CONNECTION_FAILED_CONST, err);</span>
|
|
3664
|
+
}
|
|
3665
|
+
});
|
|
3666
|
+
|
|
3667
|
+
this.oldConnection.on('disconnect', ({ err }) => {
|
|
3668
|
+
this.oldConsumersTags = [];
|
|
3669
|
+
debug('rabbit: connection closed');
|
|
3670
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (this.options?.disableReconnect) {
|
|
3671
|
+
<span class="cstat-no" title="statement not covered" > logger.error(`${this.DISCONNECT_MSG}${err && ` - ${err}`}`);</span>
|
|
3672
|
+
<span class="cstat-no" title="statement not covered" > this.oldBlockReconnect = true;</span>
|
|
3673
|
+
} else {
|
|
3674
|
+
logger.error(`${this.RECONNECT_MSG}${err && ` - ${err}`}`);
|
|
3675
|
+
}
|
|
3676
|
+
});
|
|
3677
|
+
|
|
3678
|
+
this.oldConnection.once('connect', async () => {
|
|
3679
|
+
debug('rabbit: connection established');
|
|
3680
|
+
this.oldCreatingConnection = false;
|
|
3681
|
+
this.oldEm.emit(CONNECTION_CREATED_CONST, connection);
|
|
3682
|
+
isResolved = true;
|
|
3683
|
+
resolve(connection);
|
|
3684
|
+
});
|
|
3685
|
+
});
|
|
3686
|
+
}
|
|
3687
|
+
|
|
3688
|
+
private saveConsumerOld(queue: string, callback: CallbackFunction, options: ConsumeOptions | undefined) {
|
|
3689
|
+
const isConsumerExist :boolean = this.oldConsumers.some((consumer) => consumer.queue === queue);
|
|
3690
|
+
if (!isConsumerExist) {
|
|
3691
|
+
logger.info(`rabbit: consumer: ${queue} saved in consumer array`);
|
|
3692
|
+
this.oldConsumers.push({
|
|
3693
|
+
queue,
|
|
3694
|
+
callback,
|
|
3695
|
+
options,
|
|
3696
|
+
});
|
|
3697
|
+
}
|
|
3698
|
+
}
|
|
3699
|
+
|
|
3700
|
+
async assertQueueOld(queueName: string, options?: Options.AssertQueue): Promise<any> {
|
|
3701
|
+
RabbitMq.validateName('queue', queueName);
|
|
3702
|
+
if (this.oldQueues[queueName]) {
|
|
3703
|
+
delete this.oldQueueSetupPromises[queueName];
|
|
3704
|
+
return this.oldQueues[queueName];
|
|
3705
|
+
}
|
|
3706
|
+
|
|
3707
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (this.oldQueueSetupPromises[queueName]) {
|
|
3708
|
+
<span class="cstat-no" title="statement not covered" > return this.oldQueueSetupPromises[queueName];</span>
|
|
3709
|
+
}
|
|
3710
|
+
|
|
3711
|
+
this.oldQueueSetupPromises[queueName] = this.setupQueueOld(queueName, options);
|
|
3712
|
+
return this.oldQueueSetupPromises[queueName];
|
|
3713
|
+
}
|
|
3714
|
+
|
|
3715
|
+
async setupQueueOld(queueName: string, options?: Options.AssertQueue): Promise<Replies.AssertQueue> {
|
|
3716
|
+
let queue: Replies.AssertQueue;
|
|
3717
|
+
const shouldUseQuorum = RabbitMq.shouldUseQuorum(queueName);
|
|
3718
|
+
const localeOptions = {
|
|
3719
|
+
...options,
|
|
3720
|
+
durable: true,
|
|
3721
|
+
arguments: {
|
|
3722
|
+
...options?.arguments,
|
|
3723
|
+
'x-consumer-timeout': 1000 * 60 * 60 * 24,
|
|
3724
|
+
'x-queue-type': shouldUseQuorum ? 'quorum' : 'classic',
|
|
3725
|
+
},
|
|
3726
|
+
};
|
|
3727
|
+
try {
|
|
3728
|
+
const channel: ChannelWrapper = await this.assertChannelOld();
|
|
3729
|
+
debug('assertQueue->channel.addSetup', { queueName });
|
|
3730
|
+
await channel.addSetup((setupChannel: ConfirmChannel) => setupChannel.assertQueue(queueName, localeOptions));
|
|
3731
|
+
debug('assertQueue->channel.assertQueue', { queueName });
|
|
3732
|
+
queue = await channel.assertQueue(queueName, localeOptions);
|
|
3733
|
+
} catch (e) {
|
|
3734
|
+
<span class="cstat-no" title="statement not covered" > logger.error('rabbit: assertQueue error', { queueName, options, error: e });</span>
|
|
3735
|
+
<span class="cstat-no" title="statement not covered" > if (!this.options?.dontRetryAssert) {</span>
|
|
3736
|
+
<span class="cstat-no" title="statement not covered" > debug('retrying assertQueue', { queueName });</span>
|
|
3737
|
+
const channel = <span class="cstat-no" title="statement not covered" >await this.assertChannelOld({ force: true });</span>
|
|
3738
|
+
<span class="cstat-no" title="statement not covered" > await this.deleteQueueOld(queueName);</span>
|
|
3739
|
+
|
|
3740
|
+
<span class="cstat-no" title="statement not covered" > debug('retrying assertQueue->channel.addSetup', { queueName });</span>
|
|
3741
|
+
<span class="cstat-no" title="statement not covered" > await channel.addSetup(<span class="fstat-no" title="function not covered" >(s</span>etupChannel: ConfirmChannel) => <span class="cstat-no" title="statement not covered" >setupChannel.assertQueue(queueName, localeOptions))</span>;</span>
|
|
3742
|
+
<span class="cstat-no" title="statement not covered" > debug('retrying assertQueue->channel.assertQueue', { queueName });</span>
|
|
3743
|
+
<span class="cstat-no" title="statement not covered" > queue = await channel.assertQueue(queueName, localeOptions);</span>
|
|
3744
|
+
} else {
|
|
3745
|
+
<span class="cstat-no" title="statement not covered" > throw e;</span>
|
|
3746
|
+
}
|
|
3747
|
+
}
|
|
3748
|
+
|
|
3749
|
+
this.oldQueues[queueName] = queue;
|
|
3750
|
+
return queue;
|
|
3751
|
+
}
|
|
3752
|
+
|
|
3753
|
+
async assertChannelOld({ force = false } : assertChannelOpts = {}): Promise<ChannelWrapper> {
|
|
3754
|
+
if (!this.oldPublishChannelSetupPromise) {
|
|
3755
|
+
this.oldPublishChannelSetupPromise = new Promise<ChannelWrapper>(async (resolve, reject) => {
|
|
3756
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (this.oldChannel && <span class="branch-1 cbranch-no" title="branch not covered" >!force)</span> {
|
|
3757
|
+
<span class="cstat-no" title="statement not covered" > return resolve(this.oldChannel);</span>
|
|
3758
|
+
}
|
|
3759
|
+
|
|
3760
|
+
try {
|
|
3761
|
+
const channel = await this.getNewChannelOld({});
|
|
3762
|
+
channel.on('error', <span class="fstat-no" title="function not covered" >(e</span>rr) => {
|
|
3763
|
+
<span class="cstat-no" title="statement not covered" > logger.error('rabbit: channel error', { err });</span>
|
|
3764
|
+
});
|
|
3765
|
+
this.oldChannel = channel;
|
|
3766
|
+
resolve(channel);
|
|
3767
|
+
} catch (e) {
|
|
3768
|
+
<span class="cstat-no" title="statement not covered" > reject(e);</span>
|
|
3769
|
+
}
|
|
3770
|
+
});
|
|
3771
|
+
}
|
|
3772
|
+
return this.oldPublishChannelSetupPromise;
|
|
3773
|
+
}
|
|
3774
|
+
|
|
3775
|
+
private <span class="fstat-no" title="function not covered" >async </span>deleteQueueOld(queue: string) {
|
|
3776
|
+
<span class="cstat-no" title="statement not covered" > RabbitMq.validateName('queue', queue);</span>
|
|
3777
|
+
const channel: ChannelWrapper = <span class="cstat-no" title="statement not covered" >await this.assertChannelOld();</span>
|
|
3778
|
+
<span class="cstat-no" title="statement not covered" > logger.info('rabbit: deleting queue', { queue });</span>
|
|
3779
|
+
const deleteQueueRes = <span class="cstat-no" title="statement not covered" >await channel.deleteQueue(queue);</span>
|
|
3780
|
+
<span class="cstat-no" title="statement not covered" > debug('queue deleted', deleteQueueRes);</span>
|
|
3781
|
+
<span class="cstat-no" title="statement not covered" > return deleteQueueRes;</span>
|
|
3782
|
+
}
|
|
3783
|
+
|
|
3784
|
+
async assertExchangeOld(exchangeName: string, options?: any) {
|
|
3785
|
+
const channel: ChannelWrapper = await this.assertChannelOld();
|
|
3786
|
+
|
|
3787
|
+
if (this.oldExchanges[exchangeName]) {
|
|
3788
|
+
delete this.oldAssertExchangePromises[exchangeName];
|
|
3789
|
+
return this.oldExchanges[exchangeName];
|
|
3790
|
+
}
|
|
3791
|
+
|
|
3792
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (this.oldAssertExchangePromises[exchangeName]) {
|
|
3793
|
+
<span class="cstat-no" title="statement not covered" > return this.oldAssertExchangePromises[exchangeName];</span>
|
|
3794
|
+
}
|
|
3795
|
+
|
|
3796
|
+
this.oldAssertExchangePromises[exchangeName] = assertExchangeFanout(channel, exchangeName);
|
|
3797
|
+
this.oldExchanges[exchangeName] = await this.oldAssertExchangePromises[exchangeName];
|
|
3798
|
+
return this.oldExchanges[exchangeName];
|
|
3799
|
+
}
|
|
3800
|
+
}
|
|
3801
|
+
|
|
3802
|
+
export default RabbitMq;
|
|
3803
|
+
|
|
3804
|
+
export {
|
|
3805
|
+
<span class="fstat-no" title="function not covered" > sendCeleryTaskViaHttp,</span>
|
|
3806
|
+
} from './lib/celery';
|
|
3807
|
+
</pre></td></tr></table></pre>
|
|
3808
|
+
|
|
3809
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
3810
|
+
</div><!-- /wrapper -->
|
|
3811
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
3812
|
+
Code coverage generated by
|
|
3813
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
3814
|
+
at 2025-03-27T13:05:08.358Z
|
|
3815
|
+
</div>
|
|
3816
|
+
<script src="../prettify.js"></script>
|
|
3817
|
+
<script>
|
|
3818
|
+
window.onload = function () {
|
|
3819
|
+
prettyPrint();
|
|
3820
|
+
};
|
|
3821
|
+
</script>
|
|
3822
|
+
<script src="../sorter.js"></script>
|
|
3823
|
+
<script src="../block-navigation.js"></script>
|
|
3824
|
+
</body>
|
|
3825
|
+
</html>
|
|
3826
|
+
|