@stream-io/video-client 0.0.1-alpha.10

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 (222) hide show
  1. package/LICENSE +219 -0
  2. package/README.md +14 -0
  3. package/coverage/lcov-report/base.css +224 -0
  4. package/coverage/lcov-report/block-navigation.js +87 -0
  5. package/coverage/lcov-report/favicon.png +0 -0
  6. package/coverage/lcov-report/index.html +296 -0
  7. package/coverage/lcov-report/prettify.css +1 -0
  8. package/coverage/lcov-report/prettify.js +2 -0
  9. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  10. package/coverage/lcov-report/sorter.js +196 -0
  11. package/coverage/lcov-report/src/Batcher.ts.html +214 -0
  12. package/coverage/lcov-report/src/CallDropScheduler.ts.html +661 -0
  13. package/coverage/lcov-report/src/StreamSfuClient.ts.html +640 -0
  14. package/coverage/lcov-report/src/StreamVideoClient.ts.html +1594 -0
  15. package/coverage/lcov-report/src/config/defaultConfigs.ts.html +130 -0
  16. package/coverage/lcov-report/src/config/index.html +116 -0
  17. package/coverage/lcov-report/src/coordinator/StreamCoordinatorClient.ts.html +430 -0
  18. package/coverage/lcov-report/src/coordinator/connection/base64.ts.html +325 -0
  19. package/coverage/lcov-report/src/coordinator/connection/client.ts.html +2527 -0
  20. package/coverage/lcov-report/src/coordinator/connection/connection.ts.html +2335 -0
  21. package/coverage/lcov-report/src/coordinator/connection/connection_fallback.ts.html +802 -0
  22. package/coverage/lcov-report/src/coordinator/connection/errors.ts.html +295 -0
  23. package/coverage/lcov-report/src/coordinator/connection/index.html +251 -0
  24. package/coverage/lcov-report/src/coordinator/connection/insights.ts.html +349 -0
  25. package/coverage/lcov-report/src/coordinator/connection/signing.ts.html +397 -0
  26. package/coverage/lcov-report/src/coordinator/connection/token_manager.ts.html +565 -0
  27. package/coverage/lcov-report/src/coordinator/connection/types.ts.html +418 -0
  28. package/coverage/lcov-report/src/coordinator/connection/utils.ts.html +529 -0
  29. package/coverage/lcov-report/src/coordinator/index.html +116 -0
  30. package/coverage/lcov-report/src/events/call.ts.html +583 -0
  31. package/coverage/lcov-report/src/events/index.html +161 -0
  32. package/coverage/lcov-report/src/events/internal.ts.html +226 -0
  33. package/coverage/lcov-report/src/events/participant.ts.html +376 -0
  34. package/coverage/lcov-report/src/events/speaker.ts.html +271 -0
  35. package/coverage/lcov-report/src/gen/google/protobuf/index.html +131 -0
  36. package/coverage/lcov-report/src/gen/google/protobuf/struct.ts.html +1528 -0
  37. package/coverage/lcov-report/src/gen/google/protobuf/timestamp.ts.html +958 -0
  38. package/coverage/lcov-report/src/gen/video/sfu/event/events.ts.html +5971 -0
  39. package/coverage/lcov-report/src/gen/video/sfu/event/index.html +116 -0
  40. package/coverage/lcov-report/src/gen/video/sfu/models/index.html +116 -0
  41. package/coverage/lcov-report/src/gen/video/sfu/models/models.ts.html +3271 -0
  42. package/coverage/lcov-report/src/index.html +161 -0
  43. package/coverage/lcov-report/src/rpc/index.html +131 -0
  44. package/coverage/lcov-report/src/rpc/index.ts.html +91 -0
  45. package/coverage/lcov-report/src/rpc/latency.ts.html +214 -0
  46. package/coverage/lcov-report/src/rtc/Call.ts.html +1840 -0
  47. package/coverage/lcov-report/src/rtc/CallMetadata.ts.html +157 -0
  48. package/coverage/lcov-report/src/rtc/Dispatcher.ts.html +223 -0
  49. package/coverage/lcov-report/src/rtc/IceTrickleBuffer.ts.html +148 -0
  50. package/coverage/lcov-report/src/rtc/callEventHandlers.ts.html +196 -0
  51. package/coverage/lcov-report/src/rtc/codecs.ts.html +268 -0
  52. package/coverage/lcov-report/src/rtc/helpers/iceCandidate.ts.html +133 -0
  53. package/coverage/lcov-report/src/rtc/helpers/index.html +131 -0
  54. package/coverage/lcov-report/src/rtc/helpers/tracks.ts.html +139 -0
  55. package/coverage/lcov-report/src/rtc/index.html +251 -0
  56. package/coverage/lcov-report/src/rtc/publisher.ts.html +1000 -0
  57. package/coverage/lcov-report/src/rtc/signal.ts.html +187 -0
  58. package/coverage/lcov-report/src/rtc/subscriber.ts.html +340 -0
  59. package/coverage/lcov-report/src/rtc/videoLayers.ts.html +394 -0
  60. package/coverage/lcov-report/src/stats/index.html +116 -0
  61. package/coverage/lcov-report/src/stats/state-store-stats-reporter.ts.html +1177 -0
  62. package/coverage/lcov-report/src/store/index.html +146 -0
  63. package/coverage/lcov-report/src/store/index.ts.html +91 -0
  64. package/coverage/lcov-report/src/store/rxUtils.ts.html +211 -0
  65. package/coverage/lcov-report/src/store/stateStore.ts.html +1108 -0
  66. package/coverage/lcov.info +11463 -0
  67. package/coverage/tmp/coverage-2131-1675959950516-2.json +1 -0
  68. package/dist/index.d.ts +18 -0
  69. package/dist/index.js +8636 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/src/Batcher.d.ts +12 -0
  72. package/dist/src/CallDropScheduler.d.ts +44 -0
  73. package/dist/src/StreamSfuClient.d.ts +25 -0
  74. package/dist/src/StreamVideoClient.d.ts +145 -0
  75. package/dist/src/__tests__/StreamVideoClient.test.d.ts +1 -0
  76. package/dist/src/config/defaultConfigs.d.ts +2 -0
  77. package/dist/src/config/types.d.ts +29 -0
  78. package/dist/src/coordinator/StreamCoordinatorClient.d.ts +19 -0
  79. package/dist/src/coordinator/connection/base64.d.ts +2 -0
  80. package/dist/src/coordinator/connection/client.d.ts +174 -0
  81. package/dist/src/coordinator/connection/connection.d.ts +139 -0
  82. package/dist/src/coordinator/connection/connection_fallback.d.ts +38 -0
  83. package/dist/src/coordinator/connection/errors.d.ts +16 -0
  84. package/dist/src/coordinator/connection/events.d.ts +10 -0
  85. package/dist/src/coordinator/connection/insights.d.ts +58 -0
  86. package/dist/src/coordinator/connection/signing.d.ts +30 -0
  87. package/dist/src/coordinator/connection/token_manager.d.ts +39 -0
  88. package/dist/src/coordinator/connection/types.d.ts +87 -0
  89. package/dist/src/coordinator/connection/utils.d.ts +25 -0
  90. package/dist/src/devices.d.ts +79 -0
  91. package/dist/src/events/call.d.ts +26 -0
  92. package/dist/src/events/internal.d.ts +8 -0
  93. package/dist/src/events/participant.d.ts +21 -0
  94. package/dist/src/events/speaker.d.ts +10 -0
  95. package/dist/src/gen/coordinator/index.d.ts +1973 -0
  96. package/dist/src/gen/google/protobuf/descriptor.d.ts +1650 -0
  97. package/dist/src/gen/google/protobuf/duration.d.ts +113 -0
  98. package/dist/src/gen/google/protobuf/struct.d.ts +184 -0
  99. package/dist/src/gen/google/protobuf/timestamp.d.ts +158 -0
  100. package/dist/src/gen/video/coordinator/broadcast_v1/broadcast.d.ts +66 -0
  101. package/dist/src/gen/video/coordinator/call_v1/call.d.ts +254 -0
  102. package/dist/src/gen/video/coordinator/client_v1_rpc/client_rpc.client.d.ts +351 -0
  103. package/dist/src/gen/video/coordinator/client_v1_rpc/client_rpc.d.ts +1488 -0
  104. package/dist/src/gen/video/coordinator/client_v1_rpc/envelopes.d.ts +143 -0
  105. package/dist/src/gen/video/coordinator/client_v1_rpc/websocket.d.ts +292 -0
  106. package/dist/src/gen/video/coordinator/edge_v1/edge.d.ts +183 -0
  107. package/dist/src/gen/video/coordinator/event_v1/event.d.ts +411 -0
  108. package/dist/src/gen/video/coordinator/geofence_v1/geofence.d.ts +63 -0
  109. package/dist/src/gen/video/coordinator/member_v1/member.d.ts +59 -0
  110. package/dist/src/gen/video/coordinator/participant_v1/participant.d.ts +103 -0
  111. package/dist/src/gen/video/coordinator/push_v1/push.d.ts +240 -0
  112. package/dist/src/gen/video/coordinator/stat_v1/stat.d.ts +308 -0
  113. package/dist/src/gen/video/coordinator/user_v1/user.d.ts +112 -0
  114. package/dist/src/gen/video/coordinator/utils_v1/utils.d.ts +47 -0
  115. package/dist/src/gen/video/sfu/event/events.d.ts +736 -0
  116. package/dist/src/gen/video/sfu/models/models.d.ts +460 -0
  117. package/dist/src/gen/video/sfu/signal_rpc/signal.client.d.ts +89 -0
  118. package/dist/src/gen/video/sfu/signal_rpc/signal.d.ts +320 -0
  119. package/dist/src/helpers/browsers.d.ts +8 -0
  120. package/dist/src/helpers/sound-detector.d.ts +34 -0
  121. package/dist/src/rpc/createClient.d.ts +10 -0
  122. package/dist/src/rpc/index.d.ts +2 -0
  123. package/dist/src/rpc/latency.d.ts +9 -0
  124. package/dist/src/rtc/Call.d.ts +180 -0
  125. package/dist/src/rtc/CallMetadata.d.ts +9 -0
  126. package/dist/src/rtc/Dispatcher.d.ts +9 -0
  127. package/dist/src/rtc/IceTrickleBuffer.d.ts +11 -0
  128. package/dist/src/rtc/callEventHandlers.d.ts +5 -0
  129. package/dist/src/rtc/codecs.d.ts +2 -0
  130. package/dist/src/rtc/helpers/iceCandidate.d.ts +2 -0
  131. package/dist/src/rtc/helpers/tracks.d.ts +3 -0
  132. package/dist/src/rtc/publisher.d.ts +53 -0
  133. package/dist/src/rtc/signal.d.ts +5 -0
  134. package/dist/src/rtc/subscriber.d.ts +7 -0
  135. package/dist/src/rtc/types.d.ts +84 -0
  136. package/dist/src/rtc/videoLayers.d.ts +17 -0
  137. package/dist/src/stats/coordinator-stats-reporter.d.ts +10 -0
  138. package/dist/src/stats/state-store-stats-reporter.d.ts +57 -0
  139. package/dist/src/stats/types.d.ts +42 -0
  140. package/dist/src/store/index.d.ts +2 -0
  141. package/dist/src/store/rxUtils.d.ts +18 -0
  142. package/dist/src/store/stateStore.d.ts +182 -0
  143. package/generate-openapi.sh +32 -0
  144. package/index.ts +31 -0
  145. package/openapitools.json +7 -0
  146. package/package.json +54 -0
  147. package/rollup.config.mjs +48 -0
  148. package/src/Batcher.ts +43 -0
  149. package/src/CallDropScheduler.ts +192 -0
  150. package/src/StreamSfuClient.ts +185 -0
  151. package/src/StreamVideoClient.ts +503 -0
  152. package/src/__tests__/StreamVideoClient.test.ts +83 -0
  153. package/src/config/defaultConfigs.ts +15 -0
  154. package/src/config/types.ts +30 -0
  155. package/src/coordinator/StreamCoordinatorClient.ts +115 -0
  156. package/src/coordinator/connection/base64.ts +80 -0
  157. package/src/coordinator/connection/client.ts +814 -0
  158. package/src/coordinator/connection/connection.ts +750 -0
  159. package/src/coordinator/connection/connection_fallback.ts +239 -0
  160. package/src/coordinator/connection/errors.ts +70 -0
  161. package/src/coordinator/connection/events.ts +13 -0
  162. package/src/coordinator/connection/insights.ts +88 -0
  163. package/src/coordinator/connection/signing.ts +104 -0
  164. package/src/coordinator/connection/token_manager.ts +160 -0
  165. package/src/coordinator/connection/types.ts +111 -0
  166. package/src/coordinator/connection/utils.ts +148 -0
  167. package/src/devices.ts +266 -0
  168. package/src/events/call.ts +166 -0
  169. package/src/events/internal.ts +47 -0
  170. package/src/events/participant.ts +97 -0
  171. package/src/events/speaker.ts +62 -0
  172. package/src/gen/coordinator/index.ts +1956 -0
  173. package/src/gen/google/protobuf/descriptor.ts +3466 -0
  174. package/src/gen/google/protobuf/duration.ts +232 -0
  175. package/src/gen/google/protobuf/struct.ts +481 -0
  176. package/src/gen/google/protobuf/timestamp.ts +291 -0
  177. package/src/gen/video/coordinator/broadcast_v1/broadcast.ts +154 -0
  178. package/src/gen/video/coordinator/call_v1/call.ts +651 -0
  179. package/src/gen/video/coordinator/client_v1_rpc/client_rpc.client.ts +463 -0
  180. package/src/gen/video/coordinator/client_v1_rpc/client_rpc.ts +3819 -0
  181. package/src/gen/video/coordinator/client_v1_rpc/envelopes.ts +424 -0
  182. package/src/gen/video/coordinator/client_v1_rpc/websocket.ts +719 -0
  183. package/src/gen/video/coordinator/edge_v1/edge.ts +532 -0
  184. package/src/gen/video/coordinator/event_v1/event.ts +1171 -0
  185. package/src/gen/video/coordinator/geofence_v1/geofence.ts +128 -0
  186. package/src/gen/video/coordinator/member_v1/member.ts +138 -0
  187. package/src/gen/video/coordinator/participant_v1/participant.ts +261 -0
  188. package/src/gen/video/coordinator/push_v1/push.ts +651 -0
  189. package/src/gen/video/coordinator/stat_v1/stat.ts +656 -0
  190. package/src/gen/video/coordinator/user_v1/user.ts +277 -0
  191. package/src/gen/video/coordinator/utils_v1/utils.ts +98 -0
  192. package/src/gen/video/sfu/event/events.ts +1962 -0
  193. package/src/gen/video/sfu/models/models.ts +1062 -0
  194. package/src/gen/video/sfu/signal_rpc/signal.client.ts +108 -0
  195. package/src/gen/video/sfu/signal_rpc/signal.ts +906 -0
  196. package/src/helpers/browsers.ts +13 -0
  197. package/src/helpers/sound-detector.ts +85 -0
  198. package/src/rpc/createClient.ts +50 -0
  199. package/src/rpc/index.ts +2 -0
  200. package/src/rpc/latency.ts +43 -0
  201. package/src/rtc/Call.ts +585 -0
  202. package/src/rtc/CallMetadata.ts +24 -0
  203. package/src/rtc/Dispatcher.ts +46 -0
  204. package/src/rtc/IceTrickleBuffer.ts +21 -0
  205. package/src/rtc/callEventHandlers.ts +37 -0
  206. package/src/rtc/codecs.ts +61 -0
  207. package/src/rtc/helpers/iceCandidate.ts +16 -0
  208. package/src/rtc/helpers/tracks.ts +18 -0
  209. package/src/rtc/publisher.ts +305 -0
  210. package/src/rtc/signal.ts +34 -0
  211. package/src/rtc/subscriber.ts +85 -0
  212. package/src/rtc/types.ts +105 -0
  213. package/src/rtc/videoLayers.ts +103 -0
  214. package/src/stats/coordinator-stats-reporter.ts +167 -0
  215. package/src/stats/state-store-stats-reporter.ts +364 -0
  216. package/src/stats/types.ts +46 -0
  217. package/src/store/index.ts +2 -0
  218. package/src/store/rxUtils.ts +42 -0
  219. package/src/store/stateStore.ts +341 -0
  220. package/tsconfig.json +25 -0
  221. package/typedoc.json +11 -0
  222. package/vite.config.ts +11 -0
@@ -0,0 +1,1840 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/rtc/Call.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/rtc</a> Call.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">5.98% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>35/585</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">0% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/1</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">0% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>0/2</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">5.98% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>35/585</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 oninput="onInput()" type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line low'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
652
+ <span class="cline-any cline-yes">1x</span>
653
+ <span class="cline-any cline-yes">1x</span>
654
+ <span class="cline-any cline-yes">1x</span>
655
+ <span class="cline-any cline-yes">1x</span>
656
+ <span class="cline-any cline-yes">1x</span>
657
+ <span class="cline-any cline-yes">1x</span>
658
+ <span class="cline-any cline-yes">1x</span>
659
+ <span class="cline-any cline-yes">1x</span>
660
+ <span class="cline-any cline-yes">1x</span>
661
+ <span class="cline-any cline-yes">1x</span>
662
+ <span class="cline-any cline-yes">1x</span>
663
+ <span class="cline-any cline-yes">1x</span>
664
+ <span class="cline-any cline-yes">1x</span>
665
+ <span class="cline-any cline-yes">1x</span>
666
+ <span class="cline-any cline-yes">1x</span>
667
+ <span class="cline-any cline-yes">1x</span>
668
+ <span class="cline-any cline-yes">1x</span>
669
+ <span class="cline-any cline-yes">1x</span>
670
+ <span class="cline-any cline-yes">1x</span>
671
+ <span class="cline-any cline-yes">1x</span>
672
+ <span class="cline-any cline-yes">1x</span>
673
+ <span class="cline-any cline-yes">1x</span>
674
+ <span class="cline-any cline-yes">1x</span>
675
+ <span class="cline-any cline-yes">1x</span>
676
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
680
+ <span class="cline-any cline-yes">1x</span>
681
+ <span class="cline-any cline-yes">1x</span>
682
+ <span class="cline-any cline-yes">1x</span>
683
+ <span class="cline-any cline-yes">1x</span>
684
+ <span class="cline-any cline-yes">1x</span>
685
+ <span class="cline-any cline-yes">1x</span>
686
+ <span class="cline-any cline-no">&nbsp;</span>
687
+ <span class="cline-any cline-no">&nbsp;</span>
688
+ <span class="cline-any cline-no">&nbsp;</span>
689
+ <span class="cline-any cline-no">&nbsp;</span>
690
+ <span class="cline-any cline-no">&nbsp;</span>
691
+ <span class="cline-any cline-no">&nbsp;</span>
692
+ <span class="cline-any cline-no">&nbsp;</span>
693
+ <span class="cline-any cline-no">&nbsp;</span>
694
+ <span class="cline-any cline-no">&nbsp;</span>
695
+ <span class="cline-any cline-no">&nbsp;</span>
696
+ <span class="cline-any cline-no">&nbsp;</span>
697
+ <span class="cline-any cline-no">&nbsp;</span>
698
+ <span class="cline-any cline-no">&nbsp;</span>
699
+ <span class="cline-any cline-no">&nbsp;</span>
700
+ <span class="cline-any cline-no">&nbsp;</span>
701
+ <span class="cline-any cline-no">&nbsp;</span>
702
+ <span class="cline-any cline-no">&nbsp;</span>
703
+ <span class="cline-any cline-no">&nbsp;</span>
704
+ <span class="cline-any cline-no">&nbsp;</span>
705
+ <span class="cline-any cline-no">&nbsp;</span>
706
+ <span class="cline-any cline-no">&nbsp;</span>
707
+ <span class="cline-any cline-no">&nbsp;</span>
708
+ <span class="cline-any cline-no">&nbsp;</span>
709
+ <span class="cline-any cline-no">&nbsp;</span>
710
+ <span class="cline-any cline-no">&nbsp;</span>
711
+ <span class="cline-any cline-no">&nbsp;</span>
712
+ <span class="cline-any cline-no">&nbsp;</span>
713
+ <span class="cline-any cline-no">&nbsp;</span>
714
+ <span class="cline-any cline-no">&nbsp;</span>
715
+ <span class="cline-any cline-no">&nbsp;</span>
716
+ <span class="cline-any cline-no">&nbsp;</span>
717
+ <span class="cline-any cline-no">&nbsp;</span>
718
+ <span class="cline-any cline-no">&nbsp;</span>
719
+ <span class="cline-any cline-no">&nbsp;</span>
720
+ <span class="cline-any cline-no">&nbsp;</span>
721
+ <span class="cline-any cline-no">&nbsp;</span>
722
+ <span class="cline-any cline-no">&nbsp;</span>
723
+ <span class="cline-any cline-no">&nbsp;</span>
724
+ <span class="cline-any cline-no">&nbsp;</span>
725
+ <span class="cline-any cline-no">&nbsp;</span>
726
+ <span class="cline-any cline-no">&nbsp;</span>
727
+ <span class="cline-any cline-no">&nbsp;</span>
728
+ <span class="cline-any cline-no">&nbsp;</span>
729
+ <span class="cline-any cline-no">&nbsp;</span>
730
+ <span class="cline-any cline-no">&nbsp;</span>
731
+ <span class="cline-any cline-no">&nbsp;</span>
732
+ <span class="cline-any cline-no">&nbsp;</span>
733
+ <span class="cline-any cline-no">&nbsp;</span>
734
+ <span class="cline-any cline-no">&nbsp;</span>
735
+ <span class="cline-any cline-no">&nbsp;</span>
736
+ <span class="cline-any cline-no">&nbsp;</span>
737
+ <span class="cline-any cline-no">&nbsp;</span>
738
+ <span class="cline-any cline-no">&nbsp;</span>
739
+ <span class="cline-any cline-no">&nbsp;</span>
740
+ <span class="cline-any cline-no">&nbsp;</span>
741
+ <span class="cline-any cline-no">&nbsp;</span>
742
+ <span class="cline-any cline-no">&nbsp;</span>
743
+ <span class="cline-any cline-no">&nbsp;</span>
744
+ <span class="cline-any cline-no">&nbsp;</span>
745
+ <span class="cline-any cline-no">&nbsp;</span>
746
+ <span class="cline-any cline-no">&nbsp;</span>
747
+ <span class="cline-any cline-no">&nbsp;</span>
748
+ <span class="cline-any cline-no">&nbsp;</span>
749
+ <span class="cline-any cline-no">&nbsp;</span>
750
+ <span class="cline-any cline-no">&nbsp;</span>
751
+ <span class="cline-any cline-no">&nbsp;</span>
752
+ <span class="cline-any cline-no">&nbsp;</span>
753
+ <span class="cline-any cline-no">&nbsp;</span>
754
+ <span class="cline-any cline-no">&nbsp;</span>
755
+ <span class="cline-any cline-no">&nbsp;</span>
756
+ <span class="cline-any cline-no">&nbsp;</span>
757
+ <span class="cline-any cline-no">&nbsp;</span>
758
+ <span class="cline-any cline-no">&nbsp;</span>
759
+ <span class="cline-any cline-no">&nbsp;</span>
760
+ <span class="cline-any cline-no">&nbsp;</span>
761
+ <span class="cline-any cline-no">&nbsp;</span>
762
+ <span class="cline-any cline-no">&nbsp;</span>
763
+ <span class="cline-any cline-no">&nbsp;</span>
764
+ <span class="cline-any cline-no">&nbsp;</span>
765
+ <span class="cline-any cline-no">&nbsp;</span>
766
+ <span class="cline-any cline-no">&nbsp;</span>
767
+ <span class="cline-any cline-no">&nbsp;</span>
768
+ <span class="cline-any cline-no">&nbsp;</span>
769
+ <span class="cline-any cline-no">&nbsp;</span>
770
+ <span class="cline-any cline-no">&nbsp;</span>
771
+ <span class="cline-any cline-no">&nbsp;</span>
772
+ <span class="cline-any cline-no">&nbsp;</span>
773
+ <span class="cline-any cline-no">&nbsp;</span>
774
+ <span class="cline-any cline-no">&nbsp;</span>
775
+ <span class="cline-any cline-no">&nbsp;</span>
776
+ <span class="cline-any cline-no">&nbsp;</span>
777
+ <span class="cline-any cline-no">&nbsp;</span>
778
+ <span class="cline-any cline-no">&nbsp;</span>
779
+ <span class="cline-any cline-no">&nbsp;</span>
780
+ <span class="cline-any cline-no">&nbsp;</span>
781
+ <span class="cline-any cline-no">&nbsp;</span>
782
+ <span class="cline-any cline-no">&nbsp;</span>
783
+ <span class="cline-any cline-no">&nbsp;</span>
784
+ <span class="cline-any cline-no">&nbsp;</span>
785
+ <span class="cline-any cline-no">&nbsp;</span>
786
+ <span class="cline-any cline-no">&nbsp;</span>
787
+ <span class="cline-any cline-no">&nbsp;</span>
788
+ <span class="cline-any cline-no">&nbsp;</span>
789
+ <span class="cline-any cline-no">&nbsp;</span>
790
+ <span class="cline-any cline-no">&nbsp;</span>
791
+ <span class="cline-any cline-no">&nbsp;</span>
792
+ <span class="cline-any cline-no">&nbsp;</span>
793
+ <span class="cline-any cline-no">&nbsp;</span>
794
+ <span class="cline-any cline-no">&nbsp;</span>
795
+ <span class="cline-any cline-no">&nbsp;</span>
796
+ <span class="cline-any cline-no">&nbsp;</span>
797
+ <span class="cline-any cline-no">&nbsp;</span>
798
+ <span class="cline-any cline-no">&nbsp;</span>
799
+ <span class="cline-any cline-no">&nbsp;</span>
800
+ <span class="cline-any cline-no">&nbsp;</span>
801
+ <span class="cline-any cline-no">&nbsp;</span>
802
+ <span class="cline-any cline-no">&nbsp;</span>
803
+ <span class="cline-any cline-no">&nbsp;</span>
804
+ <span class="cline-any cline-no">&nbsp;</span>
805
+ <span class="cline-any cline-no">&nbsp;</span>
806
+ <span class="cline-any cline-no">&nbsp;</span>
807
+ <span class="cline-any cline-no">&nbsp;</span>
808
+ <span class="cline-any cline-no">&nbsp;</span>
809
+ <span class="cline-any cline-no">&nbsp;</span>
810
+ <span class="cline-any cline-no">&nbsp;</span>
811
+ <span class="cline-any cline-no">&nbsp;</span>
812
+ <span class="cline-any cline-no">&nbsp;</span>
813
+ <span class="cline-any cline-no">&nbsp;</span>
814
+ <span class="cline-any cline-no">&nbsp;</span>
815
+ <span class="cline-any cline-no">&nbsp;</span>
816
+ <span class="cline-any cline-no">&nbsp;</span>
817
+ <span class="cline-any cline-no">&nbsp;</span>
818
+ <span class="cline-any cline-no">&nbsp;</span>
819
+ <span class="cline-any cline-no">&nbsp;</span>
820
+ <span class="cline-any cline-no">&nbsp;</span>
821
+ <span class="cline-any cline-no">&nbsp;</span>
822
+ <span class="cline-any cline-no">&nbsp;</span>
823
+ <span class="cline-any cline-no">&nbsp;</span>
824
+ <span class="cline-any cline-no">&nbsp;</span>
825
+ <span class="cline-any cline-no">&nbsp;</span>
826
+ <span class="cline-any cline-no">&nbsp;</span>
827
+ <span class="cline-any cline-no">&nbsp;</span>
828
+ <span class="cline-any cline-no">&nbsp;</span>
829
+ <span class="cline-any cline-no">&nbsp;</span>
830
+ <span class="cline-any cline-no">&nbsp;</span>
831
+ <span class="cline-any cline-no">&nbsp;</span>
832
+ <span class="cline-any cline-no">&nbsp;</span>
833
+ <span class="cline-any cline-no">&nbsp;</span>
834
+ <span class="cline-any cline-no">&nbsp;</span>
835
+ <span class="cline-any cline-no">&nbsp;</span>
836
+ <span class="cline-any cline-no">&nbsp;</span>
837
+ <span class="cline-any cline-no">&nbsp;</span>
838
+ <span class="cline-any cline-no">&nbsp;</span>
839
+ <span class="cline-any cline-no">&nbsp;</span>
840
+ <span class="cline-any cline-no">&nbsp;</span>
841
+ <span class="cline-any cline-no">&nbsp;</span>
842
+ <span class="cline-any cline-no">&nbsp;</span>
843
+ <span class="cline-any cline-no">&nbsp;</span>
844
+ <span class="cline-any cline-no">&nbsp;</span>
845
+ <span class="cline-any cline-no">&nbsp;</span>
846
+ <span class="cline-any cline-no">&nbsp;</span>
847
+ <span class="cline-any cline-no">&nbsp;</span>
848
+ <span class="cline-any cline-no">&nbsp;</span>
849
+ <span class="cline-any cline-no">&nbsp;</span>
850
+ <span class="cline-any cline-no">&nbsp;</span>
851
+ <span class="cline-any cline-no">&nbsp;</span>
852
+ <span class="cline-any cline-no">&nbsp;</span>
853
+ <span class="cline-any cline-no">&nbsp;</span>
854
+ <span class="cline-any cline-no">&nbsp;</span>
855
+ <span class="cline-any cline-no">&nbsp;</span>
856
+ <span class="cline-any cline-no">&nbsp;</span>
857
+ <span class="cline-any cline-no">&nbsp;</span>
858
+ <span class="cline-any cline-no">&nbsp;</span>
859
+ <span class="cline-any cline-no">&nbsp;</span>
860
+ <span class="cline-any cline-no">&nbsp;</span>
861
+ <span class="cline-any cline-no">&nbsp;</span>
862
+ <span class="cline-any cline-no">&nbsp;</span>
863
+ <span class="cline-any cline-no">&nbsp;</span>
864
+ <span class="cline-any cline-no">&nbsp;</span>
865
+ <span class="cline-any cline-no">&nbsp;</span>
866
+ <span class="cline-any cline-no">&nbsp;</span>
867
+ <span class="cline-any cline-no">&nbsp;</span>
868
+ <span class="cline-any cline-no">&nbsp;</span>
869
+ <span class="cline-any cline-no">&nbsp;</span>
870
+ <span class="cline-any cline-no">&nbsp;</span>
871
+ <span class="cline-any cline-no">&nbsp;</span>
872
+ <span class="cline-any cline-no">&nbsp;</span>
873
+ <span class="cline-any cline-no">&nbsp;</span>
874
+ <span class="cline-any cline-no">&nbsp;</span>
875
+ <span class="cline-any cline-no">&nbsp;</span>
876
+ <span class="cline-any cline-no">&nbsp;</span>
877
+ <span class="cline-any cline-no">&nbsp;</span>
878
+ <span class="cline-any cline-no">&nbsp;</span>
879
+ <span class="cline-any cline-no">&nbsp;</span>
880
+ <span class="cline-any cline-no">&nbsp;</span>
881
+ <span class="cline-any cline-no">&nbsp;</span>
882
+ <span class="cline-any cline-no">&nbsp;</span>
883
+ <span class="cline-any cline-no">&nbsp;</span>
884
+ <span class="cline-any cline-no">&nbsp;</span>
885
+ <span class="cline-any cline-no">&nbsp;</span>
886
+ <span class="cline-any cline-no">&nbsp;</span>
887
+ <span class="cline-any cline-no">&nbsp;</span>
888
+ <span class="cline-any cline-no">&nbsp;</span>
889
+ <span class="cline-any cline-no">&nbsp;</span>
890
+ <span class="cline-any cline-no">&nbsp;</span>
891
+ <span class="cline-any cline-no">&nbsp;</span>
892
+ <span class="cline-any cline-no">&nbsp;</span>
893
+ <span class="cline-any cline-no">&nbsp;</span>
894
+ <span class="cline-any cline-no">&nbsp;</span>
895
+ <span class="cline-any cline-no">&nbsp;</span>
896
+ <span class="cline-any cline-no">&nbsp;</span>
897
+ <span class="cline-any cline-no">&nbsp;</span>
898
+ <span class="cline-any cline-no">&nbsp;</span>
899
+ <span class="cline-any cline-no">&nbsp;</span>
900
+ <span class="cline-any cline-no">&nbsp;</span>
901
+ <span class="cline-any cline-no">&nbsp;</span>
902
+ <span class="cline-any cline-no">&nbsp;</span>
903
+ <span class="cline-any cline-no">&nbsp;</span>
904
+ <span class="cline-any cline-no">&nbsp;</span>
905
+ <span class="cline-any cline-no">&nbsp;</span>
906
+ <span class="cline-any cline-no">&nbsp;</span>
907
+ <span class="cline-any cline-no">&nbsp;</span>
908
+ <span class="cline-any cline-no">&nbsp;</span>
909
+ <span class="cline-any cline-no">&nbsp;</span>
910
+ <span class="cline-any cline-no">&nbsp;</span>
911
+ <span class="cline-any cline-no">&nbsp;</span>
912
+ <span class="cline-any cline-no">&nbsp;</span>
913
+ <span class="cline-any cline-no">&nbsp;</span>
914
+ <span class="cline-any cline-no">&nbsp;</span>
915
+ <span class="cline-any cline-no">&nbsp;</span>
916
+ <span class="cline-any cline-no">&nbsp;</span>
917
+ <span class="cline-any cline-no">&nbsp;</span>
918
+ <span class="cline-any cline-no">&nbsp;</span>
919
+ <span class="cline-any cline-no">&nbsp;</span>
920
+ <span class="cline-any cline-no">&nbsp;</span>
921
+ <span class="cline-any cline-no">&nbsp;</span>
922
+ <span class="cline-any cline-no">&nbsp;</span>
923
+ <span class="cline-any cline-no">&nbsp;</span>
924
+ <span class="cline-any cline-no">&nbsp;</span>
925
+ <span class="cline-any cline-no">&nbsp;</span>
926
+ <span class="cline-any cline-no">&nbsp;</span>
927
+ <span class="cline-any cline-no">&nbsp;</span>
928
+ <span class="cline-any cline-no">&nbsp;</span>
929
+ <span class="cline-any cline-no">&nbsp;</span>
930
+ <span class="cline-any cline-no">&nbsp;</span>
931
+ <span class="cline-any cline-no">&nbsp;</span>
932
+ <span class="cline-any cline-no">&nbsp;</span>
933
+ <span class="cline-any cline-no">&nbsp;</span>
934
+ <span class="cline-any cline-no">&nbsp;</span>
935
+ <span class="cline-any cline-no">&nbsp;</span>
936
+ <span class="cline-any cline-no">&nbsp;</span>
937
+ <span class="cline-any cline-no">&nbsp;</span>
938
+ <span class="cline-any cline-no">&nbsp;</span>
939
+ <span class="cline-any cline-no">&nbsp;</span>
940
+ <span class="cline-any cline-no">&nbsp;</span>
941
+ <span class="cline-any cline-no">&nbsp;</span>
942
+ <span class="cline-any cline-no">&nbsp;</span>
943
+ <span class="cline-any cline-no">&nbsp;</span>
944
+ <span class="cline-any cline-no">&nbsp;</span>
945
+ <span class="cline-any cline-no">&nbsp;</span>
946
+ <span class="cline-any cline-no">&nbsp;</span>
947
+ <span class="cline-any cline-no">&nbsp;</span>
948
+ <span class="cline-any cline-no">&nbsp;</span>
949
+ <span class="cline-any cline-no">&nbsp;</span>
950
+ <span class="cline-any cline-no">&nbsp;</span>
951
+ <span class="cline-any cline-no">&nbsp;</span>
952
+ <span class="cline-any cline-no">&nbsp;</span>
953
+ <span class="cline-any cline-no">&nbsp;</span>
954
+ <span class="cline-any cline-no">&nbsp;</span>
955
+ <span class="cline-any cline-no">&nbsp;</span>
956
+ <span class="cline-any cline-no">&nbsp;</span>
957
+ <span class="cline-any cline-no">&nbsp;</span>
958
+ <span class="cline-any cline-no">&nbsp;</span>
959
+ <span class="cline-any cline-no">&nbsp;</span>
960
+ <span class="cline-any cline-no">&nbsp;</span>
961
+ <span class="cline-any cline-no">&nbsp;</span>
962
+ <span class="cline-any cline-no">&nbsp;</span>
963
+ <span class="cline-any cline-no">&nbsp;</span>
964
+ <span class="cline-any cline-no">&nbsp;</span>
965
+ <span class="cline-any cline-no">&nbsp;</span>
966
+ <span class="cline-any cline-no">&nbsp;</span>
967
+ <span class="cline-any cline-no">&nbsp;</span>
968
+ <span class="cline-any cline-no">&nbsp;</span>
969
+ <span class="cline-any cline-no">&nbsp;</span>
970
+ <span class="cline-any cline-no">&nbsp;</span>
971
+ <span class="cline-any cline-no">&nbsp;</span>
972
+ <span class="cline-any cline-no">&nbsp;</span>
973
+ <span class="cline-any cline-no">&nbsp;</span>
974
+ <span class="cline-any cline-no">&nbsp;</span>
975
+ <span class="cline-any cline-no">&nbsp;</span>
976
+ <span class="cline-any cline-no">&nbsp;</span>
977
+ <span class="cline-any cline-no">&nbsp;</span>
978
+ <span class="cline-any cline-no">&nbsp;</span>
979
+ <span class="cline-any cline-no">&nbsp;</span>
980
+ <span class="cline-any cline-no">&nbsp;</span>
981
+ <span class="cline-any cline-no">&nbsp;</span>
982
+ <span class="cline-any cline-no">&nbsp;</span>
983
+ <span class="cline-any cline-no">&nbsp;</span>
984
+ <span class="cline-any cline-no">&nbsp;</span>
985
+ <span class="cline-any cline-no">&nbsp;</span>
986
+ <span class="cline-any cline-no">&nbsp;</span>
987
+ <span class="cline-any cline-no">&nbsp;</span>
988
+ <span class="cline-any cline-no">&nbsp;</span>
989
+ <span class="cline-any cline-no">&nbsp;</span>
990
+ <span class="cline-any cline-no">&nbsp;</span>
991
+ <span class="cline-any cline-no">&nbsp;</span>
992
+ <span class="cline-any cline-no">&nbsp;</span>
993
+ <span class="cline-any cline-no">&nbsp;</span>
994
+ <span class="cline-any cline-no">&nbsp;</span>
995
+ <span class="cline-any cline-no">&nbsp;</span>
996
+ <span class="cline-any cline-no">&nbsp;</span>
997
+ <span class="cline-any cline-no">&nbsp;</span>
998
+ <span class="cline-any cline-no">&nbsp;</span>
999
+ <span class="cline-any cline-no">&nbsp;</span>
1000
+ <span class="cline-any cline-no">&nbsp;</span>
1001
+ <span class="cline-any cline-no">&nbsp;</span>
1002
+ <span class="cline-any cline-no">&nbsp;</span>
1003
+ <span class="cline-any cline-no">&nbsp;</span>
1004
+ <span class="cline-any cline-no">&nbsp;</span>
1005
+ <span class="cline-any cline-no">&nbsp;</span>
1006
+ <span class="cline-any cline-no">&nbsp;</span>
1007
+ <span class="cline-any cline-no">&nbsp;</span>
1008
+ <span class="cline-any cline-no">&nbsp;</span>
1009
+ <span class="cline-any cline-no">&nbsp;</span>
1010
+ <span class="cline-any cline-no">&nbsp;</span>
1011
+ <span class="cline-any cline-no">&nbsp;</span>
1012
+ <span class="cline-any cline-no">&nbsp;</span>
1013
+ <span class="cline-any cline-no">&nbsp;</span>
1014
+ <span class="cline-any cline-no">&nbsp;</span>
1015
+ <span class="cline-any cline-no">&nbsp;</span>
1016
+ <span class="cline-any cline-no">&nbsp;</span>
1017
+ <span class="cline-any cline-no">&nbsp;</span>
1018
+ <span class="cline-any cline-no">&nbsp;</span>
1019
+ <span class="cline-any cline-no">&nbsp;</span>
1020
+ <span class="cline-any cline-no">&nbsp;</span>
1021
+ <span class="cline-any cline-no">&nbsp;</span>
1022
+ <span class="cline-any cline-no">&nbsp;</span>
1023
+ <span class="cline-any cline-no">&nbsp;</span>
1024
+ <span class="cline-any cline-no">&nbsp;</span>
1025
+ <span class="cline-any cline-no">&nbsp;</span>
1026
+ <span class="cline-any cline-no">&nbsp;</span>
1027
+ <span class="cline-any cline-no">&nbsp;</span>
1028
+ <span class="cline-any cline-no">&nbsp;</span>
1029
+ <span class="cline-any cline-no">&nbsp;</span>
1030
+ <span class="cline-any cline-no">&nbsp;</span>
1031
+ <span class="cline-any cline-no">&nbsp;</span>
1032
+ <span class="cline-any cline-no">&nbsp;</span>
1033
+ <span class="cline-any cline-no">&nbsp;</span>
1034
+ <span class="cline-any cline-no">&nbsp;</span>
1035
+ <span class="cline-any cline-no">&nbsp;</span>
1036
+ <span class="cline-any cline-no">&nbsp;</span>
1037
+ <span class="cline-any cline-no">&nbsp;</span>
1038
+ <span class="cline-any cline-no">&nbsp;</span>
1039
+ <span class="cline-any cline-no">&nbsp;</span>
1040
+ <span class="cline-any cline-no">&nbsp;</span>
1041
+ <span class="cline-any cline-no">&nbsp;</span>
1042
+ <span class="cline-any cline-no">&nbsp;</span>
1043
+ <span class="cline-any cline-no">&nbsp;</span>
1044
+ <span class="cline-any cline-no">&nbsp;</span>
1045
+ <span class="cline-any cline-no">&nbsp;</span>
1046
+ <span class="cline-any cline-no">&nbsp;</span>
1047
+ <span class="cline-any cline-no">&nbsp;</span>
1048
+ <span class="cline-any cline-no">&nbsp;</span>
1049
+ <span class="cline-any cline-no">&nbsp;</span>
1050
+ <span class="cline-any cline-no">&nbsp;</span>
1051
+ <span class="cline-any cline-no">&nbsp;</span>
1052
+ <span class="cline-any cline-no">&nbsp;</span>
1053
+ <span class="cline-any cline-no">&nbsp;</span>
1054
+ <span class="cline-any cline-no">&nbsp;</span>
1055
+ <span class="cline-any cline-no">&nbsp;</span>
1056
+ <span class="cline-any cline-no">&nbsp;</span>
1057
+ <span class="cline-any cline-no">&nbsp;</span>
1058
+ <span class="cline-any cline-no">&nbsp;</span>
1059
+ <span class="cline-any cline-no">&nbsp;</span>
1060
+ <span class="cline-any cline-no">&nbsp;</span>
1061
+ <span class="cline-any cline-no">&nbsp;</span>
1062
+ <span class="cline-any cline-no">&nbsp;</span>
1063
+ <span class="cline-any cline-no">&nbsp;</span>
1064
+ <span class="cline-any cline-no">&nbsp;</span>
1065
+ <span class="cline-any cline-no">&nbsp;</span>
1066
+ <span class="cline-any cline-no">&nbsp;</span>
1067
+ <span class="cline-any cline-no">&nbsp;</span>
1068
+ <span class="cline-any cline-no">&nbsp;</span>
1069
+ <span class="cline-any cline-no">&nbsp;</span>
1070
+ <span class="cline-any cline-no">&nbsp;</span>
1071
+ <span class="cline-any cline-no">&nbsp;</span>
1072
+ <span class="cline-any cline-no">&nbsp;</span>
1073
+ <span class="cline-any cline-no">&nbsp;</span>
1074
+ <span class="cline-any cline-no">&nbsp;</span>
1075
+ <span class="cline-any cline-no">&nbsp;</span>
1076
+ <span class="cline-any cline-no">&nbsp;</span>
1077
+ <span class="cline-any cline-no">&nbsp;</span>
1078
+ <span class="cline-any cline-no">&nbsp;</span>
1079
+ <span class="cline-any cline-no">&nbsp;</span>
1080
+ <span class="cline-any cline-no">&nbsp;</span>
1081
+ <span class="cline-any cline-no">&nbsp;</span>
1082
+ <span class="cline-any cline-no">&nbsp;</span>
1083
+ <span class="cline-any cline-no">&nbsp;</span>
1084
+ <span class="cline-any cline-no">&nbsp;</span>
1085
+ <span class="cline-any cline-no">&nbsp;</span>
1086
+ <span class="cline-any cline-no">&nbsp;</span>
1087
+ <span class="cline-any cline-no">&nbsp;</span>
1088
+ <span class="cline-any cline-no">&nbsp;</span>
1089
+ <span class="cline-any cline-no">&nbsp;</span>
1090
+ <span class="cline-any cline-no">&nbsp;</span>
1091
+ <span class="cline-any cline-no">&nbsp;</span>
1092
+ <span class="cline-any cline-no">&nbsp;</span>
1093
+ <span class="cline-any cline-no">&nbsp;</span>
1094
+ <span class="cline-any cline-no">&nbsp;</span>
1095
+ <span class="cline-any cline-no">&nbsp;</span>
1096
+ <span class="cline-any cline-no">&nbsp;</span>
1097
+ <span class="cline-any cline-no">&nbsp;</span>
1098
+ <span class="cline-any cline-no">&nbsp;</span>
1099
+ <span class="cline-any cline-no">&nbsp;</span>
1100
+ <span class="cline-any cline-no">&nbsp;</span>
1101
+ <span class="cline-any cline-no">&nbsp;</span>
1102
+ <span class="cline-any cline-no">&nbsp;</span>
1103
+ <span class="cline-any cline-no">&nbsp;</span>
1104
+ <span class="cline-any cline-no">&nbsp;</span>
1105
+ <span class="cline-any cline-no">&nbsp;</span>
1106
+ <span class="cline-any cline-no">&nbsp;</span>
1107
+ <span class="cline-any cline-no">&nbsp;</span>
1108
+ <span class="cline-any cline-no">&nbsp;</span>
1109
+ <span class="cline-any cline-no">&nbsp;</span>
1110
+ <span class="cline-any cline-no">&nbsp;</span>
1111
+ <span class="cline-any cline-no">&nbsp;</span>
1112
+ <span class="cline-any cline-no">&nbsp;</span>
1113
+ <span class="cline-any cline-no">&nbsp;</span>
1114
+ <span class="cline-any cline-no">&nbsp;</span>
1115
+ <span class="cline-any cline-no">&nbsp;</span>
1116
+ <span class="cline-any cline-no">&nbsp;</span>
1117
+ <span class="cline-any cline-no">&nbsp;</span>
1118
+ <span class="cline-any cline-no">&nbsp;</span>
1119
+ <span class="cline-any cline-no">&nbsp;</span>
1120
+ <span class="cline-any cline-no">&nbsp;</span>
1121
+ <span class="cline-any cline-no">&nbsp;</span>
1122
+ <span class="cline-any cline-no">&nbsp;</span>
1123
+ <span class="cline-any cline-no">&nbsp;</span>
1124
+ <span class="cline-any cline-no">&nbsp;</span>
1125
+ <span class="cline-any cline-no">&nbsp;</span>
1126
+ <span class="cline-any cline-no">&nbsp;</span>
1127
+ <span class="cline-any cline-no">&nbsp;</span>
1128
+ <span class="cline-any cline-no">&nbsp;</span>
1129
+ <span class="cline-any cline-no">&nbsp;</span>
1130
+ <span class="cline-any cline-no">&nbsp;</span>
1131
+ <span class="cline-any cline-no">&nbsp;</span>
1132
+ <span class="cline-any cline-no">&nbsp;</span>
1133
+ <span class="cline-any cline-no">&nbsp;</span>
1134
+ <span class="cline-any cline-no">&nbsp;</span>
1135
+ <span class="cline-any cline-no">&nbsp;</span>
1136
+ <span class="cline-any cline-no">&nbsp;</span>
1137
+ <span class="cline-any cline-no">&nbsp;</span>
1138
+ <span class="cline-any cline-no">&nbsp;</span>
1139
+ <span class="cline-any cline-no">&nbsp;</span>
1140
+ <span class="cline-any cline-no">&nbsp;</span>
1141
+ <span class="cline-any cline-no">&nbsp;</span>
1142
+ <span class="cline-any cline-no">&nbsp;</span>
1143
+ <span class="cline-any cline-no">&nbsp;</span>
1144
+ <span class="cline-any cline-no">&nbsp;</span>
1145
+ <span class="cline-any cline-no">&nbsp;</span>
1146
+ <span class="cline-any cline-no">&nbsp;</span>
1147
+ <span class="cline-any cline-no">&nbsp;</span>
1148
+ <span class="cline-any cline-no">&nbsp;</span>
1149
+ <span class="cline-any cline-no">&nbsp;</span>
1150
+ <span class="cline-any cline-no">&nbsp;</span>
1151
+ <span class="cline-any cline-no">&nbsp;</span>
1152
+ <span class="cline-any cline-no">&nbsp;</span>
1153
+ <span class="cline-any cline-no">&nbsp;</span>
1154
+ <span class="cline-any cline-no">&nbsp;</span>
1155
+ <span class="cline-any cline-no">&nbsp;</span>
1156
+ <span class="cline-any cline-no">&nbsp;</span>
1157
+ <span class="cline-any cline-no">&nbsp;</span>
1158
+ <span class="cline-any cline-no">&nbsp;</span>
1159
+ <span class="cline-any cline-no">&nbsp;</span>
1160
+ <span class="cline-any cline-no">&nbsp;</span>
1161
+ <span class="cline-any cline-no">&nbsp;</span>
1162
+ <span class="cline-any cline-no">&nbsp;</span>
1163
+ <span class="cline-any cline-no">&nbsp;</span>
1164
+ <span class="cline-any cline-no">&nbsp;</span>
1165
+ <span class="cline-any cline-no">&nbsp;</span>
1166
+ <span class="cline-any cline-no">&nbsp;</span>
1167
+ <span class="cline-any cline-no">&nbsp;</span>
1168
+ <span class="cline-any cline-no">&nbsp;</span>
1169
+ <span class="cline-any cline-no">&nbsp;</span>
1170
+ <span class="cline-any cline-no">&nbsp;</span>
1171
+ <span class="cline-any cline-no">&nbsp;</span>
1172
+ <span class="cline-any cline-no">&nbsp;</span>
1173
+ <span class="cline-any cline-no">&nbsp;</span>
1174
+ <span class="cline-any cline-no">&nbsp;</span>
1175
+ <span class="cline-any cline-no">&nbsp;</span>
1176
+ <span class="cline-any cline-no">&nbsp;</span>
1177
+ <span class="cline-any cline-no">&nbsp;</span>
1178
+ <span class="cline-any cline-no">&nbsp;</span>
1179
+ <span class="cline-any cline-no">&nbsp;</span>
1180
+ <span class="cline-any cline-no">&nbsp;</span>
1181
+ <span class="cline-any cline-no">&nbsp;</span>
1182
+ <span class="cline-any cline-no">&nbsp;</span>
1183
+ <span class="cline-any cline-no">&nbsp;</span>
1184
+ <span class="cline-any cline-no">&nbsp;</span>
1185
+ <span class="cline-any cline-no">&nbsp;</span>
1186
+ <span class="cline-any cline-no">&nbsp;</span>
1187
+ <span class="cline-any cline-no">&nbsp;</span>
1188
+ <span class="cline-any cline-no">&nbsp;</span>
1189
+ <span class="cline-any cline-no">&nbsp;</span>
1190
+ <span class="cline-any cline-no">&nbsp;</span>
1191
+ <span class="cline-any cline-no">&nbsp;</span>
1192
+ <span class="cline-any cline-no">&nbsp;</span>
1193
+ <span class="cline-any cline-no">&nbsp;</span>
1194
+ <span class="cline-any cline-no">&nbsp;</span>
1195
+ <span class="cline-any cline-no">&nbsp;</span>
1196
+ <span class="cline-any cline-no">&nbsp;</span>
1197
+ <span class="cline-any cline-no">&nbsp;</span>
1198
+ <span class="cline-any cline-no">&nbsp;</span>
1199
+ <span class="cline-any cline-no">&nbsp;</span>
1200
+ <span class="cline-any cline-no">&nbsp;</span>
1201
+ <span class="cline-any cline-no">&nbsp;</span>
1202
+ <span class="cline-any cline-no">&nbsp;</span>
1203
+ <span class="cline-any cline-no">&nbsp;</span>
1204
+ <span class="cline-any cline-no">&nbsp;</span>
1205
+ <span class="cline-any cline-no">&nbsp;</span>
1206
+ <span class="cline-any cline-no">&nbsp;</span>
1207
+ <span class="cline-any cline-no">&nbsp;</span>
1208
+ <span class="cline-any cline-no">&nbsp;</span>
1209
+ <span class="cline-any cline-no">&nbsp;</span>
1210
+ <span class="cline-any cline-no">&nbsp;</span>
1211
+ <span class="cline-any cline-no">&nbsp;</span>
1212
+ <span class="cline-any cline-no">&nbsp;</span>
1213
+ <span class="cline-any cline-no">&nbsp;</span>
1214
+ <span class="cline-any cline-no">&nbsp;</span>
1215
+ <span class="cline-any cline-no">&nbsp;</span>
1216
+ <span class="cline-any cline-no">&nbsp;</span>
1217
+ <span class="cline-any cline-no">&nbsp;</span>
1218
+ <span class="cline-any cline-no">&nbsp;</span>
1219
+ <span class="cline-any cline-no">&nbsp;</span>
1220
+ <span class="cline-any cline-no">&nbsp;</span>
1221
+ <span class="cline-any cline-no">&nbsp;</span>
1222
+ <span class="cline-any cline-no">&nbsp;</span>
1223
+ <span class="cline-any cline-no">&nbsp;</span>
1224
+ <span class="cline-any cline-no">&nbsp;</span>
1225
+ <span class="cline-any cline-no">&nbsp;</span>
1226
+ <span class="cline-any cline-no">&nbsp;</span>
1227
+ <span class="cline-any cline-no">&nbsp;</span>
1228
+ <span class="cline-any cline-no">&nbsp;</span>
1229
+ <span class="cline-any cline-no">&nbsp;</span>
1230
+ <span class="cline-any cline-no">&nbsp;</span>
1231
+ <span class="cline-any cline-no">&nbsp;</span>
1232
+ <span class="cline-any cline-no">&nbsp;</span>
1233
+ <span class="cline-any cline-no">&nbsp;</span>
1234
+ <span class="cline-any cline-no">&nbsp;</span>
1235
+ <span class="cline-any cline-no">&nbsp;</span>
1236
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { StreamSfuClient } from '../StreamSfuClient';
1237
+ import { createSubscriber } from './subscriber';
1238
+ import { Publisher } from './publisher';
1239
+ import { getGenericSdp } from './codecs';
1240
+ import { CallState, TrackType } from '../gen/video/sfu/models/models';
1241
+ import { registerEventHandlers } from './callEventHandlers';
1242
+ import { SfuEventListener } from './Dispatcher';
1243
+ import { StreamVideoWriteableStateStore } from '../store';
1244
+ import { trackTypeToParticipantStreamKey } from './helpers/tracks';
1245
+ import type {
1246
+ CallOptions,
1247
+ PublishOptions,
1248
+ StreamVideoParticipant,
1249
+ StreamVideoParticipantPatches,
1250
+ SubscriptionChanges,
1251
+ } from './types';
1252
+ import {
1253
+ BehaviorSubject,
1254
+ debounceTime,
1255
+ filter,
1256
+ Subject,
1257
+ takeWhile,
1258
+ } from 'rxjs';
1259
+ import { TrackSubscriptionDetails } from '../gen/video/sfu/signal_rpc/signal';
1260
+ import {
1261
+ createStatsReporter,
1262
+ StatsReporter,
1263
+ } from '../stats/state-store-stats-reporter';
1264
+ import { Batcher } from '../Batcher';
1265
+ import { CallMetadata } from './CallMetadata';
1266
+ &nbsp;
1267
+ /**
1268
+ * A `Call` object represents the active call the user is part of. It's not enough to have a `Call` instance, you will also need to call the [`join`](#join) method.
1269
+ */
1270
+ export <span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >class Call {</span></span>
1271
+ <span class="cstat-no" title="statement not covered" > /**</span>
1272
+ <span class="cstat-no" title="statement not covered" > * Contains metadata about the call, for example who created the call. You can also extract the call ID from this object, which you'll need for certain API calls (for example to start a recording).</span>
1273
+ <span class="cstat-no" title="statement not covered" > */</span>
1274
+ <span class="cstat-no" title="statement not covered" > data: CallMetadata;</span>
1275
+ <span class="cstat-no" title="statement not covered" > private readonly subscriber: RTCPeerConnection;</span>
1276
+ <span class="cstat-no" title="statement not covered" > private readonly publisher: Publisher;</span>
1277
+ <span class="cstat-no" title="statement not covered" > private readonly trackSubscriptionsSubject = new Subject&lt;</span>
1278
+ <span class="cstat-no" title="statement not covered" > TrackSubscriptionDetails[]</span>
1279
+ <span class="cstat-no" title="statement not covered" > &gt;();</span>
1280
+ <span class="cstat-no" title="statement not covered" ></span>
1281
+ <span class="cstat-no" title="statement not covered" > private statsReporter: StatsReporter;</span>
1282
+ <span class="cstat-no" title="statement not covered" > private joined$ = new BehaviorSubject&lt;boolean&gt;(false);</span>
1283
+ <span class="cstat-no" title="statement not covered" ></span>
1284
+ <span class="cstat-no" title="statement not covered" > /**</span>
1285
+ <span class="cstat-no" title="statement not covered" > * Don't call the constructor directly, use the [`StreamVideoClient.joinCall`](./StreamVideoClient.md/#joincall) method to construct a `Call` instance.</span>
1286
+ <span class="cstat-no" title="statement not covered" > * @param client</span>
1287
+ <span class="cstat-no" title="statement not covered" > * @param data</span>
1288
+ <span class="cstat-no" title="statement not covered" > * @param options</span>
1289
+ <span class="cstat-no" title="statement not covered" > * @param stateStore</span>
1290
+ <span class="cstat-no" title="statement not covered" > * @param userBatcher</span>
1291
+ <span class="cstat-no" title="statement not covered" > */</span>
1292
+ <span class="cstat-no" title="statement not covered" > constructor(</span>
1293
+ <span class="cstat-no" title="statement not covered" > data: CallMetadata,</span>
1294
+ <span class="cstat-no" title="statement not covered" > private readonly client: StreamSfuClient,</span>
1295
+ <span class="cstat-no" title="statement not covered" > private readonly options: CallOptions,</span>
1296
+ <span class="cstat-no" title="statement not covered" > private readonly stateStore: StreamVideoWriteableStateStore,</span>
1297
+ <span class="cstat-no" title="statement not covered" > private readonly userBatcher: Batcher&lt;string&gt;,</span>
1298
+ <span class="cstat-no" title="statement not covered" > ) {</span>
1299
+ <span class="cstat-no" title="statement not covered" > this.data = data;</span>
1300
+ <span class="cstat-no" title="statement not covered" > this.subscriber = createSubscriber({</span>
1301
+ <span class="cstat-no" title="statement not covered" > rpcClient: this.client,</span>
1302
+ <span class="cstat-no" title="statement not covered" > connectionConfig: this.options.connectionConfig,</span>
1303
+ <span class="cstat-no" title="statement not covered" > onTrack: this.handleOnTrack,</span>
1304
+ <span class="cstat-no" title="statement not covered" > });</span>
1305
+ <span class="cstat-no" title="statement not covered" ></span>
1306
+ <span class="cstat-no" title="statement not covered" > this.publisher = new Publisher({</span>
1307
+ <span class="cstat-no" title="statement not covered" > rpcClient: this.client,</span>
1308
+ <span class="cstat-no" title="statement not covered" > connectionConfig: this.options.connectionConfig,</span>
1309
+ <span class="cstat-no" title="statement not covered" > });</span>
1310
+ <span class="cstat-no" title="statement not covered" ></span>
1311
+ <span class="cstat-no" title="statement not covered" > this.statsReporter = createStatsReporter({</span>
1312
+ <span class="cstat-no" title="statement not covered" > subscriber: this.subscriber,</span>
1313
+ <span class="cstat-no" title="statement not covered" > publisher: this.publisher,</span>
1314
+ <span class="cstat-no" title="statement not covered" > store: stateStore,</span>
1315
+ <span class="cstat-no" title="statement not covered" > edgeName: this.options.edgeName,</span>
1316
+ <span class="cstat-no" title="statement not covered" > });</span>
1317
+ <span class="cstat-no" title="statement not covered" ></span>
1318
+ <span class="cstat-no" title="statement not covered" > const { dispatcher } = this.client;</span>
1319
+ <span class="cstat-no" title="statement not covered" > registerEventHandlers(this, this.stateStore, dispatcher, this.userBatcher);</span>
1320
+ <span class="cstat-no" title="statement not covered" ></span>
1321
+ <span class="cstat-no" title="statement not covered" > this.trackSubscriptionsSubject</span>
1322
+ <span class="cstat-no" title="statement not covered" > .pipe(debounceTime(1200))</span>
1323
+ <span class="cstat-no" title="statement not covered" > .subscribe((subscriptions) =&gt;</span>
1324
+ <span class="cstat-no" title="statement not covered" > this.client.updateSubscriptions(subscriptions),</span>
1325
+ <span class="cstat-no" title="statement not covered" > );</span>
1326
+ <span class="cstat-no" title="statement not covered" > }</span>
1327
+ <span class="cstat-no" title="statement not covered" ></span>
1328
+ <span class="cstat-no" title="statement not covered" > /**</span>
1329
+ <span class="cstat-no" title="statement not covered" > * You can subscribe to WebSocket events provided by the API. To remove a subscription, call the `off` method.</span>
1330
+ <span class="cstat-no" title="statement not covered" > * Please note that subscribing to WebSocket events is an advanced use-case, for most use-cases it should be enough to watch for changes in the [reactive state store](./StreamVideoClient.md/#readonlystatestore).</span>
1331
+ <span class="cstat-no" title="statement not covered" > * @param eventName</span>
1332
+ <span class="cstat-no" title="statement not covered" > * @param fn</span>
1333
+ <span class="cstat-no" title="statement not covered" > * @returns</span>
1334
+ <span class="cstat-no" title="statement not covered" > */</span>
1335
+ <span class="cstat-no" title="statement not covered" > on = (eventName: string, fn: SfuEventListener) =&gt; {</span>
1336
+ <span class="cstat-no" title="statement not covered" > return this.client.dispatcher.on(eventName, fn);</span>
1337
+ <span class="cstat-no" title="statement not covered" > };</span>
1338
+ <span class="cstat-no" title="statement not covered" ></span>
1339
+ <span class="cstat-no" title="statement not covered" > /**</span>
1340
+ <span class="cstat-no" title="statement not covered" > * Remove subscription for WebSocket events that were created by the `on` method.</span>
1341
+ <span class="cstat-no" title="statement not covered" > * @param eventName</span>
1342
+ <span class="cstat-no" title="statement not covered" > * @param fn</span>
1343
+ <span class="cstat-no" title="statement not covered" > * @returns</span>
1344
+ <span class="cstat-no" title="statement not covered" > */</span>
1345
+ <span class="cstat-no" title="statement not covered" > off = (eventName: string, fn: SfuEventListener) =&gt; {</span>
1346
+ <span class="cstat-no" title="statement not covered" > return this.client.dispatcher.off(eventName, fn);</span>
1347
+ <span class="cstat-no" title="statement not covered" > };</span>
1348
+ <span class="cstat-no" title="statement not covered" ></span>
1349
+ <span class="cstat-no" title="statement not covered" > /**</span>
1350
+ <span class="cstat-no" title="statement not covered" > * Leave the call and stop the media streams that were published by the call.</span>
1351
+ <span class="cstat-no" title="statement not covered" > */</span>
1352
+ <span class="cstat-no" title="statement not covered" > leave = () =&gt; {</span>
1353
+ <span class="cstat-no" title="statement not covered" > if (!this.joined$.getValue()) {</span>
1354
+ <span class="cstat-no" title="statement not covered" > throw new Error('Cannot leave call that has already been left.');</span>
1355
+ <span class="cstat-no" title="statement not covered" > }</span>
1356
+ <span class="cstat-no" title="statement not covered" > this.joined$.next(false);</span>
1357
+ <span class="cstat-no" title="statement not covered" ></span>
1358
+ <span class="cstat-no" title="statement not covered" > this.statsReporter.stop();</span>
1359
+ <span class="cstat-no" title="statement not covered" > this.subscriber.close();</span>
1360
+ <span class="cstat-no" title="statement not covered" > this.userBatcher.clearBatch();</span>
1361
+ <span class="cstat-no" title="statement not covered" ></span>
1362
+ <span class="cstat-no" title="statement not covered" > this.publisher.stopPublishing();</span>
1363
+ <span class="cstat-no" title="statement not covered" > this.client.close();</span>
1364
+ <span class="cstat-no" title="statement not covered" ></span>
1365
+ <span class="cstat-no" title="statement not covered" > this.stateStore.setCurrentValue(</span>
1366
+ <span class="cstat-no" title="statement not covered" > this.stateStore.activeCallSubject,</span>
1367
+ <span class="cstat-no" title="statement not covered" > undefined,</span>
1368
+ <span class="cstat-no" title="statement not covered" > );</span>
1369
+ <span class="cstat-no" title="statement not covered" > };</span>
1370
+ <span class="cstat-no" title="statement not covered" ></span>
1371
+ <span class="cstat-no" title="statement not covered" > /**</span>
1372
+ <span class="cstat-no" title="statement not covered" > * Will initiate a call session with the server and return the call state. Don't call this method directly, use the [`StreamVideoClient.joinCall`](./StreamVideoClient.md/#joincall) method that takes care of this operation.</span>
1373
+ <span class="cstat-no" title="statement not covered" > *</span>
1374
+ <span class="cstat-no" title="statement not covered" > * If the join was successful the [`activeCall$` state variable](./StreamVideClient/#readonlystatestore) will be set</span>
1375
+ <span class="cstat-no" title="statement not covered" > *</span>
1376
+ <span class="cstat-no" title="statement not covered" > * @returns a promise which resolves once the call join-flow has finished.</span>
1377
+ <span class="cstat-no" title="statement not covered" > */</span>
1378
+ <span class="cstat-no" title="statement not covered" > join = async () =&gt; {</span>
1379
+ <span class="cstat-no" title="statement not covered" > if (this.joined$.getValue()) {</span>
1380
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Illegal State: Already joined.`);</span>
1381
+ <span class="cstat-no" title="statement not covered" > }</span>
1382
+ <span class="cstat-no" title="statement not covered" ></span>
1383
+ <span class="cstat-no" title="statement not covered" > const joinResponseReady = new Promise&lt;CallState | undefined&gt;(</span>
1384
+ <span class="cstat-no" title="statement not covered" > async (resolve) =&gt; {</span>
1385
+ <span class="cstat-no" title="statement not covered" > this.client.dispatcher.on('joinResponse', (event) =&gt; {</span>
1386
+ <span class="cstat-no" title="statement not covered" > if (event.eventPayload.oneofKind !== 'joinResponse') return;</span>
1387
+ <span class="cstat-no" title="statement not covered" ></span>
1388
+ <span class="cstat-no" title="statement not covered" > const { callState } = event.eventPayload.joinResponse;</span>
1389
+ <span class="cstat-no" title="statement not covered" > const currentParticipants = callState?.participants || [];</span>
1390
+ <span class="cstat-no" title="statement not covered" ></span>
1391
+ <span class="cstat-no" title="statement not covered" > // get user data from the call envelope (invited participants)</span>
1392
+ <span class="cstat-no" title="statement not covered" > const { users } = this.data;</span>
1393
+ <span class="cstat-no" title="statement not covered" ></span>
1394
+ <span class="cstat-no" title="statement not covered" > // request user data for uninvited users</span>
1395
+ <span class="cstat-no" title="statement not covered" > currentParticipants.forEach((participant) =&gt; {</span>
1396
+ <span class="cstat-no" title="statement not covered" > const userData = users[participant.userId];</span>
1397
+ <span class="cstat-no" title="statement not covered" > if (!userData) this.userBatcher.addToBatch(participant.userId);</span>
1398
+ <span class="cstat-no" title="statement not covered" > });</span>
1399
+ <span class="cstat-no" title="statement not covered" ></span>
1400
+ <span class="cstat-no" title="statement not covered" > this.stateStore.setCurrentValue(</span>
1401
+ <span class="cstat-no" title="statement not covered" > this.stateStore.participantsSubject,</span>
1402
+ <span class="cstat-no" title="statement not covered" > currentParticipants.map&lt;StreamVideoParticipant&gt;((participant) =&gt; ({</span>
1403
+ <span class="cstat-no" title="statement not covered" > ...participant,</span>
1404
+ <span class="cstat-no" title="statement not covered" > isLoggedInUser: participant.sessionId === this.client.sessionId,</span>
1405
+ <span class="cstat-no" title="statement not covered" > user: users[participant.userId],</span>
1406
+ <span class="cstat-no" title="statement not covered" > })),</span>
1407
+ <span class="cstat-no" title="statement not covered" > );</span>
1408
+ <span class="cstat-no" title="statement not covered" ></span>
1409
+ <span class="cstat-no" title="statement not covered" > this.client.keepAlive();</span>
1410
+ <span class="cstat-no" title="statement not covered" > this.joined$.next(true);</span>
1411
+ <span class="cstat-no" title="statement not covered" > resolve(callState); // expose call state</span>
1412
+ <span class="cstat-no" title="statement not covered" > });</span>
1413
+ <span class="cstat-no" title="statement not covered" ></span>
1414
+ <span class="cstat-no" title="statement not covered" > const genericSdp = await getGenericSdp('recvonly');</span>
1415
+ <span class="cstat-no" title="statement not covered" > await this.client.join({</span>
1416
+ <span class="cstat-no" title="statement not covered" > subscriberSdp: genericSdp || '',</span>
1417
+ <span class="cstat-no" title="statement not covered" > });</span>
1418
+ <span class="cstat-no" title="statement not covered" > },</span>
1419
+ <span class="cstat-no" title="statement not covered" > );</span>
1420
+ <span class="cstat-no" title="statement not covered" ></span>
1421
+ <span class="cstat-no" title="statement not covered" > return joinResponseReady;</span>
1422
+ <span class="cstat-no" title="statement not covered" > };</span>
1423
+ <span class="cstat-no" title="statement not covered" ></span>
1424
+ <span class="cstat-no" title="statement not covered" > /**</span>
1425
+ <span class="cstat-no" title="statement not covered" > * Starts publishing the given video stream to the call.</span>
1426
+ <span class="cstat-no" title="statement not covered" > * The stream will be stopped if the user changes an input device, or if the user leaves the call.</span>
1427
+ <span class="cstat-no" title="statement not covered" > *</span>
1428
+ <span class="cstat-no" title="statement not covered" > * If the method was successful the [`activeCall$` state variable](./StreamVideClient/#readonlystatestore) will be cleared</span>
1429
+ <span class="cstat-no" title="statement not covered" > *</span>
1430
+ <span class="cstat-no" title="statement not covered" > * Consecutive calls to this method will replace the previously published stream.</span>
1431
+ <span class="cstat-no" title="statement not covered" > * The previous video stream will be stopped.</span>
1432
+ <span class="cstat-no" title="statement not covered" > *</span>
1433
+ <span class="cstat-no" title="statement not covered" > * @angular It's recommended to use the [`InCallDeviceManagerService`](./InCallDeviceManagerService.md) that takes care of this operation for you.</span>
1434
+ <span class="cstat-no" title="statement not covered" > *</span>
1435
+ <span class="cstat-no" title="statement not covered" > * @param videoStream the video stream to publish.</span>
1436
+ <span class="cstat-no" title="statement not covered" > * @param opts the options to use when publishing the stream.</span>
1437
+ <span class="cstat-no" title="statement not covered" > */</span>
1438
+ <span class="cstat-no" title="statement not covered" > publishVideoStream = async (</span>
1439
+ <span class="cstat-no" title="statement not covered" > videoStream: MediaStream,</span>
1440
+ <span class="cstat-no" title="statement not covered" > opts: PublishOptions = {},</span>
1441
+ <span class="cstat-no" title="statement not covered" > ) =&gt; {</span>
1442
+ <span class="cstat-no" title="statement not covered" > // we should wait until we get a JoinResponse from the SFU,</span>
1443
+ <span class="cstat-no" title="statement not covered" > // otherwise we risk breaking the ICETrickle flow.</span>
1444
+ <span class="cstat-no" title="statement not covered" > await this.assertCallJoined();</span>
1445
+ <span class="cstat-no" title="statement not covered" > const [videoTrack] = videoStream.getVideoTracks();</span>
1446
+ <span class="cstat-no" title="statement not covered" > if (!videoTrack) {</span>
1447
+ <span class="cstat-no" title="statement not covered" > return console.error(`There is no video track in the stream.`);</span>
1448
+ <span class="cstat-no" title="statement not covered" > }</span>
1449
+ <span class="cstat-no" title="statement not covered" ></span>
1450
+ <span class="cstat-no" title="statement not covered" > const trackType = TrackType.VIDEO;</span>
1451
+ <span class="cstat-no" title="statement not covered" ></span>
1452
+ <span class="cstat-no" title="statement not covered" > try {</span>
1453
+ <span class="cstat-no" title="statement not covered" > await this.publisher.publishStream(</span>
1454
+ <span class="cstat-no" title="statement not covered" > videoStream,</span>
1455
+ <span class="cstat-no" title="statement not covered" > videoTrack,</span>
1456
+ <span class="cstat-no" title="statement not covered" > trackType,</span>
1457
+ <span class="cstat-no" title="statement not covered" > opts,</span>
1458
+ <span class="cstat-no" title="statement not covered" > );</span>
1459
+ <span class="cstat-no" title="statement not covered" > await this.client.updateMuteState(trackType, false);</span>
1460
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1461
+ <span class="cstat-no" title="statement not covered" > throw e;</span>
1462
+ <span class="cstat-no" title="statement not covered" > }</span>
1463
+ <span class="cstat-no" title="statement not covered" ></span>
1464
+ <span class="cstat-no" title="statement not covered" > this.stateStore.updateParticipant(this.client.sessionId, (p) =&gt; ({</span>
1465
+ <span class="cstat-no" title="statement not covered" > videoStream,</span>
1466
+ <span class="cstat-no" title="statement not covered" > videoDeviceId: videoTrack.getSettings().deviceId,</span>
1467
+ <span class="cstat-no" title="statement not covered" > publishedTracks: p.publishedTracks.includes(trackType)</span>
1468
+ <span class="cstat-no" title="statement not covered" > ? p.publishedTracks</span>
1469
+ <span class="cstat-no" title="statement not covered" > : [...p.publishedTracks, trackType],</span>
1470
+ <span class="cstat-no" title="statement not covered" > }));</span>
1471
+ <span class="cstat-no" title="statement not covered" > };</span>
1472
+ <span class="cstat-no" title="statement not covered" ></span>
1473
+ <span class="cstat-no" title="statement not covered" > /**</span>
1474
+ <span class="cstat-no" title="statement not covered" > * Starts publishing the given audio stream to the call.</span>
1475
+ <span class="cstat-no" title="statement not covered" > * The stream will be stopped if the user changes an input device, or if the user leaves the call.</span>
1476
+ <span class="cstat-no" title="statement not covered" > *</span>
1477
+ <span class="cstat-no" title="statement not covered" > * Consecutive calls to this method will replace the audio stream that is currently being published.</span>
1478
+ <span class="cstat-no" title="statement not covered" > * The previous audio stream will be stopped.</span>
1479
+ <span class="cstat-no" title="statement not covered" > *</span>
1480
+ <span class="cstat-no" title="statement not covered" > * @angular It's recommended to use the [`InCallDeviceManagerService`](./InCallDeviceManagerService.md) that takes care of this operation for you.</span>
1481
+ <span class="cstat-no" title="statement not covered" > *</span>
1482
+ <span class="cstat-no" title="statement not covered" > * @param audioStream the audio stream to publish.</span>
1483
+ <span class="cstat-no" title="statement not covered" > */</span>
1484
+ <span class="cstat-no" title="statement not covered" > publishAudioStream = async (audioStream: MediaStream) =&gt; {</span>
1485
+ <span class="cstat-no" title="statement not covered" > // we should wait until we get a JoinResponse from the SFU,</span>
1486
+ <span class="cstat-no" title="statement not covered" > // otherwise we risk breaking the ICETrickle flow.</span>
1487
+ <span class="cstat-no" title="statement not covered" > await this.assertCallJoined();</span>
1488
+ <span class="cstat-no" title="statement not covered" > const [audioTrack] = audioStream.getAudioTracks();</span>
1489
+ <span class="cstat-no" title="statement not covered" > if (!audioTrack) {</span>
1490
+ <span class="cstat-no" title="statement not covered" > return console.error(`There is no audio track in the stream`);</span>
1491
+ <span class="cstat-no" title="statement not covered" > }</span>
1492
+ <span class="cstat-no" title="statement not covered" ></span>
1493
+ <span class="cstat-no" title="statement not covered" > const trackType = TrackType.AUDIO;</span>
1494
+ <span class="cstat-no" title="statement not covered" > try {</span>
1495
+ <span class="cstat-no" title="statement not covered" > await this.publisher.publishStream(audioStream, audioTrack, trackType);</span>
1496
+ <span class="cstat-no" title="statement not covered" > await this.client.updateMuteState(trackType, false);</span>
1497
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1498
+ <span class="cstat-no" title="statement not covered" > throw e;</span>
1499
+ <span class="cstat-no" title="statement not covered" > }</span>
1500
+ <span class="cstat-no" title="statement not covered" ></span>
1501
+ <span class="cstat-no" title="statement not covered" > this.stateStore.updateParticipant(this.client.sessionId, (p) =&gt; ({</span>
1502
+ <span class="cstat-no" title="statement not covered" > audioStream,</span>
1503
+ <span class="cstat-no" title="statement not covered" > audioDeviceId: audioTrack.getSettings().deviceId,</span>
1504
+ <span class="cstat-no" title="statement not covered" > publishedTracks: p.publishedTracks.includes(trackType)</span>
1505
+ <span class="cstat-no" title="statement not covered" > ? p.publishedTracks</span>
1506
+ <span class="cstat-no" title="statement not covered" > : [...p.publishedTracks, trackType],</span>
1507
+ <span class="cstat-no" title="statement not covered" > }));</span>
1508
+ <span class="cstat-no" title="statement not covered" > };</span>
1509
+ <span class="cstat-no" title="statement not covered" ></span>
1510
+ <span class="cstat-no" title="statement not covered" > /**</span>
1511
+ <span class="cstat-no" title="statement not covered" > * Starts publishing the given screen-share stream to the call.</span>
1512
+ <span class="cstat-no" title="statement not covered" > *</span>
1513
+ <span class="cstat-no" title="statement not covered" > * Consecutive calls to this method will replace the previous screen-share stream.</span>
1514
+ <span class="cstat-no" title="statement not covered" > * The previous screen-share stream will be stopped.</span>
1515
+ <span class="cstat-no" title="statement not covered" > *</span>
1516
+ <span class="cstat-no" title="statement not covered" > * @angular It's recommended to use the [`InCallDeviceManagerService`](./InCallDeviceManagerService.md) that takes care of this operation for you.</span>
1517
+ <span class="cstat-no" title="statement not covered" > *</span>
1518
+ <span class="cstat-no" title="statement not covered" > * @param screenShareStream the screen-share stream to publish.</span>
1519
+ <span class="cstat-no" title="statement not covered" > */</span>
1520
+ <span class="cstat-no" title="statement not covered" > publishScreenShareStream = async (screenShareStream: MediaStream) =&gt; {</span>
1521
+ <span class="cstat-no" title="statement not covered" > // we should wait until we get a JoinResponse from the SFU,</span>
1522
+ <span class="cstat-no" title="statement not covered" > // otherwise we risk breaking the ICETrickle flow.</span>
1523
+ <span class="cstat-no" title="statement not covered" > await this.assertCallJoined();</span>
1524
+ <span class="cstat-no" title="statement not covered" > const [screenShareTrack] = screenShareStream.getVideoTracks();</span>
1525
+ <span class="cstat-no" title="statement not covered" > if (!screenShareTrack) {</span>
1526
+ <span class="cstat-no" title="statement not covered" > return console.error(`There is no video track in the stream`);</span>
1527
+ <span class="cstat-no" title="statement not covered" > }</span>
1528
+ <span class="cstat-no" title="statement not covered" ></span>
1529
+ <span class="cstat-no" title="statement not covered" > // fires when browser's native 'Stop Sharing button' is clicked</span>
1530
+ <span class="cstat-no" title="statement not covered" > const onTrackEnded = () =&gt; this.stopPublish(trackType);</span>
1531
+ <span class="cstat-no" title="statement not covered" > screenShareTrack.addEventListener('ended', onTrackEnded);</span>
1532
+ <span class="cstat-no" title="statement not covered" ></span>
1533
+ <span class="cstat-no" title="statement not covered" > const trackType = TrackType.SCREEN_SHARE;</span>
1534
+ <span class="cstat-no" title="statement not covered" > try {</span>
1535
+ <span class="cstat-no" title="statement not covered" > await this.publisher.publishStream(</span>
1536
+ <span class="cstat-no" title="statement not covered" > screenShareStream,</span>
1537
+ <span class="cstat-no" title="statement not covered" > screenShareTrack,</span>
1538
+ <span class="cstat-no" title="statement not covered" > trackType,</span>
1539
+ <span class="cstat-no" title="statement not covered" > );</span>
1540
+ <span class="cstat-no" title="statement not covered" > await this.client.updateMuteState(trackType, false);</span>
1541
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
1542
+ <span class="cstat-no" title="statement not covered" > throw e;</span>
1543
+ <span class="cstat-no" title="statement not covered" > }</span>
1544
+ <span class="cstat-no" title="statement not covered" ></span>
1545
+ <span class="cstat-no" title="statement not covered" > this.stateStore.updateParticipant(this.client.sessionId, (p) =&gt; ({</span>
1546
+ <span class="cstat-no" title="statement not covered" > screenShareStream,</span>
1547
+ <span class="cstat-no" title="statement not covered" > publishedTracks: p.publishedTracks.includes(trackType)</span>
1548
+ <span class="cstat-no" title="statement not covered" > ? p.publishedTracks</span>
1549
+ <span class="cstat-no" title="statement not covered" > : [...p.publishedTracks, trackType],</span>
1550
+ <span class="cstat-no" title="statement not covered" > }));</span>
1551
+ <span class="cstat-no" title="statement not covered" > };</span>
1552
+ <span class="cstat-no" title="statement not covered" ></span>
1553
+ <span class="cstat-no" title="statement not covered" > /**</span>
1554
+ <span class="cstat-no" title="statement not covered" > * Stops publishing the given track type to the call, if it is currently being published.</span>
1555
+ <span class="cstat-no" title="statement not covered" > * Underlying track will be stopped and removed from the publisher.</span>
1556
+ <span class="cstat-no" title="statement not covered" > *</span>
1557
+ <span class="cstat-no" title="statement not covered" > * The `audioDeviceId`/`videoDeviceId` property of the [`localParticipant$`](./StreamVideoClient.md/#readonlystatestore) won't be updated, you can do that by calling the [`setAudioDevice`](#setaudiodevice)/[`setVideoDevice`](#setvideodevice) method.</span>
1558
+ <span class="cstat-no" title="statement not covered" > *</span>
1559
+ <span class="cstat-no" title="statement not covered" > * @angular It's recommended to use the [`InCallDeviceManagerService`](./InCallDeviceManagerService.md) that takes care of this operation for you.</span>
1560
+ <span class="cstat-no" title="statement not covered" > *</span>
1561
+ <span class="cstat-no" title="statement not covered" > * @param trackType the track type to stop publishing.</span>
1562
+ <span class="cstat-no" title="statement not covered" > */</span>
1563
+ <span class="cstat-no" title="statement not covered" > stopPublish = async (trackType: TrackType) =&gt; {</span>
1564
+ <span class="cstat-no" title="statement not covered" > console.log(`stopPublish`, TrackType[trackType]);</span>
1565
+ <span class="cstat-no" title="statement not covered" > const wasPublishing = this.publisher.unpublishStream(trackType);</span>
1566
+ <span class="cstat-no" title="statement not covered" > if (wasPublishing) {</span>
1567
+ <span class="cstat-no" title="statement not covered" > await this.client.updateMuteState(trackType, true);</span>
1568
+ <span class="cstat-no" title="statement not covered" ></span>
1569
+ <span class="cstat-no" title="statement not covered" > const audioOrVideoOrScreenShareStream =</span>
1570
+ <span class="cstat-no" title="statement not covered" > trackTypeToParticipantStreamKey(trackType);</span>
1571
+ <span class="cstat-no" title="statement not covered" > if (audioOrVideoOrScreenShareStream) {</span>
1572
+ <span class="cstat-no" title="statement not covered" > this.stateStore.updateParticipant(this.client.sessionId, (p) =&gt; ({</span>
1573
+ <span class="cstat-no" title="statement not covered" > publishedTracks: p.publishedTracks.filter((t) =&gt; t !== trackType),</span>
1574
+ <span class="cstat-no" title="statement not covered" > [audioOrVideoOrScreenShareStream]: undefined,</span>
1575
+ <span class="cstat-no" title="statement not covered" > }));</span>
1576
+ <span class="cstat-no" title="statement not covered" > }</span>
1577
+ <span class="cstat-no" title="statement not covered" > }</span>
1578
+ <span class="cstat-no" title="statement not covered" > };</span>
1579
+ <span class="cstat-no" title="statement not covered" ></span>
1580
+ <span class="cstat-no" title="statement not covered" > /**</span>
1581
+ <span class="cstat-no" title="statement not covered" > * Update track subscription configuration for one or more participants.</span>
1582
+ <span class="cstat-no" title="statement not covered" > * You have to create a subscription for each participant for all the different kinds of tracks you want to receive.</span>
1583
+ <span class="cstat-no" title="statement not covered" > * You can only subscribe for tracks after the participant started publishing the given kind of track.</span>
1584
+ <span class="cstat-no" title="statement not covered" > *</span>
1585
+ <span class="cstat-no" title="statement not covered" > * @param kind the kind of subscription to update.</span>
1586
+ <span class="cstat-no" title="statement not covered" > * @param changes the list of subscription changes to do.</span>
1587
+ <span class="cstat-no" title="statement not covered" > */</span>
1588
+ <span class="cstat-no" title="statement not covered" > updateSubscriptionsPartial = (</span>
1589
+ <span class="cstat-no" title="statement not covered" > kind: 'video' | 'screen',</span>
1590
+ <span class="cstat-no" title="statement not covered" > changes: SubscriptionChanges,</span>
1591
+ <span class="cstat-no" title="statement not covered" > ) =&gt; {</span>
1592
+ <span class="cstat-no" title="statement not covered" > const participants = this.stateStore.updateParticipants(</span>
1593
+ <span class="cstat-no" title="statement not covered" > Object.entries(changes).reduce&lt;StreamVideoParticipantPatches&gt;(</span>
1594
+ <span class="cstat-no" title="statement not covered" > (acc, [sessionId, change]) =&gt; {</span>
1595
+ <span class="cstat-no" title="statement not covered" > const prop: keyof StreamVideoParticipant | undefined =</span>
1596
+ <span class="cstat-no" title="statement not covered" > kind === 'video'</span>
1597
+ <span class="cstat-no" title="statement not covered" > ? 'videoDimension'</span>
1598
+ <span class="cstat-no" title="statement not covered" > : kind === 'screen'</span>
1599
+ <span class="cstat-no" title="statement not covered" > ? 'screenShareDimension'</span>
1600
+ <span class="cstat-no" title="statement not covered" > : undefined;</span>
1601
+ <span class="cstat-no" title="statement not covered" > if (prop) {</span>
1602
+ <span class="cstat-no" title="statement not covered" > acc[sessionId] = {</span>
1603
+ <span class="cstat-no" title="statement not covered" > [prop]: change.dimension,</span>
1604
+ <span class="cstat-no" title="statement not covered" > };</span>
1605
+ <span class="cstat-no" title="statement not covered" > }</span>
1606
+ <span class="cstat-no" title="statement not covered" > return acc;</span>
1607
+ <span class="cstat-no" title="statement not covered" > },</span>
1608
+ <span class="cstat-no" title="statement not covered" > {},</span>
1609
+ <span class="cstat-no" title="statement not covered" > ),</span>
1610
+ <span class="cstat-no" title="statement not covered" > );</span>
1611
+ <span class="cstat-no" title="statement not covered" ></span>
1612
+ <span class="cstat-no" title="statement not covered" > if (participants) {</span>
1613
+ <span class="cstat-no" title="statement not covered" > this.updateSubscriptions(participants);</span>
1614
+ <span class="cstat-no" title="statement not covered" > }</span>
1615
+ <span class="cstat-no" title="statement not covered" > };</span>
1616
+ <span class="cstat-no" title="statement not covered" ></span>
1617
+ <span class="cstat-no" title="statement not covered" > private updateSubscriptions = (participants: StreamVideoParticipant[]) =&gt; {</span>
1618
+ <span class="cstat-no" title="statement not covered" > const subscriptions: TrackSubscriptionDetails[] = [];</span>
1619
+ <span class="cstat-no" title="statement not covered" > participants.forEach((p) =&gt; {</span>
1620
+ <span class="cstat-no" title="statement not covered" > if (p.isLoggedInUser) return;</span>
1621
+ <span class="cstat-no" title="statement not covered" > if (p.videoDimension &amp;&amp; p.publishedTracks.includes(TrackType.VIDEO)) {</span>
1622
+ <span class="cstat-no" title="statement not covered" > subscriptions.push({</span>
1623
+ <span class="cstat-no" title="statement not covered" > userId: p.userId,</span>
1624
+ <span class="cstat-no" title="statement not covered" > sessionId: p.sessionId,</span>
1625
+ <span class="cstat-no" title="statement not covered" > trackType: TrackType.VIDEO,</span>
1626
+ <span class="cstat-no" title="statement not covered" > dimension: p.videoDimension,</span>
1627
+ <span class="cstat-no" title="statement not covered" > });</span>
1628
+ <span class="cstat-no" title="statement not covered" > }</span>
1629
+ <span class="cstat-no" title="statement not covered" > if (p.publishedTracks.includes(TrackType.AUDIO)) {</span>
1630
+ <span class="cstat-no" title="statement not covered" > subscriptions.push({</span>
1631
+ <span class="cstat-no" title="statement not covered" > userId: p.userId,</span>
1632
+ <span class="cstat-no" title="statement not covered" > sessionId: p.sessionId,</span>
1633
+ <span class="cstat-no" title="statement not covered" > trackType: TrackType.AUDIO,</span>
1634
+ <span class="cstat-no" title="statement not covered" > });</span>
1635
+ <span class="cstat-no" title="statement not covered" > }</span>
1636
+ <span class="cstat-no" title="statement not covered" > if (</span>
1637
+ <span class="cstat-no" title="statement not covered" > p.screenShareDimension &amp;&amp;</span>
1638
+ <span class="cstat-no" title="statement not covered" > p.publishedTracks.includes(TrackType.SCREEN_SHARE)</span>
1639
+ <span class="cstat-no" title="statement not covered" > ) {</span>
1640
+ <span class="cstat-no" title="statement not covered" > subscriptions.push({</span>
1641
+ <span class="cstat-no" title="statement not covered" > userId: p.userId,</span>
1642
+ <span class="cstat-no" title="statement not covered" > sessionId: p.sessionId,</span>
1643
+ <span class="cstat-no" title="statement not covered" > trackType: TrackType.SCREEN_SHARE,</span>
1644
+ <span class="cstat-no" title="statement not covered" > dimension: p.screenShareDimension,</span>
1645
+ <span class="cstat-no" title="statement not covered" > });</span>
1646
+ <span class="cstat-no" title="statement not covered" > }</span>
1647
+ <span class="cstat-no" title="statement not covered" > });</span>
1648
+ <span class="cstat-no" title="statement not covered" > // schedule update</span>
1649
+ <span class="cstat-no" title="statement not covered" > this.trackSubscriptionsSubject.next(subscriptions);</span>
1650
+ <span class="cstat-no" title="statement not covered" > };</span>
1651
+ <span class="cstat-no" title="statement not covered" ></span>
1652
+ <span class="cstat-no" title="statement not covered" > /**</span>
1653
+ <span class="cstat-no" title="statement not covered" > * @deprecated use the `callStatsReport$` state [store variable](./StreamVideoClient.md/#readonlystatestore) instead</span>
1654
+ <span class="cstat-no" title="statement not covered" > * @param kind</span>
1655
+ <span class="cstat-no" title="statement not covered" > * @param selector</span>
1656
+ <span class="cstat-no" title="statement not covered" > * @returns</span>
1657
+ <span class="cstat-no" title="statement not covered" > */</span>
1658
+ <span class="cstat-no" title="statement not covered" > getStats = async (</span>
1659
+ <span class="cstat-no" title="statement not covered" > kind: 'subscriber' | 'publisher',</span>
1660
+ <span class="cstat-no" title="statement not covered" > selector?: MediaStreamTrack,</span>
1661
+ <span class="cstat-no" title="statement not covered" > ) =&gt; {</span>
1662
+ <span class="cstat-no" title="statement not covered" > return this.statsReporter.getRawStatsForTrack(kind, selector);</span>
1663
+ <span class="cstat-no" title="statement not covered" > };</span>
1664
+ <span class="cstat-no" title="statement not covered" ></span>
1665
+ <span class="cstat-no" title="statement not covered" > /**</span>
1666
+ <span class="cstat-no" title="statement not covered" > * Will enhance the reported stats with additional participant-specific information (`callStatsReport$` state [store variable](./StreamVideoClient.md/#readonlystatestore)).</span>
1667
+ <span class="cstat-no" title="statement not covered" > * This is usually helpful when detailed stats for a specific participant are needed.</span>
1668
+ <span class="cstat-no" title="statement not covered" > *</span>
1669
+ <span class="cstat-no" title="statement not covered" > * @param sessionId the sessionId to start reporting for.</span>
1670
+ <span class="cstat-no" title="statement not covered" > */</span>
1671
+ <span class="cstat-no" title="statement not covered" > startReportingStatsFor = (sessionId: string) =&gt; {</span>
1672
+ <span class="cstat-no" title="statement not covered" > return this.statsReporter.startReportingStatsFor(sessionId);</span>
1673
+ <span class="cstat-no" title="statement not covered" > };</span>
1674
+ <span class="cstat-no" title="statement not covered" ></span>
1675
+ <span class="cstat-no" title="statement not covered" > /**</span>
1676
+ <span class="cstat-no" title="statement not covered" > * Opposite of `startReportingStatsFor`.</span>
1677
+ <span class="cstat-no" title="statement not covered" > * Will turn off stats reporting for a specific participant.</span>
1678
+ <span class="cstat-no" title="statement not covered" > *</span>
1679
+ <span class="cstat-no" title="statement not covered" > * @param sessionId the sessionId to stop reporting for.</span>
1680
+ <span class="cstat-no" title="statement not covered" > */</span>
1681
+ <span class="cstat-no" title="statement not covered" > stopReportingStatsFor = (sessionId: string) =&gt; {</span>
1682
+ <span class="cstat-no" title="statement not covered" > return this.statsReporter.stopReportingStatsFor(sessionId);</span>
1683
+ <span class="cstat-no" title="statement not covered" > };</span>
1684
+ <span class="cstat-no" title="statement not covered" ></span>
1685
+ <span class="cstat-no" title="statement not covered" > /**</span>
1686
+ <span class="cstat-no" title="statement not covered" > * Sets the used audio output device (`audioOutputDeviceId` of the [`localParticipant$`](./StreamVideoClient.md/#readonlystatestore).</span>
1687
+ <span class="cstat-no" title="statement not covered" > *</span>
1688
+ <span class="cstat-no" title="statement not covered" > * This method only stores the selection, if you're using custom UI components, you'll have to implement the audio switching, for more information see: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/sinkId.</span>
1689
+ <span class="cstat-no" title="statement not covered" > *</span>
1690
+ <span class="cstat-no" title="statement not covered" > * @angular It's recommended to use the [`InCallDeviceManagerService`](./InCallDeviceManagerService.md) that takes care of this operation for you.</span>
1691
+ <span class="cstat-no" title="statement not covered" > *</span>
1692
+ <span class="cstat-no" title="statement not covered" > * @param deviceId the selected device, `undefined` means the user wants to use the system's default audio output</span>
1693
+ <span class="cstat-no" title="statement not covered" > */</span>
1694
+ <span class="cstat-no" title="statement not covered" > setAudioOutputDevice = (deviceId?: string) =&gt; {</span>
1695
+ <span class="cstat-no" title="statement not covered" > this.stateStore.updateParticipant(this.client.sessionId, {</span>
1696
+ <span class="cstat-no" title="statement not covered" > audioOutputDeviceId: deviceId,</span>
1697
+ <span class="cstat-no" title="statement not covered" > });</span>
1698
+ <span class="cstat-no" title="statement not covered" > };</span>
1699
+ <span class="cstat-no" title="statement not covered" ></span>
1700
+ <span class="cstat-no" title="statement not covered" > /**</span>
1701
+ <span class="cstat-no" title="statement not covered" > * Sets the `audioDeviceId` property of the [`localParticipant$`](./StreamVideoClient.md/#readonlystatestore)).</span>
1702
+ <span class="cstat-no" title="statement not covered" > *</span>
1703
+ <span class="cstat-no" title="statement not covered" > * This method only stores the selection, if you want to start publishing a media stream call the [`publishAudioStream` method](#publishaudiostream) that will set `audioDeviceId` as well.</span>
1704
+ <span class="cstat-no" title="statement not covered" > *</span>
1705
+ <span class="cstat-no" title="statement not covered" > * @angular It's recommended to use the [`InCallDeviceManagerService`](./InCallDeviceManagerService.md) that takes care of this operation for you.</span>
1706
+ <span class="cstat-no" title="statement not covered" > *</span>
1707
+ <span class="cstat-no" title="statement not covered" > * @param deviceId the selected device, pass `undefined` to clear the device selection</span>
1708
+ <span class="cstat-no" title="statement not covered" > */</span>
1709
+ <span class="cstat-no" title="statement not covered" > setAudioDevice = (deviceId?: string) =&gt; {</span>
1710
+ <span class="cstat-no" title="statement not covered" > this.stateStore.updateParticipant(this.client.sessionId, {</span>
1711
+ <span class="cstat-no" title="statement not covered" > audioDeviceId: deviceId,</span>
1712
+ <span class="cstat-no" title="statement not covered" > });</span>
1713
+ <span class="cstat-no" title="statement not covered" > };</span>
1714
+ <span class="cstat-no" title="statement not covered" ></span>
1715
+ <span class="cstat-no" title="statement not covered" > /**</span>
1716
+ <span class="cstat-no" title="statement not covered" > * Sets the `videoDeviceId` property of the [`localParticipant$`](./StreamVideoClient.md/#readonlystatestore).</span>
1717
+ <span class="cstat-no" title="statement not covered" > *</span>
1718
+ <span class="cstat-no" title="statement not covered" > * This method only stores the selection, if you want to start publishing a media stream call the [`publishVideoStream` method](#publishvideostream) that will set `videoDeviceId` as well.</span>
1719
+ <span class="cstat-no" title="statement not covered" > *</span>
1720
+ <span class="cstat-no" title="statement not covered" > * @angular It's recommended to use the [`InCallDeviceManagerService`](./InCallDeviceManagerService.md) that takes care of this operation for you.</span>
1721
+ <span class="cstat-no" title="statement not covered" > *</span>
1722
+ <span class="cstat-no" title="statement not covered" > * @param deviceId the selected device, pass `undefined` to clear the device selection</span>
1723
+ <span class="cstat-no" title="statement not covered" > */</span>
1724
+ <span class="cstat-no" title="statement not covered" > setVideoDevice = (deviceId?: string) =&gt; {</span>
1725
+ <span class="cstat-no" title="statement not covered" > this.stateStore.updateParticipant(this.client.sessionId, {</span>
1726
+ <span class="cstat-no" title="statement not covered" > videoDeviceId: deviceId,</span>
1727
+ <span class="cstat-no" title="statement not covered" > });</span>
1728
+ <span class="cstat-no" title="statement not covered" > };</span>
1729
+ <span class="cstat-no" title="statement not covered" ></span>
1730
+ <span class="cstat-no" title="statement not covered" > /**</span>
1731
+ <span class="cstat-no" title="statement not covered" > * @internal</span>
1732
+ <span class="cstat-no" title="statement not covered" > * @param enabledRids</span>
1733
+ <span class="cstat-no" title="statement not covered" > * @returns</span>
1734
+ <span class="cstat-no" title="statement not covered" > */</span>
1735
+ <span class="cstat-no" title="statement not covered" > updatePublishQuality = async (enabledRids: string[]) =&gt; {</span>
1736
+ <span class="cstat-no" title="statement not covered" > this.publisher.updateVideoPublishQuality(enabledRids);</span>
1737
+ <span class="cstat-no" title="statement not covered" > };</span>
1738
+ <span class="cstat-no" title="statement not covered" ></span>
1739
+ <span class="cstat-no" title="statement not covered" > private get participants() {</span>
1740
+ <span class="cstat-no" title="statement not covered" > return this.stateStore.getCurrentValue(this.stateStore.participantsSubject);</span>
1741
+ <span class="cstat-no" title="statement not covered" > }</span>
1742
+ <span class="cstat-no" title="statement not covered" ></span>
1743
+ <span class="cstat-no" title="statement not covered" > private handleOnTrack = (e: RTCTrackEvent) =&gt; {</span>
1744
+ <span class="cstat-no" title="statement not covered" > const [primaryStream] = e.streams;</span>
1745
+ <span class="cstat-no" title="statement not covered" > // example: `e3f6aaf8-b03d-4911-be36-83f47d37a76a:TRACK_TYPE_VIDEO`</span>
1746
+ <span class="cstat-no" title="statement not covered" > const [trackId, trackType] = primaryStream.id.split(':');</span>
1747
+ <span class="cstat-no" title="statement not covered" > console.log(`Got remote ${trackType} track:`, e.track);</span>
1748
+ <span class="cstat-no" title="statement not covered" > const participantToUpdate = this.participants.find(</span>
1749
+ <span class="cstat-no" title="statement not covered" > (p) =&gt; p.trackLookupPrefix === trackId,</span>
1750
+ <span class="cstat-no" title="statement not covered" > );</span>
1751
+ <span class="cstat-no" title="statement not covered" > if (!participantToUpdate) {</span>
1752
+ <span class="cstat-no" title="statement not covered" > console.error('Received track for unknown participant', trackId, e);</span>
1753
+ <span class="cstat-no" title="statement not covered" > return;</span>
1754
+ <span class="cstat-no" title="statement not covered" > }</span>
1755
+ <span class="cstat-no" title="statement not covered" ></span>
1756
+ <span class="cstat-no" title="statement not covered" > e.track.addEventListener('mute', () =&gt; {</span>
1757
+ <span class="cstat-no" title="statement not covered" > console.log(</span>
1758
+ <span class="cstat-no" title="statement not covered" > `Track muted:`,</span>
1759
+ <span class="cstat-no" title="statement not covered" > participantToUpdate.userId,</span>
1760
+ <span class="cstat-no" title="statement not covered" > `${trackType}:${trackId}`,</span>
1761
+ <span class="cstat-no" title="statement not covered" > e.track,</span>
1762
+ <span class="cstat-no" title="statement not covered" > );</span>
1763
+ <span class="cstat-no" title="statement not covered" > });</span>
1764
+ <span class="cstat-no" title="statement not covered" ></span>
1765
+ <span class="cstat-no" title="statement not covered" > e.track.addEventListener('unmute', () =&gt; {</span>
1766
+ <span class="cstat-no" title="statement not covered" > console.log(</span>
1767
+ <span class="cstat-no" title="statement not covered" > `Track unmuted:`,</span>
1768
+ <span class="cstat-no" title="statement not covered" > participantToUpdate.userId,</span>
1769
+ <span class="cstat-no" title="statement not covered" > `${trackType}:${trackId}`,</span>
1770
+ <span class="cstat-no" title="statement not covered" > e.track,</span>
1771
+ <span class="cstat-no" title="statement not covered" > );</span>
1772
+ <span class="cstat-no" title="statement not covered" > });</span>
1773
+ <span class="cstat-no" title="statement not covered" ></span>
1774
+ <span class="cstat-no" title="statement not covered" > e.track.addEventListener('ended', () =&gt; {</span>
1775
+ <span class="cstat-no" title="statement not covered" > console.log(</span>
1776
+ <span class="cstat-no" title="statement not covered" > `Track ended:`,</span>
1777
+ <span class="cstat-no" title="statement not covered" > participantToUpdate.userId,</span>
1778
+ <span class="cstat-no" title="statement not covered" > `${trackType}:${trackId}`,</span>
1779
+ <span class="cstat-no" title="statement not covered" > e.track,</span>
1780
+ <span class="cstat-no" title="statement not covered" > );</span>
1781
+ <span class="cstat-no" title="statement not covered" > });</span>
1782
+ <span class="cstat-no" title="statement not covered" ></span>
1783
+ <span class="cstat-no" title="statement not covered" > const streamKindProp = (</span>
1784
+ <span class="cstat-no" title="statement not covered" > {</span>
1785
+ <span class="cstat-no" title="statement not covered" > TRACK_TYPE_AUDIO: 'audioStream',</span>
1786
+ <span class="cstat-no" title="statement not covered" > TRACK_TYPE_VIDEO: 'videoStream',</span>
1787
+ <span class="cstat-no" title="statement not covered" > TRACK_TYPE_SCREEN_SHARE: 'screenShareStream',</span>
1788
+ <span class="cstat-no" title="statement not covered" > } as const</span>
1789
+ <span class="cstat-no" title="statement not covered" > )[trackType];</span>
1790
+ <span class="cstat-no" title="statement not covered" ></span>
1791
+ <span class="cstat-no" title="statement not covered" > if (!streamKindProp) {</span>
1792
+ <span class="cstat-no" title="statement not covered" > console.error('Unknown track type', trackType);</span>
1793
+ <span class="cstat-no" title="statement not covered" > return;</span>
1794
+ <span class="cstat-no" title="statement not covered" > }</span>
1795
+ <span class="cstat-no" title="statement not covered" > const previousStream = participantToUpdate[streamKindProp];</span>
1796
+ <span class="cstat-no" title="statement not covered" > if (previousStream) {</span>
1797
+ <span class="cstat-no" title="statement not covered" > console.log(`Cleaning up previous remote tracks`, e.track.kind);</span>
1798
+ <span class="cstat-no" title="statement not covered" > previousStream.getTracks().forEach((t) =&gt; {</span>
1799
+ <span class="cstat-no" title="statement not covered" > t.stop();</span>
1800
+ <span class="cstat-no" title="statement not covered" > previousStream.removeTrack(t);</span>
1801
+ <span class="cstat-no" title="statement not covered" > });</span>
1802
+ <span class="cstat-no" title="statement not covered" > }</span>
1803
+ <span class="cstat-no" title="statement not covered" > this.stateStore.updateParticipant(participantToUpdate.sessionId, {</span>
1804
+ <span class="cstat-no" title="statement not covered" > [streamKindProp]: primaryStream,</span>
1805
+ <span class="cstat-no" title="statement not covered" > });</span>
1806
+ <span class="cstat-no" title="statement not covered" > };</span>
1807
+ <span class="cstat-no" title="statement not covered" ></span>
1808
+ <span class="cstat-no" title="statement not covered" > private assertCallJoined = () =&gt; {</span>
1809
+ <span class="cstat-no" title="statement not covered" > return new Promise&lt;void&gt;((resolve) =&gt; {</span>
1810
+ <span class="cstat-no" title="statement not covered" > this.joined$</span>
1811
+ <span class="cstat-no" title="statement not covered" > .pipe(</span>
1812
+ <span class="cstat-no" title="statement not covered" > takeWhile((isJoined) =&gt; !isJoined, true),</span>
1813
+ <span class="cstat-no" title="statement not covered" > filter((isJoined) =&gt; isJoined),</span>
1814
+ <span class="cstat-no" title="statement not covered" > )</span>
1815
+ <span class="cstat-no" title="statement not covered" > .subscribe(() =&gt; {</span>
1816
+ <span class="cstat-no" title="statement not covered" > resolve();</span>
1817
+ <span class="cstat-no" title="statement not covered" > });</span>
1818
+ <span class="cstat-no" title="statement not covered" > });</span>
1819
+ <span class="cstat-no" title="statement not covered" > };</span>
1820
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >}</span></span>
1821
+ &nbsp;</pre></td></tr></table></pre>
1822
+
1823
+ <div class='push'></div><!-- for sticky footer -->
1824
+ </div><!-- /wrapper -->
1825
+ <div class='footer quiet pad2 space-top1 center small'>
1826
+ Code coverage generated by
1827
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1828
+ at 2023-02-09T16:25:50.250Z
1829
+ </div>
1830
+ <script src="../../prettify.js"></script>
1831
+ <script>
1832
+ window.onload = function () {
1833
+ prettyPrint();
1834
+ };
1835
+ </script>
1836
+ <script src="../../sorter.js"></script>
1837
+ <script src="../../block-navigation.js"></script>
1838
+ </body>
1839
+ </html>
1840
+