@tomei/sso 0.64.0-staging.2 → 0.64.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/.commitlintrc.json +22 -22
  2. package/.gitlab-ci.yml +16 -16
  3. package/.husky/commit-msg +15 -9
  4. package/.husky/pre-commit +7 -7
  5. package/.prettierrc +4 -4
  6. package/Jenkinsfile +57 -57
  7. package/README.md +23 -23
  8. package/__tests__/unit/components/group/group.spec.ts +79 -79
  9. package/__tests__/unit/components/group-object-privilege/group-object-privilege.spec.ts +88 -88
  10. package/__tests__/unit/components/group-privilege/group-privilege.spec.ts +68 -68
  11. package/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.ts +66 -66
  12. package/__tests__/unit/components/group-system-access/group-system-access.spec.ts +83 -83
  13. package/__tests__/unit/components/login-user/l.spec.ts +746 -746
  14. package/__tests__/unit/components/login-user/login.spec.ts +1164 -1164
  15. package/__tests__/unit/components/password-hash/password-hash.service.spec.ts +31 -31
  16. package/__tests__/unit/components/system/system.spec.ts +254 -254
  17. package/__tests__/unit/components/system-privilege/system-privilege.spec.ts +83 -83
  18. package/__tests__/unit/components/user-group/user-group.spec.ts +86 -86
  19. package/__tests__/unit/components/user-object-privilege/user-object-privilege.spec.ts +78 -78
  20. package/__tests__/unit/components/user-privilege/user-privilege.spec.ts +72 -72
  21. package/__tests__/unit/components/user-system-access/user-system-access.spec.ts +89 -89
  22. package/__tests__/unit/redis-client/redis.service.spec.ts +23 -23
  23. package/__tests__/unit/session/session.service.spec.ts +47 -47
  24. package/__tests__/unit/system-privilege/system-privilage.spec.ts +91 -91
  25. package/coverage/clover.xml +1380 -0
  26. package/coverage/coverage-final.json +39 -0
  27. package/coverage/lcov-report/base.css +224 -0
  28. package/coverage/lcov-report/block-navigation.js +87 -0
  29. package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.repository.ts.html +160 -0
  30. package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.ts.html +919 -0
  31. package/coverage/lcov-report/components/group-object-privilege/index.html +131 -0
  32. package/coverage/lcov-report/components/group-privilege/group-privilege.repository.ts.html +172 -0
  33. package/coverage/lcov-report/components/group-privilege/group-privilege.ts.html +337 -0
  34. package/coverage/lcov-report/components/group-privilege/index.html +131 -0
  35. package/coverage/lcov-report/components/group-system-access/group-system-access.repository.ts.html +214 -0
  36. package/coverage/lcov-report/components/group-system-access/group-system-access.ts.html +355 -0
  37. package/coverage/lcov-report/components/group-system-access/index.html +131 -0
  38. package/coverage/lcov-report/components/password-hash/index.html +116 -0
  39. package/coverage/lcov-report/components/password-hash/password-hash.service.ts.html +127 -0
  40. package/coverage/lcov-report/components/system-privilege/index.html +116 -0
  41. package/coverage/lcov-report/components/system-privilege/system-privilege.repository.ts.html +139 -0
  42. package/coverage/lcov-report/components/user-group/index.html +131 -0
  43. package/coverage/lcov-report/components/user-group/user-group.repository.ts.html +142 -0
  44. package/coverage/lcov-report/components/user-group/user-group.ts.html +2377 -0
  45. package/coverage/lcov-report/components/user-object-privilege/index.html +131 -0
  46. package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.repository.ts.html +118 -0
  47. package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.ts.html +322 -0
  48. package/coverage/lcov-report/components/user-privilege/index.html +131 -0
  49. package/coverage/lcov-report/components/user-privilege/user-privilege.repository.ts.html +160 -0
  50. package/coverage/lcov-report/components/user-privilege/user-privilege.ts.html +2071 -0
  51. package/coverage/lcov-report/components/user-system-access/index.html +131 -0
  52. package/coverage/lcov-report/components/user-system-access/user-system-access.repository.ts.html +208 -0
  53. package/coverage/lcov-report/components/user-system-access/user-system-access.ts.html +2236 -0
  54. package/coverage/lcov-report/enum/api-key.enum.ts.html +100 -0
  55. package/coverage/lcov-report/enum/group-type.enum.ts.html +109 -0
  56. package/coverage/lcov-report/enum/index.html +206 -0
  57. package/coverage/lcov-report/enum/index.ts.html +103 -0
  58. package/coverage/lcov-report/enum/login-status.enum.ts.html +97 -0
  59. package/coverage/lcov-report/enum/object-status.enum.ts.html +97 -0
  60. package/coverage/lcov-report/enum/user-status.enum.ts.html +106 -0
  61. package/coverage/lcov-report/enum/yn.enum.ts.html +97 -0
  62. package/coverage/lcov-report/favicon.png +0 -0
  63. package/coverage/lcov-report/index.html +296 -0
  64. package/coverage/lcov-report/models/group-object-privilege.entity.ts.html +358 -0
  65. package/coverage/lcov-report/models/group-privilege.entity.ts.html +319 -0
  66. package/coverage/lcov-report/models/group-reporting-user.entity.ts.html +370 -0
  67. package/coverage/lcov-report/models/group-system-access.entity.ts.html +328 -0
  68. package/coverage/lcov-report/models/group.entity.ts.html +466 -0
  69. package/coverage/lcov-report/models/index.html +296 -0
  70. package/coverage/lcov-report/models/staff.entity.ts.html +358 -0
  71. package/coverage/lcov-report/models/system-privilege.entity.ts.html +355 -0
  72. package/coverage/lcov-report/models/system.entity.ts.html +424 -0
  73. package/coverage/lcov-report/models/user-group.entity.ts.html +358 -0
  74. package/coverage/lcov-report/models/user-object-privilege.entity.ts.html +355 -0
  75. package/coverage/lcov-report/models/user-privilege.entity.ts.html +319 -0
  76. package/coverage/lcov-report/models/user-system-access.entity.ts.html +346 -0
  77. package/coverage/lcov-report/models/user.entity.ts.html +685 -0
  78. package/coverage/lcov-report/prettify.css +1 -0
  79. package/coverage/lcov-report/prettify.js +2 -0
  80. package/coverage/lcov-report/redis-client/index.html +116 -0
  81. package/coverage/lcov-report/redis-client/redis.service.ts.html +310 -0
  82. package/coverage/lcov-report/session/index.html +116 -0
  83. package/coverage/lcov-report/session/session.service.ts.html +373 -0
  84. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  85. package/coverage/lcov-report/sorter.js +210 -0
  86. package/coverage/lcov.info +2223 -0
  87. package/coverage/test-report.xml +71 -0
  88. package/create-sso-user.sql +39 -39
  89. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.d.ts +1 -0
  90. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js +71 -0
  91. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js.map +1 -0
  92. package/dist/__tests__/unit/components/login-user/login-user.spec.d.ts +0 -0
  93. package/dist/__tests__/unit/components/login-user/login-user.spec.js +6 -0
  94. package/dist/__tests__/unit/components/login-user/login-user.spec.js.map +1 -0
  95. package/dist/src/components/login-user/user.js +9 -3
  96. package/dist/src/components/login-user/user.js.map +1 -1
  97. package/dist/tsconfig.tsbuildinfo +1 -1
  98. package/eslint.config.mjs +58 -58
  99. package/jest.config.js +14 -14
  100. package/migrations/20240314080602-create-user-table.js +124 -124
  101. package/migrations/20240314080603-create-user-group-table.js +85 -85
  102. package/migrations/20240314080604-create-user-user-group-table.js +55 -55
  103. package/migrations/20240314080605-create-login-history-table.js +53 -53
  104. package/migrations/20240527064925-create-system-table.js +78 -78
  105. package/migrations/20240527064926-create-system-privilege-table.js +71 -71
  106. package/migrations/20240527065342-create-group-table.js +93 -93
  107. package/migrations/20240527065633-create-group-reporting-user-table.js +76 -76
  108. package/migrations/20240528011551-create-group-system-access-table.js +72 -72
  109. package/migrations/20240528023018-user-system-access-table.js +75 -75
  110. package/migrations/20240528032229-user-privilege-table.js +76 -76
  111. package/migrations/20240528063003-create-group-privilege-table.js +76 -76
  112. package/migrations/20240528063051-create-group-object-privilege-table.js +84 -84
  113. package/migrations/20240528063107-create-user-object-privilege-table.js +84 -84
  114. package/migrations/20240528063108-create-api-key-table.js +85 -85
  115. package/migrations/20241104104802-create-building-table.js +95 -95
  116. package/migrations/20250108091132-add-area-manager-user-id-to-building-table.js +14 -14
  117. package/migrations/20250108091133-add-passcode-to-user-table.js +36 -36
  118. package/migrations/20250210115636-create-user-reporting-hierarchy.js +76 -76
  119. package/migrations/20250326043818-crate-user-password-history.js +42 -42
  120. package/migrations/20250610070720-added-MFBypassYN-to-sso-user.js +30 -30
  121. package/package.json +87 -87
  122. package/sampledotenv +7 -7
  123. package/sonar-project.properties +23 -0
  124. package/src/components/login-user/user.ts +9 -3
  125. package/tsconfig.build.json +5 -5
  126. package/tsconfig.json +23 -23
@@ -0,0 +1,2236 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for components/user-system-access/user-system-access.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">components/user-system-access</a> user-system-access.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">23.52% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>40/170</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">11.36% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>5/44</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">27.27% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>6/22</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">23.52% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>40/170</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 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>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a>
672
+ <a name='L607'></a><a href='#L607'>607</a>
673
+ <a name='L608'></a><a href='#L608'>608</a>
674
+ <a name='L609'></a><a href='#L609'>609</a>
675
+ <a name='L610'></a><a href='#L610'>610</a>
676
+ <a name='L611'></a><a href='#L611'>611</a>
677
+ <a name='L612'></a><a href='#L612'>612</a>
678
+ <a name='L613'></a><a href='#L613'>613</a>
679
+ <a name='L614'></a><a href='#L614'>614</a>
680
+ <a name='L615'></a><a href='#L615'>615</a>
681
+ <a name='L616'></a><a href='#L616'>616</a>
682
+ <a name='L617'></a><a href='#L617'>617</a>
683
+ <a name='L618'></a><a href='#L618'>618</a>
684
+ <a name='L619'></a><a href='#L619'>619</a>
685
+ <a name='L620'></a><a href='#L620'>620</a>
686
+ <a name='L621'></a><a href='#L621'>621</a>
687
+ <a name='L622'></a><a href='#L622'>622</a>
688
+ <a name='L623'></a><a href='#L623'>623</a>
689
+ <a name='L624'></a><a href='#L624'>624</a>
690
+ <a name='L625'></a><a href='#L625'>625</a>
691
+ <a name='L626'></a><a href='#L626'>626</a>
692
+ <a name='L627'></a><a href='#L627'>627</a>
693
+ <a name='L628'></a><a href='#L628'>628</a>
694
+ <a name='L629'></a><a href='#L629'>629</a>
695
+ <a name='L630'></a><a href='#L630'>630</a>
696
+ <a name='L631'></a><a href='#L631'>631</a>
697
+ <a name='L632'></a><a href='#L632'>632</a>
698
+ <a name='L633'></a><a href='#L633'>633</a>
699
+ <a name='L634'></a><a href='#L634'>634</a>
700
+ <a name='L635'></a><a href='#L635'>635</a>
701
+ <a name='L636'></a><a href='#L636'>636</a>
702
+ <a name='L637'></a><a href='#L637'>637</a>
703
+ <a name='L638'></a><a href='#L638'>638</a>
704
+ <a name='L639'></a><a href='#L639'>639</a>
705
+ <a name='L640'></a><a href='#L640'>640</a>
706
+ <a name='L641'></a><a href='#L641'>641</a>
707
+ <a name='L642'></a><a href='#L642'>642</a>
708
+ <a name='L643'></a><a href='#L643'>643</a>
709
+ <a name='L644'></a><a href='#L644'>644</a>
710
+ <a name='L645'></a><a href='#L645'>645</a>
711
+ <a name='L646'></a><a href='#L646'>646</a>
712
+ <a name='L647'></a><a href='#L647'>647</a>
713
+ <a name='L648'></a><a href='#L648'>648</a>
714
+ <a name='L649'></a><a href='#L649'>649</a>
715
+ <a name='L650'></a><a href='#L650'>650</a>
716
+ <a name='L651'></a><a href='#L651'>651</a>
717
+ <a name='L652'></a><a href='#L652'>652</a>
718
+ <a name='L653'></a><a href='#L653'>653</a>
719
+ <a name='L654'></a><a href='#L654'>654</a>
720
+ <a name='L655'></a><a href='#L655'>655</a>
721
+ <a name='L656'></a><a href='#L656'>656</a>
722
+ <a name='L657'></a><a href='#L657'>657</a>
723
+ <a name='L658'></a><a href='#L658'>658</a>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a>
735
+ <a name='L670'></a><a href='#L670'>670</a>
736
+ <a name='L671'></a><a href='#L671'>671</a>
737
+ <a name='L672'></a><a href='#L672'>672</a>
738
+ <a name='L673'></a><a href='#L673'>673</a>
739
+ <a name='L674'></a><a href='#L674'>674</a>
740
+ <a name='L675'></a><a href='#L675'>675</a>
741
+ <a name='L676'></a><a href='#L676'>676</a>
742
+ <a name='L677'></a><a href='#L677'>677</a>
743
+ <a name='L678'></a><a href='#L678'>678</a>
744
+ <a name='L679'></a><a href='#L679'>679</a>
745
+ <a name='L680'></a><a href='#L680'>680</a>
746
+ <a name='L681'></a><a href='#L681'>681</a>
747
+ <a name='L682'></a><a href='#L682'>682</a>
748
+ <a name='L683'></a><a href='#L683'>683</a>
749
+ <a name='L684'></a><a href='#L684'>684</a>
750
+ <a name='L685'></a><a href='#L685'>685</a>
751
+ <a name='L686'></a><a href='#L686'>686</a>
752
+ <a name='L687'></a><a href='#L687'>687</a>
753
+ <a name='L688'></a><a href='#L688'>688</a>
754
+ <a name='L689'></a><a href='#L689'>689</a>
755
+ <a name='L690'></a><a href='#L690'>690</a>
756
+ <a name='L691'></a><a href='#L691'>691</a>
757
+ <a name='L692'></a><a href='#L692'>692</a>
758
+ <a name='L693'></a><a href='#L693'>693</a>
759
+ <a name='L694'></a><a href='#L694'>694</a>
760
+ <a name='L695'></a><a href='#L695'>695</a>
761
+ <a name='L696'></a><a href='#L696'>696</a>
762
+ <a name='L697'></a><a href='#L697'>697</a>
763
+ <a name='L698'></a><a href='#L698'>698</a>
764
+ <a name='L699'></a><a href='#L699'>699</a>
765
+ <a name='L700'></a><a href='#L700'>700</a>
766
+ <a name='L701'></a><a href='#L701'>701</a>
767
+ <a name='L702'></a><a href='#L702'>702</a>
768
+ <a name='L703'></a><a href='#L703'>703</a>
769
+ <a name='L704'></a><a href='#L704'>704</a>
770
+ <a name='L705'></a><a href='#L705'>705</a>
771
+ <a name='L706'></a><a href='#L706'>706</a>
772
+ <a name='L707'></a><a href='#L707'>707</a>
773
+ <a name='L708'></a><a href='#L708'>708</a>
774
+ <a name='L709'></a><a href='#L709'>709</a>
775
+ <a name='L710'></a><a href='#L710'>710</a>
776
+ <a name='L711'></a><a href='#L711'>711</a>
777
+ <a name='L712'></a><a href='#L712'>712</a>
778
+ <a name='L713'></a><a href='#L713'>713</a>
779
+ <a name='L714'></a><a href='#L714'>714</a>
780
+ <a name='L715'></a><a href='#L715'>715</a>
781
+ <a name='L716'></a><a href='#L716'>716</a>
782
+ <a name='L717'></a><a href='#L717'>717</a>
783
+ <a name='L718'></a><a href='#L718'>718</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
784
+ <span class="cline-any cline-yes">1x</span>
785
+ <span class="cline-any cline-neutral">&nbsp;</span>
786
+ <span class="cline-any cline-neutral">&nbsp;</span>
787
+ <span class="cline-any cline-yes">1x</span>
788
+ <span class="cline-any cline-yes">1x</span>
789
+ <span class="cline-any cline-yes">1x</span>
790
+ <span class="cline-any cline-yes">1x</span>
791
+ <span class="cline-any cline-yes">1x</span>
792
+ <span class="cline-any cline-yes">1x</span>
793
+ <span class="cline-any cline-yes">1x</span>
794
+ <span class="cline-any cline-yes">1x</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">&nbsp;</span>
798
+ <span class="cline-any cline-yes">1x</span>
799
+ <span class="cline-any cline-neutral">&nbsp;</span>
800
+ <span class="cline-any cline-yes">1x</span>
801
+ <span class="cline-any cline-yes">6x</span>
802
+ <span class="cline-any cline-yes">6x</span>
803
+ <span class="cline-any cline-neutral">&nbsp;</span>
804
+ <span class="cline-any cline-neutral">&nbsp;</span>
805
+ <span class="cline-any cline-neutral">&nbsp;</span>
806
+ <span class="cline-any cline-neutral">&nbsp;</span>
807
+ <span class="cline-any cline-neutral">&nbsp;</span>
808
+ <span class="cline-any cline-neutral">&nbsp;</span>
809
+ <span class="cline-any cline-neutral">&nbsp;</span>
810
+ <span class="cline-any cline-neutral">&nbsp;</span>
811
+ <span class="cline-any cline-neutral">&nbsp;</span>
812
+ <span class="cline-any cline-neutral">&nbsp;</span>
813
+ <span class="cline-any cline-neutral">&nbsp;</span>
814
+ <span class="cline-any cline-neutral">&nbsp;</span>
815
+ <span class="cline-any cline-yes">2x</span>
816
+ <span class="cline-any cline-neutral">&nbsp;</span>
817
+ <span class="cline-any cline-neutral">&nbsp;</span>
818
+ <span class="cline-any cline-neutral">&nbsp;</span>
819
+ <span class="cline-any cline-yes">2x</span>
820
+ <span class="cline-any cline-neutral">&nbsp;</span>
821
+ <span class="cline-any cline-neutral">&nbsp;</span>
822
+ <span class="cline-any cline-neutral">&nbsp;</span>
823
+ <span class="cline-any cline-yes">2x</span>
824
+ <span class="cline-any cline-neutral">&nbsp;</span>
825
+ <span class="cline-any cline-neutral">&nbsp;</span>
826
+ <span class="cline-any cline-neutral">&nbsp;</span>
827
+ <span class="cline-any cline-yes">2x</span>
828
+ <span class="cline-any cline-neutral">&nbsp;</span>
829
+ <span class="cline-any cline-neutral">&nbsp;</span>
830
+ <span class="cline-any cline-yes">1x</span>
831
+ <span class="cline-any cline-yes">1x</span>
832
+ <span class="cline-any cline-neutral">&nbsp;</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-yes">6x</span>
835
+ <span class="cline-any cline-yes">6x</span>
836
+ <span class="cline-any cline-yes">4x</span>
837
+ <span class="cline-any cline-yes">4x</span>
838
+ <span class="cline-any cline-yes">4x</span>
839
+ <span class="cline-any cline-yes">4x</span>
840
+ <span class="cline-any cline-yes">4x</span>
841
+ <span class="cline-any cline-yes">4x</span>
842
+ <span class="cline-any cline-yes">4x</span>
843
+ <span class="cline-any cline-yes">4x</span>
844
+ <span class="cline-any cline-neutral">&nbsp;</span>
845
+ <span class="cline-any cline-neutral">&nbsp;</span>
846
+ <span class="cline-any cline-neutral">&nbsp;</span>
847
+ <span class="cline-any cline-neutral">&nbsp;</span>
848
+ <span class="cline-any cline-yes">2x</span>
849
+ <span class="cline-any cline-yes">2x</span>
850
+ <span class="cline-any cline-yes">2x</span>
851
+ <span class="cline-any cline-yes">2x</span>
852
+ <span class="cline-any cline-neutral">&nbsp;</span>
853
+ <span class="cline-any cline-neutral">&nbsp;</span>
854
+ <span class="cline-any cline-neutral">&nbsp;</span>
855
+ <span class="cline-any cline-yes">2x</span>
856
+ <span class="cline-any cline-yes">1x</span>
857
+ <span class="cline-any cline-neutral">&nbsp;</span>
858
+ <span class="cline-any cline-neutral">&nbsp;</span>
859
+ <span class="cline-any cline-neutral">&nbsp;</span>
860
+ <span class="cline-any cline-yes">1x</span>
861
+ <span class="cline-any cline-neutral">&nbsp;</span>
862
+ <span class="cline-any cline-neutral">&nbsp;</span>
863
+ <span class="cline-any cline-neutral">&nbsp;</span>
864
+ <span class="cline-any cline-neutral">&nbsp;</span>
865
+ <span class="cline-any cline-neutral">&nbsp;</span>
866
+ <span class="cline-any cline-neutral">&nbsp;</span>
867
+ <span class="cline-any cline-no">&nbsp;</span>
868
+ <span class="cline-any cline-neutral">&nbsp;</span>
869
+ <span class="cline-any cline-yes">1x</span>
870
+ <span class="cline-any cline-neutral">&nbsp;</span>
871
+ <span class="cline-any cline-neutral">&nbsp;</span>
872
+ <span class="cline-any cline-neutral">&nbsp;</span>
873
+ <span class="cline-any cline-neutral">&nbsp;</span>
874
+ <span class="cline-any cline-neutral">&nbsp;</span>
875
+ <span class="cline-any cline-neutral">&nbsp;</span>
876
+ <span class="cline-any cline-neutral">&nbsp;</span>
877
+ <span class="cline-any cline-neutral">&nbsp;</span>
878
+ <span class="cline-any cline-neutral">&nbsp;</span>
879
+ <span class="cline-any cline-neutral">&nbsp;</span>
880
+ <span class="cline-any cline-neutral">&nbsp;</span>
881
+ <span class="cline-any cline-neutral">&nbsp;</span>
882
+ <span class="cline-any cline-neutral">&nbsp;</span>
883
+ <span class="cline-any cline-neutral">&nbsp;</span>
884
+ <span class="cline-any cline-neutral">&nbsp;</span>
885
+ <span class="cline-any cline-neutral">&nbsp;</span>
886
+ <span class="cline-any cline-neutral">&nbsp;</span>
887
+ <span class="cline-any cline-neutral">&nbsp;</span>
888
+ <span class="cline-any cline-neutral">&nbsp;</span>
889
+ <span class="cline-any cline-neutral">&nbsp;</span>
890
+ <span class="cline-any cline-neutral">&nbsp;</span>
891
+ <span class="cline-any cline-neutral">&nbsp;</span>
892
+ <span class="cline-any cline-neutral">&nbsp;</span>
893
+ <span class="cline-any cline-neutral">&nbsp;</span>
894
+ <span class="cline-any cline-neutral">&nbsp;</span>
895
+ <span class="cline-any cline-neutral">&nbsp;</span>
896
+ <span class="cline-any cline-neutral">&nbsp;</span>
897
+ <span class="cline-any cline-neutral">&nbsp;</span>
898
+ <span class="cline-any cline-neutral">&nbsp;</span>
899
+ <span class="cline-any cline-neutral">&nbsp;</span>
900
+ <span class="cline-any cline-neutral">&nbsp;</span>
901
+ <span class="cline-any cline-neutral">&nbsp;</span>
902
+ <span class="cline-any cline-no">&nbsp;</span>
903
+ <span class="cline-any cline-neutral">&nbsp;</span>
904
+ <span class="cline-any cline-neutral">&nbsp;</span>
905
+ <span class="cline-any cline-neutral">&nbsp;</span>
906
+ <span class="cline-any cline-neutral">&nbsp;</span>
907
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
912
+ <span class="cline-any cline-neutral">&nbsp;</span>
913
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
917
+ <span class="cline-any cline-neutral">&nbsp;</span>
918
+ <span class="cline-any cline-neutral">&nbsp;</span>
919
+ <span class="cline-any cline-neutral">&nbsp;</span>
920
+ <span class="cline-any cline-neutral">&nbsp;</span>
921
+ <span class="cline-any cline-neutral">&nbsp;</span>
922
+ <span class="cline-any cline-neutral">&nbsp;</span>
923
+ <span class="cline-any cline-neutral">&nbsp;</span>
924
+ <span class="cline-any cline-no">&nbsp;</span>
925
+ <span class="cline-any cline-neutral">&nbsp;</span>
926
+ <span class="cline-any cline-neutral">&nbsp;</span>
927
+ <span class="cline-any cline-neutral">&nbsp;</span>
928
+ <span class="cline-any cline-neutral">&nbsp;</span>
929
+ <span class="cline-any cline-neutral">&nbsp;</span>
930
+ <span class="cline-any cline-neutral">&nbsp;</span>
931
+ <span class="cline-any cline-neutral">&nbsp;</span>
932
+ <span class="cline-any cline-neutral">&nbsp;</span>
933
+ <span class="cline-any cline-neutral">&nbsp;</span>
934
+ <span class="cline-any cline-neutral">&nbsp;</span>
935
+ <span class="cline-any cline-neutral">&nbsp;</span>
936
+ <span class="cline-any cline-neutral">&nbsp;</span>
937
+ <span class="cline-any cline-neutral">&nbsp;</span>
938
+ <span class="cline-any cline-neutral">&nbsp;</span>
939
+ <span class="cline-any cline-neutral">&nbsp;</span>
940
+ <span class="cline-any cline-neutral">&nbsp;</span>
941
+ <span class="cline-any cline-neutral">&nbsp;</span>
942
+ <span class="cline-any cline-neutral">&nbsp;</span>
943
+ <span class="cline-any cline-neutral">&nbsp;</span>
944
+ <span class="cline-any cline-neutral">&nbsp;</span>
945
+ <span class="cline-any cline-neutral">&nbsp;</span>
946
+ <span class="cline-any cline-neutral">&nbsp;</span>
947
+ <span class="cline-any cline-neutral">&nbsp;</span>
948
+ <span class="cline-any cline-neutral">&nbsp;</span>
949
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
953
+ <span class="cline-any cline-no">&nbsp;</span>
954
+ <span class="cline-any cline-neutral">&nbsp;</span>
955
+ <span class="cline-any cline-neutral">&nbsp;</span>
956
+ <span class="cline-any cline-neutral">&nbsp;</span>
957
+ <span class="cline-any cline-neutral">&nbsp;</span>
958
+ <span class="cline-any cline-neutral">&nbsp;</span>
959
+ <span class="cline-any cline-neutral">&nbsp;</span>
960
+ <span class="cline-any cline-neutral">&nbsp;</span>
961
+ <span class="cline-any cline-neutral">&nbsp;</span>
962
+ <span class="cline-any cline-neutral">&nbsp;</span>
963
+ <span class="cline-any cline-neutral">&nbsp;</span>
964
+ <span class="cline-any cline-neutral">&nbsp;</span>
965
+ <span class="cline-any cline-neutral">&nbsp;</span>
966
+ <span class="cline-any cline-neutral">&nbsp;</span>
967
+ <span class="cline-any cline-neutral">&nbsp;</span>
968
+ <span class="cline-any cline-neutral">&nbsp;</span>
969
+ <span class="cline-any cline-neutral">&nbsp;</span>
970
+ <span class="cline-any cline-neutral">&nbsp;</span>
971
+ <span class="cline-any cline-no">&nbsp;</span>
972
+ <span class="cline-any cline-neutral">&nbsp;</span>
973
+ <span class="cline-any cline-neutral">&nbsp;</span>
974
+ <span class="cline-any cline-neutral">&nbsp;</span>
975
+ <span class="cline-any cline-neutral">&nbsp;</span>
976
+ <span class="cline-any cline-neutral">&nbsp;</span>
977
+ <span class="cline-any cline-neutral">&nbsp;</span>
978
+ <span class="cline-any cline-neutral">&nbsp;</span>
979
+ <span class="cline-any cline-neutral">&nbsp;</span>
980
+ <span class="cline-any cline-neutral">&nbsp;</span>
981
+ <span class="cline-any cline-neutral">&nbsp;</span>
982
+ <span class="cline-any cline-neutral">&nbsp;</span>
983
+ <span class="cline-any cline-neutral">&nbsp;</span>
984
+ <span class="cline-any cline-neutral">&nbsp;</span>
985
+ <span class="cline-any cline-neutral">&nbsp;</span>
986
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
990
+ <span class="cline-any cline-neutral">&nbsp;</span>
991
+ <span class="cline-any cline-neutral">&nbsp;</span>
992
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
996
+ <span class="cline-any cline-neutral">&nbsp;</span>
997
+ <span class="cline-any cline-neutral">&nbsp;</span>
998
+ <span class="cline-any cline-neutral">&nbsp;</span>
999
+ <span class="cline-any cline-neutral">&nbsp;</span>
1000
+ <span class="cline-any cline-neutral">&nbsp;</span>
1001
+ <span class="cline-any cline-no">&nbsp;</span>
1002
+ <span class="cline-any cline-neutral">&nbsp;</span>
1003
+ <span class="cline-any cline-no">&nbsp;</span>
1004
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1009
+ <span class="cline-any cline-neutral">&nbsp;</span>
1010
+ <span class="cline-any cline-neutral">&nbsp;</span>
1011
+ <span class="cline-any cline-no">&nbsp;</span>
1012
+ <span class="cline-any cline-neutral">&nbsp;</span>
1013
+ <span class="cline-any cline-neutral">&nbsp;</span>
1014
+ <span class="cline-any cline-neutral">&nbsp;</span>
1015
+ <span class="cline-any cline-neutral">&nbsp;</span>
1016
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1020
+ <span class="cline-any cline-neutral">&nbsp;</span>
1021
+ <span class="cline-any cline-neutral">&nbsp;</span>
1022
+ <span class="cline-any cline-neutral">&nbsp;</span>
1023
+ <span class="cline-any cline-neutral">&nbsp;</span>
1024
+ <span class="cline-any cline-neutral">&nbsp;</span>
1025
+ <span class="cline-any cline-neutral">&nbsp;</span>
1026
+ <span class="cline-any cline-neutral">&nbsp;</span>
1027
+ <span class="cline-any cline-neutral">&nbsp;</span>
1028
+ <span class="cline-any cline-neutral">&nbsp;</span>
1029
+ <span class="cline-any cline-neutral">&nbsp;</span>
1030
+ <span class="cline-any cline-neutral">&nbsp;</span>
1031
+ <span class="cline-any cline-neutral">&nbsp;</span>
1032
+ <span class="cline-any cline-neutral">&nbsp;</span>
1033
+ <span class="cline-any cline-neutral">&nbsp;</span>
1034
+ <span class="cline-any cline-neutral">&nbsp;</span>
1035
+ <span class="cline-any cline-neutral">&nbsp;</span>
1036
+ <span class="cline-any cline-neutral">&nbsp;</span>
1037
+ <span class="cline-any cline-neutral">&nbsp;</span>
1038
+ <span class="cline-any cline-neutral">&nbsp;</span>
1039
+ <span class="cline-any cline-neutral">&nbsp;</span>
1040
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1044
+ <span class="cline-any cline-no">&nbsp;</span>
1045
+ <span class="cline-any cline-neutral">&nbsp;</span>
1046
+ <span class="cline-any cline-neutral">&nbsp;</span>
1047
+ <span class="cline-any cline-neutral">&nbsp;</span>
1048
+ <span class="cline-any cline-neutral">&nbsp;</span>
1049
+ <span class="cline-any cline-neutral">&nbsp;</span>
1050
+ <span class="cline-any cline-neutral">&nbsp;</span>
1051
+ <span class="cline-any cline-neutral">&nbsp;</span>
1052
+ <span class="cline-any cline-neutral">&nbsp;</span>
1053
+ <span class="cline-any cline-neutral">&nbsp;</span>
1054
+ <span class="cline-any cline-neutral">&nbsp;</span>
1055
+ <span class="cline-any cline-neutral">&nbsp;</span>
1056
+ <span class="cline-any cline-neutral">&nbsp;</span>
1057
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1061
+ <span class="cline-any cline-neutral">&nbsp;</span>
1062
+ <span class="cline-any cline-neutral">&nbsp;</span>
1063
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1067
+ <span class="cline-any cline-neutral">&nbsp;</span>
1068
+ <span class="cline-any cline-neutral">&nbsp;</span>
1069
+ <span class="cline-any cline-neutral">&nbsp;</span>
1070
+ <span class="cline-any cline-neutral">&nbsp;</span>
1071
+ <span class="cline-any cline-neutral">&nbsp;</span>
1072
+ <span class="cline-any cline-no">&nbsp;</span>
1073
+ <span class="cline-any cline-neutral">&nbsp;</span>
1074
+ <span class="cline-any cline-no">&nbsp;</span>
1075
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1079
+ <span class="cline-any cline-neutral">&nbsp;</span>
1080
+ <span class="cline-any cline-neutral">&nbsp;</span>
1081
+ <span class="cline-any cline-neutral">&nbsp;</span>
1082
+ <span class="cline-any cline-neutral">&nbsp;</span>
1083
+ <span class="cline-any cline-neutral">&nbsp;</span>
1084
+ <span class="cline-any cline-no">&nbsp;</span>
1085
+ <span class="cline-any cline-neutral">&nbsp;</span>
1086
+ <span class="cline-any cline-neutral">&nbsp;</span>
1087
+ <span class="cline-any cline-neutral">&nbsp;</span>
1088
+ <span class="cline-any cline-neutral">&nbsp;</span>
1089
+ <span class="cline-any cline-neutral">&nbsp;</span>
1090
+ <span class="cline-any cline-neutral">&nbsp;</span>
1091
+ <span class="cline-any cline-neutral">&nbsp;</span>
1092
+ <span class="cline-any cline-neutral">&nbsp;</span>
1093
+ <span class="cline-any cline-neutral">&nbsp;</span>
1094
+ <span class="cline-any cline-neutral">&nbsp;</span>
1095
+ <span class="cline-any cline-neutral">&nbsp;</span>
1096
+ <span class="cline-any cline-neutral">&nbsp;</span>
1097
+ <span class="cline-any cline-neutral">&nbsp;</span>
1098
+ <span class="cline-any cline-neutral">&nbsp;</span>
1099
+ <span class="cline-any cline-no">&nbsp;</span>
1100
+ <span class="cline-any cline-neutral">&nbsp;</span>
1101
+ <span class="cline-any cline-neutral">&nbsp;</span>
1102
+ <span class="cline-any cline-neutral">&nbsp;</span>
1103
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1110
+ <span class="cline-any cline-no">&nbsp;</span>
1111
+ <span class="cline-any cline-neutral">&nbsp;</span>
1112
+ <span class="cline-any cline-neutral">&nbsp;</span>
1113
+ <span class="cline-any cline-neutral">&nbsp;</span>
1114
+ <span class="cline-any cline-neutral">&nbsp;</span>
1115
+ <span class="cline-any cline-neutral">&nbsp;</span>
1116
+ <span class="cline-any cline-neutral">&nbsp;</span>
1117
+ <span class="cline-any cline-no">&nbsp;</span>
1118
+ <span class="cline-any cline-neutral">&nbsp;</span>
1119
+ <span class="cline-any cline-no">&nbsp;</span>
1120
+ <span class="cline-any cline-neutral">&nbsp;</span>
1121
+ <span class="cline-any cline-neutral">&nbsp;</span>
1122
+ <span class="cline-any cline-neutral">&nbsp;</span>
1123
+ <span class="cline-any cline-neutral">&nbsp;</span>
1124
+ <span class="cline-any cline-neutral">&nbsp;</span>
1125
+ <span class="cline-any cline-neutral">&nbsp;</span>
1126
+ <span class="cline-any cline-neutral">&nbsp;</span>
1127
+ <span class="cline-any cline-neutral">&nbsp;</span>
1128
+ <span class="cline-any cline-neutral">&nbsp;</span>
1129
+ <span class="cline-any cline-neutral">&nbsp;</span>
1130
+ <span class="cline-any cline-neutral">&nbsp;</span>
1131
+ <span class="cline-any cline-neutral">&nbsp;</span>
1132
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1136
+ <span class="cline-any cline-neutral">&nbsp;</span>
1137
+ <span class="cline-any cline-neutral">&nbsp;</span>
1138
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1142
+ <span class="cline-any cline-neutral">&nbsp;</span>
1143
+ <span class="cline-any cline-neutral">&nbsp;</span>
1144
+ <span class="cline-any cline-neutral">&nbsp;</span>
1145
+ <span class="cline-any cline-neutral">&nbsp;</span>
1146
+ <span class="cline-any cline-neutral">&nbsp;</span>
1147
+ <span class="cline-any cline-no">&nbsp;</span>
1148
+ <span class="cline-any cline-neutral">&nbsp;</span>
1149
+ <span class="cline-any cline-no">&nbsp;</span>
1150
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1154
+ <span class="cline-any cline-neutral">&nbsp;</span>
1155
+ <span class="cline-any cline-neutral">&nbsp;</span>
1156
+ <span class="cline-any cline-neutral">&nbsp;</span>
1157
+ <span class="cline-any cline-neutral">&nbsp;</span>
1158
+ <span class="cline-any cline-neutral">&nbsp;</span>
1159
+ <span class="cline-any cline-no">&nbsp;</span>
1160
+ <span class="cline-any cline-neutral">&nbsp;</span>
1161
+ <span class="cline-any cline-neutral">&nbsp;</span>
1162
+ <span class="cline-any cline-neutral">&nbsp;</span>
1163
+ <span class="cline-any cline-neutral">&nbsp;</span>
1164
+ <span class="cline-any cline-neutral">&nbsp;</span>
1165
+ <span class="cline-any cline-neutral">&nbsp;</span>
1166
+ <span class="cline-any cline-neutral">&nbsp;</span>
1167
+ <span class="cline-any cline-neutral">&nbsp;</span>
1168
+ <span class="cline-any cline-neutral">&nbsp;</span>
1169
+ <span class="cline-any cline-neutral">&nbsp;</span>
1170
+ <span class="cline-any cline-neutral">&nbsp;</span>
1171
+ <span class="cline-any cline-neutral">&nbsp;</span>
1172
+ <span class="cline-any cline-no">&nbsp;</span>
1173
+ <span class="cline-any cline-neutral">&nbsp;</span>
1174
+ <span class="cline-any cline-neutral">&nbsp;</span>
1175
+ <span class="cline-any cline-neutral">&nbsp;</span>
1176
+ <span class="cline-any cline-neutral">&nbsp;</span>
1177
+ <span class="cline-any cline-neutral">&nbsp;</span>
1178
+ <span class="cline-any cline-neutral">&nbsp;</span>
1179
+ <span class="cline-any cline-neutral">&nbsp;</span>
1180
+ <span class="cline-any cline-neutral">&nbsp;</span>
1181
+ <span class="cline-any cline-neutral">&nbsp;</span>
1182
+ <span class="cline-any cline-neutral">&nbsp;</span>
1183
+ <span class="cline-any cline-neutral">&nbsp;</span>
1184
+ <span class="cline-any cline-neutral">&nbsp;</span>
1185
+ <span class="cline-any cline-neutral">&nbsp;</span>
1186
+ <span class="cline-any cline-neutral">&nbsp;</span>
1187
+ <span class="cline-any cline-no">&nbsp;</span>
1188
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1193
+ <span class="cline-any cline-no">&nbsp;</span>
1194
+ <span class="cline-any cline-neutral">&nbsp;</span>
1195
+ <span class="cline-any cline-neutral">&nbsp;</span>
1196
+ <span class="cline-any cline-neutral">&nbsp;</span>
1197
+ <span class="cline-any cline-neutral">&nbsp;</span>
1198
+ <span class="cline-any cline-neutral">&nbsp;</span>
1199
+ <span class="cline-any cline-neutral">&nbsp;</span>
1200
+ <span class="cline-any cline-no">&nbsp;</span>
1201
+ <span class="cline-any cline-neutral">&nbsp;</span>
1202
+ <span class="cline-any cline-no">&nbsp;</span>
1203
+ <span class="cline-any cline-neutral">&nbsp;</span>
1204
+ <span class="cline-any cline-neutral">&nbsp;</span>
1205
+ <span class="cline-any cline-neutral">&nbsp;</span>
1206
+ <span class="cline-any cline-neutral">&nbsp;</span>
1207
+ <span class="cline-any cline-neutral">&nbsp;</span>
1208
+ <span class="cline-any cline-neutral">&nbsp;</span>
1209
+ <span class="cline-any cline-neutral">&nbsp;</span>
1210
+ <span class="cline-any cline-neutral">&nbsp;</span>
1211
+ <span class="cline-any cline-neutral">&nbsp;</span>
1212
+ <span class="cline-any cline-neutral">&nbsp;</span>
1213
+ <span class="cline-any cline-no">&nbsp;</span>
1214
+ <span class="cline-any cline-neutral">&nbsp;</span>
1215
+ <span class="cline-any cline-neutral">&nbsp;</span>
1216
+ <span class="cline-any cline-neutral">&nbsp;</span>
1217
+ <span class="cline-any cline-neutral">&nbsp;</span>
1218
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1223
+ <span class="cline-any cline-neutral">&nbsp;</span>
1224
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1228
+ <span class="cline-any cline-neutral">&nbsp;</span>
1229
+ <span class="cline-any cline-neutral">&nbsp;</span>
1230
+ <span class="cline-any cline-neutral">&nbsp;</span>
1231
+ <span class="cline-any cline-neutral">&nbsp;</span>
1232
+ <span class="cline-any cline-neutral">&nbsp;</span>
1233
+ <span class="cline-any cline-neutral">&nbsp;</span>
1234
+ <span class="cline-any cline-neutral">&nbsp;</span>
1235
+ <span class="cline-any cline-neutral">&nbsp;</span>
1236
+ <span class="cline-any cline-neutral">&nbsp;</span>
1237
+ <span class="cline-any cline-neutral">&nbsp;</span>
1238
+ <span class="cline-any cline-neutral">&nbsp;</span>
1239
+ <span class="cline-any cline-neutral">&nbsp;</span>
1240
+ <span class="cline-any cline-no">&nbsp;</span>
1241
+ <span class="cline-any cline-neutral">&nbsp;</span>
1242
+ <span class="cline-any cline-neutral">&nbsp;</span>
1243
+ <span class="cline-any cline-neutral">&nbsp;</span>
1244
+ <span class="cline-any cline-neutral">&nbsp;</span>
1245
+ <span class="cline-any cline-no">&nbsp;</span>
1246
+ <span class="cline-any cline-no">&nbsp;</span>
1247
+ <span class="cline-any cline-neutral">&nbsp;</span>
1248
+ <span class="cline-any cline-neutral">&nbsp;</span>
1249
+ <span class="cline-any cline-neutral">&nbsp;</span>
1250
+ <span class="cline-any cline-neutral">&nbsp;</span>
1251
+ <span class="cline-any cline-neutral">&nbsp;</span>
1252
+ <span class="cline-any cline-neutral">&nbsp;</span>
1253
+ <span class="cline-any cline-neutral">&nbsp;</span>
1254
+ <span class="cline-any cline-neutral">&nbsp;</span>
1255
+ <span class="cline-any cline-neutral">&nbsp;</span>
1256
+ <span class="cline-any cline-neutral">&nbsp;</span>
1257
+ <span class="cline-any cline-neutral">&nbsp;</span>
1258
+ <span class="cline-any cline-neutral">&nbsp;</span>
1259
+ <span class="cline-any cline-neutral">&nbsp;</span>
1260
+ <span class="cline-any cline-neutral">&nbsp;</span>
1261
+ <span class="cline-any cline-neutral">&nbsp;</span>
1262
+ <span class="cline-any cline-neutral">&nbsp;</span>
1263
+ <span class="cline-any cline-neutral">&nbsp;</span>
1264
+ <span class="cline-any cline-no">&nbsp;</span>
1265
+ <span class="cline-any cline-no">&nbsp;</span>
1266
+ <span class="cline-any cline-no">&nbsp;</span>
1267
+ <span class="cline-any cline-no">&nbsp;</span>
1268
+ <span class="cline-any cline-no">&nbsp;</span>
1269
+ <span class="cline-any cline-no">&nbsp;</span>
1270
+ <span class="cline-any cline-no">&nbsp;</span>
1271
+ <span class="cline-any cline-no">&nbsp;</span>
1272
+ <span class="cline-any cline-neutral">&nbsp;</span>
1273
+ <span class="cline-any cline-no">&nbsp;</span>
1274
+ <span class="cline-any cline-neutral">&nbsp;</span>
1275
+ <span class="cline-any cline-neutral">&nbsp;</span>
1276
+ <span class="cline-any cline-neutral">&nbsp;</span>
1277
+ <span class="cline-any cline-neutral">&nbsp;</span>
1278
+ <span class="cline-any cline-neutral">&nbsp;</span>
1279
+ <span class="cline-any cline-neutral">&nbsp;</span>
1280
+ <span class="cline-any cline-neutral">&nbsp;</span>
1281
+ <span class="cline-any cline-neutral">&nbsp;</span>
1282
+ <span class="cline-any cline-neutral">&nbsp;</span>
1283
+ <span class="cline-any cline-no">&nbsp;</span>
1284
+ <span class="cline-any cline-neutral">&nbsp;</span>
1285
+ <span class="cline-any cline-neutral">&nbsp;</span>
1286
+ <span class="cline-any cline-neutral">&nbsp;</span>
1287
+ <span class="cline-any cline-neutral">&nbsp;</span>
1288
+ <span class="cline-any cline-neutral">&nbsp;</span>
1289
+ <span class="cline-any cline-neutral">&nbsp;</span>
1290
+ <span class="cline-any cline-neutral">&nbsp;</span>
1291
+ <span class="cline-any cline-neutral">&nbsp;</span>
1292
+ <span class="cline-any cline-neutral">&nbsp;</span>
1293
+ <span class="cline-any cline-neutral">&nbsp;</span>
1294
+ <span class="cline-any cline-neutral">&nbsp;</span>
1295
+ <span class="cline-any cline-neutral">&nbsp;</span>
1296
+ <span class="cline-any cline-neutral">&nbsp;</span>
1297
+ <span class="cline-any cline-neutral">&nbsp;</span>
1298
+ <span class="cline-any cline-neutral">&nbsp;</span>
1299
+ <span class="cline-any cline-neutral">&nbsp;</span>
1300
+ <span class="cline-any cline-neutral">&nbsp;</span>
1301
+ <span class="cline-any cline-neutral">&nbsp;</span>
1302
+ <span class="cline-any cline-no">&nbsp;</span>
1303
+ <span class="cline-any cline-neutral">&nbsp;</span>
1304
+ <span class="cline-any cline-neutral">&nbsp;</span>
1305
+ <span class="cline-any cline-no">&nbsp;</span>
1306
+ <span class="cline-any cline-no">&nbsp;</span>
1307
+ <span class="cline-any cline-no">&nbsp;</span>
1308
+ <span class="cline-any cline-no">&nbsp;</span>
1309
+ <span class="cline-any cline-no">&nbsp;</span>
1310
+ <span class="cline-any cline-no">&nbsp;</span>
1311
+ <span class="cline-any cline-no">&nbsp;</span>
1312
+ <span class="cline-any cline-no">&nbsp;</span>
1313
+ <span class="cline-any cline-neutral">&nbsp;</span>
1314
+ <span class="cline-any cline-neutral">&nbsp;</span>
1315
+ <span class="cline-any cline-no">&nbsp;</span>
1316
+ <span class="cline-any cline-neutral">&nbsp;</span>
1317
+ <span class="cline-any cline-neutral">&nbsp;</span>
1318
+ <span class="cline-any cline-neutral">&nbsp;</span>
1319
+ <span class="cline-any cline-no">&nbsp;</span>
1320
+ <span class="cline-any cline-no">&nbsp;</span>
1321
+ <span class="cline-any cline-neutral">&nbsp;</span>
1322
+ <span class="cline-any cline-no">&nbsp;</span>
1323
+ <span class="cline-any cline-neutral">&nbsp;</span>
1324
+ <span class="cline-any cline-neutral">&nbsp;</span>
1325
+ <span class="cline-any cline-neutral">&nbsp;</span>
1326
+ <span class="cline-any cline-neutral">&nbsp;</span>
1327
+ <span class="cline-any cline-neutral">&nbsp;</span>
1328
+ <span class="cline-any cline-neutral">&nbsp;</span>
1329
+ <span class="cline-any cline-neutral">&nbsp;</span>
1330
+ <span class="cline-any cline-neutral">&nbsp;</span>
1331
+ <span class="cline-any cline-no">&nbsp;</span>
1332
+ <span class="cline-any cline-neutral">&nbsp;</span>
1333
+ <span class="cline-any cline-neutral">&nbsp;</span>
1334
+ <span class="cline-any cline-neutral">&nbsp;</span>
1335
+ <span class="cline-any cline-neutral">&nbsp;</span>
1336
+ <span class="cline-any cline-neutral">&nbsp;</span>
1337
+ <span class="cline-any cline-neutral">&nbsp;</span>
1338
+ <span class="cline-any cline-neutral">&nbsp;</span>
1339
+ <span class="cline-any cline-no">&nbsp;</span>
1340
+ <span class="cline-any cline-neutral">&nbsp;</span>
1341
+ <span class="cline-any cline-neutral">&nbsp;</span>
1342
+ <span class="cline-any cline-neutral">&nbsp;</span>
1343
+ <span class="cline-any cline-neutral">&nbsp;</span>
1344
+ <span class="cline-any cline-neutral">&nbsp;</span>
1345
+ <span class="cline-any cline-neutral">&nbsp;</span>
1346
+ <span class="cline-any cline-neutral">&nbsp;</span>
1347
+ <span class="cline-any cline-neutral">&nbsp;</span>
1348
+ <span class="cline-any cline-no">&nbsp;</span>
1349
+ <span class="cline-any cline-neutral">&nbsp;</span>
1350
+ <span class="cline-any cline-neutral">&nbsp;</span>
1351
+ <span class="cline-any cline-neutral">&nbsp;</span>
1352
+ <span class="cline-any cline-neutral">&nbsp;</span>
1353
+ <span class="cline-any cline-neutral">&nbsp;</span>
1354
+ <span class="cline-any cline-neutral">&nbsp;</span>
1355
+ <span class="cline-any cline-neutral">&nbsp;</span>
1356
+ <span class="cline-any cline-neutral">&nbsp;</span>
1357
+ <span class="cline-any cline-neutral">&nbsp;</span>
1358
+ <span class="cline-any cline-neutral">&nbsp;</span>
1359
+ <span class="cline-any cline-neutral">&nbsp;</span>
1360
+ <span class="cline-any cline-neutral">&nbsp;</span>
1361
+ <span class="cline-any cline-neutral">&nbsp;</span>
1362
+ <span class="cline-any cline-no">&nbsp;</span>
1363
+ <span class="cline-any cline-neutral">&nbsp;</span>
1364
+ <span class="cline-any cline-neutral">&nbsp;</span>
1365
+ <span class="cline-any cline-neutral">&nbsp;</span>
1366
+ <span class="cline-any cline-neutral">&nbsp;</span>
1367
+ <span class="cline-any cline-neutral">&nbsp;</span>
1368
+ <span class="cline-any cline-neutral">&nbsp;</span>
1369
+ <span class="cline-any cline-neutral">&nbsp;</span>
1370
+ <span class="cline-any cline-neutral">&nbsp;</span>
1371
+ <span class="cline-any cline-neutral">&nbsp;</span>
1372
+ <span class="cline-any cline-neutral">&nbsp;</span>
1373
+ <span class="cline-any cline-neutral">&nbsp;</span>
1374
+ <span class="cline-any cline-neutral">&nbsp;</span>
1375
+ <span class="cline-any cline-neutral">&nbsp;</span>
1376
+ <span class="cline-any cline-neutral">&nbsp;</span>
1377
+ <span class="cline-any cline-neutral">&nbsp;</span>
1378
+ <span class="cline-any cline-neutral">&nbsp;</span>
1379
+ <span class="cline-any cline-neutral">&nbsp;</span>
1380
+ <span class="cline-any cline-neutral">&nbsp;</span>
1381
+ <span class="cline-any cline-neutral">&nbsp;</span>
1382
+ <span class="cline-any cline-neutral">&nbsp;</span>
1383
+ <span class="cline-any cline-neutral">&nbsp;</span>
1384
+ <span class="cline-any cline-neutral">&nbsp;</span>
1385
+ <span class="cline-any cline-no">&nbsp;</span>
1386
+ <span class="cline-any cline-no">&nbsp;</span>
1387
+ <span class="cline-any cline-no">&nbsp;</span>
1388
+ <span class="cline-any cline-no">&nbsp;</span>
1389
+ <span class="cline-any cline-no">&nbsp;</span>
1390
+ <span class="cline-any cline-no">&nbsp;</span>
1391
+ <span class="cline-any cline-no">&nbsp;</span>
1392
+ <span class="cline-any cline-no">&nbsp;</span>
1393
+ <span class="cline-any cline-no">&nbsp;</span>
1394
+ <span class="cline-any cline-neutral">&nbsp;</span>
1395
+ <span class="cline-any cline-neutral">&nbsp;</span>
1396
+ <span class="cline-any cline-neutral">&nbsp;</span>
1397
+ <span class="cline-any cline-neutral">&nbsp;</span>
1398
+ <span class="cline-any cline-neutral">&nbsp;</span>
1399
+ <span class="cline-any cline-neutral">&nbsp;</span>
1400
+ <span class="cline-any cline-no">&nbsp;</span>
1401
+ <span class="cline-any cline-neutral">&nbsp;</span>
1402
+ <span class="cline-any cline-no">&nbsp;</span>
1403
+ <span class="cline-any cline-neutral">&nbsp;</span>
1404
+ <span class="cline-any cline-neutral">&nbsp;</span>
1405
+ <span class="cline-any cline-neutral">&nbsp;</span>
1406
+ <span class="cline-any cline-neutral">&nbsp;</span>
1407
+ <span class="cline-any cline-neutral">&nbsp;</span>
1408
+ <span class="cline-any cline-neutral">&nbsp;</span>
1409
+ <span class="cline-any cline-neutral">&nbsp;</span>
1410
+ <span class="cline-any cline-neutral">&nbsp;</span>
1411
+ <span class="cline-any cline-no">&nbsp;</span>
1412
+ <span class="cline-any cline-neutral">&nbsp;</span>
1413
+ <span class="cline-any cline-neutral">&nbsp;</span>
1414
+ <span class="cline-any cline-neutral">&nbsp;</span>
1415
+ <span class="cline-any cline-neutral">&nbsp;</span>
1416
+ <span class="cline-any cline-neutral">&nbsp;</span>
1417
+ <span class="cline-any cline-neutral">&nbsp;</span>
1418
+ <span class="cline-any cline-no">&nbsp;</span>
1419
+ <span class="cline-any cline-no">&nbsp;</span>
1420
+ <span class="cline-any cline-no">&nbsp;</span>
1421
+ <span class="cline-any cline-neutral">&nbsp;</span>
1422
+ <span class="cline-any cline-neutral">&nbsp;</span>
1423
+ <span class="cline-any cline-neutral">&nbsp;</span>
1424
+ <span class="cline-any cline-no">&nbsp;</span>
1425
+ <span class="cline-any cline-no">&nbsp;</span>
1426
+ <span class="cline-any cline-neutral">&nbsp;</span>
1427
+ <span class="cline-any cline-neutral">&nbsp;</span>
1428
+ <span class="cline-any cline-neutral">&nbsp;</span>
1429
+ <span class="cline-any cline-neutral">&nbsp;</span>
1430
+ <span class="cline-any cline-neutral">&nbsp;</span>
1431
+ <span class="cline-any cline-neutral">&nbsp;</span>
1432
+ <span class="cline-any cline-neutral">&nbsp;</span>
1433
+ <span class="cline-any cline-neutral">&nbsp;</span>
1434
+ <span class="cline-any cline-neutral">&nbsp;</span>
1435
+ <span class="cline-any cline-neutral">&nbsp;</span>
1436
+ <span class="cline-any cline-no">&nbsp;</span>
1437
+ <span class="cline-any cline-neutral">&nbsp;</span>
1438
+ <span class="cline-any cline-neutral">&nbsp;</span>
1439
+ <span class="cline-any cline-neutral">&nbsp;</span>
1440
+ <span class="cline-any cline-neutral">&nbsp;</span>
1441
+ <span class="cline-any cline-neutral">&nbsp;</span>
1442
+ <span class="cline-any cline-neutral">&nbsp;</span>
1443
+ <span class="cline-any cline-no">&nbsp;</span>
1444
+ <span class="cline-any cline-no">&nbsp;</span>
1445
+ <span class="cline-any cline-neutral">&nbsp;</span>
1446
+ <span class="cline-any cline-neutral">&nbsp;</span>
1447
+ <span class="cline-any cline-neutral">&nbsp;</span>
1448
+ <span class="cline-any cline-neutral">&nbsp;</span>
1449
+ <span class="cline-any cline-neutral">&nbsp;</span>
1450
+ <span class="cline-any cline-neutral">&nbsp;</span>
1451
+ <span class="cline-any cline-neutral">&nbsp;</span>
1452
+ <span class="cline-any cline-neutral">&nbsp;</span>
1453
+ <span class="cline-any cline-neutral">&nbsp;</span>
1454
+ <span class="cline-any cline-neutral">&nbsp;</span>
1455
+ <span class="cline-any cline-no">&nbsp;</span>
1456
+ <span class="cline-any cline-neutral">&nbsp;</span>
1457
+ <span class="cline-any cline-neutral">&nbsp;</span>
1458
+ <span class="cline-any cline-neutral">&nbsp;</span>
1459
+ <span class="cline-any cline-neutral">&nbsp;</span>
1460
+ <span class="cline-any cline-no">&nbsp;</span>
1461
+ <span class="cline-any cline-neutral">&nbsp;</span>
1462
+ <span class="cline-any cline-neutral">&nbsp;</span>
1463
+ <span class="cline-any cline-neutral">&nbsp;</span>
1464
+ <span class="cline-any cline-neutral">&nbsp;</span>
1465
+ <span class="cline-any cline-neutral">&nbsp;</span>
1466
+ <span class="cline-any cline-neutral">&nbsp;</span>
1467
+ <span class="cline-any cline-neutral">&nbsp;</span>
1468
+ <span class="cline-any cline-neutral">&nbsp;</span>
1469
+ <span class="cline-any cline-neutral">&nbsp;</span>
1470
+ <span class="cline-any cline-neutral">&nbsp;</span>
1471
+ <span class="cline-any cline-neutral">&nbsp;</span>
1472
+ <span class="cline-any cline-neutral">&nbsp;</span>
1473
+ <span class="cline-any cline-neutral">&nbsp;</span>
1474
+ <span class="cline-any cline-neutral">&nbsp;</span>
1475
+ <span class="cline-any cline-neutral">&nbsp;</span>
1476
+ <span class="cline-any cline-neutral">&nbsp;</span>
1477
+ <span class="cline-any cline-neutral">&nbsp;</span>
1478
+ <span class="cline-any cline-neutral">&nbsp;</span>
1479
+ <span class="cline-any cline-neutral">&nbsp;</span>
1480
+ <span class="cline-any cline-neutral">&nbsp;</span>
1481
+ <span class="cline-any cline-neutral">&nbsp;</span>
1482
+ <span class="cline-any cline-neutral">&nbsp;</span>
1483
+ <span class="cline-any cline-neutral">&nbsp;</span>
1484
+ <span class="cline-any cline-no">&nbsp;</span>
1485
+ <span class="cline-any cline-no">&nbsp;</span>
1486
+ <span class="cline-any cline-no">&nbsp;</span>
1487
+ <span class="cline-any cline-no">&nbsp;</span>
1488
+ <span class="cline-any cline-no">&nbsp;</span>
1489
+ <span class="cline-any cline-no">&nbsp;</span>
1490
+ <span class="cline-any cline-no">&nbsp;</span>
1491
+ <span class="cline-any cline-no">&nbsp;</span>
1492
+ <span class="cline-any cline-neutral">&nbsp;</span>
1493
+ <span class="cline-any cline-neutral">&nbsp;</span>
1494
+ <span class="cline-any cline-no">&nbsp;</span>
1495
+ <span class="cline-any cline-neutral">&nbsp;</span>
1496
+ <span class="cline-any cline-no">&nbsp;</span>
1497
+ <span class="cline-any cline-neutral">&nbsp;</span>
1498
+ <span class="cline-any cline-neutral">&nbsp;</span>
1499
+ <span class="cline-any cline-neutral">&nbsp;</span>
1500
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { ClassError, ObjectBase } from '@tomei/general';
1501
+ import { UserSystemAccessRepository } from './user-system-access.repository';
1502
+ import { IUserSystemAccess } from '../../interfaces/user-system-access.interface';
1503
+ import { User } from '../login-user/user';
1504
+ import { ApplicationConfig } from '@tomei/config';
1505
+ import SystemModel from '../../models/system.entity';
1506
+ import SystemPrivilegeModel from '../../models/system-privilege.entity';
1507
+ import UserSystemAccessModel from '../../models/user-system-access.entity';
1508
+ import GroupModel from '../../models/group.entity';
1509
+ import GroupSystemAccessModel from '../../models/group-system-access.entity';
1510
+ import UserModel from '../../models/user.entity';
1511
+ import { ActionEnum, Activity } from '@tomei/activity-history';
1512
+ import { Op } from 'sequelize';
1513
+ import { UserPrivilegeRepository } from '../user-privilege/user-privilege.repository';
1514
+ import UserGroupModel from 'models/user-group.entity';
1515
+ import { UserStatus } from '../../enum';
1516
+ &nbsp;
1517
+ export class UserSystemAccess extends ObjectBase {
1518
+ ObjectType = 'UserSystemAccess';
1519
+ TableName = 'sso_UserSystemAccess';
1520
+ ObjectName: string;
1521
+ ObjectId: string;
1522
+ UserSystemAccessId: number;
1523
+ UserId: number;
1524
+ SystemCode: string;
1525
+ Status: string;
1526
+ private _CreatedAt: Date;
1527
+ private _UpdatedAt: Date;
1528
+ private _CreatedById: number;
1529
+ private _UpdatedById: number;
1530
+ &nbsp;
1531
+ get CreatedAt() {
1532
+ return this._CreatedAt;
1533
+ }
1534
+ &nbsp;
1535
+ get UpdatedAt() {
1536
+ return this._UpdatedAt;
1537
+ }
1538
+ &nbsp;
1539
+ get CreatedById() {
1540
+ return this._CreatedById;
1541
+ }
1542
+ &nbsp;
1543
+ get UpdatedById() {
1544
+ return this._UpdatedById;
1545
+ }
1546
+ &nbsp;
1547
+ private static _Repository = new UserSystemAccessRepository();
1548
+ private static _UserPrivilegeRepo = new UserPrivilegeRepository();
1549
+ &nbsp;
1550
+ private constructor(userSystemAccessAttr?: IUserSystemAccess) {
1551
+ super();
1552
+ if (userSystemAccessAttr) {
1553
+ this.UserSystemAccessId = userSystemAccessAttr.UserSystemAccessId;
1554
+ this.UserId = userSystemAccessAttr.UserId;
1555
+ this.SystemCode = userSystemAccessAttr.SystemCode;
1556
+ this.Status = userSystemAccessAttr.Status;
1557
+ this._CreatedById = userSystemAccessAttr.CreatedById;
1558
+ this._CreatedAt = userSystemAccessAttr.CreatedAt;
1559
+ this._UpdatedById = userSystemAccessAttr.UpdatedById;
1560
+ this._UpdatedAt = userSystemAccessAttr.UpdatedAt;
1561
+ }
1562
+ }
1563
+ &nbsp;
1564
+ static async init(dbTransaction: any, UserSystemAccessId?: number) {
1565
+ try {
1566
+ const userSystemAccess = new UserSystemAccess();
1567
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (UserSystemAccessId) {
1568
+ const userSystemAccessAttr = await this._Repository.findOne({
1569
+ where: { UserSystemAccessId },
1570
+ transaction: dbTransaction,
1571
+ });
1572
+ if (userSystemAccessAttr) {
1573
+ return new UserSystemAccess(
1574
+ userSystemAccessAttr.get({ plain: true }),
1575
+ );
1576
+ } else {
1577
+ throw new ClassError(
1578
+ 'UserSystemAccess',
1579
+ 'UserSystemAccessErrMsg00',
1580
+ 'UserSystemAccess not found',
1581
+ );
1582
+ }
1583
+ }
1584
+ <span class="cstat-no" title="statement not covered" > return userSystemAccess;</span>
1585
+ } catch (error) {
1586
+ throw error;
1587
+ }
1588
+ }
1589
+ &nbsp;
1590
+ public <span class="fstat-no" title="function not covered" >static </span>async findAll(
1591
+ loginUser: User, //The currently logged-in user initiating the request.
1592
+ dbTransaction: any, //The active database transaction to ensure consistency during the query.
1593
+ whereOption: {
1594
+ //An object containing filter criteria, specifically:
1595
+ UserId: number; //The ID of the user whose system access records are to be retrieved.
1596
+ SystemCode?: string;
1597
+ },
1598
+ pagination: {
1599
+ //An object containing pagination parameters:
1600
+ page: number; //The current page number to retrieve.
1601
+ limit: number; //The number of records to retrieve per page.
1602
+ },
1603
+ ): Promise&lt;{
1604
+ records: {
1605
+ SystemName: string;
1606
+ SystemCode: string;
1607
+ Status: string;
1608
+ CreatedBy: string;
1609
+ CreatedAt: Date;
1610
+ UpdatedBy: string;
1611
+ UpdatedAt: Date;
1612
+ }[];
1613
+ pagination: {
1614
+ currentPage: number;
1615
+ pageSize: number;
1616
+ totalRecords: number;
1617
+ };
1618
+ }&gt; {
1619
+ <span class="cstat-no" title="statement not covered" > try {</span>
1620
+ // Privilege Checking:
1621
+ // Call loginUser.checkPrivileges() method by passing:
1622
+ // SystemCode: Retrieve from app config.
1623
+ // PrivilegeCode: 'USER_SYSTEM_ACCESS_LIST'.
1624
+ const systemCode =
1625
+ <span class="cstat-no" title="statement not covered" > ApplicationConfig.getComponentConfigValue('system-code');</span>
1626
+ const privilegeCode = <span class="cstat-no" title="statement not covered" >'USER_SYSTEM_ACCESS_LIST';</span>
1627
+ const isPrivileged = <span class="cstat-no" title="statement not covered" >await loginUser.checkPrivileges(</span>
1628
+ systemCode,
1629
+ privilegeCode,
1630
+ );
1631
+ <span class="cstat-no" title="statement not covered" > if (!isPrivileged) {</span>
1632
+ <span class="cstat-no" title="statement not covered" > throw new ClassError(</span>
1633
+ 'UserSystemAccess',
1634
+ 'UserSystemAccessErrMsg01',
1635
+ 'You do not have permission to access this resource.',
1636
+ );
1637
+ }
1638
+ // Create a where condition using whereOption to filter by UserId.
1639
+ // Set up pagination logic using the pagination parameter:
1640
+ // Calculate offset based on page and limit.
1641
+ const options: any = <span class="cstat-no" title="statement not covered" >{</span>
1642
+ distinct: true,
1643
+ where: {
1644
+ UserId: whereOption.UserId,
1645
+ },
1646
+ offset: (pagination.page - 1) * pagination.limit,
1647
+ limit: pagination.limit,
1648
+ transaction: dbTransaction,
1649
+ include: [
1650
+ {
1651
+ model: SystemModel,
1652
+ attributes: ['Name', 'SystemCode'],
1653
+ },
1654
+ {
1655
+ model: UserModel,
1656
+ as: 'CreatedBy',
1657
+ attributes: ['FullName'],
1658
+ },
1659
+ {
1660
+ model: UserModel,
1661
+ as: 'UpdatedBy',
1662
+ attributes: ['FullName'],
1663
+ },
1664
+ ],
1665
+ };
1666
+ const userSystemAccesses =
1667
+ <span class="cstat-no" title="statement not covered" > await this._Repository.findAllWithPagination(options);</span>
1668
+ <span class="cstat-no" title="statement not covered" > return {</span>
1669
+ records: userSystemAccesses.rows.map(<span class="fstat-no" title="function not covered" >(u</span>serSystemAccess) =&gt; {
1670
+ <span class="cstat-no" title="statement not covered" > return {</span>
1671
+ UserSystemAccessId: userSystemAccess.UserSystemAccessId,
1672
+ SystemName: userSystemAccess.System.Name,
1673
+ SystemCode: userSystemAccess.System.SystemCode,
1674
+ Status: userSystemAccess.Status,
1675
+ CreatedBy: userSystemAccess.CreatedBy.FullName,
1676
+ CreatedAt: userSystemAccess.CreatedAt,
1677
+ UpdatedBy: userSystemAccess.UpdatedBy.FullName,
1678
+ UpdatedAt: userSystemAccess.UpdatedAt,
1679
+ };
1680
+ }),
1681
+ pagination: {
1682
+ currentPage: pagination.page,
1683
+ pageSize: pagination.limit,
1684
+ totalRecords: userSystemAccesses.count,
1685
+ },
1686
+ };
1687
+ } catch (error) {
1688
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
1689
+ }
1690
+ }
1691
+ &nbsp;
1692
+ public <span class="fstat-no" title="function not covered" >static </span>async findAllUsers(
1693
+ loginUser: User, //The currently logged-in user initiating the request.
1694
+ dbTransaction: any, //The active database transaction to ensure consistency during the query.
1695
+ SystemCode: string,
1696
+ Page: number,
1697
+ Rows: number,
1698
+ Search: {
1699
+ UserId?: string | number;
1700
+ Status?: string;
1701
+ },
1702
+ ) {
1703
+ // Part 1: Privilege Checking
1704
+ const systemCode = <span class="cstat-no" title="statement not covered" >ApplicationConfig.getComponentConfigValue('system-code');</span>
1705
+ const isPrivileged = <span class="cstat-no" title="statement not covered" >await loginUser.checkPrivileges(</span>
1706
+ systemCode,
1707
+ 'USER_SYSTEM_ACCESS_LIST',
1708
+ );
1709
+ &nbsp;
1710
+ <span class="cstat-no" title="statement not covered" > if (!isPrivileged) {</span>
1711
+ <span class="cstat-no" title="statement not covered" > throw new ClassError(</span>
1712
+ 'UserSystemAccessUser',
1713
+ 'UserSystemAccessUserErrMsg01',
1714
+ 'You do not have permission to view system access users.',
1715
+ );
1716
+ }
1717
+ &nbsp;
1718
+ <span class="cstat-no" title="statement not covered" > try {</span>
1719
+ // Part 2: Retrieve System Access Users and returns
1720
+ const queryObj: any = <span class="cstat-no" title="statement not covered" >{ SystemCode: SystemCode };</span>
1721
+ &nbsp;
1722
+ <span class="cstat-no" title="statement not covered" > if (Search) {</span>
1723
+ <span class="cstat-no" title="statement not covered" > Object.entries(Search).forEach(<span class="fstat-no" title="function not covered" >([</span>key, value]) =&gt; {</span>
1724
+ <span class="cstat-no" title="statement not covered" > queryObj[key] = value;</span>
1725
+ });
1726
+ }
1727
+ &nbsp;
1728
+ let options: any = <span class="cstat-no" title="statement not covered" >{</span>
1729
+ where: queryObj,
1730
+ distinct: true,
1731
+ transaction: dbTransaction,
1732
+ };
1733
+ &nbsp;
1734
+ <span class="cstat-no" title="statement not covered" > if (Page &amp;&amp; Rows) {</span>
1735
+ <span class="cstat-no" title="statement not covered" > options = {</span>
1736
+ ...options,
1737
+ limit: Rows,
1738
+ offset: Rows * (Page - 1),
1739
+ order: [['CreatedAt', 'DESC']],
1740
+ include: [
1741
+ {
1742
+ model: SystemModel,
1743
+ attributes: ['Name', 'SystemCode'],
1744
+ },
1745
+ {
1746
+ model: UserModel,
1747
+ where: {
1748
+ Status: UserStatus.ACTIVE,
1749
+ },
1750
+ as: 'User',
1751
+ attributes: ['UserId', 'FullName', 'Email'],
1752
+ },
1753
+ ],
1754
+ };
1755
+ }
1756
+ &nbsp;
1757
+ const userSystemAccesses =
1758
+ <span class="cstat-no" title="statement not covered" > await this._Repository.findAndCountAll(options);</span>
1759
+ <span class="cstat-no" title="statement not covered" > return userSystemAccesses;</span>
1760
+ } catch (error) {
1761
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
1762
+ }
1763
+ }
1764
+ &nbsp;
1765
+ public <span class="fstat-no" title="function not covered" >static </span>async findAllUserPrivileges(
1766
+ loginUser: User, //The currently logged-in user initiating the request.
1767
+ dbTransaction: any, //The active database transaction to ensure consistency during the query.
1768
+ SystemCode: string,
1769
+ search?: {
1770
+ UserId?: string[];
1771
+ Status?: string;
1772
+ },
1773
+ ) {
1774
+ // Part 1: Privilege Checking
1775
+ const systemCode = <span class="cstat-no" title="statement not covered" >ApplicationConfig.getComponentConfigValue('system-code');</span>
1776
+ const isPrivileged = <span class="cstat-no" title="statement not covered" >await loginUser.checkPrivileges(</span>
1777
+ systemCode,
1778
+ 'USER_SYSTEM_ACCESS_LIST',
1779
+ );
1780
+ &nbsp;
1781
+ <span class="cstat-no" title="statement not covered" > if (!isPrivileged) {</span>
1782
+ <span class="cstat-no" title="statement not covered" > throw new ClassError(</span>
1783
+ 'UserSystemAccessUser',
1784
+ 'UserSystemAccessUserErrMsg01',
1785
+ 'You do not have permission to view system access users.',
1786
+ );
1787
+ }
1788
+ &nbsp;
1789
+ <span class="cstat-no" title="statement not covered" > try {</span>
1790
+ //Part 2: Retrieve User System Access Based on Privileges
1791
+ let systemWhere: any = <span class="cstat-no" title="statement not covered" >{};</span>
1792
+ &nbsp;
1793
+ <span class="cstat-no" title="statement not covered" > if (SystemCode) {</span>
1794
+ <span class="cstat-no" title="statement not covered" > systemWhere = {</span>
1795
+ SystemCode: {
1796
+ [Op.substring]: SystemCode,
1797
+ },
1798
+ };
1799
+ }
1800
+ &nbsp;
1801
+ const allSystemAccessUsers = <span class="cstat-no" title="statement not covered" >await UserSystemAccessModel.findAll({</span>
1802
+ include: [
1803
+ {
1804
+ model: SystemModel,
1805
+ where: systemWhere,
1806
+ },
1807
+ {
1808
+ model: UserModel,
1809
+ as: 'User',
1810
+ attributes: ['UserId', 'FullName'],
1811
+ },
1812
+ ],
1813
+ transaction: dbTransaction,
1814
+ });
1815
+ &nbsp;
1816
+ const allPrivileges = <span class="cstat-no" title="statement not covered" >await SystemPrivilegeModel.findAll({</span>
1817
+ where: systemWhere,
1818
+ transaction: dbTransaction,
1819
+ });
1820
+ &nbsp;
1821
+ const systemAccessUserPrivileges = <span class="cstat-no" title="statement not covered" >allPrivileges.map(</span>
1822
+ <span class="fstat-no" title="function not covered" > async (p</span>rivilege) =&gt;<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" > {</span></span>
1823
+ const filteredUsers = <span class="cstat-no" title="statement not covered" >allSystemAccessUsers</span>
1824
+ .map(<span class="fstat-no" title="function not covered" >(u</span>serAccess) =&gt; <span class="cstat-no" title="statement not covered" >userAccess.User)</span>
1825
+ .filter(<span class="fstat-no" title="function not covered" >(u</span>ser) =&gt; <span class="cstat-no" title="statement not covered" >search.UserId.includes(String(user.UserId)))</span>;
1826
+ &nbsp;
1827
+ <span class="cstat-no" title="statement not covered" > return {</span>
1828
+ ...privilege.get({ plain: true }),
1829
+ Users: filteredUsers,
1830
+ };
1831
+ },
1832
+ );
1833
+ &nbsp;
1834
+ <span class="cstat-no" title="statement not covered" > return systemAccessUserPrivileges;</span>
1835
+ } catch (error) {
1836
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
1837
+ }
1838
+ }
1839
+ &nbsp;
1840
+ public <span class="fstat-no" title="function not covered" >static </span>async findAllUserRoles(
1841
+ loginUser: User, //The currently logged-in user initiating the request.
1842
+ dbTransaction: any, //The active database transaction to ensure consistency during the query.
1843
+ SystemCode: string,
1844
+ search?: {
1845
+ UserId?: string[];
1846
+ Status?: string;
1847
+ },
1848
+ ) {
1849
+ // Part 1: Privilege Checking
1850
+ const systemCode = <span class="cstat-no" title="statement not covered" >ApplicationConfig.getComponentConfigValue('system-code');</span>
1851
+ const isPrivileged = <span class="cstat-no" title="statement not covered" >await loginUser.checkPrivileges(</span>
1852
+ systemCode,
1853
+ 'USER_SYSTEM_ACCESS_LIST',
1854
+ );
1855
+ &nbsp;
1856
+ <span class="cstat-no" title="statement not covered" > if (!isPrivileged) {</span>
1857
+ <span class="cstat-no" title="statement not covered" > throw new ClassError(</span>
1858
+ 'UserSystemAccessUser',
1859
+ 'UserSystemAccessUserErrMsg01',
1860
+ 'You do not have permission to view system access users.',
1861
+ );
1862
+ }
1863
+ &nbsp;
1864
+ <span class="cstat-no" title="statement not covered" > try {</span>
1865
+ //Part 2: Retrieve User System Access Based on Privileges
1866
+ let systemWhere: any = <span class="cstat-no" title="statement not covered" >{};</span>
1867
+ &nbsp;
1868
+ <span class="cstat-no" title="statement not covered" > if (SystemCode) {</span>
1869
+ <span class="cstat-no" title="statement not covered" > systemWhere = {</span>
1870
+ SystemCode: {
1871
+ [Op.substring]: SystemCode,
1872
+ },
1873
+ };
1874
+ }
1875
+ &nbsp;
1876
+ const allGroupSystemAccess = <span class="cstat-no" title="statement not covered" >await GroupSystemAccessModel.findAll({</span>
1877
+ where: systemWhere,
1878
+ include: [
1879
+ {
1880
+ model: GroupModel,
1881
+ where: {
1882
+ Type: 'Role',
1883
+ },
1884
+ },
1885
+ ],
1886
+ transaction: dbTransaction,
1887
+ });
1888
+ &nbsp;
1889
+ const allSystemAccessUsers = <span class="cstat-no" title="statement not covered" >await UserSystemAccessModel.findAll({</span>
1890
+ include: [
1891
+ {
1892
+ model: SystemModel,
1893
+ where: systemWhere,
1894
+ },
1895
+ {
1896
+ model: UserModel,
1897
+ as: 'User',
1898
+ attributes: ['UserId', 'FullName'],
1899
+ },
1900
+ ],
1901
+ transaction: dbTransaction,
1902
+ });
1903
+ &nbsp;
1904
+ const systemAccessUserRoles = <span class="cstat-no" title="statement not covered" >allGroupSystemAccess.map(</span>
1905
+ <span class="fstat-no" title="function not covered" > (g</span>roupSystemAccess) =&gt; {
1906
+ const filteredUsers = <span class="cstat-no" title="statement not covered" >allSystemAccessUsers</span>
1907
+ .map(<span class="fstat-no" title="function not covered" >(u</span>serAccess) =&gt; <span class="cstat-no" title="statement not covered" >userAccess.User)</span>
1908
+ .filter(<span class="fstat-no" title="function not covered" >(u</span>ser) =&gt; <span class="cstat-no" title="statement not covered" >search.UserId.includes(String(user.UserId)))</span>;
1909
+ &nbsp;
1910
+ <span class="cstat-no" title="statement not covered" > return {</span>
1911
+ ...groupSystemAccess.Group.get({ plain: true }),
1912
+ Users: filteredUsers,
1913
+ };
1914
+ },
1915
+ );
1916
+ &nbsp;
1917
+ <span class="cstat-no" title="statement not covered" > return systemAccessUserRoles;</span>
1918
+ } catch (error) {
1919
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
1920
+ }
1921
+ }
1922
+ &nbsp;
1923
+ public <span class="fstat-no" title="function not covered" >static </span>async createAccess(
1924
+ loginUser: User, //The currently logged-in user initiating the request.
1925
+ dbTransaction: any, //The active database transaction to ensure consistency during the query.
1926
+ UserId: string, //The user ID for whom system access is being created.
1927
+ SystemCode: string, //The system code for which access is being granted.
1928
+ Status: string, //The status of access ('Active' or 'Inactive').
1929
+ ) {
1930
+ <span class="cstat-no" title="statement not covered" > try {</span>
1931
+ // Part 1: Privilege Checking:
1932
+ // Call loginUser.checkPrivileges() method by passing:
1933
+ // SystemCode: Retrieve from app config.
1934
+ // PrivilegeCode: 'USER_SYSTEM_ACCESS_CREATE'.
1935
+ const systemCode =
1936
+ <span class="cstat-no" title="statement not covered" > ApplicationConfig.getComponentConfigValue('system-code');</span>
1937
+ const privilegeCode = <span class="cstat-no" title="statement not covered" >'USER_SYSTEM_ACCESS_CREATE';</span>
1938
+ const isPrivileged = <span class="cstat-no" title="statement not covered" >await loginUser.checkPrivileges(</span>
1939
+ systemCode,
1940
+ privilegeCode,
1941
+ );
1942
+ <span class="cstat-no" title="statement not covered" > if (!isPrivileged) {</span>
1943
+ <span class="cstat-no" title="statement not covered" > throw new ClassError(</span>
1944
+ 'UserSystemAccess',
1945
+ 'UserSystemAccessErrMsg01',
1946
+ 'You do not have permission to access this resource.',
1947
+ );
1948
+ }
1949
+ // Part 2: Validation for Existing Access
1950
+ // Use the UserSystemAccess.findAll() method to check if the user already has access to the specified system:
1951
+ // Pass the following parameters:
1952
+ // loginUser
1953
+ // dbTransaction
1954
+ // whereOption: set to UserId = UserId and SystemCode = SystemCode.
1955
+ // If a record is found, throw an error indicating that access for this user and system already exists.
1956
+ &nbsp;
1957
+ const isExist = <span class="cstat-no" title="statement not covered" >await UserSystemAccess._Repository.findAll({</span>
1958
+ where: { [Op.and]: [{ UserId: UserId }, { SystemCode: SystemCode }] },
1959
+ transaction: dbTransaction,
1960
+ });
1961
+ &nbsp;
1962
+ <span class="cstat-no" title="statement not covered" > if (isExist?.length &gt; 0) {</span>
1963
+ <span class="cstat-no" title="statement not covered" > throw new ClassError(</span>
1964
+ 'UserSystemAccess',
1965
+ 'UserSystemAccessErrMsg01',
1966
+ 'User already have access to this system',
1967
+ );
1968
+ }
1969
+ &nbsp;
1970
+ // Part 3: Insert System Access Record
1971
+ // After successful validation, create a new instance of UserSystemAccess with the following fields:
1972
+ // - UserId: set to the UserId parameter.
1973
+ // - SystemCode: set to the SystemCode parameter.
1974
+ // - Status: set to the Status parameter.
1975
+ // - CreatedById: set to loginUser.UserId.
1976
+ // - CreatedAt: set to the current timestamp.
1977
+ // - UpdatedById: set to loginUser.UserId.
1978
+ // - UpdatedAt: set to the current timestamp (same as CreatedAt).
1979
+ // Save the new UserSystemAccess instance in the database within the dbTransaction.
1980
+ &nbsp;
1981
+ const newUserSystemAccess = <span class="cstat-no" title="statement not covered" >new UserSystemAccess();</span>
1982
+ <span class="cstat-no" title="statement not covered" > newUserSystemAccess.UserId = parseInt(UserId);</span>
1983
+ <span class="cstat-no" title="statement not covered" > newUserSystemAccess.SystemCode = SystemCode;</span>
1984
+ <span class="cstat-no" title="statement not covered" > newUserSystemAccess.Status = Status;</span>
1985
+ <span class="cstat-no" title="statement not covered" > newUserSystemAccess._CreatedById = loginUser.UserId;</span>
1986
+ <span class="cstat-no" title="statement not covered" > newUserSystemAccess._CreatedAt = new Date();</span>
1987
+ <span class="cstat-no" title="statement not covered" > newUserSystemAccess._UpdatedById = loginUser.UserId;</span>
1988
+ <span class="cstat-no" title="statement not covered" > newUserSystemAccess._UpdatedAt = new Date();</span>
1989
+ &nbsp;
1990
+ const payload = <span class="cstat-no" title="statement not covered" >{</span>
1991
+ UserId: newUserSystemAccess.UserId,
1992
+ SystemCode: newUserSystemAccess.SystemCode,
1993
+ Status: newUserSystemAccess.Status,
1994
+ CreatedById: newUserSystemAccess.CreatedById,
1995
+ CreatedAt: newUserSystemAccess.CreatedAt,
1996
+ UpdatedById: newUserSystemAccess.UpdatedById,
1997
+ UpdatedAt: newUserSystemAccess.UpdatedAt,
1998
+ };
1999
+ &nbsp;
2000
+ const systemAccess = <span class="cstat-no" title="statement not covered" >await UserSystemAccess._Repository.create(payload, {</span>
2001
+ transaction: dbTransaction,
2002
+ });
2003
+ &nbsp;
2004
+ // Part 4: Record Activity History
2005
+ // Initialize an empty object ({}) as EntityValueBefore.
2006
+ // Set EntityValueAfter to the stringified version of the newly created UserSystemAccess instance.
2007
+ // Create a new activity log entry:
2008
+ // ActivityId: auto-generated by calling activity.createId().
2009
+ // Action: set to ActionEnum.Create.
2010
+ // Description: set to "Create User System Access".
2011
+ // EntityType: set to UserSystemAccess.
2012
+ // EntityId: set to the newly created UserSystemAccess.UserSystemAccessId.
2013
+ // EntityValueBefore: set to {} (empty).
2014
+ // EntityValueAfter: set to the stringified version of the new access record.
2015
+ // Call the activity.create() method, passing:
2016
+ // dbTransaction
2017
+ // userId: set to loginUser.UserId.
2018
+ &nbsp;
2019
+ const entityValueBefore = <span class="cstat-no" title="statement not covered" >{};</span>
2020
+ &nbsp;
2021
+ //Instantiate new activity
2022
+ const activity = <span class="cstat-no" title="statement not covered" >new Activity();</span>
2023
+ <span class="cstat-no" title="statement not covered" > activity.ActivityId = activity.createId();</span>
2024
+ <span class="cstat-no" title="statement not covered" > activity.Action = ActionEnum.CREATE;</span>
2025
+ <span class="cstat-no" title="statement not covered" > activity.Description = 'Create User System Access';</span>
2026
+ <span class="cstat-no" title="statement not covered" > activity.EntityType = 'UserSystemAccess';</span>
2027
+ <span class="cstat-no" title="statement not covered" > activity.EntityId = systemAccess.UserSystemAccessId?.toString();</span>
2028
+ <span class="cstat-no" title="statement not covered" > activity.EntityValueBefore = JSON.stringify(entityValueBefore);</span>
2029
+ <span class="cstat-no" title="statement not covered" > activity.EntityValueAfter = JSON.stringify(payload);</span>
2030
+ &nbsp;
2031
+ //Call Activity.create method
2032
+ <span class="cstat-no" title="statement not covered" > await activity.create(loginUser.ObjectId, dbTransaction);</span>
2033
+ &nbsp;
2034
+ // Part 5: Return Newly Created Record
2035
+ // Return the newly created UserSystemAccess instance with all relevant fields, including UserSystemAccessId, SystemCode, Status, CreatedAt, and CreatedById.
2036
+ <span class="cstat-no" title="statement not covered" > newUserSystemAccess.UserSystemAccessId = systemAccess.UserSystemAccessId;</span>
2037
+ <span class="cstat-no" title="statement not covered" > return newUserSystemAccess;</span>
2038
+ } catch (error) {
2039
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
2040
+ }
2041
+ }
2042
+ &nbsp;
2043
+ public async <span class="fstat-no" title="function not covered" >update(</span>
2044
+ loginUser: User, //The user object representing the currently logged-in user.
2045
+ dbTransaction: any, //The database transaction instance for managing the transaction scope.
2046
+ Status: string, //The new access status (Active/Inactive) for the user system access.
2047
+ ) {
2048
+ <span class="cstat-no" title="statement not covered" > try {</span>
2049
+ // Part 1: Update Access
2050
+ // Call the UserSystemAccess._Repo.update() method to perform the update operation, passing:
2051
+ // - Status: The new access status.
2052
+ // - UpdatedById: loginUser.UserId (to indicate who updated the record).
2053
+ // - UpdatedAt: Set to the current date and time.
2054
+ // - dbTransaction: The database transaction instance.
2055
+ &nbsp;
2056
+ const entityValueBefore = <span class="cstat-no" title="statement not covered" >{</span>
2057
+ UserId: this.UserId,
2058
+ SystemCode: this.SystemCode,
2059
+ Status: this.Status,
2060
+ CreatedById: this.CreatedById,
2061
+ CreatedAt: this.CreatedAt,
2062
+ UpdatedById: this.UpdatedById,
2063
+ UpdatedAt: this.UpdatedAt,
2064
+ };
2065
+ <span class="cstat-no" title="statement not covered" > await UserSystemAccess._Repository.update(</span>
2066
+ {
2067
+ Status: Status,
2068
+ UpdatedById: loginUser.UserId,
2069
+ UpdatedAt: new Date(),
2070
+ },
2071
+ {
2072
+ where: {
2073
+ UserSystemAccessId: this.UserSystemAccessId,
2074
+ },
2075
+ transaction: dbTransaction,
2076
+ },
2077
+ );
2078
+ &nbsp;
2079
+ const entityValueAfter = <span class="cstat-no" title="statement not covered" >{</span>
2080
+ UserId: this.UserId,
2081
+ SystemCode: this.SystemCode,
2082
+ Status: Status,
2083
+ CreatedById: this.CreatedById,
2084
+ CreatedAt: this.CreatedAt,
2085
+ UpdatedById: loginUser.UserId,
2086
+ UpdatedAt: new Date(),
2087
+ };
2088
+ &nbsp;
2089
+ // Part 2: Record Activity History
2090
+ // Initialize a variable entityValueBefore to store the current state of the user system access record before the update.
2091
+ // Create an instance of the Activity class and set the following properties:
2092
+ // - ActivityId: Call activity.createId().
2093
+ // - Action: Set to ActionEnum.Update.
2094
+ // - Description: Set to Update User System Access.
2095
+ // - EntityType: Set to UserSystemAccess.
2096
+ // - EntityId: Use the ID of the updated user system access record.
2097
+ // - EntityValueBefore: Stringify entityValueBefore to capture the state before the update.
2098
+ // - EntityValueAfter: Stringify the updated user system access record to capture the new state after the update.
2099
+ // Call the activity create method with the following parameters:
2100
+ // - dbTransaction
2101
+ // - userId: loginUser.UserId
2102
+ const activity = <span class="cstat-no" title="statement not covered" >new Activity();</span>
2103
+ <span class="cstat-no" title="statement not covered" > activity.ActivityId = activity.createId();</span>
2104
+ <span class="cstat-no" title="statement not covered" > activity.Action = ActionEnum.UPDATE;</span>
2105
+ <span class="cstat-no" title="statement not covered" > activity.Description = 'Update User System Access';</span>
2106
+ <span class="cstat-no" title="statement not covered" > activity.EntityType = 'UserSystemAccess';</span>
2107
+ <span class="cstat-no" title="statement not covered" > activity.EntityId = this.UserSystemAccessId + '';</span>
2108
+ <span class="cstat-no" title="statement not covered" > activity.EntityValueBefore = JSON.stringify(entityValueBefore);</span>
2109
+ <span class="cstat-no" title="statement not covered" > activity.EntityValueAfter = JSON.stringify(entityValueAfter);</span>
2110
+ <span class="cstat-no" title="statement not covered" > await activity.create(loginUser.ObjectId, dbTransaction);</span>
2111
+ &nbsp;
2112
+ // Part 3: Return Updated Record
2113
+ // Retrieve the updated user system access record from the database or return the updated instance as needed.
2114
+ &nbsp;
2115
+ // Part 5: Return Newly Created Record
2116
+ // Return the newly created UserSystemAccess instance with all relevant fields, including UserSystemAccessId, SystemCode, Status, CreatedAt, and CreatedById.
2117
+ <span class="cstat-no" title="statement not covered" > return entityValueAfter;</span>
2118
+ } catch (error) {
2119
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
2120
+ }
2121
+ }
2122
+ &nbsp;
2123
+ public <span class="fstat-no" title="function not covered" >static </span>async remove(
2124
+ loginUser: User, //The currently logged-in user initiating the request.
2125
+ dbTransaction: any, //The active database transaction to ensure consistency during the query.
2126
+ UserSystemAccessId: number, //The unique identifier of the User System Access record to be deleted.
2127
+ ) {
2128
+ <span class="cstat-no" title="statement not covered" > try {</span>
2129
+ // Part 1: Privilege Checking
2130
+ // Call loginUser.checkPrivileges() method by passing:
2131
+ // - SystemCode: Retrieve from app config.
2132
+ // - PrivilegeCode: 'USER_SYSTEM_ACCESS_REMOVE'.
2133
+ // If the user does not have the required privileges, throw an appropriate exception.
2134
+ const systemCode =
2135
+ <span class="cstat-no" title="statement not covered" > ApplicationConfig.getComponentConfigValue('system-code');</span>
2136
+ const privilegeCode = <span class="cstat-no" title="statement not covered" >'USER_SYSTEM_ACCESS_REMOVE';</span>
2137
+ const isPrivileged = <span class="cstat-no" title="statement not covered" >await loginUser.checkPrivileges(</span>
2138
+ systemCode,
2139
+ privilegeCode,
2140
+ );
2141
+ <span class="cstat-no" title="statement not covered" > if (!isPrivileged) {</span>
2142
+ <span class="cstat-no" title="statement not covered" > throw new ClassError(</span>
2143
+ 'UserSystemAccess',
2144
+ 'UserSystemAccessErrMsg01',
2145
+ 'You do not have permission to access this resource.',
2146
+ );
2147
+ }
2148
+ &nbsp;
2149
+ // Part 2: Retrieve Record
2150
+ // Use the UserSystemAccessRepo.findById(UserSystemAccessId) method to retrieve the record.
2151
+ // If the record does not exist, throw an exception indicating the record was not found.
2152
+ &nbsp;
2153
+ const userSystemAccess = <span class="cstat-no" title="statement not covered" >await UserSystemAccess._Repository.findOne({</span>
2154
+ where: {
2155
+ UserSystemAccessId: UserSystemAccessId,
2156
+ },
2157
+ transaction: dbTransaction,
2158
+ });
2159
+ &nbsp;
2160
+ <span class="cstat-no" title="statement not covered" > if (!userSystemAccess) {</span>
2161
+ <span class="cstat-no" title="statement not covered" > throw new ClassError(</span>
2162
+ 'UserSystemAccess',
2163
+ 'UserSystemAccessErrMsg02',
2164
+ 'User System Access not Found',
2165
+ );
2166
+ }
2167
+ &nbsp;
2168
+ // Part 3: Delete Record
2169
+ // Call the UserSystemAccess._Repo.delete() method, passing:
2170
+ // - UserSystemAccessId
2171
+ // dbTransaction to permanently delete the record from the database.
2172
+ <span class="cstat-no" title="statement not covered" > await UserSystemAccess._Repository.delete(</span>
2173
+ UserSystemAccessId,
2174
+ dbTransaction,
2175
+ );
2176
+ &nbsp;
2177
+ const entityValueBefore = <span class="cstat-no" title="statement not covered" >{</span>
2178
+ UserId: userSystemAccess.UserId,
2179
+ SystemCode: userSystemAccess.SystemCode,
2180
+ Status: userSystemAccess.Status,
2181
+ CreatedById: userSystemAccess.CreatedById,
2182
+ CreatedAt: userSystemAccess.CreatedAt,
2183
+ UpdatedById: userSystemAccess.UpdatedById,
2184
+ UpdatedAt: userSystemAccess.UpdatedAt,
2185
+ };
2186
+ &nbsp;
2187
+ // Part 4: Record Activity History
2188
+ // Instantiate a new activity from the Activity class, and set:
2189
+ // - ActivityId: activity.createId()
2190
+ // - Action: ActionEnum.Delete
2191
+ // - Description: Delete User System Access
2192
+ // - EntityType: UserSystemAccess
2193
+ // - EntityId: UserSystemAccessId
2194
+ // - EntityValueBefore: Stringified representation of the record before deletion.
2195
+ // - EntityValueAfter: null.
2196
+ // Call the activity.create() method by passing:
2197
+ // - dbTransaction
2198
+ // - userId: loginUser.UserId.
2199
+ &nbsp;
2200
+ //Instantiate new activity
2201
+ const activity = <span class="cstat-no" title="statement not covered" >new Activity();</span>
2202
+ <span class="cstat-no" title="statement not covered" > activity.ActivityId = activity.createId();</span>
2203
+ <span class="cstat-no" title="statement not covered" > activity.Action = ActionEnum.DELETE;</span>
2204
+ <span class="cstat-no" title="statement not covered" > activity.Description = 'Delete User System Access';</span>
2205
+ <span class="cstat-no" title="statement not covered" > activity.EntityType = 'UserSystemAccess';</span>
2206
+ <span class="cstat-no" title="statement not covered" > activity.EntityId = UserSystemAccessId?.toString();</span>
2207
+ <span class="cstat-no" title="statement not covered" > activity.EntityValueBefore = JSON.stringify(entityValueBefore);</span>
2208
+ <span class="cstat-no" title="statement not covered" > activity.EntityValueAfter = JSON.stringify({});</span>
2209
+ &nbsp;
2210
+ //Call Activity.create method
2211
+ <span class="cstat-no" title="statement not covered" > await activity.create(loginUser.ObjectId, dbTransaction);</span>
2212
+ } catch (error) {
2213
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
2214
+ }
2215
+ }
2216
+ }
2217
+ &nbsp;</pre></td></tr></table></pre>
2218
+
2219
+ <div class='push'></div><!-- for sticky footer -->
2220
+ </div><!-- /wrapper -->
2221
+ <div class='footer quiet pad2 space-top1 center small'>
2222
+ Code coverage generated by
2223
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2224
+ at 2025-09-18T18:22:10.462Z
2225
+ </div>
2226
+ <script src="../../prettify.js"></script>
2227
+ <script>
2228
+ window.onload = function () {
2229
+ prettyPrint();
2230
+ };
2231
+ </script>
2232
+ <script src="../../sorter.js"></script>
2233
+ <script src="../../block-navigation.js"></script>
2234
+ </body>
2235
+ </html>
2236
+