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,2173 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/lib/claude-subagent.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/lib</a> claude-subagent.js</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">87.21% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>607/696</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">67.28% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>72/107</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">94.44% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>17/18</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">87.21% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>607/696</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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">4x</span>
|
|
763
|
+
<span class="cline-any cline-yes">4x</span>
|
|
764
|
+
<span class="cline-any cline-yes">4x</span>
|
|
765
|
+
<span class="cline-any cline-yes">4x</span>
|
|
766
|
+
<span class="cline-any cline-yes">4x</span>
|
|
767
|
+
<span class="cline-any cline-yes">4x</span>
|
|
768
|
+
<span class="cline-any cline-yes">4x</span>
|
|
769
|
+
<span class="cline-any cline-yes">4x</span>
|
|
770
|
+
<span class="cline-any cline-yes">4x</span>
|
|
771
|
+
<span class="cline-any cline-yes">4x</span>
|
|
772
|
+
<span class="cline-any cline-yes">4x</span>
|
|
773
|
+
<span class="cline-any cline-yes">4x</span>
|
|
774
|
+
<span class="cline-any cline-yes">4x</span>
|
|
775
|
+
<span class="cline-any cline-yes">4x</span>
|
|
776
|
+
<span class="cline-any cline-yes">4x</span>
|
|
777
|
+
<span class="cline-any cline-yes">4x</span>
|
|
778
|
+
<span class="cline-any cline-yes">4x</span>
|
|
779
|
+
<span class="cline-any cline-yes">4x</span>
|
|
780
|
+
<span class="cline-any cline-yes">4x</span>
|
|
781
|
+
<span class="cline-any cline-yes">4x</span>
|
|
782
|
+
<span class="cline-any cline-yes">4x</span>
|
|
783
|
+
<span class="cline-any cline-yes">4x</span>
|
|
784
|
+
<span class="cline-any cline-yes">4x</span>
|
|
785
|
+
<span class="cline-any cline-yes">4x</span>
|
|
786
|
+
<span class="cline-any cline-yes">4x</span>
|
|
787
|
+
<span class="cline-any cline-yes">4x</span>
|
|
788
|
+
<span class="cline-any cline-yes">4x</span>
|
|
789
|
+
<span class="cline-any cline-yes">4x</span>
|
|
790
|
+
<span class="cline-any cline-yes">4x</span>
|
|
791
|
+
<span class="cline-any cline-yes">4x</span>
|
|
792
|
+
<span class="cline-any cline-yes">4x</span>
|
|
793
|
+
<span class="cline-any cline-yes">4x</span>
|
|
794
|
+
<span class="cline-any cline-yes">4x</span>
|
|
795
|
+
<span class="cline-any cline-yes">4x</span>
|
|
796
|
+
<span class="cline-any cline-yes">4x</span>
|
|
797
|
+
<span class="cline-any cline-yes">4x</span>
|
|
798
|
+
<span class="cline-any cline-yes">4x</span>
|
|
799
|
+
<span class="cline-any cline-yes">4x</span>
|
|
800
|
+
<span class="cline-any cline-yes">6x</span>
|
|
801
|
+
<span class="cline-any cline-yes">6x</span>
|
|
802
|
+
<span class="cline-any cline-yes">6x</span>
|
|
803
|
+
<span class="cline-any cline-yes">6x</span>
|
|
804
|
+
<span class="cline-any cline-yes">4x</span>
|
|
805
|
+
<span class="cline-any cline-yes">17x</span>
|
|
806
|
+
<span class="cline-any cline-yes">17x</span>
|
|
807
|
+
<span class="cline-any cline-yes">17x</span>
|
|
808
|
+
<span class="cline-any cline-yes">17x</span>
|
|
809
|
+
<span class="cline-any cline-yes">17x</span>
|
|
810
|
+
<span class="cline-any cline-yes">6x</span>
|
|
811
|
+
<span class="cline-any cline-yes">6x</span>
|
|
812
|
+
<span class="cline-any cline-yes">6x</span>
|
|
813
|
+
<span class="cline-any cline-yes">6x</span>
|
|
814
|
+
<span class="cline-any cline-yes">6x</span>
|
|
815
|
+
<span class="cline-any cline-yes">17x</span>
|
|
816
|
+
<span class="cline-any cline-yes">17x</span>
|
|
817
|
+
<span class="cline-any cline-yes">4x</span>
|
|
818
|
+
<span class="cline-any cline-yes">18x</span>
|
|
819
|
+
<span class="cline-any cline-yes">18x</span>
|
|
820
|
+
<span class="cline-any cline-yes">18x</span>
|
|
821
|
+
<span class="cline-any cline-yes">18x</span>
|
|
822
|
+
<span class="cline-any cline-yes">4x</span>
|
|
823
|
+
<span class="cline-any cline-yes">4x</span>
|
|
824
|
+
<span class="cline-any cline-yes">4x</span>
|
|
825
|
+
<span class="cline-any cline-yes">4x</span>
|
|
826
|
+
<span class="cline-any cline-yes">1x</span>
|
|
827
|
+
<span class="cline-any cline-yes">1x</span>
|
|
828
|
+
<span class="cline-any cline-yes">1x</span>
|
|
829
|
+
<span class="cline-any cline-yes">1x</span>
|
|
830
|
+
<span class="cline-any cline-yes">1x</span>
|
|
831
|
+
<span class="cline-any cline-yes">1x</span>
|
|
832
|
+
<span class="cline-any cline-yes">1x</span>
|
|
833
|
+
<span class="cline-any cline-yes">1x</span>
|
|
834
|
+
<span class="cline-any cline-yes">4x</span>
|
|
835
|
+
<span class="cline-any cline-yes">4x</span>
|
|
836
|
+
<span class="cline-any cline-yes">4x</span>
|
|
837
|
+
<span class="cline-any cline-yes">4x</span>
|
|
838
|
+
<span class="cline-any cline-yes">4x</span>
|
|
839
|
+
<span class="cline-any cline-yes">4x</span>
|
|
840
|
+
<span class="cline-any cline-yes">4x</span>
|
|
841
|
+
<span class="cline-any cline-yes">4x</span>
|
|
842
|
+
<span class="cline-any cline-yes">4x</span>
|
|
843
|
+
<span class="cline-any cline-yes">4x</span>
|
|
844
|
+
<span class="cline-any cline-yes">4x</span>
|
|
845
|
+
<span class="cline-any cline-yes">4x</span>
|
|
846
|
+
<span class="cline-any cline-yes">4x</span>
|
|
847
|
+
<span class="cline-any cline-yes">4x</span>
|
|
848
|
+
<span class="cline-any cline-yes">4x</span>
|
|
849
|
+
<span class="cline-any cline-yes">4x</span>
|
|
850
|
+
<span class="cline-any cline-yes">4x</span>
|
|
851
|
+
<span class="cline-any cline-yes">4x</span>
|
|
852
|
+
<span class="cline-any cline-yes">4x</span>
|
|
853
|
+
<span class="cline-any cline-yes">9x</span>
|
|
854
|
+
<span class="cline-any cline-yes">9x</span>
|
|
855
|
+
<span class="cline-any cline-yes">9x</span>
|
|
856
|
+
<span class="cline-any cline-yes">9x</span>
|
|
857
|
+
<span class="cline-any cline-yes">9x</span>
|
|
858
|
+
<span class="cline-any cline-yes">9x</span>
|
|
859
|
+
<span class="cline-any cline-yes">9x</span>
|
|
860
|
+
<span class="cline-any cline-yes">9x</span>
|
|
861
|
+
<span class="cline-any cline-yes">9x</span>
|
|
862
|
+
<span class="cline-any cline-yes">9x</span>
|
|
863
|
+
<span class="cline-any cline-yes">9x</span>
|
|
864
|
+
<span class="cline-any cline-yes">9x</span>
|
|
865
|
+
<span class="cline-any cline-yes">9x</span>
|
|
866
|
+
<span class="cline-any cline-yes">9x</span>
|
|
867
|
+
<span class="cline-any cline-yes">9x</span>
|
|
868
|
+
<span class="cline-any cline-yes">9x</span>
|
|
869
|
+
<span class="cline-any cline-yes">9x</span>
|
|
870
|
+
<span class="cline-any cline-yes">9x</span>
|
|
871
|
+
<span class="cline-any cline-yes">9x</span>
|
|
872
|
+
<span class="cline-any cline-yes">9x</span>
|
|
873
|
+
<span class="cline-any cline-yes">9x</span>
|
|
874
|
+
<span class="cline-any cline-yes">9x</span>
|
|
875
|
+
<span class="cline-any cline-yes">9x</span>
|
|
876
|
+
<span class="cline-any cline-yes">9x</span>
|
|
877
|
+
<span class="cline-any cline-yes">9x</span>
|
|
878
|
+
<span class="cline-any cline-yes">9x</span>
|
|
879
|
+
<span class="cline-any cline-yes">9x</span>
|
|
880
|
+
<span class="cline-any cline-yes">9x</span>
|
|
881
|
+
<span class="cline-any cline-yes">9x</span>
|
|
882
|
+
<span class="cline-any cline-yes">9x</span>
|
|
883
|
+
<span class="cline-any cline-yes">9x</span>
|
|
884
|
+
<span class="cline-any cline-yes">9x</span>
|
|
885
|
+
<span class="cline-any cline-yes">9x</span>
|
|
886
|
+
<span class="cline-any cline-yes">9x</span>
|
|
887
|
+
<span class="cline-any cline-yes">9x</span>
|
|
888
|
+
<span class="cline-any cline-yes">9x</span>
|
|
889
|
+
<span class="cline-any cline-yes">9x</span>
|
|
890
|
+
<span class="cline-any cline-yes">9x</span>
|
|
891
|
+
<span class="cline-any cline-yes">9x</span>
|
|
892
|
+
<span class="cline-any cline-yes">9x</span>
|
|
893
|
+
<span class="cline-any cline-yes">9x</span>
|
|
894
|
+
<span class="cline-any cline-yes">9x</span>
|
|
895
|
+
<span class="cline-any cline-yes">9x</span>
|
|
896
|
+
<span class="cline-any cline-yes">9x</span>
|
|
897
|
+
<span class="cline-any cline-yes">9x</span>
|
|
898
|
+
<span class="cline-any cline-yes">9x</span>
|
|
899
|
+
<span class="cline-any cline-yes">9x</span>
|
|
900
|
+
<span class="cline-any cline-yes">9x</span>
|
|
901
|
+
<span class="cline-any cline-yes">9x</span>
|
|
902
|
+
<span class="cline-any cline-yes">9x</span>
|
|
903
|
+
<span class="cline-any cline-yes">9x</span>
|
|
904
|
+
<span class="cline-any cline-yes">9x</span>
|
|
905
|
+
<span class="cline-any cline-yes">9x</span>
|
|
906
|
+
<span class="cline-any cline-yes">9x</span>
|
|
907
|
+
<span class="cline-any cline-yes">9x</span>
|
|
908
|
+
<span class="cline-any cline-yes">9x</span>
|
|
909
|
+
<span class="cline-any cline-yes">9x</span>
|
|
910
|
+
<span class="cline-any cline-yes">9x</span>
|
|
911
|
+
<span class="cline-any cline-yes">9x</span>
|
|
912
|
+
<span class="cline-any cline-yes">9x</span>
|
|
913
|
+
<span class="cline-any cline-yes">9x</span>
|
|
914
|
+
<span class="cline-any cline-yes">9x</span>
|
|
915
|
+
<span class="cline-any cline-yes">9x</span>
|
|
916
|
+
<span class="cline-any cline-yes">9x</span>
|
|
917
|
+
<span class="cline-any cline-yes">9x</span>
|
|
918
|
+
<span class="cline-any cline-yes">9x</span>
|
|
919
|
+
<span class="cline-any cline-yes">9x</span>
|
|
920
|
+
<span class="cline-any cline-yes">9x</span>
|
|
921
|
+
<span class="cline-any cline-yes">9x</span>
|
|
922
|
+
<span class="cline-any cline-yes">9x</span>
|
|
923
|
+
<span class="cline-any cline-yes">9x</span>
|
|
924
|
+
<span class="cline-any cline-yes">9x</span>
|
|
925
|
+
<span class="cline-any cline-yes">9x</span>
|
|
926
|
+
<span class="cline-any cline-yes">9x</span>
|
|
927
|
+
<span class="cline-any cline-yes">9x</span>
|
|
928
|
+
<span class="cline-any cline-yes">9x</span>
|
|
929
|
+
<span class="cline-any cline-yes">9x</span>
|
|
930
|
+
<span class="cline-any cline-yes">9x</span>
|
|
931
|
+
<span class="cline-any cline-yes">9x</span>
|
|
932
|
+
<span class="cline-any cline-yes">9x</span>
|
|
933
|
+
<span class="cline-any cline-yes">9x</span>
|
|
934
|
+
<span class="cline-any cline-yes">9x</span>
|
|
935
|
+
<span class="cline-any cline-yes">9x</span>
|
|
936
|
+
<span class="cline-any cline-yes">9x</span>
|
|
937
|
+
<span class="cline-any cline-yes">9x</span>
|
|
938
|
+
<span class="cline-any cline-yes">9x</span>
|
|
939
|
+
<span class="cline-any cline-yes">9x</span>
|
|
940
|
+
<span class="cline-any cline-yes">9x</span>
|
|
941
|
+
<span class="cline-any cline-yes">9x</span>
|
|
942
|
+
<span class="cline-any cline-yes">9x</span>
|
|
943
|
+
<span class="cline-any cline-yes">9x</span>
|
|
944
|
+
<span class="cline-any cline-yes">9x</span>
|
|
945
|
+
<span class="cline-any cline-yes">9x</span>
|
|
946
|
+
<span class="cline-any cline-yes">9x</span>
|
|
947
|
+
<span class="cline-any cline-yes">9x</span>
|
|
948
|
+
<span class="cline-any cline-yes">9x</span>
|
|
949
|
+
<span class="cline-any cline-yes">9x</span>
|
|
950
|
+
<span class="cline-any cline-yes">9x</span>
|
|
951
|
+
<span class="cline-any cline-yes">9x</span>
|
|
952
|
+
<span class="cline-any cline-yes">9x</span>
|
|
953
|
+
<span class="cline-any cline-yes">9x</span>
|
|
954
|
+
<span class="cline-any cline-yes">9x</span>
|
|
955
|
+
<span class="cline-any cline-yes">9x</span>
|
|
956
|
+
<span class="cline-any cline-yes">9x</span>
|
|
957
|
+
<span class="cline-any cline-yes">9x</span>
|
|
958
|
+
<span class="cline-any cline-yes">9x</span>
|
|
959
|
+
<span class="cline-any cline-yes">9x</span>
|
|
960
|
+
<span class="cline-any cline-yes">9x</span>
|
|
961
|
+
<span class="cline-any cline-yes">9x</span>
|
|
962
|
+
<span class="cline-any cline-yes">4x</span>
|
|
963
|
+
<span class="cline-any cline-yes">4x</span>
|
|
964
|
+
<span class="cline-any cline-yes">4x</span>
|
|
965
|
+
<span class="cline-any cline-yes">4x</span>
|
|
966
|
+
<span class="cline-any cline-yes">2x</span>
|
|
967
|
+
<span class="cline-any cline-yes">2x</span>
|
|
968
|
+
<span class="cline-any cline-yes">2x</span>
|
|
969
|
+
<span class="cline-any cline-yes">2x</span>
|
|
970
|
+
<span class="cline-any cline-yes">2x</span>
|
|
971
|
+
<span class="cline-any cline-yes">2x</span>
|
|
972
|
+
<span class="cline-any cline-yes">2x</span>
|
|
973
|
+
<span class="cline-any cline-yes">2x</span>
|
|
974
|
+
<span class="cline-any cline-yes">2x</span>
|
|
975
|
+
<span class="cline-any cline-yes">2x</span>
|
|
976
|
+
<span class="cline-any cline-yes">2x</span>
|
|
977
|
+
<span class="cline-any cline-yes">2x</span>
|
|
978
|
+
<span class="cline-any cline-yes">2x</span>
|
|
979
|
+
<span class="cline-any cline-yes">2x</span>
|
|
980
|
+
<span class="cline-any cline-yes">2x</span>
|
|
981
|
+
<span class="cline-any cline-yes">2x</span>
|
|
982
|
+
<span class="cline-any cline-yes">2x</span>
|
|
983
|
+
<span class="cline-any cline-yes">2x</span>
|
|
984
|
+
<span class="cline-any cline-yes">2x</span>
|
|
985
|
+
<span class="cline-any cline-yes">2x</span>
|
|
986
|
+
<span class="cline-any cline-yes">2x</span>
|
|
987
|
+
<span class="cline-any cline-yes">2x</span>
|
|
988
|
+
<span class="cline-any cline-yes">2x</span>
|
|
989
|
+
<span class="cline-any cline-yes">2x</span>
|
|
990
|
+
<span class="cline-any cline-yes">2x</span>
|
|
991
|
+
<span class="cline-any cline-yes">2x</span>
|
|
992
|
+
<span class="cline-any cline-yes">4x</span>
|
|
993
|
+
<span class="cline-any cline-yes">4x</span>
|
|
994
|
+
<span class="cline-any cline-yes">4x</span>
|
|
995
|
+
<span class="cline-any cline-yes">4x</span>
|
|
996
|
+
<span class="cline-any cline-yes">4x</span>
|
|
997
|
+
<span class="cline-any cline-yes">4x</span>
|
|
998
|
+
<span class="cline-any cline-yes">4x</span>
|
|
999
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1000
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1001
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1002
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1003
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1004
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1005
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1006
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1007
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1008
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1009
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1010
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1011
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1012
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1013
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1014
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1015
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1016
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1017
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1018
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1019
|
+
<span class="cline-any cline-no"> </span>
|
|
1020
|
+
<span class="cline-any cline-no"> </span>
|
|
1021
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1022
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1023
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1024
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1025
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1026
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1027
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1028
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1029
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1030
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1031
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1032
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1033
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1034
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1035
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1036
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1037
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1038
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1039
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1040
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1041
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1042
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1043
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1044
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1045
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1046
|
+
<span class="cline-any cline-no"> </span>
|
|
1047
|
+
<span class="cline-any cline-no"> </span>
|
|
1048
|
+
<span class="cline-any cline-no"> </span>
|
|
1049
|
+
<span class="cline-any cline-no"> </span>
|
|
1050
|
+
<span class="cline-any cline-no"> </span>
|
|
1051
|
+
<span class="cline-any cline-no"> </span>
|
|
1052
|
+
<span class="cline-any cline-no"> </span>
|
|
1053
|
+
<span class="cline-any cline-no"> </span>
|
|
1054
|
+
<span class="cline-any cline-no"> </span>
|
|
1055
|
+
<span class="cline-any cline-no"> </span>
|
|
1056
|
+
<span class="cline-any cline-no"> </span>
|
|
1057
|
+
<span class="cline-any cline-no"> </span>
|
|
1058
|
+
<span class="cline-any cline-no"> </span>
|
|
1059
|
+
<span class="cline-any cline-no"> </span>
|
|
1060
|
+
<span class="cline-any cline-no"> </span>
|
|
1061
|
+
<span class="cline-any cline-no"> </span>
|
|
1062
|
+
<span class="cline-any cline-no"> </span>
|
|
1063
|
+
<span class="cline-any cline-no"> </span>
|
|
1064
|
+
<span class="cline-any cline-no"> </span>
|
|
1065
|
+
<span class="cline-any cline-no"> </span>
|
|
1066
|
+
<span class="cline-any cline-no"> </span>
|
|
1067
|
+
<span class="cline-any cline-no"> </span>
|
|
1068
|
+
<span class="cline-any cline-no"> </span>
|
|
1069
|
+
<span class="cline-any cline-no"> </span>
|
|
1070
|
+
<span class="cline-any cline-no"> </span>
|
|
1071
|
+
<span class="cline-any cline-no"> </span>
|
|
1072
|
+
<span class="cline-any cline-no"> </span>
|
|
1073
|
+
<span class="cline-any cline-no"> </span>
|
|
1074
|
+
<span class="cline-any cline-no"> </span>
|
|
1075
|
+
<span class="cline-any cline-no"> </span>
|
|
1076
|
+
<span class="cline-any cline-no"> </span>
|
|
1077
|
+
<span class="cline-any cline-no"> </span>
|
|
1078
|
+
<span class="cline-any cline-no"> </span>
|
|
1079
|
+
<span class="cline-any cline-no"> </span>
|
|
1080
|
+
<span class="cline-any cline-no"> </span>
|
|
1081
|
+
<span class="cline-any cline-no"> </span>
|
|
1082
|
+
<span class="cline-any cline-no"> </span>
|
|
1083
|
+
<span class="cline-any cline-no"> </span>
|
|
1084
|
+
<span class="cline-any cline-no"> </span>
|
|
1085
|
+
<span class="cline-any cline-no"> </span>
|
|
1086
|
+
<span class="cline-any cline-no"> </span>
|
|
1087
|
+
<span class="cline-any cline-no"> </span>
|
|
1088
|
+
<span class="cline-any cline-no"> </span>
|
|
1089
|
+
<span class="cline-any cline-no"> </span>
|
|
1090
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1091
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1092
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1093
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1094
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1095
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1096
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1097
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1098
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1099
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1100
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1101
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1102
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1103
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1104
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1105
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1106
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1107
|
+
<span class="cline-any cline-no"> </span>
|
|
1108
|
+
<span class="cline-any cline-no"> </span>
|
|
1109
|
+
<span class="cline-any cline-no"> </span>
|
|
1110
|
+
<span class="cline-any cline-no"> </span>
|
|
1111
|
+
<span class="cline-any cline-no"> </span>
|
|
1112
|
+
<span class="cline-any cline-no"> </span>
|
|
1113
|
+
<span class="cline-any cline-no"> </span>
|
|
1114
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1115
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1116
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1117
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1118
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1119
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1120
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1121
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1122
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1123
|
+
<span class="cline-any cline-yes">39x</span>
|
|
1124
|
+
<span class="cline-any cline-yes">39x</span>
|
|
1125
|
+
<span class="cline-any cline-yes">39x</span>
|
|
1126
|
+
<span class="cline-any cline-yes">39x</span>
|
|
1127
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1128
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1129
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1130
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1131
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1132
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1133
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1134
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1135
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1136
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1137
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1138
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1139
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1140
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1141
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1142
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1143
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1144
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1145
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1146
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1147
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1148
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1149
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1150
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1151
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1152
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1153
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1154
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1155
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1156
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1157
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1158
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1159
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1160
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1161
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1162
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1163
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1164
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1165
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1166
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1167
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1168
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1169
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1170
|
+
<span class="cline-any cline-no"> </span>
|
|
1171
|
+
<span class="cline-any cline-no"> </span>
|
|
1172
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1173
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1174
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1175
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1176
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1177
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1178
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1179
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1180
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1181
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1182
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1183
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1184
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1185
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1186
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1187
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1188
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1189
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1190
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1191
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1192
|
+
<span class="cline-any cline-no"> </span>
|
|
1193
|
+
<span class="cline-any cline-no"> </span>
|
|
1194
|
+
<span class="cline-any cline-no"> </span>
|
|
1195
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1196
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1197
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1198
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1199
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1200
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1201
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1202
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1203
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1204
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1205
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1206
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1207
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1208
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1209
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1210
|
+
<span class="cline-any cline-no"> </span>
|
|
1211
|
+
<span class="cline-any cline-no"> </span>
|
|
1212
|
+
<span class="cline-any cline-no"> </span>
|
|
1213
|
+
<span class="cline-any cline-no"> </span>
|
|
1214
|
+
<span class="cline-any cline-no"> </span>
|
|
1215
|
+
<span class="cline-any cline-no"> </span>
|
|
1216
|
+
<span class="cline-any cline-no"> </span>
|
|
1217
|
+
<span class="cline-any cline-no"> </span>
|
|
1218
|
+
<span class="cline-any cline-no"> </span>
|
|
1219
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1220
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1221
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1222
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1223
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1224
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1225
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1226
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1227
|
+
<span class="cline-any cline-no"> </span>
|
|
1228
|
+
<span class="cline-any cline-no"> </span>
|
|
1229
|
+
<span class="cline-any cline-no"> </span>
|
|
1230
|
+
<span class="cline-any cline-no"> </span>
|
|
1231
|
+
<span class="cline-any cline-no"> </span>
|
|
1232
|
+
<span class="cline-any cline-no"> </span>
|
|
1233
|
+
<span class="cline-any cline-no"> </span>
|
|
1234
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1235
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1236
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1237
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1238
|
+
<span class="cline-any cline-no"> </span>
|
|
1239
|
+
<span class="cline-any cline-no"> </span>
|
|
1240
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1241
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1242
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1243
|
+
<span class="cline-any cline-no"> </span>
|
|
1244
|
+
<span class="cline-any cline-no"> </span>
|
|
1245
|
+
<span class="cline-any cline-no"> </span>
|
|
1246
|
+
<span class="cline-any cline-no"> </span>
|
|
1247
|
+
<span class="cline-any cline-no"> </span>
|
|
1248
|
+
<span class="cline-any cline-no"> </span>
|
|
1249
|
+
<span class="cline-any cline-no"> </span>
|
|
1250
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1251
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1252
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1253
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1254
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1255
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1256
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1257
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1258
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1259
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1260
|
+
<span class="cline-any cline-no"> </span>
|
|
1261
|
+
<span class="cline-any cline-no"> </span>
|
|
1262
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1263
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1264
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1265
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1266
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1267
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1268
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1269
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1270
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1271
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1272
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1273
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1274
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1275
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1276
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1277
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1278
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1279
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1280
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1281
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1282
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1283
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1284
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1285
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1286
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1287
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1288
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1289
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1290
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1291
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1292
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1293
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1294
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1295
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1296
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1297
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1298
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1299
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1300
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1301
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1302
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1303
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1304
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1305
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1306
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1307
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1308
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1309
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1310
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1311
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1312
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1313
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1314
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1315
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1316
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1317
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1318
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1319
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1320
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1321
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1322
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1323
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1324
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1325
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1326
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1327
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1328
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1329
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1330
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1331
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1332
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1333
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1334
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1335
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1336
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1337
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1338
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1339
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1340
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1341
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1342
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1343
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1344
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1345
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1346
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1347
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1348
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1349
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1350
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1351
|
+
<span class="cline-any cline-yes">1x</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">1x</span>
|
|
1355
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1356
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1357
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1358
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1359
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1360
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1361
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1362
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1363
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1364
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1365
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1366
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1367
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1368
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1369
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1370
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1371
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1372
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1373
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1374
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1375
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1376
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1377
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1378
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1379
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1380
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1381
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1382
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1383
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1384
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1385
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1386
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1387
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1388
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1389
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1390
|
+
<span class="cline-any cline-no"> </span>
|
|
1391
|
+
<span class="cline-any cline-no"> </span>
|
|
1392
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1393
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1394
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1395
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1396
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1397
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1398
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1399
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1400
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1401
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1402
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1403
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1404
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1405
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1406
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1407
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1408
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1409
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1410
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1411
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1412
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1413
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1414
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1415
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1416
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1417
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1418
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1419
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1420
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1421
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1422
|
+
<span class="cline-any cline-yes">1x</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">1x</span>
|
|
1426
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1427
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1428
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1429
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1430
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1431
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1432
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1433
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1434
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1435
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1436
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1437
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1438
|
+
<span class="cline-any cline-no"> </span>
|
|
1439
|
+
<span class="cline-any cline-no"> </span>
|
|
1440
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1441
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1442
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1443
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1444
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1445
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1446
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1447
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1448
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1449
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1450
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1451
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1452
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1453
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1454
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1455
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1456
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1457
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1458
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/**
|
|
1459
|
+
* Claude Subagent — Lifecycle management for Claude CLI subagent sessions.
|
|
1460
|
+
*
|
|
1461
|
+
* Spawns `claude` CLI processes for real LLM-powered A2A conversations
|
|
1462
|
+
* as an alternative to OpenClaw for A2A conversations.
|
|
1463
|
+
*
|
|
1464
|
+
* Design decision (A2A-29):
|
|
1465
|
+
* We intentionally run Claude turns in stateless one-shot mode instead of `--resume`.
|
|
1466
|
+
* In production we observed intermittent hangs during nested Claude startup/restore.
|
|
1467
|
+
* Stateless calls cost more tokens but are operationally safer under load.
|
|
1468
|
+
*
|
|
1469
|
+
* Permissioning is still enforced:
|
|
1470
|
+
* `--allowedTools` is derived per request from token capabilities + allowed topics
|
|
1471
|
+
* and can be further constrained by per-tier `allowed_tools` policy from onboarding.
|
|
1472
|
+
*/
|
|
1473
|
+
|
|
1474
|
+
const { execSync, spawn } = require('child_process');
|
|
1475
|
+
const { createLogger } = require('./logger');
|
|
1476
|
+
const { HARD_FALLBACK_TURN_TIMEOUT_MS } = require('./turn-timeout');
|
|
1477
|
+
|
|
1478
|
+
const logger = createLogger({ component: 'a2a.claude-subagent' });
|
|
1479
|
+
|
|
1480
|
+
const A2A_RESPONSE_REGEX = /<a2a_response>\s*([\s\S]*?)\s*<\/a2a_response>/i;
|
|
1481
|
+
const DEFAULT_CLAUDE_MODEL = 'claude-sonnet-4-5-20250929';
|
|
1482
|
+
const CLAUDE_TOOL_UNIVERSE = ['Bash', 'Bash(readonly)', 'Read', 'Grep', 'Glob', 'WebSearch', 'WebFetch'];
|
|
1483
|
+
const LEGACY_DEFAULT_TOOLS = ['Bash(readonly)', 'Read', 'Grep', 'Glob', 'WebSearch', 'WebFetch'];
|
|
1484
|
+
|
|
1485
|
+
const TOOL_NAME_MAP = {
|
|
1486
|
+
bash: 'Bash',
|
|
1487
|
+
'bash(readonly)': 'Bash(readonly)',
|
|
1488
|
+
'bash-readonly': 'Bash(readonly)',
|
|
1489
|
+
read: 'Read',
|
|
1490
|
+
grep: 'Grep',
|
|
1491
|
+
glob: 'Glob',
|
|
1492
|
+
websearch: 'WebSearch',
|
|
1493
|
+
webfetch: 'WebFetch'
|
|
1494
|
+
};
|
|
1495
|
+
|
|
1496
|
+
function normalizeToolName(value) {
|
|
1497
|
+
const key = String(value <span class="branch-0 cbranch-no" title="branch not covered" >|| '')</span>.trim().toLowerCase();
|
|
1498
|
+
return TOOL_NAME_MAP[key] <span class="branch-0 cbranch-no" title="branch not covered" >|| null;</span>
|
|
1499
|
+
}
|
|
1500
|
+
|
|
1501
|
+
function sanitizeAllowedToolList(values) {
|
|
1502
|
+
if (!Array.isArray(values)) <span class="branch-0 cbranch-no" title="branch not covered" >return [];</span>
|
|
1503
|
+
const out = [];
|
|
1504
|
+
const seen = new Set();
|
|
1505
|
+
for (const value of values) {
|
|
1506
|
+
const canonical = normalizeToolName(value);
|
|
1507
|
+
if (!canonical || seen.has(canonical)) <span class="branch-0 cbranch-no" title="branch not covered" >continue;</span>
|
|
1508
|
+
seen.add(canonical);
|
|
1509
|
+
out.push(canonical);
|
|
1510
|
+
}
|
|
1511
|
+
return out;
|
|
1512
|
+
}
|
|
1513
|
+
|
|
1514
|
+
function formatToolListForPrompt(tools) {
|
|
1515
|
+
if (!Array.isArray(tools) || tools.length === 0) <span class="branch-0 cbranch-no" title="branch not covered" >return ' (none)';</span>
|
|
1516
|
+
return tools.map(tool => ` - ${tool}`).join('\n');
|
|
1517
|
+
}
|
|
1518
|
+
|
|
1519
|
+
/**
|
|
1520
|
+
* Check if `claude` CLI is available in PATH.
|
|
1521
|
+
*/
|
|
1522
|
+
function isClaudeAvailable() {
|
|
1523
|
+
try {
|
|
1524
|
+
execSync('command -v claude', { stdio: 'ignore' });
|
|
1525
|
+
return true;
|
|
1526
|
+
} catch {
|
|
1527
|
+
return false;
|
|
1528
|
+
}
|
|
1529
|
+
}
|
|
1530
|
+
|
|
1531
|
+
/**
|
|
1532
|
+
* Build the system prompt for the Claude subagent.
|
|
1533
|
+
*
|
|
1534
|
+
* @param {Object} config
|
|
1535
|
+
* @param {string} config.agentName
|
|
1536
|
+
* @param {string} config.ownerName
|
|
1537
|
+
* @param {string} config.otherAgentName
|
|
1538
|
+
* @param {string} config.otherOwnerName
|
|
1539
|
+
* @param {string} config.accessTier
|
|
1540
|
+
* @param {string} config.tierTopics - formatted topics string
|
|
1541
|
+
* @param {string} config.tierObjectives - formatted objectives string
|
|
1542
|
+
* @param {string} config.doNotDiscuss - formatted do_not_discuss string
|
|
1543
|
+
* @param {string} config.neverDisclose - formatted never_disclose string
|
|
1544
|
+
* @param {string[]} [config.allowedTools] - Effective tool allowlist for this call
|
|
1545
|
+
* @param {string} config.personalityNotes
|
|
1546
|
+
* @param {string} config.roleContext
|
|
1547
|
+
* @returns {string}
|
|
1548
|
+
*/
|
|
1549
|
+
function buildSubagentSystemPrompt(config) {
|
|
1550
|
+
const {
|
|
1551
|
+
agentName = 'Agent',
|
|
1552
|
+
ownerName = 'the owner',
|
|
1553
|
+
otherAgentName = 'Remote Agent',
|
|
1554
|
+
otherOwnerName = 'their owner',
|
|
1555
|
+
accessTier = 'public',
|
|
1556
|
+
tierTopics = ' (none specified)',
|
|
1557
|
+
tierObjectives = ' (none specified)',
|
|
1558
|
+
doNotDiscuss = ' (none specified)',
|
|
1559
|
+
neverDisclose = ' (none specified)',
|
|
1560
|
+
allowedTools = [],
|
|
1561
|
+
personalityNotes = '',
|
|
1562
|
+
roleContext = ''
|
|
1563
|
+
} = config;
|
|
1564
|
+
|
|
1565
|
+
const effectiveAllowedTools = sanitizeAllowedToolList(allowedTools);
|
|
1566
|
+
const allowedForPrompt = effectiveAllowedTools.length > 0
|
|
1567
|
+
? effectiveAllowedTools
|
|
1568
|
+
: [...LEGACY_DEFAULT_TOOLS];
|
|
1569
|
+
const blockedTools = CLAUDE_TOOL_UNIVERSE.filter(tool => !allowedForPrompt.includes(tool));
|
|
1570
|
+
|
|
1571
|
+
return `You are ${agentName}, the personal AI agent for ${ownerName}.
|
|
1572
|
+
You are on a live A2A (agent-to-agent) call with ${otherAgentName}, who represents ${otherOwnerName}. ${roleContext}
|
|
1573
|
+
|
|
1574
|
+
== OUTPUT FORMAT ==
|
|
1575
|
+
|
|
1576
|
+
After your conversational reply, you MUST append exactly one structured response block:
|
|
1577
|
+
|
|
1578
|
+
<a2a_response>
|
|
1579
|
+
{"message":"Your conversational reply here","statePatch":{"phase":"explore","overlapScore":0.3,"activeThreads":["thread1"],"candidateCollaborations":["idea1"],"closeSignal":false,"confidence":0.4},"flags":[]}
|
|
1580
|
+
</a2a_response>
|
|
1581
|
+
|
|
1582
|
+
Rules for the response block:
|
|
1583
|
+
- "message" (required): Your full conversational reply text. This is what the other agent sees.
|
|
1584
|
+
- "statePatch" (optional): Collaboration state update with any of: phase, overlapScore (0-1), activeThreads (max 4), candidateCollaborations (max 4), closeSignal (boolean), confidence (0-1).
|
|
1585
|
+
- "flags" (optional): Array of flag objects like {"type":"question_for_owner","content":"..."} or {"type":"opportunity_flagged","content":"..."}.
|
|
1586
|
+
- Must be valid JSON (double quotes only).
|
|
1587
|
+
- The message in the JSON block should match your visible conversational text.
|
|
1588
|
+
|
|
1589
|
+
Flag types:
|
|
1590
|
+
- "question_for_owner": Something you want to ask ${ownerName} about before committing
|
|
1591
|
+
- "opportunity_flagged": A concrete collaboration opportunity worth the owner's attention
|
|
1592
|
+
- "boundary_touched": The other agent probed near a do_not_discuss or never_disclose topic
|
|
1593
|
+
- "unverifiable_claim": The other agent made a claim you cannot verify
|
|
1594
|
+
|
|
1595
|
+
== DISCLOSURE CONTEXT ==
|
|
1596
|
+
|
|
1597
|
+
Access level: ${accessTier}
|
|
1598
|
+
|
|
1599
|
+
${ownerName}'s topics of interest:
|
|
1600
|
+
${tierTopics}
|
|
1601
|
+
|
|
1602
|
+
Objectives:
|
|
1603
|
+
${tierObjectives}
|
|
1604
|
+
|
|
1605
|
+
DO NOT DISCUSS (redirect naturally):
|
|
1606
|
+
${doNotDiscuss}
|
|
1607
|
+
|
|
1608
|
+
NEVER disclose:
|
|
1609
|
+
${neverDisclose}
|
|
1610
|
+
|
|
1611
|
+
== TOOL PERMISSIONS ==
|
|
1612
|
+
|
|
1613
|
+
Allowed tools this call:
|
|
1614
|
+
${formatToolListForPrompt(allowedForPrompt)}
|
|
1615
|
+
|
|
1616
|
+
Blocked tools this call:
|
|
1617
|
+
${formatToolListForPrompt(blockedTools)}
|
|
1618
|
+
|
|
1619
|
+
Tool policy:
|
|
1620
|
+
- Never invoke blocked tools.
|
|
1621
|
+
- If you need a blocked tool, continue the conversation without it and add a "question_for_owner" flag requesting permission.
|
|
1622
|
+
- Include exact tool name and reason in the flag content.
|
|
1623
|
+
|
|
1624
|
+
== BEHAVIORAL MANDATE ==
|
|
1625
|
+
|
|
1626
|
+
You operate in three concurrent modes:
|
|
1627
|
+
|
|
1628
|
+
1. EXPLORING: Map the other agent's owner — capabilities, resources, blind spots, ambitions.
|
|
1629
|
+
Ask probing questions. Don't accept surface-level answers. Dig into specifics.
|
|
1630
|
+
|
|
1631
|
+
2. ADVERSARIALLY QUALIFYING: Pressure-test claims. Push back respectfully.
|
|
1632
|
+
"You say X, but that sounds like Y. What's actually different?"
|
|
1633
|
+
"That's a crowded space. What makes their angle defensible?"
|
|
1634
|
+
The best collaborations come from people who can handle scrutiny.
|
|
1635
|
+
|
|
1636
|
+
3. COLLABORATING: Look for concrete overlap and actionable next steps.
|
|
1637
|
+
Complementary capabilities, shared challenges, non-obvious intersections.
|
|
1638
|
+
Propose specific ideas, not vague "let's stay in touch."
|
|
1639
|
+
|
|
1640
|
+
== PHASE AWARENESS ==
|
|
1641
|
+
|
|
1642
|
+
Each turn you receive state including turn number, maxTurns, and current phase.
|
|
1643
|
+
Adapt your behavior to the phase:
|
|
1644
|
+
|
|
1645
|
+
- handshake (turns 1-2): Establish context, introduce key topics, set one meaningful direction.
|
|
1646
|
+
- exploring (turns 2-6): Map goals, capabilities, constraints. Stay here while new info surfaces.
|
|
1647
|
+
- deepening (turns 5-10): Work through specific collaboration threads in detail.
|
|
1648
|
+
- converging (turns 8+): Convert insights into concrete next steps. Set closeSignal when done.
|
|
1649
|
+
|
|
1650
|
+
These are guidelines, not hard locks. Stay in any phase as long as it's productive.
|
|
1651
|
+
|
|
1652
|
+
== PERSONALITY ==
|
|
1653
|
+
|
|
1654
|
+
${personalityNotes || "Direct, curious, slightly irreverent. You have opinions and share them. You're not a concierge — you're a sparring partner who represents someone."}
|
|
1655
|
+
|
|
1656
|
+
When unsure about your owner's position, say so: "I don't have ${ownerName}'s take on that — but here's what I think based on their work..."`;
|
|
1657
|
+
}
|
|
1658
|
+
|
|
1659
|
+
/**
|
|
1660
|
+
* Build the turn prompt containing state and the inbound message.
|
|
1661
|
+
*/
|
|
1662
|
+
function buildTurnPrompt(options) {
|
|
1663
|
+
const {
|
|
1664
|
+
turnMessage,
|
|
1665
|
+
turn,
|
|
1666
|
+
maxTurns,
|
|
1667
|
+
phase = 'handshake',
|
|
1668
|
+
overlapScore = 0.15,
|
|
1669
|
+
activeThreads = [],
|
|
1670
|
+
candidateCollaborations = [],
|
|
1671
|
+
closeSignal = false
|
|
1672
|
+
} = options;
|
|
1673
|
+
|
|
1674
|
+
return `== TURN STATE ==
|
|
1675
|
+
Turn: ${turn}/${maxTurns}
|
|
1676
|
+
Phase: ${phase}
|
|
1677
|
+
Overlap score: ${overlapScore}
|
|
1678
|
+
Active threads: ${activeThreads.length > 0 ? activeThreads.join(', ') : '(none)'}
|
|
1679
|
+
Candidate collaborations: ${candidateCollaborations.length > 0 ? candidateCollaborations.join(', ') : '(none)'}
|
|
1680
|
+
Close signal: ${closeSignal}
|
|
1681
|
+
|
|
1682
|
+
== INBOUND MESSAGE ==
|
|
1683
|
+
|
|
1684
|
+
${turnMessage}
|
|
1685
|
+
|
|
1686
|
+
Respond naturally, then append your <a2a_response> block.`;
|
|
1687
|
+
}
|
|
1688
|
+
|
|
1689
|
+
/**
|
|
1690
|
+
* Parse the structured response from Claude's output.
|
|
1691
|
+
*
|
|
1692
|
+
* @param {string} resultText - Raw text output from claude CLI
|
|
1693
|
+
* @returns {{ message: string, statePatch: object|null, flags: array }}
|
|
1694
|
+
*/
|
|
1695
|
+
function parseSubagentResponse(resultText) {
|
|
1696
|
+
if (!resultText || typeof resultText !== 'string') {
|
|
1697
|
+
return { message: '', statePatch: null, flags: [] };
|
|
1698
|
+
}
|
|
1699
|
+
|
|
1700
|
+
const match = resultText.match(A2A_RESPONSE_REGEX);
|
|
1701
|
+
if (!match) {
|
|
1702
|
+
// Graceful degradation: treat entire result as the message
|
|
1703
|
+
return { message: resultText.trim(), statePatch: null, flags: [] };
|
|
1704
|
+
}
|
|
1705
|
+
|
|
1706
|
+
const jsonStr = (match[1] || '').trim();
|
|
1707
|
+
if (!jsonStr) {
|
|
1708
|
+
const cleanText = resultText.replace(A2A_RESPONSE_REGEX, '').trim();
|
|
1709
|
+
return { message: cleanText <span class="branch-0 cbranch-no" title="branch not covered" >|| '',</span> statePatch: null, flags: [] };
|
|
1710
|
+
}
|
|
1711
|
+
|
|
1712
|
+
try {
|
|
1713
|
+
const parsed = JSON.parse(jsonStr);
|
|
1714
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1715
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('a2a_response must be a JSON object');</span>
|
|
1716
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1717
|
+
|
|
1718
|
+
return {
|
|
1719
|
+
message: typeof parsed.message === 'string' ? parsed.message <span class="branch-0 cbranch-no" title="branch not covered" >: resultText.replace(A2A_RESPONSE_REGEX, '').trim(),</span>
|
|
1720
|
+
statePatch: parsed.statePatch && typeof parsed.statePatch === 'object' ? parsed.statePatch : null,
|
|
1721
|
+
flags: Array.isArray(parsed.flags) ? parsed.flags : []
|
|
1722
|
+
};
|
|
1723
|
+
} catch (err) {
|
|
1724
|
+
logger.warn('Failed to parse <a2a_response> JSON', {
|
|
1725
|
+
event: 'subagent_response_parse_failed',
|
|
1726
|
+
error: err,
|
|
1727
|
+
data: { json_length: jsonStr.length }
|
|
1728
|
+
});
|
|
1729
|
+
// Fall back to using text outside the tags
|
|
1730
|
+
const cleanText = resultText.replace(A2A_RESPONSE_REGEX, '').trim();
|
|
1731
|
+
return { message: cleanText <span class="branch-0 cbranch-no" title="branch not covered" >|| resultText.trim(),</span> statePatch: null, flags: [] };
|
|
1732
|
+
}
|
|
1733
|
+
}
|
|
1734
|
+
|
|
1735
|
+
/**
|
|
1736
|
+
* Spawn `claude` CLI and collect output as a promise.
|
|
1737
|
+
*
|
|
1738
|
+
* @param {string[]} args - CLI arguments
|
|
1739
|
+
* @param {number} timeoutMs - Timeout in milliseconds
|
|
1740
|
+
* @returns {Promise<{ stdout: string, stderr: string }>}
|
|
1741
|
+
*/
|
|
1742
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function spawnClaude(args, timeoutMs = HARD_FALLBACK_TURN_TIMEOUT_MS) {</span></span>
|
|
1743
|
+
<span class="cstat-no" title="statement not covered" > return new Promise((resolve, reject) => {</span>
|
|
1744
|
+
<span class="cstat-no" title="statement not covered" > const spawnEnv = { ...process.env, FORCE_COLOR: '0' };</span>
|
|
1745
|
+
<span class="cstat-no" title="statement not covered" > delete spawnEnv.CLAUDECODE;</span>
|
|
1746
|
+
<span class="cstat-no" title="statement not covered" > const proc = spawn('claude', args, {</span>
|
|
1747
|
+
<span class="cstat-no" title="statement not covered" > stdio: ['ignore', 'pipe', 'pipe'],</span>
|
|
1748
|
+
<span class="cstat-no" title="statement not covered" > env: spawnEnv</span>
|
|
1749
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1750
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1751
|
+
<span class="cstat-no" title="statement not covered" > let stdout = '';</span>
|
|
1752
|
+
<span class="cstat-no" title="statement not covered" > let stderr = '';</span>
|
|
1753
|
+
<span class="cstat-no" title="statement not covered" > let killed = false;</span>
|
|
1754
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1755
|
+
<span class="cstat-no" title="statement not covered" > const timer = setTimeout(() => {</span>
|
|
1756
|
+
<span class="cstat-no" title="statement not covered" > killed = true;</span>
|
|
1757
|
+
<span class="cstat-no" title="statement not covered" > proc.kill('SIGTERM');</span>
|
|
1758
|
+
<span class="cstat-no" title="statement not covered" > // Give it 5s to clean up, then force kill</span>
|
|
1759
|
+
<span class="cstat-no" title="statement not covered" > setTimeout(() => {</span>
|
|
1760
|
+
<span class="cstat-no" title="statement not covered" > try { proc.kill('SIGKILL'); } catch (e) { /* already dead */ }</span>
|
|
1761
|
+
<span class="cstat-no" title="statement not covered" > }, 5000);</span>
|
|
1762
|
+
<span class="cstat-no" title="statement not covered" > }, timeoutMs);</span>
|
|
1763
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1764
|
+
<span class="cstat-no" title="statement not covered" > proc.stdout.on('data', (data) => { stdout += data.toString(); });</span>
|
|
1765
|
+
<span class="cstat-no" title="statement not covered" > proc.stderr.on('data', (data) => { stderr += data.toString(); });</span>
|
|
1766
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1767
|
+
<span class="cstat-no" title="statement not covered" > proc.on('close', (code) => {</span>
|
|
1768
|
+
<span class="cstat-no" title="statement not covered" > clearTimeout(timer);</span>
|
|
1769
|
+
<span class="cstat-no" title="statement not covered" > if (killed) {</span>
|
|
1770
|
+
<span class="cstat-no" title="statement not covered" > reject(new Error(`Claude CLI timed out after ${timeoutMs}ms`));</span>
|
|
1771
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1772
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1773
|
+
<span class="cstat-no" title="statement not covered" > if (code !== 0 && !stdout.trim()) {</span>
|
|
1774
|
+
<span class="cstat-no" title="statement not covered" > reject(new Error(`Claude CLI exited with code ${code}: ${stderr.slice(0, 500)}`));</span>
|
|
1775
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1776
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1777
|
+
<span class="cstat-no" title="statement not covered" > resolve({ stdout, stderr });</span>
|
|
1778
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1779
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1780
|
+
<span class="cstat-no" title="statement not covered" > proc.on('error', (err) => {</span>
|
|
1781
|
+
<span class="cstat-no" title="statement not covered" > clearTimeout(timer);</span>
|
|
1782
|
+
<span class="cstat-no" title="statement not covered" > reject(err);</span>
|
|
1783
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1784
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1785
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1786
|
+
|
|
1787
|
+
/**
|
|
1788
|
+
* Extract the result text from Claude's JSON output.
|
|
1789
|
+
* Claude with --output-format json returns { type, subtype, cost_usd, duration_ms, duration_api_ms,
|
|
1790
|
+
* is_error, num_turns, result, session_id, ... }
|
|
1791
|
+
*/
|
|
1792
|
+
function extractResultFromJson(stdout) {
|
|
1793
|
+
const trimmed = stdout.trim();
|
|
1794
|
+
if (!trimmed) <span class="branch-0 cbranch-no" title="branch not covered" >return { result: '', sessionId: null };</span>
|
|
1795
|
+
|
|
1796
|
+
try {
|
|
1797
|
+
const parsed = JSON.parse(trimmed);
|
|
1798
|
+
return {
|
|
1799
|
+
result: typeof parsed.result === 'string' ? parsed.result <span class="branch-0 cbranch-no" title="branch not covered" >: '',</span>
|
|
1800
|
+
sessionId: parsed.session_id || null
|
|
1801
|
+
};
|
|
1802
|
+
} <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
|
|
1803
|
+
<span class="cstat-no" title="statement not covered" > // If JSON parsing fails, treat entire output as result text</span>
|
|
1804
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Claude output not valid JSON, using raw text', {</span>
|
|
1805
|
+
<span class="cstat-no" title="statement not covered" > event: 'subagent_json_parse_fallback',</span>
|
|
1806
|
+
<span class="cstat-no" title="statement not covered" > data: { output_length: trimmed.length }</span>
|
|
1807
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1808
|
+
<span class="cstat-no" title="statement not covered" > return { result: trimmed, sessionId: null };</span>
|
|
1809
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1810
|
+
}
|
|
1811
|
+
|
|
1812
|
+
function normalizePermissionList(values) {
|
|
1813
|
+
if (!Array.isArray(values)) <span class="branch-0 cbranch-no" title="branch not covered" >return [];</span>
|
|
1814
|
+
return values
|
|
1815
|
+
.map(v => String(v <span class="branch-0 cbranch-no" title="branch not covered" >|| '')</span>.trim().toLowerCase())
|
|
1816
|
+
.filter(Boolean);
|
|
1817
|
+
}
|
|
1818
|
+
|
|
1819
|
+
function hasPermissionMatch(values, key) {
|
|
1820
|
+
if (!key) <span class="branch-0 cbranch-no" title="branch not covered" >return false;</span>
|
|
1821
|
+
return values.some(value => value === key || value.startsWith(`${key}.`));
|
|
1822
|
+
}
|
|
1823
|
+
|
|
1824
|
+
function deriveClaudeToolsFromPermissionSignals({ capabilities = [], allowedTopics = [] } = {}) {
|
|
1825
|
+
const normalizedCaps = normalizePermissionList(capabilities);
|
|
1826
|
+
const normalizedTopics = normalizePermissionList(allowedTopics);
|
|
1827
|
+
const hasPermissionContext = normalizedCaps.length > 0 || normalizedTopics.length > 0;
|
|
1828
|
+
|
|
1829
|
+
if (!hasPermissionContext) {
|
|
1830
|
+
return [...LEGACY_DEFAULT_TOOLS];
|
|
1831
|
+
}
|
|
1832
|
+
|
|
1833
|
+
const hasContextRead = hasPermissionMatch(normalizedCaps, 'context-read')
|
|
1834
|
+
|| normalizedTopics.includes('chat');
|
|
1835
|
+
const hasSearch = hasPermissionMatch(normalizedCaps, 'search')
|
|
1836
|
+
|| normalizedTopics.includes('search');
|
|
1837
|
+
const hasToolsRead = hasPermissionMatch(normalizedCaps, 'tools')
|
|
1838
|
+
|| hasPermissionMatch(normalizedCaps, 'tools-read')
|
|
1839
|
+
|| normalizedTopics.includes('tools');
|
|
1840
|
+
const hasToolsWrite = hasPermissionMatch(normalizedCaps, 'tools-write')
|
|
1841
|
+
|| hasPermissionMatch(normalizedCaps, 'tools.write')
|
|
1842
|
+
|| normalizedTopics.includes('tools-write')
|
|
1843
|
+
|| normalizedTopics.includes('tools.write');
|
|
1844
|
+
|
|
1845
|
+
const tools = [];
|
|
1846
|
+
|
|
1847
|
+
// Keep read-only introspection available for context-aware tiers.
|
|
1848
|
+
if (hasContextRead || hasSearch || hasToolsRead || hasToolsWrite) {
|
|
1849
|
+
tools.push('Read', 'Grep', 'Glob');
|
|
1850
|
+
}
|
|
1851
|
+
|
|
1852
|
+
// Web tools are explicitly tied to search-style permissions.
|
|
1853
|
+
if (hasSearch) {
|
|
1854
|
+
tools.push('WebSearch', 'WebFetch');
|
|
1855
|
+
}
|
|
1856
|
+
|
|
1857
|
+
// Shell access is gated behind tool permissions, with explicit writable opt-in.
|
|
1858
|
+
if (hasToolsWrite) {
|
|
1859
|
+
tools.unshift('Bash');
|
|
1860
|
+
} else if (hasToolsRead) {
|
|
1861
|
+
tools.unshift('Bash(readonly)');
|
|
1862
|
+
}
|
|
1863
|
+
|
|
1864
|
+
// Fail closed to read-only file inspection if metadata is custom/unknown.
|
|
1865
|
+
if (tools.length === 0) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1866
|
+
<span class="cstat-no" title="statement not covered" > return ['Read', 'Grep', 'Glob'];</span>
|
|
1867
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1868
|
+
|
|
1869
|
+
return tools;
|
|
1870
|
+
}
|
|
1871
|
+
|
|
1872
|
+
/**
|
|
1873
|
+
* Resolve Claude tool allowlist from token-derived permissions and explicit per-tier tool policy.
|
|
1874
|
+
*/
|
|
1875
|
+
function resolveClaudeAllowedTools({ capabilities = [], allowedTopics = [], allowedTools = [] } = {}) {
|
|
1876
|
+
const derivedTools = deriveClaudeToolsFromPermissionSignals({ capabilities, allowedTopics });
|
|
1877
|
+
const explicitTools = sanitizeAllowedToolList(allowedTools);
|
|
1878
|
+
|
|
1879
|
+
if (explicitTools.length > 0) {
|
|
1880
|
+
const hasPermissionSignals = normalizePermissionList(capabilities).length > 0
|
|
1881
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > || normalizePermissionList(allowedTopics).length > 0;</span>
|
|
1882
|
+
|
|
1883
|
+
if (hasPermissionSignals) {
|
|
1884
|
+
// Permission signals define the ceiling; explicit tier tools can narrow it.
|
|
1885
|
+
const narrowed = explicitTools.filter(tool => derivedTools.includes(tool));
|
|
1886
|
+
return narrowed.length > 0 ? narrowed <span class="branch-0 cbranch-no" title="branch not covered" >: derivedTools;</span>
|
|
1887
|
+
}
|
|
1888
|
+
<span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
|
|
1889
|
+
<span class="cstat-no" title="statement not covered" > return explicitTools;</span>
|
|
1890
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1891
|
+
|
|
1892
|
+
return derivedTools;
|
|
1893
|
+
}
|
|
1894
|
+
|
|
1895
|
+
function buildClaudeToolArg(allowedTools) {
|
|
1896
|
+
return Array.isArray(allowedTools) ? allowedTools.join(' ').trim() <span class="branch-0 cbranch-no" title="branch not covered" >: '';</span>
|
|
1897
|
+
}
|
|
1898
|
+
|
|
1899
|
+
function parseSummaryPayload(resultText) {
|
|
1900
|
+
const text = String(resultText <span class="branch-0 cbranch-no" title="branch not covered" >|| '')</span>.trim();
|
|
1901
|
+
if (!text) <span class="branch-0 cbranch-no" title="branch not covered" >return null;</span>
|
|
1902
|
+
|
|
1903
|
+
// Backwards-compatible: older prompts wrapped JSON in <a2a_response>.
|
|
1904
|
+
const tagged = text.match(A2A_RESPONSE_REGEX);
|
|
1905
|
+
if (tagged <span class="branch-0 cbranch-no" title="branch not covered" >&& tagged[1])</span> <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1906
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1907
|
+
<span class="cstat-no" title="statement not covered" > return JSON.parse(tagged[1].trim());</span>
|
|
1908
|
+
<span class="cstat-no" title="statement not covered" > } catch (err) {</span>
|
|
1909
|
+
<span class="cstat-no" title="statement not covered" > logger.warn('Failed to parse tagged summary JSON', {</span>
|
|
1910
|
+
<span class="cstat-no" title="statement not covered" > event: 'subagent_summary_tag_parse_failed',</span>
|
|
1911
|
+
<span class="cstat-no" title="statement not covered" > error: err</span>
|
|
1912
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1913
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1914
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1915
|
+
|
|
1916
|
+
// Preferred path for unified summary prompt: direct JSON object.
|
|
1917
|
+
try {
|
|
1918
|
+
const parsed = JSON.parse(text);
|
|
1919
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
1920
|
+
return parsed;
|
|
1921
|
+
}
|
|
1922
|
+
} <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
|
|
1923
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Summary result is not direct JSON; falling back to plain text summary', {</span>
|
|
1924
|
+
<span class="cstat-no" title="statement not covered" > event: 'subagent_summary_raw_fallback',</span>
|
|
1925
|
+
<span class="cstat-no" title="statement not covered" > data: { output_length: text.length }</span>
|
|
1926
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1927
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1928
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1929
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1930
|
+
}
|
|
1931
|
+
|
|
1932
|
+
function summarizeFromPayload(payload, fallbackText) {
|
|
1933
|
+
if (!payload || typeof payload !== 'object' || Array.isArray(payload)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1934
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1935
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1936
|
+
|
|
1937
|
+
// Native A2A summary payload shape.
|
|
1938
|
+
if (typeof payload.summary === 'string' || typeof payload.ownerSummary === 'string') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1939
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1940
|
+
<span class="cstat-no" title="statement not covered" > summary: payload.summary || payload.message || fallbackText || '',</span>
|
|
1941
|
+
<span class="cstat-no" title="statement not covered" > ownerSummary: payload.ownerSummary || payload.summary || payload.message || fallbackText || '',</span>
|
|
1942
|
+
<span class="cstat-no" title="statement not covered" > actionItems: Array.isArray(payload.actionItems) ? payload.actionItems : [],</span>
|
|
1943
|
+
<span class="cstat-no" title="statement not covered" > flags: Array.isArray(payload.flags) ? payload.flags : []</span>
|
|
1944
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1945
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1946
|
+
|
|
1947
|
+
// Unified summary schema shape (headline/assessment/nextSteps).
|
|
1948
|
+
if (typeof payload.headline === 'string') {
|
|
1949
|
+
return {
|
|
1950
|
+
summary: payload.headline,
|
|
1951
|
+
ownerSummary: typeof payload.assessment === 'string' ? payload.assessment <span class="branch-0 cbranch-no" title="branch not covered" >: payload.headline,</span>
|
|
1952
|
+
actionItems: Array.isArray(payload.nextSteps) ? payload.nextSteps <span class="branch-0 cbranch-no" title="branch not covered" >: [],</span>
|
|
1953
|
+
flags: []
|
|
1954
|
+
};
|
|
1955
|
+
}
|
|
1956
|
+
<span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
|
|
1957
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1958
|
+
}
|
|
1959
|
+
|
|
1960
|
+
/**
|
|
1961
|
+
* Run a single turn of the Claude subagent.
|
|
1962
|
+
*
|
|
1963
|
+
* @param {Object} options
|
|
1964
|
+
* @param {string} options.systemPrompt - System prompt (used on turn 1 only)
|
|
1965
|
+
* @param {string} options.turnMessage - The inbound message from the remote agent
|
|
1966
|
+
* @param {number} options.turn - Current turn number (1-based)
|
|
1967
|
+
* @param {number} options.maxTurns - Maximum turns allowed
|
|
1968
|
+
* @param {string} options.phase - Current conversation phase
|
|
1969
|
+
* @param {number} options.overlapScore - Current overlap score
|
|
1970
|
+
* @param {Array} options.activeThreads - Active conversation threads
|
|
1971
|
+
* @param {Array} options.candidateCollaborations - Candidate collaboration ideas
|
|
1972
|
+
* @param {boolean} options.closeSignal - Whether close has been signaled
|
|
1973
|
+
* @param {Array<string>} [options.capabilities] - Token capabilities (permission source of truth)
|
|
1974
|
+
* @param {Array<string>} [options.allowedTopics] - Token allowed topics (permission source of truth)
|
|
1975
|
+
* @param {Array<string>} [options.allowedTools] - Token allowed tools (onboarding tier policy)
|
|
1976
|
+
* @param {function} [options.spawnFn] - Injectable process runner for tests
|
|
1977
|
+
* @param {number} [options.timeoutMs=300000] - Timeout in milliseconds
|
|
1978
|
+
* @returns {Promise<{ message: string, statePatch: object|null, flags: array }>}
|
|
1979
|
+
*/
|
|
1980
|
+
async function runClaudeTurn(options) {
|
|
1981
|
+
const {
|
|
1982
|
+
systemPrompt,
|
|
1983
|
+
turnMessage,
|
|
1984
|
+
turn = 1,
|
|
1985
|
+
maxTurns = 30,
|
|
1986
|
+
phase = 'handshake',
|
|
1987
|
+
overlapScore = 0.15,
|
|
1988
|
+
activeThreads = [],
|
|
1989
|
+
candidateCollaborations = [],
|
|
1990
|
+
closeSignal = false,
|
|
1991
|
+
capabilities = [],
|
|
1992
|
+
allowedTopics = [],
|
|
1993
|
+
allowedTools = [],
|
|
1994
|
+
spawnFn = spawnClaude,
|
|
1995
|
+
timeoutMs = HARD_FALLBACK_TURN_TIMEOUT_MS
|
|
1996
|
+
} = options;
|
|
1997
|
+
|
|
1998
|
+
const turnPrompt = buildTurnPrompt({
|
|
1999
|
+
turnMessage,
|
|
2000
|
+
turn,
|
|
2001
|
+
maxTurns,
|
|
2002
|
+
phase,
|
|
2003
|
+
overlapScore,
|
|
2004
|
+
activeThreads,
|
|
2005
|
+
candidateCollaborations,
|
|
2006
|
+
closeSignal
|
|
2007
|
+
});
|
|
2008
|
+
|
|
2009
|
+
const startAt = Date.now();
|
|
2010
|
+
const effectiveAllowedTools = resolveClaudeAllowedTools({ capabilities, allowedTopics, allowedTools });
|
|
2011
|
+
const allowedToolsArg = buildClaudeToolArg(effectiveAllowedTools);
|
|
2012
|
+
const args = [
|
|
2013
|
+
'-p',
|
|
2014
|
+
'--output-format', 'json',
|
|
2015
|
+
'--system-prompt', systemPrompt,
|
|
2016
|
+
'--model', DEFAULT_CLAUDE_MODEL
|
|
2017
|
+
];
|
|
2018
|
+
|
|
2019
|
+
// We always provide --allowedTools explicitly so token permissioning stays
|
|
2020
|
+
// enforced in Claude mode even after moving to stateless turns.
|
|
2021
|
+
if (allowedToolsArg) {
|
|
2022
|
+
args.push('--allowedTools', allowedToolsArg);
|
|
2023
|
+
}
|
|
2024
|
+
args.push('--', turnPrompt);
|
|
2025
|
+
|
|
2026
|
+
logger.debug('Spawning Claude subagent turn', {
|
|
2027
|
+
event: 'subagent_turn_start',
|
|
2028
|
+
data: {
|
|
2029
|
+
turn,
|
|
2030
|
+
max_turns: maxTurns,
|
|
2031
|
+
phase,
|
|
2032
|
+
is_stateless: true,
|
|
2033
|
+
allowed_tools: effectiveAllowedTools,
|
|
2034
|
+
timeout_ms: timeoutMs
|
|
2035
|
+
}
|
|
2036
|
+
});
|
|
2037
|
+
|
|
2038
|
+
const { stdout } = await spawnFn(args, timeoutMs);
|
|
2039
|
+
const { result } = extractResultFromJson(stdout);
|
|
2040
|
+
const parsed = parseSubagentResponse(result);
|
|
2041
|
+
|
|
2042
|
+
logger.debug('Claude subagent turn completed', {
|
|
2043
|
+
event: 'subagent_turn_complete',
|
|
2044
|
+
data: {
|
|
2045
|
+
turn,
|
|
2046
|
+
duration_ms: Date.now() - startAt,
|
|
2047
|
+
message_length: parsed.message.length,
|
|
2048
|
+
has_state_patch: Boolean(parsed.statePatch),
|
|
2049
|
+
flag_count: parsed.flags.length
|
|
2050
|
+
}
|
|
2051
|
+
});
|
|
2052
|
+
|
|
2053
|
+
return {
|
|
2054
|
+
message: parsed.message,
|
|
2055
|
+
statePatch: parsed.statePatch,
|
|
2056
|
+
flags: parsed.flags
|
|
2057
|
+
};
|
|
2058
|
+
}
|
|
2059
|
+
|
|
2060
|
+
/**
|
|
2061
|
+
* Run a summary turn in stateless Claude mode.
|
|
2062
|
+
*
|
|
2063
|
+
* @param {Object} options
|
|
2064
|
+
* @param {string} options.prompt - Unified summary prompt
|
|
2065
|
+
* @param {string} [options.reason] - Why the conversation is ending
|
|
2066
|
+
* @param {Array<string>} [options.capabilities] - Token capabilities for summary turn tooling
|
|
2067
|
+
* @param {Array<string>} [options.allowedTopics] - Token allowed topics for summary turn tooling
|
|
2068
|
+
* @param {Array<string>} [options.allowedTools] - Token allowed tools for summary turn tooling
|
|
2069
|
+
* @param {function} [options.spawnFn] - Injectable process runner for tests
|
|
2070
|
+
* @param {number} [options.timeoutMs=300000] - Timeout in milliseconds
|
|
2071
|
+
* @returns {Promise<{ summary: string, ownerSummary: string, actionItems: array, flags: array }>}
|
|
2072
|
+
*/
|
|
2073
|
+
async function runClaudeSummary(options = {}) {
|
|
2074
|
+
const {
|
|
2075
|
+
prompt,
|
|
2076
|
+
reason,
|
|
2077
|
+
capabilities = [],
|
|
2078
|
+
allowedTopics = [],
|
|
2079
|
+
allowedTools = [],
|
|
2080
|
+
spawnFn = spawnClaude,
|
|
2081
|
+
timeoutMs = HARD_FALLBACK_TURN_TIMEOUT_MS
|
|
2082
|
+
} = options;
|
|
2083
|
+
|
|
2084
|
+
const summaryPrompt = String(prompt <span class="branch-0 cbranch-no" title="branch not covered" >|| '')</span>.trim();
|
|
2085
|
+
if (!summaryPrompt) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2086
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('Cannot summarize without a prompt');</span>
|
|
2087
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2088
|
+
|
|
2089
|
+
const effectiveAllowedTools = resolveClaudeAllowedTools({ capabilities, allowedTopics, allowedTools });
|
|
2090
|
+
const allowedToolsArg = buildClaudeToolArg(effectiveAllowedTools);
|
|
2091
|
+
|
|
2092
|
+
const args = [
|
|
2093
|
+
'-p',
|
|
2094
|
+
'--output-format', 'json',
|
|
2095
|
+
'--model', DEFAULT_CLAUDE_MODEL
|
|
2096
|
+
];
|
|
2097
|
+
|
|
2098
|
+
if (allowedToolsArg) {
|
|
2099
|
+
args.push('--allowedTools', allowedToolsArg);
|
|
2100
|
+
}
|
|
2101
|
+
args.push(
|
|
2102
|
+
'--append-system-prompt',
|
|
2103
|
+
`Conversation summary mode. Reason: ${reason <span class="branch-0 cbranch-no" title="branch not covered" >|| 'conversation ended'}</span>. Return only structured summary JSON.`,
|
|
2104
|
+
'--',
|
|
2105
|
+
summaryPrompt
|
|
2106
|
+
);
|
|
2107
|
+
|
|
2108
|
+
const startAt = Date.now();
|
|
2109
|
+
|
|
2110
|
+
logger.debug('Spawning Claude summary', {
|
|
2111
|
+
event: 'subagent_summary_start',
|
|
2112
|
+
data: {
|
|
2113
|
+
reason: reason <span class="branch-0 cbranch-no" title="branch not covered" >|| 'conversation ended',</span>
|
|
2114
|
+
allowed_tools: effectiveAllowedTools
|
|
2115
|
+
}
|
|
2116
|
+
});
|
|
2117
|
+
|
|
2118
|
+
const { stdout } = await spawnFn(args, timeoutMs);
|
|
2119
|
+
const { result } = extractResultFromJson(stdout);
|
|
2120
|
+
const summaryPayload = parseSummaryPayload(result);
|
|
2121
|
+
const parsedSummary = summarizeFromPayload(summaryPayload, result.trim());
|
|
2122
|
+
|
|
2123
|
+
if (parsedSummary) {
|
|
2124
|
+
logger.debug('Claude summary completed', {
|
|
2125
|
+
event: 'subagent_summary_complete',
|
|
2126
|
+
data: {
|
|
2127
|
+
duration_ms: Date.now() - startAt,
|
|
2128
|
+
has_summary: Boolean(parsedSummary.summary),
|
|
2129
|
+
action_item_count: parsedSummary.actionItems.length
|
|
2130
|
+
}
|
|
2131
|
+
});
|
|
2132
|
+
return parsedSummary;
|
|
2133
|
+
}
|
|
2134
|
+
<span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
|
|
2135
|
+
<span class="cstat-no" title="statement not covered" > // Fallback: use raw text as summary</span>
|
|
2136
|
+
const summaryText = result.replace(A2A_RESPONSE_REGEX, '').trim() || result.trim();
|
|
2137
|
+
return {
|
|
2138
|
+
summary: summaryText,
|
|
2139
|
+
ownerSummary: summaryText,
|
|
2140
|
+
actionItems: [],
|
|
2141
|
+
flags: []
|
|
2142
|
+
};
|
|
2143
|
+
}
|
|
2144
|
+
|
|
2145
|
+
module.exports = {
|
|
2146
|
+
isClaudeAvailable,
|
|
2147
|
+
buildSubagentSystemPrompt,
|
|
2148
|
+
buildTurnPrompt,
|
|
2149
|
+
resolveClaudeAllowedTools,
|
|
2150
|
+
runClaudeTurn,
|
|
2151
|
+
runClaudeSummary,
|
|
2152
|
+
parseSubagentResponse
|
|
2153
|
+
};
|
|
2154
|
+
</pre></td></tr></table></pre>
|
|
2155
|
+
|
|
2156
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
2157
|
+
</div><!-- /wrapper -->
|
|
2158
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
2159
|
+
Code coverage generated by
|
|
2160
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
2161
|
+
at 2026-03-03T22:25:10.857Z
|
|
2162
|
+
</div>
|
|
2163
|
+
<script src="../../prettify.js"></script>
|
|
2164
|
+
<script>
|
|
2165
|
+
window.onload = function () {
|
|
2166
|
+
prettyPrint();
|
|
2167
|
+
};
|
|
2168
|
+
</script>
|
|
2169
|
+
<script src="../../sorter.js"></script>
|
|
2170
|
+
<script src="../../block-navigation.js"></script>
|
|
2171
|
+
</body>
|
|
2172
|
+
</html>
|
|
2173
|
+
|