pmxtjs 0.1.0 → 0.1.1

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.
Files changed (58) hide show
  1. package/dist/BaseExchange.js +30 -0
  2. package/{src/exchanges/Kalshi.ts → dist/exchanges/Kalshi.js} +75 -106
  3. package/{src/exchanges/Polymarket.ts → dist/exchanges/Polymarket.js} +107 -144
  4. package/dist/index.js +20 -0
  5. package/dist/types.js +5 -0
  6. package/package.json +4 -1
  7. package/API_REFERENCE.md +0 -88
  8. package/coverage/clover.xml +0 -334
  9. package/coverage/coverage-final.json +0 -4
  10. package/coverage/lcov-report/base.css +0 -224
  11. package/coverage/lcov-report/block-navigation.js +0 -87
  12. package/coverage/lcov-report/favicon.png +0 -0
  13. package/coverage/lcov-report/index.html +0 -131
  14. package/coverage/lcov-report/pmxt/BaseExchange.ts.html +0 -256
  15. package/coverage/lcov-report/pmxt/exchanges/Kalshi.ts.html +0 -1132
  16. package/coverage/lcov-report/pmxt/exchanges/Polymarket.ts.html +0 -1456
  17. package/coverage/lcov-report/pmxt/exchanges/index.html +0 -131
  18. package/coverage/lcov-report/pmxt/index.html +0 -116
  19. package/coverage/lcov-report/prettify.css +0 -1
  20. package/coverage/lcov-report/prettify.js +0 -2
  21. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  22. package/coverage/lcov-report/sorter.js +0 -210
  23. package/coverage/lcov-report/src/BaseExchange.ts.html +0 -256
  24. package/coverage/lcov-report/src/exchanges/Kalshi.ts.html +0 -1132
  25. package/coverage/lcov-report/src/exchanges/Polymarket.ts.html +0 -1456
  26. package/coverage/lcov-report/src/exchanges/index.html +0 -131
  27. package/coverage/lcov-report/src/index.html +0 -116
  28. package/coverage/lcov.info +0 -766
  29. package/examples/get_event_prices.ts +0 -37
  30. package/examples/historical_prices.ts +0 -117
  31. package/examples/orderbook.ts +0 -102
  32. package/examples/recent_trades.ts +0 -29
  33. package/examples/search_events.ts +0 -68
  34. package/examples/search_market.ts +0 -29
  35. package/jest.config.js +0 -11
  36. package/pmxt-0.1.0.tgz +0 -0
  37. package/src/BaseExchange.ts +0 -57
  38. package/src/index.ts +0 -5
  39. package/src/types.ts +0 -61
  40. package/test/exchanges/kalshi/ApiErrors.test.ts +0 -132
  41. package/test/exchanges/kalshi/EmptyResponse.test.ts +0 -44
  42. package/test/exchanges/kalshi/FetchAndNormalizeMarkets.test.ts +0 -56
  43. package/test/exchanges/kalshi/LiveApi.integration.test.ts +0 -40
  44. package/test/exchanges/kalshi/MarketHistory.test.ts +0 -185
  45. package/test/exchanges/kalshi/OrderBook.test.ts +0 -149
  46. package/test/exchanges/kalshi/SearchMarkets.test.ts +0 -174
  47. package/test/exchanges/kalshi/VolumeFallback.test.ts +0 -44
  48. package/test/exchanges/polymarket/DataValidation.test.ts +0 -271
  49. package/test/exchanges/polymarket/ErrorHandling.test.ts +0 -34
  50. package/test/exchanges/polymarket/FetchAndNormalizeMarkets.test.ts +0 -68
  51. package/test/exchanges/polymarket/GetMarketsBySlug.test.ts +0 -268
  52. package/test/exchanges/polymarket/LiveApi.integration.test.ts +0 -44
  53. package/test/exchanges/polymarket/MarketHistory.test.ts +0 -207
  54. package/test/exchanges/polymarket/OrderBook.test.ts +0 -167
  55. package/test/exchanges/polymarket/RequestParameters.test.ts +0 -39
  56. package/test/exchanges/polymarket/SearchMarkets.test.ts +0 -176
  57. package/test/exchanges/polymarket/TradeHistory.test.ts +0 -248
  58. package/tsconfig.json +0 -12
@@ -1,1132 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/exchanges/Kalshi.ts</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../prettify.css" />
9
- <link rel="stylesheet" href="../../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> / <a href="index.html">src/exchanges</a> Kalshi.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">82.5% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>132/160</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">77.86% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>95/122</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">80% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>16/20</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">85.13% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>126/148</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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">8x</span>
416
- <span class="cline-any cline-yes">8x</span>
417
- <span class="cline-any cline-neutral">&nbsp;</span>
418
- <span class="cline-any cline-neutral">&nbsp;</span>
419
- <span class="cline-any cline-yes">8x</span>
420
- <span class="cline-any cline-neutral">&nbsp;</span>
421
- <span class="cline-any cline-no">&nbsp;</span>
422
- <span class="cline-any cline-neutral">&nbsp;</span>
423
- <span class="cline-any cline-yes">34x</span>
424
- <span class="cline-any cline-neutral">&nbsp;</span>
425
- <span class="cline-any cline-neutral">&nbsp;</span>
426
- <span class="cline-any cline-yes">15x</span>
427
- <span class="cline-any cline-neutral">&nbsp;</span>
428
- <span class="cline-any cline-yes">15x</span>
429
- <span class="cline-any cline-neutral">&nbsp;</span>
430
- <span class="cline-any cline-neutral">&nbsp;</span>
431
- <span class="cline-any cline-yes">15x</span>
432
- <span class="cline-any cline-neutral">&nbsp;</span>
433
- <span class="cline-any cline-neutral">&nbsp;</span>
434
- <span class="cline-any cline-yes">15x</span>
435
- <span class="cline-any cline-neutral">&nbsp;</span>
436
- <span class="cline-any cline-yes">15x</span>
437
- <span class="cline-any cline-yes">459x</span>
438
- <span class="cline-any cline-yes">459x</span>
439
- <span class="cline-any cline-yes">1591x</span>
440
- <span class="cline-any cline-yes">1591x</span>
441
- <span class="cline-any cline-yes">1591x</span>
442
- <span class="cline-any cline-neutral">&nbsp;</span>
443
- <span class="cline-any cline-neutral">&nbsp;</span>
444
- <span class="cline-any cline-neutral">&nbsp;</span>
445
- <span class="cline-any cline-neutral">&nbsp;</span>
446
- <span class="cline-any cline-yes">15x</span>
447
- <span class="cline-any cline-neutral">&nbsp;</span>
448
- <span class="cline-any cline-neutral">&nbsp;</span>
449
- <span class="cline-any cline-yes">15x</span>
450
- <span class="cline-any cline-no">&nbsp;</span>
451
- <span class="cline-any cline-yes">15x</span>
452
- <span class="cline-any cline-no">&nbsp;</span>
453
- <span class="cline-any cline-neutral">&nbsp;</span>
454
- <span class="cline-any cline-neutral">&nbsp;</span>
455
- <span class="cline-any cline-yes">15x</span>
456
- <span class="cline-any cline-neutral">&nbsp;</span>
457
- <span class="cline-any cline-neutral">&nbsp;</span>
458
- <span class="cline-any cline-no">&nbsp;</span>
459
- <span class="cline-any cline-no">&nbsp;</span>
460
- <span class="cline-any cline-neutral">&nbsp;</span>
461
- <span class="cline-any cline-neutral">&nbsp;</span>
462
- <span class="cline-any cline-neutral">&nbsp;</span>
463
- <span class="cline-any cline-neutral">&nbsp;</span>
464
- <span class="cline-any cline-yes">15x</span>
465
- <span class="cline-any cline-yes">15x</span>
466
- <span class="cline-any cline-yes">15x</span>
467
- <span class="cline-any cline-yes">15x</span>
468
- <span class="cline-any cline-neutral">&nbsp;</span>
469
- <span class="cline-any cline-neutral">&nbsp;</span>
470
- <span class="cline-any cline-neutral">&nbsp;</span>
471
- <span class="cline-any cline-neutral">&nbsp;</span>
472
- <span class="cline-any cline-neutral">&nbsp;</span>
473
- <span class="cline-any cline-yes">15x</span>
474
- <span class="cline-any cline-yes">15x</span>
475
- <span class="cline-any cline-neutral">&nbsp;</span>
476
- <span class="cline-any cline-yes">15x</span>
477
- <span class="cline-any cline-yes">15x</span>
478
- <span class="cline-any cline-neutral">&nbsp;</span>
479
- <span class="cline-any cline-yes">15x</span>
480
- <span class="cline-any cline-neutral">&nbsp;</span>
481
- <span class="cline-any cline-neutral">&nbsp;</span>
482
- <span class="cline-any cline-neutral">&nbsp;</span>
483
- <span class="cline-any cline-neutral">&nbsp;</span>
484
- <span class="cline-any cline-yes">15x</span>
485
- <span class="cline-any cline-neutral">&nbsp;</span>
486
- <span class="cline-any cline-yes">15x</span>
487
- <span class="cline-any cline-yes">13x</span>
488
- <span class="cline-any cline-neutral">&nbsp;</span>
489
- <span class="cline-any cline-yes">13x</span>
490
- <span class="cline-any cline-neutral">&nbsp;</span>
491
- <span class="cline-any cline-yes">11x</span>
492
- <span class="cline-any cline-neutral">&nbsp;</span>
493
- <span class="cline-any cline-neutral">&nbsp;</span>
494
- <span class="cline-any cline-yes">11x</span>
495
- <span class="cline-any cline-yes">11x</span>
496
- <span class="cline-any cline-yes">459x</span>
497
- <span class="cline-any cline-neutral">&nbsp;</span>
498
- <span class="cline-any cline-neutral">&nbsp;</span>
499
- <span class="cline-any cline-neutral">&nbsp;</span>
500
- <span class="cline-any cline-neutral">&nbsp;</span>
501
- <span class="cline-any cline-yes">11x</span>
502
- <span class="cline-any cline-yes">2x</span>
503
- <span class="cline-any cline-yes">2x</span>
504
- <span class="cline-any cline-neutral">&nbsp;</span>
505
- <span class="cline-any cline-neutral">&nbsp;</span>
506
- <span class="cline-any cline-neutral">&nbsp;</span>
507
- <span class="cline-any cline-yes">9x</span>
508
- <span class="cline-any cline-yes">9x</span>
509
- <span class="cline-any cline-neutral">&nbsp;</span>
510
- <span class="cline-any cline-neutral">&nbsp;</span>
511
- <span class="cline-any cline-yes">9x</span>
512
- <span class="cline-any cline-no">&nbsp;</span>
513
- <span class="cline-any cline-neutral">&nbsp;</span>
514
- <span class="cline-any cline-neutral">&nbsp;</span>
515
- <span class="cline-any cline-neutral">&nbsp;</span>
516
- <span class="cline-any cline-yes">2x</span>
517
- <span class="cline-any cline-yes">2x</span>
518
- <span class="cline-any cline-neutral">&nbsp;</span>
519
- <span class="cline-any cline-neutral">&nbsp;</span>
520
- <span class="cline-any cline-neutral">&nbsp;</span>
521
- <span class="cline-any cline-yes">15x</span>
522
- <span class="cline-any cline-yes">15x</span>
523
- <span class="cline-any cline-neutral">&nbsp;</span>
524
- <span class="cline-any cline-neutral">&nbsp;</span>
525
- <span class="cline-any cline-neutral">&nbsp;</span>
526
- <span class="cline-any cline-yes">1591x</span>
527
- <span class="cline-any cline-neutral">&nbsp;</span>
528
- <span class="cline-any cline-neutral">&nbsp;</span>
529
- <span class="cline-any cline-yes">1591x</span>
530
- <span class="cline-any cline-yes">1591x</span>
531
- <span class="cline-any cline-yes">1471x</span>
532
- <span class="cline-any cline-yes">120x</span>
533
- <span class="cline-any cline-yes">84x</span>
534
- <span class="cline-any cline-yes">36x</span>
535
- <span class="cline-any cline-yes">32x</span>
536
- <span class="cline-any cline-neutral">&nbsp;</span>
537
- <span class="cline-any cline-neutral">&nbsp;</span>
538
- <span class="cline-any cline-neutral">&nbsp;</span>
539
- <span class="cline-any cline-yes">1591x</span>
540
- <span class="cline-any cline-yes">1591x</span>
541
- <span class="cline-any cline-yes">1533x</span>
542
- <span class="cline-any cline-neutral">&nbsp;</span>
543
- <span class="cline-any cline-neutral">&nbsp;</span>
544
- <span class="cline-any cline-neutral">&nbsp;</span>
545
- <span class="cline-any cline-yes">1591x</span>
546
- <span class="cline-any cline-yes">1591x</span>
547
- <span class="cline-any cline-yes">1532x</span>
548
- <span class="cline-any cline-neutral">&nbsp;</span>
549
- <span class="cline-any cline-neutral">&nbsp;</span>
550
- <span class="cline-any cline-yes">1591x</span>
551
- <span class="cline-any cline-neutral">&nbsp;</span>
552
- <span class="cline-any cline-neutral">&nbsp;</span>
553
- <span class="cline-any cline-neutral">&nbsp;</span>
554
- <span class="cline-any cline-neutral">&nbsp;</span>
555
- <span class="cline-any cline-neutral">&nbsp;</span>
556
- <span class="cline-any cline-neutral">&nbsp;</span>
557
- <span class="cline-any cline-neutral">&nbsp;</span>
558
- <span class="cline-any cline-neutral">&nbsp;</span>
559
- <span class="cline-any cline-neutral">&nbsp;</span>
560
- <span class="cline-any cline-neutral">&nbsp;</span>
561
- <span class="cline-any cline-neutral">&nbsp;</span>
562
- <span class="cline-any cline-neutral">&nbsp;</span>
563
- <span class="cline-any cline-neutral">&nbsp;</span>
564
- <span class="cline-any cline-neutral">&nbsp;</span>
565
- <span class="cline-any cline-yes">1591x</span>
566
- <span class="cline-any cline-neutral">&nbsp;</span>
567
- <span class="cline-any cline-neutral">&nbsp;</span>
568
- <span class="cline-any cline-neutral">&nbsp;</span>
569
- <span class="cline-any cline-neutral">&nbsp;</span>
570
- <span class="cline-any cline-neutral">&nbsp;</span>
571
- <span class="cline-any cline-neutral">&nbsp;</span>
572
- <span class="cline-any cline-neutral">&nbsp;</span>
573
- <span class="cline-any cline-neutral">&nbsp;</span>
574
- <span class="cline-any cline-neutral">&nbsp;</span>
575
- <span class="cline-any cline-neutral">&nbsp;</span>
576
- <span class="cline-any cline-neutral">&nbsp;</span>
577
- <span class="cline-any cline-neutral">&nbsp;</span>
578
- <span class="cline-any cline-neutral">&nbsp;</span>
579
- <span class="cline-any cline-neutral">&nbsp;</span>
580
- <span class="cline-any cline-neutral">&nbsp;</span>
581
- <span class="cline-any cline-neutral">&nbsp;</span>
582
- <span class="cline-any cline-neutral">&nbsp;</span>
583
- <span class="cline-any cline-yes">7x</span>
584
- <span class="cline-any cline-yes">7x</span>
585
- <span class="cline-any cline-yes">7x</span>
586
- <span class="cline-any cline-yes">7x</span>
587
- <span class="cline-any cline-yes">7x</span>
588
- <span class="cline-any cline-yes">56x</span>
589
- <span class="cline-any cline-neutral">&nbsp;</span>
590
- <span class="cline-any cline-neutral">&nbsp;</span>
591
- <span class="cline-any cline-yes">7x</span>
592
- <span class="cline-any cline-yes">7x</span>
593
- <span class="cline-any cline-neutral">&nbsp;</span>
594
- <span class="cline-any cline-no">&nbsp;</span>
595
- <span class="cline-any cline-no">&nbsp;</span>
596
- <span class="cline-any cline-neutral">&nbsp;</span>
597
- <span class="cline-any cline-neutral">&nbsp;</span>
598
- <span class="cline-any cline-neutral">&nbsp;</span>
599
- <span class="cline-any cline-neutral">&nbsp;</span>
600
- <span class="cline-any cline-neutral">&nbsp;</span>
601
- <span class="cline-any cline-neutral">&nbsp;</span>
602
- <span class="cline-any cline-neutral">&nbsp;</span>
603
- <span class="cline-any cline-neutral">&nbsp;</span>
604
- <span class="cline-any cline-neutral">&nbsp;</span>
605
- <span class="cline-any cline-yes">2x</span>
606
- <span class="cline-any cline-neutral">&nbsp;</span>
607
- <span class="cline-any cline-yes">2x</span>
608
- <span class="cline-any cline-yes">2x</span>
609
- <span class="cline-any cline-yes">2x</span>
610
- <span class="cline-any cline-neutral">&nbsp;</span>
611
- <span class="cline-any cline-neutral">&nbsp;</span>
612
- <span class="cline-any cline-neutral">&nbsp;</span>
613
- <span class="cline-any cline-no">&nbsp;</span>
614
- <span class="cline-any cline-no">&nbsp;</span>
615
- <span class="cline-any cline-neutral">&nbsp;</span>
616
- <span class="cline-any cline-no">&nbsp;</span>
617
- <span class="cline-any cline-no">&nbsp;</span>
618
- <span class="cline-any cline-neutral">&nbsp;</span>
619
- <span class="cline-any cline-no">&nbsp;</span>
620
- <span class="cline-any cline-no">&nbsp;</span>
621
- <span class="cline-any cline-no">&nbsp;</span>
622
- <span class="cline-any cline-no">&nbsp;</span>
623
- <span class="cline-any cline-neutral">&nbsp;</span>
624
- <span class="cline-any cline-neutral">&nbsp;</span>
625
- <span class="cline-any cline-neutral">&nbsp;</span>
626
- <span class="cline-any cline-no">&nbsp;</span>
627
- <span class="cline-any cline-neutral">&nbsp;</span>
628
- <span class="cline-any cline-neutral">&nbsp;</span>
629
- <span class="cline-any cline-yes">2x</span>
630
- <span class="cline-any cline-yes">2x</span>
631
- <span class="cline-any cline-yes">1x</span>
632
- <span class="cline-any cline-neutral">&nbsp;</span>
633
- <span class="cline-any cline-yes">1x</span>
634
- <span class="cline-any cline-yes">1x</span>
635
- <span class="cline-any cline-neutral">&nbsp;</span>
636
- <span class="cline-any cline-no">&nbsp;</span>
637
- <span class="cline-any cline-no">&nbsp;</span>
638
- <span class="cline-any cline-neutral">&nbsp;</span>
639
- <span class="cline-any cline-neutral">&nbsp;</span>
640
- <span class="cline-any cline-neutral">&nbsp;</span>
641
- <span class="cline-any cline-neutral">&nbsp;</span>
642
- <span class="cline-any cline-yes">11x</span>
643
- <span class="cline-any cline-neutral">&nbsp;</span>
644
- <span class="cline-any cline-neutral">&nbsp;</span>
645
- <span class="cline-any cline-neutral">&nbsp;</span>
646
- <span class="cline-any cline-neutral">&nbsp;</span>
647
- <span class="cline-any cline-neutral">&nbsp;</span>
648
- <span class="cline-any cline-neutral">&nbsp;</span>
649
- <span class="cline-any cline-neutral">&nbsp;</span>
650
- <span class="cline-any cline-yes">11x</span>
651
- <span class="cline-any cline-neutral">&nbsp;</span>
652
- <span class="cline-any cline-neutral">&nbsp;</span>
653
- <span class="cline-any cline-neutral">&nbsp;</span>
654
- <span class="cline-any cline-yes">11x</span>
655
- <span class="cline-any cline-neutral">&nbsp;</span>
656
- <span class="cline-any cline-yes">11x</span>
657
- <span class="cline-any cline-yes">11x</span>
658
- <span class="cline-any cline-neutral">&nbsp;</span>
659
- <span class="cline-any cline-neutral">&nbsp;</span>
660
- <span class="cline-any cline-yes">11x</span>
661
- <span class="cline-any cline-yes">11x</span>
662
- <span class="cline-any cline-yes">1x</span>
663
- <span class="cline-any cline-neutral">&nbsp;</span>
664
- <span class="cline-any cline-yes">10x</span>
665
- <span class="cline-any cline-yes">10x</span>
666
- <span class="cline-any cline-neutral">&nbsp;</span>
667
- <span class="cline-any cline-yes">10x</span>
668
- <span class="cline-any cline-neutral">&nbsp;</span>
669
- <span class="cline-any cline-yes">10x</span>
670
- <span class="cline-any cline-yes">10x</span>
671
- <span class="cline-any cline-yes">10x</span>
672
- <span class="cline-any cline-neutral">&nbsp;</span>
673
- <span class="cline-any cline-yes">10x</span>
674
- <span class="cline-any cline-yes">1x</span>
675
- <span class="cline-any cline-neutral">&nbsp;</span>
676
- <span class="cline-any cline-yes">10x</span>
677
- <span class="cline-any cline-yes">1x</span>
678
- <span class="cline-any cline-yes">1x</span>
679
- <span class="cline-any cline-no">&nbsp;</span>
680
- <span class="cline-any cline-neutral">&nbsp;</span>
681
- <span class="cline-any cline-neutral">&nbsp;</span>
682
- <span class="cline-any cline-neutral">&nbsp;</span>
683
- <span class="cline-any cline-yes">10x</span>
684
- <span class="cline-any cline-yes">10x</span>
685
- <span class="cline-any cline-neutral">&nbsp;</span>
686
- <span class="cline-any cline-yes">10x</span>
687
- <span class="cline-any cline-yes">9x</span>
688
- <span class="cline-any cline-neutral">&nbsp;</span>
689
- <span class="cline-any cline-yes">105x</span>
690
- <span class="cline-any cline-neutral">&nbsp;</span>
691
- <span class="cline-any cline-neutral">&nbsp;</span>
692
- <span class="cline-any cline-neutral">&nbsp;</span>
693
- <span class="cline-any cline-neutral">&nbsp;</span>
694
- <span class="cline-any cline-neutral">&nbsp;</span>
695
- <span class="cline-any cline-neutral">&nbsp;</span>
696
- <span class="cline-any cline-neutral">&nbsp;</span>
697
- <span class="cline-any cline-neutral">&nbsp;</span>
698
- <span class="cline-any cline-yes">9x</span>
699
- <span class="cline-any cline-yes">1x</span>
700
- <span class="cline-any cline-neutral">&nbsp;</span>
701
- <span class="cline-any cline-yes">8x</span>
702
- <span class="cline-any cline-neutral">&nbsp;</span>
703
- <span class="cline-any cline-yes">2x</span>
704
- <span class="cline-any cline-yes">1x</span>
705
- <span class="cline-any cline-yes">1x</span>
706
- <span class="cline-any cline-neutral">&nbsp;</span>
707
- <span class="cline-any cline-yes">1x</span>
708
- <span class="cline-any cline-yes">1x</span>
709
- <span class="cline-any cline-neutral">&nbsp;</span>
710
- <span class="cline-any cline-neutral">&nbsp;</span>
711
- <span class="cline-any cline-neutral">&nbsp;</span>
712
- <span class="cline-any cline-neutral">&nbsp;</span>
713
- <span class="cline-any cline-yes">8x</span>
714
- <span class="cline-any cline-yes">8x</span>
715
- <span class="cline-any cline-yes">8x</span>
716
- <span class="cline-any cline-yes">7x</span>
717
- <span class="cline-any cline-neutral">&nbsp;</span>
718
- <span class="cline-any cline-neutral">&nbsp;</span>
719
- <span class="cline-any cline-yes">8x</span>
720
- <span class="cline-any cline-neutral">&nbsp;</span>
721
- <span class="cline-any cline-neutral">&nbsp;</span>
722
- <span class="cline-any cline-neutral">&nbsp;</span>
723
- <span class="cline-any cline-neutral">&nbsp;</span>
724
- <span class="cline-any cline-yes">8x</span>
725
- <span class="cline-any cline-neutral">&nbsp;</span>
726
- <span class="cline-any cline-neutral">&nbsp;</span>
727
- <span class="cline-any cline-neutral">&nbsp;</span>
728
- <span class="cline-any cline-neutral">&nbsp;</span>
729
- <span class="cline-any cline-neutral">&nbsp;</span>
730
- <span class="cline-any cline-yes">7x</span>
731
- <span class="cline-any cline-yes">7x</span>
732
- <span class="cline-any cline-neutral">&nbsp;</span>
733
- <span class="cline-any cline-yes">7x</span>
734
- <span class="cline-any cline-neutral">&nbsp;</span>
735
- <span class="cline-any cline-yes">1x</span>
736
- <span class="cline-any cline-yes">1x</span>
737
- <span class="cline-any cline-neutral">&nbsp;</span>
738
- <span class="cline-any cline-neutral">&nbsp;</span>
739
- <span class="cline-any cline-neutral">&nbsp;</span>
740
- <span class="cline-any cline-neutral">&nbsp;</span>
741
- <span class="cline-any cline-yes">1x</span>
742
- <span class="cline-any cline-yes">1x</span>
743
- <span class="cline-any cline-yes">1x</span>
744
- <span class="cline-any cline-neutral">&nbsp;</span>
745
- <span class="cline-any cline-neutral">&nbsp;</span>
746
- <span class="cline-any cline-neutral">&nbsp;</span>
747
- <span class="cline-any cline-neutral">&nbsp;</span>
748
- <span class="cline-any cline-neutral">&nbsp;</span>
749
- <span class="cline-any cline-no">&nbsp;</span>
750
- <span class="cline-any cline-neutral">&nbsp;</span>
751
- <span class="cline-any cline-no">&nbsp;</span>
752
- <span class="cline-any cline-neutral">&nbsp;</span>
753
- <span class="cline-any cline-neutral">&nbsp;</span>
754
- <span class="cline-any cline-neutral">&nbsp;</span>
755
- <span class="cline-any cline-neutral">&nbsp;</span>
756
- <span class="cline-any cline-neutral">&nbsp;</span>
757
- <span class="cline-any cline-neutral">&nbsp;</span>
758
- <span class="cline-any cline-neutral">&nbsp;</span>
759
- <span class="cline-any cline-yes">1x</span>
760
- <span class="cline-any cline-yes">1x</span>
761
- <span class="cline-any cline-neutral">&nbsp;</span>
762
- <span class="cline-any cline-neutral">&nbsp;</span>
763
- <span class="cline-any cline-neutral">&nbsp;</span>
764
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import axios from 'axios';
765
- import { PredictionMarketExchange, MarketFilterParams, HistoryFilterParams } from '../BaseExchange';
766
- import { UnifiedMarket, MarketOutcome, PriceCandle, CandleInterval, OrderBook, Trade } from '../types';
767
- &nbsp;
768
- export class KalshiExchange extends PredictionMarketExchange {
769
- <span class="fstat-no" title="function not covered" > get n</span>ame(): string {
770
- <span class="cstat-no" title="statement not covered" > return "Kalshi";</span>
771
- }
772
- private baseUrl = "https://api.elections.kalshi.com/trade-api/v2/events";
773
- &nbsp;
774
- async fetchMarkets(params?: MarketFilterParams): Promise&lt;UnifiedMarket[]&gt; {
775
- const limit = params?.limit || 50;
776
- &nbsp;
777
- try {
778
- // Fetch active events with nested markets
779
- // For small limits, we can optimize by fetching fewer pages
780
- const allEvents = await this.fetchActiveEvents(limit);
781
- &nbsp;
782
- // Extract ALL markets from all events
783
- const allMarkets: UnifiedMarket[] = [];
784
- &nbsp;
785
- for (const event of allEvents) {
786
- const markets = event.markets || <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
787
- for (const market of markets) {
788
- const unifiedMarket = this.mapMarketToUnified(event, market);
789
- <span class="missing-if-branch" title="else path not taken" >E</span>if (unifiedMarket) {
790
- allMarkets.push(unifiedMarket);
791
- }
792
- }
793
- }
794
- &nbsp;
795
- console.log(`Extracted ${allMarkets.length} markets from ${allEvents.length} events.`);
796
- &nbsp;
797
- // Sort by 24h volume
798
- <span class="missing-if-branch" title="if path not taken" >I</span>if (params?.sort === 'volume') {
799
- <span class="cstat-no" title="statement not covered" > allMarkets.sort(<span class="fstat-no" title="function not covered" >(a</span>, b) =&gt; <span class="cstat-no" title="statement not covered" >b.volume24h - a.volume24h)</span>;</span>
800
- } else <span class="missing-if-branch" title="if path not taken" >I</span>if (params?.sort === 'liquidity') {
801
- <span class="cstat-no" title="statement not covered" > allMarkets.sort(<span class="fstat-no" title="function not covered" >(a</span>, b) =&gt; <span class="cstat-no" title="statement not covered" >b.liquidity - a.liquidity)</span>;</span>
802
- }
803
- &nbsp;
804
- return allMarkets.slice(0, limit);
805
- &nbsp;
806
- } catch (error) {
807
- <span class="cstat-no" title="statement not covered" > console.error("Error fetching Kalshi data:", error);</span>
808
- <span class="cstat-no" title="statement not covered" > return [];</span>
809
- }
810
- }
811
- &nbsp;
812
- private async fetchActiveEvents(targetMarketCount?: number): Promise&lt;any[]&gt; {
813
- let allEvents: any[] = [];
814
- let totalMarketCount = 0;
815
- let cursor = null;
816
- let page = 0;
817
- &nbsp;
818
- // Note: Kalshi API uses cursor-based pagination which requires sequential fetching.
819
- // We cannot parallelize requests for a single list because we need the cursor from page N to fetch page N+1.
820
- // To optimize, we use the maximum allowed limit (200) and fetch until exhaustion.
821
- &nbsp;
822
- const MAX_PAGES = 1000; // Safety cap against infinite loops
823
- const BATCH_SIZE = 200; // Max limit per Kalshi API docs
824
- &nbsp;
825
- do {
826
- try {
827
- // console.log(`Fetching Kalshi page ${page + 1}...`);
828
- const queryParams: any = {
829
- limit: BATCH_SIZE,
830
- with_nested_markets: true,
831
- status: 'open' // Filter to open markets to improve relevance and speed
832
- };
833
- <span class="missing-if-branch" title="if path not taken" >I</span>if (cursor) <span class="cstat-no" title="statement not covered" >queryParams.cursor = cursor;</span>
834
- &nbsp;
835
- const response = await axios.get(this.baseUrl, { params: queryParams });
836
- const events = response.data.events || [];
837
- &nbsp;
838
- if (events.length === 0) break;
839
- &nbsp;
840
- allEvents = allEvents.concat(events);
841
- &nbsp;
842
- // Count markets in this batch for early termination
843
- <span class="missing-if-branch" title="else path not taken" >E</span>if (targetMarketCount) {
844
- for (const event of events) {
845
- totalMarketCount += (event.markets || <span class="branch-1 cbranch-no" title="branch not covered" >[])</span>.length;
846
- }
847
- &nbsp;
848
- // Early termination: if we have enough markets, stop fetching
849
- // Add a buffer (2x) to ensure we have enough after filtering/sorting
850
- if (totalMarketCount &gt;= targetMarketCount * 2) {
851
- console.log(`Early termination: collected ${totalMarketCount} markets (target: ${targetMarketCount})`);
852
- break;
853
- }
854
- }
855
- &nbsp;
856
- cursor = response.data.cursor;
857
- page++;
858
- &nbsp;
859
- // Log progress every few pages to avoid spam
860
- <span class="missing-if-branch" title="if path not taken" >I</span>if (page % 5 === 0) {
861
- <span class="cstat-no" title="statement not covered" > console.log(`Fetched ${page} pages (${allEvents.length} events) from Kalshi...`);</span>
862
- }
863
- &nbsp;
864
- } catch (e) {
865
- console.error(`Error fetching Kalshi page ${page}:`, e);
866
- break;
867
- }
868
- } while (cursor &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >page &lt; MAX_PAGES)</span>;
869
- &nbsp;
870
- console.log(`Finished fetching Kalshi: ${allEvents.length} total events across ${page} pages.`);
871
- return allEvents;
872
- }
873
- &nbsp;
874
- private mapMarketToUnified(event: any, market: any): UnifiedMarket | null {
875
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!market) <span class="cstat-no" title="statement not covered" >return null;</span>
876
- &nbsp;
877
- // Calculate price
878
- let price = 0.5;
879
- if (market.last_price) {
880
- price = market.last_price / 100;
881
- } else if (market.yes_ask &amp;&amp; market.yes_bid) {
882
- price = (market.yes_ask + market.yes_bid) / 200;
883
- } else if (market.yes_ask) {
884
- price = market.yes_ask / 100;
885
- }
886
- &nbsp;
887
- // Extract candidate name
888
- let candidateName: string | null = null;
889
- if (market.subtitle || market.yes_sub_title) {
890
- candidateName = market.subtitle || market.yes_sub_title;
891
- }
892
- &nbsp;
893
- // Calculate 24h change
894
- let priceChange = 0;
895
- if (market.previous_price_dollars !== undefined &amp;&amp; market.last_price_dollars !== undefined) {
896
- priceChange = market.last_price_dollars - market.previous_price_dollars;
897
- }
898
- &nbsp;
899
- const outcomes: MarketOutcome[] = [
900
- {
901
- id: 'yes',
902
- label: candidateName || 'Yes',
903
- price: price,
904
- priceChange24h: priceChange
905
- },
906
- {
907
- id: 'no',
908
- label: candidateName ? `Not ${candidateName}` : 'No',
909
- price: 1 - price,
910
- priceChange24h: -priceChange // Inverse change for No? simplified assumption
911
- }
912
- ];
913
- &nbsp;
914
- return {
915
- id: market.ticker,
916
- title: event.title,
917
- description: event.sub_title || market.subtitle || "",
918
- outcomes: outcomes,
919
- resolutionDate: new Date(market.expiration_time),
920
- volume24h: Number(market.volume_24h || market.volume || 0),
921
- volume: Number(market.volume || 0),
922
- liquidity: Number(market.liquidity || 0), // Kalshi 'liquidity' might need specific mapping if available, otherwise 0 to avoid conflation
923
- openInterest: Number(market.open_interest || 0),
924
- url: `https://kalshi.com/events/${event.event_ticker}`,
925
- category: event.category,
926
- tags: event.tags || []
927
- };
928
- }
929
- &nbsp;
930
- async searchMarkets(query: string, params?: MarketFilterParams): Promise&lt;UnifiedMarket[]&gt; {
931
- // We must fetch ALL markets to search them locally since we don't have server-side search
932
- const fetchLimit = 100000;
933
- try {
934
- const markets = await this.fetchMarkets({ ...params, limit: fetchLimit });
935
- const lowerQuery = query.toLowerCase();
936
- const filtered = markets.filter(market =&gt;
937
- market.title.toLowerCase().includes(lowerQuery) ||
938
- market.description.toLowerCase().includes(lowerQuery)
939
- );
940
- const limit = params?.limit || 20;
941
- return filtered.slice(0, limit);
942
- } catch (error) {
943
- <span class="cstat-no" title="statement not covered" > console.error("Error searching Kalshi data:", error);</span>
944
- <span class="cstat-no" title="statement not covered" > return [];</span>
945
- }
946
- }
947
- &nbsp;
948
- /**
949
- * Fetch specific markets by their event ticker.
950
- * Useful for looking up a specific event from a URL.
951
- * @param eventTicker - The event ticker (e.g. "FED-25JAN" or "PRES-2024")
952
- */
953
- async getMarketsBySlug(eventTicker: string): Promise&lt;UnifiedMarket[]&gt; {
954
- try {
955
- // Kalshi API expects uppercase tickers, but URLs use lowercase
956
- const normalizedTicker = eventTicker.toUpperCase();
957
- const url = `https://api.elections.kalshi.com/trade-api/v2/events/${normalizedTicker}`;
958
- const response = await axios.get(url, {
959
- params: { with_nested_markets: true }
960
- });
961
- &nbsp;
962
- const event = <span class="cstat-no" title="statement not covered" >response.data.event;</span>
963
- <span class="cstat-no" title="statement not covered" > if (!event) <span class="cstat-no" title="statement not covered" >return [];</span></span>
964
- &nbsp;
965
- const unifiedMarkets: UnifiedMarket[] = <span class="cstat-no" title="statement not covered" >[];</span>
966
- const markets = <span class="cstat-no" title="statement not covered" >event.markets || [];</span>
967
- &nbsp;
968
- <span class="cstat-no" title="statement not covered" > for (const market of markets) {</span>
969
- const unifiedMarket = <span class="cstat-no" title="statement not covered" >this.mapMarketToUnified(event, market);</span>
970
- <span class="cstat-no" title="statement not covered" > if (unifiedMarket) {</span>
971
- <span class="cstat-no" title="statement not covered" > unifiedMarkets.push(unifiedMarket);</span>
972
- }
973
- }
974
- &nbsp;
975
- <span class="cstat-no" title="statement not covered" > return unifiedMarkets;</span>
976
- &nbsp;
977
- } catch (error: any) {
978
- <span class="missing-if-branch" title="else path not taken" >E</span>if (axios.isAxiosError(error) &amp;&amp; error.response) {
979
- if (error.response.status === 404) {
980
- throw new Error(`Kalshi event not found: "${eventTicker}". Check that the event ticker is correct.`);
981
- }
982
- const apiError = error.response.data?.error || <span class="branch-1 cbranch-no" title="branch not covered" >error.response.data?.message </span>|| <span class="branch-2 cbranch-no" title="branch not covered" >"Unknown API Error";</span>
983
- throw new Error(`Kalshi API Error (${error.response.status}): ${apiError}. Event Ticker: ${eventTicker}`);
984
- }
985
- <span class="cstat-no" title="statement not covered" > console.error(`Unexpected error fetching Kalshi event ${eventTicker}:`, error);</span>
986
- <span class="cstat-no" title="statement not covered" > throw error;</span>
987
- }
988
- }
989
- &nbsp;
990
- private mapIntervalToKalshi(interval: CandleInterval): number {
991
- const mapping: Record&lt;CandleInterval, number&gt; = {
992
- '1m': 1,
993
- '5m': 1,
994
- '15m': 1,
995
- '1h': 60,
996
- '6h': 60,
997
- '1d': 1440
998
- };
999
- return mapping[interval];
1000
- }
1001
- &nbsp;
1002
- async getMarketHistory(id: string, params: HistoryFilterParams): Promise&lt;PriceCandle[]&gt; {
1003
- try {
1004
- // Kalshi API expects uppercase tickers
1005
- const normalizedId = id.toUpperCase();
1006
- const interval = this.mapIntervalToKalshi(params.resolution);
1007
- &nbsp;
1008
- // Heuristic for series_ticker
1009
- const parts = normalizedId.split('-');
1010
- if (parts.length &lt; 2) {
1011
- throw new Error(`Invalid Kalshi Ticker format: "${id}". Expected format like "FED-25JAN29-B4.75".`);
1012
- }
1013
- const seriesTicker = parts.slice(0, -1).join('-');
1014
- const url = `https://api.elections.kalshi.com/trade-api/v2/series/${seriesTicker}/markets/${normalizedId}/candlesticks`;
1015
- &nbsp;
1016
- const queryParams: any = { period_interval: interval };
1017
- &nbsp;
1018
- const now = Math.floor(Date.now() / 1000);
1019
- let startTs = now - (24 * 60 * 60);
1020
- let endTs = now;
1021
- &nbsp;
1022
- if (params.start) {
1023
- startTs = Math.floor(params.start.getTime() / 1000);
1024
- }
1025
- if (params.end) {
1026
- endTs = Math.floor(params.end.getTime() / 1000);
1027
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!params.start) {
1028
- <span class="cstat-no" title="statement not covered" > startTs = endTs - (24 * 60 * 60);</span>
1029
- }
1030
- }
1031
- &nbsp;
1032
- queryParams.start_ts = startTs;
1033
- queryParams.end_ts = endTs;
1034
- &nbsp;
1035
- const response = await axios.get(url, { params: queryParams });
1036
- const candles = response.data.candlesticks || <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
1037
- &nbsp;
1038
- const mappedCandles: PriceCandle[] = candles.map((c: any) =&gt; ({
1039
- timestamp: c.end_period_ts * 1000,
1040
- open: (c.price.open || 0) / 100,
1041
- high: (c.price.high || 0) / 100,
1042
- low: (c.price.low || 0) / 100,
1043
- close: (c.price.close || 0) / 100,
1044
- volume: c.volume
1045
- }));
1046
- &nbsp;
1047
- if (params.limit &amp;&amp; mappedCandles.length &gt; params.limit) {
1048
- return mappedCandles.slice(-params.limit);
1049
- }
1050
- return mappedCandles;
1051
- } catch (error: any) {
1052
- if (axios.isAxiosError(error) &amp;&amp; error.response) {
1053
- const apiError = error.response.data?.error || <span class="branch-1 cbranch-no" title="branch not covered" >error.response.data?.message </span>|| <span class="branch-2 cbranch-no" title="branch not covered" >"Unknown API Error";</span>
1054
- throw new Error(`Kalshi History API Error (${error.response.status}): ${apiError}. Used Ticker: ${id}`);
1055
- }
1056
- console.error(`Unexpected error fetching Kalshi history for ${id}:`, error);
1057
- throw error;
1058
- }
1059
- }
1060
- &nbsp;
1061
- async getOrderBook(id: string): Promise&lt;OrderBook&gt; {
1062
- try {
1063
- const url = `https://api.elections.kalshi.com/trade-api/v2/markets/${id}/orderbook`;
1064
- const response = await axios.get(url);
1065
- const data = response.data.orderbook;
1066
- &nbsp;
1067
- // Structure: { yes: [[price, qty], ...], no: [[price, qty], ...] }
1068
- const bids = (data.yes || []).map((level: number[]) =&gt; ({
1069
- price: level[0] / 100,
1070
- size: level[1]
1071
- }));
1072
- &nbsp;
1073
- const asks = (data.no || []).map((level: number[]) =&gt; ({
1074
- price: (100 - level[0]) / 100,
1075
- size: level[1]
1076
- }));
1077
- &nbsp;
1078
- // Sort bids desc, asks asc
1079
- bids.sort((a: any, b: any) =&gt; b.price - a.price);
1080
- asks.sort((a: any, b: any) =&gt; a.price - b.price);
1081
- &nbsp;
1082
- return { bids, asks, timestamp: Date.now() };
1083
- } catch (error) {
1084
- console.error(`Error fetching Kalshi orderbook for ${id}:`, error);
1085
- return { bids: [], asks: [] };
1086
- }
1087
- }
1088
- &nbsp;
1089
- async getTradeHistory(id: string, params: HistoryFilterParams): Promise&lt;Trade[]&gt; {
1090
- try {
1091
- const url = `https://api.elections.kalshi.com/trade-api/v2/markets/trades`;
1092
- const response = await axios.get(url, {
1093
- params: {
1094
- ticker: id,
1095
- limit: params.limit || 100
1096
- }
1097
- });
1098
- const trades = <span class="cstat-no" title="statement not covered" >response.data.trades || [];</span>
1099
- &nbsp;
1100
- <span class="cstat-no" title="statement not covered" > return trades.map(<span class="fstat-no" title="function not covered" >(t</span>: any) =&gt; (<span class="cstat-no" title="statement not covered" >{</span></span>
1101
- id: t.trade_id,
1102
- timestamp: new Date(t.created_time).getTime(),
1103
- price: t.yes_price / 100,
1104
- amount: t.count,
1105
- side: t.taker_side === 'yes' ? 'buy' : 'sell'
1106
- }));
1107
- } catch (error) {
1108
- console.error(`Error fetching Kalshi trades for ${id}:`, error);
1109
- return [];
1110
- }
1111
- }
1112
- }
1113
- &nbsp;</pre></td></tr></table></pre>
1114
-
1115
- <div class='push'></div><!-- for sticky footer -->
1116
- </div><!-- /wrapper -->
1117
- <div class='footer quiet pad2 space-top1 center small'>
1118
- Code coverage generated by
1119
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1120
- at 2026-01-08T19:42:57.093Z
1121
- </div>
1122
- <script src="../../prettify.js"></script>
1123
- <script>
1124
- window.onload = function () {
1125
- prettyPrint();
1126
- };
1127
- </script>
1128
- <script src="../../sorter.js"></script>
1129
- <script src="../../block-navigation.js"></script>
1130
- </body>
1131
- </html>
1132
-