@flourish/sdk 5.2.2 → 5.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.c8rc +4 -0
- package/RELEASE_NOTES.md +12 -0
- package/common/embed/credit.js +26 -11
- package/common/embed/embedding.js +1 -1
- package/common/embed/localizations.d.ts +46 -2
- package/common/embed/localizations.js +48 -37
- package/common/package.json +2 -2
- package/common/tsconfig.sdk.tsbuildinfo +1 -1
- package/common/utils/data.d.ts +2 -2
- package/common/utils/data.js +2 -1
- package/common/utils/types.d.ts +1 -2
- package/coverage-sdk/lcov-report/base.css +224 -0
- package/coverage-sdk/lcov-report/block-navigation.js +87 -0
- package/coverage-sdk/lcov-report/common/utils/columns.js.html +646 -0
- package/coverage-sdk/lcov-report/common/utils/index.html +131 -0
- package/coverage-sdk/lcov-report/common/utils/state.js.html +559 -0
- package/coverage-sdk/lcov-report/favicon.png +0 -0
- package/coverage-sdk/lcov-report/index.html +146 -0
- package/coverage-sdk/lcov-report/lib/common.js.html +181 -0
- package/coverage-sdk/lcov-report/lib/index.html +161 -0
- package/coverage-sdk/lcov-report/lib/log.js.html +178 -0
- package/coverage-sdk/lcov-report/lib/sdk.js.html +2008 -0
- package/coverage-sdk/lcov-report/lib/validate_config.js.html +1459 -0
- package/coverage-sdk/lcov-report/prettify.css +1 -0
- package/coverage-sdk/lcov-report/prettify.js +2 -0
- package/coverage-sdk/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage-sdk/lcov-report/sorter.js +210 -0
- package/coverage-sdk/lcov-report/test/lib/index.html +131 -0
- package/coverage-sdk/lcov-report/test/lib/sdk.js.html +532 -0
- package/coverage-sdk/lcov-report/test/lib/validate_config.js.html +3307 -0
- package/coverage-sdk/lcov.info +3556 -0
- package/coverage-sdk/tmp/coverage-36833-1757890375186-0.json +1 -0
- package/coverage-sdk/tmp/coverage-36834-1757890374890-0.json +1 -0
- package/lib/cmd/publish.js +1 -0
- package/lib/validate_config.js +31 -0
- package/package.json +7 -6
- package/server/columns.js +150 -0
- package/server/comms_js.js +13 -0
- package/server/data.js +132 -0
- package/server/json.js +40 -0
- package/server/views/index.html +13 -29
- package/site/embedded.js +2 -2
- package/site/images/embed_flourish_in_canva.png +0 -0
- package/site/images/flourish_app_icon.png +0 -0
- package/site/images/icon-arrow-down.svg +3 -0
- package/site/images/icon-arrow-left.svg +3 -0
- package/site/images/icon-close.svg +3 -0
- package/site/images/icon-login.svg +4 -0
- package/site/images/icon-sso.svg +4 -0
- package/site/images/share_image.jpg +0 -0
- package/site/images/upsell-presenter.jpg +0 -0
- package/site/images/upsell-publisher.jpg +0 -0
- package/site/script.js +3 -3
- package/site/sdk.css +1 -1
- package/test/lib/validate_config.js +126 -0
|
@@ -0,0 +1,2008 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for lib/sdk.js</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../index.html">All files</a> / <a href="index.html">lib</a> sdk.js</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">23.71% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>152/641</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">71.42% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>25/35</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">26.92% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>7/26</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">23.71% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>152/641</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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
708
|
+
<span class="cline-any cline-yes">1x</span>
|
|
709
|
+
<span class="cline-any cline-yes">1x</span>
|
|
710
|
+
<span class="cline-any cline-yes">1x</span>
|
|
711
|
+
<span class="cline-any cline-yes">1x</span>
|
|
712
|
+
<span class="cline-any cline-yes">1x</span>
|
|
713
|
+
<span class="cline-any cline-yes">1x</span>
|
|
714
|
+
<span class="cline-any cline-yes">1x</span>
|
|
715
|
+
<span class="cline-any cline-yes">1x</span>
|
|
716
|
+
<span class="cline-any cline-yes">1x</span>
|
|
717
|
+
<span class="cline-any cline-yes">1x</span>
|
|
718
|
+
<span class="cline-any cline-yes">1x</span>
|
|
719
|
+
<span class="cline-any cline-yes">1x</span>
|
|
720
|
+
<span class="cline-any cline-yes">1x</span>
|
|
721
|
+
<span class="cline-any cline-yes">1x</span>
|
|
722
|
+
<span class="cline-any cline-yes">1x</span>
|
|
723
|
+
<span class="cline-any cline-yes">1x</span>
|
|
724
|
+
<span class="cline-any cline-yes">1x</span>
|
|
725
|
+
<span class="cline-any cline-yes">1x</span>
|
|
726
|
+
<span class="cline-any cline-yes">1x</span>
|
|
727
|
+
<span class="cline-any cline-yes">1x</span>
|
|
728
|
+
<span class="cline-any cline-yes">1x</span>
|
|
729
|
+
<span class="cline-any cline-yes">1x</span>
|
|
730
|
+
<span class="cline-any cline-no"> </span>
|
|
731
|
+
<span class="cline-any cline-no"> </span>
|
|
732
|
+
<span class="cline-any cline-no"> </span>
|
|
733
|
+
<span class="cline-any cline-no"> </span>
|
|
734
|
+
<span class="cline-any cline-no"> </span>
|
|
735
|
+
<span class="cline-any cline-no"> </span>
|
|
736
|
+
<span class="cline-any cline-no"> </span>
|
|
737
|
+
<span class="cline-any cline-no"> </span>
|
|
738
|
+
<span class="cline-any cline-no"> </span>
|
|
739
|
+
<span class="cline-any cline-no"> </span>
|
|
740
|
+
<span class="cline-any cline-no"> </span>
|
|
741
|
+
<span class="cline-any cline-no"> </span>
|
|
742
|
+
<span class="cline-any cline-yes">1x</span>
|
|
743
|
+
<span class="cline-any cline-no"> </span>
|
|
744
|
+
<span class="cline-any cline-no"> </span>
|
|
745
|
+
<span class="cline-any cline-no"> </span>
|
|
746
|
+
<span class="cline-any cline-no"> </span>
|
|
747
|
+
<span class="cline-any cline-no"> </span>
|
|
748
|
+
<span class="cline-any cline-no"> </span>
|
|
749
|
+
<span class="cline-any cline-no"> </span>
|
|
750
|
+
<span class="cline-any cline-no"> </span>
|
|
751
|
+
<span class="cline-any cline-no"> </span>
|
|
752
|
+
<span class="cline-any cline-no"> </span>
|
|
753
|
+
<span class="cline-any cline-no"> </span>
|
|
754
|
+
<span class="cline-any cline-no"> </span>
|
|
755
|
+
<span class="cline-any cline-no"> </span>
|
|
756
|
+
<span class="cline-any cline-no"> </span>
|
|
757
|
+
<span class="cline-any cline-no"> </span>
|
|
758
|
+
<span class="cline-any cline-no"> </span>
|
|
759
|
+
<span class="cline-any cline-no"> </span>
|
|
760
|
+
<span class="cline-any cline-no"> </span>
|
|
761
|
+
<span class="cline-any cline-no"> </span>
|
|
762
|
+
<span class="cline-any cline-no"> </span>
|
|
763
|
+
<span class="cline-any cline-no"> </span>
|
|
764
|
+
<span class="cline-any cline-no"> </span>
|
|
765
|
+
<span class="cline-any cline-no"> </span>
|
|
766
|
+
<span class="cline-any cline-no"> </span>
|
|
767
|
+
<span class="cline-any cline-no"> </span>
|
|
768
|
+
<span class="cline-any cline-no"> </span>
|
|
769
|
+
<span class="cline-any cline-yes">1x</span>
|
|
770
|
+
<span class="cline-any cline-no"> </span>
|
|
771
|
+
<span class="cline-any cline-no"> </span>
|
|
772
|
+
<span class="cline-any cline-no"> </span>
|
|
773
|
+
<span class="cline-any cline-no"> </span>
|
|
774
|
+
<span class="cline-any cline-no"> </span>
|
|
775
|
+
<span class="cline-any cline-no"> </span>
|
|
776
|
+
<span class="cline-any cline-no"> </span>
|
|
777
|
+
<span class="cline-any cline-no"> </span>
|
|
778
|
+
<span class="cline-any cline-no"> </span>
|
|
779
|
+
<span class="cline-any cline-no"> </span>
|
|
780
|
+
<span class="cline-any cline-no"> </span>
|
|
781
|
+
<span class="cline-any cline-no"> </span>
|
|
782
|
+
<span class="cline-any cline-no"> </span>
|
|
783
|
+
<span class="cline-any cline-no"> </span>
|
|
784
|
+
<span class="cline-any cline-no"> </span>
|
|
785
|
+
<span class="cline-any cline-no"> </span>
|
|
786
|
+
<span class="cline-any cline-no"> </span>
|
|
787
|
+
<span class="cline-any cline-no"> </span>
|
|
788
|
+
<span class="cline-any cline-no"> </span>
|
|
789
|
+
<span class="cline-any cline-no"> </span>
|
|
790
|
+
<span class="cline-any cline-no"> </span>
|
|
791
|
+
<span class="cline-any cline-no"> </span>
|
|
792
|
+
<span class="cline-any cline-no"> </span>
|
|
793
|
+
<span class="cline-any cline-no"> </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-yes">1x</span>
|
|
798
|
+
<span class="cline-any cline-yes">1x</span>
|
|
799
|
+
<span class="cline-any cline-yes">1x</span>
|
|
800
|
+
<span class="cline-any cline-no"> </span>
|
|
801
|
+
<span class="cline-any cline-no"> </span>
|
|
802
|
+
<span class="cline-any cline-no"> </span>
|
|
803
|
+
<span class="cline-any cline-no"> </span>
|
|
804
|
+
<span class="cline-any cline-no"> </span>
|
|
805
|
+
<span class="cline-any cline-no"> </span>
|
|
806
|
+
<span class="cline-any cline-no"> </span>
|
|
807
|
+
<span class="cline-any cline-no"> </span>
|
|
808
|
+
<span class="cline-any cline-yes">1x</span>
|
|
809
|
+
<span class="cline-any cline-yes">1x</span>
|
|
810
|
+
<span class="cline-any cline-yes">1x</span>
|
|
811
|
+
<span class="cline-any cline-yes">1x</span>
|
|
812
|
+
<span class="cline-any cline-yes">1x</span>
|
|
813
|
+
<span class="cline-any cline-yes">1x</span>
|
|
814
|
+
<span class="cline-any cline-no"> </span>
|
|
815
|
+
<span class="cline-any cline-no"> </span>
|
|
816
|
+
<span class="cline-any cline-no"> </span>
|
|
817
|
+
<span class="cline-any cline-no"> </span>
|
|
818
|
+
<span class="cline-any cline-no"> </span>
|
|
819
|
+
<span class="cline-any cline-no"> </span>
|
|
820
|
+
<span class="cline-any cline-no"> </span>
|
|
821
|
+
<span class="cline-any cline-no"> </span>
|
|
822
|
+
<span class="cline-any cline-no"> </span>
|
|
823
|
+
<span class="cline-any cline-no"> </span>
|
|
824
|
+
<span class="cline-any cline-no"> </span>
|
|
825
|
+
<span class="cline-any cline-no"> </span>
|
|
826
|
+
<span class="cline-any cline-no"> </span>
|
|
827
|
+
<span class="cline-any cline-no"> </span>
|
|
828
|
+
<span class="cline-any cline-no"> </span>
|
|
829
|
+
<span class="cline-any cline-no"> </span>
|
|
830
|
+
<span class="cline-any cline-no"> </span>
|
|
831
|
+
<span class="cline-any cline-no"> </span>
|
|
832
|
+
<span class="cline-any cline-no"> </span>
|
|
833
|
+
<span class="cline-any cline-no"> </span>
|
|
834
|
+
<span class="cline-any cline-no"> </span>
|
|
835
|
+
<span class="cline-any cline-no"> </span>
|
|
836
|
+
<span class="cline-any cline-no"> </span>
|
|
837
|
+
<span class="cline-any cline-no"> </span>
|
|
838
|
+
<span class="cline-any cline-no"> </span>
|
|
839
|
+
<span class="cline-any cline-no"> </span>
|
|
840
|
+
<span class="cline-any cline-no"> </span>
|
|
841
|
+
<span class="cline-any cline-no"> </span>
|
|
842
|
+
<span class="cline-any cline-no"> </span>
|
|
843
|
+
<span class="cline-any cline-no"> </span>
|
|
844
|
+
<span class="cline-any cline-no"> </span>
|
|
845
|
+
<span class="cline-any cline-no"> </span>
|
|
846
|
+
<span class="cline-any cline-no"> </span>
|
|
847
|
+
<span class="cline-any cline-no"> </span>
|
|
848
|
+
<span class="cline-any cline-no"> </span>
|
|
849
|
+
<span class="cline-any cline-no"> </span>
|
|
850
|
+
<span class="cline-any cline-no"> </span>
|
|
851
|
+
<span class="cline-any cline-no"> </span>
|
|
852
|
+
<span class="cline-any cline-no"> </span>
|
|
853
|
+
<span class="cline-any cline-no"> </span>
|
|
854
|
+
<span class="cline-any cline-no"> </span>
|
|
855
|
+
<span class="cline-any cline-no"> </span>
|
|
856
|
+
<span class="cline-any cline-no"> </span>
|
|
857
|
+
<span class="cline-any cline-no"> </span>
|
|
858
|
+
<span class="cline-any cline-no"> </span>
|
|
859
|
+
<span class="cline-any cline-no"> </span>
|
|
860
|
+
<span class="cline-any cline-no"> </span>
|
|
861
|
+
<span class="cline-any cline-no"> </span>
|
|
862
|
+
<span class="cline-any cline-no"> </span>
|
|
863
|
+
<span class="cline-any cline-no"> </span>
|
|
864
|
+
<span class="cline-any cline-no"> </span>
|
|
865
|
+
<span class="cline-any cline-no"> </span>
|
|
866
|
+
<span class="cline-any cline-no"> </span>
|
|
867
|
+
<span class="cline-any cline-no"> </span>
|
|
868
|
+
<span class="cline-any cline-no"> </span>
|
|
869
|
+
<span class="cline-any cline-no"> </span>
|
|
870
|
+
<span class="cline-any cline-no"> </span>
|
|
871
|
+
<span class="cline-any cline-no"> </span>
|
|
872
|
+
<span class="cline-any cline-no"> </span>
|
|
873
|
+
<span class="cline-any cline-no"> </span>
|
|
874
|
+
<span class="cline-any cline-no"> </span>
|
|
875
|
+
<span class="cline-any cline-no"> </span>
|
|
876
|
+
<span class="cline-any cline-no"> </span>
|
|
877
|
+
<span class="cline-any cline-no"> </span>
|
|
878
|
+
<span class="cline-any cline-no"> </span>
|
|
879
|
+
<span class="cline-any cline-no"> </span>
|
|
880
|
+
<span class="cline-any cline-no"> </span>
|
|
881
|
+
<span class="cline-any cline-no"> </span>
|
|
882
|
+
<span class="cline-any cline-no"> </span>
|
|
883
|
+
<span class="cline-any cline-no"> </span>
|
|
884
|
+
<span class="cline-any cline-no"> </span>
|
|
885
|
+
<span class="cline-any cline-no"> </span>
|
|
886
|
+
<span class="cline-any cline-no"> </span>
|
|
887
|
+
<span class="cline-any cline-no"> </span>
|
|
888
|
+
<span class="cline-any cline-no"> </span>
|
|
889
|
+
<span class="cline-any cline-no"> </span>
|
|
890
|
+
<span class="cline-any cline-no"> </span>
|
|
891
|
+
<span class="cline-any cline-no"> </span>
|
|
892
|
+
<span class="cline-any cline-no"> </span>
|
|
893
|
+
<span class="cline-any cline-no"> </span>
|
|
894
|
+
<span class="cline-any cline-no"> </span>
|
|
895
|
+
<span class="cline-any cline-no"> </span>
|
|
896
|
+
<span class="cline-any cline-no"> </span>
|
|
897
|
+
<span class="cline-any cline-no"> </span>
|
|
898
|
+
<span class="cline-any cline-no"> </span>
|
|
899
|
+
<span class="cline-any cline-no"> </span>
|
|
900
|
+
<span class="cline-any cline-no"> </span>
|
|
901
|
+
<span class="cline-any cline-no"> </span>
|
|
902
|
+
<span class="cline-any cline-no"> </span>
|
|
903
|
+
<span class="cline-any cline-no"> </span>
|
|
904
|
+
<span class="cline-any cline-no"> </span>
|
|
905
|
+
<span class="cline-any cline-no"> </span>
|
|
906
|
+
<span class="cline-any cline-no"> </span>
|
|
907
|
+
<span class="cline-any cline-no"> </span>
|
|
908
|
+
<span class="cline-any cline-no"> </span>
|
|
909
|
+
<span class="cline-any cline-yes">1x</span>
|
|
910
|
+
<span class="cline-any cline-no"> </span>
|
|
911
|
+
<span class="cline-any cline-no"> </span>
|
|
912
|
+
<span class="cline-any cline-no"> </span>
|
|
913
|
+
<span class="cline-any cline-no"> </span>
|
|
914
|
+
<span class="cline-any cline-no"> </span>
|
|
915
|
+
<span class="cline-any cline-no"> </span>
|
|
916
|
+
<span class="cline-any cline-no"> </span>
|
|
917
|
+
<span class="cline-any cline-no"> </span>
|
|
918
|
+
<span class="cline-any cline-no"> </span>
|
|
919
|
+
<span class="cline-any cline-no"> </span>
|
|
920
|
+
<span class="cline-any cline-no"> </span>
|
|
921
|
+
<span class="cline-any cline-no"> </span>
|
|
922
|
+
<span class="cline-any cline-no"> </span>
|
|
923
|
+
<span class="cline-any cline-no"> </span>
|
|
924
|
+
<span class="cline-any cline-no"> </span>
|
|
925
|
+
<span class="cline-any cline-no"> </span>
|
|
926
|
+
<span class="cline-any cline-no"> </span>
|
|
927
|
+
<span class="cline-any cline-no"> </span>
|
|
928
|
+
<span class="cline-any cline-no"> </span>
|
|
929
|
+
<span class="cline-any cline-no"> </span>
|
|
930
|
+
<span class="cline-any cline-no"> </span>
|
|
931
|
+
<span class="cline-any cline-no"> </span>
|
|
932
|
+
<span class="cline-any cline-no"> </span>
|
|
933
|
+
<span class="cline-any cline-no"> </span>
|
|
934
|
+
<span class="cline-any cline-no"> </span>
|
|
935
|
+
<span class="cline-any cline-no"> </span>
|
|
936
|
+
<span class="cline-any cline-no"> </span>
|
|
937
|
+
<span class="cline-any cline-yes">1x</span>
|
|
938
|
+
<span class="cline-any cline-no"> </span>
|
|
939
|
+
<span class="cline-any cline-no"> </span>
|
|
940
|
+
<span class="cline-any cline-no"> </span>
|
|
941
|
+
<span class="cline-any cline-no"> </span>
|
|
942
|
+
<span class="cline-any cline-no"> </span>
|
|
943
|
+
<span class="cline-any cline-no"> </span>
|
|
944
|
+
<span class="cline-any cline-no"> </span>
|
|
945
|
+
<span class="cline-any cline-no"> </span>
|
|
946
|
+
<span class="cline-any cline-no"> </span>
|
|
947
|
+
<span class="cline-any cline-no"> </span>
|
|
948
|
+
<span class="cline-any cline-no"> </span>
|
|
949
|
+
<span class="cline-any cline-no"> </span>
|
|
950
|
+
<span class="cline-any cline-no"> </span>
|
|
951
|
+
<span class="cline-any cline-yes">1x</span>
|
|
952
|
+
<span class="cline-any cline-yes">17x</span>
|
|
953
|
+
<span class="cline-any cline-yes">17x</span>
|
|
954
|
+
<span class="cline-any cline-yes">17x</span>
|
|
955
|
+
<span class="cline-any cline-yes">17x</span>
|
|
956
|
+
<span class="cline-any cline-yes">17x</span>
|
|
957
|
+
<span class="cline-any cline-yes">17x</span>
|
|
958
|
+
<span class="cline-any cline-yes">17x</span>
|
|
959
|
+
<span class="cline-any cline-yes">2x</span>
|
|
960
|
+
<span class="cline-any cline-yes">2x</span>
|
|
961
|
+
<span class="cline-any cline-yes">17x</span>
|
|
962
|
+
<span class="cline-any cline-yes">3x</span>
|
|
963
|
+
<span class="cline-any cline-yes">3x</span>
|
|
964
|
+
<span class="cline-any cline-yes">17x</span>
|
|
965
|
+
<span class="cline-any cline-yes">1x</span>
|
|
966
|
+
<span class="cline-any cline-yes">1x</span>
|
|
967
|
+
<span class="cline-any cline-yes">17x</span>
|
|
968
|
+
<span class="cline-any cline-yes">1x</span>
|
|
969
|
+
<span class="cline-any cline-yes">1x</span>
|
|
970
|
+
<span class="cline-any cline-yes">17x</span>
|
|
971
|
+
<span class="cline-any cline-yes">17x</span>
|
|
972
|
+
<span class="cline-any cline-yes">17x</span>
|
|
973
|
+
<span class="cline-any cline-yes">17x</span>
|
|
974
|
+
<span class="cline-any cline-yes">1x</span>
|
|
975
|
+
<span class="cline-any cline-yes">17x</span>
|
|
976
|
+
<span class="cline-any cline-yes">17x</span>
|
|
977
|
+
<span class="cline-any cline-yes">17x</span>
|
|
978
|
+
<span class="cline-any cline-yes">17x</span>
|
|
979
|
+
<span class="cline-any cline-yes">17x</span>
|
|
980
|
+
<span class="cline-any cline-yes">17x</span>
|
|
981
|
+
<span class="cline-any cline-yes">17x</span>
|
|
982
|
+
<span class="cline-any cline-yes">17x</span>
|
|
983
|
+
<span class="cline-any cline-no"> </span>
|
|
984
|
+
<span class="cline-any cline-no"> </span>
|
|
985
|
+
<span class="cline-any cline-yes">17x</span>
|
|
986
|
+
<span class="cline-any cline-yes">17x</span>
|
|
987
|
+
<span class="cline-any cline-yes">17x</span>
|
|
988
|
+
<span class="cline-any cline-yes">1x</span>
|
|
989
|
+
<span class="cline-any cline-yes">17x</span>
|
|
990
|
+
<span class="cline-any cline-yes">17x</span>
|
|
991
|
+
<span class="cline-any cline-yes">17x</span>
|
|
992
|
+
<span class="cline-any cline-yes">17x</span>
|
|
993
|
+
<span class="cline-any cline-yes">17x</span>
|
|
994
|
+
<span class="cline-any cline-yes">17x</span>
|
|
995
|
+
<span class="cline-any cline-yes">17x</span>
|
|
996
|
+
<span class="cline-any cline-yes">17x</span>
|
|
997
|
+
<span class="cline-any cline-yes">17x</span>
|
|
998
|
+
<span class="cline-any cline-yes">17x</span>
|
|
999
|
+
<span class="cline-any cline-no"> </span>
|
|
1000
|
+
<span class="cline-any cline-no"> </span>
|
|
1001
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1002
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1003
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1004
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1005
|
+
<span class="cline-any cline-no"> </span>
|
|
1006
|
+
<span class="cline-any cline-no"> </span>
|
|
1007
|
+
<span class="cline-any cline-no"> </span>
|
|
1008
|
+
<span class="cline-any cline-no"> </span>
|
|
1009
|
+
<span class="cline-any cline-no"> </span>
|
|
1010
|
+
<span class="cline-any cline-no"> </span>
|
|
1011
|
+
<span class="cline-any cline-no"> </span>
|
|
1012
|
+
<span class="cline-any cline-no"> </span>
|
|
1013
|
+
<span class="cline-any cline-no"> </span>
|
|
1014
|
+
<span class="cline-any cline-no"> </span>
|
|
1015
|
+
<span class="cline-any cline-no"> </span>
|
|
1016
|
+
<span class="cline-any cline-no"> </span>
|
|
1017
|
+
<span class="cline-any cline-no"> </span>
|
|
1018
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1019
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1020
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1021
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1022
|
+
<span class="cline-any cline-no"> </span>
|
|
1023
|
+
<span class="cline-any cline-no"> </span>
|
|
1024
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1025
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1026
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1027
|
+
<span class="cline-any cline-no"> </span>
|
|
1028
|
+
<span class="cline-any cline-no"> </span>
|
|
1029
|
+
<span class="cline-any cline-no"> </span>
|
|
1030
|
+
<span class="cline-any cline-no"> </span>
|
|
1031
|
+
<span class="cline-any cline-no"> </span>
|
|
1032
|
+
<span class="cline-any cline-no"> </span>
|
|
1033
|
+
<span class="cline-any cline-no"> </span>
|
|
1034
|
+
<span class="cline-any cline-no"> </span>
|
|
1035
|
+
<span class="cline-any cline-no"> </span>
|
|
1036
|
+
<span class="cline-any cline-no"> </span>
|
|
1037
|
+
<span class="cline-any cline-no"> </span>
|
|
1038
|
+
<span class="cline-any cline-no"> </span>
|
|
1039
|
+
<span class="cline-any cline-no"> </span>
|
|
1040
|
+
<span class="cline-any cline-no"> </span>
|
|
1041
|
+
<span class="cline-any cline-no"> </span>
|
|
1042
|
+
<span class="cline-any cline-no"> </span>
|
|
1043
|
+
<span class="cline-any cline-no"> </span>
|
|
1044
|
+
<span class="cline-any cline-no"> </span>
|
|
1045
|
+
<span class="cline-any cline-no"> </span>
|
|
1046
|
+
<span class="cline-any cline-no"> </span>
|
|
1047
|
+
<span class="cline-any cline-no"> </span>
|
|
1048
|
+
<span class="cline-any cline-no"> </span>
|
|
1049
|
+
<span class="cline-any cline-no"> </span>
|
|
1050
|
+
<span class="cline-any cline-no"> </span>
|
|
1051
|
+
<span class="cline-any cline-no"> </span>
|
|
1052
|
+
<span class="cline-any cline-no"> </span>
|
|
1053
|
+
<span class="cline-any cline-no"> </span>
|
|
1054
|
+
<span class="cline-any cline-no"> </span>
|
|
1055
|
+
<span class="cline-any cline-no"> </span>
|
|
1056
|
+
<span class="cline-any cline-no"> </span>
|
|
1057
|
+
<span class="cline-any cline-no"> </span>
|
|
1058
|
+
<span class="cline-any cline-no"> </span>
|
|
1059
|
+
<span class="cline-any cline-no"> </span>
|
|
1060
|
+
<span class="cline-any cline-no"> </span>
|
|
1061
|
+
<span class="cline-any cline-no"> </span>
|
|
1062
|
+
<span class="cline-any cline-no"> </span>
|
|
1063
|
+
<span class="cline-any cline-no"> </span>
|
|
1064
|
+
<span class="cline-any cline-no"> </span>
|
|
1065
|
+
<span class="cline-any cline-no"> </span>
|
|
1066
|
+
<span class="cline-any cline-no"> </span>
|
|
1067
|
+
<span class="cline-any cline-no"> </span>
|
|
1068
|
+
<span class="cline-any cline-no"> </span>
|
|
1069
|
+
<span class="cline-any cline-no"> </span>
|
|
1070
|
+
<span class="cline-any cline-no"> </span>
|
|
1071
|
+
<span class="cline-any cline-no"> </span>
|
|
1072
|
+
<span class="cline-any cline-no"> </span>
|
|
1073
|
+
<span class="cline-any cline-no"> </span>
|
|
1074
|
+
<span class="cline-any cline-no"> </span>
|
|
1075
|
+
<span class="cline-any cline-no"> </span>
|
|
1076
|
+
<span class="cline-any cline-no"> </span>
|
|
1077
|
+
<span class="cline-any cline-no"> </span>
|
|
1078
|
+
<span class="cline-any cline-no"> </span>
|
|
1079
|
+
<span class="cline-any cline-no"> </span>
|
|
1080
|
+
<span class="cline-any cline-no"> </span>
|
|
1081
|
+
<span class="cline-any cline-no"> </span>
|
|
1082
|
+
<span class="cline-any cline-no"> </span>
|
|
1083
|
+
<span class="cline-any cline-no"> </span>
|
|
1084
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1085
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1086
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1087
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1088
|
+
<span class="cline-any cline-no"> </span>
|
|
1089
|
+
<span class="cline-any cline-no"> </span>
|
|
1090
|
+
<span class="cline-any cline-no"> </span>
|
|
1091
|
+
<span class="cline-any cline-no"> </span>
|
|
1092
|
+
<span class="cline-any cline-no"> </span>
|
|
1093
|
+
<span class="cline-any cline-no"> </span>
|
|
1094
|
+
<span class="cline-any cline-no"> </span>
|
|
1095
|
+
<span class="cline-any cline-no"> </span>
|
|
1096
|
+
<span class="cline-any cline-no"> </span>
|
|
1097
|
+
<span class="cline-any cline-no"> </span>
|
|
1098
|
+
<span class="cline-any cline-no"> </span>
|
|
1099
|
+
<span class="cline-any cline-no"> </span>
|
|
1100
|
+
<span class="cline-any cline-no"> </span>
|
|
1101
|
+
<span class="cline-any cline-no"> </span>
|
|
1102
|
+
<span class="cline-any cline-no"> </span>
|
|
1103
|
+
<span class="cline-any cline-no"> </span>
|
|
1104
|
+
<span class="cline-any cline-no"> </span>
|
|
1105
|
+
<span class="cline-any cline-no"> </span>
|
|
1106
|
+
<span class="cline-any cline-no"> </span>
|
|
1107
|
+
<span class="cline-any cline-no"> </span>
|
|
1108
|
+
<span class="cline-any cline-no"> </span>
|
|
1109
|
+
<span class="cline-any cline-no"> </span>
|
|
1110
|
+
<span class="cline-any cline-no"> </span>
|
|
1111
|
+
<span class="cline-any cline-no"> </span>
|
|
1112
|
+
<span class="cline-any cline-no"> </span>
|
|
1113
|
+
<span class="cline-any cline-no"> </span>
|
|
1114
|
+
<span class="cline-any cline-no"> </span>
|
|
1115
|
+
<span class="cline-any cline-no"> </span>
|
|
1116
|
+
<span class="cline-any cline-no"> </span>
|
|
1117
|
+
<span class="cline-any cline-no"> </span>
|
|
1118
|
+
<span class="cline-any cline-no"> </span>
|
|
1119
|
+
<span class="cline-any cline-no"> </span>
|
|
1120
|
+
<span class="cline-any cline-no"> </span>
|
|
1121
|
+
<span class="cline-any cline-no"> </span>
|
|
1122
|
+
<span class="cline-any cline-no"> </span>
|
|
1123
|
+
<span class="cline-any cline-no"> </span>
|
|
1124
|
+
<span class="cline-any cline-no"> </span>
|
|
1125
|
+
<span class="cline-any cline-no"> </span>
|
|
1126
|
+
<span class="cline-any cline-no"> </span>
|
|
1127
|
+
<span class="cline-any cline-no"> </span>
|
|
1128
|
+
<span class="cline-any cline-no"> </span>
|
|
1129
|
+
<span class="cline-any cline-no"> </span>
|
|
1130
|
+
<span class="cline-any cline-no"> </span>
|
|
1131
|
+
<span class="cline-any cline-no"> </span>
|
|
1132
|
+
<span class="cline-any cline-no"> </span>
|
|
1133
|
+
<span class="cline-any cline-no"> </span>
|
|
1134
|
+
<span class="cline-any cline-no"> </span>
|
|
1135
|
+
<span class="cline-any cline-no"> </span>
|
|
1136
|
+
<span class="cline-any cline-no"> </span>
|
|
1137
|
+
<span class="cline-any cline-no"> </span>
|
|
1138
|
+
<span class="cline-any cline-no"> </span>
|
|
1139
|
+
<span class="cline-any cline-no"> </span>
|
|
1140
|
+
<span class="cline-any cline-no"> </span>
|
|
1141
|
+
<span class="cline-any cline-no"> </span>
|
|
1142
|
+
<span class="cline-any cline-no"> </span>
|
|
1143
|
+
<span class="cline-any cline-no"> </span>
|
|
1144
|
+
<span class="cline-any cline-no"> </span>
|
|
1145
|
+
<span class="cline-any cline-no"> </span>
|
|
1146
|
+
<span class="cline-any cline-no"> </span>
|
|
1147
|
+
<span class="cline-any cline-no"> </span>
|
|
1148
|
+
<span class="cline-any cline-no"> </span>
|
|
1149
|
+
<span class="cline-any cline-no"> </span>
|
|
1150
|
+
<span class="cline-any cline-no"> </span>
|
|
1151
|
+
<span class="cline-any cline-no"> </span>
|
|
1152
|
+
<span class="cline-any cline-no"> </span>
|
|
1153
|
+
<span class="cline-any cline-no"> </span>
|
|
1154
|
+
<span class="cline-any cline-no"> </span>
|
|
1155
|
+
<span class="cline-any cline-no"> </span>
|
|
1156
|
+
<span class="cline-any cline-no"> </span>
|
|
1157
|
+
<span class="cline-any cline-no"> </span>
|
|
1158
|
+
<span class="cline-any cline-no"> </span>
|
|
1159
|
+
<span class="cline-any cline-no"> </span>
|
|
1160
|
+
<span class="cline-any cline-no"> </span>
|
|
1161
|
+
<span class="cline-any cline-no"> </span>
|
|
1162
|
+
<span class="cline-any cline-no"> </span>
|
|
1163
|
+
<span class="cline-any cline-no"> </span>
|
|
1164
|
+
<span class="cline-any cline-no"> </span>
|
|
1165
|
+
<span class="cline-any cline-no"> </span>
|
|
1166
|
+
<span class="cline-any cline-no"> </span>
|
|
1167
|
+
<span class="cline-any cline-no"> </span>
|
|
1168
|
+
<span class="cline-any cline-no"> </span>
|
|
1169
|
+
<span class="cline-any cline-no"> </span>
|
|
1170
|
+
<span class="cline-any cline-no"> </span>
|
|
1171
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1172
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1173
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1174
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1175
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1176
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1177
|
+
<span class="cline-any cline-no"> </span>
|
|
1178
|
+
<span class="cline-any cline-no"> </span>
|
|
1179
|
+
<span class="cline-any cline-no"> </span>
|
|
1180
|
+
<span class="cline-any cline-no"> </span>
|
|
1181
|
+
<span class="cline-any cline-no"> </span>
|
|
1182
|
+
<span class="cline-any cline-no"> </span>
|
|
1183
|
+
<span class="cline-any cline-no"> </span>
|
|
1184
|
+
<span class="cline-any cline-no"> </span>
|
|
1185
|
+
<span class="cline-any cline-no"> </span>
|
|
1186
|
+
<span class="cline-any cline-no"> </span>
|
|
1187
|
+
<span class="cline-any cline-no"> </span>
|
|
1188
|
+
<span class="cline-any cline-no"> </span>
|
|
1189
|
+
<span class="cline-any cline-no"> </span>
|
|
1190
|
+
<span class="cline-any cline-no"> </span>
|
|
1191
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1192
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1193
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1194
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1195
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1196
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1197
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1198
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1199
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1200
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1201
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1202
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1203
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1204
|
+
<span class="cline-any cline-no"> </span>
|
|
1205
|
+
<span class="cline-any cline-no"> </span>
|
|
1206
|
+
<span class="cline-any cline-no"> </span>
|
|
1207
|
+
<span class="cline-any cline-no"> </span>
|
|
1208
|
+
<span class="cline-any cline-no"> </span>
|
|
1209
|
+
<span class="cline-any cline-no"> </span>
|
|
1210
|
+
<span class="cline-any cline-no"> </span>
|
|
1211
|
+
<span class="cline-any cline-no"> </span>
|
|
1212
|
+
<span class="cline-any cline-no"> </span>
|
|
1213
|
+
<span class="cline-any cline-no"> </span>
|
|
1214
|
+
<span class="cline-any cline-no"> </span>
|
|
1215
|
+
<span class="cline-any cline-no"> </span>
|
|
1216
|
+
<span class="cline-any cline-no"> </span>
|
|
1217
|
+
<span class="cline-any cline-no"> </span>
|
|
1218
|
+
<span class="cline-any cline-no"> </span>
|
|
1219
|
+
<span class="cline-any cline-no"> </span>
|
|
1220
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1221
|
+
<span class="cline-any cline-no"> </span>
|
|
1222
|
+
<span class="cline-any cline-no"> </span>
|
|
1223
|
+
<span class="cline-any cline-no"> </span>
|
|
1224
|
+
<span class="cline-any cline-no"> </span>
|
|
1225
|
+
<span class="cline-any cline-no"> </span>
|
|
1226
|
+
<span class="cline-any cline-no"> </span>
|
|
1227
|
+
<span class="cline-any cline-no"> </span>
|
|
1228
|
+
<span class="cline-any cline-no"> </span>
|
|
1229
|
+
<span class="cline-any cline-no"> </span>
|
|
1230
|
+
<span class="cline-any cline-no"> </span>
|
|
1231
|
+
<span class="cline-any cline-no"> </span>
|
|
1232
|
+
<span class="cline-any cline-no"> </span>
|
|
1233
|
+
<span class="cline-any cline-no"> </span>
|
|
1234
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1235
|
+
<span class="cline-any cline-no"> </span>
|
|
1236
|
+
<span class="cline-any cline-no"> </span>
|
|
1237
|
+
<span class="cline-any cline-no"> </span>
|
|
1238
|
+
<span class="cline-any cline-no"> </span>
|
|
1239
|
+
<span class="cline-any cline-no"> </span>
|
|
1240
|
+
<span class="cline-any cline-no"> </span>
|
|
1241
|
+
<span class="cline-any cline-no"> </span>
|
|
1242
|
+
<span class="cline-any cline-no"> </span>
|
|
1243
|
+
<span class="cline-any cline-no"> </span>
|
|
1244
|
+
<span class="cline-any cline-no"> </span>
|
|
1245
|
+
<span class="cline-any cline-no"> </span>
|
|
1246
|
+
<span class="cline-any cline-no"> </span>
|
|
1247
|
+
<span class="cline-any cline-no"> </span>
|
|
1248
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1249
|
+
<span class="cline-any cline-no"> </span>
|
|
1250
|
+
<span class="cline-any cline-no"> </span>
|
|
1251
|
+
<span class="cline-any cline-no"> </span>
|
|
1252
|
+
<span class="cline-any cline-no"> </span>
|
|
1253
|
+
<span class="cline-any cline-no"> </span>
|
|
1254
|
+
<span class="cline-any cline-no"> </span>
|
|
1255
|
+
<span class="cline-any cline-no"> </span>
|
|
1256
|
+
<span class="cline-any cline-no"> </span>
|
|
1257
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1258
|
+
<span class="cline-any cline-no"> </span>
|
|
1259
|
+
<span class="cline-any cline-no"> </span>
|
|
1260
|
+
<span class="cline-any cline-no"> </span>
|
|
1261
|
+
<span class="cline-any cline-no"> </span>
|
|
1262
|
+
<span class="cline-any cline-no"> </span>
|
|
1263
|
+
<span class="cline-any cline-no"> </span>
|
|
1264
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1265
|
+
<span class="cline-any cline-no"> </span>
|
|
1266
|
+
<span class="cline-any cline-no"> </span>
|
|
1267
|
+
<span class="cline-any cline-no"> </span>
|
|
1268
|
+
<span class="cline-any cline-no"> </span>
|
|
1269
|
+
<span class="cline-any cline-no"> </span>
|
|
1270
|
+
<span class="cline-any cline-no"> </span>
|
|
1271
|
+
<span class="cline-any cline-no"> </span>
|
|
1272
|
+
<span class="cline-any cline-no"> </span>
|
|
1273
|
+
<span class="cline-any cline-no"> </span>
|
|
1274
|
+
<span class="cline-any cline-no"> </span>
|
|
1275
|
+
<span class="cline-any cline-no"> </span>
|
|
1276
|
+
<span class="cline-any cline-no"> </span>
|
|
1277
|
+
<span class="cline-any cline-no"> </span>
|
|
1278
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1279
|
+
<span class="cline-any cline-no"> </span>
|
|
1280
|
+
<span class="cline-any cline-no"> </span>
|
|
1281
|
+
<span class="cline-any cline-no"> </span>
|
|
1282
|
+
<span class="cline-any cline-no"> </span>
|
|
1283
|
+
<span class="cline-any cline-no"> </span>
|
|
1284
|
+
<span class="cline-any cline-no"> </span>
|
|
1285
|
+
<span class="cline-any cline-no"> </span>
|
|
1286
|
+
<span class="cline-any cline-no"> </span>
|
|
1287
|
+
<span class="cline-any cline-no"> </span>
|
|
1288
|
+
<span class="cline-any cline-no"> </span>
|
|
1289
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1290
|
+
<span class="cline-any cline-no"> </span>
|
|
1291
|
+
<span class="cline-any cline-no"> </span>
|
|
1292
|
+
<span class="cline-any cline-no"> </span>
|
|
1293
|
+
<span class="cline-any cline-no"> </span>
|
|
1294
|
+
<span class="cline-any cline-no"> </span>
|
|
1295
|
+
<span class="cline-any cline-no"> </span>
|
|
1296
|
+
<span class="cline-any cline-no"> </span>
|
|
1297
|
+
<span class="cline-any cline-no"> </span>
|
|
1298
|
+
<span class="cline-any cline-no"> </span>
|
|
1299
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1300
|
+
<span class="cline-any cline-no"> </span>
|
|
1301
|
+
<span class="cline-any cline-no"> </span>
|
|
1302
|
+
<span class="cline-any cline-no"> </span>
|
|
1303
|
+
<span class="cline-any cline-no"> </span>
|
|
1304
|
+
<span class="cline-any cline-no"> </span>
|
|
1305
|
+
<span class="cline-any cline-no"> </span>
|
|
1306
|
+
<span class="cline-any cline-no"> </span>
|
|
1307
|
+
<span class="cline-any cline-no"> </span>
|
|
1308
|
+
<span class="cline-any cline-no"> </span>
|
|
1309
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1310
|
+
<span class="cline-any cline-no"> </span>
|
|
1311
|
+
<span class="cline-any cline-no"> </span>
|
|
1312
|
+
<span class="cline-any cline-no"> </span>
|
|
1313
|
+
<span class="cline-any cline-no"> </span>
|
|
1314
|
+
<span class="cline-any cline-no"> </span>
|
|
1315
|
+
<span class="cline-any cline-no"> </span>
|
|
1316
|
+
<span class="cline-any cline-no"> </span>
|
|
1317
|
+
<span class="cline-any cline-no"> </span>
|
|
1318
|
+
<span class="cline-any cline-no"> </span>
|
|
1319
|
+
<span class="cline-any cline-no"> </span>
|
|
1320
|
+
<span class="cline-any cline-no"> </span>
|
|
1321
|
+
<span class="cline-any cline-no"> </span>
|
|
1322
|
+
<span class="cline-any cline-no"> </span>
|
|
1323
|
+
<span class="cline-any cline-no"> </span>
|
|
1324
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1325
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1326
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1327
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1328
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1329
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1330
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1331
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1332
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1333
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1334
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1335
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1336
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1337
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1338
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1339
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1340
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1341
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1342
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1343
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1344
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1345
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1346
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1347
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1348
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">"use strict";
|
|
1349
|
+
|
|
1350
|
+
const fs = require("fs"),
|
|
1351
|
+
path = require("path"),
|
|
1352
|
+
|
|
1353
|
+
cross_spawn = require("cross-spawn"),
|
|
1354
|
+
shell_quote = require("shell-quote"),
|
|
1355
|
+
yaml = require("js-yaml"),
|
|
1356
|
+
nodeResolve = require("resolve"),
|
|
1357
|
+
|
|
1358
|
+
semver = require("@flourish/semver"),
|
|
1359
|
+
|
|
1360
|
+
log = require("./log"),
|
|
1361
|
+
validateConfig = require("./validate_config"),
|
|
1362
|
+
{ extendItem } = require("./common") ;
|
|
1363
|
+
|
|
1364
|
+
const sdk_tokens_file = path.join(process.env.HOME <span class="branch-0 cbranch-no" title="branch not covered" >|| process.env.USERPROFILE,</span> ".flourish_sdk");
|
|
1365
|
+
|
|
1366
|
+
const YAML_DUMP_OPTS = { flowLevel: 4 };
|
|
1367
|
+
const SDK_VERSION = require("../package.json").version;
|
|
1368
|
+
const SDK_MAJOR_VERSION = semver.parse(SDK_VERSION)[0];
|
|
1369
|
+
const SDK_MAJOR_VERSION_COMPAT = 3; // Flourish templates built for SDK version 3 are compatible with the current version
|
|
1370
|
+
|
|
1371
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function getSdkToken(server_opts) {</span></span>
|
|
1372
|
+
<span class="cstat-no" title="statement not covered" > return new Promise(function(resolve, reject) {</span>
|
|
1373
|
+
<span class="cstat-no" title="statement not covered" > fs.chmod(sdk_tokens_file, 0o600, function(error) {</span>
|
|
1374
|
+
<span class="cstat-no" title="statement not covered" > if (error) { return reject(error); }</span>
|
|
1375
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1376
|
+
<span class="cstat-no" title="statement not covered" > fs.readFile(sdk_tokens_file, "utf8", function(error, body) {</span>
|
|
1377
|
+
<span class="cstat-no" title="statement not covered" > if (error) { return reject(error); }</span>
|
|
1378
|
+
<span class="cstat-no" title="statement not covered" > resolve(JSON.parse(body)[server_opts.host]);</span>
|
|
1379
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1380
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1381
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1382
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1383
|
+
|
|
1384
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function setSdkToken(server_opts, sdk_token) {</span></span>
|
|
1385
|
+
<span class="cstat-no" title="statement not covered" > return new Promise(function(resolve, reject) {</span>
|
|
1386
|
+
<span class="cstat-no" title="statement not covered" > fs.readFile(sdk_tokens_file, function(error, body) {</span>
|
|
1387
|
+
<span class="cstat-no" title="statement not covered" > let sdk_tokens;</span>
|
|
1388
|
+
<span class="cstat-no" title="statement not covered" > if (error && error.code === "ENOENT") {</span>
|
|
1389
|
+
<span class="cstat-no" title="statement not covered" > sdk_tokens = {};</span>
|
|
1390
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1391
|
+
<span class="cstat-no" title="statement not covered" > else {</span>
|
|
1392
|
+
<span class="cstat-no" title="statement not covered" > if (error) { log.die(`Failed to read ${sdk_tokens_file}`, error.message); }</span>
|
|
1393
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1394
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1395
|
+
<span class="cstat-no" title="statement not covered" > sdk_tokens = JSON.parse(body);</span>
|
|
1396
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1397
|
+
<span class="cstat-no" title="statement not covered" > catch (error) {</span>
|
|
1398
|
+
<span class="cstat-no" title="statement not covered" > log.die(`Failed to parse ${sdk_tokens_file}`, "Remove it and try again");</span>
|
|
1399
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1400
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1401
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1402
|
+
<span class="cstat-no" title="statement not covered" > sdk_tokens[server_opts.host] = sdk_token;</span>
|
|
1403
|
+
<span class="cstat-no" title="statement not covered" > fs.writeFile(sdk_tokens_file, JSON.stringify(sdk_tokens), { mode: 0o600 }, function(error) {</span>
|
|
1404
|
+
<span class="cstat-no" title="statement not covered" > if (error) { log.die(`Failed to save ${sdk_tokens_file}`, error.message); }</span>
|
|
1405
|
+
<span class="cstat-no" title="statement not covered" > resolve();</span>
|
|
1406
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1407
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1408
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1409
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1410
|
+
|
|
1411
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function deleteSdkToken(host) {</span></span>
|
|
1412
|
+
<span class="cstat-no" title="statement not covered" > return new Promise(function(resolve) {</span>
|
|
1413
|
+
<span class="cstat-no" title="statement not covered" > if (host == null) {</span>
|
|
1414
|
+
<span class="cstat-no" title="statement not covered" > log.die("No host specified");</span>
|
|
1415
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1416
|
+
<span class="cstat-no" title="statement not covered" > fs.readFile(sdk_tokens_file, function(error, body) {</span>
|
|
1417
|
+
<span class="cstat-no" title="statement not covered" > if (error) { log.die(`Failed to read ${sdk_tokens_file}`, error.message); }</span>
|
|
1418
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1419
|
+
<span class="cstat-no" title="statement not covered" > let sdk_tokens;</span>
|
|
1420
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1421
|
+
<span class="cstat-no" title="statement not covered" > sdk_tokens = JSON.parse(body);</span>
|
|
1422
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1423
|
+
<span class="cstat-no" title="statement not covered" > catch (error) {</span>
|
|
1424
|
+
<span class="cstat-no" title="statement not covered" > log.die(`Failed to parse ${sdk_tokens_file}`, "Remove it and try again");</span>
|
|
1425
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1426
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1427
|
+
<span class="cstat-no" title="statement not covered" > delete sdk_tokens[host];</span>
|
|
1428
|
+
<span class="cstat-no" title="statement not covered" > fs.writeFile(sdk_tokens_file, JSON.stringify(sdk_tokens), { mode: 0o600 }, function(error) {</span>
|
|
1429
|
+
<span class="cstat-no" title="statement not covered" > if (error) { log.die(`Failed to save ${sdk_tokens_file}`, error.message); }</span>
|
|
1430
|
+
<span class="cstat-no" title="statement not covered" > resolve();</span>
|
|
1431
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1432
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1433
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1434
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1435
|
+
|
|
1436
|
+
/**
|
|
1437
|
+
* Deletes all SDK tokens
|
|
1438
|
+
* this will delete the .flourish_sdk file from the user's home directory
|
|
1439
|
+
* which clears all tokens across all configured hosts
|
|
1440
|
+
*/
|
|
1441
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function deleteSdkTokens() {</span></span>
|
|
1442
|
+
<span class="cstat-no" title="statement not covered" > return new Promise(function(resolve, reject) {</span>
|
|
1443
|
+
<span class="cstat-no" title="statement not covered" > fs.unlink(sdk_tokens_file, function(error) {</span>
|
|
1444
|
+
<span class="cstat-no" title="statement not covered" > if (error) { log.die("Failed to delete " + sdk_tokens_file, error.message); }</span>
|
|
1445
|
+
<span class="cstat-no" title="statement not covered" > resolve();</span>
|
|
1446
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1447
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1448
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1449
|
+
|
|
1450
|
+
const AUTHENTICATED_REQUEST_METHODS = new Set([
|
|
1451
|
+
"template/assign-version-number", "template/publish", "template/delete", "template/list", "template/history",
|
|
1452
|
+
"user/whoami", "user/logout",
|
|
1453
|
+
]);
|
|
1454
|
+
|
|
1455
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function request(server_opts, method, data, config = { exit_on_failure: true }) {</span></span>
|
|
1456
|
+
<span class="cstat-no" title="statement not covered" > const fetch = await import("node-fetch");</span>
|
|
1457
|
+
<span class="cstat-no" title="statement not covered" > let sdk_token;</span>
|
|
1458
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1459
|
+
<span class="cstat-no" title="statement not covered" > if (AUTHENTICATED_REQUEST_METHODS.has(method)) {</span>
|
|
1460
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1461
|
+
<span class="cstat-no" title="statement not covered" > sdk_token = await getSdkToken(server_opts);</span>
|
|
1462
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1463
|
+
<span class="cstat-no" title="statement not covered" > catch (error) {</span>
|
|
1464
|
+
<span class="cstat-no" title="statement not covered" > log.problem(`Failed to read ${sdk_tokens_file}`, error.message);</span>
|
|
1465
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1466
|
+
<span class="cstat-no" title="statement not covered" > if (!sdk_token) {</span>
|
|
1467
|
+
<span class="cstat-no" title="statement not covered" > log.die("You are not logged in. Try ‘flourish login’ or ‘flourish register’ first.");</span>
|
|
1468
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1469
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1470
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1471
|
+
<span class="cstat-no" title="statement not covered" > const protocol = server_opts.host.match(/^(localhost|127\.0\.0\.1|.*\.local)(:\d+)?$/) ? "http:" : "https:";</span>
|
|
1472
|
+
<span class="cstat-no" title="statement not covered" > const url = `${protocol}//${server_opts.host}/api/v1/${method}`;</span>
|
|
1473
|
+
<span class="cstat-no" title="statement not covered" > const options = { method: data ? "POST" : "GET" };</span>
|
|
1474
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1475
|
+
<span class="cstat-no" title="statement not covered" > if (data) {</span>
|
|
1476
|
+
<span class="cstat-no" title="statement not covered" > if (data instanceof fetch.FormData) {</span>
|
|
1477
|
+
<span class="cstat-no" title="statement not covered" > if (sdk_token) {</span>
|
|
1478
|
+
<span class="cstat-no" title="statement not covered" > data.append("sdk_token", sdk_token);</span>
|
|
1479
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1480
|
+
<span class="cstat-no" title="statement not covered" > data.append("sdk_version", SDK_VERSION);</span>
|
|
1481
|
+
<span class="cstat-no" title="statement not covered" > options.body = data;</span>
|
|
1482
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1483
|
+
<span class="cstat-no" title="statement not covered" > else {</span>
|
|
1484
|
+
<span class="cstat-no" title="statement not covered" > options.body = JSON.stringify({ ...data, sdk_token, sdk_version: SDK_VERSION });</span>
|
|
1485
|
+
<span class="cstat-no" title="statement not covered" > options.headers = { "content-type": "application/json" };</span>
|
|
1486
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1487
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1488
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1489
|
+
<span class="cstat-no" title="statement not covered" > if (server_opts.user) {</span>
|
|
1490
|
+
<span class="cstat-no" title="statement not covered" > options.headers.authorization = Buffer.from(`${server_opts.user}:${server_opts.password}`).toString("base64");</span>
|
|
1491
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1492
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1493
|
+
<span class="cstat-no" title="statement not covered" > let res;</span>
|
|
1494
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1495
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1496
|
+
<span class="cstat-no" title="statement not covered" > res = await fetch.default(url, options);</span>
|
|
1497
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1498
|
+
<span class="cstat-no" title="statement not covered" > catch (e) {</span>
|
|
1499
|
+
<span class="cstat-no" title="statement not covered" > if (config.exit_on_failure) {</span>
|
|
1500
|
+
<span class="cstat-no" title="statement not covered" > log.die(e);</span>
|
|
1501
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1502
|
+
<span class="cstat-no" title="statement not covered" > else {</span>
|
|
1503
|
+
<span class="cstat-no" title="statement not covered" > throw e;</span>
|
|
1504
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1505
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1506
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1507
|
+
<span class="cstat-no" title="statement not covered" > let text;</span>
|
|
1508
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1509
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1510
|
+
<span class="cstat-no" title="statement not covered" > // We could use res.json() here, but we're interested in what the body</span>
|
|
1511
|
+
<span class="cstat-no" title="statement not covered" > // is when it's *not* json (load balancer issues etc.).</span>
|
|
1512
|
+
<span class="cstat-no" title="statement not covered" > text = await res.text();</span>
|
|
1513
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1514
|
+
<span class="cstat-no" title="statement not covered" > catch (error) {</span>
|
|
1515
|
+
<span class="cstat-no" title="statement not covered" > if (config.exit_on_failure) {</span>
|
|
1516
|
+
<span class="cstat-no" title="statement not covered" > log.die("Failed to get response from server", error);</span>
|
|
1517
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1518
|
+
<span class="cstat-no" title="statement not covered" > else {</span>
|
|
1519
|
+
<span class="cstat-no" title="statement not covered" > throw error;</span>
|
|
1520
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1521
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1522
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1523
|
+
<span class="cstat-no" title="statement not covered" > let body;</span>
|
|
1524
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1525
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1526
|
+
<span class="cstat-no" title="statement not covered" > body = JSON.parse(text);</span>
|
|
1527
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1528
|
+
<span class="cstat-no" title="statement not covered" > catch (error) {</span>
|
|
1529
|
+
<span class="cstat-no" title="statement not covered" > if (config.exit_on_failure) {</span>
|
|
1530
|
+
<span class="cstat-no" title="statement not covered" > log.die("Failed to parse response body", res.status, error, text);</span>
|
|
1531
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1532
|
+
<span class="cstat-no" title="statement not covered" > else { throw error; }</span>
|
|
1533
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1534
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1535
|
+
<span class="cstat-no" title="statement not covered" > if (res.ok) {</span>
|
|
1536
|
+
<span class="cstat-no" title="statement not covered" > return body;</span>
|
|
1537
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1538
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1539
|
+
<span class="cstat-no" title="statement not covered" > if (body.error) {</span>
|
|
1540
|
+
<span class="cstat-no" title="statement not covered" > if (config.exit_on_failure) {</span>
|
|
1541
|
+
<span class="cstat-no" title="statement not covered" > log.die("Error from server", res.status, body.error.message);</span>
|
|
1542
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1543
|
+
<span class="cstat-no" title="statement not covered" > else {</span>
|
|
1544
|
+
<span class="cstat-no" title="statement not covered" > throw body.error;</span>
|
|
1545
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1546
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1547
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1548
|
+
<span class="cstat-no" title="statement not covered" > log.die("Server error", res.status, JSON.stringify(body));</span>
|
|
1549
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1550
|
+
|
|
1551
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function runBuildCommand(template_dir, command, node_env) {</span></span>
|
|
1552
|
+
<span class="cstat-no" title="statement not covered" > const command_parts = shell_quote.parse(command),</span>
|
|
1553
|
+
<span class="cstat-no" title="statement not covered" > prog = command_parts[0],</span>
|
|
1554
|
+
<span class="cstat-no" title="statement not covered" > args = command_parts.slice(1);</span>
|
|
1555
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1556
|
+
<span class="cstat-no" title="statement not covered" > return new Promise(function(resolve, reject) {</span>
|
|
1557
|
+
<span class="cstat-no" title="statement not covered" > log.info("Running build command: " + command);</span>
|
|
1558
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1559
|
+
<span class="cstat-no" title="statement not covered" > const env = process.env;</span>
|
|
1560
|
+
<span class="cstat-no" title="statement not covered" > if (typeof node_env !== "undefined") { env.NODE_ENV = node_env; }</span>
|
|
1561
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1562
|
+
<span class="cstat-no" title="statement not covered" > cross_spawn.spawn(prog, args, { cwd: template_dir, stdio: "inherit", env })</span>
|
|
1563
|
+
<span class="cstat-no" title="statement not covered" > .on("error", function(error) {</span>
|
|
1564
|
+
<span class="cstat-no" title="statement not covered" > reject(new Error(`Failed to run build command ‘${command}’: ${error.message}`));</span>
|
|
1565
|
+
<span class="cstat-no" title="statement not covered" > })</span>
|
|
1566
|
+
<span class="cstat-no" title="statement not covered" > .on("exit", function(exit_code) {</span>
|
|
1567
|
+
<span class="cstat-no" title="statement not covered" > if (exit_code != 0) {</span>
|
|
1568
|
+
<span class="cstat-no" title="statement not covered" > reject(new Error(`Failed to run build command ‘${command}’`));</span>
|
|
1569
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1570
|
+
<span class="cstat-no" title="statement not covered" > resolve();</span>
|
|
1571
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1572
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1573
|
+
<span class="cstat-no" title="statement not covered" > catch (error) {</span>
|
|
1574
|
+
<span class="cstat-no" title="statement not covered" > reject(new Error(`Failed to run build command ‘${command}’ in ${template_dir}: ${error.message}`));</span>
|
|
1575
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1576
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1577
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1578
|
+
|
|
1579
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function buildTemplate(template_dir, node_env, purpose) {</span></span>
|
|
1580
|
+
<span class="cstat-no" title="statement not covered" > return checkTemplateVersion(template_dir)</span>
|
|
1581
|
+
<span class="cstat-no" title="statement not covered" > .then(() => installNodeModules(template_dir, node_env))</span>
|
|
1582
|
+
<span class="cstat-no" title="statement not covered" > .then(() => buildRules(template_dir))</span>
|
|
1583
|
+
<span class="cstat-no" title="statement not covered" > .then((build_rules) => Promise.all([...build_rules].map((rule) => {</span>
|
|
1584
|
+
<span class="cstat-no" title="statement not covered" > // If we’re building the template in order to run it,</span>
|
|
1585
|
+
<span class="cstat-no" title="statement not covered" > // and there is a watch script defined, don’t build it</span>
|
|
1586
|
+
<span class="cstat-no" title="statement not covered" > // and rely on the watch script instead.</span>
|
|
1587
|
+
<span class="cstat-no" title="statement not covered" > if (purpose !== "run" || !("watch" in rule)) {</span>
|
|
1588
|
+
<span class="cstat-no" title="statement not covered" > return runBuildCommand(template_dir, rule.script, node_env);</span>
|
|
1589
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1590
|
+
<span class="cstat-no" title="statement not covered" > })));</span>
|
|
1591
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1592
|
+
|
|
1593
|
+
function readConfig(template_dir) {
|
|
1594
|
+
return Promise.all([
|
|
1595
|
+
readYaml(path.join(template_dir, "template.yml")),
|
|
1596
|
+
readJson(path.join(template_dir, "package.json")),
|
|
1597
|
+
]).then(([yaml, json]) => {
|
|
1598
|
+
if (json) {
|
|
1599
|
+
if (!("id" in yaml) && ("name" in json)) {
|
|
1600
|
+
yaml.id = json.name;
|
|
1601
|
+
}
|
|
1602
|
+
if (!("author" in yaml) && ("author" in json)) {
|
|
1603
|
+
yaml.author = json.author;
|
|
1604
|
+
}
|
|
1605
|
+
if (!("description" in yaml) && ("description" in json)) {
|
|
1606
|
+
yaml.description = json.description;
|
|
1607
|
+
}
|
|
1608
|
+
if (!("version" in yaml) && ("version" in json)) {
|
|
1609
|
+
yaml.version = json.version;
|
|
1610
|
+
}
|
|
1611
|
+
}
|
|
1612
|
+
return yaml;
|
|
1613
|
+
});
|
|
1614
|
+
}
|
|
1615
|
+
|
|
1616
|
+
function readYaml(yaml_file) {
|
|
1617
|
+
return new Promise(function(resolve, reject) {
|
|
1618
|
+
fs.readFile(yaml_file, "utf8", function(error, text) {
|
|
1619
|
+
if (error) <span class="branch-0 cbranch-no" title="branch not covered" >{ return reject(new Error(`Failed to read ${yaml_file}: ${error.message}`)); }</span>
|
|
1620
|
+
try {
|
|
1621
|
+
return resolve(yaml.load(text));
|
|
1622
|
+
}
|
|
1623
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > catch (error) {</span>
|
|
1624
|
+
<span class="cstat-no" title="statement not covered" > return reject(new Error(`Failed to parse ${yaml_file}: ${error.message}`));</span>
|
|
1625
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1626
|
+
});
|
|
1627
|
+
});
|
|
1628
|
+
}
|
|
1629
|
+
|
|
1630
|
+
function readJson(json_file) {
|
|
1631
|
+
return new Promise(function(resolve, reject) {
|
|
1632
|
+
fs.readFile(json_file, "utf8", function(error, text) {
|
|
1633
|
+
if (error <span class="branch-0 cbranch-no" title="branch not covered" >&& error.code === "ENOENT")</span> <span class="branch-0 cbranch-no" title="branch not covered" >{ return resolve(undefined); }</span>
|
|
1634
|
+
else if (error) <span class="branch-0 cbranch-no" title="branch not covered" >{ return reject(new Error(`Failed to read ${json_file}: ${error.message}`)); }</span>
|
|
1635
|
+
|
|
1636
|
+
try {
|
|
1637
|
+
return resolve(JSON.parse(text));
|
|
1638
|
+
}
|
|
1639
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > catch (error) {</span>
|
|
1640
|
+
<span class="cstat-no" title="statement not covered" > return reject(new Error(`Failed to parse ${json_file}: ${error.message}`));</span>
|
|
1641
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1642
|
+
});
|
|
1643
|
+
});
|
|
1644
|
+
}
|
|
1645
|
+
|
|
1646
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function addShowCondition(setting) {</span></span>
|
|
1647
|
+
<span class="cstat-no" title="statement not covered" > if (typeof setting === "string") { return; }</span>
|
|
1648
|
+
<span class="cstat-no" title="statement not covered" > if (!["show_if", "hide_if"].some(d => d in setting)) { return; }</span>
|
|
1649
|
+
<span class="cstat-no" title="statement not covered" > if (!setting.show_condition) { setting.show_condition = []; }</span>
|
|
1650
|
+
<span class="cstat-no" title="statement not covered" > if (setting.show_if !== undefined) {</span>
|
|
1651
|
+
<span class="cstat-no" title="statement not covered" > setting.show_condition.push({ type: "show", condition: setting.show_if });</span>
|
|
1652
|
+
<span class="cstat-no" title="statement not covered" > delete setting.show_if;</span>
|
|
1653
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1654
|
+
<span class="cstat-no" title="statement not covered" > else {</span>
|
|
1655
|
+
<span class="cstat-no" title="statement not covered" > setting.show_condition.push({ type: "hide", condition: setting.hide_if });</span>
|
|
1656
|
+
<span class="cstat-no" title="statement not covered" > delete setting.hide_if;</span>
|
|
1657
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1658
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1659
|
+
|
|
1660
|
+
function addShowConditions(config) {
|
|
1661
|
+
const settings = config.settings || [];
|
|
1662
|
+
for (const setting of settings) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1663
|
+
<span class="cstat-no" title="statement not covered" > addShowCondition(setting);</span>
|
|
1664
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1665
|
+
return config;
|
|
1666
|
+
}
|
|
1667
|
+
|
|
1668
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function qualifyNames(settings, namespace) {</span></span>
|
|
1669
|
+
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < settings.length; i++) {</span>
|
|
1670
|
+
<span class="cstat-no" title="statement not covered" > const setting = settings[i];</span>
|
|
1671
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1672
|
+
<span class="cstat-no" title="statement not covered" > if (typeof setting !== "object") { continue; }</span>
|
|
1673
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1674
|
+
<span class="cstat-no" title="statement not covered" > if ("show_if" in setting) {</span>
|
|
1675
|
+
<span class="cstat-no" title="statement not covered" > if (typeof setting.show_if === "string") {</span>
|
|
1676
|
+
<span class="cstat-no" title="statement not covered" > setting.show_if = namespace + "." + setting.show_if;</span>
|
|
1677
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1678
|
+
<span class="cstat-no" title="statement not covered" > else if (Array.isArray(setting.show_if)) {</span>
|
|
1679
|
+
<span class="cstat-no" title="statement not covered" > const r = [];</span>
|
|
1680
|
+
<span class="cstat-no" title="statement not covered" > for (let j = 0; j < setting.show_if.length; j++) {</span>
|
|
1681
|
+
<span class="cstat-no" title="statement not covered" > const and_conditions = {};</span>
|
|
1682
|
+
<span class="cstat-no" title="statement not covered" > for (const k in setting.show_if[j]) {</span>
|
|
1683
|
+
<span class="cstat-no" title="statement not covered" > and_conditions[namespace + "." + k] = setting.show_if[j][k];</span>
|
|
1684
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1685
|
+
<span class="cstat-no" title="statement not covered" > r.push(and_conditions);</span>
|
|
1686
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1687
|
+
<span class="cstat-no" title="statement not covered" > setting.show_if = r;</span>
|
|
1688
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1689
|
+
<span class="cstat-no" title="statement not covered" > else if (typeof setting.show_if === "object") {</span>
|
|
1690
|
+
<span class="cstat-no" title="statement not covered" > const r = {};</span>
|
|
1691
|
+
<span class="cstat-no" title="statement not covered" > for (const k in setting.show_if) {</span>
|
|
1692
|
+
<span class="cstat-no" title="statement not covered" > r[namespace + "." + k] = setting.show_if[k];</span>
|
|
1693
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1694
|
+
<span class="cstat-no" title="statement not covered" > setting.show_if = r;</span>
|
|
1695
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1696
|
+
<span class="cstat-no" title="statement not covered" > // Else pass through unmodified: to support literal true/false values.</span>
|
|
1697
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1698
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1699
|
+
<span class="cstat-no" title="statement not covered" > if ("hide_if" in setting) {</span>
|
|
1700
|
+
<span class="cstat-no" title="statement not covered" > if (typeof setting.hide_if === "string") {</span>
|
|
1701
|
+
<span class="cstat-no" title="statement not covered" > setting.hide_if = namespace + "." + setting.hide_if;</span>
|
|
1702
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1703
|
+
<span class="cstat-no" title="statement not covered" > else if (Array.isArray(setting.hide_if)) {</span>
|
|
1704
|
+
<span class="cstat-no" title="statement not covered" > const r = [];</span>
|
|
1705
|
+
<span class="cstat-no" title="statement not covered" > for (let j = 0; j < setting.hide_if.length; j++) {</span>
|
|
1706
|
+
<span class="cstat-no" title="statement not covered" > const and_conditions = {};</span>
|
|
1707
|
+
<span class="cstat-no" title="statement not covered" > for (const k in setting.hide_if[j]) {</span>
|
|
1708
|
+
<span class="cstat-no" title="statement not covered" > and_conditions[namespace + "." + k] = setting.hide_if[j][k];</span>
|
|
1709
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1710
|
+
<span class="cstat-no" title="statement not covered" > r.push(and_conditions);</span>
|
|
1711
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1712
|
+
<span class="cstat-no" title="statement not covered" > setting.hide_if = r;</span>
|
|
1713
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1714
|
+
<span class="cstat-no" title="statement not covered" > else if (typeof setting.hide_if === "object") {</span>
|
|
1715
|
+
<span class="cstat-no" title="statement not covered" > const r = {};</span>
|
|
1716
|
+
<span class="cstat-no" title="statement not covered" > for (const k in setting.hide_if) {</span>
|
|
1717
|
+
<span class="cstat-no" title="statement not covered" > r[namespace + "." + k] = setting.hide_if[k];</span>
|
|
1718
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1719
|
+
<span class="cstat-no" title="statement not covered" > setting.hide_if = r;</span>
|
|
1720
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1721
|
+
<span class="cstat-no" title="statement not covered" > // Else pass through unmodified: to support literal true/false values.</span>
|
|
1722
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1723
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1724
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1725
|
+
|
|
1726
|
+
async function resolveImports(config, template_dir) {
|
|
1727
|
+
const settings = config.settings;
|
|
1728
|
+
if (!settings) { return config; }
|
|
1729
|
+
<span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
|
|
1730
|
+
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < settings.length; i++) {</span>
|
|
1731
|
+
<span class="cstat-no" title="statement not covered" > const setting = settings[i];</span>
|
|
1732
|
+
<span class="cstat-no" title="statement not covered" > if (typeof setting === "object" && "import" in setting) {</span>
|
|
1733
|
+
<span class="cstat-no" title="statement not covered" > const imported_resolved = nodeResolve.sync(path.join(setting.import, "settings.yml"), { basedir: template_dir });</span>
|
|
1734
|
+
<span class="cstat-no" title="statement not covered" > const imported_settings = await readYaml(imported_resolved);</span>
|
|
1735
|
+
<span class="cstat-no" title="statement not covered" > qualifyNames(imported_settings, setting.property);</span>
|
|
1736
|
+
<span class="cstat-no" title="statement not covered" > if ("overrides" in setting) {</span>
|
|
1737
|
+
<span class="cstat-no" title="statement not covered" > setting.overrides.forEach(function(override) {</span>
|
|
1738
|
+
<span class="cstat-no" title="statement not covered" > const use_tags = override.tag;</span>
|
|
1739
|
+
<span class="cstat-no" title="statement not covered" > let settings_to_target = [];</span>
|
|
1740
|
+
<span class="cstat-no" title="statement not covered" > if (use_tags) { settings_to_target = Array.isArray(override.tag) ? override.tag : [override.tag]; }</span>
|
|
1741
|
+
<span class="cstat-no" title="statement not covered" > else { settings_to_target = Array.isArray(override.property) ? override.property : [override.property]; }</span>
|
|
1742
|
+
<span class="cstat-no" title="statement not covered" > const method = override.method || "replace";</span>
|
|
1743
|
+
<span class="cstat-no" title="statement not covered" > for (let target of settings_to_target) {</span>
|
|
1744
|
+
<span class="cstat-no" title="statement not covered" > const settings_to_override = imported_settings.filter(function(setting) {</span>
|
|
1745
|
+
<span class="cstat-no" title="statement not covered" > if (use_tags) {</span>
|
|
1746
|
+
<span class="cstat-no" title="statement not covered" > if (!setting.tag) { return false; }</span>
|
|
1747
|
+
<span class="cstat-no" title="statement not covered" > const setting_tags = Array.isArray(setting.tag) ? setting.tag : [setting.tag];</span>
|
|
1748
|
+
<span class="cstat-no" title="statement not covered" > return setting_tags.includes(target);</span>
|
|
1749
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1750
|
+
<span class="cstat-no" title="statement not covered" > return setting.property === target;</span>
|
|
1751
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1752
|
+
<span class="cstat-no" title="statement not covered" > if (!settings_to_override.length) { continue; }</span>
|
|
1753
|
+
<span class="cstat-no" title="statement not covered" > for (let name in override) {</span>
|
|
1754
|
+
<span class="cstat-no" title="statement not covered" > for (const s of settings_to_override) {</span>
|
|
1755
|
+
<span class="cstat-no" title="statement not covered" > if (name === "property" || name === "tag" || name === "method") { continue; }</span>
|
|
1756
|
+
<span class="cstat-no" title="statement not covered" > if (method === "extend") {</span>
|
|
1757
|
+
<span class="cstat-no" title="statement not covered" > if (["show_if", "hide_if"].includes(name) && typeof override[name] === "boolean") {</span>
|
|
1758
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Cannot extend a ${name} with Boolean value for property ${s.property}`);</span>
|
|
1759
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1760
|
+
<span class="cstat-no" title="statement not covered" > let extendee = s[name];</span>
|
|
1761
|
+
<span class="cstat-no" title="statement not covered" > if (extendee === undefined) {</span>
|
|
1762
|
+
<span class="cstat-no" title="statement not covered" > if (name === "show_if" && s.hide_if !== undefined) {</span>
|
|
1763
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Cannot extend a show_if when hide_if defined for property ${s.property}`);</span>
|
|
1764
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1765
|
+
<span class="cstat-no" title="statement not covered" > else if (name === "hide_if" && s.show_if !== undefined) {</span>
|
|
1766
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Cannot extend a hide_if when show_if defined for property ${s.property}`);</span>
|
|
1767
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1768
|
+
<span class="cstat-no" title="statement not covered" > extendee = {};</span>
|
|
1769
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1770
|
+
<span class="cstat-no" title="statement not covered" > if (name === "show_if" || name === "hide_if") {</span>
|
|
1771
|
+
<span class="cstat-no" title="statement not covered" > let template_overrides = override[name];</span>
|
|
1772
|
+
<span class="cstat-no" title="statement not covered" > let module_overrides = extendee;</span>
|
|
1773
|
+
<span class="cstat-no" title="statement not covered" > if (!Array.isArray(template_overrides)) {</span>
|
|
1774
|
+
<span class="cstat-no" title="statement not covered" > template_overrides = [template_overrides];</span>
|
|
1775
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1776
|
+
<span class="cstat-no" title="statement not covered" > if (!Array.isArray(module_overrides)) {</span>
|
|
1777
|
+
<span class="cstat-no" title="statement not covered" > module_overrides = [module_overrides];</span>
|
|
1778
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1779
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1780
|
+
<span class="cstat-no" title="statement not covered" > let combined_conditions = [];</span>
|
|
1781
|
+
<span class="cstat-no" title="statement not covered" > template_overrides.forEach(t => {</span>
|
|
1782
|
+
<span class="cstat-no" title="statement not covered" > module_overrides.forEach(m => {</span>
|
|
1783
|
+
<span class="cstat-no" title="statement not covered" > m = extendItem(m, t);</span>
|
|
1784
|
+
<span class="cstat-no" title="statement not covered" > combined_conditions.push(m);</span>
|
|
1785
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1786
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1787
|
+
<span class="cstat-no" title="statement not covered" > s[name] = combined_conditions;</span>
|
|
1788
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1789
|
+
<span class="cstat-no" title="statement not covered" > else { s[name] = extendItem(extendee, override[name]); }</span>
|
|
1790
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1791
|
+
<span class="cstat-no" title="statement not covered" > else {</span>
|
|
1792
|
+
<span class="cstat-no" title="statement not covered" > s[name] = override[name];</span>
|
|
1793
|
+
<span class="cstat-no" title="statement not covered" > if (name === "show_if" && s.hide_if) { delete s.hide_if; }</span>
|
|
1794
|
+
<span class="cstat-no" title="statement not covered" > else if (name === "hide_if" && s.show_if) { delete s.show_if; }</span>
|
|
1795
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1796
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1797
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1798
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1799
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1800
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1801
|
+
<span class="cstat-no" title="statement not covered" > for (let s of imported_settings) {</span>
|
|
1802
|
+
<span class="cstat-no" title="statement not covered" > if (typeof s !== "object") { continue; }</span>
|
|
1803
|
+
<span class="cstat-no" title="statement not covered" > s.property = setting.property + "." + s.property;</span>
|
|
1804
|
+
<span class="cstat-no" title="statement not covered" > if (setting.show_condition) { s.show_condition = setting.show_condition.slice(); }</span>
|
|
1805
|
+
<span class="cstat-no" title="statement not covered" > addShowCondition(s);</span>
|
|
1806
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1807
|
+
<span class="cstat-no" title="statement not covered" > settings.splice.apply(settings, [i, 1].concat(imported_settings));</span>
|
|
1808
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1809
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1810
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1811
|
+
<span class="cstat-no" title="statement not covered" > return config;</span>
|
|
1812
|
+
}
|
|
1813
|
+
|
|
1814
|
+
// Sets a default binding data_type of string in templates with both typed and untyped bindings, and return a post-publish warning message.
|
|
1815
|
+
function checkDataTypes(config) {
|
|
1816
|
+
const warnings = [];
|
|
1817
|
+
if (!config.data) { return { config, warnings }; }
|
|
1818
|
+
<span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
|
|
1819
|
+
<span class="cstat-no" title="statement not covered" > const all_bindings = config.data.filter(binding => typeof binding !== "string"); // filter out title and description strings</span>
|
|
1820
|
+
<span class="cstat-no" title="statement not covered" > const any_bindings_are_typed = all_bindings.some(binding => binding.data_type);</span>
|
|
1821
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1822
|
+
<span class="cstat-no" title="statement not covered" > if (any_bindings_are_typed) {</span>
|
|
1823
|
+
<span class="cstat-no" title="statement not covered" > config.data.forEach(binding => {</span>
|
|
1824
|
+
<span class="cstat-no" title="statement not covered" > if (typeof binding === "string") { return; }</span>
|
|
1825
|
+
<span class="cstat-no" title="statement not covered" > if (!binding.data_type) {</span>
|
|
1826
|
+
<span class="cstat-no" title="statement not covered" > binding.data_type = "string";</span>
|
|
1827
|
+
<span class="cstat-no" title="statement not covered" > warnings.push(`Missing data_type for key ${binding.key} in dataset ${binding.dataset} - assuming "string"`);</span>
|
|
1828
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1829
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1830
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1831
|
+
<span class="cstat-no" title="statement not covered" > return { config, warnings };</span>
|
|
1832
|
+
}
|
|
1833
|
+
|
|
1834
|
+
function readAndValidateConfig(template_dir) {
|
|
1835
|
+
return readConfig(template_dir)
|
|
1836
|
+
.then((config) => {
|
|
1837
|
+
validateConfig(config, template_dir);
|
|
1838
|
+
return config;
|
|
1839
|
+
})
|
|
1840
|
+
.then(config => addShowConditions(config))
|
|
1841
|
+
.then(config => resolveImports(config, template_dir))
|
|
1842
|
+
.then(config => checkDataTypes(config));
|
|
1843
|
+
}
|
|
1844
|
+
|
|
1845
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function changeVersionNumberInPackageJson(template_dir, change_function) {</span></span>
|
|
1846
|
+
<span class="cstat-no" title="statement not covered" > if (!fs.existsSync(path.join(template_dir, "package.json"))) {</span>
|
|
1847
|
+
<span class="cstat-no" title="statement not covered" > throw new Error("There is no version number in template.yml, and no package.json");</span>
|
|
1848
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1849
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1850
|
+
<span class="cstat-no" title="statement not covered" > return readJson(path.join(template_dir, "package.json"))</span>
|
|
1851
|
+
<span class="cstat-no" title="statement not covered" > .then(json => {</span>
|
|
1852
|
+
<span class="cstat-no" title="statement not covered" > if (!json.version) {</span>
|
|
1853
|
+
<span class="cstat-no" title="statement not covered" > throw new Error("There is no version number in template.yml or package.json");</span>
|
|
1854
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1855
|
+
<span class="cstat-no" title="statement not covered" > const v = semver.parse(json.version);</span>
|
|
1856
|
+
<span class="cstat-no" title="statement not covered" > change_function(v);</span>
|
|
1857
|
+
<span class="cstat-no" title="statement not covered" > json.version = semver.join(v);</span>
|
|
1858
|
+
<span class="cstat-no" title="statement not covered" > return writePackageJson(template_dir, json);</span>
|
|
1859
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1860
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1861
|
+
|
|
1862
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function changeVersionNumber(template_dir, change_function) {</span></span>
|
|
1863
|
+
<span class="cstat-no" title="statement not covered" > return readYaml(path.join(template_dir, "template.yml"))</span>
|
|
1864
|
+
<span class="cstat-no" title="statement not covered" > .then(yaml => {</span>
|
|
1865
|
+
<span class="cstat-no" title="statement not covered" > if (!yaml.version) {</span>
|
|
1866
|
+
<span class="cstat-no" title="statement not covered" > return changeVersionNumberInPackageJson(template_dir, change_function);</span>
|
|
1867
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1868
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1869
|
+
<span class="cstat-no" title="statement not covered" > const v = semver.parse(yaml.version);</span>
|
|
1870
|
+
<span class="cstat-no" title="statement not covered" > change_function(v);</span>
|
|
1871
|
+
<span class="cstat-no" title="statement not covered" > yaml.version = semver.join(v);</span>
|
|
1872
|
+
<span class="cstat-no" title="statement not covered" > return writeConfig(template_dir, yaml);</span>
|
|
1873
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1874
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1875
|
+
|
|
1876
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function incrementPrereleaseTag(template_dir) {</span></span>
|
|
1877
|
+
<span class="cstat-no" title="statement not covered" > return changeVersionNumber(template_dir, v => {</span>
|
|
1878
|
+
<span class="cstat-no" title="statement not covered" > if (v.length == 3) {</span>
|
|
1879
|
+
<span class="cstat-no" title="statement not covered" > v[2] += 1;</span>
|
|
1880
|
+
<span class="cstat-no" title="statement not covered" > v.push("prerelease", 1);</span>
|
|
1881
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1882
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1883
|
+
<span class="cstat-no" title="statement not covered" > if (typeof v[v.length - 1] === "number") {</span>
|
|
1884
|
+
<span class="cstat-no" title="statement not covered" > v[v.length - 1] += 1;</span>
|
|
1885
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1886
|
+
<span class="cstat-no" title="statement not covered" > else { v.push(1); }</span>
|
|
1887
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1888
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1889
|
+
|
|
1890
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function removePrereleaseTag(template_dir) {</span></span>
|
|
1891
|
+
<span class="cstat-no" title="statement not covered" > return changeVersionNumber(template_dir, v => {</span>
|
|
1892
|
+
<span class="cstat-no" title="statement not covered" > if (v.length == 3) {</span>
|
|
1893
|
+
<span class="cstat-no" title="statement not covered" > throw new Error("There is no prerelease tag to remove.");</span>
|
|
1894
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1895
|
+
<span class="cstat-no" title="statement not covered" > v.splice(3);</span>
|
|
1896
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1897
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1898
|
+
|
|
1899
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function incrementPatchVersion(template_dir) {</span></span>
|
|
1900
|
+
<span class="cstat-no" title="statement not covered" > return changeVersionNumber(template_dir, v => {</span>
|
|
1901
|
+
<span class="cstat-no" title="statement not covered" > v[2] += 1;</span>
|
|
1902
|
+
<span class="cstat-no" title="statement not covered" > v.splice(3);</span>
|
|
1903
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1904
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1905
|
+
|
|
1906
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function installNodeModules(template_dir, node_env) {</span></span>
|
|
1907
|
+
<span class="cstat-no" title="statement not covered" > if (fs.existsSync(path.join(template_dir, "package.json"))</span>
|
|
1908
|
+
<span class="cstat-no" title="statement not covered" > && !fs.existsSync(path.join(template_dir, "node_modules")))</span>
|
|
1909
|
+
<span class="cstat-no" title="statement not covered" > {</span>
|
|
1910
|
+
<span class="cstat-no" title="statement not covered" > if (fs.existsSync(path.join(template_dir, "package-lock.json"))) {</span>
|
|
1911
|
+
<span class="cstat-no" title="statement not covered" > return runBuildCommand(template_dir, "npm ci", node_env);</span>
|
|
1912
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1913
|
+
<span class="cstat-no" title="statement not covered" > return runBuildCommand(template_dir, "npm install", node_env);</span>
|
|
1914
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1915
|
+
<span class="cstat-no" title="statement not covered" > else {</span>
|
|
1916
|
+
<span class="cstat-no" title="statement not covered" > return Promise.resolve();</span>
|
|
1917
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1918
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1919
|
+
|
|
1920
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function buildRules(template_dir) {</span></span>
|
|
1921
|
+
<span class="cstat-no" title="statement not covered" > return readConfig(template_dir)</span>
|
|
1922
|
+
<span class="cstat-no" title="statement not covered" > .then((config) => {</span>
|
|
1923
|
+
<span class="cstat-no" title="statement not covered" > const build_rules = [];</span>
|
|
1924
|
+
<span class="cstat-no" title="statement not covered" > for (let key in config.build) {</span>
|
|
1925
|
+
<span class="cstat-no" title="statement not covered" > build_rules.push(Object.assign({ key }, config.build[key]));</span>
|
|
1926
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1927
|
+
<span class="cstat-no" title="statement not covered" > return build_rules;</span>
|
|
1928
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1929
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1930
|
+
|
|
1931
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function writeConfig(template_dir, config) {</span></span>
|
|
1932
|
+
<span class="cstat-no" title="statement not covered" > return new Promise(function(resolve, reject) {</span>
|
|
1933
|
+
<span class="cstat-no" title="statement not covered" > const config_file = path.join(template_dir, "template.yml");</span>
|
|
1934
|
+
<span class="cstat-no" title="statement not covered" > fs.writeFile(config_file, yaml.safeDump(config, YAML_DUMP_OPTS), function(error) {</span>
|
|
1935
|
+
<span class="cstat-no" title="statement not covered" > if (error) { return reject(new Error(`Failed to write ${config_file}: ${error.message}`)); }</span>
|
|
1936
|
+
<span class="cstat-no" title="statement not covered" > return resolve();</span>
|
|
1937
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1938
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1939
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1940
|
+
|
|
1941
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function writePackageJson(template_dir, json) {</span></span>
|
|
1942
|
+
<span class="cstat-no" title="statement not covered" > return new Promise(function(resolve, reject) {</span>
|
|
1943
|
+
<span class="cstat-no" title="statement not covered" > const package_json_file = path.join(template_dir, "package.json");</span>
|
|
1944
|
+
<span class="cstat-no" title="statement not covered" > fs.writeFile(package_json_file, JSON.stringify(json, null, 2) + "\n", function(error) {</span>
|
|
1945
|
+
<span class="cstat-no" title="statement not covered" > if (error) { return reject(new Error(`Failed to write ${package_json_file}: ${error.message}`)); }</span>
|
|
1946
|
+
<span class="cstat-no" title="statement not covered" > return resolve();</span>
|
|
1947
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1948
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1949
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1950
|
+
|
|
1951
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function checkTemplateVersion(template_dir) {</span></span>
|
|
1952
|
+
<span class="cstat-no" title="statement not covered" > return readConfig(template_dir).then(config => {</span>
|
|
1953
|
+
<span class="cstat-no" title="statement not covered" > const template_sdk_version = config.sdk_version;</span>
|
|
1954
|
+
<span class="cstat-no" title="statement not covered" > if (!template_sdk_version) {</span>
|
|
1955
|
+
<span class="cstat-no" title="statement not covered" > throw new Error("Template does not specify an sdk_version");</span>
|
|
1956
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1957
|
+
<span class="cstat-no" title="statement not covered" > if (template_sdk_version < SDK_MAJOR_VERSION_COMPAT) {</span>
|
|
1958
|
+
<span class="cstat-no" title="statement not covered" > throw new Error("This template was built for an older version of Flourish. Try running 'flourish upgrade'");</span>
|
|
1959
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1960
|
+
<span class="cstat-no" title="statement not covered" > if (template_sdk_version > SDK_MAJOR_VERSION) {</span>
|
|
1961
|
+
<span class="cstat-no" title="statement not covered" > throw new Error("This template was built for an newer version of Flourish than you have. Try updating the SDK.");</span>
|
|
1962
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1963
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1964
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1965
|
+
|
|
1966
|
+
// Files and directories in a template that are treated specially by Flourish
|
|
1967
|
+
const TEMPLATE_SPECIAL_FILES = new Set([
|
|
1968
|
+
"index.html", "template.js", "template.yml", "thumbnail.png", "thumbnail.jpg", "README.md",
|
|
1969
|
+
]);
|
|
1970
|
+
const TEMPLATE_SPECIAL_DIRECTORIES = new Set([
|
|
1971
|
+
"static", "data",
|
|
1972
|
+
]);
|
|
1973
|
+
const TEMPLATE_SPECIAL = new Set([
|
|
1974
|
+
"index.html", "template.js", "template.yml", "thumbnail.png", "thumbnail.jpg", "README.md",
|
|
1975
|
+
"static", "data",
|
|
1976
|
+
]);
|
|
1977
|
+
|
|
1978
|
+
module.exports = {
|
|
1979
|
+
checkTemplateVersion,
|
|
1980
|
+
|
|
1981
|
+
getSdkToken, setSdkToken, deleteSdkTokens, deleteSdkToken,
|
|
1982
|
+
request,
|
|
1983
|
+
runBuildCommand, buildTemplate,
|
|
1984
|
+
readConfig, readAndValidateConfig, writeConfig, buildRules,
|
|
1985
|
+
incrementPrereleaseTag, removePrereleaseTag, incrementPatchVersion,
|
|
1986
|
+
|
|
1987
|
+
TEMPLATE_SPECIAL_FILES, TEMPLATE_SPECIAL_DIRECTORIES, TEMPLATE_SPECIAL, SDK_VERSION, SDK_MAJOR_VERSION,
|
|
1988
|
+
};
|
|
1989
|
+
</pre></td></tr></table></pre>
|
|
1990
|
+
|
|
1991
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
1992
|
+
</div><!-- /wrapper -->
|
|
1993
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
1994
|
+
Code coverage generated by
|
|
1995
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1996
|
+
at 2025-09-14T22:52:55.226Z
|
|
1997
|
+
</div>
|
|
1998
|
+
<script src="../prettify.js"></script>
|
|
1999
|
+
<script>
|
|
2000
|
+
window.onload = function () {
|
|
2001
|
+
prettyPrint();
|
|
2002
|
+
};
|
|
2003
|
+
</script>
|
|
2004
|
+
<script src="../sorter.js"></script>
|
|
2005
|
+
<script src="../block-navigation.js"></script>
|
|
2006
|
+
</body>
|
|
2007
|
+
</html>
|
|
2008
|
+
|