a2acalling 0.6.74 → 0.6.75
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/.a2a-manifest.json +2 -2
- package/.c8rc.json +16 -0
- package/.node-version +1 -0
- package/.serena/project.yml +126 -0
- package/ARCHITECTURE.md +11 -0
- package/CONVENTIONS.md +9 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +146 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/src/index.html +131 -0
- package/coverage/src/index.js.html +313 -0
- package/coverage/src/lib/agent-card.js.html +418 -0
- package/coverage/src/lib/call-monitor.js.html +700 -0
- package/coverage/src/lib/callbook.js.html +1183 -0
- package/coverage/src/lib/claude-subagent.js.html +2173 -0
- package/coverage/src/lib/client.js.html +2134 -0
- package/coverage/src/lib/config.js.html +1525 -0
- package/coverage/src/lib/conversation-driver.js.html +1909 -0
- package/coverage/src/lib/conversations.js.html +2575 -0
- package/coverage/src/lib/crypto.js.html +424 -0
- package/coverage/src/lib/dashboard-events.js.html +724 -0
- package/coverage/src/lib/disclosure.js.html +2461 -0
- package/coverage/src/lib/external-ip.js.html +718 -0
- package/coverage/src/lib/index.html +506 -0
- package/coverage/src/lib/invite-host.js.html +754 -0
- package/coverage/src/lib/local-request.js.html +292 -0
- package/coverage/src/lib/logger.js.html +2116 -0
- package/coverage/src/lib/openclaw-integration.js.html +1102 -0
- package/coverage/src/lib/pid-file.js.html +394 -0
- package/coverage/src/lib/port-scanner.js.html +334 -0
- package/coverage/src/lib/prompt-template.js.html +1150 -0
- package/coverage/src/lib/runtime-adapter.js.html +2188 -0
- package/coverage/src/lib/summarizer.js.html +553 -0
- package/coverage/src/lib/summary-formatter.js.html +589 -0
- package/coverage/src/lib/summary-prompt.js.html +694 -0
- package/coverage/src/lib/tokens.js.html +2689 -0
- package/coverage/src/lib/turn-timeout.js.html +241 -0
- package/coverage/src/lib/update-checker.js.html +364 -0
- package/coverage/src/lib/update-manager.js.html +1024 -0
- package/coverage/src/routes/a2a.js.html +3724 -0
- package/coverage/src/routes/callbook.js.html +511 -0
- package/coverage/src/routes/dashboard.js.html +4819 -0
- package/coverage/src/routes/index.html +146 -0
- package/coverage/src/server.js.html +3622 -0
- package/coverage/tmp/coverage-1605378-1772576706365-0.json +1 -0
- package/coverage/tmp/coverage-1605384-1772576607459-0.json +1 -0
- package/coverage/tmp/coverage-1605410-1772576631155-0.json +1 -0
- package/coverage/tmp/coverage-1606942-1772576636869-0.json +1 -0
- package/coverage/tmp/coverage-1607004-1772576637454-0.json +1 -0
- package/coverage/tmp/coverage-1607044-1772576637876-0.json +1 -0
- package/coverage/tmp/coverage-1607096-1772576638356-0.json +1 -0
- package/coverage/tmp/coverage-1607145-1772576638777-0.json +1 -0
- package/coverage/tmp/coverage-1607201-1772576639277-0.json +1 -0
- package/coverage/tmp/coverage-1607247-1772576639755-0.json +1 -0
- package/coverage/tmp/coverage-1607317-1772576640083-0.json +1 -0
- package/coverage/tmp/coverage-1607381-1772576640465-0.json +1 -0
- package/coverage/tmp/coverage-1607446-1772576640868-0.json +1 -0
- package/coverage/tmp/coverage-1607501-1772576641662-0.json +1 -0
- package/coverage/tmp/coverage-1607534-1772576641565-0.json +1 -0
- package/coverage/tmp/coverage-1607627-1772576641871-0.json +1 -0
- package/coverage/tmp/coverage-1607665-1772576642172-0.json +1 -0
- package/coverage/tmp/coverage-1607714-1772576642577-0.json +1 -0
- package/coverage/tmp/coverage-1607788-1772576643466-0.json +1 -0
- package/coverage/tmp/coverage-1607924-1772576644678-0.json +1 -0
- package/coverage/tmp/coverage-1607978-1772576645154-0.json +1 -0
- package/coverage/tmp/coverage-1608035-1772576645564-0.json +1 -0
- package/coverage/tmp/coverage-1608106-1772576645967-0.json +1 -0
- package/coverage/tmp/coverage-1608179-1772576648656-0.json +1 -0
- package/coverage/tmp/coverage-1608196-1772576647367-0.json +1 -0
- package/coverage/tmp/coverage-1608217-1772576648557-0.json +1 -0
- package/coverage/tmp/coverage-1608256-1772576651378-0.json +1 -0
- package/coverage/tmp/coverage-1608265-1772576650058-0.json +1 -0
- package/coverage/tmp/coverage-1608289-1772576651358-0.json +1 -0
- package/coverage/tmp/coverage-1608591-1772576660465-0.json +1 -0
- package/coverage/tmp/coverage-1608648-1772576659272-0.json +1 -0
- package/coverage/tmp/coverage-1608665-1772576660374-0.json +1 -0
- package/coverage/tmp/coverage-1608677-1772576661268-0.json +1 -0
- package/coverage/tmp/coverage-1608684-1772576663968-0.json +1 -0
- package/coverage/tmp/coverage-1608692-1772576662575-0.json +1 -0
- package/coverage/tmp/coverage-1608701-1772576663873-0.json +1 -0
- package/coverage/tmp/coverage-1608718-1772576666674-0.json +1 -0
- package/coverage/tmp/coverage-1608725-1772576665463-0.json +1 -0
- package/coverage/tmp/coverage-1608738-1772576666577-0.json +1 -0
- package/coverage/tmp/coverage-1608753-1772576669664-0.json +1 -0
- package/coverage/tmp/coverage-1608763-1772576668275-0.json +1 -0
- package/coverage/tmp/coverage-1608771-1772576669563-0.json +1 -0
- package/coverage/tmp/coverage-1608828-1772576676574-0.json +1 -0
- package/coverage/tmp/coverage-1609244-1772576675272-0.json +1 -0
- package/coverage/tmp/coverage-1609342-1772576676478-0.json +1 -0
- package/coverage/tmp/coverage-1609450-1772576686954-0.json +1 -0
- package/coverage/tmp/coverage-1609841-1772576685466-0.json +1 -0
- package/coverage/tmp/coverage-1609925-1772576686855-0.json +1 -0
- package/coverage/tmp/coverage-1610399-1772576692469-0.json +1 -0
- package/coverage/tmp/coverage-1611283-1772576703062-0.json +1 -0
- package/coverage/tmp/coverage-1611294-1772576703755-0.json +1 -0
- package/docs/plans/2026-03-03-a2a-91-macos-packaging-plan.md +144 -0
- package/docs/signing-setup.md +49 -0
- package/native/macos/certs/appldevcert.cer +0 -0
- package/native/macos/src-tauri/binaries/.gitkeep +0 -0
- package/native/macos/src-tauri/capabilities/default.json +11 -1
- package/native/macos/src-tauri/entitlements.plist +14 -0
- package/native/macos/src-tauri/src/discovery.rs +14 -3
- package/native/macos/src-tauri/src/health.rs +4 -0
- package/native/macos/src-tauri/src/lib.rs +52 -11
- package/native/macos/src-tauri/src/server.rs +262 -26
- package/native/macos/src-tauri/tauri.conf.json +13 -4
- package/package.json +7 -2
- package/pkg.config.json +14 -0
- package/scripts/build-standalone.sh +106 -0
- package/scripts/smoke-test-standalone.sh +101 -0
- package/scripts/sync-version.sh +28 -0
- package/scripts/verify-app-bundle.sh +34 -0
- package/.maestro/inbox/release-workflow-spam.md +0 -25
|
@@ -0,0 +1,3724 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/routes/a2a.js</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../../index.html">All files</a> / <a href="index.html">src/routes</a> a2a.js</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">80.62% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>978/1213</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">78.35% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>152/194</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">90% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>18/20</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">80.62% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>978/1213</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line high'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
+
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
+
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
+
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
+
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
+
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
+
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
+
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
+
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
+
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
+
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
+
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
+
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
+
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
+
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
+
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
+
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
+
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
+
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
+
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
+
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
+
<a name='L438'></a><a href='#L438'>438</a>
|
|
504
|
+
<a name='L439'></a><a href='#L439'>439</a>
|
|
505
|
+
<a name='L440'></a><a href='#L440'>440</a>
|
|
506
|
+
<a name='L441'></a><a href='#L441'>441</a>
|
|
507
|
+
<a name='L442'></a><a href='#L442'>442</a>
|
|
508
|
+
<a name='L443'></a><a href='#L443'>443</a>
|
|
509
|
+
<a name='L444'></a><a href='#L444'>444</a>
|
|
510
|
+
<a name='L445'></a><a href='#L445'>445</a>
|
|
511
|
+
<a name='L446'></a><a href='#L446'>446</a>
|
|
512
|
+
<a name='L447'></a><a href='#L447'>447</a>
|
|
513
|
+
<a name='L448'></a><a href='#L448'>448</a>
|
|
514
|
+
<a name='L449'></a><a href='#L449'>449</a>
|
|
515
|
+
<a name='L450'></a><a href='#L450'>450</a>
|
|
516
|
+
<a name='L451'></a><a href='#L451'>451</a>
|
|
517
|
+
<a name='L452'></a><a href='#L452'>452</a>
|
|
518
|
+
<a name='L453'></a><a href='#L453'>453</a>
|
|
519
|
+
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
|
+
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
|
+
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
+
<a name='L457'></a><a href='#L457'>457</a>
|
|
523
|
+
<a name='L458'></a><a href='#L458'>458</a>
|
|
524
|
+
<a name='L459'></a><a href='#L459'>459</a>
|
|
525
|
+
<a name='L460'></a><a href='#L460'>460</a>
|
|
526
|
+
<a name='L461'></a><a href='#L461'>461</a>
|
|
527
|
+
<a name='L462'></a><a href='#L462'>462</a>
|
|
528
|
+
<a name='L463'></a><a href='#L463'>463</a>
|
|
529
|
+
<a name='L464'></a><a href='#L464'>464</a>
|
|
530
|
+
<a name='L465'></a><a href='#L465'>465</a>
|
|
531
|
+
<a name='L466'></a><a href='#L466'>466</a>
|
|
532
|
+
<a name='L467'></a><a href='#L467'>467</a>
|
|
533
|
+
<a name='L468'></a><a href='#L468'>468</a>
|
|
534
|
+
<a name='L469'></a><a href='#L469'>469</a>
|
|
535
|
+
<a name='L470'></a><a href='#L470'>470</a>
|
|
536
|
+
<a name='L471'></a><a href='#L471'>471</a>
|
|
537
|
+
<a name='L472'></a><a href='#L472'>472</a>
|
|
538
|
+
<a name='L473'></a><a href='#L473'>473</a>
|
|
539
|
+
<a name='L474'></a><a href='#L474'>474</a>
|
|
540
|
+
<a name='L475'></a><a href='#L475'>475</a>
|
|
541
|
+
<a name='L476'></a><a href='#L476'>476</a>
|
|
542
|
+
<a name='L477'></a><a href='#L477'>477</a>
|
|
543
|
+
<a name='L478'></a><a href='#L478'>478</a>
|
|
544
|
+
<a name='L479'></a><a href='#L479'>479</a>
|
|
545
|
+
<a name='L480'></a><a href='#L480'>480</a>
|
|
546
|
+
<a name='L481'></a><a href='#L481'>481</a>
|
|
547
|
+
<a name='L482'></a><a href='#L482'>482</a>
|
|
548
|
+
<a name='L483'></a><a href='#L483'>483</a>
|
|
549
|
+
<a name='L484'></a><a href='#L484'>484</a>
|
|
550
|
+
<a name='L485'></a><a href='#L485'>485</a>
|
|
551
|
+
<a name='L486'></a><a href='#L486'>486</a>
|
|
552
|
+
<a name='L487'></a><a href='#L487'>487</a>
|
|
553
|
+
<a name='L488'></a><a href='#L488'>488</a>
|
|
554
|
+
<a name='L489'></a><a href='#L489'>489</a>
|
|
555
|
+
<a name='L490'></a><a href='#L490'>490</a>
|
|
556
|
+
<a name='L491'></a><a href='#L491'>491</a>
|
|
557
|
+
<a name='L492'></a><a href='#L492'>492</a>
|
|
558
|
+
<a name='L493'></a><a href='#L493'>493</a>
|
|
559
|
+
<a name='L494'></a><a href='#L494'>494</a>
|
|
560
|
+
<a name='L495'></a><a href='#L495'>495</a>
|
|
561
|
+
<a name='L496'></a><a href='#L496'>496</a>
|
|
562
|
+
<a name='L497'></a><a href='#L497'>497</a>
|
|
563
|
+
<a name='L498'></a><a href='#L498'>498</a>
|
|
564
|
+
<a name='L499'></a><a href='#L499'>499</a>
|
|
565
|
+
<a name='L500'></a><a href='#L500'>500</a>
|
|
566
|
+
<a name='L501'></a><a href='#L501'>501</a>
|
|
567
|
+
<a name='L502'></a><a href='#L502'>502</a>
|
|
568
|
+
<a name='L503'></a><a href='#L503'>503</a>
|
|
569
|
+
<a name='L504'></a><a href='#L504'>504</a>
|
|
570
|
+
<a name='L505'></a><a href='#L505'>505</a>
|
|
571
|
+
<a name='L506'></a><a href='#L506'>506</a>
|
|
572
|
+
<a name='L507'></a><a href='#L507'>507</a>
|
|
573
|
+
<a name='L508'></a><a href='#L508'>508</a>
|
|
574
|
+
<a name='L509'></a><a href='#L509'>509</a>
|
|
575
|
+
<a name='L510'></a><a href='#L510'>510</a>
|
|
576
|
+
<a name='L511'></a><a href='#L511'>511</a>
|
|
577
|
+
<a name='L512'></a><a href='#L512'>512</a>
|
|
578
|
+
<a name='L513'></a><a href='#L513'>513</a>
|
|
579
|
+
<a name='L514'></a><a href='#L514'>514</a>
|
|
580
|
+
<a name='L515'></a><a href='#L515'>515</a>
|
|
581
|
+
<a name='L516'></a><a href='#L516'>516</a>
|
|
582
|
+
<a name='L517'></a><a href='#L517'>517</a>
|
|
583
|
+
<a name='L518'></a><a href='#L518'>518</a>
|
|
584
|
+
<a name='L519'></a><a href='#L519'>519</a>
|
|
585
|
+
<a name='L520'></a><a href='#L520'>520</a>
|
|
586
|
+
<a name='L521'></a><a href='#L521'>521</a>
|
|
587
|
+
<a name='L522'></a><a href='#L522'>522</a>
|
|
588
|
+
<a name='L523'></a><a href='#L523'>523</a>
|
|
589
|
+
<a name='L524'></a><a href='#L524'>524</a>
|
|
590
|
+
<a name='L525'></a><a href='#L525'>525</a>
|
|
591
|
+
<a name='L526'></a><a href='#L526'>526</a>
|
|
592
|
+
<a name='L527'></a><a href='#L527'>527</a>
|
|
593
|
+
<a name='L528'></a><a href='#L528'>528</a>
|
|
594
|
+
<a name='L529'></a><a href='#L529'>529</a>
|
|
595
|
+
<a name='L530'></a><a href='#L530'>530</a>
|
|
596
|
+
<a name='L531'></a><a href='#L531'>531</a>
|
|
597
|
+
<a name='L532'></a><a href='#L532'>532</a>
|
|
598
|
+
<a name='L533'></a><a href='#L533'>533</a>
|
|
599
|
+
<a name='L534'></a><a href='#L534'>534</a>
|
|
600
|
+
<a name='L535'></a><a href='#L535'>535</a>
|
|
601
|
+
<a name='L536'></a><a href='#L536'>536</a>
|
|
602
|
+
<a name='L537'></a><a href='#L537'>537</a>
|
|
603
|
+
<a name='L538'></a><a href='#L538'>538</a>
|
|
604
|
+
<a name='L539'></a><a href='#L539'>539</a>
|
|
605
|
+
<a name='L540'></a><a href='#L540'>540</a>
|
|
606
|
+
<a name='L541'></a><a href='#L541'>541</a>
|
|
607
|
+
<a name='L542'></a><a href='#L542'>542</a>
|
|
608
|
+
<a name='L543'></a><a href='#L543'>543</a>
|
|
609
|
+
<a name='L544'></a><a href='#L544'>544</a>
|
|
610
|
+
<a name='L545'></a><a href='#L545'>545</a>
|
|
611
|
+
<a name='L546'></a><a href='#L546'>546</a>
|
|
612
|
+
<a name='L547'></a><a href='#L547'>547</a>
|
|
613
|
+
<a name='L548'></a><a href='#L548'>548</a>
|
|
614
|
+
<a name='L549'></a><a href='#L549'>549</a>
|
|
615
|
+
<a name='L550'></a><a href='#L550'>550</a>
|
|
616
|
+
<a name='L551'></a><a href='#L551'>551</a>
|
|
617
|
+
<a name='L552'></a><a href='#L552'>552</a>
|
|
618
|
+
<a name='L553'></a><a href='#L553'>553</a>
|
|
619
|
+
<a name='L554'></a><a href='#L554'>554</a>
|
|
620
|
+
<a name='L555'></a><a href='#L555'>555</a>
|
|
621
|
+
<a name='L556'></a><a href='#L556'>556</a>
|
|
622
|
+
<a name='L557'></a><a href='#L557'>557</a>
|
|
623
|
+
<a name='L558'></a><a href='#L558'>558</a>
|
|
624
|
+
<a name='L559'></a><a href='#L559'>559</a>
|
|
625
|
+
<a name='L560'></a><a href='#L560'>560</a>
|
|
626
|
+
<a name='L561'></a><a href='#L561'>561</a>
|
|
627
|
+
<a name='L562'></a><a href='#L562'>562</a>
|
|
628
|
+
<a name='L563'></a><a href='#L563'>563</a>
|
|
629
|
+
<a name='L564'></a><a href='#L564'>564</a>
|
|
630
|
+
<a name='L565'></a><a href='#L565'>565</a>
|
|
631
|
+
<a name='L566'></a><a href='#L566'>566</a>
|
|
632
|
+
<a name='L567'></a><a href='#L567'>567</a>
|
|
633
|
+
<a name='L568'></a><a href='#L568'>568</a>
|
|
634
|
+
<a name='L569'></a><a href='#L569'>569</a>
|
|
635
|
+
<a name='L570'></a><a href='#L570'>570</a>
|
|
636
|
+
<a name='L571'></a><a href='#L571'>571</a>
|
|
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">86x</span>
|
|
1280
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1281
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1282
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1283
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1284
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1285
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1286
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1287
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1288
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1289
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1290
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1291
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1292
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1293
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1294
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1295
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1296
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1297
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1298
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1299
|
+
<span class="cline-any cline-yes">78x</span>
|
|
1300
|
+
<span class="cline-any cline-yes">78x</span>
|
|
1301
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1302
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1303
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1304
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1305
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1306
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1307
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1308
|
+
<span class="cline-any cline-no"> </span>
|
|
1309
|
+
<span class="cline-any cline-no"> </span>
|
|
1310
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1311
|
+
<span class="cline-any cline-no"> </span>
|
|
1312
|
+
<span class="cline-any cline-no"> </span>
|
|
1313
|
+
<span class="cline-any cline-no"> </span>
|
|
1314
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1315
|
+
<span class="cline-any cline-yes">78x</span>
|
|
1316
|
+
<span class="cline-any cline-yes">78x</span>
|
|
1317
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1318
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1319
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1320
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1321
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1322
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1323
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1324
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1325
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1326
|
+
<span class="cline-any cline-no"> </span>
|
|
1327
|
+
<span class="cline-any cline-no"> </span>
|
|
1328
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1329
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1330
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1331
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1332
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1333
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1334
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1335
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1336
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1337
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1338
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1339
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1340
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1341
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1342
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1343
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1344
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1345
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1346
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1347
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1348
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1349
|
+
<span class="cline-any cline-yes">115x</span>
|
|
1350
|
+
<span class="cline-any cline-yes">115x</span>
|
|
1351
|
+
<span class="cline-any cline-yes">115x</span>
|
|
1352
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1353
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1354
|
+
<span class="cline-any cline-yes">114x</span>
|
|
1355
|
+
<span class="cline-any cline-yes">115x</span>
|
|
1356
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1357
|
+
<span class="cline-any cline-yes">115x</span>
|
|
1358
|
+
<span class="cline-any cline-yes">115x</span>
|
|
1359
|
+
<span class="cline-any cline-yes">115x</span>
|
|
1360
|
+
<span class="cline-any cline-no"> </span>
|
|
1361
|
+
<span class="cline-any cline-no"> </span>
|
|
1362
|
+
<span class="cline-any cline-yes">115x</span>
|
|
1363
|
+
<span class="cline-any cline-yes">115x</span>
|
|
1364
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1365
|
+
<span class="cline-any cline-yes">115x</span>
|
|
1366
|
+
<span class="cline-any cline-yes">115x</span>
|
|
1367
|
+
<span class="cline-any cline-yes">115x</span>
|
|
1368
|
+
<span class="cline-any cline-no"> </span>
|
|
1369
|
+
<span class="cline-any cline-no"> </span>
|
|
1370
|
+
<span class="cline-any cline-yes">115x</span>
|
|
1371
|
+
<span class="cline-any cline-yes">115x</span>
|
|
1372
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1373
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1374
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1375
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1376
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1377
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1378
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1379
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1380
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1381
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1382
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1383
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1384
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1385
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1386
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1387
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1388
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1389
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1390
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1391
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1392
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1393
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1394
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1395
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1396
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1397
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1398
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1399
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1400
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1401
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1402
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1403
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1404
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1405
|
+
<span class="cline-any cline-yes">2120x</span>
|
|
1406
|
+
<span class="cline-any cline-yes">2120x</span>
|
|
1407
|
+
<span class="cline-any cline-yes">2120x</span>
|
|
1408
|
+
<span class="cline-any cline-yes">2120x</span>
|
|
1409
|
+
<span class="cline-any cline-yes">2120x</span>
|
|
1410
|
+
<span class="cline-any cline-yes">2120x</span>
|
|
1411
|
+
<span class="cline-any cline-yes">2120x</span>
|
|
1412
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1413
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1414
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1415
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1416
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1417
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1418
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1419
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1420
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1421
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1422
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1423
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1424
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1425
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1426
|
+
<span class="cline-any cline-no"> </span>
|
|
1427
|
+
<span class="cline-any cline-no"> </span>
|
|
1428
|
+
<span class="cline-any cline-yes">2170x</span>
|
|
1429
|
+
<span class="cline-any cline-yes">2170x</span>
|
|
1430
|
+
<span class="cline-any cline-yes">2170x</span>
|
|
1431
|
+
<span class="cline-any cline-yes">2170x</span>
|
|
1432
|
+
<span class="cline-any cline-yes">2170x</span>
|
|
1433
|
+
<span class="cline-any cline-yes">2170x</span>
|
|
1434
|
+
<span class="cline-any cline-yes">2170x</span>
|
|
1435
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1436
|
+
<span class="cline-any cline-yes">52x</span>
|
|
1437
|
+
<span class="cline-any cline-yes">52x</span>
|
|
1438
|
+
<span class="cline-any cline-yes">52x</span>
|
|
1439
|
+
<span class="cline-any cline-yes">52052x</span>
|
|
1440
|
+
<span class="cline-any cline-yes">52052x</span>
|
|
1441
|
+
<span class="cline-any cline-yes">52052x</span>
|
|
1442
|
+
<span class="cline-any cline-yes">52052x</span>
|
|
1443
|
+
<span class="cline-any cline-yes">52052x</span>
|
|
1444
|
+
<span class="cline-any cline-yes">52052x</span>
|
|
1445
|
+
<span class="cline-any cline-yes">52052x</span>
|
|
1446
|
+
<span class="cline-any cline-yes">1000x</span>
|
|
1447
|
+
<span class="cline-any cline-yes">1000x</span>
|
|
1448
|
+
<span class="cline-any cline-yes">1000x</span>
|
|
1449
|
+
<span class="cline-any cline-yes">52052x</span>
|
|
1450
|
+
<span class="cline-any cline-yes">52x</span>
|
|
1451
|
+
<span class="cline-any cline-yes">52x</span>
|
|
1452
|
+
<span class="cline-any cline-yes">51x</span>
|
|
1453
|
+
<span class="cline-any cline-yes">51x</span>
|
|
1454
|
+
<span class="cline-any cline-yes">51x</span>
|
|
1455
|
+
<span class="cline-any cline-yes">102x</span>
|
|
1456
|
+
<span class="cline-any cline-yes">51x</span>
|
|
1457
|
+
<span class="cline-any cline-yes">51x</span>
|
|
1458
|
+
<span class="cline-any cline-yes">51x</span>
|
|
1459
|
+
<span class="cline-any cline-yes">51x</span>
|
|
1460
|
+
<span class="cline-any cline-yes">52x</span>
|
|
1461
|
+
<span class="cline-any cline-yes">2170x</span>
|
|
1462
|
+
<span class="cline-any cline-yes">2170x</span>
|
|
1463
|
+
<span class="cline-any cline-yes">2175x</span>
|
|
1464
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1465
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1466
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1467
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1468
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1469
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1470
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1471
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1472
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1473
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1474
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1475
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1476
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1477
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1478
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1479
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1480
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1481
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1482
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1483
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1484
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1485
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1486
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1487
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1488
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1489
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1490
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1491
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1492
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1493
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1494
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1495
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1496
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1497
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1498
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1499
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1500
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1501
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1502
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1503
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1504
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1505
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1506
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1507
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1508
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1509
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1510
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1511
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1512
|
+
<span class="cline-any cline-yes">109x</span>
|
|
1513
|
+
<span class="cline-any cline-yes">109x</span>
|
|
1514
|
+
<span class="cline-any cline-yes">109x</span>
|
|
1515
|
+
<span class="cline-any cline-yes">109x</span>
|
|
1516
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1517
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1518
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1519
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1520
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1521
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1522
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1523
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1524
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1525
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1526
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1527
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1528
|
+
<span class="cline-any cline-yes">107x</span>
|
|
1529
|
+
<span class="cline-any cline-yes">107x</span>
|
|
1530
|
+
<span class="cline-any cline-yes">107x</span>
|
|
1531
|
+
<span class="cline-any cline-yes">109x</span>
|
|
1532
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1533
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1534
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1535
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1536
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1537
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1538
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1539
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1540
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1541
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1542
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1543
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1544
|
+
<span class="cline-any cline-yes">101x</span>
|
|
1545
|
+
<span class="cline-any cline-yes">101x</span>
|
|
1546
|
+
<span class="cline-any cline-yes">109x</span>
|
|
1547
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1548
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1549
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1550
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1551
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1552
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1553
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1554
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1555
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1556
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1557
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1558
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1559
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1560
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1561
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1562
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1563
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1564
|
+
<span class="cline-any cline-yes">109x</span>
|
|
1565
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1566
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1567
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1568
|
+
<span class="cline-any cline-yes">94x</span>
|
|
1569
|
+
<span class="cline-any cline-yes">94x</span>
|
|
1570
|
+
<span class="cline-any cline-yes">94x</span>
|
|
1571
|
+
<span class="cline-any cline-yes">94x</span>
|
|
1572
|
+
<span class="cline-any cline-yes">94x</span>
|
|
1573
|
+
<span class="cline-any cline-yes">94x</span>
|
|
1574
|
+
<span class="cline-any cline-yes">109x</span>
|
|
1575
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1576
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1577
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1578
|
+
<span class="cline-any cline-yes">104x</span>
|
|
1579
|
+
<span class="cline-any cline-yes">104x</span>
|
|
1580
|
+
<span class="cline-any cline-yes">104x</span>
|
|
1581
|
+
<span class="cline-any cline-yes">104x</span>
|
|
1582
|
+
<span class="cline-any cline-yes">104x</span>
|
|
1583
|
+
<span class="cline-any cline-yes">104x</span>
|
|
1584
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1585
|
+
<span class="cline-any cline-yes">104x</span>
|
|
1586
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1587
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1588
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1589
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1590
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1591
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1592
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1593
|
+
<span class="cline-any cline-yes">104x</span>
|
|
1594
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1595
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1596
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1597
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1598
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1599
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1600
|
+
<span class="cline-any cline-yes">104x</span>
|
|
1601
|
+
<span class="cline-any cline-yes">104x</span>
|
|
1602
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1603
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1604
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1605
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1606
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1607
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1608
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1609
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1610
|
+
<span class="cline-any cline-yes">104x</span>
|
|
1611
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1612
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1613
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1614
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1615
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1616
|
+
<span class="cline-any cline-yes">104x</span>
|
|
1617
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1618
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1619
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1620
|
+
<span class="cline-any cline-yes">104x</span>
|
|
1621
|
+
<span class="cline-any cline-no"> </span>
|
|
1622
|
+
<span class="cline-any cline-no"> </span>
|
|
1623
|
+
<span class="cline-any cline-no"> </span>
|
|
1624
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1625
|
+
<span class="cline-any cline-yes">104x</span>
|
|
1626
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1627
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1628
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1629
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1630
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1631
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1632
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1633
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1634
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1635
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1636
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1637
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1638
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1639
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1640
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1641
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1642
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1643
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1644
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1645
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1646
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1647
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1648
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1649
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1650
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1651
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1652
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1653
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1654
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1655
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1656
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1657
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1658
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1659
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1660
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1661
|
+
<span class="cline-any cline-yes">13x</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-yes">13x</span>
|
|
1666
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1667
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1668
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1669
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1670
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1671
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1672
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1673
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1674
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1675
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1676
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1677
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1678
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1679
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1680
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1681
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1682
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1683
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1684
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1685
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1686
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1687
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1688
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1689
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1690
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1691
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1692
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1693
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1694
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1695
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1696
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1697
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1698
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1699
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1700
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1701
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1702
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1703
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1704
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1705
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1706
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1707
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1708
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1709
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1710
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1711
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1712
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1713
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1714
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1715
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1716
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1717
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1718
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1719
|
+
<span class="cline-any cline-no"> </span>
|
|
1720
|
+
<span class="cline-any cline-no"> </span>
|
|
1721
|
+
<span class="cline-any cline-no"> </span>
|
|
1722
|
+
<span class="cline-any cline-no"> </span>
|
|
1723
|
+
<span class="cline-any cline-no"> </span>
|
|
1724
|
+
<span class="cline-any cline-no"> </span>
|
|
1725
|
+
<span class="cline-any cline-no"> </span>
|
|
1726
|
+
<span class="cline-any cline-no"> </span>
|
|
1727
|
+
<span class="cline-any cline-no"> </span>
|
|
1728
|
+
<span class="cline-any cline-no"> </span>
|
|
1729
|
+
<span class="cline-any cline-no"> </span>
|
|
1730
|
+
<span class="cline-any cline-no"> </span>
|
|
1731
|
+
<span class="cline-any cline-no"> </span>
|
|
1732
|
+
<span class="cline-any cline-no"> </span>
|
|
1733
|
+
<span class="cline-any cline-no"> </span>
|
|
1734
|
+
<span class="cline-any cline-no"> </span>
|
|
1735
|
+
<span class="cline-any cline-no"> </span>
|
|
1736
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1737
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1738
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1739
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1740
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1741
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1742
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1743
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1744
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1745
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1746
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1747
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1748
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1749
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1750
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1751
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1752
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1753
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1754
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1755
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1756
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1757
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1758
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1759
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1760
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1761
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1762
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1763
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1764
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1765
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1766
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1767
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1768
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1769
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1770
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1771
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1772
|
+
<span class="cline-any cline-no"> </span>
|
|
1773
|
+
<span class="cline-any cline-no"> </span>
|
|
1774
|
+
<span class="cline-any cline-no"> </span>
|
|
1775
|
+
<span class="cline-any cline-no"> </span>
|
|
1776
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1777
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1778
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1779
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1780
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1781
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1782
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1783
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1784
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1785
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1786
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1787
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1788
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1789
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1790
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1791
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1792
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1793
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1794
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1795
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1796
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1797
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1798
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1799
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1800
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1801
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1802
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1803
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1804
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1805
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1806
|
+
<span class="cline-any cline-no"> </span>
|
|
1807
|
+
<span class="cline-any cline-no"> </span>
|
|
1808
|
+
<span class="cline-any cline-no"> </span>
|
|
1809
|
+
<span class="cline-any cline-no"> </span>
|
|
1810
|
+
<span class="cline-any cline-no"> </span>
|
|
1811
|
+
<span class="cline-any cline-no"> </span>
|
|
1812
|
+
<span class="cline-any cline-no"> </span>
|
|
1813
|
+
<span class="cline-any cline-no"> </span>
|
|
1814
|
+
<span class="cline-any cline-no"> </span>
|
|
1815
|
+
<span class="cline-any cline-no"> </span>
|
|
1816
|
+
<span class="cline-any cline-no"> </span>
|
|
1817
|
+
<span class="cline-any cline-no"> </span>
|
|
1818
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1819
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1820
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1821
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1822
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1823
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1824
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1825
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1826
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1827
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1828
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1829
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1830
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1831
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1832
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1833
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1834
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1835
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1836
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1837
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1838
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1839
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1840
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1841
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1842
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1843
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1844
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1845
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1846
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1847
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1848
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1849
|
+
<span class="cline-any cline-no"> </span>
|
|
1850
|
+
<span class="cline-any cline-no"> </span>
|
|
1851
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1852
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1853
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1854
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1855
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1856
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1857
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1858
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1859
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1860
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1861
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1862
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1863
|
+
<span class="cline-any cline-no"> </span>
|
|
1864
|
+
<span class="cline-any cline-no"> </span>
|
|
1865
|
+
<span class="cline-any cline-no"> </span>
|
|
1866
|
+
<span class="cline-any cline-no"> </span>
|
|
1867
|
+
<span class="cline-any cline-no"> </span>
|
|
1868
|
+
<span class="cline-any cline-no"> </span>
|
|
1869
|
+
<span class="cline-any cline-no"> </span>
|
|
1870
|
+
<span class="cline-any cline-no"> </span>
|
|
1871
|
+
<span class="cline-any cline-no"> </span>
|
|
1872
|
+
<span class="cline-any cline-no"> </span>
|
|
1873
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1874
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1875
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1876
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1877
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1878
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1879
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1880
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1881
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1882
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1883
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1884
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1885
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1886
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1887
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1888
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1889
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1890
|
+
<span class="cline-any cline-yes">10x</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-no"> </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-yes">10x</span>
|
|
1899
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1900
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1901
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1902
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1903
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1904
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1905
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1906
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1907
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1908
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1909
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1910
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1911
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1912
|
+
<span class="cline-any cline-no"> </span>
|
|
1913
|
+
<span class="cline-any cline-no"> </span>
|
|
1914
|
+
<span class="cline-any cline-no"> </span>
|
|
1915
|
+
<span class="cline-any cline-no"> </span>
|
|
1916
|
+
<span class="cline-any cline-no"> </span>
|
|
1917
|
+
<span class="cline-any cline-no"> </span>
|
|
1918
|
+
<span class="cline-any cline-no"> </span>
|
|
1919
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1920
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1921
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1922
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1923
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1924
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1925
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1926
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1927
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1928
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1929
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1930
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1931
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1932
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1933
|
+
<span class="cline-any cline-no"> </span>
|
|
1934
|
+
<span class="cline-any cline-no"> </span>
|
|
1935
|
+
<span class="cline-any cline-no"> </span>
|
|
1936
|
+
<span class="cline-any cline-no"> </span>
|
|
1937
|
+
<span class="cline-any cline-no"> </span>
|
|
1938
|
+
<span class="cline-any cline-no"> </span>
|
|
1939
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1940
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1941
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1942
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1943
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1944
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1945
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1946
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1947
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1948
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1949
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1950
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1951
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1952
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1953
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1954
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1955
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1956
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1957
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1958
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1959
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1960
|
+
<span class="cline-any cline-no"> </span>
|
|
1961
|
+
<span class="cline-any cline-no"> </span>
|
|
1962
|
+
<span class="cline-any cline-no"> </span>
|
|
1963
|
+
<span class="cline-any cline-no"> </span>
|
|
1964
|
+
<span class="cline-any cline-no"> </span>
|
|
1965
|
+
<span class="cline-any cline-no"> </span>
|
|
1966
|
+
<span class="cline-any cline-no"> </span>
|
|
1967
|
+
<span class="cline-any cline-no"> </span>
|
|
1968
|
+
<span class="cline-any cline-no"> </span>
|
|
1969
|
+
<span class="cline-any cline-no"> </span>
|
|
1970
|
+
<span class="cline-any cline-no"> </span>
|
|
1971
|
+
<span class="cline-any cline-no"> </span>
|
|
1972
|
+
<span class="cline-any cline-no"> </span>
|
|
1973
|
+
<span class="cline-any cline-no"> </span>
|
|
1974
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1975
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1976
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1977
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1978
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1979
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1980
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1981
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1982
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1983
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1984
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1985
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1986
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1987
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1988
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1989
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1990
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1991
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1992
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1993
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1994
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1995
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1996
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1997
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1998
|
+
<span class="cline-any cline-yes">93x</span>
|
|
1999
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2000
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2001
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2002
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2003
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2004
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2005
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2006
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2007
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2008
|
+
<span class="cline-any cline-yes">81x</span>
|
|
2009
|
+
<span class="cline-any cline-yes">81x</span>
|
|
2010
|
+
<span class="cline-any cline-yes">81x</span>
|
|
2011
|
+
<span class="cline-any cline-yes">81x</span>
|
|
2012
|
+
<span class="cline-any cline-yes">81x</span>
|
|
2013
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2014
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2015
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2016
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2017
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2018
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2019
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2020
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2021
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2022
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2023
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2024
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2025
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2026
|
+
<span class="cline-any cline-yes">79x</span>
|
|
2027
|
+
<span class="cline-any cline-yes">79x</span>
|
|
2028
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2029
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2030
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2031
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2032
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2033
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2034
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2035
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2036
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2037
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2038
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2039
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2040
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2041
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2042
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2043
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2044
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2045
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2046
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2047
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2048
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2049
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2050
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2051
|
+
<span class="cline-any cline-yes">19x</span>
|
|
2052
|
+
<span class="cline-any cline-yes">19x</span>
|
|
2053
|
+
<span class="cline-any cline-yes">19x</span>
|
|
2054
|
+
<span class="cline-any cline-yes">19x</span>
|
|
2055
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2056
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2057
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2058
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2059
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2060
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2061
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2062
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2063
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2064
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2065
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2066
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2067
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2068
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2069
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2070
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2071
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2072
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2073
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2074
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2075
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2076
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2077
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2078
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2079
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2080
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2081
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2082
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2083
|
+
<span class="cline-any cline-no"> </span>
|
|
2084
|
+
<span class="cline-any cline-no"> </span>
|
|
2085
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2086
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2087
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2088
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2089
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2090
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2091
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2092
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2093
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2094
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2095
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2096
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2097
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2098
|
+
<span class="cline-any cline-no"> </span>
|
|
2099
|
+
<span class="cline-any cline-no"> </span>
|
|
2100
|
+
<span class="cline-any cline-no"> </span>
|
|
2101
|
+
<span class="cline-any cline-no"> </span>
|
|
2102
|
+
<span class="cline-any cline-no"> </span>
|
|
2103
|
+
<span class="cline-any cline-no"> </span>
|
|
2104
|
+
<span class="cline-any cline-no"> </span>
|
|
2105
|
+
<span class="cline-any cline-no"> </span>
|
|
2106
|
+
<span class="cline-any cline-no"> </span>
|
|
2107
|
+
<span class="cline-any cline-no"> </span>
|
|
2108
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2109
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2110
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2111
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2112
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2113
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2114
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2115
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2116
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2117
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2118
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2119
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2120
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2121
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2122
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2123
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2124
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2125
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2126
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2127
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2128
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2129
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2130
|
+
<span class="cline-any cline-no"> </span>
|
|
2131
|
+
<span class="cline-any cline-no"> </span>
|
|
2132
|
+
<span class="cline-any cline-no"> </span>
|
|
2133
|
+
<span class="cline-any cline-no"> </span>
|
|
2134
|
+
<span class="cline-any cline-no"> </span>
|
|
2135
|
+
<span class="cline-any cline-no"> </span>
|
|
2136
|
+
<span class="cline-any cline-no"> </span>
|
|
2137
|
+
<span class="cline-any cline-no"> </span>
|
|
2138
|
+
<span class="cline-any cline-no"> </span>
|
|
2139
|
+
<span class="cline-any cline-no"> </span>
|
|
2140
|
+
<span class="cline-any cline-no"> </span>
|
|
2141
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2142
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2143
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2144
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2145
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2146
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2147
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2148
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2149
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2150
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2151
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2152
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2153
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2154
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2155
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2156
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2157
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2158
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2159
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2160
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2161
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2162
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2163
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2164
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2165
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2166
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2167
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2168
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2169
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2170
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2171
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2172
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2173
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2174
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2175
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2176
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2177
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2178
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2179
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2180
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2181
|
+
<span class="cline-any cline-yes">73x</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-no"> </span>
|
|
2186
|
+
<span class="cline-any cline-no"> </span>
|
|
2187
|
+
<span class="cline-any cline-no"> </span>
|
|
2188
|
+
<span class="cline-any cline-no"> </span>
|
|
2189
|
+
<span class="cline-any cline-no"> </span>
|
|
2190
|
+
<span class="cline-any cline-no"> </span>
|
|
2191
|
+
<span class="cline-any cline-no"> </span>
|
|
2192
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2193
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2194
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2195
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2196
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2197
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2198
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2199
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2200
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2201
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2202
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2203
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2204
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2205
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2206
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2207
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2208
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2209
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2210
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2211
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2212
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2213
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2214
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2215
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2216
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2217
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2218
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2219
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2220
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2221
|
+
<span class="cline-any cline-yes">73x</span>
|
|
2222
|
+
<span class="cline-any cline-yes">93x</span>
|
|
2223
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2224
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2225
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2226
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2227
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2228
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2229
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2230
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2231
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2232
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2233
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2234
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2235
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2236
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2237
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2238
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2239
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2240
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2241
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2242
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2243
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2244
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2245
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2246
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2247
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2248
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2249
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2250
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2251
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2252
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2253
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2254
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2255
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2256
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2257
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2258
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2259
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2260
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2261
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2262
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2263
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2264
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2265
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2266
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2267
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2268
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2269
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2270
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2271
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2272
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2273
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2274
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2275
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2276
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2277
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2278
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2279
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2280
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2281
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2282
|
+
<span class="cline-any cline-no"> </span>
|
|
2283
|
+
<span class="cline-any cline-no"> </span>
|
|
2284
|
+
<span class="cline-any cline-no"> </span>
|
|
2285
|
+
<span class="cline-any cline-no"> </span>
|
|
2286
|
+
<span class="cline-any cline-no"> </span>
|
|
2287
|
+
<span class="cline-any cline-no"> </span>
|
|
2288
|
+
<span class="cline-any cline-no"> </span>
|
|
2289
|
+
<span class="cline-any cline-no"> </span>
|
|
2290
|
+
<span class="cline-any cline-no"> </span>
|
|
2291
|
+
<span class="cline-any cline-no"> </span>
|
|
2292
|
+
<span class="cline-any cline-no"> </span>
|
|
2293
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2294
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2295
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2296
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2297
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2298
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2299
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2300
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2301
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2302
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2303
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2304
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2305
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2306
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2307
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2308
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2309
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2310
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2311
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2312
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2313
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2314
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2315
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2316
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2317
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2318
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2319
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2320
|
+
<span class="cline-any cline-no"> </span>
|
|
2321
|
+
<span class="cline-any cline-no"> </span>
|
|
2322
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2323
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2324
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2325
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2326
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2327
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2328
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2329
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2330
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2331
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2332
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2333
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2334
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2335
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2336
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2337
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2338
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2339
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2340
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2341
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2342
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2343
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2344
|
+
<span class="cline-any cline-no"> </span>
|
|
2345
|
+
<span class="cline-any cline-no"> </span>
|
|
2346
|
+
<span class="cline-any cline-no"> </span>
|
|
2347
|
+
<span class="cline-any cline-no"> </span>
|
|
2348
|
+
<span class="cline-any cline-no"> </span>
|
|
2349
|
+
<span class="cline-any cline-no"> </span>
|
|
2350
|
+
<span class="cline-any cline-no"> </span>
|
|
2351
|
+
<span class="cline-any cline-no"> </span>
|
|
2352
|
+
<span class="cline-any cline-no"> </span>
|
|
2353
|
+
<span class="cline-any cline-no"> </span>
|
|
2354
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2355
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2356
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2357
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2358
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2359
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2360
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2361
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2362
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2363
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2364
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2365
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2366
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2367
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2368
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2369
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2370
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2371
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2372
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2373
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2374
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2375
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2376
|
+
<span class="cline-any cline-no"> </span>
|
|
2377
|
+
<span class="cline-any cline-no"> </span>
|
|
2378
|
+
<span class="cline-any cline-no"> </span>
|
|
2379
|
+
<span class="cline-any cline-no"> </span>
|
|
2380
|
+
<span class="cline-any cline-no"> </span>
|
|
2381
|
+
<span class="cline-any cline-no"> </span>
|
|
2382
|
+
<span class="cline-any cline-no"> </span>
|
|
2383
|
+
<span class="cline-any cline-no"> </span>
|
|
2384
|
+
<span class="cline-any cline-no"> </span>
|
|
2385
|
+
<span class="cline-any cline-no"> </span>
|
|
2386
|
+
<span class="cline-any cline-no"> </span>
|
|
2387
|
+
<span class="cline-any cline-no"> </span>
|
|
2388
|
+
<span class="cline-any cline-no"> </span>
|
|
2389
|
+
<span class="cline-any cline-no"> </span>
|
|
2390
|
+
<span class="cline-any cline-no"> </span>
|
|
2391
|
+
<span class="cline-any cline-no"> </span>
|
|
2392
|
+
<span class="cline-any cline-no"> </span>
|
|
2393
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2394
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2395
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2396
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2397
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2398
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2399
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2400
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2401
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
2408
|
+
<span class="cline-any cline-no"> </span>
|
|
2409
|
+
<span class="cline-any cline-no"> </span>
|
|
2410
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
2418
|
+
<span class="cline-any cline-no"> </span>
|
|
2419
|
+
<span class="cline-any cline-no"> </span>
|
|
2420
|
+
<span class="cline-any cline-no"> </span>
|
|
2421
|
+
<span class="cline-any cline-no"> </span>
|
|
2422
|
+
<span class="cline-any cline-no"> </span>
|
|
2423
|
+
<span class="cline-any cline-no"> </span>
|
|
2424
|
+
<span class="cline-any cline-no"> </span>
|
|
2425
|
+
<span class="cline-any cline-no"> </span>
|
|
2426
|
+
<span class="cline-any cline-no"> </span>
|
|
2427
|
+
<span class="cline-any cline-no"> </span>
|
|
2428
|
+
<span class="cline-any cline-no"> </span>
|
|
2429
|
+
<span class="cline-any cline-no"> </span>
|
|
2430
|
+
<span class="cline-any cline-no"> </span>
|
|
2431
|
+
<span class="cline-any cline-no"> </span>
|
|
2432
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2433
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2434
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2435
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2436
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2437
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2438
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2439
|
+
<span class="cline-any cline-no"> </span>
|
|
2440
|
+
<span class="cline-any cline-no"> </span>
|
|
2441
|
+
<span class="cline-any cline-no"> </span>
|
|
2442
|
+
<span class="cline-any cline-no"> </span>
|
|
2443
|
+
<span class="cline-any cline-no"> </span>
|
|
2444
|
+
<span class="cline-any cline-no"> </span>
|
|
2445
|
+
<span class="cline-any cline-no"> </span>
|
|
2446
|
+
<span class="cline-any cline-no"> </span>
|
|
2447
|
+
<span class="cline-any cline-no"> </span>
|
|
2448
|
+
<span class="cline-any cline-no"> </span>
|
|
2449
|
+
<span class="cline-any cline-no"> </span>
|
|
2450
|
+
<span class="cline-any cline-no"> </span>
|
|
2451
|
+
<span class="cline-any cline-no"> </span>
|
|
2452
|
+
<span class="cline-any cline-no"> </span>
|
|
2453
|
+
<span class="cline-any cline-no"> </span>
|
|
2454
|
+
<span class="cline-any cline-no"> </span>
|
|
2455
|
+
<span class="cline-any cline-no"> </span>
|
|
2456
|
+
<span class="cline-any cline-no"> </span>
|
|
2457
|
+
<span class="cline-any cline-no"> </span>
|
|
2458
|
+
<span class="cline-any cline-no"> </span>
|
|
2459
|
+
<span class="cline-any cline-no"> </span>
|
|
2460
|
+
<span class="cline-any cline-no"> </span>
|
|
2461
|
+
<span class="cline-any cline-no"> </span>
|
|
2462
|
+
<span class="cline-any cline-no"> </span>
|
|
2463
|
+
<span class="cline-any cline-no"> </span>
|
|
2464
|
+
<span class="cline-any cline-no"> </span>
|
|
2465
|
+
<span class="cline-any cline-no"> </span>
|
|
2466
|
+
<span class="cline-any cline-no"> </span>
|
|
2467
|
+
<span class="cline-any cline-no"> </span>
|
|
2468
|
+
<span class="cline-any cline-no"> </span>
|
|
2469
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2470
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2471
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2472
|
+
<span class="cline-any cline-yes">75x</span>
|
|
2473
|
+
<span class="cline-any cline-yes">86x</span>
|
|
2474
|
+
<span class="cline-any cline-yes">86x</span>
|
|
2475
|
+
<span class="cline-any cline-yes">86x</span>
|
|
2476
|
+
<span class="cline-any cline-yes">86x</span>
|
|
2477
|
+
<span class="cline-any cline-no"> </span>
|
|
2478
|
+
<span class="cline-any cline-no"> </span>
|
|
2479
|
+
<span class="cline-any cline-no"> </span>
|
|
2480
|
+
<span class="cline-any cline-no"> </span>
|
|
2481
|
+
<span class="cline-any cline-no"> </span>
|
|
2482
|
+
<span class="cline-any cline-no"> </span>
|
|
2483
|
+
<span class="cline-any cline-yes">86x</span>
|
|
2484
|
+
<span class="cline-any cline-yes">86x</span>
|
|
2485
|
+
<span class="cline-any cline-yes">86x</span>
|
|
2486
|
+
<span class="cline-any cline-yes">86x</span>
|
|
2487
|
+
<span class="cline-any cline-yes">86x</span>
|
|
2488
|
+
<span class="cline-any cline-yes">86x</span>
|
|
2489
|
+
<span class="cline-any cline-yes">86x</span>
|
|
2490
|
+
<span class="cline-any cline-yes">86x</span>
|
|
2491
|
+
<span class="cline-any cline-yes">86x</span>
|
|
2492
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/**
|
|
2493
|
+
* A2A API Routes
|
|
2494
|
+
*
|
|
2495
|
+
* Mount at: /api/a2a
|
|
2496
|
+
*
|
|
2497
|
+
* Security notes:
|
|
2498
|
+
* - Rate limiting is in-memory (resets on restart) - for production, use Redis
|
|
2499
|
+
* - Body size should be limited by Express middleware (e.g., express.json({ limit: '100kb' }))
|
|
2500
|
+
*/
|
|
2501
|
+
|
|
2502
|
+
const { TokenStore } = require('../lib/tokens');
|
|
2503
|
+
const crypto = require('crypto');
|
|
2504
|
+
const { createLogger, createTraceId } = require('../lib/logger');
|
|
2505
|
+
const { verifySignature, isTimestampValid, fingerprint } = require('../lib/crypto');
|
|
2506
|
+
const { buildAgentCard } = require('../lib/agent-card');
|
|
2507
|
+
const { isDirectLocalRequest } = require('../lib/local-request');
|
|
2508
|
+
|
|
2509
|
+
// Lazy-load conversation store (optional dependency)
|
|
2510
|
+
let ConversationStore = null;
|
|
2511
|
+
let conversationStore = null;
|
|
2512
|
+
function getConversationStore(options = {}) {
|
|
2513
|
+
if (!ConversationStore) {
|
|
2514
|
+
try {
|
|
2515
|
+
ConversationStore = require('../lib/conversations').ConversationStore;
|
|
2516
|
+
const configDir = options.configDir <span class="branch-0 cbranch-no" title="branch not covered" >|| undefined;</span>
|
|
2517
|
+
conversationStore = new ConversationStore(configDir, {
|
|
2518
|
+
eventStore: options.eventStore || null
|
|
2519
|
+
});
|
|
2520
|
+
if (!conversationStore.isAvailable()) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2521
|
+
<span class="cstat-no" title="statement not covered" > conversationStore = null;</span>
|
|
2522
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2523
|
+
} <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
|
|
2524
|
+
<span class="cstat-no" title="statement not covered" > // Conversation storage not available</span>
|
|
2525
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
2526
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2527
|
+
}
|
|
2528
|
+
return conversationStore;
|
|
2529
|
+
}
|
|
2530
|
+
|
|
2531
|
+
// Lazy-load call monitor
|
|
2532
|
+
let CallMonitor = null;
|
|
2533
|
+
let callMonitor = null;
|
|
2534
|
+
function getCallMonitor(options = {}) {
|
|
2535
|
+
if (!CallMonitor) {
|
|
2536
|
+
try {
|
|
2537
|
+
CallMonitor = require('../lib/call-monitor').CallMonitor;
|
|
2538
|
+
} <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
|
|
2539
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
2540
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2541
|
+
}
|
|
2542
|
+
if (!callMonitor && options.convStore) {
|
|
2543
|
+
callMonitor = new CallMonitor(options);
|
|
2544
|
+
callMonitor.start();
|
|
2545
|
+
}
|
|
2546
|
+
return callMonitor;
|
|
2547
|
+
}
|
|
2548
|
+
|
|
2549
|
+
// Rate limiting state (in-memory - resets on restart)
|
|
2550
|
+
// For production: use Redis or persistent store
|
|
2551
|
+
const rateLimits = new Map();
|
|
2552
|
+
|
|
2553
|
+
// Rate limit eviction constants
|
|
2554
|
+
const RATE_LIMIT_MAX_ENTRIES = 1000;
|
|
2555
|
+
const RATE_LIMIT_STALE_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
2556
|
+
|
|
2557
|
+
// Constants
|
|
2558
|
+
const MAX_MESSAGE_LENGTH = 10000; // 10KB max message
|
|
2559
|
+
const MAX_TIMEOUT_SECONDS = 300; // 5 min max timeout
|
|
2560
|
+
const MIN_TIMEOUT_SECONDS = 5; // 5 sec min timeout
|
|
2561
|
+
|
|
2562
|
+
function resolveTraceId(req) {
|
|
2563
|
+
const headerTrace = req.headers['x-trace-id'];
|
|
2564
|
+
if (typeof headerTrace === 'string' && headerTrace.trim()) {
|
|
2565
|
+
return headerTrace.trim().slice(0, 120);
|
|
2566
|
+
}
|
|
2567
|
+
return createTraceId('a2a');
|
|
2568
|
+
}
|
|
2569
|
+
|
|
2570
|
+
function resolveRequestId(req) {
|
|
2571
|
+
const headerRequestId = req.headers['x-request-id'];
|
|
2572
|
+
if (typeof headerRequestId === 'string' <span class="branch-0 cbranch-no" title="branch not covered" >&& headerRequestId.trim())</span> <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2573
|
+
<span class="cstat-no" title="statement not covered" > return headerRequestId.trim().slice(0, 120);</span>
|
|
2574
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2575
|
+
return createTraceId('req');
|
|
2576
|
+
}
|
|
2577
|
+
|
|
2578
|
+
function extractClientHost(req) {
|
|
2579
|
+
const forwarded = req.headers['x-forwarded-for'];
|
|
2580
|
+
if (typeof forwarded === 'string' <span class="branch-0 cbranch-no" title="branch not covered" >&& forwarded.trim())</span> <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2581
|
+
<span class="cstat-no" title="statement not covered" > return forwarded.split(',')[0].trim();</span>
|
|
2582
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2583
|
+
return req.ip <span class="branch-0 cbranch-no" title="branch not covered" >|| null;</span>
|
|
2584
|
+
}
|
|
2585
|
+
|
|
2586
|
+
function normalizeRequestMetadata(req) {
|
|
2587
|
+
const body = req && typeof req.body === 'object' && req.body ? req.body <span class="branch-0 cbranch-no" title="branch not covered" >: {};</span>
|
|
2588
|
+
return {
|
|
2589
|
+
has_message: typeof body.message === 'string',
|
|
2590
|
+
has_caller: Boolean(body.caller && typeof body.caller === 'object'),
|
|
2591
|
+
has_context: Boolean(body.context <span class="branch-0 cbranch-no" title="branch not covered" >&& typeof body.context === 'object')</span>,
|
|
2592
|
+
timeout_seconds: body.timeout_seconds
|
|
2593
|
+
};
|
|
2594
|
+
}
|
|
2595
|
+
|
|
2596
|
+
/**
|
|
2597
|
+
* Timing-safe comparison of two token strings.
|
|
2598
|
+
* Returns true if tokens match, false otherwise.
|
|
2599
|
+
* Short-circuits (non-timing-safe) only when a value is missing or empty,
|
|
2600
|
+
* which is acceptable since the absence of a token is not secret.
|
|
2601
|
+
*/
|
|
2602
|
+
function timingSafeTokenEqual(a, b) {
|
|
2603
|
+
if (!a || !b) return false;
|
|
2604
|
+
const bufA = Buffer.from(String(a));
|
|
2605
|
+
const bufB = Buffer.from(String(b));
|
|
2606
|
+
if (bufA.length !== bufB.length) return false;
|
|
2607
|
+
return crypto.timingSafeEqual(bufA, bufB);
|
|
2608
|
+
}
|
|
2609
|
+
|
|
2610
|
+
function checkRateLimit(tokenId, limits = { minute: 10, hour: 100, day: 1000 }) {
|
|
2611
|
+
const now = Date.now();
|
|
2612
|
+
const minute = Math.floor(now / 60000);
|
|
2613
|
+
const hour = Math.floor(now / 3600000);
|
|
2614
|
+
const day = Math.floor(now / 86400000);
|
|
2615
|
+
|
|
2616
|
+
let state = rateLimits.get(tokenId);
|
|
2617
|
+
if (!state) {
|
|
2618
|
+
state = {
|
|
2619
|
+
minute: { count: 0, bucket: minute },
|
|
2620
|
+
hour: { count: 0, bucket: hour },
|
|
2621
|
+
day: { count: 0, bucket: day }
|
|
2622
|
+
};
|
|
2623
|
+
rateLimits.set(tokenId, state);
|
|
2624
|
+
}
|
|
2625
|
+
|
|
2626
|
+
// Reset buckets if needed
|
|
2627
|
+
if (state.minute.bucket !== minute) <span class="branch-0 cbranch-no" title="branch not covered" >state.minute = { count: 0, bucket: minute };</span>
|
|
2628
|
+
if (state.hour.bucket !== hour) <span class="branch-0 cbranch-no" title="branch not covered" >state.hour = { count: 0, bucket: hour };</span>
|
|
2629
|
+
if (state.day.bucket !== day) <span class="branch-0 cbranch-no" title="branch not covered" >state.day = { count: 0, bucket: day };</span>
|
|
2630
|
+
|
|
2631
|
+
// Check limits
|
|
2632
|
+
if (state.minute.count >= limits.minute) {
|
|
2633
|
+
return { limited: true, error: 'rate_limited', message: 'Too many requests per minute', retryAfter: 60 };
|
|
2634
|
+
}
|
|
2635
|
+
if (state.hour.count >= limits.hour) {
|
|
2636
|
+
return { limited: true, error: 'rate_limited', message: 'Too many requests per hour', retryAfter: 3600 };
|
|
2637
|
+
}
|
|
2638
|
+
if (state.day.count >= limits.day) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2639
|
+
<span class="cstat-no" title="statement not covered" > return { limited: true, error: 'rate_limited', message: 'Too many requests per day', retryAfter: 86400 };</span>
|
|
2640
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2641
|
+
|
|
2642
|
+
// Increment
|
|
2643
|
+
state.minute.count++;
|
|
2644
|
+
state.hour.count++;
|
|
2645
|
+
state.day.count++;
|
|
2646
|
+
|
|
2647
|
+
// Evict stale entries when the Map exceeds the size threshold
|
|
2648
|
+
if (rateLimits.size > RATE_LIMIT_MAX_ENTRIES) {
|
|
2649
|
+
const staleThreshold = now - RATE_LIMIT_STALE_MS;
|
|
2650
|
+
let evicted = 0;
|
|
2651
|
+
for (const [key, entry] of rateLimits) {
|
|
2652
|
+
// An entry is stale if all three bucket timestamps are older than 24h
|
|
2653
|
+
const latestBucket = Math.max(
|
|
2654
|
+
entry.minute.bucket * 60000,
|
|
2655
|
+
entry.hour.bucket * 3600000,
|
|
2656
|
+
entry.day.bucket * 86400000
|
|
2657
|
+
);
|
|
2658
|
+
if (latestBucket < staleThreshold) {
|
|
2659
|
+
rateLimits.delete(key);
|
|
2660
|
+
evicted++;
|
|
2661
|
+
}
|
|
2662
|
+
}
|
|
2663
|
+
// If no stale entries found, evict the oldest (first-inserted) entries
|
|
2664
|
+
if (evicted === 0) {
|
|
2665
|
+
const excess = rateLimits.size - RATE_LIMIT_MAX_ENTRIES;
|
|
2666
|
+
let removed = 0;
|
|
2667
|
+
for (const key of rateLimits.keys()) {
|
|
2668
|
+
if (removed >= excess) break;
|
|
2669
|
+
rateLimits.delete(key);
|
|
2670
|
+
removed++;
|
|
2671
|
+
}
|
|
2672
|
+
}
|
|
2673
|
+
}
|
|
2674
|
+
|
|
2675
|
+
return { limited: false };
|
|
2676
|
+
}
|
|
2677
|
+
|
|
2678
|
+
/**
|
|
2679
|
+
* Create a2a routes
|
|
2680
|
+
*
|
|
2681
|
+
* @param {object} options
|
|
2682
|
+
* @param {TokenStore} options.tokenStore - Token store instance
|
|
2683
|
+
* @param {function} options.handleMessage - Async function to handle incoming messages
|
|
2684
|
+
* @param {function} options.notifyOwner - Async function to notify owner of calls
|
|
2685
|
+
* @param {object} options.rateLimits - Custom rate limits { minute, hour, day }
|
|
2686
|
+
* @param {function} options.summarizer - Async function to summarize conversations
|
|
2687
|
+
* @param {object} options.ownerContext - Owner context for summaries
|
|
2688
|
+
* @param {number} options.idleTimeoutMs - Idle timeout for auto-conclude (default: 60000)
|
|
2689
|
+
* @param {number} options.maxDurationMs - Max call duration (default: 300000)
|
|
2690
|
+
*/
|
|
2691
|
+
function createRoutes(options = {}) {
|
|
2692
|
+
const express = require('express');
|
|
2693
|
+
const router = express.Router();
|
|
2694
|
+
|
|
2695
|
+
const tokenStore = options.tokenStore <span class="branch-0 cbranch-no" title="branch not covered" >|| new TokenStore();</span>
|
|
2696
|
+
const handleMessage = options.handleMessage || defaultMessageHandler;
|
|
2697
|
+
const notifyOwner = options.notifyOwner || (<span class="fstat-no" title="function not covered" >() => Promise.resolve())</span>;
|
|
2698
|
+
const limits = options.rateLimits || { minute: 10, hour: 100, day: 1000 };
|
|
2699
|
+
const logger = options.logger || createLogger({ component: 'a2a.routes' });
|
|
2700
|
+
const eventStore = options.eventStore || null;
|
|
2701
|
+
|
|
2702
|
+
// Initialize conversation store and call monitor
|
|
2703
|
+
const convStore = getConversationStore({
|
|
2704
|
+
eventStore,
|
|
2705
|
+
configDir: tokenStore.configDir
|
|
2706
|
+
});
|
|
2707
|
+
const monitor = getCallMonitor({
|
|
2708
|
+
convStore,
|
|
2709
|
+
summarizer: options.summarizer,
|
|
2710
|
+
notifyOwner,
|
|
2711
|
+
ownerContext: options.ownerContext || {},
|
|
2712
|
+
idleTimeoutMs: options.idleTimeoutMs || 60000,
|
|
2713
|
+
maxDurationMs: options.maxDurationMs || 300000,
|
|
2714
|
+
logger: logger.child({ component: 'a2a.call-monitor' })
|
|
2715
|
+
});
|
|
2716
|
+
if (typeof options.onCallMonitor === 'function') {
|
|
2717
|
+
try {
|
|
2718
|
+
options.onCallMonitor(monitor);
|
|
2719
|
+
} <span class="branch-0 cbranch-no" title="branch not covered" >catch (_) {}</span>
|
|
2720
|
+
}
|
|
2721
|
+
|
|
2722
|
+
// A2A-78: shared inbound auth pipeline for /invoke, /message:send, /end
|
|
2723
|
+
// Returns { validation, identityVerified, publicKeyFingerprint } or sends error response and returns null
|
|
2724
|
+
async function validateInboundAuth(req, res, reqLogger, endpoint) {
|
|
2725
|
+
const withTracePayload = (payload) => ({ ...payload, trace_id: res.getHeader('x-trace-id'), request_id: res.getHeader('x-request-id') });
|
|
2726
|
+
|
|
2727
|
+
const authHeader = req.headers.authorization;
|
|
2728
|
+
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
2729
|
+
reqLogger.warn('Request missing bearer token', {
|
|
2730
|
+
error_code: 'AUTH_MISSING_BEARER',
|
|
2731
|
+
status_code: 401,
|
|
2732
|
+
hint: 'Send Authorization: Bearer <a2a_token>.'
|
|
2733
|
+
});
|
|
2734
|
+
res.status(401).json(withTracePayload({
|
|
2735
|
+
success: false,
|
|
2736
|
+
error: 'missing_token',
|
|
2737
|
+
message: 'Authorization header required'
|
|
2738
|
+
}));
|
|
2739
|
+
return null;
|
|
2740
|
+
}
|
|
2741
|
+
|
|
2742
|
+
const token = authHeader.slice(7);
|
|
2743
|
+
const validation = tokenStore.validate(token);
|
|
2744
|
+
if (!validation.valid) {
|
|
2745
|
+
reqLogger.warn('Token validation failed', {
|
|
2746
|
+
error_code: 'TOKEN_INVALID_OR_EXPIRED',
|
|
2747
|
+
status_code: 401,
|
|
2748
|
+
hint: 'Create a fresh invite token and retry with the new bearer token.'
|
|
2749
|
+
});
|
|
2750
|
+
res.status(401).json(withTracePayload({
|
|
2751
|
+
success: false,
|
|
2752
|
+
error: 'unauthorized',
|
|
2753
|
+
message: 'Invalid or expired token'
|
|
2754
|
+
}));
|
|
2755
|
+
return null;
|
|
2756
|
+
}
|
|
2757
|
+
|
|
2758
|
+
const rateCheck = checkRateLimit(validation.id, limits);
|
|
2759
|
+
if (rateCheck.limited) {
|
|
2760
|
+
reqLogger.warn('Request rate limited', {
|
|
2761
|
+
tokenId: validation.id,
|
|
2762
|
+
error_code: 'TOKEN_RATE_LIMITED',
|
|
2763
|
+
status_code: 429,
|
|
2764
|
+
hint: 'Respect Retry-After and reduce invoke frequency for this token.',
|
|
2765
|
+
data: { retry_after: rateCheck.retryAfter }
|
|
2766
|
+
});
|
|
2767
|
+
res.set('Retry-After', rateCheck.retryAfter);
|
|
2768
|
+
res.status(429).json(withTracePayload({
|
|
2769
|
+
success: false,
|
|
2770
|
+
error: rateCheck.error,
|
|
2771
|
+
message: rateCheck.message
|
|
2772
|
+
}));
|
|
2773
|
+
return null;
|
|
2774
|
+
}
|
|
2775
|
+
|
|
2776
|
+
const sigCheck = verifySigHeaders(req, validation, endpoint, reqLogger);
|
|
2777
|
+
if (sigCheck.error) {
|
|
2778
|
+
res.status(sigCheck.error.status).json(withTracePayload(sigCheck.error.body));
|
|
2779
|
+
return null;
|
|
2780
|
+
}
|
|
2781
|
+
|
|
2782
|
+
return {
|
|
2783
|
+
validation,
|
|
2784
|
+
identityVerified: sigCheck.identityVerified,
|
|
2785
|
+
publicKeyFingerprint: sigCheck.publicKeyFingerprint
|
|
2786
|
+
};
|
|
2787
|
+
}
|
|
2788
|
+
|
|
2789
|
+
// A2A-52: shared signature verification helper for /invoke and /end
|
|
2790
|
+
function verifySigHeaders(req, validation, endpoint, reqLogger, withTracePayload) {
|
|
2791
|
+
const sigHeader = req.headers['x-a2a-signature'];
|
|
2792
|
+
const pubKeyHeader = req.headers['x-a2a-public-key'];
|
|
2793
|
+
const tsHeader = req.headers['x-a2a-timestamp'];
|
|
2794
|
+
const result = { identityVerified: false, publicKeyFingerprint: null, error: null };
|
|
2795
|
+
|
|
2796
|
+
if (!sigHeader || !pubKeyHeader || !tsHeader) return result;
|
|
2797
|
+
|
|
2798
|
+
if (!isTimestampValid(tsHeader)) {
|
|
2799
|
+
result.error = { status: 403, body: { success: false, error: 'timestamp_expired', message: 'Request timestamp outside allowed window' } };
|
|
2800
|
+
reqLogger.warn('Signature timestamp outside window', { tokenId: validation.id, error_code: 'SIGNATURE_TIMESTAMP_EXPIRED', status_code: 403 });
|
|
2801
|
+
return result;
|
|
2802
|
+
}
|
|
2803
|
+
|
|
2804
|
+
try {
|
|
2805
|
+
crypto.createPublicKey({ key: Buffer.from(pubKeyHeader, 'base64'), format: 'der', type: 'spki' });
|
|
2806
|
+
} catch (_) {
|
|
2807
|
+
result.error = { status: 400, body: { success: false, error: 'malformed_public_key', message: 'X-A2A-Public-Key is not a valid Ed25519 public key' } };
|
|
2808
|
+
reqLogger.warn('Malformed public key', { tokenId: validation.id, error_code: 'MALFORMED_PUBLIC_KEY', status_code: 400 });
|
|
2809
|
+
return result;
|
|
2810
|
+
}
|
|
2811
|
+
|
|
2812
|
+
const existingContact = tokenStore.getContact(validation.id) ||
|
|
2813
|
+
(tokenStore.listContacts().find(c => c.linked_token_id === validation.id));
|
|
2814
|
+
if (existingContact && existingContact.public_key && existingContact.public_key !== pubKeyHeader) {
|
|
2815
|
+
result.error = { status: 403, body: { success: false, error: 'public_key_mismatch', message: 'Public key does not match previously pinned key' } };
|
|
2816
|
+
reqLogger.warn('Public key mismatch (TOFU violation)', { tokenId: validation.id, error_code: 'PUBLIC_KEY_MISMATCH', status_code: 403 });
|
|
2817
|
+
return result;
|
|
2818
|
+
}
|
|
2819
|
+
|
|
2820
|
+
const rawBody = JSON.stringify(req.body);
|
|
2821
|
+
try {
|
|
2822
|
+
const valid = verifySignature({ signature: sigHeader, publicKey: pubKeyHeader, timestamp: tsHeader, method: 'POST', endpoint, body: rawBody });
|
|
2823
|
+
if (valid) {
|
|
2824
|
+
result.identityVerified = true;
|
|
2825
|
+
result.publicKeyFingerprint = fingerprint(pubKeyHeader);
|
|
2826
|
+
if (existingContact && !existingContact.public_key) {
|
|
2827
|
+
tokenStore.updateContact(existingContact.name <span class="branch-0 cbranch-no" title="branch not covered" >|| existingContact.id,</span> { public_key: pubKeyHeader });
|
|
2828
|
+
}
|
|
2829
|
+
} else {
|
|
2830
|
+
result.error = { status: 403, body: { success: false, error: 'invalid_signature', message: 'Ed25519 signature verification failed' } };
|
|
2831
|
+
reqLogger.warn('Signature verification failed', { tokenId: validation.id, error_code: 'SIGNATURE_INVALID', status_code: 403 });
|
|
2832
|
+
}
|
|
2833
|
+
} <span class="branch-0 cbranch-no" title="branch not covered" >catch (sigErr) {</span>
|
|
2834
|
+
<span class="cstat-no" title="statement not covered" > result.error = { status: 403, body: { success: false, error: 'invalid_signature', message: 'Signature verification failed' } };</span>
|
|
2835
|
+
<span class="cstat-no" title="statement not covered" > reqLogger.warn('Signature verification error', { tokenId: validation.id, error_code: 'SIGNATURE_VERIFY_ERROR', status_code: 403, error: sigErr });</span>
|
|
2836
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2837
|
+
return result;
|
|
2838
|
+
}
|
|
2839
|
+
|
|
2840
|
+
// A2A-78: Google A2A ↔ internal format translation
|
|
2841
|
+
function translateGoogleToInternal(body) {
|
|
2842
|
+
const msg = body?.message;
|
|
2843
|
+
if (!msg || !Array.isArray(msg.parts) || msg.parts.length === 0) {
|
|
2844
|
+
return { error: { status: 400, code: 'invalid_message', message: 'message.parts array is required and must not be empty' } };
|
|
2845
|
+
}
|
|
2846
|
+
|
|
2847
|
+
const textParts = [];
|
|
2848
|
+
let skippedNonText = 0;
|
|
2849
|
+
for (const part of msg.parts) {
|
|
2850
|
+
if (part?.content && typeof part.content.text === 'string') {
|
|
2851
|
+
textParts.push(part.content.text);
|
|
2852
|
+
} else {
|
|
2853
|
+
skippedNonText++;
|
|
2854
|
+
}
|
|
2855
|
+
}
|
|
2856
|
+
|
|
2857
|
+
const message = textParts.join('\n');
|
|
2858
|
+
if (!message) {
|
|
2859
|
+
return { error: { status: 400, code: 'no_text_content', message: 'No text content in message parts' } };
|
|
2860
|
+
}
|
|
2861
|
+
|
|
2862
|
+
const config = body.configuration <span class="branch-0 cbranch-no" title="branch not covered" >|| {};</span>
|
|
2863
|
+
const metadata = body.metadata <span class="branch-0 cbranch-no" title="branch not covered" >|| {};</span>
|
|
2864
|
+
|
|
2865
|
+
return {
|
|
2866
|
+
message,
|
|
2867
|
+
conversation_id: msg.context_id || null,
|
|
2868
|
+
caller: {
|
|
2869
|
+
name: String(metadata.caller_name || '').slice(0, 100),
|
|
2870
|
+
owner: String(metadata.caller_owner || '').slice(0, 100),
|
|
2871
|
+
instance: String(metadata.caller_instance || '').slice(0, 200),
|
|
2872
|
+
context: ''
|
|
2873
|
+
},
|
|
2874
|
+
timeout_seconds: Number(config.timeout_seconds) || 60,
|
|
2875
|
+
blocking: config.blocking !== false,
|
|
2876
|
+
skippedNonText
|
|
2877
|
+
};
|
|
2878
|
+
}
|
|
2879
|
+
|
|
2880
|
+
function translateInternalToGoogle(response, conversationId, tier, disclosure, callsRemaining) {
|
|
2881
|
+
const canContinue = response.canContinue !== false;
|
|
2882
|
+
const taskId = `task_${Date.now()}_${crypto.randomBytes(6).toString('hex')}`;
|
|
2883
|
+
const messageId = `resp_${Date.now()}_${crypto.randomBytes(6).toString('hex')}`;
|
|
2884
|
+
|
|
2885
|
+
return {
|
|
2886
|
+
task: {
|
|
2887
|
+
id: taskId,
|
|
2888
|
+
context_id: conversationId,
|
|
2889
|
+
status: {
|
|
2890
|
+
state: canContinue ? 'input-required' : 'completed',
|
|
2891
|
+
message: {
|
|
2892
|
+
message_id: messageId,
|
|
2893
|
+
role: 'agent',
|
|
2894
|
+
parts: [{ content: { text: response.text } }]
|
|
2895
|
+
},
|
|
2896
|
+
timestamp: new Date().toISOString()
|
|
2897
|
+
},
|
|
2898
|
+
metadata: {
|
|
2899
|
+
'openclaw:tier': tier,
|
|
2900
|
+
'openclaw:disclosure': disclosure,
|
|
2901
|
+
'openclaw:calls_remaining': callsRemaining
|
|
2902
|
+
}
|
|
2903
|
+
}
|
|
2904
|
+
};
|
|
2905
|
+
}
|
|
2906
|
+
|
|
2907
|
+
/**
|
|
2908
|
+
* GET /status
|
|
2909
|
+
* Check if A2A is enabled
|
|
2910
|
+
*/
|
|
2911
|
+
router.get('/status', (req, res) => {
|
|
2912
|
+
const activeCalls = monitor ? monitor.getActiveCount() <span class="branch-0 cbranch-no" title="branch not covered" >: 0;</span>
|
|
2913
|
+
const response = {
|
|
2914
|
+
a2a: true,
|
|
2915
|
+
version: require('../../package.json').version,
|
|
2916
|
+
capabilities: ['invoke', 'multi-turn'],
|
|
2917
|
+
rate_limits: limits,
|
|
2918
|
+
active_calls: activeCalls
|
|
2919
|
+
};
|
|
2920
|
+
// A2A-52: include agent public key so contacts can fetch it
|
|
2921
|
+
if (options.publicKey) {
|
|
2922
|
+
response.public_key = options.publicKey;
|
|
2923
|
+
}
|
|
2924
|
+
res.json(response);
|
|
2925
|
+
});
|
|
2926
|
+
|
|
2927
|
+
/**
|
|
2928
|
+
* GET /agent-card
|
|
2929
|
+
* Convenience mirror of /.well-known/a2a-agent-card (A2A-76)
|
|
2930
|
+
*/
|
|
2931
|
+
router.get('/agent-card', (req, res) => {
|
|
2932
|
+
<span class="cstat-no" title="statement not covered" > const { A2AConfig } = require('../lib/config');</span>
|
|
2933
|
+
<span class="cstat-no" title="statement not covered" > const { getTopicsForTier } = require('../lib/disclosure');</span>
|
|
2934
|
+
<span class="cstat-no" title="statement not covered" > const cfg = new A2AConfig();</span>
|
|
2935
|
+
<span class="cstat-no" title="statement not covered" > const agent = cfg.getAgent();</span>
|
|
2936
|
+
<span class="cstat-no" title="statement not covered" > const manifest = getTopicsForTier('public');</span>
|
|
2937
|
+
<span class="cstat-no" title="statement not covered" > const keypair = cfg.getKeypair();</span>
|
|
2938
|
+
<span class="cstat-no" title="statement not covered" > const hostname = (agent && agent.hostname) || process.env.A2A_HOSTNAME || req.headers.host || 'localhost';</span>
|
|
2939
|
+
<span class="cstat-no" title="statement not covered" > const protocol = req.protocol || 'https';</span>
|
|
2940
|
+
<span class="cstat-no" title="statement not covered" > const card = buildAgentCard({</span>
|
|
2941
|
+
<span class="cstat-no" title="statement not covered" > config: agent,</span>
|
|
2942
|
+
<span class="cstat-no" title="statement not covered" > manifest,</span>
|
|
2943
|
+
<span class="cstat-no" title="statement not covered" > publicKey: keypair ? keypair.publicKey : null,</span>
|
|
2944
|
+
<span class="cstat-no" title="statement not covered" > serverUrl: `${protocol}://${hostname}`,</span>
|
|
2945
|
+
<span class="cstat-no" title="statement not covered" > version: require('../../package.json').version</span>
|
|
2946
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2947
|
+
<span class="cstat-no" title="statement not covered" > res.set('Cache-Control', 'public, max-age=3600');</span>
|
|
2948
|
+
<span class="cstat-no" title="statement not covered" > res.json(card);</span>
|
|
2949
|
+
});
|
|
2950
|
+
|
|
2951
|
+
/**
|
|
2952
|
+
* GET /ping
|
|
2953
|
+
* Simple health check
|
|
2954
|
+
*/
|
|
2955
|
+
router.get('/ping', (req, res) => {
|
|
2956
|
+
res.json({ pong: true, timestamp: new Date().toISOString() });
|
|
2957
|
+
});
|
|
2958
|
+
|
|
2959
|
+
/**
|
|
2960
|
+
* POST /message:send
|
|
2961
|
+
* Google A2A protocol inbound endpoint (A2A-78)
|
|
2962
|
+
* Accepts standard A2A wire format and translates to internal invoke.
|
|
2963
|
+
* Registered on both escaped-colon and percent-encoded paths for compatibility.
|
|
2964
|
+
*/
|
|
2965
|
+
async function handleMessageSend(req, res) {
|
|
2966
|
+
const startedAt = Date.now();
|
|
2967
|
+
const traceId = resolveTraceId(req);
|
|
2968
|
+
const requestId = resolveRequestId(req);
|
|
2969
|
+
const reqLogger = logger.child({ traceId, requestId, event: 'message_send' });
|
|
2970
|
+
const withTracePayload = (payload) => ({ ...payload, trace_id: traceId, request_id: requestId });
|
|
2971
|
+
res.set('x-trace-id', traceId);
|
|
2972
|
+
res.set('x-request-id', requestId);
|
|
2973
|
+
reqLogger.info('Received Google A2A message:send request', {
|
|
2974
|
+
data: {
|
|
2975
|
+
ip: req.ip,
|
|
2976
|
+
request_id: requestId,
|
|
2977
|
+
client_host: extractClientHost(req),
|
|
2978
|
+
has_auth_header: Boolean(req.headers.authorization)
|
|
2979
|
+
}
|
|
2980
|
+
});
|
|
2981
|
+
|
|
2982
|
+
// Warn if non-blocking mode requested (not yet supported)
|
|
2983
|
+
const bodyConfig = req.body?.configuration;
|
|
2984
|
+
if (bodyConfig?.blocking === false) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2985
|
+
<span class="cstat-no" title="statement not covered" > reqLogger.warn('Non-blocking mode requested but not supported', {</span>
|
|
2986
|
+
<span class="cstat-no" title="statement not covered" > hint: 'Async task polling is not yet implemented. Request will be processed synchronously.'</span>
|
|
2987
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2988
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2989
|
+
|
|
2990
|
+
// Auth pipeline (shared with /invoke)
|
|
2991
|
+
const auth = await validateInboundAuth(req, res, reqLogger, '/api/a2a/message:send');
|
|
2992
|
+
if (!auth) return;
|
|
2993
|
+
const { validation, identityVerified, publicKeyFingerprint } = auth;
|
|
2994
|
+
|
|
2995
|
+
// Translate Google A2A format to internal
|
|
2996
|
+
const translated = translateGoogleToInternal(req.body);
|
|
2997
|
+
if (translated.error) {
|
|
2998
|
+
reqLogger.warn('Google A2A message validation failed', {
|
|
2999
|
+
tokenId: validation.id,
|
|
3000
|
+
error_code: translated.error.code,
|
|
3001
|
+
status_code: translated.error.status
|
|
3002
|
+
});
|
|
3003
|
+
return res.status(translated.error.status).json(withTracePayload({
|
|
3004
|
+
success: false,
|
|
3005
|
+
error: translated.error.code,
|
|
3006
|
+
message: translated.error.message
|
|
3007
|
+
}));
|
|
3008
|
+
}
|
|
3009
|
+
|
|
3010
|
+
if (translated.skippedNonText > 0) {
|
|
3011
|
+
reqLogger.debug('Skipped non-text parts in Google A2A message', {
|
|
3012
|
+
tokenId: validation.id,
|
|
3013
|
+
data: { skipped_count: translated.skippedNonText }
|
|
3014
|
+
});
|
|
3015
|
+
}
|
|
3016
|
+
|
|
3017
|
+
// Validate message length
|
|
3018
|
+
if (translated.message.length > MAX_MESSAGE_LENGTH) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
3019
|
+
<span class="cstat-no" title="statement not covered" > reqLogger.warn('Google A2A message too long', {</span>
|
|
3020
|
+
<span class="cstat-no" title="statement not covered" > tokenId: validation.id,</span>
|
|
3021
|
+
<span class="cstat-no" title="statement not covered" > error_code: 'REQUEST_INVALID_MESSAGE',</span>
|
|
3022
|
+
<span class="cstat-no" title="statement not covered" > status_code: 400,</span>
|
|
3023
|
+
<span class="cstat-no" title="statement not covered" > data: { message_length: translated.message.length }</span>
|
|
3024
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3025
|
+
<span class="cstat-no" title="statement not covered" > return res.status(400).json(withTracePayload({</span>
|
|
3026
|
+
<span class="cstat-no" title="statement not covered" > success: false,</span>
|
|
3027
|
+
<span class="cstat-no" title="statement not covered" > error: 'invalid_message',</span>
|
|
3028
|
+
<span class="cstat-no" title="statement not covered" > message: `Message must be under ${MAX_MESSAGE_LENGTH} characters`</span>
|
|
3029
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
3030
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3031
|
+
|
|
3032
|
+
const boundedTimeout = Math.max(MIN_TIMEOUT_SECONDS, Math.min(MAX_TIMEOUT_SECONDS, translated.timeout_seconds));
|
|
3033
|
+
|
|
3034
|
+
// Build a2a context (same as /invoke)
|
|
3035
|
+
const isNewConversation = !translated.conversation_id;
|
|
3036
|
+
const conversationId = translated.conversation_id || `conv_${Date.now()}_${crypto.randomBytes(6).toString('hex')}`;
|
|
3037
|
+
const sanitizedCaller = translated.caller;
|
|
3038
|
+
|
|
3039
|
+
const a2aContext = {
|
|
3040
|
+
mode: 'a2a',
|
|
3041
|
+
token_id: validation.id,
|
|
3042
|
+
token_name: validation.name,
|
|
3043
|
+
tier: validation.tier,
|
|
3044
|
+
capabilities: validation.capabilities,
|
|
3045
|
+
allowed_topics: validation.allowed_topics,
|
|
3046
|
+
allowed_goals: validation.allowed_goals,
|
|
3047
|
+
allowed_tools: validation.allowed_tools,
|
|
3048
|
+
timeout_ms: validation.timeout_ms,
|
|
3049
|
+
caller: sanitizedCaller,
|
|
3050
|
+
conversation_id: conversationId,
|
|
3051
|
+
trace_id: traceId,
|
|
3052
|
+
request_id: requestId,
|
|
3053
|
+
identity_verified: identityVerified,
|
|
3054
|
+
public_key_fingerprint: publicKeyFingerprint
|
|
3055
|
+
};
|
|
3056
|
+
|
|
3057
|
+
// Ensure inbound caller exists as a contact
|
|
3058
|
+
let ensuredContact = null;
|
|
3059
|
+
try {
|
|
3060
|
+
ensuredContact = tokenStore.ensureInboundContact(sanitizedCaller, validation.id);
|
|
3061
|
+
} <span class="branch-0 cbranch-no" title="branch not covered" >catch (_) {</span>
|
|
3062
|
+
<span class="cstat-no" title="statement not covered" > ensuredContact = null;</span>
|
|
3063
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3064
|
+
|
|
3065
|
+
// Track conversation if store available
|
|
3066
|
+
if (convStore) {
|
|
3067
|
+
try {
|
|
3068
|
+
convStore.startConversation({
|
|
3069
|
+
id: conversationId,
|
|
3070
|
+
contactId: ensuredContact?.id || validation.id,
|
|
3071
|
+
contactName: ensuredContact?.name || sanitizedCaller.name || validation.name,
|
|
3072
|
+
tokenId: validation.id,
|
|
3073
|
+
direction: 'inbound'
|
|
3074
|
+
});
|
|
3075
|
+
if (isNewConversation && eventStore <span class="branch-0 cbranch-no" title="branch not covered" >&& eventStore.isAvailable <span class="branch-0 cbranch-no" title="branch not covered" ></span>&& eventStore.isAvailable())</span> <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
3076
|
+
<span class="cstat-no" title="statement not covered" > eventStore.emitEvent('call.inbound', {</span>
|
|
3077
|
+
<span class="cstat-no" title="statement not covered" > conversation_id: conversationId,</span>
|
|
3078
|
+
<span class="cstat-no" title="statement not covered" > token_id: validation.id,</span>
|
|
3079
|
+
<span class="cstat-no" title="statement not covered" > caller_name: sanitizedCaller.name || validation.name || null,</span>
|
|
3080
|
+
<span class="cstat-no" title="statement not covered" > caller_owner: sanitizedCaller.owner || null</span>
|
|
3081
|
+
<span class="cstat-no" title="statement not covered" > }, {</span>
|
|
3082
|
+
<span class="cstat-no" title="statement not covered" > conversationId,</span>
|
|
3083
|
+
<span class="cstat-no" title="statement not covered" > contactId: ensuredContact?.id || validation.id</span>
|
|
3084
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3085
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3086
|
+
if (monitor) {
|
|
3087
|
+
monitor.trackActivity(conversationId, {
|
|
3088
|
+
...sanitizedCaller,
|
|
3089
|
+
tier: validation.tier,
|
|
3090
|
+
capabilities: validation.capabilities,
|
|
3091
|
+
allowed_topics: validation.allowed_topics,
|
|
3092
|
+
allowed_goals: validation.allowed_goals,
|
|
3093
|
+
allowed_tools: validation.allowed_tools,
|
|
3094
|
+
trace_id: traceId,
|
|
3095
|
+
request_id: requestId
|
|
3096
|
+
});
|
|
3097
|
+
}
|
|
3098
|
+
convStore.addMessage(conversationId, {
|
|
3099
|
+
direction: 'inbound',
|
|
3100
|
+
role: 'user',
|
|
3101
|
+
content: translated.message
|
|
3102
|
+
});
|
|
3103
|
+
} <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
|
|
3104
|
+
<span class="cstat-no" title="statement not covered" > reqLogger.error('Conversation tracking error', {</span>
|
|
3105
|
+
<span class="cstat-no" title="statement not covered" > conversationId,</span>
|
|
3106
|
+
<span class="cstat-no" title="statement not covered" > tokenId: validation.id,</span>
|
|
3107
|
+
<span class="cstat-no" title="statement not covered" > error_code: 'CONVERSATION_TRACKING_FAILED',</span>
|
|
3108
|
+
<span class="cstat-no" title="statement not covered" > error: err</span>
|
|
3109
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3110
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3111
|
+
}
|
|
3112
|
+
|
|
3113
|
+
try {
|
|
3114
|
+
const response = await handleMessage(translated.message, a2aContext, { timeout: boundedTimeout * 1000 });
|
|
3115
|
+
|
|
3116
|
+
// Store outgoing response
|
|
3117
|
+
if (convStore) {
|
|
3118
|
+
try {
|
|
3119
|
+
convStore.addMessage(conversationId, {
|
|
3120
|
+
direction: 'outbound',
|
|
3121
|
+
role: 'assistant',
|
|
3122
|
+
content: response.text
|
|
3123
|
+
});
|
|
3124
|
+
} <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
|
|
3125
|
+
<span class="cstat-no" title="statement not covered" > reqLogger.error('Message storage error', {</span>
|
|
3126
|
+
<span class="cstat-no" title="statement not covered" > conversationId,</span>
|
|
3127
|
+
<span class="cstat-no" title="statement not covered" > tokenId: validation.id,</span>
|
|
3128
|
+
<span class="cstat-no" title="statement not covered" > error_code: 'CONVERSATION_MESSAGE_STORE_FAILED',</span>
|
|
3129
|
+
<span class="cstat-no" title="statement not covered" > error: err</span>
|
|
3130
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3131
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3132
|
+
}
|
|
3133
|
+
|
|
3134
|
+
// Notify owner if configured
|
|
3135
|
+
if (validation.notify !== 'none') {
|
|
3136
|
+
notifyOwner({
|
|
3137
|
+
level: validation.notify,
|
|
3138
|
+
token: validation,
|
|
3139
|
+
caller: sanitizedCaller,
|
|
3140
|
+
message: translated.message,
|
|
3141
|
+
response: response.text,
|
|
3142
|
+
conversation_id: conversationId,
|
|
3143
|
+
trace_id: traceId,
|
|
3144
|
+
request_id: requestId
|
|
3145
|
+
}).catch(err => {
|
|
3146
|
+
<span class="cstat-no" title="statement not covered" > reqLogger.error('Failed to notify owner', {</span>
|
|
3147
|
+
<span class="cstat-no" title="statement not covered" > conversationId,</span>
|
|
3148
|
+
<span class="cstat-no" title="statement not covered" > tokenId: validation.id,</span>
|
|
3149
|
+
<span class="cstat-no" title="statement not covered" > error_code: 'OWNER_NOTIFY_FAILED',</span>
|
|
3150
|
+
<span class="cstat-no" title="statement not covered" > error: err</span>
|
|
3151
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3152
|
+
});
|
|
3153
|
+
}
|
|
3154
|
+
|
|
3155
|
+
reqLogger.info('Google A2A message:send completed', {
|
|
3156
|
+
conversationId,
|
|
3157
|
+
tokenId: validation.id,
|
|
3158
|
+
data: {
|
|
3159
|
+
duration_ms: Date.now() - startedAt,
|
|
3160
|
+
message_length: translated.message.length,
|
|
3161
|
+
is_new_conversation: isNewConversation
|
|
3162
|
+
}
|
|
3163
|
+
});
|
|
3164
|
+
|
|
3165
|
+
// Translate response to Google A2A Task format
|
|
3166
|
+
const disclosure = validation.disclosure || 'minimal';
|
|
3167
|
+
const googleResponse = translateInternalToGoogle(
|
|
3168
|
+
response, conversationId, validation.tier, disclosure, validation.calls_remaining
|
|
3169
|
+
);
|
|
3170
|
+
res.json(googleResponse);
|
|
3171
|
+
|
|
3172
|
+
} <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
|
|
3173
|
+
<span class="cstat-no" title="statement not covered" > reqLogger.error('Message handling error', {</span>
|
|
3174
|
+
<span class="cstat-no" title="statement not covered" > conversationId,</span>
|
|
3175
|
+
<span class="cstat-no" title="statement not covered" > tokenId: validation.id,</span>
|
|
3176
|
+
<span class="cstat-no" title="statement not covered" > error_code: 'MESSAGE_SEND_HANDLER_FAILED',</span>
|
|
3177
|
+
<span class="cstat-no" title="statement not covered" > status_code: 500,</span>
|
|
3178
|
+
<span class="cstat-no" title="statement not covered" > error: err,</span>
|
|
3179
|
+
<span class="cstat-no" title="statement not covered" > data: { duration_ms: Date.now() - startedAt }</span>
|
|
3180
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3181
|
+
<span class="cstat-no" title="statement not covered" > res.status(500).json(withTracePayload({</span>
|
|
3182
|
+
<span class="cstat-no" title="statement not covered" > success: false,</span>
|
|
3183
|
+
<span class="cstat-no" title="statement not covered" > error: 'internal_error',</span>
|
|
3184
|
+
<span class="cstat-no" title="statement not covered" > message: 'Failed to process message'</span>
|
|
3185
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
3186
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3187
|
+
}
|
|
3188
|
+
router.post('/message\\:send', handleMessageSend);
|
|
3189
|
+
router.post('/message%3Asend', handleMessageSend);
|
|
3190
|
+
|
|
3191
|
+
/**
|
|
3192
|
+
* POST /invoke
|
|
3193
|
+
* Call the agent
|
|
3194
|
+
*/
|
|
3195
|
+
router.post('/invoke', async (req, res) => {
|
|
3196
|
+
const startedAt = Date.now();
|
|
3197
|
+
const traceId = resolveTraceId(req);
|
|
3198
|
+
const requestId = resolveRequestId(req);
|
|
3199
|
+
const reqLogger = logger.child({ traceId, requestId, event: 'invoke' });
|
|
3200
|
+
const withTracePayload = (payload) => ({ ...payload, trace_id: traceId, request_id: requestId });
|
|
3201
|
+
res.set('x-trace-id', traceId);
|
|
3202
|
+
res.set('x-request-id', requestId);
|
|
3203
|
+
reqLogger.info('Received invoke request', {
|
|
3204
|
+
data: {
|
|
3205
|
+
ip: req.ip,
|
|
3206
|
+
request_id: requestId,
|
|
3207
|
+
client_host: extractClientHost(req),
|
|
3208
|
+
forwarded_for: req.headers['x-forwarded-for'] || null,
|
|
3209
|
+
user_agent: req.headers['user-agent'] || null,
|
|
3210
|
+
has_auth_header: Boolean(req.headers.authorization)
|
|
3211
|
+
}
|
|
3212
|
+
});
|
|
3213
|
+
reqLogger.debug('Invoke request metadata', {
|
|
3214
|
+
event: 'invoke_request_metadata',
|
|
3215
|
+
data: normalizeRequestMetadata(req)
|
|
3216
|
+
});
|
|
3217
|
+
|
|
3218
|
+
// Auth pipeline (shared with /message:send)
|
|
3219
|
+
const auth = await validateInboundAuth(req, res, reqLogger, '/api/a2a/invoke');
|
|
3220
|
+
if (!auth) return;
|
|
3221
|
+
const { validation, identityVerified, publicKeyFingerprint } = auth;
|
|
3222
|
+
|
|
3223
|
+
// Extract and validate request
|
|
3224
|
+
const { message, conversation_id, caller, context, timeout_seconds = 60 } = req.body;
|
|
3225
|
+
|
|
3226
|
+
if (!message) {
|
|
3227
|
+
reqLogger.warn('Invoke request missing message', {
|
|
3228
|
+
tokenId: validation.id,
|
|
3229
|
+
error_code: 'REQUEST_MISSING_MESSAGE',
|
|
3230
|
+
status_code: 400,
|
|
3231
|
+
hint: 'Include a non-empty string field `message` in the request body.'
|
|
3232
|
+
});
|
|
3233
|
+
return res.status(400).json(withTracePayload({
|
|
3234
|
+
success: false,
|
|
3235
|
+
error: 'missing_message',
|
|
3236
|
+
message: 'Message is required'
|
|
3237
|
+
}));
|
|
3238
|
+
}
|
|
3239
|
+
|
|
3240
|
+
// Validate message length
|
|
3241
|
+
if (typeof message !== 'string' || message.length > MAX_MESSAGE_LENGTH) {
|
|
3242
|
+
reqLogger.warn('Invoke request has invalid message payload', {
|
|
3243
|
+
tokenId: validation.id,
|
|
3244
|
+
error_code: 'REQUEST_INVALID_MESSAGE',
|
|
3245
|
+
status_code: 400,
|
|
3246
|
+
hint: `Ensure message is a string <= ${MAX_MESSAGE_LENGTH} characters.`,
|
|
3247
|
+
data: {
|
|
3248
|
+
message_type: typeof message,
|
|
3249
|
+
message_length: typeof message === 'string' ? message.length : null
|
|
3250
|
+
}
|
|
3251
|
+
});
|
|
3252
|
+
return res.status(400).json(withTracePayload({
|
|
3253
|
+
success: false,
|
|
3254
|
+
error: 'invalid_message',
|
|
3255
|
+
message: `Message must be a string under ${MAX_MESSAGE_LENGTH} characters`
|
|
3256
|
+
}));
|
|
3257
|
+
}
|
|
3258
|
+
|
|
3259
|
+
// Validate and bound timeout
|
|
3260
|
+
const boundedTimeout = Math.max(MIN_TIMEOUT_SECONDS, Math.min(MAX_TIMEOUT_SECONDS, Number(timeout_seconds) || 60));
|
|
3261
|
+
|
|
3262
|
+
// Sanitize caller data (only allow expected fields)
|
|
3263
|
+
const sanitizedCaller = caller ? {
|
|
3264
|
+
name: String(caller.name <span class="branch-0 cbranch-no" title="branch not covered" >|| '')</span>.slice(0, 100),
|
|
3265
|
+
owner: String(caller.owner || '').slice(0, 100),
|
|
3266
|
+
instance: String(caller.instance || '').slice(0, 200),
|
|
3267
|
+
context: String(caller.context || '').slice(0, 500)
|
|
3268
|
+
} : {};
|
|
3269
|
+
|
|
3270
|
+
// Build a2a context with secure conversation ID
|
|
3271
|
+
const isNewConversation = !conversation_id;
|
|
3272
|
+
const a2aContext = {
|
|
3273
|
+
mode: 'a2a',
|
|
3274
|
+
token_id: validation.id,
|
|
3275
|
+
token_name: validation.name,
|
|
3276
|
+
tier: validation.tier,
|
|
3277
|
+
capabilities: validation.capabilities,
|
|
3278
|
+
allowed_topics: validation.allowed_topics,
|
|
3279
|
+
allowed_goals: validation.allowed_goals,
|
|
3280
|
+
allowed_tools: validation.allowed_tools,
|
|
3281
|
+
timeout_ms: validation.timeout_ms,
|
|
3282
|
+
caller: sanitizedCaller,
|
|
3283
|
+
conversation_id: conversation_id || `conv_${Date.now()}_${crypto.randomBytes(6).toString('hex')}`,
|
|
3284
|
+
trace_id: traceId,
|
|
3285
|
+
request_id: requestId,
|
|
3286
|
+
// A2A-52: cryptographic identity verification status
|
|
3287
|
+
identity_verified: identityVerified,
|
|
3288
|
+
public_key_fingerprint: publicKeyFingerprint
|
|
3289
|
+
};
|
|
3290
|
+
|
|
3291
|
+
// Ensure inbound caller exists as a contact (best-effort).
|
|
3292
|
+
let ensuredContact = null;
|
|
3293
|
+
try {
|
|
3294
|
+
ensuredContact = tokenStore.ensureInboundContact(sanitizedCaller, validation.id);
|
|
3295
|
+
} <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
|
|
3296
|
+
<span class="cstat-no" title="statement not covered" > ensuredContact = null;</span>
|
|
3297
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3298
|
+
|
|
3299
|
+
// Track conversation if store available
|
|
3300
|
+
if (convStore) {
|
|
3301
|
+
try {
|
|
3302
|
+
convStore.startConversation({
|
|
3303
|
+
id: a2aContext.conversation_id,
|
|
3304
|
+
// Standardize: store the local contact.id when available (fallback to token id otherwise).
|
|
3305
|
+
contactId: ensuredContact?.id || validation.id,
|
|
3306
|
+
contactName: ensuredContact?.name || sanitizedCaller.name || validation.name,
|
|
3307
|
+
tokenId: validation.id,
|
|
3308
|
+
direction: 'inbound'
|
|
3309
|
+
});
|
|
3310
|
+
if (isNewConversation && eventStore <span class="branch-0 cbranch-no" title="branch not covered" >&& eventStore.isAvailable <span class="branch-0 cbranch-no" title="branch not covered" ></span>&& eventStore.isAvailable())</span> <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
3311
|
+
<span class="cstat-no" title="statement not covered" > eventStore.emitEvent('call.inbound', {</span>
|
|
3312
|
+
<span class="cstat-no" title="statement not covered" > conversation_id: a2aContext.conversation_id,</span>
|
|
3313
|
+
<span class="cstat-no" title="statement not covered" > token_id: validation.id,</span>
|
|
3314
|
+
<span class="cstat-no" title="statement not covered" > caller_name: sanitizedCaller.name || validation.name || null,</span>
|
|
3315
|
+
<span class="cstat-no" title="statement not covered" > caller_owner: sanitizedCaller.owner || null</span>
|
|
3316
|
+
<span class="cstat-no" title="statement not covered" > }, {</span>
|
|
3317
|
+
<span class="cstat-no" title="statement not covered" > conversationId: a2aContext.conversation_id,</span>
|
|
3318
|
+
<span class="cstat-no" title="statement not covered" > contactId: ensuredContact?.id || validation.id</span>
|
|
3319
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3320
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3321
|
+
|
|
3322
|
+
// Track activity for auto-conclude
|
|
3323
|
+
if (monitor) {
|
|
3324
|
+
monitor.trackActivity(a2aContext.conversation_id, {
|
|
3325
|
+
...sanitizedCaller,
|
|
3326
|
+
tier: validation.tier,
|
|
3327
|
+
capabilities: validation.capabilities,
|
|
3328
|
+
allowed_topics: validation.allowed_topics,
|
|
3329
|
+
allowed_goals: validation.allowed_goals,
|
|
3330
|
+
allowed_tools: validation.allowed_tools,
|
|
3331
|
+
trace_id: traceId,
|
|
3332
|
+
request_id: requestId
|
|
3333
|
+
});
|
|
3334
|
+
}
|
|
3335
|
+
|
|
3336
|
+
// Store incoming message
|
|
3337
|
+
convStore.addMessage(a2aContext.conversation_id, {
|
|
3338
|
+
direction: 'inbound',
|
|
3339
|
+
role: 'user',
|
|
3340
|
+
content: message
|
|
3341
|
+
});
|
|
3342
|
+
} <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
|
|
3343
|
+
<span class="cstat-no" title="statement not covered" > reqLogger.error('Conversation tracking error', {</span>
|
|
3344
|
+
<span class="cstat-no" title="statement not covered" > conversationId: a2aContext.conversation_id,</span>
|
|
3345
|
+
<span class="cstat-no" title="statement not covered" > tokenId: validation.id,</span>
|
|
3346
|
+
<span class="cstat-no" title="statement not covered" > error_code: 'CONVERSATION_TRACKING_FAILED',</span>
|
|
3347
|
+
<span class="cstat-no" title="statement not covered" > hint: 'Check SQLite conversation DB file permissions and schema availability.',</span>
|
|
3348
|
+
<span class="cstat-no" title="statement not covered" > error: err,</span>
|
|
3349
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
3350
|
+
<span class="cstat-no" title="statement not covered" > phase: 'conversation_tracking'</span>
|
|
3351
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3352
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3353
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3354
|
+
}
|
|
3355
|
+
|
|
3356
|
+
try {
|
|
3357
|
+
// Handle the message
|
|
3358
|
+
const response = await handleMessage(message, a2aContext, { timeout: boundedTimeout * 1000 });
|
|
3359
|
+
|
|
3360
|
+
// Store outgoing response
|
|
3361
|
+
if (convStore) {
|
|
3362
|
+
try {
|
|
3363
|
+
convStore.addMessage(a2aContext.conversation_id, {
|
|
3364
|
+
direction: 'outbound',
|
|
3365
|
+
role: 'assistant',
|
|
3366
|
+
content: response.text
|
|
3367
|
+
});
|
|
3368
|
+
} catch (err) {
|
|
3369
|
+
reqLogger.error('Message storage error', {
|
|
3370
|
+
conversationId: a2aContext.conversation_id,
|
|
3371
|
+
tokenId: validation.id,
|
|
3372
|
+
error_code: 'CONVERSATION_MESSAGE_STORE_FAILED',
|
|
3373
|
+
hint: 'Check SQLite conversation DB write access and disk availability.',
|
|
3374
|
+
error: err,
|
|
3375
|
+
data: {
|
|
3376
|
+
phase: 'message_store'
|
|
3377
|
+
}
|
|
3378
|
+
});
|
|
3379
|
+
}
|
|
3380
|
+
}
|
|
3381
|
+
|
|
3382
|
+
// Notify owner if configured
|
|
3383
|
+
if (validation.notify !== 'none') {
|
|
3384
|
+
notifyOwner({
|
|
3385
|
+
level: validation.notify,
|
|
3386
|
+
token: validation,
|
|
3387
|
+
caller,
|
|
3388
|
+
context,
|
|
3389
|
+
message,
|
|
3390
|
+
response: response.text,
|
|
3391
|
+
conversation_id: a2aContext.conversation_id,
|
|
3392
|
+
trace_id: traceId,
|
|
3393
|
+
request_id: requestId
|
|
3394
|
+
}).catch(err => {
|
|
3395
|
+
<span class="cstat-no" title="statement not covered" > reqLogger.error('Failed to notify owner', {</span>
|
|
3396
|
+
<span class="cstat-no" title="statement not covered" > conversationId: a2aContext.conversation_id,</span>
|
|
3397
|
+
<span class="cstat-no" title="statement not covered" > tokenId: validation.id,</span>
|
|
3398
|
+
<span class="cstat-no" title="statement not covered" > error_code: 'OWNER_NOTIFY_FAILED',</span>
|
|
3399
|
+
<span class="cstat-no" title="statement not covered" > hint: 'Verify runtime notify channel settings and external notifier health.',</span>
|
|
3400
|
+
<span class="cstat-no" title="statement not covered" > error: err,</span>
|
|
3401
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
3402
|
+
<span class="cstat-no" title="statement not covered" > phase: 'owner_notify'</span>
|
|
3403
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3404
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3405
|
+
});
|
|
3406
|
+
}
|
|
3407
|
+
|
|
3408
|
+
reqLogger.info('Invoke request completed', {
|
|
3409
|
+
conversationId: a2aContext.conversation_id,
|
|
3410
|
+
tokenId: validation.id,
|
|
3411
|
+
requestId,
|
|
3412
|
+
data: {
|
|
3413
|
+
duration_ms: Date.now() - startedAt,
|
|
3414
|
+
message_length: message.length,
|
|
3415
|
+
is_new_conversation: isNewConversation
|
|
3416
|
+
}
|
|
3417
|
+
});
|
|
3418
|
+
|
|
3419
|
+
const responsePayload = {
|
|
3420
|
+
success: true,
|
|
3421
|
+
trace_id: traceId,
|
|
3422
|
+
request_id: requestId,
|
|
3423
|
+
conversation_id: a2aContext.conversation_id,
|
|
3424
|
+
response: response.text,
|
|
3425
|
+
can_continue: response.canContinue !== false,
|
|
3426
|
+
tokens_remaining: validation.calls_remaining
|
|
3427
|
+
};
|
|
3428
|
+
|
|
3429
|
+
if (response.collaboration) {
|
|
3430
|
+
responsePayload.collaboration = response.collaboration;
|
|
3431
|
+
}
|
|
3432
|
+
|
|
3433
|
+
res.json(responsePayload);
|
|
3434
|
+
|
|
3435
|
+
} catch (err) {
|
|
3436
|
+
reqLogger.error('Message handling error', {
|
|
3437
|
+
conversationId: a2aContext.conversation_id,
|
|
3438
|
+
tokenId: validation.id,
|
|
3439
|
+
error_code: 'INVOKE_HANDLER_FAILED',
|
|
3440
|
+
status_code: 500,
|
|
3441
|
+
hint: 'Inspect handler/runtime logs in this trace and validate upstream dependencies.',
|
|
3442
|
+
error: err,
|
|
3443
|
+
data: {
|
|
3444
|
+
duration_ms: Date.now() - startedAt
|
|
3445
|
+
}
|
|
3446
|
+
});
|
|
3447
|
+
res.status(500).json(withTracePayload({
|
|
3448
|
+
success: false,
|
|
3449
|
+
error: 'internal_error',
|
|
3450
|
+
message: 'Failed to process message'
|
|
3451
|
+
}));
|
|
3452
|
+
}
|
|
3453
|
+
});
|
|
3454
|
+
|
|
3455
|
+
/**
|
|
3456
|
+
* POST /end
|
|
3457
|
+
* End a conversation and trigger summary generation
|
|
3458
|
+
*/
|
|
3459
|
+
router.post('/end', async (req, res) => {
|
|
3460
|
+
const startedAt = Date.now();
|
|
3461
|
+
const traceId = resolveTraceId(req);
|
|
3462
|
+
const requestId = resolveRequestId(req);
|
|
3463
|
+
const reqLogger = logger.child({ traceId, requestId, event: 'end' });
|
|
3464
|
+
const withTracePayload = (payload) => ({ ...payload, trace_id: traceId, request_id: requestId });
|
|
3465
|
+
res.set('x-trace-id', traceId);
|
|
3466
|
+
res.set('x-request-id', requestId);
|
|
3467
|
+
reqLogger.info('Received end request', {
|
|
3468
|
+
data: {
|
|
3469
|
+
request_id: requestId,
|
|
3470
|
+
ip: req.ip,
|
|
3471
|
+
client_host: extractClientHost(req),
|
|
3472
|
+
has_auth_header: Boolean(req.headers.authorization),
|
|
3473
|
+
has_conversation_id: Boolean(req.body && req.body.conversation_id)
|
|
3474
|
+
}
|
|
3475
|
+
});
|
|
3476
|
+
|
|
3477
|
+
// Extract token
|
|
3478
|
+
const authHeader = req.headers.authorization;
|
|
3479
|
+
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
3480
|
+
reqLogger.warn('End request missing bearer token', {
|
|
3481
|
+
error_code: 'AUTH_MISSING_BEARER',
|
|
3482
|
+
status_code: 401,
|
|
3483
|
+
hint: 'Send Authorization: Bearer <a2a_token>.'
|
|
3484
|
+
});
|
|
3485
|
+
return res.status(401).json(withTracePayload({
|
|
3486
|
+
success: false,
|
|
3487
|
+
error: 'unauthorized',
|
|
3488
|
+
message: 'Authorization header required'
|
|
3489
|
+
}));
|
|
3490
|
+
}
|
|
3491
|
+
|
|
3492
|
+
const token = authHeader.slice(7);
|
|
3493
|
+
const validation = tokenStore.validate(token);
|
|
3494
|
+
if (!validation.valid) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
3495
|
+
<span class="cstat-no" title="statement not covered" > reqLogger.warn('End request token validation failed', {</span>
|
|
3496
|
+
<span class="cstat-no" title="statement not covered" > error_code: 'TOKEN_INVALID_OR_EXPIRED',</span>
|
|
3497
|
+
<span class="cstat-no" title="statement not covered" > status_code: 401,</span>
|
|
3498
|
+
<span class="cstat-no" title="statement not covered" > hint: 'Use a currently valid invite token for conversation end calls.'</span>
|
|
3499
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3500
|
+
<span class="cstat-no" title="statement not covered" > return res.status(401).json(withTracePayload({ </span>
|
|
3501
|
+
<span class="cstat-no" title="statement not covered" > success: false, </span>
|
|
3502
|
+
<span class="cstat-no" title="statement not covered" > error: 'unauthorized', </span>
|
|
3503
|
+
<span class="cstat-no" title="statement not covered" > message: 'Invalid or expired token'</span>
|
|
3504
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
3505
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3506
|
+
|
|
3507
|
+
// A2A-52: Ed25519 signature verification for /end (same as /invoke)
|
|
3508
|
+
const endSigCheck = verifySigHeaders(req, validation, '/api/a2a/end', reqLogger, withTracePayload);
|
|
3509
|
+
if (endSigCheck.error) {
|
|
3510
|
+
return res.status(endSigCheck.error.status).json(withTracePayload(endSigCheck.error.body));
|
|
3511
|
+
}
|
|
3512
|
+
|
|
3513
|
+
const { conversation_id } = req.body;
|
|
3514
|
+
if (!conversation_id) {
|
|
3515
|
+
reqLogger.warn('End request missing conversation_id', {
|
|
3516
|
+
tokenId: validation.id,
|
|
3517
|
+
error_code: 'REQUEST_MISSING_CONVERSATION_ID',
|
|
3518
|
+
status_code: 400,
|
|
3519
|
+
hint: 'Provide `conversation_id` returned from /invoke.'
|
|
3520
|
+
});
|
|
3521
|
+
return res.status(400).json(withTracePayload({
|
|
3522
|
+
success: false,
|
|
3523
|
+
error: 'missing_conversation_id',
|
|
3524
|
+
message: 'conversation_id is required'
|
|
3525
|
+
}));
|
|
3526
|
+
}
|
|
3527
|
+
|
|
3528
|
+
const convStore = getConversationStore({
|
|
3529
|
+
eventStore,
|
|
3530
|
+
configDir: tokenStore.configDir
|
|
3531
|
+
});
|
|
3532
|
+
if (!convStore) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
3533
|
+
<span class="cstat-no" title="statement not covered" > return res.json(withTracePayload({ success: true, message: 'Conversation storage not enabled' }));</span>
|
|
3534
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3535
|
+
|
|
3536
|
+
try {
|
|
3537
|
+
// Conclude with summarizer if available
|
|
3538
|
+
const summarizer = options.summarizer <span class="branch-0 cbranch-no" title="branch not covered" >|| null;</span>
|
|
3539
|
+
const ownerContext = options.ownerContext || {};
|
|
3540
|
+
|
|
3541
|
+
const result = await convStore.concludeConversation(conversation_id, {
|
|
3542
|
+
summarizer,
|
|
3543
|
+
ownerContext
|
|
3544
|
+
});
|
|
3545
|
+
|
|
3546
|
+
// Notify owner of conversation conclusion
|
|
3547
|
+
if (validation.notify !== 'none' && result.success) {
|
|
3548
|
+
const conv = convStore.getConversationContext(conversation_id);
|
|
3549
|
+
notifyOwner({
|
|
3550
|
+
level: validation.notify,
|
|
3551
|
+
type: 'conversation_concluded',
|
|
3552
|
+
token: validation,
|
|
3553
|
+
conversation: conv,
|
|
3554
|
+
trace_id: traceId,
|
|
3555
|
+
request_id: requestId
|
|
3556
|
+
}).catch(err => {
|
|
3557
|
+
<span class="cstat-no" title="statement not covered" > reqLogger.error('Failed to notify owner after conversation end', {</span>
|
|
3558
|
+
<span class="cstat-no" title="statement not covered" > conversationId: conversation_id,</span>
|
|
3559
|
+
<span class="cstat-no" title="statement not covered" > tokenId: validation.id,</span>
|
|
3560
|
+
<span class="cstat-no" title="statement not covered" > error_code: 'OWNER_NOTIFY_FAILED',</span>
|
|
3561
|
+
<span class="cstat-no" title="statement not covered" > hint: 'Verify notify runtime integration for post-conclusion notifications.',</span>
|
|
3562
|
+
<span class="cstat-no" title="statement not covered" > error: err,</span>
|
|
3563
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
3564
|
+
<span class="cstat-no" title="statement not covered" > phase: 'conversation_end_notify'</span>
|
|
3565
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3566
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3567
|
+
});
|
|
3568
|
+
}
|
|
3569
|
+
|
|
3570
|
+
reqLogger.info('End request completed', {
|
|
3571
|
+
conversationId: conversation_id,
|
|
3572
|
+
tokenId: validation.id,
|
|
3573
|
+
requestId,
|
|
3574
|
+
data: {
|
|
3575
|
+
duration_ms: Date.now() - startedAt,
|
|
3576
|
+
status: result.success ? 'concluded' <span class="branch-0 cbranch-no" title="branch not covered" >: 'unchanged'</span>
|
|
3577
|
+
}
|
|
3578
|
+
});
|
|
3579
|
+
|
|
3580
|
+
res.json({
|
|
3581
|
+
success: true,
|
|
3582
|
+
trace_id: traceId,
|
|
3583
|
+
request_id: requestId,
|
|
3584
|
+
conversation_id,
|
|
3585
|
+
status: 'concluded',
|
|
3586
|
+
summary: result.summary
|
|
3587
|
+
});
|
|
3588
|
+
} <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
|
|
3589
|
+
<span class="cstat-no" title="statement not covered" > reqLogger.error('End conversation error', {</span>
|
|
3590
|
+
<span class="cstat-no" title="statement not covered" > conversationId: conversation_id,</span>
|
|
3591
|
+
<span class="cstat-no" title="statement not covered" > tokenId: validation.id,</span>
|
|
3592
|
+
<span class="cstat-no" title="statement not covered" > error_code: 'END_CONVERSATION_FAILED',</span>
|
|
3593
|
+
<span class="cstat-no" title="statement not covered" > status_code: 500,</span>
|
|
3594
|
+
<span class="cstat-no" title="statement not covered" > hint: 'Check conversation existence and summarizer runtime status for this trace.',</span>
|
|
3595
|
+
<span class="cstat-no" title="statement not covered" > error: err,</span>
|
|
3596
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
3597
|
+
<span class="cstat-no" title="statement not covered" > duration_ms: Date.now() - startedAt</span>
|
|
3598
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3599
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3600
|
+
<span class="cstat-no" title="statement not covered" > res.status(500).json(withTracePayload({</span>
|
|
3601
|
+
<span class="cstat-no" title="statement not covered" > success: false,</span>
|
|
3602
|
+
<span class="cstat-no" title="statement not covered" > error: 'internal_error',</span>
|
|
3603
|
+
<span class="cstat-no" title="statement not covered" > message: 'Failed to end conversation'</span>
|
|
3604
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
3605
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3606
|
+
});
|
|
3607
|
+
|
|
3608
|
+
/**
|
|
3609
|
+
* GET /conversations
|
|
3610
|
+
* List conversations (requires auth)
|
|
3611
|
+
* This is for the agent owner, not remote callers
|
|
3612
|
+
*/
|
|
3613
|
+
router.get('/conversations', (req, res) => {
|
|
3614
|
+
<span class="cstat-no" title="statement not covered" > // This endpoint should be protected by local auth, not A2A tokens</span>
|
|
3615
|
+
<span class="cstat-no" title="statement not covered" > // For now, require an admin token or local access</span>
|
|
3616
|
+
<span class="cstat-no" title="statement not covered" > const expected = process.env.A2A_ADMIN_TOKEN;</span>
|
|
3617
|
+
<span class="cstat-no" title="statement not covered" > const adminToken = req.headers['x-admin-token'];</span>
|
|
3618
|
+
<span class="cstat-no" title="statement not covered" > if (!isDirectLocalRequest(req)) {</span>
|
|
3619
|
+
<span class="cstat-no" title="statement not covered" > if (!expected) {</span>
|
|
3620
|
+
<span class="cstat-no" title="statement not covered" > return res.status(401).json({</span>
|
|
3621
|
+
<span class="cstat-no" title="statement not covered" > error: 'admin_token_required',</span>
|
|
3622
|
+
<span class="cstat-no" title="statement not covered" > message: 'Set A2A_ADMIN_TOKEN to access conversation admin routes from non-local addresses'</span>
|
|
3623
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3624
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3625
|
+
<span class="cstat-no" title="statement not covered" > if (!timingSafeTokenEqual(adminToken, expected)) {</span>
|
|
3626
|
+
<span class="cstat-no" title="statement not covered" > return res.status(401).json({ error: 'unauthorized' });</span>
|
|
3627
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3628
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3629
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3630
|
+
<span class="cstat-no" title="statement not covered" > const convStore = getConversationStore();</span>
|
|
3631
|
+
<span class="cstat-no" title="statement not covered" > if (!convStore) {</span>
|
|
3632
|
+
<span class="cstat-no" title="statement not covered" > return res.json({ conversations: [], message: 'Conversation storage not enabled' });</span>
|
|
3633
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3634
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3635
|
+
<span class="cstat-no" title="statement not covered" > const { contact_id, status, limit = 20 } = req.query;</span>
|
|
3636
|
+
<span class="cstat-no" title="statement not covered" > </span>
|
|
3637
|
+
<span class="cstat-no" title="statement not covered" > const conversations = convStore.listConversations({</span>
|
|
3638
|
+
<span class="cstat-no" title="statement not covered" > contactId: contact_id,</span>
|
|
3639
|
+
<span class="cstat-no" title="statement not covered" > status,</span>
|
|
3640
|
+
<span class="cstat-no" title="statement not covered" > limit: Math.min(100, Math.max(1, Number.parseInt(String(limit), 10) || 20)),</span>
|
|
3641
|
+
<span class="cstat-no" title="statement not covered" > includeMessages: false</span>
|
|
3642
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3643
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3644
|
+
<span class="cstat-no" title="statement not covered" > res.json({ conversations });</span>
|
|
3645
|
+
});
|
|
3646
|
+
|
|
3647
|
+
/**
|
|
3648
|
+
* GET /conversations/:id
|
|
3649
|
+
* Get conversation details with context
|
|
3650
|
+
*/
|
|
3651
|
+
router.get('/conversations/:id', (req, res) => {
|
|
3652
|
+
<span class="cstat-no" title="statement not covered" > const expected = process.env.A2A_ADMIN_TOKEN;</span>
|
|
3653
|
+
<span class="cstat-no" title="statement not covered" > const adminToken = req.headers['x-admin-token'];</span>
|
|
3654
|
+
<span class="cstat-no" title="statement not covered" > if (!isDirectLocalRequest(req)) {</span>
|
|
3655
|
+
<span class="cstat-no" title="statement not covered" > if (!expected) {</span>
|
|
3656
|
+
<span class="cstat-no" title="statement not covered" > return res.status(401).json({</span>
|
|
3657
|
+
<span class="cstat-no" title="statement not covered" > error: 'admin_token_required',</span>
|
|
3658
|
+
<span class="cstat-no" title="statement not covered" > message: 'Set A2A_ADMIN_TOKEN to access conversation admin routes from non-local addresses'</span>
|
|
3659
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3660
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3661
|
+
<span class="cstat-no" title="statement not covered" > if (!timingSafeTokenEqual(adminToken, expected)) {</span>
|
|
3662
|
+
<span class="cstat-no" title="statement not covered" > return res.status(401).json({ error: 'unauthorized' });</span>
|
|
3663
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3664
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3665
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3666
|
+
<span class="cstat-no" title="statement not covered" > const convStore = getConversationStore();</span>
|
|
3667
|
+
<span class="cstat-no" title="statement not covered" > if (!convStore) {</span>
|
|
3668
|
+
<span class="cstat-no" title="statement not covered" > return res.status(404).json({ error: 'conversation_storage_disabled' });</span>
|
|
3669
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3670
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3671
|
+
<span class="cstat-no" title="statement not covered" > const { recent_messages = 10 } = req.query;</span>
|
|
3672
|
+
<span class="cstat-no" title="statement not covered" > const context = convStore.getConversationContext(</span>
|
|
3673
|
+
<span class="cstat-no" title="statement not covered" > req.params.id,</span>
|
|
3674
|
+
<span class="cstat-no" title="statement not covered" > Math.min(50, Math.max(1, Number.parseInt(String(recent_messages), 10) || 10))</span>
|
|
3675
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
3676
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3677
|
+
<span class="cstat-no" title="statement not covered" > if (!context) {</span>
|
|
3678
|
+
<span class="cstat-no" title="statement not covered" > return res.status(404).json({ error: 'conversation_not_found' });</span>
|
|
3679
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3680
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3681
|
+
<span class="cstat-no" title="statement not covered" > res.json(context);</span>
|
|
3682
|
+
});
|
|
3683
|
+
|
|
3684
|
+
return router;
|
|
3685
|
+
}
|
|
3686
|
+
|
|
3687
|
+
/**
|
|
3688
|
+
* Default message handler (placeholder)
|
|
3689
|
+
*/
|
|
3690
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function defaultMessageHandler(message, context, options) {</span></span>
|
|
3691
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
3692
|
+
<span class="cstat-no" title="statement not covered" > text: `[A2A Active] Received message from ${context.caller?.name || 'unknown'}. Agent integration pending.`,</span>
|
|
3693
|
+
<span class="cstat-no" title="statement not covered" > canContinue: true</span>
|
|
3694
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
3695
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
3696
|
+
|
|
3697
|
+
module.exports = {
|
|
3698
|
+
createRoutes,
|
|
3699
|
+
checkRateLimit,
|
|
3700
|
+
timingSafeTokenEqual,
|
|
3701
|
+
// Exposed for testing only
|
|
3702
|
+
_rateLimits: rateLimits,
|
|
3703
|
+
_RATE_LIMIT_MAX_ENTRIES: RATE_LIMIT_MAX_ENTRIES
|
|
3704
|
+
};
|
|
3705
|
+
</pre></td></tr></table></pre>
|
|
3706
|
+
|
|
3707
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
3708
|
+
</div><!-- /wrapper -->
|
|
3709
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
3710
|
+
Code coverage generated by
|
|
3711
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
3712
|
+
at 2026-03-03T22:25:10.857Z
|
|
3713
|
+
</div>
|
|
3714
|
+
<script src="../../prettify.js"></script>
|
|
3715
|
+
<script>
|
|
3716
|
+
window.onload = function () {
|
|
3717
|
+
prettyPrint();
|
|
3718
|
+
};
|
|
3719
|
+
</script>
|
|
3720
|
+
<script src="../../sorter.js"></script>
|
|
3721
|
+
<script src="../../block-navigation.js"></script>
|
|
3722
|
+
</body>
|
|
3723
|
+
</html>
|
|
3724
|
+
|