@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.
- package/README.md +2 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/coverage-summary.json +31 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +146 -0
- package/coverage/kanbn/index.html +116 -0
- package/coverage/kanbn/index.js.html +217 -0
- package/coverage/kanbn/src/board.js.html +646 -0
- package/coverage/kanbn/src/controller/add.js.html +1729 -0
- package/coverage/kanbn/src/controller/archive.js.html +277 -0
- package/coverage/kanbn/src/controller/board.js.html +217 -0
- package/coverage/kanbn/src/controller/burndown.js.html +607 -0
- package/coverage/kanbn/src/controller/comment.js.html +397 -0
- package/coverage/kanbn/src/controller/edit.js.html +2920 -0
- package/coverage/kanbn/src/controller/find.js.html +1597 -0
- package/coverage/kanbn/src/controller/gantt.js.html +1342 -0
- package/coverage/kanbn/src/controller/help.js.html +115 -0
- package/coverage/kanbn/src/controller/history.js.html +400 -0
- package/coverage/kanbn/src/controller/index.html +431 -0
- package/coverage/kanbn/src/controller/init.js.html +511 -0
- package/coverage/kanbn/src/controller/move.js.html +514 -0
- package/coverage/kanbn/src/controller/remove-all.js.html +226 -0
- package/coverage/kanbn/src/controller/remove.js.html +307 -0
- package/coverage/kanbn/src/controller/rename.js.html +397 -0
- package/coverage/kanbn/src/controller/restore.js.html +268 -0
- package/coverage/kanbn/src/controller/sort.js.html +1318 -0
- package/coverage/kanbn/src/controller/sprint.js.html +361 -0
- package/coverage/kanbn/src/controller/status.js.html +310 -0
- package/coverage/kanbn/src/controller/task.js.html +244 -0
- package/coverage/kanbn/src/controller/validate.js.html +367 -0
- package/coverage/kanbn/src/controller/version.js.html +100 -0
- package/coverage/kanbn/src/index.html +191 -0
- package/coverage/kanbn/src/main.js.html +9787 -0
- package/coverage/kanbn/src/parse-index.js.html +1063 -0
- package/coverage/kanbn/src/parse-markdown.js.html +202 -0
- package/coverage/kanbn/src/parse-task.js.html +2191 -0
- package/coverage/kanbn/src/utility.js.html +616 -0
- package/coverage/lcov.info +11837 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/tmp/coverage-214292-1787777191526-0.json +1 -0
- package/coverage/tmp/coverage-214293-1787777184569-0.json +1 -0
- package/docs/advanced-configuration.md +2 -0
- package/docs/commands/add.txt +10 -0
- package/docs/commands/board.txt +3 -1
- package/docs/commands/burndown.txt +2 -4
- package/docs/commands/edit.txt +22 -0
- package/docs/commands/find.txt +45 -1
- package/docs/commands/help.txt +1 -0
- package/docs/commands/move.txt +1 -1
- package/docs/commands/sort.txt +13 -2
- package/docs/commands/validate.txt +12 -0
- package/docs/filtering-and-sorting.md +218 -0
- package/docs/index-structure.md +68 -19
- package/docs/index.md +26 -2
- package/docs/migration-2.0.md +92 -0
- package/docs/quick-start.md +37 -1
- package/docs/task-structure.md +12 -3
- package/docs/views.md +229 -0
- package/example/README.md +70 -0
- package/example/advanced/.kanbn/index.md +26 -0
- package/example/advanced/.kanbn/tasks/add-rate-limiting.md +18 -0
- package/example/advanced/.kanbn/tasks/add-sso-support.md +15 -0
- package/example/advanced/.kanbn/tasks/migrate-to-new-cdn.md +14 -0
- package/example/advanced/.kanbn/tasks/refresh-marketing-site.md +14 -0
- package/example/advanced/.kanbn/tasks/rotate-api-keys.md +15 -0
- package/example/advanced/.kanbn/tasks/split-billing-service.md +17 -0
- package/example/advanced/.kanbn/tasks/upgrade-node-runtime.md +19 -0
- package/example/advanced/kanbn.yml +59 -0
- package/example/views/.kanbn/index.md +140 -0
- package/example/views/.kanbn/tasks/add-audit-log-export.md +18 -0
- package/example/views/.kanbn/tasks/add-dark-mode-toggle.md +16 -0
- package/example/views/.kanbn/tasks/build-webhook-retry-queue.md +15 -0
- package/example/views/.kanbn/tasks/fix-avatar-upload-crash.md +13 -0
- package/example/views/.kanbn/tasks/fix-expired-session-redirect.md +15 -0
- package/example/views/.kanbn/tasks/investigate-offline-mode.md +12 -0
- package/example/views/.kanbn/tasks/rewrite-search-indexer.md +12 -0
- package/example/views/.kanbn/tasks/tidy-up-settings-copy.md +12 -0
- package/package.json +4 -3
- package/routes/edit.json +2 -1
- package/routes/validate.json +4 -2
- package/skills/kanbn-plan/references/index-structure.md +1 -0
- package/skills/kanbn-plan/references/task-structure.md +2 -0
- package/src/board.js +1 -0
- package/src/controller/board.js +6 -0
- package/src/controller/edit.js +65 -12
- package/src/controller/gantt.js +46 -1
- package/src/controller/status.js +12 -0
- package/src/controller/task.js +1 -1
- package/src/controller/validate.js +78 -15
- package/src/main.js +324 -152
- package/src/parse-index.js +3 -0
- package/src/parse-markdown.js +3 -1
- package/src/parse-task.js +28 -1
- package/src/utility.js +26 -1
- /package/example/{.kanbn → basic/.kanbn}/index.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/add-basic-activity-feed.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/add-passwordless-login-option.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/add-usage-alert-email-thresholds.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/build-email-template-system.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/build-invoice-download-endpoint.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/build-tenant-settings-page.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/create-organization-switcher.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/create-sandbox-environment-provisioner.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/create-self-serve-cancellation-flow.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/define-product-pricing-strategy.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/design-onboarding-checklist.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/design-team-invite-expiry-flow.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/implement-data-retention-policy-jobs.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/implement-feature-flags-foundation.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/implement-project-creation-wizard.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/implement-stripe-webhook-signature-check.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/implement-team-permissions-ui.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/implement-user-signup-and-login.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/integrate-crm-lead-sync.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/legal-review-terms-and-privacy.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/migrate-legacy-events-to-new-schema.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/optimize-dashboard-first-load.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/prototype-report-export-scheduler.md +0 -0
- /package/example/{.kanbn → basic/.kanbn}/tasks/publish-internal-qa-checklist.md +0 -0
- /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"> </span>
|
|
784
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
788
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
906
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
926
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
947
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
978
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
1004
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
1022
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
1027
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
1037
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
1042
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
1047
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
1140
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
1147
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
1154
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
1161
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
1168
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
1175
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
1182
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
1189
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
1276
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
1284
|
+
<span class="cline-any cline-no"> </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"> </span>
|
|
1448
|
+
<span class="cline-any cline-no"> </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"> </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
|
+
|
|
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
|
+
|
|
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 => `\n${error.property} ${error.message}`).join(''));
|
|
1560
|
+
}
|
|
1561
|
+
}
|
|
1562
|
+
|
|
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 => `\n${error.property} ${error.message}`).join(''));
|
|
1588
|
+
}
|
|
1589
|
+
}
|
|
1590
|
+
|
|
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 => `\n${error.property} ${error.message}`).join(''));</span>
|
|
1608
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1609
|
+
}
|
|
1610
|
+
|
|
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 => `\n${error.property} ${error.message}`).join(''));</span>
|
|
1628
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1629
|
+
}
|
|
1630
|
+
|
|
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 => `\n${error.property} ${error.message}`).join(''));</span>
|
|
1649
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1650
|
+
}
|
|
1651
|
+
|
|
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 => `\n${error.property} ${error.message}`).join(''));</span>
|
|
1680
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1681
|
+
}
|
|
1682
|
+
|
|
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 => `\n${error.property} ${error.message}`).join(''));</span>
|
|
1706
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1707
|
+
}
|
|
1708
|
+
|
|
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
|
+
|
|
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
|
+
|
|
1770
|
+
module.exports = {
|
|
1771
|
+
|
|
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
|
+
|
|
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
|
+
|
|
1789
|
+
// Get YAML front matter if any exists
|
|
1790
|
+
if (fm.test(data)) {
|
|
1791
|
+
({ attributes: metadata, body: data } = fm(data));
|
|
1792
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
1813
|
+
// Get name
|
|
1814
|
+
name = taskHeadings[0];
|
|
1815
|
+
|
|
1816
|
+
// Get id from name
|
|
1817
|
+
id = utility.getTaskId(name);
|
|
1818
|
+
|
|
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
|
+
|
|
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
|
+
|
|
1829
|
+
// Merge with front matter metadata
|
|
1830
|
+
metadata = Object.assign(metadata, embeddedMetadata);
|
|
1831
|
+
delete task['Metadata'];
|
|
1832
|
+
}
|
|
1833
|
+
validateMetadataFromMarkdown(metadata);
|
|
1834
|
+
|
|
1835
|
+
// Check created/updated/completed/due dates
|
|
1836
|
+
if ('created' in metadata && !(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 && !(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 && !(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 && !(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 && !(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 && !(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 && !(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
|
+
|
|
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
|
+
|
|
1895
|
+
// Parse sub-tasks
|
|
1896
|
+
if ('Sub-tasks' in task) {
|
|
1897
|
+
try {
|
|
1898
|
+
subTasks = marked.lexer(task['Sub-tasks'].content)[0].items.map(item => ({
|
|
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
|
+
|
|
1908
|
+
// Parse relations
|
|
1909
|
+
if ('Relations' in task) {
|
|
1910
|
+
try {
|
|
1911
|
+
relations = marked.lexer(task['Relations'].content)[0].items.map(item => {
|
|
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
|
+
|
|
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 >= 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
|
+
|
|
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
|
+
|
|
1989
|
+
// Validate basic history structure before value coercion
|
|
1990
|
+
validateHistoryFromMarkdown(history);
|
|
1991
|
+
|
|
1992
|
+
// Parse and validate event dates and numeric fields
|
|
1993
|
+
history = history.map((historyEvent) => {
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
2018
|
+
validateHistoryEvent(historyEvent);
|
|
2019
|
+
return historyEvent;
|
|
2020
|
+
});
|
|
2021
|
+
}
|
|
2022
|
+
|
|
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
|
+
|
|
2031
|
+
// Assemble task object
|
|
2032
|
+
const result = { id, name, description, metadata, subTasks, relations, comments };
|
|
2033
|
+
if (history.length > 0) {
|
|
2034
|
+
result.history = history;
|
|
2035
|
+
}
|
|
2036
|
+
return result;
|
|
2037
|
+
},
|
|
2038
|
+
|
|
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
|
+
|
|
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
|
+
|
|
2056
|
+
// Check required fields
|
|
2057
|
+
if (!('name' in data)) {
|
|
2058
|
+
throw new Error('data object is missing name');
|
|
2059
|
+
}
|
|
2060
|
+
|
|
2061
|
+
// Add metadata as front-matter content if present
|
|
2062
|
+
if ('metadata' in data && data.metadata !== null) {
|
|
2063
|
+
validateMetadataFromJSON(data.metadata);
|
|
2064
|
+
if (Object.keys(data.metadata).length > 0) {
|
|
2065
|
+
result.push(
|
|
2066
|
+
`---\n${yaml.stringify(data.metadata, 4, 2).trim()}\n---`
|
|
2067
|
+
);
|
|
2068
|
+
}
|
|
2069
|
+
}
|
|
2070
|
+
|
|
2071
|
+
// Add name and description
|
|
2072
|
+
result.push(`# ${data.name}`);
|
|
2073
|
+
if ('description' in data) {
|
|
2074
|
+
result.push(data.description);
|
|
2075
|
+
}
|
|
2076
|
+
|
|
2077
|
+
// Add sub-tasks if present
|
|
2078
|
+
if ('subTasks' in data && data.subTasks !== null) {
|
|
2079
|
+
validateSubTasks(data.subTasks);
|
|
2080
|
+
if (data.subTasks.length > 0) {
|
|
2081
|
+
result.push(
|
|
2082
|
+
'## Sub-tasks',
|
|
2083
|
+
data.subTasks.map(subTask => `- [${subTask.completed ? 'x' : ' '}] ${subTask.text}`).join('\n')
|
|
2084
|
+
);
|
|
2085
|
+
}
|
|
2086
|
+
}
|
|
2087
|
+
|
|
2088
|
+
// Add relations if present
|
|
2089
|
+
if ('relations' in data && data.relations !== null) {
|
|
2090
|
+
validateRelations(data.relations);
|
|
2091
|
+
if (data.relations.length > 0) {
|
|
2092
|
+
result.push(
|
|
2093
|
+
'## Relations',
|
|
2094
|
+
data.relations.map(
|
|
2095
|
+
relation => `- [${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
|
+
|
|
2101
|
+
// Add comments if present
|
|
2102
|
+
if ('comments' in data && data.comments !== null) {
|
|
2103
|
+
validateComments(data.comments);
|
|
2104
|
+
if (data.comments.length > 0) {
|
|
2105
|
+
result.push(
|
|
2106
|
+
'## Comments',
|
|
2107
|
+
data.comments.map(comment => {
|
|
2108
|
+
const commentOutput = [];
|
|
2109
|
+
if ('author' in comment && comment.author) {
|
|
2110
|
+
commentOutput.push(`author: ${comment.author}`);
|
|
2111
|
+
}
|
|
2112
|
+
if ('date' in comment && comment.date) {
|
|
2113
|
+
commentOutput.push(`date: ${comment.date.toISOString()}`);
|
|
2114
|
+
}
|
|
2115
|
+
commentOutput.push(...comment.text.split('\n'));
|
|
2116
|
+
return `- ${commentOutput.map((v, i) => i > 0 ? ` ${v}` : v).join('\n')}`;
|
|
2117
|
+
}).join('\n')
|
|
2118
|
+
);
|
|
2119
|
+
}
|
|
2120
|
+
}
|
|
2121
|
+
|
|
2122
|
+
// Add history if present
|
|
2123
|
+
if ('history' in data && data.history !== null) {
|
|
2124
|
+
validateHistoryFromJSON(data.history);
|
|
2125
|
+
data.history.forEach(validateHistoryEvent);
|
|
2126
|
+
if (data.history.length > 0) {
|
|
2127
|
+
result.push(
|
|
2128
|
+
'## History',
|
|
2129
|
+
data.history.map((historyEvent) => {
|
|
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" >&& 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
|
+
|
|
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 && historyEvent[key] !== undefined) {
|
|
2156
|
+
historyEventOutput.push(`${key}: ${historyEvent[key]}`);
|
|
2157
|
+
}
|
|
2158
|
+
}
|
|
2159
|
+
return `- ${historyEventOutput.map((v, i) => i > 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
|
+
|
|
2168
|
+
// Filter empty lines and join into a string
|
|
2169
|
+
return `${result.filter(l => !!l).join('\n\n')}\n`;
|
|
2170
|
+
}
|
|
2171
|
+
};
|
|
2172
|
+
</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
|
+
|