@basementuniverse/kanbn 1.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +2 -0
  2. package/coverage/base.css +224 -0
  3. package/coverage/block-navigation.js +87 -0
  4. package/coverage/coverage-summary.json +31 -0
  5. package/coverage/favicon.png +0 -0
  6. package/coverage/index.html +146 -0
  7. package/coverage/kanbn/index.html +116 -0
  8. package/coverage/kanbn/index.js.html +217 -0
  9. package/coverage/kanbn/src/board.js.html +646 -0
  10. package/coverage/kanbn/src/controller/add.js.html +1729 -0
  11. package/coverage/kanbn/src/controller/archive.js.html +277 -0
  12. package/coverage/kanbn/src/controller/board.js.html +217 -0
  13. package/coverage/kanbn/src/controller/burndown.js.html +607 -0
  14. package/coverage/kanbn/src/controller/comment.js.html +397 -0
  15. package/coverage/kanbn/src/controller/edit.js.html +2920 -0
  16. package/coverage/kanbn/src/controller/find.js.html +1597 -0
  17. package/coverage/kanbn/src/controller/gantt.js.html +1342 -0
  18. package/coverage/kanbn/src/controller/help.js.html +115 -0
  19. package/coverage/kanbn/src/controller/history.js.html +400 -0
  20. package/coverage/kanbn/src/controller/index.html +431 -0
  21. package/coverage/kanbn/src/controller/init.js.html +511 -0
  22. package/coverage/kanbn/src/controller/move.js.html +514 -0
  23. package/coverage/kanbn/src/controller/remove-all.js.html +226 -0
  24. package/coverage/kanbn/src/controller/remove.js.html +307 -0
  25. package/coverage/kanbn/src/controller/rename.js.html +397 -0
  26. package/coverage/kanbn/src/controller/restore.js.html +268 -0
  27. package/coverage/kanbn/src/controller/sort.js.html +1318 -0
  28. package/coverage/kanbn/src/controller/sprint.js.html +361 -0
  29. package/coverage/kanbn/src/controller/status.js.html +310 -0
  30. package/coverage/kanbn/src/controller/task.js.html +244 -0
  31. package/coverage/kanbn/src/controller/validate.js.html +367 -0
  32. package/coverage/kanbn/src/controller/version.js.html +100 -0
  33. package/coverage/kanbn/src/index.html +191 -0
  34. package/coverage/kanbn/src/main.js.html +9787 -0
  35. package/coverage/kanbn/src/parse-index.js.html +1063 -0
  36. package/coverage/kanbn/src/parse-markdown.js.html +202 -0
  37. package/coverage/kanbn/src/parse-task.js.html +2191 -0
  38. package/coverage/kanbn/src/utility.js.html +616 -0
  39. package/coverage/lcov.info +11837 -0
  40. package/coverage/prettify.css +1 -0
  41. package/coverage/prettify.js +2 -0
  42. package/coverage/sort-arrow-sprite.png +0 -0
  43. package/coverage/sorter.js +210 -0
  44. package/coverage/tmp/coverage-214292-1787777191526-0.json +1 -0
  45. package/coverage/tmp/coverage-214293-1787777184569-0.json +1 -0
  46. package/docs/advanced-configuration.md +2 -0
  47. package/docs/commands/add.txt +10 -0
  48. package/docs/commands/board.txt +3 -1
  49. package/docs/commands/burndown.txt +2 -4
  50. package/docs/commands/edit.txt +22 -0
  51. package/docs/commands/find.txt +45 -1
  52. package/docs/commands/help.txt +1 -0
  53. package/docs/commands/move.txt +1 -1
  54. package/docs/commands/sort.txt +13 -2
  55. package/docs/commands/validate.txt +12 -0
  56. package/docs/filtering-and-sorting.md +218 -0
  57. package/docs/index-structure.md +68 -19
  58. package/docs/index.md +26 -2
  59. package/docs/migration-2.0.md +92 -0
  60. package/docs/quick-start.md +37 -1
  61. package/docs/task-structure.md +12 -3
  62. package/docs/views.md +229 -0
  63. package/example/README.md +70 -0
  64. package/example/advanced/.kanbn/index.md +26 -0
  65. package/example/advanced/.kanbn/tasks/add-rate-limiting.md +18 -0
  66. package/example/advanced/.kanbn/tasks/add-sso-support.md +15 -0
  67. package/example/advanced/.kanbn/tasks/migrate-to-new-cdn.md +14 -0
  68. package/example/advanced/.kanbn/tasks/refresh-marketing-site.md +14 -0
  69. package/example/advanced/.kanbn/tasks/rotate-api-keys.md +15 -0
  70. package/example/advanced/.kanbn/tasks/split-billing-service.md +17 -0
  71. package/example/advanced/.kanbn/tasks/upgrade-node-runtime.md +19 -0
  72. package/example/advanced/kanbn.yml +59 -0
  73. package/example/views/.kanbn/index.md +140 -0
  74. package/example/views/.kanbn/tasks/add-audit-log-export.md +18 -0
  75. package/example/views/.kanbn/tasks/add-dark-mode-toggle.md +16 -0
  76. package/example/views/.kanbn/tasks/build-webhook-retry-queue.md +15 -0
  77. package/example/views/.kanbn/tasks/fix-avatar-upload-crash.md +13 -0
  78. package/example/views/.kanbn/tasks/fix-expired-session-redirect.md +15 -0
  79. package/example/views/.kanbn/tasks/investigate-offline-mode.md +12 -0
  80. package/example/views/.kanbn/tasks/rewrite-search-indexer.md +12 -0
  81. package/example/views/.kanbn/tasks/tidy-up-settings-copy.md +12 -0
  82. package/package.json +4 -3
  83. package/routes/edit.json +2 -1
  84. package/routes/validate.json +4 -2
  85. package/skills/kanbn-plan/references/index-structure.md +1 -0
  86. package/skills/kanbn-plan/references/task-structure.md +2 -0
  87. package/src/board.js +1 -0
  88. package/src/controller/board.js +6 -0
  89. package/src/controller/edit.js +65 -12
  90. package/src/controller/gantt.js +46 -1
  91. package/src/controller/status.js +12 -0
  92. package/src/controller/task.js +1 -1
  93. package/src/controller/validate.js +78 -15
  94. package/src/main.js +324 -152
  95. package/src/parse-index.js +3 -0
  96. package/src/parse-markdown.js +3 -1
  97. package/src/parse-task.js +28 -1
  98. package/src/utility.js +26 -1
  99. /package/example/{.kanbn → basic/.kanbn}/index.md +0 -0
  100. /package/example/{.kanbn → basic/.kanbn}/tasks/add-basic-activity-feed.md +0 -0
  101. /package/example/{.kanbn → basic/.kanbn}/tasks/add-passwordless-login-option.md +0 -0
  102. /package/example/{.kanbn → basic/.kanbn}/tasks/add-usage-alert-email-thresholds.md +0 -0
  103. /package/example/{.kanbn → basic/.kanbn}/tasks/build-email-template-system.md +0 -0
  104. /package/example/{.kanbn → basic/.kanbn}/tasks/build-invoice-download-endpoint.md +0 -0
  105. /package/example/{.kanbn → basic/.kanbn}/tasks/build-tenant-settings-page.md +0 -0
  106. /package/example/{.kanbn → basic/.kanbn}/tasks/create-organization-switcher.md +0 -0
  107. /package/example/{.kanbn → basic/.kanbn}/tasks/create-sandbox-environment-provisioner.md +0 -0
  108. /package/example/{.kanbn → basic/.kanbn}/tasks/create-self-serve-cancellation-flow.md +0 -0
  109. /package/example/{.kanbn → basic/.kanbn}/tasks/define-product-pricing-strategy.md +0 -0
  110. /package/example/{.kanbn → basic/.kanbn}/tasks/design-onboarding-checklist.md +0 -0
  111. /package/example/{.kanbn → basic/.kanbn}/tasks/design-team-invite-expiry-flow.md +0 -0
  112. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-data-retention-policy-jobs.md +0 -0
  113. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-feature-flags-foundation.md +0 -0
  114. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-project-creation-wizard.md +0 -0
  115. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-stripe-webhook-signature-check.md +0 -0
  116. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-team-permissions-ui.md +0 -0
  117. /package/example/{.kanbn → basic/.kanbn}/tasks/implement-user-signup-and-login.md +0 -0
  118. /package/example/{.kanbn → basic/.kanbn}/tasks/integrate-crm-lead-sync.md +0 -0
  119. /package/example/{.kanbn → basic/.kanbn}/tasks/legal-review-terms-and-privacy.md +0 -0
  120. /package/example/{.kanbn → basic/.kanbn}/tasks/migrate-legacy-events-to-new-schema.md +0 -0
  121. /package/example/{.kanbn → basic/.kanbn}/tasks/optimize-dashboard-first-load.md +0 -0
  122. /package/example/{.kanbn → basic/.kanbn}/tasks/prototype-report-export-scheduler.md +0 -0
  123. /package/example/{.kanbn → basic/.kanbn}/tasks/publish-internal-qa-checklist.md +0 -0
  124. /package/example/{.kanbn → basic/.kanbn}/tasks/setup-ci-pipeline.md +0 -0
@@ -0,0 +1,2191 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for kanbn/src/parse-task.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">kanbn/src</a> parse-task.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">93.44% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>656/702</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">85.79% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>157/183</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>11/11</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">93.44% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>656/702</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a>
672
+ <a name='L607'></a><a href='#L607'>607</a>
673
+ <a name='L608'></a><a href='#L608'>608</a>
674
+ <a name='L609'></a><a href='#L609'>609</a>
675
+ <a name='L610'></a><a href='#L610'>610</a>
676
+ <a name='L611'></a><a href='#L611'>611</a>
677
+ <a name='L612'></a><a href='#L612'>612</a>
678
+ <a name='L613'></a><a href='#L613'>613</a>
679
+ <a name='L614'></a><a href='#L614'>614</a>
680
+ <a name='L615'></a><a href='#L615'>615</a>
681
+ <a name='L616'></a><a href='#L616'>616</a>
682
+ <a name='L617'></a><a href='#L617'>617</a>
683
+ <a name='L618'></a><a href='#L618'>618</a>
684
+ <a name='L619'></a><a href='#L619'>619</a>
685
+ <a name='L620'></a><a href='#L620'>620</a>
686
+ <a name='L621'></a><a href='#L621'>621</a>
687
+ <a name='L622'></a><a href='#L622'>622</a>
688
+ <a name='L623'></a><a href='#L623'>623</a>
689
+ <a name='L624'></a><a href='#L624'>624</a>
690
+ <a name='L625'></a><a href='#L625'>625</a>
691
+ <a name='L626'></a><a href='#L626'>626</a>
692
+ <a name='L627'></a><a href='#L627'>627</a>
693
+ <a name='L628'></a><a href='#L628'>628</a>
694
+ <a name='L629'></a><a href='#L629'>629</a>
695
+ <a name='L630'></a><a href='#L630'>630</a>
696
+ <a name='L631'></a><a href='#L631'>631</a>
697
+ <a name='L632'></a><a href='#L632'>632</a>
698
+ <a name='L633'></a><a href='#L633'>633</a>
699
+ <a name='L634'></a><a href='#L634'>634</a>
700
+ <a name='L635'></a><a href='#L635'>635</a>
701
+ <a name='L636'></a><a href='#L636'>636</a>
702
+ <a name='L637'></a><a href='#L637'>637</a>
703
+ <a name='L638'></a><a href='#L638'>638</a>
704
+ <a name='L639'></a><a href='#L639'>639</a>
705
+ <a name='L640'></a><a href='#L640'>640</a>
706
+ <a name='L641'></a><a href='#L641'>641</a>
707
+ <a name='L642'></a><a href='#L642'>642</a>
708
+ <a name='L643'></a><a href='#L643'>643</a>
709
+ <a name='L644'></a><a href='#L644'>644</a>
710
+ <a name='L645'></a><a href='#L645'>645</a>
711
+ <a name='L646'></a><a href='#L646'>646</a>
712
+ <a name='L647'></a><a href='#L647'>647</a>
713
+ <a name='L648'></a><a href='#L648'>648</a>
714
+ <a name='L649'></a><a href='#L649'>649</a>
715
+ <a name='L650'></a><a href='#L650'>650</a>
716
+ <a name='L651'></a><a href='#L651'>651</a>
717
+ <a name='L652'></a><a href='#L652'>652</a>
718
+ <a name='L653'></a><a href='#L653'>653</a>
719
+ <a name='L654'></a><a href='#L654'>654</a>
720
+ <a name='L655'></a><a href='#L655'>655</a>
721
+ <a name='L656'></a><a href='#L656'>656</a>
722
+ <a name='L657'></a><a href='#L657'>657</a>
723
+ <a name='L658'></a><a href='#L658'>658</a>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a>
735
+ <a name='L670'></a><a href='#L670'>670</a>
736
+ <a name='L671'></a><a href='#L671'>671</a>
737
+ <a name='L672'></a><a href='#L672'>672</a>
738
+ <a name='L673'></a><a href='#L673'>673</a>
739
+ <a name='L674'></a><a href='#L674'>674</a>
740
+ <a name='L675'></a><a href='#L675'>675</a>
741
+ <a name='L676'></a><a href='#L676'>676</a>
742
+ <a name='L677'></a><a href='#L677'>677</a>
743
+ <a name='L678'></a><a href='#L678'>678</a>
744
+ <a name='L679'></a><a href='#L679'>679</a>
745
+ <a name='L680'></a><a href='#L680'>680</a>
746
+ <a name='L681'></a><a href='#L681'>681</a>
747
+ <a name='L682'></a><a href='#L682'>682</a>
748
+ <a name='L683'></a><a href='#L683'>683</a>
749
+ <a name='L684'></a><a href='#L684'>684</a>
750
+ <a name='L685'></a><a href='#L685'>685</a>
751
+ <a name='L686'></a><a href='#L686'>686</a>
752
+ <a name='L687'></a><a href='#L687'>687</a>
753
+ <a name='L688'></a><a href='#L688'>688</a>
754
+ <a name='L689'></a><a href='#L689'>689</a>
755
+ <a name='L690'></a><a href='#L690'>690</a>
756
+ <a name='L691'></a><a href='#L691'>691</a>
757
+ <a name='L692'></a><a href='#L692'>692</a>
758
+ <a name='L693'></a><a href='#L693'>693</a>
759
+ <a name='L694'></a><a href='#L694'>694</a>
760
+ <a name='L695'></a><a href='#L695'>695</a>
761
+ <a name='L696'></a><a href='#L696'>696</a>
762
+ <a name='L697'></a><a href='#L697'>697</a>
763
+ <a name='L698'></a><a href='#L698'>698</a>
764
+ <a name='L699'></a><a href='#L699'>699</a>
765
+ <a name='L700'></a><a href='#L700'>700</a>
766
+ <a name='L701'></a><a href='#L701'>701</a>
767
+ <a name='L702'></a><a href='#L702'>702</a>
768
+ <a name='L703'></a><a href='#L703'>703</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
769
+ <span class="cline-any cline-yes">1x</span>
770
+ <span class="cline-any cline-yes">1x</span>
771
+ <span class="cline-any cline-yes">1x</span>
772
+ <span class="cline-any cline-yes">1x</span>
773
+ <span class="cline-any cline-yes">1x</span>
774
+ <span class="cline-any cline-yes">1x</span>
775
+ <span class="cline-any cline-yes">1x</span>
776
+ <span class="cline-any cline-yes">1x</span>
777
+ <span class="cline-any cline-yes">1x</span>
778
+ <span class="cline-any cline-yes">1x</span>
779
+ <span class="cline-any cline-yes">1x</span>
780
+ <span class="cline-any cline-yes">369x</span>
781
+ <span class="cline-any cline-yes">369x</span>
782
+ <span class="cline-any cline-yes">369x</span>
783
+ <span class="cline-any cline-no">&nbsp;</span>
784
+ <span class="cline-any cline-no">&nbsp;</span>
785
+ <span class="cline-any cline-yes">369x</span>
786
+ <span class="cline-any cline-yes">380x</span>
787
+ <span class="cline-any cline-no">&nbsp;</span>
788
+ <span class="cline-any cline-no">&nbsp;</span>
789
+ <span class="cline-any cline-yes">380x</span>
790
+ <span class="cline-any cline-yes">380x</span>
791
+ <span class="cline-any cline-yes">380x</span>
792
+ <span class="cline-any cline-yes">380x</span>
793
+ <span class="cline-any cline-yes">380x</span>
794
+ <span class="cline-any cline-yes">369x</span>
795
+ <span class="cline-any cline-yes">369x</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-yes">1x</span>
801
+ <span class="cline-any cline-yes">393x</span>
802
+ <span class="cline-any cline-yes">393x</span>
803
+ <span class="cline-any cline-yes">393x</span>
804
+ <span class="cline-any cline-yes">393x</span>
805
+ <span class="cline-any cline-yes">393x</span>
806
+ <span class="cline-any cline-yes">393x</span>
807
+ <span class="cline-any cline-yes">393x</span>
808
+ <span class="cline-any cline-yes">393x</span>
809
+ <span class="cline-any cline-yes">393x</span>
810
+ <span class="cline-any cline-yes">393x</span>
811
+ <span class="cline-any cline-yes">393x</span>
812
+ <span class="cline-any cline-yes">393x</span>
813
+ <span class="cline-any cline-yes">393x</span>
814
+ <span class="cline-any cline-yes">393x</span>
815
+ <span class="cline-any cline-yes">393x</span>
816
+ <span class="cline-any cline-yes">393x</span>
817
+ <span class="cline-any cline-yes">393x</span>
818
+ <span class="cline-any cline-yes">393x</span>
819
+ <span class="cline-any cline-yes">393x</span>
820
+ <span class="cline-any cline-yes">393x</span>
821
+ <span class="cline-any cline-yes">393x</span>
822
+ <span class="cline-any cline-yes">393x</span>
823
+ <span class="cline-any cline-yes">393x</span>
824
+ <span class="cline-any cline-yes">393x</span>
825
+ <span class="cline-any cline-yes">393x</span>
826
+ <span class="cline-any cline-yes">393x</span>
827
+ <span class="cline-any cline-yes">393x</span>
828
+ <span class="cline-any cline-yes">393x</span>
829
+ <span class="cline-any cline-yes">393x</span>
830
+ <span class="cline-any cline-yes">393x</span>
831
+ <span class="cline-any cline-yes">393x</span>
832
+ <span class="cline-any cline-yes">393x</span>
833
+ <span class="cline-any cline-yes">393x</span>
834
+ <span class="cline-any cline-yes">393x</span>
835
+ <span class="cline-any cline-yes">393x</span>
836
+ <span class="cline-any cline-yes">393x</span>
837
+ <span class="cline-any cline-yes">393x</span>
838
+ <span class="cline-any cline-yes">393x</span>
839
+ <span class="cline-any cline-yes">393x</span>
840
+ <span class="cline-any cline-yes">393x</span>
841
+ <span class="cline-any cline-yes">393x</span>
842
+ <span class="cline-any cline-yes">393x</span>
843
+ <span class="cline-any cline-yes">393x</span>
844
+ <span class="cline-any cline-yes">393x</span>
845
+ <span class="cline-any cline-yes">393x</span>
846
+ <span class="cline-any cline-yes">393x</span>
847
+ <span class="cline-any cline-yes">393x</span>
848
+ <span class="cline-any cline-yes">393x</span>
849
+ <span class="cline-any cline-yes">393x</span>
850
+ <span class="cline-any cline-yes">393x</span>
851
+ <span class="cline-any cline-yes">393x</span>
852
+ <span class="cline-any cline-yes">393x</span>
853
+ <span class="cline-any cline-yes">393x</span>
854
+ <span class="cline-any cline-yes">393x</span>
855
+ <span class="cline-any cline-yes">393x</span>
856
+ <span class="cline-any cline-yes">393x</span>
857
+ <span class="cline-any cline-yes">2x</span>
858
+ <span class="cline-any cline-yes">2x</span>
859
+ <span class="cline-any cline-yes">393x</span>
860
+ <span class="cline-any cline-yes">1x</span>
861
+ <span class="cline-any cline-yes">1x</span>
862
+ <span class="cline-any cline-yes">1x</span>
863
+ <span class="cline-any cline-yes">1x</span>
864
+ <span class="cline-any cline-yes">1x</span>
865
+ <span class="cline-any cline-yes">619x</span>
866
+ <span class="cline-any cline-yes">619x</span>
867
+ <span class="cline-any cline-yes">619x</span>
868
+ <span class="cline-any cline-yes">619x</span>
869
+ <span class="cline-any cline-yes">619x</span>
870
+ <span class="cline-any cline-yes">619x</span>
871
+ <span class="cline-any cline-yes">619x</span>
872
+ <span class="cline-any cline-yes">619x</span>
873
+ <span class="cline-any cline-yes">619x</span>
874
+ <span class="cline-any cline-yes">619x</span>
875
+ <span class="cline-any cline-yes">619x</span>
876
+ <span class="cline-any cline-yes">619x</span>
877
+ <span class="cline-any cline-yes">619x</span>
878
+ <span class="cline-any cline-yes">619x</span>
879
+ <span class="cline-any cline-yes">619x</span>
880
+ <span class="cline-any cline-yes">619x</span>
881
+ <span class="cline-any cline-yes">619x</span>
882
+ <span class="cline-any cline-yes">619x</span>
883
+ <span class="cline-any cline-yes">619x</span>
884
+ <span class="cline-any cline-yes">619x</span>
885
+ <span class="cline-any cline-yes">1x</span>
886
+ <span class="cline-any cline-yes">1x</span>
887
+ <span class="cline-any cline-yes">619x</span>
888
+ <span class="cline-any cline-yes">1x</span>
889
+ <span class="cline-any cline-yes">1x</span>
890
+ <span class="cline-any cline-yes">1x</span>
891
+ <span class="cline-any cline-yes">1x</span>
892
+ <span class="cline-any cline-yes">1x</span>
893
+ <span class="cline-any cline-yes">572x</span>
894
+ <span class="cline-any cline-yes">572x</span>
895
+ <span class="cline-any cline-yes">572x</span>
896
+ <span class="cline-any cline-yes">572x</span>
897
+ <span class="cline-any cline-yes">572x</span>
898
+ <span class="cline-any cline-yes">572x</span>
899
+ <span class="cline-any cline-yes">572x</span>
900
+ <span class="cline-any cline-yes">572x</span>
901
+ <span class="cline-any cline-yes">572x</span>
902
+ <span class="cline-any cline-yes">572x</span>
903
+ <span class="cline-any cline-yes">572x</span>
904
+ <span class="cline-any cline-yes">572x</span>
905
+ <span class="cline-any cline-no">&nbsp;</span>
906
+ <span class="cline-any cline-no">&nbsp;</span>
907
+ <span class="cline-any cline-yes">572x</span>
908
+ <span class="cline-any cline-yes">1x</span>
909
+ <span class="cline-any cline-yes">1x</span>
910
+ <span class="cline-any cline-yes">1x</span>
911
+ <span class="cline-any cline-yes">1x</span>
912
+ <span class="cline-any cline-yes">1x</span>
913
+ <span class="cline-any cline-yes">567x</span>
914
+ <span class="cline-any cline-yes">567x</span>
915
+ <span class="cline-any cline-yes">567x</span>
916
+ <span class="cline-any cline-yes">567x</span>
917
+ <span class="cline-any cline-yes">567x</span>
918
+ <span class="cline-any cline-yes">567x</span>
919
+ <span class="cline-any cline-yes">567x</span>
920
+ <span class="cline-any cline-yes">567x</span>
921
+ <span class="cline-any cline-yes">567x</span>
922
+ <span class="cline-any cline-yes">567x</span>
923
+ <span class="cline-any cline-yes">567x</span>
924
+ <span class="cline-any cline-yes">567x</span>
925
+ <span class="cline-any cline-no">&nbsp;</span>
926
+ <span class="cline-any cline-no">&nbsp;</span>
927
+ <span class="cline-any cline-yes">567x</span>
928
+ <span class="cline-any cline-yes">1x</span>
929
+ <span class="cline-any cline-yes">1x</span>
930
+ <span class="cline-any cline-yes">1x</span>
931
+ <span class="cline-any cline-yes">1x</span>
932
+ <span class="cline-any cline-yes">1x</span>
933
+ <span class="cline-any cline-yes">112x</span>
934
+ <span class="cline-any cline-yes">112x</span>
935
+ <span class="cline-any cline-yes">112x</span>
936
+ <span class="cline-any cline-yes">112x</span>
937
+ <span class="cline-any cline-yes">112x</span>
938
+ <span class="cline-any cline-yes">112x</span>
939
+ <span class="cline-any cline-yes">112x</span>
940
+ <span class="cline-any cline-yes">112x</span>
941
+ <span class="cline-any cline-yes">112x</span>
942
+ <span class="cline-any cline-yes">112x</span>
943
+ <span class="cline-any cline-yes">112x</span>
944
+ <span class="cline-any cline-yes">112x</span>
945
+ <span class="cline-any cline-yes">112x</span>
946
+ <span class="cline-any cline-no">&nbsp;</span>
947
+ <span class="cline-any cline-no">&nbsp;</span>
948
+ <span class="cline-any cline-yes">112x</span>
949
+ <span class="cline-any cline-yes">1x</span>
950
+ <span class="cline-any cline-yes">1x</span>
951
+ <span class="cline-any cline-yes">1x</span>
952
+ <span class="cline-any cline-yes">1x</span>
953
+ <span class="cline-any cline-yes">1x</span>
954
+ <span class="cline-any cline-yes">123x</span>
955
+ <span class="cline-any cline-yes">123x</span>
956
+ <span class="cline-any cline-yes">123x</span>
957
+ <span class="cline-any cline-yes">123x</span>
958
+ <span class="cline-any cline-yes">123x</span>
959
+ <span class="cline-any cline-yes">123x</span>
960
+ <span class="cline-any cline-yes">123x</span>
961
+ <span class="cline-any cline-yes">123x</span>
962
+ <span class="cline-any cline-yes">123x</span>
963
+ <span class="cline-any cline-yes">123x</span>
964
+ <span class="cline-any cline-yes">123x</span>
965
+ <span class="cline-any cline-yes">123x</span>
966
+ <span class="cline-any cline-yes">123x</span>
967
+ <span class="cline-any cline-yes">123x</span>
968
+ <span class="cline-any cline-yes">123x</span>
969
+ <span class="cline-any cline-yes">123x</span>
970
+ <span class="cline-any cline-yes">123x</span>
971
+ <span class="cline-any cline-yes">123x</span>
972
+ <span class="cline-any cline-yes">123x</span>
973
+ <span class="cline-any cline-yes">123x</span>
974
+ <span class="cline-any cline-yes">123x</span>
975
+ <span class="cline-any cline-yes">123x</span>
976
+ <span class="cline-any cline-yes">123x</span>
977
+ <span class="cline-any cline-no">&nbsp;</span>
978
+ <span class="cline-any cline-no">&nbsp;</span>
979
+ <span class="cline-any cline-yes">123x</span>
980
+ <span class="cline-any cline-yes">1x</span>
981
+ <span class="cline-any cline-yes">1x</span>
982
+ <span class="cline-any cline-yes">1x</span>
983
+ <span class="cline-any cline-yes">1x</span>
984
+ <span class="cline-any cline-yes">1x</span>
985
+ <span class="cline-any cline-yes">102x</span>
986
+ <span class="cline-any cline-yes">102x</span>
987
+ <span class="cline-any cline-yes">102x</span>
988
+ <span class="cline-any cline-yes">102x</span>
989
+ <span class="cline-any cline-yes">102x</span>
990
+ <span class="cline-any cline-yes">102x</span>
991
+ <span class="cline-any cline-yes">102x</span>
992
+ <span class="cline-any cline-yes">102x</span>
993
+ <span class="cline-any cline-yes">102x</span>
994
+ <span class="cline-any cline-yes">102x</span>
995
+ <span class="cline-any cline-yes">102x</span>
996
+ <span class="cline-any cline-yes">102x</span>
997
+ <span class="cline-any cline-yes">102x</span>
998
+ <span class="cline-any cline-yes">102x</span>
999
+ <span class="cline-any cline-yes">102x</span>
1000
+ <span class="cline-any cline-yes">102x</span>
1001
+ <span class="cline-any cline-yes">102x</span>
1002
+ <span class="cline-any cline-yes">102x</span>
1003
+ <span class="cline-any cline-no">&nbsp;</span>
1004
+ <span class="cline-any cline-no">&nbsp;</span>
1005
+ <span class="cline-any cline-yes">102x</span>
1006
+ <span class="cline-any cline-yes">1x</span>
1007
+ <span class="cline-any cline-yes">1x</span>
1008
+ <span class="cline-any cline-yes">1x</span>
1009
+ <span class="cline-any cline-yes">1x</span>
1010
+ <span class="cline-any cline-yes">1x</span>
1011
+ <span class="cline-any cline-yes">1x</span>
1012
+ <span class="cline-any cline-yes">1x</span>
1013
+ <span class="cline-any cline-yes">1x</span>
1014
+ <span class="cline-any cline-yes">1x</span>
1015
+ <span class="cline-any cline-yes">1x</span>
1016
+ <span class="cline-any cline-yes">392x</span>
1017
+ <span class="cline-any cline-yes">392x</span>
1018
+ <span class="cline-any cline-yes">1x</span>
1019
+ <span class="cline-any cline-yes">1x</span>
1020
+ <span class="cline-any cline-yes">392x</span>
1021
+ <span class="cline-any cline-no">&nbsp;</span>
1022
+ <span class="cline-any cline-no">&nbsp;</span>
1023
+ <span class="cline-any cline-yes">391x</span>
1024
+ <span class="cline-any cline-yes">392x</span>
1025
+ <span class="cline-any cline-yes">157x</span>
1026
+ <span class="cline-any cline-no">&nbsp;</span>
1027
+ <span class="cline-any cline-no">&nbsp;</span>
1028
+ <span class="cline-any cline-yes">157x</span>
1029
+ <span class="cline-any cline-yes">392x</span>
1030
+ <span class="cline-any cline-yes">209x</span>
1031
+ <span class="cline-any cline-yes">1x</span>
1032
+ <span class="cline-any cline-yes">1x</span>
1033
+ <span class="cline-any cline-yes">208x</span>
1034
+ <span class="cline-any cline-yes">392x</span>
1035
+ <span class="cline-any cline-yes">5x</span>
1036
+ <span class="cline-any cline-no">&nbsp;</span>
1037
+ <span class="cline-any cline-no">&nbsp;</span>
1038
+ <span class="cline-any cline-yes">5x</span>
1039
+ <span class="cline-any cline-yes">392x</span>
1040
+ <span class="cline-any cline-yes">8x</span>
1041
+ <span class="cline-any cline-no">&nbsp;</span>
1042
+ <span class="cline-any cline-no">&nbsp;</span>
1043
+ <span class="cline-any cline-yes">8x</span>
1044
+ <span class="cline-any cline-yes">392x</span>
1045
+ <span class="cline-any cline-yes">6x</span>
1046
+ <span class="cline-any cline-no">&nbsp;</span>
1047
+ <span class="cline-any cline-no">&nbsp;</span>
1048
+ <span class="cline-any cline-yes">6x</span>
1049
+ <span class="cline-any cline-yes">392x</span>
1050
+ <span class="cline-any cline-yes">6x</span>
1051
+ <span class="cline-any cline-yes">392x</span>
1052
+ <span class="cline-any cline-yes">392x</span>
1053
+ <span class="cline-any cline-yes">1x</span>
1054
+ <span class="cline-any cline-yes">1x</span>
1055
+ <span class="cline-any cline-yes">1x</span>
1056
+ <span class="cline-any cline-yes">1x</span>
1057
+ <span class="cline-any cline-yes">1x</span>
1058
+ <span class="cline-any cline-yes">1x</span>
1059
+ <span class="cline-any cline-yes">1x</span>
1060
+ <span class="cline-any cline-yes">1x</span>
1061
+ <span class="cline-any cline-yes">1x</span>
1062
+ <span class="cline-any cline-yes">1x</span>
1063
+ <span class="cline-any cline-yes">1x</span>
1064
+ <span class="cline-any cline-yes">1x</span>
1065
+ <span class="cline-any cline-yes">1x</span>
1066
+ <span class="cline-any cline-yes">1x</span>
1067
+ <span class="cline-any cline-yes">1x</span>
1068
+ <span class="cline-any cline-yes">1x</span>
1069
+ <span class="cline-any cline-yes">1x</span>
1070
+ <span class="cline-any cline-yes">1x</span>
1071
+ <span class="cline-any cline-yes">1x</span>
1072
+ <span class="cline-any cline-yes">1x</span>
1073
+ <span class="cline-any cline-yes">1x</span>
1074
+ <span class="cline-any cline-yes">1x</span>
1075
+ <span class="cline-any cline-yes">1x</span>
1076
+ <span class="cline-any cline-yes">410x</span>
1077
+ <span class="cline-any cline-yes">410x</span>
1078
+ <span class="cline-any cline-yes">410x</span>
1079
+ <span class="cline-any cline-yes">410x</span>
1080
+ <span class="cline-any cline-yes">410x</span>
1081
+ <span class="cline-any cline-yes">5x</span>
1082
+ <span class="cline-any cline-yes">5x</span>
1083
+ <span class="cline-any cline-yes">410x</span>
1084
+ <span class="cline-any cline-yes">2x</span>
1085
+ <span class="cline-any cline-yes">2x</span>
1086
+ <span class="cline-any cline-yes">403x</span>
1087
+ <span class="cline-any cline-yes">403x</span>
1088
+ <span class="cline-any cline-yes">410x</span>
1089
+ <span class="cline-any cline-yes">278x</span>
1090
+ <span class="cline-any cline-yes">278x</span>
1091
+ <span class="cline-any cline-yes">278x</span>
1092
+ <span class="cline-any cline-yes">278x</span>
1093
+ <span class="cline-any cline-yes">1x</span>
1094
+ <span class="cline-any cline-yes">1x</span>
1095
+ <span class="cline-any cline-yes">278x</span>
1096
+ <span class="cline-any cline-yes">402x</span>
1097
+ <span class="cline-any cline-yes">402x</span>
1098
+ <span class="cline-any cline-yes">402x</span>
1099
+ <span class="cline-any cline-yes">402x</span>
1100
+ <span class="cline-any cline-yes">402x</span>
1101
+ <span class="cline-any cline-yes">410x</span>
1102
+ <span class="cline-any cline-yes">1x</span>
1103
+ <span class="cline-any cline-yes">1x</span>
1104
+ <span class="cline-any cline-yes">401x</span>
1105
+ <span class="cline-any cline-yes">401x</span>
1106
+ <span class="cline-any cline-yes">401x</span>
1107
+ <span class="cline-any cline-yes">410x</span>
1108
+ <span class="cline-any cline-yes">4x</span>
1109
+ <span class="cline-any cline-yes">4x</span>
1110
+ <span class="cline-any cline-yes">397x</span>
1111
+ <span class="cline-any cline-yes">397x</span>
1112
+ <span class="cline-any cline-yes">397x</span>
1113
+ <span class="cline-any cline-yes">397x</span>
1114
+ <span class="cline-any cline-yes">397x</span>
1115
+ <span class="cline-any cline-yes">397x</span>
1116
+ <span class="cline-any cline-yes">397x</span>
1117
+ <span class="cline-any cline-yes">397x</span>
1118
+ <span class="cline-any cline-yes">397x</span>
1119
+ <span class="cline-any cline-yes">410x</span>
1120
+ <span class="cline-any cline-yes">17x</span>
1121
+ <span class="cline-any cline-yes">17x</span>
1122
+ <span class="cline-any cline-yes">17x</span>
1123
+ <span class="cline-any cline-yes">17x</span>
1124
+ <span class="cline-any cline-yes">4x</span>
1125
+ <span class="cline-any cline-yes">4x</span>
1126
+ <span class="cline-any cline-yes">13x</span>
1127
+ <span class="cline-any cline-yes">13x</span>
1128
+ <span class="cline-any cline-yes">13x</span>
1129
+ <span class="cline-any cline-yes">13x</span>
1130
+ <span class="cline-any cline-yes">13x</span>
1131
+ <span class="cline-any cline-yes">393x</span>
1132
+ <span class="cline-any cline-yes">393x</span>
1133
+ <span class="cline-any cline-yes">393x</span>
1134
+ <span class="cline-any cline-yes">410x</span>
1135
+ <span class="cline-any cline-yes">2x</span>
1136
+ <span class="cline-any cline-yes">2x</span>
1137
+ <span class="cline-any cline-yes">2x</span>
1138
+ <span class="cline-any cline-yes">2x</span>
1139
+ <span class="cline-any cline-no">&nbsp;</span>
1140
+ <span class="cline-any cline-no">&nbsp;</span>
1141
+ <span class="cline-any cline-yes">410x</span>
1142
+ <span class="cline-any cline-yes">2x</span>
1143
+ <span class="cline-any cline-yes">2x</span>
1144
+ <span class="cline-any cline-yes">2x</span>
1145
+ <span class="cline-any cline-yes">2x</span>
1146
+ <span class="cline-any cline-no">&nbsp;</span>
1147
+ <span class="cline-any cline-no">&nbsp;</span>
1148
+ <span class="cline-any cline-yes">410x</span>
1149
+ <span class="cline-any cline-yes">2x</span>
1150
+ <span class="cline-any cline-yes">2x</span>
1151
+ <span class="cline-any cline-yes">2x</span>
1152
+ <span class="cline-any cline-yes">2x</span>
1153
+ <span class="cline-any cline-no">&nbsp;</span>
1154
+ <span class="cline-any cline-no">&nbsp;</span>
1155
+ <span class="cline-any cline-yes">410x</span>
1156
+ <span class="cline-any cline-yes">2x</span>
1157
+ <span class="cline-any cline-yes">2x</span>
1158
+ <span class="cline-any cline-yes">2x</span>
1159
+ <span class="cline-any cline-yes">2x</span>
1160
+ <span class="cline-any cline-no">&nbsp;</span>
1161
+ <span class="cline-any cline-no">&nbsp;</span>
1162
+ <span class="cline-any cline-yes">410x</span>
1163
+ <span class="cline-any cline-yes">2x</span>
1164
+ <span class="cline-any cline-yes">2x</span>
1165
+ <span class="cline-any cline-yes">2x</span>
1166
+ <span class="cline-any cline-yes">2x</span>
1167
+ <span class="cline-any cline-no">&nbsp;</span>
1168
+ <span class="cline-any cline-no">&nbsp;</span>
1169
+ <span class="cline-any cline-yes">410x</span>
1170
+ <span class="cline-any cline-yes">1x</span>
1171
+ <span class="cline-any cline-yes">1x</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-no">&nbsp;</span>
1175
+ <span class="cline-any cline-no">&nbsp;</span>
1176
+ <span class="cline-any cline-yes">410x</span>
1177
+ <span class="cline-any cline-yes">1x</span>
1178
+ <span class="cline-any cline-yes">1x</span>
1179
+ <span class="cline-any cline-yes">1x</span>
1180
+ <span class="cline-any cline-yes">1x</span>
1181
+ <span class="cline-any cline-no">&nbsp;</span>
1182
+ <span class="cline-any cline-no">&nbsp;</span>
1183
+ <span class="cline-any cline-yes">379x</span>
1184
+ <span class="cline-any cline-yes">379x</span>
1185
+ <span class="cline-any cline-yes">410x</span>
1186
+ <span class="cline-any cline-yes">4x</span>
1187
+ <span class="cline-any cline-yes">4x</span>
1188
+ <span class="cline-any cline-no">&nbsp;</span>
1189
+ <span class="cline-any cline-no">&nbsp;</span>
1190
+ <span class="cline-any cline-yes">4x</span>
1191
+ <span class="cline-any cline-yes">4x</span>
1192
+ <span class="cline-any cline-yes">379x</span>
1193
+ <span class="cline-any cline-yes">379x</span>
1194
+ <span class="cline-any cline-yes">410x</span>
1195
+ <span class="cline-any cline-yes">127x</span>
1196
+ <span class="cline-any cline-yes">127x</span>
1197
+ <span class="cline-any cline-yes">693x</span>
1198
+ <span class="cline-any cline-yes">693x</span>
1199
+ <span class="cline-any cline-yes">127x</span>
1200
+ <span class="cline-any cline-yes">127x</span>
1201
+ <span class="cline-any cline-yes">1x</span>
1202
+ <span class="cline-any cline-yes">1x</span>
1203
+ <span class="cline-any cline-yes">126x</span>
1204
+ <span class="cline-any cline-yes">126x</span>
1205
+ <span class="cline-any cline-yes">378x</span>
1206
+ <span class="cline-any cline-yes">378x</span>
1207
+ <span class="cline-any cline-yes">410x</span>
1208
+ <span class="cline-any cline-yes">14x</span>
1209
+ <span class="cline-any cline-yes">14x</span>
1210
+ <span class="cline-any cline-yes">21x</span>
1211
+ <span class="cline-any cline-yes">21x</span>
1212
+ <span class="cline-any cline-yes">21x</span>
1213
+ <span class="cline-any cline-yes">4x</span>
1214
+ <span class="cline-any cline-yes">4x</span>
1215
+ <span class="cline-any cline-yes">4x</span>
1216
+ <span class="cline-any cline-yes">21x</span>
1217
+ <span class="cline-any cline-yes">17x</span>
1218
+ <span class="cline-any cline-yes">17x</span>
1219
+ <span class="cline-any cline-yes">21x</span>
1220
+ <span class="cline-any cline-yes">14x</span>
1221
+ <span class="cline-any cline-yes">14x</span>
1222
+ <span class="cline-any cline-yes">1x</span>
1223
+ <span class="cline-any cline-yes">1x</span>
1224
+ <span class="cline-any cline-yes">13x</span>
1225
+ <span class="cline-any cline-yes">13x</span>
1226
+ <span class="cline-any cline-yes">377x</span>
1227
+ <span class="cline-any cline-yes">377x</span>
1228
+ <span class="cline-any cline-yes">410x</span>
1229
+ <span class="cline-any cline-yes">2x</span>
1230
+ <span class="cline-any cline-yes">2x</span>
1231
+ <span class="cline-any cline-yes">2x</span>
1232
+ <span class="cline-any cline-yes">2x</span>
1233
+ <span class="cline-any cline-yes">2x</span>
1234
+ <span class="cline-any cline-yes">2x</span>
1235
+ <span class="cline-any cline-yes">2x</span>
1236
+ <span class="cline-any cline-yes">2x</span>
1237
+ <span class="cline-any cline-yes">2x</span>
1238
+ <span class="cline-any cline-yes">2x</span>
1239
+ <span class="cline-any cline-yes">2x</span>
1240
+ <span class="cline-any cline-yes">2x</span>
1241
+ <span class="cline-any cline-yes">2x</span>
1242
+ <span class="cline-any cline-yes">2x</span>
1243
+ <span class="cline-any cline-yes">2x</span>
1244
+ <span class="cline-any cline-yes">4x</span>
1245
+ <span class="cline-any cline-yes">2x</span>
1246
+ <span class="cline-any cline-yes">2x</span>
1247
+ <span class="cline-any cline-yes">1x</span>
1248
+ <span class="cline-any cline-yes">1x</span>
1249
+ <span class="cline-any cline-yes">1x</span>
1250
+ <span class="cline-any cline-yes">2x</span>
1251
+ <span class="cline-any cline-yes">1x</span>
1252
+ <span class="cline-any cline-yes">1x</span>
1253
+ <span class="cline-any cline-yes">1x</span>
1254
+ <span class="cline-any cline-yes">1x</span>
1255
+ <span class="cline-any cline-yes">4x</span>
1256
+ <span class="cline-any cline-yes">1x</span>
1257
+ <span class="cline-any cline-yes">1x</span>
1258
+ <span class="cline-any cline-yes">1x</span>
1259
+ <span class="cline-any cline-yes">1x</span>
1260
+ <span class="cline-any cline-yes">1x</span>
1261
+ <span class="cline-any cline-yes">1x</span>
1262
+ <span class="cline-any cline-yes">1x</span>
1263
+ <span class="cline-any cline-yes">1x</span>
1264
+ <span class="cline-any cline-yes">376x</span>
1265
+ <span class="cline-any cline-yes">376x</span>
1266
+ <span class="cline-any cline-yes">410x</span>
1267
+ <span class="cline-any cline-yes">123x</span>
1268
+ <span class="cline-any cline-yes">123x</span>
1269
+ <span class="cline-any cline-yes">123x</span>
1270
+ <span class="cline-any cline-yes">212x</span>
1271
+ <span class="cline-any cline-yes">212x</span>
1272
+ <span class="cline-any cline-yes">212x</span>
1273
+ <span class="cline-any cline-yes">912x</span>
1274
+ <span class="cline-any cline-yes">912x</span>
1275
+ <span class="cline-any cline-no">&nbsp;</span>
1276
+ <span class="cline-any cline-no">&nbsp;</span>
1277
+ <span class="cline-any cline-yes">912x</span>
1278
+ <span class="cline-any cline-yes">912x</span>
1279
+ <span class="cline-any cline-yes">912x</span>
1280
+ <span class="cline-any cline-yes">212x</span>
1281
+ <span class="cline-any cline-yes">212x</span>
1282
+ <span class="cline-any cline-yes">123x</span>
1283
+ <span class="cline-any cline-no">&nbsp;</span>
1284
+ <span class="cline-any cline-no">&nbsp;</span>
1285
+ <span class="cline-any cline-yes">123x</span>
1286
+ <span class="cline-any cline-yes">123x</span>
1287
+ <span class="cline-any cline-yes">123x</span>
1288
+ <span class="cline-any cline-yes">123x</span>
1289
+ <span class="cline-any cline-yes">123x</span>
1290
+ <span class="cline-any cline-yes">123x</span>
1291
+ <span class="cline-any cline-yes">123x</span>
1292
+ <span class="cline-any cline-yes">212x</span>
1293
+ <span class="cline-any cline-yes">212x</span>
1294
+ <span class="cline-any cline-yes">212x</span>
1295
+ <span class="cline-any cline-yes">3x</span>
1296
+ <span class="cline-any cline-yes">3x</span>
1297
+ <span class="cline-any cline-yes">209x</span>
1298
+ <span class="cline-any cline-yes">209x</span>
1299
+ <span class="cline-any cline-yes">209x</span>
1300
+ <span class="cline-any cline-yes">212x</span>
1301
+ <span class="cline-any cline-yes">86x</span>
1302
+ <span class="cline-any cline-yes">86x</span>
1303
+ <span class="cline-any cline-yes">1x</span>
1304
+ <span class="cline-any cline-yes">1x</span>
1305
+ <span class="cline-any cline-yes">85x</span>
1306
+ <span class="cline-any cline-yes">85x</span>
1307
+ <span class="cline-any cline-yes">208x</span>
1308
+ <span class="cline-any cline-yes">212x</span>
1309
+ <span class="cline-any cline-yes">86x</span>
1310
+ <span class="cline-any cline-yes">86x</span>
1311
+ <span class="cline-any cline-yes">1x</span>
1312
+ <span class="cline-any cline-yes">1x</span>
1313
+ <span class="cline-any cline-yes">85x</span>
1314
+ <span class="cline-any cline-yes">85x</span>
1315
+ <span class="cline-any cline-yes">207x</span>
1316
+ <span class="cline-any cline-yes">207x</span>
1317
+ <span class="cline-any cline-yes">207x</span>
1318
+ <span class="cline-any cline-yes">123x</span>
1319
+ <span class="cline-any cline-yes">123x</span>
1320
+ <span class="cline-any cline-yes">369x</span>
1321
+ <span class="cline-any cline-yes">369x</span>
1322
+ <span class="cline-any cline-yes">369x</span>
1323
+ <span class="cline-any cline-yes">369x</span>
1324
+ <span class="cline-any cline-yes">369x</span>
1325
+ <span class="cline-any cline-yes">410x</span>
1326
+ <span class="cline-any cline-yes">41x</span>
1327
+ <span class="cline-any cline-yes">41x</span>
1328
+ <span class="cline-any cline-yes">369x</span>
1329
+ <span class="cline-any cline-yes">369x</span>
1330
+ <span class="cline-any cline-yes">369x</span>
1331
+ <span class="cline-any cline-yes">410x</span>
1332
+ <span class="cline-any cline-yes">116x</span>
1333
+ <span class="cline-any cline-yes">116x</span>
1334
+ <span class="cline-any cline-yes">369x</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">652x</span>
1344
+ <span class="cline-any cline-yes">652x</span>
1345
+ <span class="cline-any cline-yes">652x</span>
1346
+ <span class="cline-any cline-yes">652x</span>
1347
+ <span class="cline-any cline-yes">652x</span>
1348
+ <span class="cline-any cline-yes">1x</span>
1349
+ <span class="cline-any cline-yes">1x</span>
1350
+ <span class="cline-any cline-yes">652x</span>
1351
+ <span class="cline-any cline-yes">1x</span>
1352
+ <span class="cline-any cline-yes">1x</span>
1353
+ <span class="cline-any cline-yes">650x</span>
1354
+ <span class="cline-any cline-yes">650x</span>
1355
+ <span class="cline-any cline-yes">652x</span>
1356
+ <span class="cline-any cline-yes">1x</span>
1357
+ <span class="cline-any cline-yes">1x</span>
1358
+ <span class="cline-any cline-yes">649x</span>
1359
+ <span class="cline-any cline-yes">649x</span>
1360
+ <span class="cline-any cline-yes">652x</span>
1361
+ <span class="cline-any cline-yes">619x</span>
1362
+ <span class="cline-any cline-yes">619x</span>
1363
+ <span class="cline-any cline-yes">610x</span>
1364
+ <span class="cline-any cline-yes">610x</span>
1365
+ <span class="cline-any cline-yes">610x</span>
1366
+ <span class="cline-any cline-yes">610x</span>
1367
+ <span class="cline-any cline-yes">619x</span>
1368
+ <span class="cline-any cline-yes">648x</span>
1369
+ <span class="cline-any cline-yes">648x</span>
1370
+ <span class="cline-any cline-yes">648x</span>
1371
+ <span class="cline-any cline-yes">652x</span>
1372
+ <span class="cline-any cline-yes">566x</span>
1373
+ <span class="cline-any cline-yes">566x</span>
1374
+ <span class="cline-any cline-yes">648x</span>
1375
+ <span class="cline-any cline-yes">648x</span>
1376
+ <span class="cline-any cline-yes">652x</span>
1377
+ <span class="cline-any cline-yes">572x</span>
1378
+ <span class="cline-any cline-yes">572x</span>
1379
+ <span class="cline-any cline-yes">470x</span>
1380
+ <span class="cline-any cline-yes">470x</span>
1381
+ <span class="cline-any cline-yes">470x</span>
1382
+ <span class="cline-any cline-yes">470x</span>
1383
+ <span class="cline-any cline-yes">470x</span>
1384
+ <span class="cline-any cline-yes">572x</span>
1385
+ <span class="cline-any cline-yes">648x</span>
1386
+ <span class="cline-any cline-yes">648x</span>
1387
+ <span class="cline-any cline-yes">652x</span>
1388
+ <span class="cline-any cline-yes">567x</span>
1389
+ <span class="cline-any cline-yes">567x</span>
1390
+ <span class="cline-any cline-yes">8x</span>
1391
+ <span class="cline-any cline-yes">8x</span>
1392
+ <span class="cline-any cline-yes">8x</span>
1393
+ <span class="cline-any cline-yes">8x</span>
1394
+ <span class="cline-any cline-yes">8x</span>
1395
+ <span class="cline-any cline-yes">8x</span>
1396
+ <span class="cline-any cline-yes">8x</span>
1397
+ <span class="cline-any cline-yes">567x</span>
1398
+ <span class="cline-any cline-yes">648x</span>
1399
+ <span class="cline-any cline-yes">648x</span>
1400
+ <span class="cline-any cline-yes">652x</span>
1401
+ <span class="cline-any cline-yes">112x</span>
1402
+ <span class="cline-any cline-yes">112x</span>
1403
+ <span class="cline-any cline-yes">1x</span>
1404
+ <span class="cline-any cline-yes">1x</span>
1405
+ <span class="cline-any cline-yes">1x</span>
1406
+ <span class="cline-any cline-yes">1x</span>
1407
+ <span class="cline-any cline-yes">1x</span>
1408
+ <span class="cline-any cline-yes">1x</span>
1409
+ <span class="cline-any cline-yes">1x</span>
1410
+ <span class="cline-any cline-yes">1x</span>
1411
+ <span class="cline-any cline-yes">1x</span>
1412
+ <span class="cline-any cline-yes">1x</span>
1413
+ <span class="cline-any cline-yes">1x</span>
1414
+ <span class="cline-any cline-yes">1x</span>
1415
+ <span class="cline-any cline-yes">1x</span>
1416
+ <span class="cline-any cline-yes">1x</span>
1417
+ <span class="cline-any cline-yes">1x</span>
1418
+ <span class="cline-any cline-yes">112x</span>
1419
+ <span class="cline-any cline-yes">648x</span>
1420
+ <span class="cline-any cline-yes">648x</span>
1421
+ <span class="cline-any cline-yes">652x</span>
1422
+ <span class="cline-any cline-yes">102x</span>
1423
+ <span class="cline-any cline-yes">102x</span>
1424
+ <span class="cline-any cline-yes">102x</span>
1425
+ <span class="cline-any cline-yes">102x</span>
1426
+ <span class="cline-any cline-yes">102x</span>
1427
+ <span class="cline-any cline-yes">102x</span>
1428
+ <span class="cline-any cline-yes">185x</span>
1429
+ <span class="cline-any cline-yes">185x</span>
1430
+ <span class="cline-any cline-yes">185x</span>
1431
+ <span class="cline-any cline-yes">185x</span>
1432
+ <span class="cline-any cline-yes">69x</span>
1433
+ <span class="cline-any cline-yes">69x</span>
1434
+ <span class="cline-any cline-yes">185x</span>
1435
+ <span class="cline-any cline-yes">109x</span>
1436
+ <span class="cline-any cline-yes">109x</span>
1437
+ <span class="cline-any cline-yes">185x</span>
1438
+ <span class="cline-any cline-yes">108x</span>
1439
+ <span class="cline-any cline-yes">108x</span>
1440
+ <span class="cline-any cline-yes">185x</span>
1441
+ <span class="cline-any cline-yes">65x</span>
1442
+ <span class="cline-any cline-yes">65x</span>
1443
+ <span class="cline-any cline-yes">185x</span>
1444
+ <span class="cline-any cline-yes">65x</span>
1445
+ <span class="cline-any cline-yes">65x</span>
1446
+ <span class="cline-any cline-yes">185x</span>
1447
+ <span class="cline-any cline-no">&nbsp;</span>
1448
+ <span class="cline-any cline-no">&nbsp;</span>
1449
+ <span class="cline-any cline-yes">185x</span>
1450
+ <span class="cline-any cline-yes">185x</span>
1451
+ <span class="cline-any cline-yes">185x</span>
1452
+ <span class="cline-any cline-yes">185x</span>
1453
+ <span class="cline-any cline-yes">789x</span>
1454
+ <span class="cline-any cline-yes">3x</span>
1455
+ <span class="cline-any cline-yes">3x</span>
1456
+ <span class="cline-any cline-yes">789x</span>
1457
+ <span class="cline-any cline-yes">185x</span>
1458
+ <span class="cline-any cline-yes">102x</span>
1459
+ <span class="cline-any cline-yes">102x</span>
1460
+ <span class="cline-any cline-yes">102x</span>
1461
+ <span class="cline-any cline-yes">102x</span>
1462
+ <span class="cline-any cline-yes">652x</span>
1463
+ <span class="cline-any cline-yes">4x</span>
1464
+ <span class="cline-any cline-yes">4x</span>
1465
+ <span class="cline-any cline-yes">648x</span>
1466
+ <span class="cline-any cline-yes">648x</span>
1467
+ <span class="cline-any cline-yes">648x</span>
1468
+ <span class="cline-any cline-yes">652x</span>
1469
+ <span class="cline-any cline-yes">1x</span>
1470
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const yaml = require('yamljs');
1471
+ const fm = require('front-matter');
1472
+ const marked = require('marked');
1473
+ const utility = require('./utility');
1474
+ const chrono = require('chrono-node');
1475
+ const validate = require('jsonschema').validate;
1476
+ const parseMarkdown = require('./parse-markdown');
1477
+ &nbsp;
1478
+ /**
1479
+ * Compile separate headings together into a task description
1480
+ * @param {object} data
1481
+ */
1482
+ function compileDescription(data) {
1483
+ const description = [];
1484
+ if ('raw' in data) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1485
+ <span class="cstat-no" title="statement not covered" > description.push(data.raw.content.replace(/[\r\n]{3}/g, '\n\n').trim());</span>
1486
+ <span class="cstat-no" title="statement not covered" > }</span>
1487
+ for (let heading in data) {
1488
+ if (['raw', 'Metadata', 'Sub-tasks', 'Relations', 'History', 'Comments'].indexOf(heading) !== -1) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1489
+ <span class="cstat-no" title="statement not covered" > continue;</span>
1490
+ <span class="cstat-no" title="statement not covered" > }</span>
1491
+ description.push(
1492
+ /^# (.*)/.test(data[heading].heading) ? '' : data[heading].heading,
1493
+ data[heading].content
1494
+ );
1495
+ }
1496
+ return description.join('\n\n').trim();
1497
+ }
1498
+ &nbsp;
1499
+ /**
1500
+ * Validate the metadata object converted from Markdown
1501
+ * @param {object} metadata
1502
+ */
1503
+ function validateMetadataFromMarkdown(metadata) {
1504
+ const result = validate(metadata, {
1505
+ type: 'object',
1506
+ properties: {
1507
+ 'created': {
1508
+ oneOf: [
1509
+ { type: 'string' },
1510
+ { type: 'date'}
1511
+ ]
1512
+ },
1513
+ 'updated': {
1514
+ oneOf: [
1515
+ { type: 'string' },
1516
+ { type: 'date'}
1517
+ ]
1518
+ },
1519
+ 'started': {
1520
+ oneOf: [
1521
+ { type: 'string' },
1522
+ { type: 'date'}
1523
+ ]
1524
+ },
1525
+ 'completed': {
1526
+ oneOf: [
1527
+ { type: 'string' },
1528
+ { type: 'date'}
1529
+ ]
1530
+ },
1531
+ 'due': {
1532
+ oneOf: [
1533
+ { type: 'string' },
1534
+ { type: 'date'}
1535
+ ]
1536
+ },
1537
+ 'plannedStart': {
1538
+ oneOf: [
1539
+ { type: 'string' },
1540
+ { type: 'date'}
1541
+ ]
1542
+ },
1543
+ 'plannedFinish': {
1544
+ oneOf: [
1545
+ { type: 'string' },
1546
+ { type: 'date'}
1547
+ ]
1548
+ },
1549
+ 'progress': {
1550
+ type: 'number'
1551
+ },
1552
+ 'tags': {
1553
+ type: 'array',
1554
+ items: { type: 'string' }
1555
+ }
1556
+ }
1557
+ });
1558
+ if (result.errors.length) {
1559
+ throw new Error(result.errors.map(error =&gt; `\n${error.property} ${error.message}`).join(''));
1560
+ }
1561
+ }
1562
+ &nbsp;
1563
+ /**
1564
+ * Validate the metadata object converted from JSON
1565
+ * @param {object} metadata
1566
+ */
1567
+ function validateMetadataFromJSON(metadata) {
1568
+ const result = validate(metadata, {
1569
+ type: 'object',
1570
+ properties: {
1571
+ 'created': { type: 'date'},
1572
+ 'updated': { type: 'date'},
1573
+ 'started': { type: 'date'},
1574
+ 'completed': { type: 'date'},
1575
+ 'due': { type: 'date'},
1576
+ 'plannedStart': { type: 'date'},
1577
+ 'plannedFinish': { type: 'date'},
1578
+ 'progress': { type: 'number' },
1579
+ 'tags': {
1580
+ type: 'array',
1581
+ items: { type: 'string' }
1582
+ },
1583
+ 'assigned': { type: 'string' }
1584
+ }
1585
+ });
1586
+ if (result.errors.length) {
1587
+ throw new Error(result.errors.map(error =&gt; `\n${error.property} ${error.message}`).join(''));
1588
+ }
1589
+ }
1590
+ &nbsp;
1591
+ /**
1592
+ * Validate the sub-tasks object
1593
+ * @param {object} subTasks
1594
+ */
1595
+ function validateSubTasks(subTasks) {
1596
+ const result = validate(subTasks, {
1597
+ type: 'array',
1598
+ items: {
1599
+ type: 'object',
1600
+ properties: {
1601
+ 'text': { type: 'string' },
1602
+ 'completed': { type: 'boolean' }
1603
+ }
1604
+ }
1605
+ });
1606
+ if (result.errors.length) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1607
+ <span class="cstat-no" title="statement not covered" > throw new Error(result.errors.map(error =&gt; `\n${error.property} ${error.message}`).join(''));</span>
1608
+ <span class="cstat-no" title="statement not covered" > }</span>
1609
+ }
1610
+ &nbsp;
1611
+ /**
1612
+ * Validate the relations object
1613
+ * @param {object} relations
1614
+ */
1615
+ function validateRelations(relations) {
1616
+ const result = validate(relations, {
1617
+ type: 'array',
1618
+ items: {
1619
+ type: 'object',
1620
+ properties: {
1621
+ 'type': { type: 'string' },
1622
+ 'task': { type: 'string' }
1623
+ }
1624
+ }
1625
+ });
1626
+ if (result.errors.length) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1627
+ <span class="cstat-no" title="statement not covered" > throw new Error(result.errors.map(error =&gt; `\n${error.property} ${error.message}`).join(''));</span>
1628
+ <span class="cstat-no" title="statement not covered" > }</span>
1629
+ }
1630
+ &nbsp;
1631
+ /**
1632
+ * Validate the comments object
1633
+ * @param {object} comments
1634
+ */
1635
+ function validateComments(comments) {
1636
+ const result = validate(comments, {
1637
+ type: 'array',
1638
+ items: {
1639
+ type: 'object',
1640
+ properties: {
1641
+ 'author': { type: 'string' },
1642
+ 'date': { type: 'date' },
1643
+ 'text': { type: 'string' }
1644
+ }
1645
+ }
1646
+ });
1647
+ if (result.errors.length) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1648
+ <span class="cstat-no" title="statement not covered" > throw new Error(result.errors.map(error =&gt; `\n${error.property} ${error.message}`).join(''));</span>
1649
+ <span class="cstat-no" title="statement not covered" > }</span>
1650
+ }
1651
+ &nbsp;
1652
+ /**
1653
+ * Validate the history object converted from Markdown
1654
+ * @param {object[]} history
1655
+ */
1656
+ function validateHistoryFromMarkdown(history) {
1657
+ const result = validate(history, {
1658
+ type: 'array',
1659
+ items: {
1660
+ type: 'object',
1661
+ properties: {
1662
+ 'type': { type: 'string' },
1663
+ 'date': {
1664
+ oneOf: [
1665
+ { type: 'string' },
1666
+ { type: 'date' }
1667
+ ]
1668
+ },
1669
+ 'column': { type: 'string' },
1670
+ 'fromColumn': { type: 'string' },
1671
+ 'toColumn': { type: 'string' },
1672
+ 'author': { type: 'string' },
1673
+ 'fromProgress': { oneOf: [{ type: 'number' }, { type: 'string' }] },
1674
+ 'toProgress': { oneOf: [{ type: 'number' }, { type: 'string' }] }
1675
+ }
1676
+ }
1677
+ });
1678
+ if (result.errors.length) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1679
+ <span class="cstat-no" title="statement not covered" > throw new Error(result.errors.map(error =&gt; `\n${error.property} ${error.message}`).join(''));</span>
1680
+ <span class="cstat-no" title="statement not covered" > }</span>
1681
+ }
1682
+ &nbsp;
1683
+ /**
1684
+ * Validate the history object converted from JSON
1685
+ * @param {object[]} history
1686
+ */
1687
+ function validateHistoryFromJSON(history) {
1688
+ const result = validate(history, {
1689
+ type: 'array',
1690
+ items: {
1691
+ type: 'object',
1692
+ properties: {
1693
+ 'type': { type: 'string' },
1694
+ 'date': { type: 'date' },
1695
+ 'column': { type: 'string' },
1696
+ 'fromColumn': { type: 'string' },
1697
+ 'toColumn': { type: 'string' },
1698
+ 'author': { type: 'string' },
1699
+ 'fromProgress': { type: 'number' },
1700
+ 'toProgress': { type: 'number' }
1701
+ }
1702
+ }
1703
+ });
1704
+ if (result.errors.length) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1705
+ <span class="cstat-no" title="statement not covered" > throw new Error(result.errors.map(error =&gt; `\n${error.property} ${error.message}`).join(''));</span>
1706
+ <span class="cstat-no" title="statement not covered" > }</span>
1707
+ }
1708
+ &nbsp;
1709
+ /**
1710
+ * Validate required fields in a history event
1711
+ *
1712
+ * An event with an unrecognised type is left alone rather than rejected: a task file written by a
1713
+ * newer version of kanbn may contain event types this version doesn't know about, and refusing to
1714
+ * parse the whole task would make the file unreadable. Unknown events are preserved on write and
1715
+ * ignored when history is replayed.
1716
+ * @param {object} historyEvent
1717
+ */
1718
+ function validateHistoryEvent(historyEvent) {
1719
+ if (!historyEvent.type) {
1720
+ throw new Error('history event is missing type');
1721
+ }
1722
+ if (!historyEvent.date) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1723
+ <span class="cstat-no" title="statement not covered" > throw new Error(`history event "${historyEvent.type}" is missing date`);</span>
1724
+ <span class="cstat-no" title="statement not covered" > }</span>
1725
+ switch (historyEvent.type) {
1726
+ case 'created':
1727
+ if (!historyEvent.column) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1728
+ <span class="cstat-no" title="statement not covered" > throw new Error('created history event is missing column');</span>
1729
+ <span class="cstat-no" title="statement not covered" > }</span>
1730
+ break;
1731
+ case 'moved':
1732
+ if (!historyEvent.fromColumn || !historyEvent.toColumn) {
1733
+ throw new Error('moved history event is missing fromColumn or toColumn');
1734
+ }
1735
+ break;
1736
+ case 'progress':
1737
+ if (historyEvent.fromProgress === undefined || historyEvent.toProgress === undefined) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1738
+ <span class="cstat-no" title="statement not covered" > throw new Error('progress history event is missing fromProgress or toProgress');</span>
1739
+ <span class="cstat-no" title="statement not covered" > }</span>
1740
+ break;
1741
+ case 'archived':
1742
+ if (!historyEvent.fromColumn) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1743
+ <span class="cstat-no" title="statement not covered" > throw new Error('archived history event is missing fromColumn');</span>
1744
+ <span class="cstat-no" title="statement not covered" > }</span>
1745
+ break;
1746
+ case 'restored':
1747
+ if (!historyEvent.toColumn) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1748
+ <span class="cstat-no" title="statement not covered" > throw new Error('restored history event is missing toColumn');</span>
1749
+ <span class="cstat-no" title="statement not covered" > }</span>
1750
+ break;
1751
+ default:
1752
+ break;
1753
+ }
1754
+ }
1755
+ &nbsp;
1756
+ /**
1757
+ * History event keys that this version understands, in the order they should be written
1758
+ */
1759
+ const KNOWN_HISTORY_EVENT_KEYS = [
1760
+ 'type',
1761
+ 'date',
1762
+ 'column',
1763
+ 'fromColumn',
1764
+ 'toColumn',
1765
+ 'fromProgress',
1766
+ 'toProgress',
1767
+ 'author'
1768
+ ];
1769
+ &nbsp;
1770
+ module.exports = {
1771
+ &nbsp;
1772
+ /**
1773
+ * Convert markdown into a task object
1774
+ * @param {string} data
1775
+ * @return {object}
1776
+ */
1777
+ md2json(data) {
1778
+ let id = '', name = '', description = '', metadata = {}, subTasks = [], relations = [], history = [], comments = [];
1779
+ try {
1780
+ &nbsp;
1781
+ // Check data type
1782
+ if (!data) {
1783
+ throw new Error('data is null or empty');
1784
+ }
1785
+ if (typeof data !== 'string') {
1786
+ throw new Error('data is not a string');
1787
+ }
1788
+ &nbsp;
1789
+ // Get YAML front matter if any exists
1790
+ if (fm.test(data)) {
1791
+ ({ attributes: metadata, body: data } = fm(data));
1792
+ &nbsp;
1793
+ // Make sure the front matter contains an object
1794
+ if (typeof metadata !== 'object') {
1795
+ throw new Error('invalid front matter content');
1796
+ }
1797
+ }
1798
+ &nbsp;
1799
+ // Parse markdown to an object
1800
+ let task = null;
1801
+ try {
1802
+ task = parseMarkdown(data);
1803
+ } catch (error) {
1804
+ throw new Error(`invalid markdown (${error.message})`);
1805
+ }
1806
+ &nbsp;
1807
+ // Check resulting object
1808
+ const taskHeadings = Object.keys(task);
1809
+ if (taskHeadings.length === 0 || taskHeadings[0] === 'raw') {
1810
+ throw new Error('data is missing a name heading');
1811
+ }
1812
+ &nbsp;
1813
+ // Get name
1814
+ name = taskHeadings[0];
1815
+ &nbsp;
1816
+ // Get id from name
1817
+ id = utility.getTaskId(name);
1818
+ &nbsp;
1819
+ // Parse metadata
1820
+ // Metadata will be serialized back to front-matter, this check remains here for backwards compatibility
1821
+ if ('Metadata' in task) {
1822
+ &nbsp;
1823
+ // Get embedded metadata and make sure it's an object
1824
+ const embeddedMetadata = yaml.parse(task['Metadata'].content.trim().replace(/```(yaml|yml)?/g, ''));
1825
+ if (typeof embeddedMetadata !== 'object') {
1826
+ throw new Error('invalid metadata content');
1827
+ }
1828
+ &nbsp;
1829
+ // Merge with front matter metadata
1830
+ metadata = Object.assign(metadata, embeddedMetadata);
1831
+ delete task['Metadata'];
1832
+ }
1833
+ validateMetadataFromMarkdown(metadata);
1834
+ &nbsp;
1835
+ // Check created/updated/completed/due dates
1836
+ if ('created' in metadata &amp;&amp; !(metadata.created instanceof Date)) {
1837
+ const dateValue = chrono.parseDate(metadata.created);
1838
+ if (dateValue === null) {
1839
+ throw new Error('unable to parse created date');
1840
+ }
1841
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" > metadata.created = dateValue;</span></span>
1842
+ <span class="cstat-no" title="statement not covered" > }</span>
1843
+ if ('updated' in metadata &amp;&amp; !(metadata.updated instanceof Date)) {
1844
+ const dateValue = chrono.parseDate(metadata.updated);
1845
+ if (dateValue === null) {
1846
+ throw new Error('unable to parse updated date');
1847
+ }
1848
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" > metadata.updated = dateValue;</span></span>
1849
+ <span class="cstat-no" title="statement not covered" > }</span>
1850
+ if ('started' in metadata &amp;&amp; !(metadata.started instanceof Date)) {
1851
+ const dateValue = chrono.parseDate(metadata.started);
1852
+ if (dateValue === null) {
1853
+ throw new Error('unable to parse started date');
1854
+ }
1855
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" > metadata.started = dateValue;</span></span>
1856
+ <span class="cstat-no" title="statement not covered" > }</span>
1857
+ if ('completed' in metadata &amp;&amp; !(metadata.completed instanceof Date)) {
1858
+ const dateValue = chrono.parseDate(metadata.completed);
1859
+ if (dateValue === null) {
1860
+ throw new Error('unable to parse completed date');
1861
+ }
1862
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" > metadata.completed = dateValue;</span></span>
1863
+ <span class="cstat-no" title="statement not covered" > }</span>
1864
+ if ('due' in metadata &amp;&amp; !(metadata.due instanceof Date)) {
1865
+ const dateValue = chrono.parseDate(metadata.due);
1866
+ if (dateValue === null) {
1867
+ throw new Error('unable to parse due date');
1868
+ }
1869
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" > metadata.due = dateValue;</span></span>
1870
+ <span class="cstat-no" title="statement not covered" > }</span>
1871
+ if ('plannedStart' in metadata &amp;&amp; !(metadata.plannedStart instanceof Date)) {
1872
+ const dateValue = chrono.parseDate(metadata.plannedStart);
1873
+ if (dateValue === null) {
1874
+ throw new Error('unable to parse plannedStart date');
1875
+ }
1876
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" > metadata.plannedStart = dateValue;</span></span>
1877
+ <span class="cstat-no" title="statement not covered" > }</span>
1878
+ if ('plannedFinish' in metadata &amp;&amp; !(metadata.plannedFinish instanceof Date)) {
1879
+ const dateValue = chrono.parseDate(metadata.plannedFinish);
1880
+ if (dateValue === null) {
1881
+ throw new Error('unable to parse plannedFinish date');
1882
+ }
1883
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" > metadata.plannedFinish = dateValue;</span></span>
1884
+ <span class="cstat-no" title="statement not covered" > }</span>
1885
+ &nbsp;
1886
+ // Check progress value
1887
+ if ('progress' in metadata) {
1888
+ const numberValue = parseFloat(metadata.progress);
1889
+ if (isNaN(numberValue)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1890
+ <span class="cstat-no" title="statement not covered" > throw new Error('progress value is not numeric');</span>
1891
+ <span class="cstat-no" title="statement not covered" > }</span>
1892
+ metadata.progress = numberValue;
1893
+ }
1894
+ &nbsp;
1895
+ // Parse sub-tasks
1896
+ if ('Sub-tasks' in task) {
1897
+ try {
1898
+ subTasks = marked.lexer(task['Sub-tasks'].content)[0].items.map(item =&gt; ({
1899
+ text: item.text.trim(),
1900
+ completed: item.checked || false
1901
+ }));
1902
+ } catch (error) {
1903
+ throw new Error('sub-tasks must contain a list');
1904
+ }
1905
+ delete task['Sub-tasks'];
1906
+ }
1907
+ &nbsp;
1908
+ // Parse relations
1909
+ if ('Relations' in task) {
1910
+ try {
1911
+ relations = marked.lexer(task['Relations'].content)[0].items.map(item =&gt; {
1912
+ const parts = item.tokens[0].tokens[0].text.split(' ');
1913
+ return parts.length === 1
1914
+ ? {
1915
+ task: parts[0].trim(),
1916
+ type: ''
1917
+ }
1918
+ : {
1919
+ task: parts.pop().trim(),
1920
+ type: parts.join(' ').trim()
1921
+ };
1922
+ });
1923
+ } catch (error) {
1924
+ throw new Error('relations must contain a list');
1925
+ }
1926
+ delete task['Relations'];
1927
+ }
1928
+ &nbsp;
1929
+ // Parse comments
1930
+ if ('Comments' in task) {
1931
+ try {
1932
+ // const commentsHeading = '## Comments';
1933
+ // const start = data.indexOf(commentsHeading) + commentsHeading.length;
1934
+ // let end = data.substring(start).search(/\n#/);
1935
+ // if (end &gt;= 0) {
1936
+ // end += start;
1937
+ // } else {
1938
+ // end = data.length;
1939
+ // }
1940
+ // const parsedComments = marked.lexer(data.slice(start, end).trim())[0].items;
1941
+ const parsedComments = marked.lexer(task['Comments'].content)[0].items;
1942
+ for (let parsedComment of parsedComments) {
1943
+ const comment = { text: [] };
1944
+ const parts = parsedComment.text.split('\n');
1945
+ for (let part of parts) {
1946
+ if (part.startsWith('date: ')) {
1947
+ const dateValue = chrono.parseDate(part.substring('date: '.length));
1948
+ if (dateValue === null) {
1949
+ throw new Error('unable to parse comment date');
1950
+ }
1951
+ comment.date = dateValue;
1952
+ } else if (part.startsWith('author: ')) {
1953
+ comment.author = part.substring('author: '.length);
1954
+ } else {
1955
+ comment.text.push(part);
1956
+ }
1957
+ }
1958
+ comment.text = comment.text.join('\n').trim();
1959
+ comments.push(comment);
1960
+ }
1961
+ } catch (error) {
1962
+ throw new Error('comments must contain a list');
1963
+ }
1964
+ delete task['Comments'];
1965
+ }
1966
+ &nbsp;
1967
+ // Parse history
1968
+ if ('History' in task) {
1969
+ try {
1970
+ const parsedHistory = marked.lexer(task['History'].content)[0].items;
1971
+ for (let parsedHistoryEvent of parsedHistory) {
1972
+ const historyEvent = {};
1973
+ const parts = parsedHistoryEvent.text.split('\n');
1974
+ for (let part of parts) {
1975
+ const parsedPart = part.match(/^([A-Za-z][A-Za-z0-9]*):\s*(.*)$/);
1976
+ if (!parsedPart) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1977
+ <span class="cstat-no" title="statement not covered" > continue;</span>
1978
+ <span class="cstat-no" title="statement not covered" > }</span>
1979
+ const key = parsedPart[1];
1980
+ historyEvent[key] = parsedPart[2].trim();
1981
+ }
1982
+ history.push(historyEvent);
1983
+ }
1984
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (error) {</span>
1985
+ <span class="cstat-no" title="statement not covered" > throw new Error('history must contain a list');</span>
1986
+ <span class="cstat-no" title="statement not covered" > }</span>
1987
+ delete task['History'];
1988
+ &nbsp;
1989
+ // Validate basic history structure before value coercion
1990
+ validateHistoryFromMarkdown(history);
1991
+ &nbsp;
1992
+ // Parse and validate event dates and numeric fields
1993
+ history = history.map((historyEvent) =&gt; {
1994
+ if (!(historyEvent.date instanceof Date)) {
1995
+ const dateValue = chrono.parseDate(historyEvent.date);
1996
+ if (dateValue === null) {
1997
+ throw new Error(`unable to parse history event date for "${historyEvent.type <span class="branch-0 cbranch-no" title="branch not covered" >|| 'unknown'}</span>"`);
1998
+ }
1999
+ historyEvent.date = dateValue;
2000
+ }
2001
+ &nbsp;
2002
+ if ('fromProgress' in historyEvent) {
2003
+ const fromProgressValue = parseFloat(historyEvent.fromProgress);
2004
+ if (isNaN(fromProgressValue)) {
2005
+ throw new Error('history event fromProgress value is not numeric');
2006
+ }
2007
+ historyEvent.fromProgress = fromProgressValue;
2008
+ }
2009
+ &nbsp;
2010
+ if ('toProgress' in historyEvent) {
2011
+ const toProgressValue = parseFloat(historyEvent.toProgress);
2012
+ if (isNaN(toProgressValue)) {
2013
+ throw new Error('history event toProgress value is not numeric');
2014
+ }
2015
+ historyEvent.toProgress = toProgressValue;
2016
+ }
2017
+ &nbsp;
2018
+ validateHistoryEvent(historyEvent);
2019
+ return historyEvent;
2020
+ });
2021
+ }
2022
+ &nbsp;
2023
+ // Assemble description
2024
+ // const descriptionParts = [];
2025
+ description = compileDescription(task);
2026
+ // description = descriptionParts.join('\n\n');
2027
+ } catch (error) {
2028
+ throw new Error(`Unable to parse task: ${error.message}`);
2029
+ }
2030
+ &nbsp;
2031
+ // Assemble task object
2032
+ const result = { id, name, description, metadata, subTasks, relations, comments };
2033
+ if (history.length &gt; 0) {
2034
+ result.history = history;
2035
+ }
2036
+ return result;
2037
+ },
2038
+ &nbsp;
2039
+ /**
2040
+ * Convert a task object into markdown
2041
+ * @param {object} data
2042
+ * @return {string}
2043
+ */
2044
+ json2md(data) {
2045
+ const result = [];
2046
+ try {
2047
+ &nbsp;
2048
+ // Check data type
2049
+ if (!data) {
2050
+ throw new Error('data is null or empty');
2051
+ }
2052
+ if (typeof data !== 'object') {
2053
+ throw new Error('data is not an object');
2054
+ }
2055
+ &nbsp;
2056
+ // Check required fields
2057
+ if (!('name' in data)) {
2058
+ throw new Error('data object is missing name');
2059
+ }
2060
+ &nbsp;
2061
+ // Add metadata as front-matter content if present
2062
+ if ('metadata' in data &amp;&amp; data.metadata !== null) {
2063
+ validateMetadataFromJSON(data.metadata);
2064
+ if (Object.keys(data.metadata).length &gt; 0) {
2065
+ result.push(
2066
+ `---\n${yaml.stringify(data.metadata, 4, 2).trim()}\n---`
2067
+ );
2068
+ }
2069
+ }
2070
+ &nbsp;
2071
+ // Add name and description
2072
+ result.push(`# ${data.name}`);
2073
+ if ('description' in data) {
2074
+ result.push(data.description);
2075
+ }
2076
+ &nbsp;
2077
+ // Add sub-tasks if present
2078
+ if ('subTasks' in data &amp;&amp; data.subTasks !== null) {
2079
+ validateSubTasks(data.subTasks);
2080
+ if (data.subTasks.length &gt; 0) {
2081
+ result.push(
2082
+ '## Sub-tasks',
2083
+ data.subTasks.map(subTask =&gt; `- [${subTask.completed ? 'x' : ' '}] ${subTask.text}`).join('\n')
2084
+ );
2085
+ }
2086
+ }
2087
+ &nbsp;
2088
+ // Add relations if present
2089
+ if ('relations' in data &amp;&amp; data.relations !== null) {
2090
+ validateRelations(data.relations);
2091
+ if (data.relations.length &gt; 0) {
2092
+ result.push(
2093
+ '## Relations',
2094
+ data.relations.map(
2095
+ relation =&gt; `- [${relation.type ? `${relation.type} ` <span class="branch-0 cbranch-no" title="branch not covered" >: ''}</span>${relation.task}](${relation.task}.md)`
2096
+ ).join('\n')
2097
+ );
2098
+ }
2099
+ }
2100
+ &nbsp;
2101
+ // Add comments if present
2102
+ if ('comments' in data &amp;&amp; data.comments !== null) {
2103
+ validateComments(data.comments);
2104
+ if (data.comments.length &gt; 0) {
2105
+ result.push(
2106
+ '## Comments',
2107
+ data.comments.map(comment =&gt; {
2108
+ const commentOutput = [];
2109
+ if ('author' in comment &amp;&amp; comment.author) {
2110
+ commentOutput.push(`author: ${comment.author}`);
2111
+ }
2112
+ if ('date' in comment &amp;&amp; comment.date) {
2113
+ commentOutput.push(`date: ${comment.date.toISOString()}`);
2114
+ }
2115
+ commentOutput.push(...comment.text.split('\n'));
2116
+ return `- ${commentOutput.map((v, i) =&gt; i &gt; 0 ? ` ${v}` : v).join('\n')}`;
2117
+ }).join('\n')
2118
+ );
2119
+ }
2120
+ }
2121
+ &nbsp;
2122
+ // Add history if present
2123
+ if ('history' in data &amp;&amp; data.history !== null) {
2124
+ validateHistoryFromJSON(data.history);
2125
+ data.history.forEach(validateHistoryEvent);
2126
+ if (data.history.length &gt; 0) {
2127
+ result.push(
2128
+ '## History',
2129
+ data.history.map((historyEvent) =&gt; {
2130
+ const historyEventOutput = [];
2131
+ historyEventOutput.push(`type: ${historyEvent.type}`);
2132
+ historyEventOutput.push(`date: ${historyEvent.date.toISOString()}`);
2133
+ if ('column' in historyEvent) {
2134
+ historyEventOutput.push(`column: ${historyEvent.column}`);
2135
+ }
2136
+ if ('fromColumn' in historyEvent) {
2137
+ historyEventOutput.push(`fromColumn: ${historyEvent.fromColumn}`);
2138
+ }
2139
+ if ('toColumn' in historyEvent) {
2140
+ historyEventOutput.push(`toColumn: ${historyEvent.toColumn}`);
2141
+ }
2142
+ if ('fromProgress' in historyEvent) {
2143
+ historyEventOutput.push(`fromProgress: ${historyEvent.fromProgress}`);
2144
+ }
2145
+ if ('toProgress' in historyEvent) {
2146
+ historyEventOutput.push(`toProgress: ${historyEvent.toProgress}`);
2147
+ }
2148
+ if ('author' in historyEvent <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp; historyEvent.author)</span> <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2149
+ <span class="cstat-no" title="statement not covered" > historyEventOutput.push(`author: ${historyEvent.author}`);</span>
2150
+ <span class="cstat-no" title="statement not covered" > }</span>
2151
+ &nbsp;
2152
+ // Write back any keys this version doesn't recognise, so that a file written by a
2153
+ // newer version of kanbn survives a read/write cycle here without losing data
2154
+ for (const key of Object.keys(historyEvent)) {
2155
+ if (KNOWN_HISTORY_EVENT_KEYS.indexOf(key) === -1 &amp;&amp; historyEvent[key] !== undefined) {
2156
+ historyEventOutput.push(`${key}: ${historyEvent[key]}`);
2157
+ }
2158
+ }
2159
+ return `- ${historyEventOutput.map((v, i) =&gt; i &gt; 0 ? ` ${v}` : v).join('\n')}`;
2160
+ }).join('\n')
2161
+ );
2162
+ }
2163
+ }
2164
+ } catch (error) {
2165
+ throw new Error(`Unable to build task: ${error.message}`);
2166
+ }
2167
+ &nbsp;
2168
+ // Filter empty lines and join into a string
2169
+ return `${result.filter(l =&gt; !!l).join('\n\n')}\n`;
2170
+ }
2171
+ };
2172
+ &nbsp;</pre></td></tr></table></pre>
2173
+
2174
+ <div class='push'></div><!-- for sticky footer -->
2175
+ </div><!-- /wrapper -->
2176
+ <div class='footer quiet pad2 space-top1 center small'>
2177
+ Code coverage generated by
2178
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2179
+ at 2026-08-26T20:46:31.702Z
2180
+ </div>
2181
+ <script src="../../prettify.js"></script>
2182
+ <script>
2183
+ window.onload = function () {
2184
+ prettyPrint();
2185
+ };
2186
+ </script>
2187
+ <script src="../../sorter.js"></script>
2188
+ <script src="../../block-navigation.js"></script>
2189
+ </body>
2190
+ </html>
2191
+