@carecard/jwt-read 1.0.3 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/coverage/clover.xml +206 -0
- package/coverage/coverage-final.json +4 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +146 -0
- package/coverage/lcov-report/index.ts.html +94 -0
- package/coverage/lcov-report/jwtLib.ts.html +1363 -0
- package/coverage/lcov-report/jwtRoles.ts.html +151 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov-report/types.d.ts.html +175 -0
- package/coverage/lcov.info +428 -0
- package/index.js +20 -0
- package/lib/jwtLib.js +434 -0
- package/lib/jwtRoles.js +20 -0
- package/package.json +13 -46
- package/readme.md +4 -2
- /package/dist/cjs/{index.cjs → index.js} +0 -0
- /package/dist/cjs/{jwtLib.cjs → jwtLib.js} +0 -0
- /package/dist/cjs/{jwtRoles.cjs → jwtRoles.js} +0 -0
- /package/dist/cjs/{types.cjs → types.js} +0 -0
|
@@ -0,0 +1,1363 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for jwtLib.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> jwtLib.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">81.86% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>149/182</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">72.72% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>80/110</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">97.82% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>45/46</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">81.86% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>149/182</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line high'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
+
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
+
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
+
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
+
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
+
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
+
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
+
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
+
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
+
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
+
<a name='L427'></a><a href='#L427'>427</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
|
|
493
|
+
<span class="cline-any cline-yes">2x</span>
|
|
494
|
+
<span class="cline-any cline-yes">2x</span>
|
|
495
|
+
<span class="cline-any cline-neutral"> </span>
|
|
496
|
+
<span class="cline-any cline-neutral"> </span>
|
|
497
|
+
<span class="cline-any cline-neutral"> </span>
|
|
498
|
+
<span class="cline-any cline-yes">2x</span>
|
|
499
|
+
<span class="cline-any cline-yes">1x</span>
|
|
500
|
+
<span class="cline-any cline-neutral"> </span>
|
|
501
|
+
<span class="cline-any cline-neutral"> </span>
|
|
502
|
+
<span class="cline-any cline-yes">2x</span>
|
|
503
|
+
<span class="cline-any cline-yes">1x</span>
|
|
504
|
+
<span class="cline-any cline-neutral"> </span>
|
|
505
|
+
<span class="cline-any cline-neutral"> </span>
|
|
506
|
+
<span class="cline-any cline-yes">2x</span>
|
|
507
|
+
<span class="cline-any cline-yes">3x</span>
|
|
508
|
+
<span class="cline-any cline-yes">3x</span>
|
|
509
|
+
<span class="cline-any cline-neutral"> </span>
|
|
510
|
+
<span class="cline-any cline-no"> </span>
|
|
511
|
+
<span class="cline-any cline-neutral"> </span>
|
|
512
|
+
<span class="cline-any cline-neutral"> </span>
|
|
513
|
+
<span class="cline-any cline-neutral"> </span>
|
|
514
|
+
<span class="cline-any cline-yes">2x</span>
|
|
515
|
+
<span class="cline-any cline-yes">3x</span>
|
|
516
|
+
<span class="cline-any cline-neutral"> </span>
|
|
517
|
+
<span class="cline-any cline-neutral"> </span>
|
|
518
|
+
<span class="cline-any cline-yes">2x</span>
|
|
519
|
+
<span class="cline-any cline-yes">1x</span>
|
|
520
|
+
<span class="cline-any cline-yes">1x</span>
|
|
521
|
+
<span class="cline-any cline-neutral"> </span>
|
|
522
|
+
<span class="cline-any cline-no"> </span>
|
|
523
|
+
<span class="cline-any cline-neutral"> </span>
|
|
524
|
+
<span class="cline-any cline-neutral"> </span>
|
|
525
|
+
<span class="cline-any cline-neutral"> </span>
|
|
526
|
+
<span class="cline-any cline-yes">2x</span>
|
|
527
|
+
<span class="cline-any cline-neutral"> </span>
|
|
528
|
+
<span class="cline-any cline-yes">2x</span>
|
|
529
|
+
<span class="cline-any cline-neutral"> </span>
|
|
530
|
+
<span class="cline-any cline-neutral"> </span>
|
|
531
|
+
<span class="cline-any cline-neutral"> </span>
|
|
532
|
+
<span class="cline-any cline-neutral"> </span>
|
|
533
|
+
<span class="cline-any cline-neutral"> </span>
|
|
534
|
+
<span class="cline-any cline-yes">2x</span>
|
|
535
|
+
<span class="cline-any cline-yes">2x</span>
|
|
536
|
+
<span class="cline-any cline-neutral"> </span>
|
|
537
|
+
<span class="cline-any cline-yes">2x</span>
|
|
538
|
+
<span class="cline-any cline-yes">2x</span>
|
|
539
|
+
<span class="cline-any cline-neutral"> </span>
|
|
540
|
+
<span class="cline-any cline-neutral"> </span>
|
|
541
|
+
<span class="cline-any cline-yes">2x</span>
|
|
542
|
+
<span class="cline-any cline-neutral"> </span>
|
|
543
|
+
<span class="cline-any cline-neutral"> </span>
|
|
544
|
+
<span class="cline-any cline-neutral"> </span>
|
|
545
|
+
<span class="cline-any cline-neutral"> </span>
|
|
546
|
+
<span class="cline-any cline-yes">3x</span>
|
|
547
|
+
<span class="cline-any cline-neutral"> </span>
|
|
548
|
+
<span class="cline-any cline-yes">3x</span>
|
|
549
|
+
<span class="cline-any cline-neutral"> </span>
|
|
550
|
+
<span class="cline-any cline-yes">3x</span>
|
|
551
|
+
<span class="cline-any cline-yes">3x</span>
|
|
552
|
+
<span class="cline-any cline-neutral"> </span>
|
|
553
|
+
<span class="cline-any cline-no"> </span>
|
|
554
|
+
<span class="cline-any cline-no"> </span>
|
|
555
|
+
<span class="cline-any cline-neutral"> </span>
|
|
556
|
+
<span class="cline-any cline-neutral"> </span>
|
|
557
|
+
<span class="cline-any cline-yes">3x</span>
|
|
558
|
+
<span class="cline-any cline-neutral"> </span>
|
|
559
|
+
<span class="cline-any cline-neutral"> </span>
|
|
560
|
+
<span class="cline-any cline-yes">2x</span>
|
|
561
|
+
<span class="cline-any cline-neutral"> </span>
|
|
562
|
+
<span class="cline-any cline-neutral"> </span>
|
|
563
|
+
<span class="cline-any cline-neutral"> </span>
|
|
564
|
+
<span class="cline-any cline-neutral"> </span>
|
|
565
|
+
<span class="cline-any cline-neutral"> </span>
|
|
566
|
+
<span class="cline-any cline-yes">1x</span>
|
|
567
|
+
<span class="cline-any cline-neutral"> </span>
|
|
568
|
+
<span class="cline-any cline-yes">1x</span>
|
|
569
|
+
<span class="cline-any cline-neutral"> </span>
|
|
570
|
+
<span class="cline-any cline-neutral"> </span>
|
|
571
|
+
<span class="cline-any cline-neutral"> </span>
|
|
572
|
+
<span class="cline-any cline-neutral"> </span>
|
|
573
|
+
<span class="cline-any cline-neutral"> </span>
|
|
574
|
+
<span class="cline-any cline-yes">1x</span>
|
|
575
|
+
<span class="cline-any cline-yes">1x</span>
|
|
576
|
+
<span class="cline-any cline-neutral"> </span>
|
|
577
|
+
<span class="cline-any cline-no"> </span>
|
|
578
|
+
<span class="cline-any cline-no"> </span>
|
|
579
|
+
<span class="cline-any cline-neutral"> </span>
|
|
580
|
+
<span class="cline-any cline-neutral"> </span>
|
|
581
|
+
<span class="cline-any cline-yes">1x</span>
|
|
582
|
+
<span class="cline-any cline-neutral"> </span>
|
|
583
|
+
<span class="cline-any cline-neutral"> </span>
|
|
584
|
+
<span class="cline-any cline-yes">2x</span>
|
|
585
|
+
<span class="cline-any cline-neutral"> </span>
|
|
586
|
+
<span class="cline-any cline-neutral"> </span>
|
|
587
|
+
<span class="cline-any cline-neutral"> </span>
|
|
588
|
+
<span class="cline-any cline-yes">3x</span>
|
|
589
|
+
<span class="cline-any cline-yes">3x</span>
|
|
590
|
+
<span class="cline-any cline-neutral"> </span>
|
|
591
|
+
<span class="cline-any cline-yes">3x</span>
|
|
592
|
+
<span class="cline-any cline-neutral"> </span>
|
|
593
|
+
<span class="cline-any cline-yes">3x</span>
|
|
594
|
+
<span class="cline-any cline-yes">1x</span>
|
|
595
|
+
<span class="cline-any cline-neutral"> </span>
|
|
596
|
+
<span class="cline-any cline-yes">2x</span>
|
|
597
|
+
<span class="cline-any cline-neutral"> </span>
|
|
598
|
+
<span class="cline-any cline-neutral"> </span>
|
|
599
|
+
<span class="cline-any cline-no"> </span>
|
|
600
|
+
<span class="cline-any cline-neutral"> </span>
|
|
601
|
+
<span class="cline-any cline-neutral"> </span>
|
|
602
|
+
<span class="cline-any cline-yes">3x</span>
|
|
603
|
+
<span class="cline-any cline-neutral"> </span>
|
|
604
|
+
<span class="cline-any cline-neutral"> </span>
|
|
605
|
+
<span class="cline-any cline-yes">2x</span>
|
|
606
|
+
<span class="cline-any cline-neutral"> </span>
|
|
607
|
+
<span class="cline-any cline-neutral"> </span>
|
|
608
|
+
<span class="cline-any cline-neutral"> </span>
|
|
609
|
+
<span class="cline-any cline-neutral"> </span>
|
|
610
|
+
<span class="cline-any cline-yes">1x</span>
|
|
611
|
+
<span class="cline-any cline-yes">1x</span>
|
|
612
|
+
<span class="cline-any cline-neutral"> </span>
|
|
613
|
+
<span class="cline-any cline-yes">1x</span>
|
|
614
|
+
<span class="cline-any cline-neutral"> </span>
|
|
615
|
+
<span class="cline-any cline-yes">1x</span>
|
|
616
|
+
<span class="cline-any cline-yes">1x</span>
|
|
617
|
+
<span class="cline-any cline-neutral"> </span>
|
|
618
|
+
<span class="cline-any cline-no"> </span>
|
|
619
|
+
<span class="cline-any cline-neutral"> </span>
|
|
620
|
+
<span class="cline-any cline-neutral"> </span>
|
|
621
|
+
<span class="cline-any cline-no"> </span>
|
|
622
|
+
<span class="cline-any cline-neutral"> </span>
|
|
623
|
+
<span class="cline-any cline-neutral"> </span>
|
|
624
|
+
<span class="cline-any cline-yes">1x</span>
|
|
625
|
+
<span class="cline-any cline-neutral"> </span>
|
|
626
|
+
<span class="cline-any cline-neutral"> </span>
|
|
627
|
+
<span class="cline-any cline-yes">2x</span>
|
|
628
|
+
<span class="cline-any cline-neutral"> </span>
|
|
629
|
+
<span class="cline-any cline-neutral"> </span>
|
|
630
|
+
<span class="cline-any cline-neutral"> </span>
|
|
631
|
+
<span class="cline-any cline-yes">1x</span>
|
|
632
|
+
<span class="cline-any cline-yes">1x</span>
|
|
633
|
+
<span class="cline-any cline-neutral"> </span>
|
|
634
|
+
<span class="cline-any cline-yes">1x</span>
|
|
635
|
+
<span class="cline-any cline-neutral"> </span>
|
|
636
|
+
<span class="cline-any cline-yes">1x</span>
|
|
637
|
+
<span class="cline-any cline-yes">1x</span>
|
|
638
|
+
<span class="cline-any cline-neutral"> </span>
|
|
639
|
+
<span class="cline-any cline-no"> </span>
|
|
640
|
+
<span class="cline-any cline-neutral"> </span>
|
|
641
|
+
<span class="cline-any cline-neutral"> </span>
|
|
642
|
+
<span class="cline-any cline-no"> </span>
|
|
643
|
+
<span class="cline-any cline-neutral"> </span>
|
|
644
|
+
<span class="cline-any cline-neutral"> </span>
|
|
645
|
+
<span class="cline-any cline-yes">1x</span>
|
|
646
|
+
<span class="cline-any cline-neutral"> </span>
|
|
647
|
+
<span class="cline-any cline-neutral"> </span>
|
|
648
|
+
<span class="cline-any cline-yes">2x</span>
|
|
649
|
+
<span class="cline-any cline-yes">1x</span>
|
|
650
|
+
<span class="cline-any cline-yes">1x</span>
|
|
651
|
+
<span class="cline-any cline-yes">1x</span>
|
|
652
|
+
<span class="cline-any cline-yes">1x</span>
|
|
653
|
+
<span class="cline-any cline-neutral"> </span>
|
|
654
|
+
<span class="cline-any cline-neutral"> </span>
|
|
655
|
+
<span class="cline-any cline-neutral"> </span>
|
|
656
|
+
<span class="cline-any cline-neutral"> </span>
|
|
657
|
+
<span class="cline-any cline-neutral"> </span>
|
|
658
|
+
<span class="cline-any cline-yes">2x</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-neutral"> </span>
|
|
663
|
+
<span class="cline-any cline-neutral"> </span>
|
|
664
|
+
<span class="cline-any cline-neutral"> </span>
|
|
665
|
+
<span class="cline-any cline-neutral"> </span>
|
|
666
|
+
<span class="cline-any cline-yes">2x</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-neutral"> </span>
|
|
671
|
+
<span class="cline-any cline-neutral"> </span>
|
|
672
|
+
<span class="cline-any cline-neutral"> </span>
|
|
673
|
+
<span class="cline-any cline-neutral"> </span>
|
|
674
|
+
<span class="cline-any cline-yes">2x</span>
|
|
675
|
+
<span class="cline-any cline-yes">3x</span>
|
|
676
|
+
<span class="cline-any cline-yes">3x</span>
|
|
677
|
+
<span class="cline-any cline-yes">3x</span>
|
|
678
|
+
<span class="cline-any cline-neutral"> </span>
|
|
679
|
+
<span class="cline-any cline-neutral"> </span>
|
|
680
|
+
<span class="cline-any cline-neutral"> </span>
|
|
681
|
+
<span class="cline-any cline-neutral"> </span>
|
|
682
|
+
<span class="cline-any cline-yes">2x</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-neutral"> </span>
|
|
687
|
+
<span class="cline-any cline-neutral"> </span>
|
|
688
|
+
<span class="cline-any cline-neutral"> </span>
|
|
689
|
+
<span class="cline-any cline-neutral"> </span>
|
|
690
|
+
<span class="cline-any cline-yes">2x</span>
|
|
691
|
+
<span class="cline-any cline-yes">1x</span>
|
|
692
|
+
<span class="cline-any cline-yes">1x</span>
|
|
693
|
+
<span class="cline-any cline-yes">1x</span>
|
|
694
|
+
<span class="cline-any cline-neutral"> </span>
|
|
695
|
+
<span class="cline-any cline-neutral"> </span>
|
|
696
|
+
<span class="cline-any cline-neutral"> </span>
|
|
697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
698
|
+
<span class="cline-any cline-yes">2x</span>
|
|
699
|
+
<span class="cline-any cline-no"> </span>
|
|
700
|
+
<span class="cline-any cline-neutral"> </span>
|
|
701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
702
|
+
<span class="cline-any cline-neutral"> </span>
|
|
703
|
+
<span class="cline-any cline-neutral"> </span>
|
|
704
|
+
<span class="cline-any cline-neutral"> </span>
|
|
705
|
+
<span class="cline-any cline-yes">2x</span>
|
|
706
|
+
<span class="cline-any cline-yes">1x</span>
|
|
707
|
+
<span class="cline-any cline-no"> </span>
|
|
708
|
+
<span class="cline-any cline-neutral"> </span>
|
|
709
|
+
<span class="cline-any cline-neutral"> </span>
|
|
710
|
+
<span class="cline-any cline-neutral"> </span>
|
|
711
|
+
<span class="cline-any cline-yes">2x</span>
|
|
712
|
+
<span class="cline-any cline-neutral"> </span>
|
|
713
|
+
<span class="cline-any cline-neutral"> </span>
|
|
714
|
+
<span class="cline-any cline-neutral"> </span>
|
|
715
|
+
<span class="cline-any cline-neutral"> </span>
|
|
716
|
+
<span class="cline-any cline-yes">5x</span>
|
|
717
|
+
<span class="cline-any cline-yes">5x</span>
|
|
718
|
+
<span class="cline-any cline-neutral"> </span>
|
|
719
|
+
<span class="cline-any cline-no"> </span>
|
|
720
|
+
<span class="cline-any cline-neutral"> </span>
|
|
721
|
+
<span class="cline-any cline-neutral"> </span>
|
|
722
|
+
<span class="cline-any cline-neutral"> </span>
|
|
723
|
+
<span class="cline-any cline-yes">2x</span>
|
|
724
|
+
<span class="cline-any cline-yes">4x</span>
|
|
725
|
+
<span class="cline-any cline-yes">4x</span>
|
|
726
|
+
<span class="cline-any cline-neutral"> </span>
|
|
727
|
+
<span class="cline-any cline-no"> </span>
|
|
728
|
+
<span class="cline-any cline-neutral"> </span>
|
|
729
|
+
<span class="cline-any cline-neutral"> </span>
|
|
730
|
+
<span class="cline-any cline-neutral"> </span>
|
|
731
|
+
<span class="cline-any cline-yes">2x</span>
|
|
732
|
+
<span class="cline-any cline-neutral"> </span>
|
|
733
|
+
<span class="cline-any cline-neutral"> </span>
|
|
734
|
+
<span class="cline-any cline-neutral"> </span>
|
|
735
|
+
<span class="cline-any cline-yes">1x</span>
|
|
736
|
+
<span class="cline-any cline-yes">1x</span>
|
|
737
|
+
<span class="cline-any cline-neutral"> </span>
|
|
738
|
+
<span class="cline-any cline-no"> </span>
|
|
739
|
+
<span class="cline-any cline-neutral"> </span>
|
|
740
|
+
<span class="cline-any cline-neutral"> </span>
|
|
741
|
+
<span class="cline-any cline-neutral"> </span>
|
|
742
|
+
<span class="cline-any cline-yes">2x</span>
|
|
743
|
+
<span class="cline-any cline-neutral"> </span>
|
|
744
|
+
<span class="cline-any cline-neutral"> </span>
|
|
745
|
+
<span class="cline-any cline-neutral"> </span>
|
|
746
|
+
<span class="cline-any cline-neutral"> </span>
|
|
747
|
+
<span class="cline-any cline-yes">5x</span>
|
|
748
|
+
<span class="cline-any cline-yes">5x</span>
|
|
749
|
+
<span class="cline-any cline-neutral"> </span>
|
|
750
|
+
<span class="cline-any cline-no"> </span>
|
|
751
|
+
<span class="cline-any cline-neutral"> </span>
|
|
752
|
+
<span class="cline-any cline-neutral"> </span>
|
|
753
|
+
<span class="cline-any cline-neutral"> </span>
|
|
754
|
+
<span class="cline-any cline-yes">2x</span>
|
|
755
|
+
<span class="cline-any cline-neutral"> </span>
|
|
756
|
+
<span class="cline-any cline-neutral"> </span>
|
|
757
|
+
<span class="cline-any cline-neutral"> </span>
|
|
758
|
+
<span class="cline-any cline-yes">7x</span>
|
|
759
|
+
<span class="cline-any cline-yes">5x</span>
|
|
760
|
+
<span class="cline-any cline-neutral"> </span>
|
|
761
|
+
<span class="cline-any cline-yes">2x</span>
|
|
762
|
+
<span class="cline-any cline-neutral"> </span>
|
|
763
|
+
<span class="cline-any cline-neutral"> </span>
|
|
764
|
+
<span class="cline-any cline-neutral"> </span>
|
|
765
|
+
<span class="cline-any cline-yes">2x</span>
|
|
766
|
+
<span class="cline-any cline-neutral"> </span>
|
|
767
|
+
<span class="cline-any cline-neutral"> </span>
|
|
768
|
+
<span class="cline-any cline-neutral"> </span>
|
|
769
|
+
<span class="cline-any cline-neutral"> </span>
|
|
770
|
+
<span class="cline-any cline-yes">4x</span>
|
|
771
|
+
<span class="cline-any cline-neutral"> </span>
|
|
772
|
+
<span class="cline-any cline-neutral"> </span>
|
|
773
|
+
<span class="cline-any cline-yes">4x</span>
|
|
774
|
+
<span class="cline-any cline-neutral"> </span>
|
|
775
|
+
<span class="cline-any cline-neutral"> </span>
|
|
776
|
+
<span class="cline-any cline-yes">4x</span>
|
|
777
|
+
<span class="cline-any cline-yes">4x</span>
|
|
778
|
+
<span class="cline-any cline-neutral"> </span>
|
|
779
|
+
<span class="cline-any cline-no"> </span>
|
|
780
|
+
<span class="cline-any cline-neutral"> </span>
|
|
781
|
+
<span class="cline-any cline-neutral"> </span>
|
|
782
|
+
<span class="cline-any cline-neutral"> </span>
|
|
783
|
+
<span class="cline-any cline-yes">2x</span>
|
|
784
|
+
<span class="cline-any cline-neutral"> </span>
|
|
785
|
+
<span class="cline-any cline-neutral"> </span>
|
|
786
|
+
<span class="cline-any cline-neutral"> </span>
|
|
787
|
+
<span class="cline-any cline-neutral"> </span>
|
|
788
|
+
<span class="cline-any cline-neutral"> </span>
|
|
789
|
+
<span class="cline-any cline-yes">1x</span>
|
|
790
|
+
<span class="cline-any cline-neutral"> </span>
|
|
791
|
+
<span class="cline-any cline-neutral"> </span>
|
|
792
|
+
<span class="cline-any cline-yes">1x</span>
|
|
793
|
+
<span class="cline-any cline-neutral"> </span>
|
|
794
|
+
<span class="cline-any cline-neutral"> </span>
|
|
795
|
+
<span class="cline-any cline-yes">1x</span>
|
|
796
|
+
<span class="cline-any cline-yes">1x</span>
|
|
797
|
+
<span class="cline-any cline-neutral"> </span>
|
|
798
|
+
<span class="cline-any cline-no"> </span>
|
|
799
|
+
<span class="cline-any cline-neutral"> </span>
|
|
800
|
+
<span class="cline-any cline-neutral"> </span>
|
|
801
|
+
<span class="cline-any cline-neutral"> </span>
|
|
802
|
+
<span class="cline-any cline-yes">2x</span>
|
|
803
|
+
<span class="cline-any cline-neutral"> </span>
|
|
804
|
+
<span class="cline-any cline-yes">6x</span>
|
|
805
|
+
<span class="cline-any cline-neutral"> </span>
|
|
806
|
+
<span class="cline-any cline-yes">6x</span>
|
|
807
|
+
<span class="cline-any cline-yes">2x</span>
|
|
808
|
+
<span class="cline-any cline-neutral"> </span>
|
|
809
|
+
<span class="cline-any cline-neutral"> </span>
|
|
810
|
+
<span class="cline-any cline-neutral"> </span>
|
|
811
|
+
<span class="cline-any cline-yes">4x</span>
|
|
812
|
+
<span class="cline-any cline-neutral"> </span>
|
|
813
|
+
<span class="cline-any cline-neutral"> </span>
|
|
814
|
+
<span class="cline-any cline-yes">4x</span>
|
|
815
|
+
<span class="cline-any cline-yes">3x</span>
|
|
816
|
+
<span class="cline-any cline-neutral"> </span>
|
|
817
|
+
<span class="cline-any cline-neutral"> </span>
|
|
818
|
+
<span class="cline-any cline-yes">1x</span>
|
|
819
|
+
<span class="cline-any cline-neutral"> </span>
|
|
820
|
+
<span class="cline-any cline-neutral"> </span>
|
|
821
|
+
<span class="cline-any cline-yes">2x</span>
|
|
822
|
+
<span class="cline-any cline-neutral"> </span>
|
|
823
|
+
<span class="cline-any cline-yes">1x</span>
|
|
824
|
+
<span class="cline-any cline-neutral"> </span>
|
|
825
|
+
<span class="cline-any cline-yes">1x</span>
|
|
826
|
+
<span class="cline-any cline-no"> </span>
|
|
827
|
+
<span class="cline-any cline-neutral"> </span>
|
|
828
|
+
<span class="cline-any cline-neutral"> </span>
|
|
829
|
+
<span class="cline-any cline-neutral"> </span>
|
|
830
|
+
<span class="cline-any cline-yes">1x</span>
|
|
831
|
+
<span class="cline-any cline-neutral"> </span>
|
|
832
|
+
<span class="cline-any cline-neutral"> </span>
|
|
833
|
+
<span class="cline-any cline-yes">1x</span>
|
|
834
|
+
<span class="cline-any cline-yes">1x</span>
|
|
835
|
+
<span class="cline-any cline-neutral"> </span>
|
|
836
|
+
<span class="cline-any cline-neutral"> </span>
|
|
837
|
+
<span class="cline-any cline-no"> </span>
|
|
838
|
+
<span class="cline-any cline-neutral"> </span>
|
|
839
|
+
<span class="cline-any cline-neutral"> </span>
|
|
840
|
+
<span class="cline-any cline-yes">2x</span>
|
|
841
|
+
<span class="cline-any cline-neutral"> </span>
|
|
842
|
+
<span class="cline-any cline-yes">1x</span>
|
|
843
|
+
<span class="cline-any cline-neutral"> </span>
|
|
844
|
+
<span class="cline-any cline-yes">1x</span>
|
|
845
|
+
<span class="cline-any cline-no"> </span>
|
|
846
|
+
<span class="cline-any cline-neutral"> </span>
|
|
847
|
+
<span class="cline-any cline-neutral"> </span>
|
|
848
|
+
<span class="cline-any cline-neutral"> </span>
|
|
849
|
+
<span class="cline-any cline-yes">1x</span>
|
|
850
|
+
<span class="cline-any cline-neutral"> </span>
|
|
851
|
+
<span class="cline-any cline-neutral"> </span>
|
|
852
|
+
<span class="cline-any cline-yes">1x</span>
|
|
853
|
+
<span class="cline-any cline-yes">1x</span>
|
|
854
|
+
<span class="cline-any cline-neutral"> </span>
|
|
855
|
+
<span class="cline-any cline-neutral"> </span>
|
|
856
|
+
<span class="cline-any cline-no"> </span>
|
|
857
|
+
<span class="cline-any cline-neutral"> </span>
|
|
858
|
+
<span class="cline-any cline-neutral"> </span>
|
|
859
|
+
<span class="cline-any cline-yes">2x</span>
|
|
860
|
+
<span class="cline-any cline-neutral"> </span>
|
|
861
|
+
<span class="cline-any cline-neutral"> </span>
|
|
862
|
+
<span class="cline-any cline-neutral"> </span>
|
|
863
|
+
<span class="cline-any cline-yes">4x</span>
|
|
864
|
+
<span class="cline-any cline-neutral"> </span>
|
|
865
|
+
<span class="cline-any cline-yes">4x</span>
|
|
866
|
+
<span class="cline-any cline-yes">4x</span>
|
|
867
|
+
<span class="cline-any cline-neutral"> </span>
|
|
868
|
+
<span class="cline-any cline-no"> </span>
|
|
869
|
+
<span class="cline-any cline-no"> </span>
|
|
870
|
+
<span class="cline-any cline-neutral"> </span>
|
|
871
|
+
<span class="cline-any cline-neutral"> </span>
|
|
872
|
+
<span class="cline-any cline-neutral"> </span>
|
|
873
|
+
<span class="cline-any cline-yes">4x</span>
|
|
874
|
+
<span class="cline-any cline-no"> </span>
|
|
875
|
+
<span class="cline-any cline-no"> </span>
|
|
876
|
+
<span class="cline-any cline-neutral"> </span>
|
|
877
|
+
<span class="cline-any cline-neutral"> </span>
|
|
878
|
+
<span class="cline-any cline-yes">4x</span>
|
|
879
|
+
<span class="cline-any cline-yes">4x</span>
|
|
880
|
+
<span class="cline-any cline-neutral"> </span>
|
|
881
|
+
<span class="cline-any cline-no"> </span>
|
|
882
|
+
<span class="cline-any cline-no"> </span>
|
|
883
|
+
<span class="cline-any cline-neutral"> </span>
|
|
884
|
+
<span class="cline-any cline-neutral"> </span>
|
|
885
|
+
<span class="cline-any cline-neutral"> </span>
|
|
886
|
+
<span class="cline-any cline-yes">2x</span>
|
|
887
|
+
<span class="cline-any cline-yes">1x</span>
|
|
888
|
+
<span class="cline-any cline-yes">1x</span>
|
|
889
|
+
<span class="cline-any cline-neutral"> </span>
|
|
890
|
+
<span class="cline-any cline-no"> </span>
|
|
891
|
+
<span class="cline-any cline-neutral"> </span>
|
|
892
|
+
<span class="cline-any cline-neutral"> </span>
|
|
893
|
+
<span class="cline-any cline-no"> </span>
|
|
894
|
+
<span class="cline-any cline-neutral"> </span>
|
|
895
|
+
<span class="cline-any cline-neutral"> </span>
|
|
896
|
+
<span class="cline-any cline-yes">2x</span>
|
|
897
|
+
<span class="cline-any cline-yes">5x</span>
|
|
898
|
+
<span class="cline-any cline-neutral"> </span>
|
|
899
|
+
<span class="cline-any cline-yes">5x</span>
|
|
900
|
+
<span class="cline-any cline-yes">5x</span>
|
|
901
|
+
<span class="cline-any cline-neutral"> </span>
|
|
902
|
+
<span class="cline-any cline-no"> </span>
|
|
903
|
+
<span class="cline-any cline-neutral"> </span>
|
|
904
|
+
<span class="cline-any cline-neutral"> </span>
|
|
905
|
+
<span class="cline-any cline-yes">5x</span>
|
|
906
|
+
<span class="cline-any cline-yes">4x</span>
|
|
907
|
+
<span class="cline-any cline-neutral"> </span>
|
|
908
|
+
<span class="cline-any cline-neutral"> </span>
|
|
909
|
+
<span class="cline-any cline-yes">1x</span>
|
|
910
|
+
<span class="cline-any cline-neutral"> </span>
|
|
911
|
+
<span class="cline-any cline-neutral"> </span>
|
|
912
|
+
<span class="cline-any cline-yes">2x</span>
|
|
913
|
+
<span class="cline-any cline-yes">1x</span>
|
|
914
|
+
<span class="cline-any cline-yes">1x</span>
|
|
915
|
+
<span class="cline-any cline-neutral"> </span>
|
|
916
|
+
<span class="cline-any cline-no"> </span>
|
|
917
|
+
<span class="cline-any cline-neutral"> </span>
|
|
918
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import * as validate from '@carecard/validate';
|
|
919
|
+
import * as jwtUtilAuth from '@carecard/auth-util';
|
|
920
|
+
import { throwLoginRequiredError, throwNotAuthorizedError } from '@carecard/common-util';
|
|
921
|
+
import type { Response, NextFunction } from 'express';
|
|
922
|
+
import { RequestWithJWToken, Role } from './types';
|
|
923
|
+
|
|
924
|
+
export function jwtClientId(req: RequestWithJWToken) {
|
|
925
|
+
return req?.jwt?.payload?.client_id;
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
export function visitorClientId(req: RequestWithJWToken) {
|
|
929
|
+
return req?.visitor?.payload?.client_id;
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
export function doesJwtUserHasRole(req: RequestWithJWToken, userRole: Role) {
|
|
933
|
+
if (userRole && typeof userRole === 'string') {
|
|
934
|
+
return req?.jwt?.payload?.roles?.includes(userRole);
|
|
935
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
|
|
936
|
+
<span class="cstat-no" title="statement not covered" > throwNotAuthorizedError();</span>
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
export function throwError(customErrorFunction?: any) {
|
|
941
|
+
typeof customErrorFunction === 'function' ? customErrorFunction() : throwLoginRequiredError();
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
export function isJwtExpired(req: RequestWithJWToken, jwtValiditySeconds: number) {
|
|
945
|
+
if (jwtValiditySeconds && typeof jwtValiditySeconds === 'number') {
|
|
946
|
+
return Math.abs(Math.round(jwtValiditySeconds)) * 1000 < jwtAgeInMilliseconds(req);
|
|
947
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
|
|
948
|
+
<span class="cstat-no" title="statement not covered" > return true;</span>
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
export function jwtAgeInMilliseconds(req: RequestWithJWToken): number {
|
|
953
|
+
// Ensure req.jwt exists (create it if undefined)
|
|
954
|
+
<span class="branch-1 cbranch-no" title="branch not covered" > req.jwt ??= {</span>
|
|
955
|
+
header: { alg: 'sha512', typ: 'JWT' }, // or a minimal placeholder
|
|
956
|
+
payload: { iat: 0, client_id: '', roles: [], email_not_confirmed: false },
|
|
957
|
+
age: Infinity,
|
|
958
|
+
};
|
|
959
|
+
|
|
960
|
+
const iat = req.jwt.payload?.iat;
|
|
961
|
+
const age = typeof iat === 'number' && iat > 0 ? Date.now() - iat : <span class="branch-1 cbranch-no" title="branch not covered" >Infinity;</span>
|
|
962
|
+
|
|
963
|
+
req.jwt.age = age;
|
|
964
|
+
return age;
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
export async function validateAndExtractJwtObject(
|
|
968
|
+
req: RequestWithJWToken,
|
|
969
|
+
publicKey: string,
|
|
970
|
+
customErrorFunction?: any,
|
|
971
|
+
): Promise<any> {
|
|
972
|
+
const jwtString = await _validateJwt(req, customErrorFunction);
|
|
973
|
+
|
|
974
|
+
const isJwtSignatureValid = await _isJwtSignatureValid(jwtString, publicKey, customErrorFunction);
|
|
975
|
+
|
|
976
|
+
if (jwtString && isJwtSignatureValid) {
|
|
977
|
+
await _extractJwtObject(req, jwtString, customErrorFunction);
|
|
978
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
|
|
979
|
+
<span class="cstat-no" title="statement not covered" > req['jwt'] = null;</span>
|
|
980
|
+
<span class="cstat-no" title="statement not covered" > throwError(customErrorFunction);</span>
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
return req;
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
export async function validateAndExtractWebToken(
|
|
987
|
+
req: RequestWithJWToken,
|
|
988
|
+
publicKey: string,
|
|
989
|
+
headerName: string,
|
|
990
|
+
customErrorFunction?: any,
|
|
991
|
+
): Promise<any> {
|
|
992
|
+
const webTokenString = await _validateWebToken(req, headerName, customErrorFunction);
|
|
993
|
+
|
|
994
|
+
const isJwtSignatureValid = await _isJwtSignatureValid(
|
|
995
|
+
webTokenString,
|
|
996
|
+
publicKey,
|
|
997
|
+
customErrorFunction,
|
|
998
|
+
);
|
|
999
|
+
|
|
1000
|
+
if (webTokenString && isJwtSignatureValid) {
|
|
1001
|
+
await _extractJwtObject(req, webTokenString, customErrorFunction);
|
|
1002
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
|
|
1003
|
+
<span class="cstat-no" title="statement not covered" > req['jwt'] = null;</span>
|
|
1004
|
+
<span class="cstat-no" title="statement not covered" > throwError(customErrorFunction);</span>
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
return req;
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
export async function validateAndExtractJwtObjectNoThrow(
|
|
1011
|
+
req: RequestWithJWToken,
|
|
1012
|
+
publicKey: string,
|
|
1013
|
+
): Promise<any> {
|
|
1014
|
+
try {
|
|
1015
|
+
const jwtString = await _validateJwtNoThrow(req);
|
|
1016
|
+
|
|
1017
|
+
const isJwtSignatureValid = await _isJwtSignatureValidNoThrow(jwtString, publicKey);
|
|
1018
|
+
|
|
1019
|
+
if (jwtString && isJwtSignatureValid) {
|
|
1020
|
+
await _extractJwtObjectNoThrow(req, jwtString);
|
|
1021
|
+
} else {
|
|
1022
|
+
req['jwt'] = null;
|
|
1023
|
+
}
|
|
1024
|
+
} catch (err) {
|
|
1025
|
+
<span class="cstat-no" title="statement not covered" > req['jwt'] = null;</span>
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
return req;
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
export async function validateAndExtractWebTokenObjectNoThrow(
|
|
1032
|
+
req: RequestWithJWToken,
|
|
1033
|
+
publicKey: string,
|
|
1034
|
+
headerName: string,
|
|
1035
|
+
): Promise<any> {
|
|
1036
|
+
try {
|
|
1037
|
+
const jwtString = _validateWebTokenNoThrow(req, headerName);
|
|
1038
|
+
|
|
1039
|
+
const isJwtSignatureValid = await _isJwtSignatureValidNoThrow(jwtString, publicKey);
|
|
1040
|
+
|
|
1041
|
+
if (jwtString && isJwtSignatureValid) {
|
|
1042
|
+
await _extractJwtObjectNoThrow(req, jwtString);
|
|
1043
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
|
|
1044
|
+
<span class="cstat-no" title="statement not covered" > req['jwt'] = null;</span>
|
|
1045
|
+
}
|
|
1046
|
+
} catch (err) {
|
|
1047
|
+
<span class="cstat-no" title="statement not covered" > req['jwt'] = null;</span>
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
return req;
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
export async function validateAndExtractVisitorObjectNoThrow(
|
|
1054
|
+
req: RequestWithJWToken,
|
|
1055
|
+
publicKey: string,
|
|
1056
|
+
): Promise<any> {
|
|
1057
|
+
try {
|
|
1058
|
+
const jwtString = await _validateVisitorNoThrow(req);
|
|
1059
|
+
|
|
1060
|
+
const isJwtSignatureValid = await _isJwtSignatureValidNoThrow(jwtString, publicKey);
|
|
1061
|
+
|
|
1062
|
+
if (jwtString && isJwtSignatureValid) {
|
|
1063
|
+
await _extractVisitorObjectNoThrow(req, jwtString);
|
|
1064
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
|
|
1065
|
+
<span class="cstat-no" title="statement not covered" > req['visitor'] = null;</span>
|
|
1066
|
+
}
|
|
1067
|
+
} catch (err) {
|
|
1068
|
+
<span class="cstat-no" title="statement not covered" > req['visitor'] = null;</span>
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
return req;
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
export function verifyJwtAndRole(role: Role, publicKey: string, customErrorFunction?: any) {
|
|
1075
|
+
return async function (req: RequestWithJWToken, res: Response, next: NextFunction): Promise<any> {
|
|
1076
|
+
await validateAndExtractJwtObject(req, publicKey, customErrorFunction)
|
|
1077
|
+
.then(req => doesJwtUserHasRole(req, role))
|
|
1078
|
+
.then(isRoleExist => _isLoginRequired(isRoleExist, customErrorFunction))
|
|
1079
|
+
.then(next)
|
|
1080
|
+
.catch(next);
|
|
1081
|
+
};
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
export function verifyJwt(publicKey: string, customErrorFunction?: any) {
|
|
1085
|
+
return async function (req: RequestWithJWToken, res: Response, next: NextFunction): Promise<any> {
|
|
1086
|
+
await validateAndExtractJwtObject(req, publicKey, customErrorFunction)
|
|
1087
|
+
.then(() => process.nextTick(next))
|
|
1088
|
+
.catch(next);
|
|
1089
|
+
};
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
export function verifyWebToken(publicKey: string, headerName: string, customErrorFunction?: any) {
|
|
1093
|
+
return async function (req: RequestWithJWToken, res: Response, next: NextFunction): Promise<any> {
|
|
1094
|
+
await validateAndExtractWebToken(req, publicKey, headerName, customErrorFunction)
|
|
1095
|
+
.then(() => process.nextTick(next))
|
|
1096
|
+
.catch(next);
|
|
1097
|
+
};
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
export function verifyJwtNoThrow(publicKey: string) {
|
|
1101
|
+
return async function (req: RequestWithJWToken, res: Response, next: NextFunction) {
|
|
1102
|
+
await validateAndExtractJwtObjectNoThrow(req, publicKey)
|
|
1103
|
+
.then(() => process.nextTick(next))
|
|
1104
|
+
.catch(next);
|
|
1105
|
+
};
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
export function verifyWebTokenNoThrow(publicKey: string, headerName: string) {
|
|
1109
|
+
return async function (req: RequestWithJWToken, res: Response, next: NextFunction) {
|
|
1110
|
+
await validateAndExtractWebTokenObjectNoThrow(req, publicKey, headerName)
|
|
1111
|
+
.then(() => process.nextTick(next))
|
|
1112
|
+
.catch(next);
|
|
1113
|
+
};
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
export function verifyVisitorNoThrow(publicKey: string) {
|
|
1117
|
+
return async function (req: RequestWithJWToken, res: Response, next: NextFunction) {
|
|
1118
|
+
await validateAndExtractVisitorObjectNoThrow(req, publicKey)
|
|
1119
|
+
.then(() => process.nextTick(next))
|
|
1120
|
+
.catch(next);
|
|
1121
|
+
};
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
export function <span class="fstat-no" title="function not covered" >throwUsedTokenError(</span>) {
|
|
1125
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('Used_Token');</span>
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
/*********************
|
|
1129
|
+
* Private functions *
|
|
1130
|
+
*********************/
|
|
1131
|
+
export function _isLoginRequired(hasRequiredRole: boolean | undefined, customErrorFunction?: any) {
|
|
1132
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!hasRequiredRole) {
|
|
1133
|
+
<span class="cstat-no" title="statement not covered" > throwError(customErrorFunction);</span>
|
|
1134
|
+
}
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
export async function _extractJwtObject(
|
|
1138
|
+
req: RequestWithJWToken,
|
|
1139
|
+
jwt: string,
|
|
1140
|
+
customErrorFunction?: any,
|
|
1141
|
+
): Promise<any> {
|
|
1142
|
+
if (jwt && typeof jwt === 'string') {
|
|
1143
|
+
req['jwt'] = jwtUtilAuth.getHeaderPayloadFromJwt(jwt);
|
|
1144
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
|
|
1145
|
+
<span class="cstat-no" title="statement not covered" > throwError(customErrorFunction);</span>
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1148
|
+
|
|
1149
|
+
export async function _extractJwtObjectNoThrow(req: RequestWithJWToken, jwt: string): Promise<any> {
|
|
1150
|
+
if (jwt && typeof jwt === 'string') {
|
|
1151
|
+
req['jwt'] = jwtUtilAuth.getHeaderPayloadFromJwt(jwt);
|
|
1152
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
|
|
1153
|
+
<span class="cstat-no" title="statement not covered" > req['jwt'] = null;</span>
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
|
|
1157
|
+
export async function _extractVisitorObjectNoThrow(
|
|
1158
|
+
req: RequestWithJWToken,
|
|
1159
|
+
jwt: string,
|
|
1160
|
+
): Promise<any> {
|
|
1161
|
+
if (jwt && typeof jwt === 'string') {
|
|
1162
|
+
req['visitor'] = jwtUtilAuth.getHeaderPayloadFromJwt(jwt);
|
|
1163
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
|
|
1164
|
+
<span class="cstat-no" title="statement not covered" > req['visitor'] = null;</span>
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
export async function _isJwtSignatureValid(
|
|
1169
|
+
jwt: string,
|
|
1170
|
+
publicKey: string,
|
|
1171
|
+
customErrorFunction?: any,
|
|
1172
|
+
): Promise<any> {
|
|
1173
|
+
if (jwt && typeof jwt === 'string') {
|
|
1174
|
+
return jwtUtilAuth.verifyJwtSignature(jwt, publicKey);
|
|
1175
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
|
|
1176
|
+
<span class="cstat-no" title="statement not covered" > throwError(customErrorFunction);</span>
|
|
1177
|
+
}
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1180
|
+
export async function _isJwtSignatureValidNoThrow(
|
|
1181
|
+
jwt: string | null,
|
|
1182
|
+
publicKey: string,
|
|
1183
|
+
): Promise<any> {
|
|
1184
|
+
if (jwt && typeof jwt === 'string') {
|
|
1185
|
+
return jwtUtilAuth.verifyJwtSignature(jwt, publicKey);
|
|
1186
|
+
} else {
|
|
1187
|
+
return false;
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
export async function _validateJwt(
|
|
1192
|
+
req: RequestWithJWToken,
|
|
1193
|
+
customErrorFunction?: any,
|
|
1194
|
+
): Promise<any> {
|
|
1195
|
+
// Get from http header.
|
|
1196
|
+
let jwtRaw = req.get('Authorization');
|
|
1197
|
+
|
|
1198
|
+
// Extract jwt from bearer schema.
|
|
1199
|
+
let jwt = _extractJwt(jwtRaw, customErrorFunction);
|
|
1200
|
+
|
|
1201
|
+
// Validate characters string of jwt.
|
|
1202
|
+
if (validate.isJwtString(jwt || <span class="branch-1 cbranch-no" title="branch not covered" >'')</span>) {
|
|
1203
|
+
return jwt;
|
|
1204
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
|
|
1205
|
+
<span class="cstat-no" title="statement not covered" > throwError(customErrorFunction);</span>
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
|
|
1209
|
+
export async function _validateWebToken(
|
|
1210
|
+
req: RequestWithJWToken,
|
|
1211
|
+
headerName: string,
|
|
1212
|
+
customErrorFunction?: any,
|
|
1213
|
+
): Promise<any> {
|
|
1214
|
+
// Get from http header.
|
|
1215
|
+
let jwtRaw = req.get(headerName);
|
|
1216
|
+
|
|
1217
|
+
// Extract jwt from bearer schema.
|
|
1218
|
+
let webToken = _extractWebToken(jwtRaw, customErrorFunction);
|
|
1219
|
+
|
|
1220
|
+
// Validate characters string of jwt.
|
|
1221
|
+
if (validate.isJwtString(webToken || <span class="branch-1 cbranch-no" title="branch not covered" >'')</span>) {
|
|
1222
|
+
return webToken;
|
|
1223
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
|
|
1224
|
+
<span class="cstat-no" title="statement not covered" > throwError(customErrorFunction);</span>
|
|
1225
|
+
}
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
export function _validateJwtNoThrow(req: RequestWithJWToken) {
|
|
1229
|
+
// Get from http header.
|
|
1230
|
+
let jwtRaw = req.get('Authorization');
|
|
1231
|
+
|
|
1232
|
+
if (!jwtRaw) {
|
|
1233
|
+
return null;
|
|
1234
|
+
}
|
|
1235
|
+
|
|
1236
|
+
// Extract jwt from bearer schema.
|
|
1237
|
+
let jwt = _extractJwtNoThrow(jwtRaw);
|
|
1238
|
+
|
|
1239
|
+
// Validate characters string of jwt.
|
|
1240
|
+
if (validate.isJwtString(jwt || '')) {
|
|
1241
|
+
return jwt;
|
|
1242
|
+
}
|
|
1243
|
+
|
|
1244
|
+
return null;
|
|
1245
|
+
}
|
|
1246
|
+
|
|
1247
|
+
export function _validateWebTokenNoThrow(req: RequestWithJWToken, headerName: string) {
|
|
1248
|
+
// Get from http header.
|
|
1249
|
+
let jwtRaw = req.get(headerName);
|
|
1250
|
+
|
|
1251
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!jwtRaw) {
|
|
1252
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1253
|
+
}
|
|
1254
|
+
|
|
1255
|
+
// Extract jwt from bearer schema.
|
|
1256
|
+
let webToken = _extractWebTokenNoThrow(jwtRaw);
|
|
1257
|
+
|
|
1258
|
+
// Validate characters string of jwt.
|
|
1259
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (validate.isJwtString(webToken || <span class="branch-1 cbranch-no" title="branch not covered" >'')</span>) {
|
|
1260
|
+
return webToken;
|
|
1261
|
+
}
|
|
1262
|
+
|
|
1263
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1264
|
+
}
|
|
1265
|
+
|
|
1266
|
+
export function _validateVisitorNoThrow(req: RequestWithJWToken) {
|
|
1267
|
+
// Get from http header.
|
|
1268
|
+
let jwtRaw = req.get('Visitor');
|
|
1269
|
+
|
|
1270
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!jwtRaw) {
|
|
1271
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1274
|
+
// Extract jwt from bearer schema.
|
|
1275
|
+
let jwt = _extractJwtNoThrow(jwtRaw);
|
|
1276
|
+
|
|
1277
|
+
// Validate characters string of jwt.
|
|
1278
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (validate.isJwtString(jwt || <span class="branch-1 cbranch-no" title="branch not covered" >'')</span>) {
|
|
1279
|
+
return jwt;
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1283
|
+
}
|
|
1284
|
+
|
|
1285
|
+
export function _extractJwt(
|
|
1286
|
+
jwtRaw: string | undefined,
|
|
1287
|
+
customErrorFunction?: (msg?: string) => never | void,
|
|
1288
|
+
): string | null {
|
|
1289
|
+
let jwtSplit: string[] | null = null;
|
|
1290
|
+
|
|
1291
|
+
if (jwtRaw && typeof jwtRaw === 'string') {
|
|
1292
|
+
jwtSplit = jwtRaw.split(' ');
|
|
1293
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
|
|
1294
|
+
<span class="cstat-no" title="statement not covered" > throwError(customErrorFunction);</span>
|
|
1295
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1296
|
+
}
|
|
1297
|
+
|
|
1298
|
+
// Guard before indexing
|
|
1299
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!jwtSplit || jwtSplit.length < 2) {
|
|
1300
|
+
<span class="cstat-no" title="statement not covered" > throwError(customErrorFunction);</span>
|
|
1301
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1302
|
+
}
|
|
1303
|
+
|
|
1304
|
+
if (jwtSplit[0].toLowerCase() === 'bearer') {
|
|
1305
|
+
return jwtSplit[1] ?? <span class="branch-1 cbranch-no" title="branch not covered" >null;</span>
|
|
1306
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
|
|
1307
|
+
<span class="cstat-no" title="statement not covered" > throwError(customErrorFunction);</span>
|
|
1308
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1309
|
+
}
|
|
1310
|
+
}
|
|
1311
|
+
|
|
1312
|
+
export function _extractWebToken(jwtRaw: string | undefined, customErrorFunction?: any) {
|
|
1313
|
+
if (jwtRaw && typeof jwtRaw === 'string') {
|
|
1314
|
+
return jwtRaw;
|
|
1315
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
|
|
1316
|
+
<span class="cstat-no" title="statement not covered" > throwError(customErrorFunction);</span>
|
|
1317
|
+
}
|
|
1318
|
+
|
|
1319
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1320
|
+
}
|
|
1321
|
+
|
|
1322
|
+
export function _extractJwtNoThrow(jwtRaw: string) {
|
|
1323
|
+
let jwtSplit = null;
|
|
1324
|
+
|
|
1325
|
+
if (jwtRaw && typeof jwtRaw === 'string') {
|
|
1326
|
+
jwtSplit = jwtRaw.split(' ');
|
|
1327
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
|
|
1328
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1329
|
+
}
|
|
1330
|
+
|
|
1331
|
+
if (jwtSplit[0]?.toLowerCase() === 'bearer') {
|
|
1332
|
+
return jwtSplit[1];
|
|
1333
|
+
}
|
|
1334
|
+
|
|
1335
|
+
return null;
|
|
1336
|
+
}
|
|
1337
|
+
|
|
1338
|
+
export function _extractWebTokenNoThrow(jwtRaw: string) {
|
|
1339
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (jwtRaw && typeof jwtRaw === 'string') {
|
|
1340
|
+
return jwtRaw;
|
|
1341
|
+
}
|
|
1342
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1343
|
+
}
|
|
1344
|
+
</pre></td></tr></table></pre>
|
|
1345
|
+
|
|
1346
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
1347
|
+
</div><!-- /wrapper -->
|
|
1348
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
1349
|
+
Code coverage generated by
|
|
1350
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1351
|
+
at 2025-12-24T06:30:26.804Z
|
|
1352
|
+
</div>
|
|
1353
|
+
<script src="prettify.js"></script>
|
|
1354
|
+
<script>
|
|
1355
|
+
window.onload = function () {
|
|
1356
|
+
prettyPrint();
|
|
1357
|
+
};
|
|
1358
|
+
</script>
|
|
1359
|
+
<script src="sorter.js"></script>
|
|
1360
|
+
<script src="block-navigation.js"></script>
|
|
1361
|
+
</body>
|
|
1362
|
+
</html>
|
|
1363
|
+
|