@budibase/server 2.1.22-alpha.2 → 2.1.22-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. package/builder/assets/{index.f18df330.js → index.18ee439f.js} +215 -215
  2. package/builder/index.html +1 -1
  3. package/coverage/clover.xml +9559 -2656
  4. package/coverage/coverage-final.json +144 -1
  5. package/coverage/lcov-report/index.html +621 -126
  6. package/coverage/lcov-report/src/api/controllers/analytics.ts.html +190 -0
  7. package/coverage/lcov-report/{api → src/api}/controllers/apikeys.js.html +10 -10
  8. package/coverage/lcov-report/src/api/controllers/application.ts.html +1996 -0
  9. package/coverage/lcov-report/src/api/controllers/auth.ts.html +298 -0
  10. package/coverage/lcov-report/{api → src/api}/controllers/automation.js.html +10 -10
  11. package/coverage/lcov-report/src/api/controllers/backup.ts.html +148 -0
  12. package/coverage/lcov-report/{api → src/api}/controllers/cloud.js.html +10 -10
  13. package/coverage/lcov-report/src/api/controllers/component.ts.html +256 -0
  14. package/coverage/lcov-report/{api → src/api}/controllers/datasource.js.html +10 -10
  15. package/coverage/lcov-report/src/api/controllers/deploy/Deployment.js.html +250 -0
  16. package/coverage/lcov-report/src/api/controllers/deploy/index.html +131 -0
  17. package/coverage/lcov-report/src/api/controllers/deploy/index.ts.html +766 -0
  18. package/coverage/lcov-report/{api → src/api}/controllers/dev.js.html +10 -10
  19. package/coverage/lcov-report/{api → src/api}/controllers/index.html +123 -18
  20. package/coverage/lcov-report/{api → src/api}/controllers/integration.js.html +10 -10
  21. package/coverage/lcov-report/{api → src/api}/controllers/layout.js.html +10 -10
  22. package/coverage/lcov-report/{api → src/api}/controllers/metadata.js.html +10 -10
  23. package/coverage/lcov-report/{api → src/api}/controllers/migrations.js.html +10 -10
  24. package/coverage/lcov-report/{api → src/api}/controllers/permission.js.html +10 -10
  25. package/coverage/lcov-report/src/api/controllers/plugin/file.ts.html +130 -0
  26. package/coverage/lcov-report/src/api/controllers/plugin/github.ts.html +310 -0
  27. package/coverage/lcov-report/src/api/controllers/plugin/index.html +206 -0
  28. package/coverage/lcov-report/src/api/controllers/plugin/index.ts.html +487 -0
  29. package/coverage/lcov-report/src/api/controllers/plugin/npm.ts.html +253 -0
  30. package/coverage/lcov-report/src/api/controllers/plugin/uploaders.ts.html +97 -0
  31. package/coverage/lcov-report/src/api/controllers/plugin/url.ts.html +121 -0
  32. package/coverage/lcov-report/src/api/controllers/plugin/utils.ts.html +142 -0
  33. package/coverage/lcov-report/src/api/controllers/public/applications.ts.html +316 -0
  34. package/coverage/lcov-report/src/api/controllers/public/index.html +191 -0
  35. package/coverage/lcov-report/src/api/controllers/public/mapping/applications.ts.html +181 -0
  36. package/coverage/lcov-report/src/api/controllers/public/mapping/index.html +191 -0
  37. package/coverage/lcov-report/src/api/controllers/public/mapping/index.ts.html +124 -0
  38. package/coverage/lcov-report/src/api/controllers/public/mapping/queries.ts.html +202 -0
  39. package/coverage/lcov-report/src/api/controllers/public/mapping/rows.ts.html +178 -0
  40. package/coverage/lcov-report/src/api/controllers/public/mapping/tables.ts.html +163 -0
  41. package/coverage/lcov-report/src/api/controllers/public/mapping/users.ts.html +181 -0
  42. package/coverage/lcov-report/src/api/controllers/public/queries.ts.html +145 -0
  43. package/coverage/lcov-report/src/api/controllers/public/rows.ts.html +328 -0
  44. package/coverage/lcov-report/src/api/controllers/public/tables.ts.html +253 -0
  45. package/coverage/lcov-report/src/api/controllers/public/users.ts.html +268 -0
  46. package/coverage/lcov-report/src/api/controllers/public/utils.ts.html +220 -0
  47. package/coverage/lcov-report/src/api/controllers/query/import/index.html +116 -0
  48. package/coverage/lcov-report/src/api/controllers/query/import/index.ts.html +376 -0
  49. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.html +131 -0
  50. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.ts.html +379 -0
  51. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/openapi.ts.html +157 -0
  52. package/coverage/lcov-report/src/api/controllers/query/import/sources/curl.ts.html +403 -0
  53. package/coverage/lcov-report/src/api/controllers/query/import/sources/index.html +146 -0
  54. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi2.ts.html +586 -0
  55. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi3.ts.html +712 -0
  56. package/coverage/lcov-report/src/api/controllers/query/index.html +131 -0
  57. package/coverage/lcov-report/src/api/controllers/query/index.ts.html +985 -0
  58. package/coverage/lcov-report/{api → src/api}/controllers/query/validation.js.html +10 -10
  59. package/coverage/lcov-report/{api → src/api}/controllers/role.js.html +10 -10
  60. package/coverage/lcov-report/{api → src/api}/controllers/routing.js.html +10 -10
  61. package/coverage/lcov-report/src/api/controllers/row/ExternalRequest.ts.html +2332 -0
  62. package/coverage/lcov-report/{api → src/api}/controllers/row/external.js.html +10 -10
  63. package/coverage/lcov-report/{api → src/api}/controllers/row/index.html +48 -18
  64. package/coverage/lcov-report/src/api/controllers/row/index.ts.html +541 -0
  65. package/coverage/lcov-report/{api → src/api}/controllers/row/internal.js.html +10 -10
  66. package/coverage/lcov-report/{api → src/api}/controllers/row/internalSearch.js.html +10 -10
  67. package/coverage/lcov-report/{api → src/api}/controllers/row/staticFormula.js.html +10 -10
  68. package/coverage/lcov-report/{api → src/api}/controllers/row/utils.js.html +10 -10
  69. package/coverage/lcov-report/src/api/controllers/screen.ts.html +451 -0
  70. package/coverage/lcov-report/{api → src/api}/controllers/script.js.html +10 -10
  71. package/coverage/lcov-report/src/api/controllers/static/index.html +116 -0
  72. package/coverage/lcov-report/src/api/controllers/static/index.ts.html +700 -0
  73. package/coverage/lcov-report/{api → src/api}/controllers/table/bulkFormula.js.html +10 -10
  74. package/coverage/lcov-report/{api → src/api}/controllers/table/external.js.html +10 -10
  75. package/coverage/lcov-report/{api → src/api}/controllers/table/index.html +49 -19
  76. package/coverage/lcov-report/{api → src/api}/controllers/table/index.js.html +10 -10
  77. package/coverage/lcov-report/src/api/controllers/table/internal.ts.html +658 -0
  78. package/coverage/lcov-report/src/api/controllers/table/utils.ts.html +1240 -0
  79. package/coverage/lcov-report/{api → src/api}/controllers/templates.js.html +10 -10
  80. package/coverage/lcov-report/{api → src/api}/controllers/user.js.html +10 -10
  81. package/coverage/lcov-report/{api → src/api}/controllers/view/exporters.js.html +10 -10
  82. package/coverage/lcov-report/{api → src/api}/controllers/view/index.html +10 -10
  83. package/coverage/lcov-report/{api → src/api}/controllers/view/index.js.html +10 -10
  84. package/coverage/lcov-report/{api → src/api}/controllers/view/utils.js.html +10 -10
  85. package/coverage/lcov-report/{api → src/api}/controllers/view/viewBuilder.js.html +10 -10
  86. package/coverage/lcov-report/src/api/controllers/webhook.ts.html +379 -0
  87. package/coverage/lcov-report/{api → src/api}/index.html +10 -10
  88. package/coverage/lcov-report/{api → src/api}/index.js.html +10 -10
  89. package/coverage/lcov-report/{api → src/api}/routes/analytics.js.html +10 -10
  90. package/coverage/lcov-report/{api → src/api}/routes/apikeys.js.html +10 -10
  91. package/coverage/lcov-report/src/api/routes/application.ts.html +199 -0
  92. package/coverage/lcov-report/src/api/routes/auth.ts.html +109 -0
  93. package/coverage/lcov-report/{api → src/api}/routes/automation.js.html +10 -10
  94. package/coverage/lcov-report/src/api/routes/backup.ts.html +115 -0
  95. package/coverage/lcov-report/{api → src/api}/routes/cloud.js.html +10 -10
  96. package/coverage/lcov-report/{api → src/api}/routes/component.js.html +10 -10
  97. package/coverage/lcov-report/{api → src/api}/routes/datasource.js.html +10 -10
  98. package/coverage/lcov-report/{api → src/api}/routes/deploy.js.html +10 -10
  99. package/coverage/lcov-report/{api → src/api}/routes/dev.js.html +10 -10
  100. package/coverage/lcov-report/{api → src/api}/routes/index.html +137 -17
  101. package/coverage/lcov-report/src/api/routes/index.ts.html +289 -0
  102. package/coverage/lcov-report/{api → src/api}/routes/integration.js.html +10 -10
  103. package/coverage/lcov-report/{api → src/api}/routes/layout.js.html +10 -10
  104. package/coverage/lcov-report/{api → src/api}/routes/metadata.js.html +10 -10
  105. package/coverage/lcov-report/{api → src/api}/routes/migrations.js.html +10 -10
  106. package/coverage/lcov-report/{api → src/api}/routes/permission.js.html +10 -10
  107. package/coverage/lcov-report/src/api/routes/plugin.ts.html +127 -0
  108. package/coverage/lcov-report/src/api/routes/public/applications.ts.html +541 -0
  109. package/coverage/lcov-report/src/api/routes/public/index.html +191 -0
  110. package/coverage/lcov-report/src/api/routes/public/index.ts.html +502 -0
  111. package/coverage/lcov-report/src/api/routes/public/middleware/index.html +116 -0
  112. package/coverage/lcov-report/src/api/routes/public/middleware/mapper.ts.html +328 -0
  113. package/coverage/lcov-report/src/api/routes/public/queries.ts.html +313 -0
  114. package/coverage/lcov-report/src/api/routes/public/rows.ts.html +598 -0
  115. package/coverage/lcov-report/src/api/routes/public/tables.ts.html +586 -0
  116. package/coverage/lcov-report/src/api/routes/public/users.ts.html +511 -0
  117. package/coverage/lcov-report/src/api/routes/public/utils/Endpoint.ts.html +238 -0
  118. package/coverage/lcov-report/src/api/routes/public/utils/index.html +116 -0
  119. package/coverage/lcov-report/{api → src/api}/routes/query.js.html +10 -10
  120. package/coverage/lcov-report/{api → src/api}/routes/role.js.html +10 -10
  121. package/coverage/lcov-report/{api → src/api}/routes/routing.js.html +10 -10
  122. package/coverage/lcov-report/src/api/routes/row.ts.html +889 -0
  123. package/coverage/lcov-report/{api → src/api}/routes/screen.js.html +10 -10
  124. package/coverage/lcov-report/{api → src/api}/routes/script.js.html +10 -10
  125. package/coverage/lcov-report/src/api/routes/static.ts.html +289 -0
  126. package/coverage/lcov-report/{api → src/api}/routes/table.js.html +10 -10
  127. package/coverage/lcov-report/{api → src/api}/routes/templates.js.html +10 -10
  128. package/coverage/lcov-report/src/api/routes/tests/utilities/TestFunctions.ts.html +556 -0
  129. package/coverage/lcov-report/src/api/routes/tests/utilities/index.html +131 -0
  130. package/coverage/lcov-report/src/api/routes/tests/utilities/index.js.html +367 -0
  131. package/coverage/lcov-report/{api → src/api}/routes/user.js.html +10 -10
  132. package/coverage/lcov-report/{api → src/api}/routes/utils/index.html +10 -10
  133. package/coverage/lcov-report/{api → src/api}/routes/utils/validators.js.html +10 -10
  134. package/coverage/lcov-report/{api → src/api}/routes/view.js.html +10 -10
  135. package/coverage/lcov-report/src/api/routes/webhook.ts.html +166 -0
  136. package/coverage/lcov-report/src/app.ts.html +403 -0
  137. package/coverage/lcov-report/{automations → src/automations}/actions.js.html +10 -10
  138. package/coverage/lcov-report/{automations → src/automations}/automationUtils.js.html +10 -10
  139. package/coverage/lcov-report/{automations → src/automations}/bullboard.js.html +10 -10
  140. package/coverage/lcov-report/{automations → src/automations}/index.html +34 -19
  141. package/coverage/lcov-report/{automations → src/automations}/index.js.html +10 -10
  142. package/coverage/lcov-report/src/automations/logging/index.html +116 -0
  143. package/coverage/lcov-report/src/automations/logging/index.ts.html +199 -0
  144. package/coverage/lcov-report/{automations → src/automations}/steps/bash.js.html +10 -10
  145. package/coverage/lcov-report/src/automations/steps/createRow.ts.html +367 -0
  146. package/coverage/lcov-report/{automations → src/automations}/steps/delay.js.html +10 -10
  147. package/coverage/lcov-report/src/automations/steps/deleteRow.ts.html +334 -0
  148. package/coverage/lcov-report/{automations → src/automations}/steps/discord.js.html +10 -10
  149. package/coverage/lcov-report/{automations → src/automations}/steps/executeQuery.js.html +10 -10
  150. package/coverage/lcov-report/{automations → src/automations}/steps/executeScript.js.html +10 -10
  151. package/coverage/lcov-report/{automations → src/automations}/steps/filter.js.html +10 -10
  152. package/coverage/lcov-report/{automations → src/automations}/steps/index.html +48 -18
  153. package/coverage/lcov-report/{automations → src/automations}/steps/integromat.js.html +10 -10
  154. package/coverage/lcov-report/{automations → src/automations}/steps/loop.js.html +10 -10
  155. package/coverage/lcov-report/{automations → src/automations}/steps/outgoingWebhook.js.html +10 -10
  156. package/coverage/lcov-report/{automations → src/automations}/steps/queryRows.js.html +10 -10
  157. package/coverage/lcov-report/{automations → src/automations}/steps/sendSmtpEmail.js.html +10 -10
  158. package/coverage/lcov-report/{automations → src/automations}/steps/serverLog.js.html +10 -10
  159. package/coverage/lcov-report/{automations → src/automations}/steps/slack.js.html +10 -10
  160. package/coverage/lcov-report/{automations → src/automations}/steps/updateRow.js.html +10 -10
  161. package/coverage/lcov-report/{automations → src/automations}/steps/utils.js.html +10 -10
  162. package/coverage/lcov-report/{automations → src/automations}/steps/zapier.js.html +10 -10
  163. package/coverage/lcov-report/src/automations/tests/utilities/index.html +116 -0
  164. package/coverage/lcov-report/src/automations/tests/utilities/index.js.html +238 -0
  165. package/coverage/lcov-report/{automations → src/automations}/triggerInfo/app.js.html +10 -10
  166. package/coverage/lcov-report/{automations → src/automations}/triggerInfo/cron.js.html +10 -10
  167. package/coverage/lcov-report/{automations → src/automations}/triggerInfo/index.html +10 -10
  168. package/coverage/lcov-report/{automations → src/automations}/triggerInfo/index.js.html +10 -10
  169. package/coverage/lcov-report/{automations → src/automations}/triggerInfo/rowDeleted.js.html +10 -10
  170. package/coverage/lcov-report/{automations → src/automations}/triggerInfo/rowSaved.js.html +10 -10
  171. package/coverage/lcov-report/{automations → src/automations}/triggerInfo/rowUpdated.js.html +10 -10
  172. package/coverage/lcov-report/{automations → src/automations}/triggerInfo/webhook.js.html +10 -10
  173. package/coverage/lcov-report/{automations → src/automations}/triggers.js.html +10 -10
  174. package/coverage/lcov-report/src/automations/utils.ts.html +895 -0
  175. package/coverage/lcov-report/{constants → src/constants}/index.html +10 -10
  176. package/coverage/lcov-report/{constants → src/constants}/index.js.html +10 -10
  177. package/coverage/lcov-report/{constants → src/constants}/layouts.js.html +10 -10
  178. package/coverage/lcov-report/{constants → src/constants}/screens.js.html +10 -10
  179. package/coverage/lcov-report/src/db/dynamoClient.js.html +466 -0
  180. package/coverage/lcov-report/{db → src/db}/inMemoryView.js.html +10 -10
  181. package/coverage/lcov-report/{db → src/db}/index.html +33 -18
  182. package/coverage/lcov-report/{db → src/db}/index.js.html +10 -10
  183. package/coverage/lcov-report/{db → src/db}/linkedRows/LinkController.js.html +10 -10
  184. package/coverage/lcov-report/{db → src/db}/linkedRows/index.html +10 -10
  185. package/coverage/lcov-report/{db → src/db}/linkedRows/index.js.html +10 -10
  186. package/coverage/lcov-report/{db → src/db}/linkedRows/linkUtils.js.html +10 -10
  187. package/coverage/lcov-report/{db → src/db}/newid.js.html +10 -10
  188. package/coverage/lcov-report/{db → src/db}/utils.js.html +10 -10
  189. package/coverage/lcov-report/src/definitions/automations.ts.html +181 -0
  190. package/coverage/lcov-report/src/definitions/datasource.ts.html +235 -0
  191. package/coverage/lcov-report/src/definitions/index.html +131 -0
  192. package/coverage/lcov-report/src/environment.js.html +445 -0
  193. package/coverage/lcov-report/{events → src/events}/AutomationEmitter.js.html +10 -10
  194. package/coverage/lcov-report/{events → src/events}/index.html +10 -10
  195. package/coverage/lcov-report/{events → src/events}/index.js.html +10 -10
  196. package/coverage/lcov-report/{events → src/events}/utils.js.html +10 -10
  197. package/coverage/lcov-report/src/index.html +206 -0
  198. package/coverage/lcov-report/src/index.ts.html +133 -0
  199. package/coverage/lcov-report/src/integrations/airtable.ts.html +529 -0
  200. package/coverage/lcov-report/src/integrations/arangodb.ts.html +415 -0
  201. package/coverage/lcov-report/src/integrations/base/index.html +161 -0
  202. package/coverage/lcov-report/src/integrations/base/query.ts.html +133 -0
  203. package/coverage/lcov-report/src/integrations/base/sql.ts.html +1951 -0
  204. package/coverage/lcov-report/src/integrations/base/sqlTable.ts.html +691 -0
  205. package/coverage/lcov-report/src/integrations/base/utils.ts.html +121 -0
  206. package/coverage/lcov-report/src/integrations/couchdb.ts.html +406 -0
  207. package/coverage/lcov-report/src/integrations/dynamodb.ts.html +745 -0
  208. package/coverage/lcov-report/src/integrations/elasticsearch.ts.html +634 -0
  209. package/coverage/lcov-report/src/integrations/firebase.ts.html +646 -0
  210. package/coverage/lcov-report/src/integrations/googlesheets.ts.html +1321 -0
  211. package/coverage/lcov-report/src/integrations/index.html +371 -0
  212. package/coverage/lcov-report/src/integrations/index.ts.html +433 -0
  213. package/coverage/lcov-report/src/integrations/microsoftSqlServer.ts.html +1006 -0
  214. package/coverage/lcov-report/src/integrations/mongodb.ts.html +1864 -0
  215. package/coverage/lcov-report/src/integrations/mysql.ts.html +952 -0
  216. package/coverage/lcov-report/src/integrations/oracle.ts.html +1474 -0
  217. package/coverage/lcov-report/src/integrations/postgres.ts.html +1069 -0
  218. package/coverage/lcov-report/src/integrations/queries/index.html +116 -0
  219. package/coverage/lcov-report/src/integrations/queries/sql.ts.html +463 -0
  220. package/coverage/lcov-report/src/integrations/redis.ts.html +550 -0
  221. package/coverage/lcov-report/src/integrations/rest.ts.html +1381 -0
  222. package/coverage/lcov-report/src/integrations/s3.ts.html +862 -0
  223. package/coverage/lcov-report/src/integrations/snowflake.ts.html +376 -0
  224. package/coverage/lcov-report/{integrations → src/integrations}/tests/TestConfiguration.js.html +10 -10
  225. package/coverage/lcov-report/{integrations → src/integrations}/tests/index.html +10 -10
  226. package/coverage/lcov-report/src/integrations/utils.ts.html +1006 -0
  227. package/coverage/lcov-report/{middleware → src/middleware}/appInfo.js.html +10 -10
  228. package/coverage/lcov-report/src/middleware/authorized.ts.html +481 -0
  229. package/coverage/lcov-report/{middleware → src/middleware}/builder.js.html +10 -10
  230. package/coverage/lcov-report/{middleware → src/middleware}/currentapp.js.html +10 -10
  231. package/coverage/lcov-report/{middleware → src/middleware}/index.html +33 -18
  232. package/coverage/lcov-report/{middleware → src/middleware}/joi-validator.js.html +10 -10
  233. package/coverage/lcov-report/{middleware → src/middleware}/publicApi.js.html +10 -10
  234. package/coverage/lcov-report/{middleware → src/middleware}/resourceId.js.html +10 -10
  235. package/coverage/lcov-report/{middleware → src/middleware}/selfhost.js.html +10 -10
  236. package/coverage/lcov-report/{middleware → src/middleware}/utils.js.html +10 -10
  237. package/coverage/lcov-report/src/migrations/functions/appUrls.ts.html +187 -0
  238. package/coverage/lcov-report/src/migrations/functions/backfill/app/automations.ts.html +163 -0
  239. package/coverage/lcov-report/src/migrations/functions/backfill/app/datasources.ts.html +151 -0
  240. package/coverage/lcov-report/src/migrations/functions/backfill/app/index.html +206 -0
  241. package/coverage/lcov-report/src/migrations/functions/backfill/app/layouts.ts.html +172 -0
  242. package/coverage/lcov-report/src/migrations/functions/backfill/app/queries.ts.html +226 -0
  243. package/coverage/lcov-report/src/migrations/functions/backfill/app/roles.ts.html +151 -0
  244. package/coverage/lcov-report/src/migrations/functions/backfill/app/screens.ts.html +151 -0
  245. package/coverage/lcov-report/src/migrations/functions/backfill/app/tables.ts.html +175 -0
  246. package/coverage/lcov-report/src/migrations/functions/backfill/app.ts.html +532 -0
  247. package/coverage/lcov-report/src/migrations/functions/backfill/global/configs.ts.html +283 -0
  248. package/coverage/lcov-report/src/migrations/functions/backfill/global/index.html +146 -0
  249. package/coverage/lcov-report/src/migrations/functions/backfill/global/quotas.ts.html +265 -0
  250. package/coverage/lcov-report/src/migrations/functions/backfill/global/users.ts.html +232 -0
  251. package/coverage/lcov-report/src/migrations/functions/backfill/global.ts.html +724 -0
  252. package/coverage/lcov-report/src/migrations/functions/backfill/index.html +161 -0
  253. package/coverage/lcov-report/src/migrations/functions/backfill/index.ts.html +106 -0
  254. package/coverage/lcov-report/src/migrations/functions/backfill/installation.ts.html +235 -0
  255. package/coverage/lcov-report/src/migrations/functions/index.html +146 -0
  256. package/coverage/lcov-report/src/migrations/functions/syncQuotas.ts.html +130 -0
  257. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.html +161 -0
  258. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.ts.html +94 -0
  259. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncApps.ts.html +130 -0
  260. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncPlugins.ts.html +115 -0
  261. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncRows.ts.html +172 -0
  262. package/coverage/lcov-report/src/migrations/functions/userEmailViewCasing.ts.html +124 -0
  263. package/coverage/lcov-report/src/migrations/index.html +116 -0
  264. package/coverage/lcov-report/src/migrations/index.ts.html +403 -0
  265. package/coverage/lcov-report/src/migrations/tests/helpers.ts.html +205 -0
  266. package/coverage/lcov-report/src/migrations/tests/index.html +131 -0
  267. package/coverage/lcov-report/src/migrations/tests/structures.ts.html +283 -0
  268. package/coverage/lcov-report/src/module.d.ts.html +127 -0
  269. package/coverage/lcov-report/src/sdk/app/automations/index.html +131 -0
  270. package/coverage/lcov-report/src/sdk/app/automations/index.ts.html +100 -0
  271. package/coverage/lcov-report/src/sdk/app/automations/webhook.ts.html +214 -0
  272. package/coverage/lcov-report/src/sdk/app/backups/constants.ts.html +91 -0
  273. package/coverage/lcov-report/src/sdk/app/backups/exports.ts.html +598 -0
  274. package/coverage/lcov-report/src/sdk/app/backups/imports.ts.html +703 -0
  275. package/coverage/lcov-report/src/sdk/app/backups/index.html +176 -0
  276. package/coverage/lcov-report/src/sdk/app/backups/index.ts.html +112 -0
  277. package/coverage/lcov-report/src/sdk/app/backups/statistics.ts.html +319 -0
  278. package/coverage/lcov-report/src/sdk/app/tables/index.html +116 -0
  279. package/coverage/lcov-report/src/sdk/app/tables/index.ts.html +268 -0
  280. package/coverage/lcov-report/{utilities/routing → src/sdk}/index.html +10 -10
  281. package/coverage/lcov-report/src/sdk/index.ts.html +130 -0
  282. package/coverage/lcov-report/src/startup.ts.html +499 -0
  283. package/coverage/lcov-report/src/tests/utilities/TestConfiguration.js.html +1873 -0
  284. package/coverage/lcov-report/src/tests/utilities/controllers.js.html +133 -0
  285. package/coverage/lcov-report/src/tests/utilities/index.html +161 -0
  286. package/coverage/lcov-report/src/tests/utilities/index.js.html +118 -0
  287. package/coverage/lcov-report/src/tests/utilities/structures.js.html +652 -0
  288. package/coverage/lcov-report/src/threads/automation.ts.html +1597 -0
  289. package/coverage/lcov-report/src/threads/index.html +161 -0
  290. package/coverage/lcov-report/src/threads/index.ts.html +418 -0
  291. package/coverage/lcov-report/src/threads/query.ts.html +976 -0
  292. package/coverage/lcov-report/src/threads/utils.ts.html +376 -0
  293. package/coverage/lcov-report/{utilities → src/utilities}/budibaseDir.js.html +10 -10
  294. package/coverage/lcov-report/{utilities → src/utilities}/centralPath.js.html +10 -10
  295. package/coverage/lcov-report/{utilities → src/utilities}/csvParser.js.html +10 -10
  296. package/coverage/lcov-report/src/utilities/fileSystem/clientLibrary.js.html +547 -0
  297. package/coverage/lcov-report/src/utilities/fileSystem/index.html +161 -0
  298. package/coverage/lcov-report/src/utilities/fileSystem/index.js.html +1141 -0
  299. package/coverage/lcov-report/src/utilities/fileSystem/processor.js.html +148 -0
  300. package/coverage/lcov-report/src/utilities/fileSystem/utilities.js.html +193 -0
  301. package/coverage/lcov-report/{utilities → src/utilities}/global.js.html +10 -10
  302. package/coverage/lcov-report/{utilities → src/utilities}/index.html +33 -18
  303. package/coverage/lcov-report/{utilities → src/utilities}/index.js.html +10 -10
  304. package/coverage/lcov-report/{utilities → src/utilities}/plugins.js.html +10 -10
  305. package/coverage/lcov-report/{utilities → src/utilities}/queue/inMemoryQueue.js.html +10 -10
  306. package/coverage/lcov-report/{utilities → src/utilities}/queue/index.html +10 -10
  307. package/coverage/lcov-report/src/utilities/redis.js.html +340 -0
  308. package/coverage/lcov-report/{api/controllers/query → src/utilities/routing}/index.html +8 -8
  309. package/coverage/lcov-report/{utilities → src/utilities}/routing/index.js.html +10 -10
  310. package/coverage/lcov-report/{utilities → src/utilities}/rowProcessor/index.html +10 -10
  311. package/coverage/lcov-report/{utilities → src/utilities}/rowProcessor/index.js.html +10 -10
  312. package/coverage/lcov-report/{utilities → src/utilities}/rowProcessor/utils.js.html +10 -10
  313. package/coverage/lcov-report/{utilities → src/utilities}/scriptRunner.js.html +10 -10
  314. package/coverage/lcov-report/{utilities → src/utilities}/security.js.html +10 -10
  315. package/coverage/lcov-report/{utilities → src/utilities}/statusCodes.js.html +10 -10
  316. package/coverage/lcov-report/{utilities → src/utilities}/usageQuota/index.html +10 -10
  317. package/coverage/lcov-report/{utilities → src/utilities}/usageQuota/rows.js.html +10 -10
  318. package/coverage/lcov-report/{utilities → src/utilities}/usageQuota/usageQuoteReset.js.html +10 -10
  319. package/coverage/lcov-report/{utilities → src/utilities}/users.js.html +10 -10
  320. package/coverage/lcov-report/{utilities → src/utilities}/workerRequests.js.html +10 -10
  321. package/coverage/lcov-report/src/watch.ts.html +199 -0
  322. package/coverage/lcov-report/src/websocket.ts.html +163 -0
  323. package/coverage/lcov.info +17327 -4751
  324. package/dist/package.json +10 -44
  325. package/dist/tests/utilities/TestConfiguration.js +3 -1
  326. package/dist/tsconfig.build.tsbuildinfo +1 -1
  327. package/jest.config.ts +32 -0
  328. package/package.json +11 -45
  329. package/{scripts/jestSetup.js → src/tests/jestSetup.ts} +11 -2
  330. package/src/tests/utilities/TestConfiguration.js +3 -1
  331. package/tsconfig.json +3 -1
@@ -0,0 +1,1996 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/api/controllers/application.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../../prettify.css" />
9
+ <link rel="stylesheet" href="../../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../../index.html">All files</a> / <a href="index.html">src/api/controllers</a> application.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">85.58% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>291/340</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">67.5% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>81/120</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">96.55% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>56/58</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">84.38% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>254/301</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 oninput="onInput()" 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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">44x</span>
704
+ <span class="cline-any cline-yes">44x</span>
705
+ <span class="cline-any cline-yes">44x</span>
706
+ <span class="cline-any cline-neutral">&nbsp;</span>
707
+ <span class="cline-any cline-neutral">&nbsp;</span>
708
+ <span class="cline-any cline-neutral">&nbsp;</span>
709
+ <span class="cline-any cline-neutral">&nbsp;</span>
710
+ <span class="cline-any cline-yes">44x</span>
711
+ <span class="cline-any cline-yes">44x</span>
712
+ <span class="cline-any cline-neutral">&nbsp;</span>
713
+ <span class="cline-any cline-neutral">&nbsp;</span>
714
+ <span class="cline-any cline-neutral">&nbsp;</span>
715
+ <span class="cline-any cline-neutral">&nbsp;</span>
716
+ <span class="cline-any cline-neutral">&nbsp;</span>
717
+ <span class="cline-any cline-neutral">&nbsp;</span>
718
+ <span class="cline-any cline-neutral">&nbsp;</span>
719
+ <span class="cline-any cline-neutral">&nbsp;</span>
720
+ <span class="cline-any cline-neutral">&nbsp;</span>
721
+ <span class="cline-any cline-neutral">&nbsp;</span>
722
+ <span class="cline-any cline-yes">44x</span>
723
+ <span class="cline-any cline-yes">44x</span>
724
+ <span class="cline-any cline-neutral">&nbsp;</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-neutral">&nbsp;</span>
727
+ <span class="cline-any cline-neutral">&nbsp;</span>
728
+ <span class="cline-any cline-neutral">&nbsp;</span>
729
+ <span class="cline-any cline-yes">44x</span>
730
+ <span class="cline-any cline-yes">44x</span>
731
+ <span class="cline-any cline-yes">44x</span>
732
+ <span class="cline-any cline-yes">44x</span>
733
+ <span class="cline-any cline-yes">44x</span>
734
+ <span class="cline-any cline-yes">44x</span>
735
+ <span class="cline-any cline-neutral">&nbsp;</span>
736
+ <span class="cline-any cline-neutral">&nbsp;</span>
737
+ <span class="cline-any cline-neutral">&nbsp;</span>
738
+ <span class="cline-any cline-neutral">&nbsp;</span>
739
+ <span class="cline-any cline-yes">44x</span>
740
+ <span class="cline-any cline-yes">44x</span>
741
+ <span class="cline-any cline-yes">44x</span>
742
+ <span class="cline-any cline-yes">44x</span>
743
+ <span class="cline-any cline-yes">44x</span>
744
+ <span class="cline-any cline-yes">44x</span>
745
+ <span class="cline-any cline-yes">44x</span>
746
+ <span class="cline-any cline-yes">44x</span>
747
+ <span class="cline-any cline-yes">44x</span>
748
+ <span class="cline-any cline-yes">44x</span>
749
+ <span class="cline-any cline-yes">44x</span>
750
+ <span class="cline-any cline-yes">44x</span>
751
+ <span class="cline-any cline-yes">44x</span>
752
+ <span class="cline-any cline-neutral">&nbsp;</span>
753
+ <span class="cline-any cline-yes">44x</span>
754
+ <span class="cline-any cline-neutral">&nbsp;</span>
755
+ <span class="cline-any cline-neutral">&nbsp;</span>
756
+ <span class="cline-any cline-neutral">&nbsp;</span>
757
+ <span class="cline-any cline-yes">8x</span>
758
+ <span class="cline-any cline-yes">8x</span>
759
+ <span class="cline-any cline-neutral">&nbsp;</span>
760
+ <span class="cline-any cline-neutral">&nbsp;</span>
761
+ <span class="cline-any cline-neutral">&nbsp;</span>
762
+ <span class="cline-any cline-neutral">&nbsp;</span>
763
+ <span class="cline-any cline-neutral">&nbsp;</span>
764
+ <span class="cline-any cline-yes">2x</span>
765
+ <span class="cline-any cline-neutral">&nbsp;</span>
766
+ <span class="cline-any cline-neutral">&nbsp;</span>
767
+ <span class="cline-any cline-neutral">&nbsp;</span>
768
+ <span class="cline-any cline-yes">8x</span>
769
+ <span class="cline-any cline-yes">8x</span>
770
+ <span class="cline-any cline-neutral">&nbsp;</span>
771
+ <span class="cline-any cline-neutral">&nbsp;</span>
772
+ <span class="cline-any cline-neutral">&nbsp;</span>
773
+ <span class="cline-any cline-neutral">&nbsp;</span>
774
+ <span class="cline-any cline-neutral">&nbsp;</span>
775
+ <span class="cline-any cline-yes">1x</span>
776
+ <span class="cline-any cline-neutral">&nbsp;</span>
777
+ <span class="cline-any cline-neutral">&nbsp;</span>
778
+ <span class="cline-any cline-neutral">&nbsp;</span>
779
+ <span class="cline-any cline-yes">1x</span>
780
+ <span class="cline-any cline-neutral">&nbsp;</span>
781
+ <span class="cline-any cline-neutral">&nbsp;</span>
782
+ <span class="cline-any cline-neutral">&nbsp;</span>
783
+ <span class="cline-any cline-neutral">&nbsp;</span>
784
+ <span class="cline-any cline-yes">44x</span>
785
+ <span class="cline-any cline-neutral">&nbsp;</span>
786
+ <span class="cline-any cline-neutral">&nbsp;</span>
787
+ <span class="cline-any cline-yes">252x</span>
788
+ <span class="cline-any cline-neutral">&nbsp;</span>
789
+ <span class="cline-any cline-yes">1x</span>
790
+ <span class="cline-any cline-yes">251x</span>
791
+ <span class="cline-any cline-neutral">&nbsp;</span>
792
+ <span class="cline-any cline-yes">251x</span>
793
+ <span class="cline-any cline-neutral">&nbsp;</span>
794
+ <span class="cline-any cline-yes">252x</span>
795
+ <span class="cline-any cline-yes">252x</span>
796
+ <span class="cline-any cline-neutral">&nbsp;</span>
797
+ <span class="cline-any cline-yes">252x</span>
798
+ <span class="cline-any cline-neutral">&nbsp;</span>
799
+ <span class="cline-any cline-neutral">&nbsp;</span>
800
+ <span class="cline-any cline-yes">44x</span>
801
+ <span class="cline-any cline-yes">251x</span>
802
+ <span class="cline-any cline-yes">4x</span>
803
+ <span class="cline-any cline-neutral">&nbsp;</span>
804
+ <span class="cline-any cline-yes">1168x</span>
805
+ <span class="cline-any cline-no">&nbsp;</span>
806
+ <span class="cline-any cline-neutral">&nbsp;</span>
807
+ <span class="cline-any cline-neutral">&nbsp;</span>
808
+ <span class="cline-any cline-neutral">&nbsp;</span>
809
+ <span class="cline-any cline-yes">44x</span>
810
+ <span class="cline-any cline-neutral">&nbsp;</span>
811
+ <span class="cline-any cline-neutral">&nbsp;</span>
812
+ <span class="cline-any cline-neutral">&nbsp;</span>
813
+ <span class="cline-any cline-neutral">&nbsp;</span>
814
+ <span class="cline-any cline-neutral">&nbsp;</span>
815
+ <span class="cline-any cline-neutral">&nbsp;</span>
816
+ <span class="cline-any cline-yes">251x</span>
817
+ <span class="cline-any cline-no">&nbsp;</span>
818
+ <span class="cline-any cline-neutral">&nbsp;</span>
819
+ <span class="cline-any cline-yes">251x</span>
820
+ <span class="cline-any cline-yes">4x</span>
821
+ <span class="cline-any cline-neutral">&nbsp;</span>
822
+ <span class="cline-any cline-yes">1168x</span>
823
+ <span class="cline-any cline-no">&nbsp;</span>
824
+ <span class="cline-any cline-neutral">&nbsp;</span>
825
+ <span class="cline-any cline-neutral">&nbsp;</span>
826
+ <span class="cline-any cline-neutral">&nbsp;</span>
827
+ <span class="cline-any cline-neutral">&nbsp;</span>
828
+ <span class="cline-any cline-yes">248x</span>
829
+ <span class="cline-any cline-yes">248x</span>
830
+ <span class="cline-any cline-yes">248x</span>
831
+ <span class="cline-any cline-yes">248x</span>
832
+ <span class="cline-any cline-neutral">&nbsp;</span>
833
+ <span class="cline-any cline-yes">248x</span>
834
+ <span class="cline-any cline-yes">248x</span>
835
+ <span class="cline-any cline-neutral">&nbsp;</span>
836
+ <span class="cline-any cline-neutral">&nbsp;</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-neutral">&nbsp;</span>
839
+ <span class="cline-any cline-neutral">&nbsp;</span>
840
+ <span class="cline-any cline-neutral">&nbsp;</span>
841
+ <span class="cline-any cline-neutral">&nbsp;</span>
842
+ <span class="cline-any cline-neutral">&nbsp;</span>
843
+ <span class="cline-any cline-yes">248x</span>
844
+ <span class="cline-any cline-yes">248x</span>
845
+ <span class="cline-any cline-yes">248x</span>
846
+ <span class="cline-any cline-neutral">&nbsp;</span>
847
+ <span class="cline-any cline-neutral">&nbsp;</span>
848
+ <span class="cline-any cline-neutral">&nbsp;</span>
849
+ <span class="cline-any cline-yes">248x</span>
850
+ <span class="cline-any cline-yes">1x</span>
851
+ <span class="cline-any cline-yes">1x</span>
852
+ <span class="cline-any cline-no">&nbsp;</span>
853
+ <span class="cline-any cline-neutral">&nbsp;</span>
854
+ <span class="cline-any cline-yes">247x</span>
855
+ <span class="cline-any cline-yes">2x</span>
856
+ <span class="cline-any cline-neutral">&nbsp;</span>
857
+ <span class="cline-any cline-neutral">&nbsp;</span>
858
+ <span class="cline-any cline-yes">245x</span>
859
+ <span class="cline-any cline-neutral">&nbsp;</span>
860
+ <span class="cline-any cline-neutral">&nbsp;</span>
861
+ <span class="cline-any cline-yes">248x</span>
862
+ <span class="cline-any cline-neutral">&nbsp;</span>
863
+ <span class="cline-any cline-neutral">&nbsp;</span>
864
+ <span class="cline-any cline-yes">44x</span>
865
+ <span class="cline-any cline-yes">15x</span>
866
+ <span class="cline-any cline-yes">15x</span>
867
+ <span class="cline-any cline-yes">15x</span>
868
+ <span class="cline-any cline-neutral">&nbsp;</span>
869
+ <span class="cline-any cline-yes">15x</span>
870
+ <span class="cline-any cline-yes">23x</span>
871
+ <span class="cline-any cline-yes">23x</span>
872
+ <span class="cline-any cline-neutral">&nbsp;</span>
873
+ <span class="cline-any cline-yes">15x</span>
874
+ <span class="cline-any cline-yes">15x</span>
875
+ <span class="cline-any cline-yes">15x</span>
876
+ <span class="cline-any cline-yes">23x</span>
877
+ <span class="cline-any cline-yes">23x</span>
878
+ <span class="cline-any cline-no">&nbsp;</span>
879
+ <span class="cline-any cline-neutral">&nbsp;</span>
880
+ <span class="cline-any cline-neutral">&nbsp;</span>
881
+ <span class="cline-any cline-yes">23x</span>
882
+ <span class="cline-any cline-neutral">&nbsp;</span>
883
+ <span class="cline-any cline-neutral">&nbsp;</span>
884
+ <span class="cline-any cline-neutral">&nbsp;</span>
885
+ <span class="cline-any cline-neutral">&nbsp;</span>
886
+ <span class="cline-any cline-yes">15x</span>
887
+ <span class="cline-any cline-neutral">&nbsp;</span>
888
+ <span class="cline-any cline-neutral">&nbsp;</span>
889
+ <span class="cline-any cline-yes">44x</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">1x</span>
894
+ <span class="cline-any cline-neutral">&nbsp;</span>
895
+ <span class="cline-any cline-neutral">&nbsp;</span>
896
+ <span class="cline-any cline-neutral">&nbsp;</span>
897
+ <span class="cline-any cline-yes">1x</span>
898
+ <span class="cline-any cline-neutral">&nbsp;</span>
899
+ <span class="cline-any cline-neutral">&nbsp;</span>
900
+ <span class="cline-any cline-neutral">&nbsp;</span>
901
+ <span class="cline-any cline-neutral">&nbsp;</span>
902
+ <span class="cline-any cline-neutral">&nbsp;</span>
903
+ <span class="cline-any cline-neutral">&nbsp;</span>
904
+ <span class="cline-any cline-yes">44x</span>
905
+ <span class="cline-any cline-yes">6x</span>
906
+ <span class="cline-any cline-yes">6x</span>
907
+ <span class="cline-any cline-yes">6x</span>
908
+ <span class="cline-any cline-yes">6x</span>
909
+ <span class="cline-any cline-neutral">&nbsp;</span>
910
+ <span class="cline-any cline-neutral">&nbsp;</span>
911
+ <span class="cline-any cline-yes">6x</span>
912
+ <span class="cline-any cline-neutral">&nbsp;</span>
913
+ <span class="cline-any cline-neutral">&nbsp;</span>
914
+ <span class="cline-any cline-yes">6x</span>
915
+ <span class="cline-any cline-no">&nbsp;</span>
916
+ <span class="cline-any cline-no">&nbsp;</span>
917
+ <span class="cline-any cline-no">&nbsp;</span>
918
+ <span class="cline-any cline-neutral">&nbsp;</span>
919
+ <span class="cline-any cline-neutral">&nbsp;</span>
920
+ <span class="cline-any cline-yes">6x</span>
921
+ <span class="cline-any cline-neutral">&nbsp;</span>
922
+ <span class="cline-any cline-neutral">&nbsp;</span>
923
+ <span class="cline-any cline-neutral">&nbsp;</span>
924
+ <span class="cline-any cline-neutral">&nbsp;</span>
925
+ <span class="cline-any cline-neutral">&nbsp;</span>
926
+ <span class="cline-any cline-neutral">&nbsp;</span>
927
+ <span class="cline-any cline-neutral">&nbsp;</span>
928
+ <span class="cline-any cline-yes">248x</span>
929
+ <span class="cline-any cline-yes">248x</span>
930
+ <span class="cline-any cline-yes">248x</span>
931
+ <span class="cline-any cline-yes">248x</span>
932
+ <span class="cline-any cline-yes">248x</span>
933
+ <span class="cline-any cline-yes">248x</span>
934
+ <span class="cline-any cline-neutral">&nbsp;</span>
935
+ <span class="cline-any cline-yes">248x</span>
936
+ <span class="cline-any cline-yes">248x</span>
937
+ <span class="cline-any cline-neutral">&nbsp;</span>
938
+ <span class="cline-any cline-neutral">&nbsp;</span>
939
+ <span class="cline-any cline-neutral">&nbsp;</span>
940
+ <span class="cline-any cline-neutral">&nbsp;</span>
941
+ <span class="cline-any cline-yes">248x</span>
942
+ <span class="cline-any cline-yes">2x</span>
943
+ <span class="cline-any cline-neutral">&nbsp;</span>
944
+ <span class="cline-any cline-yes">248x</span>
945
+ <span class="cline-any cline-yes">248x</span>
946
+ <span class="cline-any cline-yes">248x</span>
947
+ <span class="cline-any cline-neutral">&nbsp;</span>
948
+ <span class="cline-any cline-yes">248x</span>
949
+ <span class="cline-any cline-neutral">&nbsp;</span>
950
+ <span class="cline-any cline-neutral">&nbsp;</span>
951
+ <span class="cline-any cline-neutral">&nbsp;</span>
952
+ <span class="cline-any cline-neutral">&nbsp;</span>
953
+ <span class="cline-any cline-neutral">&nbsp;</span>
954
+ <span class="cline-any cline-neutral">&nbsp;</span>
955
+ <span class="cline-any cline-neutral">&nbsp;</span>
956
+ <span class="cline-any cline-neutral">&nbsp;</span>
957
+ <span class="cline-any cline-neutral">&nbsp;</span>
958
+ <span class="cline-any cline-neutral">&nbsp;</span>
959
+ <span class="cline-any cline-neutral">&nbsp;</span>
960
+ <span class="cline-any cline-neutral">&nbsp;</span>
961
+ <span class="cline-any cline-neutral">&nbsp;</span>
962
+ <span class="cline-any cline-neutral">&nbsp;</span>
963
+ <span class="cline-any cline-neutral">&nbsp;</span>
964
+ <span class="cline-any cline-neutral">&nbsp;</span>
965
+ <span class="cline-any cline-neutral">&nbsp;</span>
966
+ <span class="cline-any cline-neutral">&nbsp;</span>
967
+ <span class="cline-any cline-neutral">&nbsp;</span>
968
+ <span class="cline-any cline-neutral">&nbsp;</span>
969
+ <span class="cline-any cline-neutral">&nbsp;</span>
970
+ <span class="cline-any cline-neutral">&nbsp;</span>
971
+ <span class="cline-any cline-neutral">&nbsp;</span>
972
+ <span class="cline-any cline-neutral">&nbsp;</span>
973
+ <span class="cline-any cline-neutral">&nbsp;</span>
974
+ <span class="cline-any cline-neutral">&nbsp;</span>
975
+ <span class="cline-any cline-neutral">&nbsp;</span>
976
+ <span class="cline-any cline-neutral">&nbsp;</span>
977
+ <span class="cline-any cline-neutral">&nbsp;</span>
978
+ <span class="cline-any cline-neutral">&nbsp;</span>
979
+ <span class="cline-any cline-neutral">&nbsp;</span>
980
+ <span class="cline-any cline-neutral">&nbsp;</span>
981
+ <span class="cline-any cline-neutral">&nbsp;</span>
982
+ <span class="cline-any cline-neutral">&nbsp;</span>
983
+ <span class="cline-any cline-yes">248x</span>
984
+ <span class="cline-any cline-yes">248x</span>
985
+ <span class="cline-any cline-yes">1x</span>
986
+ <span class="cline-any cline-neutral">&nbsp;</span>
987
+ <span class="cline-any cline-neutral">&nbsp;</span>
988
+ <span class="cline-any cline-neutral">&nbsp;</span>
989
+ <span class="cline-any cline-neutral">&nbsp;</span>
990
+ <span class="cline-any cline-neutral">&nbsp;</span>
991
+ <span class="cline-any cline-neutral">&nbsp;</span>
992
+ <span class="cline-any cline-yes">1x</span>
993
+ <span class="cline-any cline-yes">5x</span>
994
+ <span class="cline-any cline-neutral">&nbsp;</span>
995
+ <span class="cline-any cline-yes">2x</span>
996
+ <span class="cline-any cline-neutral">&nbsp;</span>
997
+ <span class="cline-any cline-neutral">&nbsp;</span>
998
+ <span class="cline-any cline-neutral">&nbsp;</span>
999
+ <span class="cline-any cline-neutral">&nbsp;</span>
1000
+ <span class="cline-any cline-yes">1x</span>
1001
+ <span class="cline-any cline-yes">1x</span>
1002
+ <span class="cline-any cline-yes">1x</span>
1003
+ <span class="cline-any cline-yes">1x</span>
1004
+ <span class="cline-any cline-neutral">&nbsp;</span>
1005
+ <span class="cline-any cline-neutral">&nbsp;</span>
1006
+ <span class="cline-any cline-neutral">&nbsp;</span>
1007
+ <span class="cline-any cline-neutral">&nbsp;</span>
1008
+ <span class="cline-any cline-neutral">&nbsp;</span>
1009
+ <span class="cline-any cline-neutral">&nbsp;</span>
1010
+ <span class="cline-any cline-yes">248x</span>
1011
+ <span class="cline-any cline-yes">248x</span>
1012
+ <span class="cline-any cline-neutral">&nbsp;</span>
1013
+ <span class="cline-any cline-neutral">&nbsp;</span>
1014
+ <span class="cline-any cline-neutral">&nbsp;</span>
1015
+ <span class="cline-any cline-neutral">&nbsp;</span>
1016
+ <span class="cline-any cline-neutral">&nbsp;</span>
1017
+ <span class="cline-any cline-neutral">&nbsp;</span>
1018
+ <span class="cline-any cline-yes">248x</span>
1019
+ <span class="cline-any cline-yes">248x</span>
1020
+ <span class="cline-any cline-neutral">&nbsp;</span>
1021
+ <span class="cline-any cline-neutral">&nbsp;</span>
1022
+ <span class="cline-any cline-yes">248x</span>
1023
+ <span class="cline-any cline-yes">248x</span>
1024
+ <span class="cline-any cline-neutral">&nbsp;</span>
1025
+ <span class="cline-any cline-yes">248x</span>
1026
+ <span class="cline-any cline-yes">248x</span>
1027
+ <span class="cline-any cline-neutral">&nbsp;</span>
1028
+ <span class="cline-any cline-yes">3x</span>
1029
+ <span class="cline-any cline-yes">1x</span>
1030
+ <span class="cline-any cline-neutral">&nbsp;</span>
1031
+ <span class="cline-any cline-neutral">&nbsp;</span>
1032
+ <span class="cline-any cline-yes">2x</span>
1033
+ <span class="cline-any cline-yes">2x</span>
1034
+ <span class="cline-any cline-neutral">&nbsp;</span>
1035
+ <span class="cline-any cline-neutral">&nbsp;</span>
1036
+ <span class="cline-any cline-neutral">&nbsp;</span>
1037
+ <span class="cline-any cline-no">&nbsp;</span>
1038
+ <span class="cline-any cline-neutral">&nbsp;</span>
1039
+ <span class="cline-any cline-neutral">&nbsp;</span>
1040
+ <span class="cline-any cline-yes">248x</span>
1041
+ <span class="cline-any cline-neutral">&nbsp;</span>
1042
+ <span class="cline-any cline-yes">248x</span>
1043
+ <span class="cline-any cline-yes">251x</span>
1044
+ <span class="cline-any cline-neutral">&nbsp;</span>
1045
+ <span class="cline-any cline-neutral">&nbsp;</span>
1046
+ <span class="cline-any cline-neutral">&nbsp;</span>
1047
+ <span class="cline-any cline-yes">248x</span>
1048
+ <span class="cline-any cline-yes">248x</span>
1049
+ <span class="cline-any cline-yes">248x</span>
1050
+ <span class="cline-any cline-neutral">&nbsp;</span>
1051
+ <span class="cline-any cline-neutral">&nbsp;</span>
1052
+ <span class="cline-any cline-neutral">&nbsp;</span>
1053
+ <span class="cline-any cline-neutral">&nbsp;</span>
1054
+ <span class="cline-any cline-yes">248x</span>
1055
+ <span class="cline-any cline-neutral">&nbsp;</span>
1056
+ <span class="cline-any cline-yes">248x</span>
1057
+ <span class="cline-any cline-yes">3x</span>
1058
+ <span class="cline-any cline-yes">3x</span>
1059
+ <span class="cline-any cline-yes">3x</span>
1060
+ <span class="cline-any cline-no">&nbsp;</span>
1061
+ <span class="cline-any cline-no">&nbsp;</span>
1062
+ <span class="cline-any cline-neutral">&nbsp;</span>
1063
+ <span class="cline-any cline-no">&nbsp;</span>
1064
+ <span class="cline-any cline-neutral">&nbsp;</span>
1065
+ <span class="cline-any cline-neutral">&nbsp;</span>
1066
+ <span class="cline-any cline-neutral">&nbsp;</span>
1067
+ <span class="cline-any cline-no">&nbsp;</span>
1068
+ <span class="cline-any cline-no">&nbsp;</span>
1069
+ <span class="cline-any cline-neutral">&nbsp;</span>
1070
+ <span class="cline-any cline-no">&nbsp;</span>
1071
+ <span class="cline-any cline-neutral">&nbsp;</span>
1072
+ <span class="cline-any cline-neutral">&nbsp;</span>
1073
+ <span class="cline-any cline-neutral">&nbsp;</span>
1074
+ <span class="cline-any cline-neutral">&nbsp;</span>
1075
+ <span class="cline-any cline-neutral">&nbsp;</span>
1076
+ <span class="cline-any cline-yes">248x</span>
1077
+ <span class="cline-any cline-yes">248x</span>
1078
+ <span class="cline-any cline-yes">248x</span>
1079
+ <span class="cline-any cline-yes">248x</span>
1080
+ <span class="cline-any cline-yes">248x</span>
1081
+ <span class="cline-any cline-yes">248x</span>
1082
+ <span class="cline-any cline-neutral">&nbsp;</span>
1083
+ <span class="cline-any cline-neutral">&nbsp;</span>
1084
+ <span class="cline-any cline-neutral">&nbsp;</span>
1085
+ <span class="cline-any cline-neutral">&nbsp;</span>
1086
+ <span class="cline-any cline-yes">44x</span>
1087
+ <span class="cline-any cline-yes">3x</span>
1088
+ <span class="cline-any cline-neutral">&nbsp;</span>
1089
+ <span class="cline-any cline-yes">3x</span>
1090
+ <span class="cline-any cline-yes">3x</span>
1091
+ <span class="cline-any cline-yes">3x</span>
1092
+ <span class="cline-any cline-neutral">&nbsp;</span>
1093
+ <span class="cline-any cline-yes">3x</span>
1094
+ <span class="cline-any cline-yes">3x</span>
1095
+ <span class="cline-any cline-yes">3x</span>
1096
+ <span class="cline-any cline-yes">3x</span>
1097
+ <span class="cline-any cline-neutral">&nbsp;</span>
1098
+ <span class="cline-any cline-neutral">&nbsp;</span>
1099
+ <span class="cline-any cline-yes">3x</span>
1100
+ <span class="cline-any cline-yes">3x</span>
1101
+ <span class="cline-any cline-yes">3x</span>
1102
+ <span class="cline-any cline-yes">3x</span>
1103
+ <span class="cline-any cline-neutral">&nbsp;</span>
1104
+ <span class="cline-any cline-neutral">&nbsp;</span>
1105
+ <span class="cline-any cline-yes">44x</span>
1106
+ <span class="cline-any cline-neutral">&nbsp;</span>
1107
+ <span class="cline-any cline-yes">2x</span>
1108
+ <span class="cline-any cline-yes">2x</span>
1109
+ <span class="cline-any cline-yes">2x</span>
1110
+ <span class="cline-any cline-neutral">&nbsp;</span>
1111
+ <span class="cline-any cline-neutral">&nbsp;</span>
1112
+ <span class="cline-any cline-yes">2x</span>
1113
+ <span class="cline-any cline-no">&nbsp;</span>
1114
+ <span class="cline-any cline-no">&nbsp;</span>
1115
+ <span class="cline-any cline-neutral">&nbsp;</span>
1116
+ <span class="cline-any cline-neutral">&nbsp;</span>
1117
+ <span class="cline-any cline-neutral">&nbsp;</span>
1118
+ <span class="cline-any cline-yes">2x</span>
1119
+ <span class="cline-any cline-yes">2x</span>
1120
+ <span class="cline-any cline-neutral">&nbsp;</span>
1121
+ <span class="cline-any cline-neutral">&nbsp;</span>
1122
+ <span class="cline-any cline-neutral">&nbsp;</span>
1123
+ <span class="cline-any cline-yes">2x</span>
1124
+ <span class="cline-any cline-yes">2x</span>
1125
+ <span class="cline-any cline-yes">2x</span>
1126
+ <span class="cline-any cline-yes">2x</span>
1127
+ <span class="cline-any cline-neutral">&nbsp;</span>
1128
+ <span class="cline-any cline-neutral">&nbsp;</span>
1129
+ <span class="cline-any cline-yes">44x</span>
1130
+ <span class="cline-any cline-neutral">&nbsp;</span>
1131
+ <span class="cline-any cline-yes">1x</span>
1132
+ <span class="cline-any cline-yes">1x</span>
1133
+ <span class="cline-any cline-yes">1x</span>
1134
+ <span class="cline-any cline-no">&nbsp;</span>
1135
+ <span class="cline-any cline-neutral">&nbsp;</span>
1136
+ <span class="cline-any cline-neutral">&nbsp;</span>
1137
+ <span class="cline-any cline-neutral">&nbsp;</span>
1138
+ <span class="cline-any cline-yes">1x</span>
1139
+ <span class="cline-any cline-no">&nbsp;</span>
1140
+ <span class="cline-any cline-neutral">&nbsp;</span>
1141
+ <span class="cline-any cline-neutral">&nbsp;</span>
1142
+ <span class="cline-any cline-neutral">&nbsp;</span>
1143
+ <span class="cline-any cline-yes">1x</span>
1144
+ <span class="cline-any cline-yes">1x</span>
1145
+ <span class="cline-any cline-yes">1x</span>
1146
+ <span class="cline-any cline-neutral">&nbsp;</span>
1147
+ <span class="cline-any cline-neutral">&nbsp;</span>
1148
+ <span class="cline-any cline-neutral">&nbsp;</span>
1149
+ <span class="cline-any cline-yes">1x</span>
1150
+ <span class="cline-any cline-yes">1x</span>
1151
+ <span class="cline-any cline-yes">1x</span>
1152
+ <span class="cline-any cline-yes">1x</span>
1153
+ <span class="cline-any cline-neutral">&nbsp;</span>
1154
+ <span class="cline-any cline-neutral">&nbsp;</span>
1155
+ <span class="cline-any cline-yes">44x</span>
1156
+ <span class="cline-any cline-yes">23x</span>
1157
+ <span class="cline-any cline-yes">23x</span>
1158
+ <span class="cline-any cline-neutral">&nbsp;</span>
1159
+ <span class="cline-any cline-yes">23x</span>
1160
+ <span class="cline-any cline-yes">1x</span>
1161
+ <span class="cline-any cline-neutral">&nbsp;</span>
1162
+ <span class="cline-any cline-neutral">&nbsp;</span>
1163
+ <span class="cline-any cline-yes">23x</span>
1164
+ <span class="cline-any cline-yes">23x</span>
1165
+ <span class="cline-any cline-yes">23x</span>
1166
+ <span class="cline-any cline-neutral">&nbsp;</span>
1167
+ <span class="cline-any cline-yes">23x</span>
1168
+ <span class="cline-any cline-yes">1x</span>
1169
+ <span class="cline-any cline-neutral">&nbsp;</span>
1170
+ <span class="cline-any cline-yes">22x</span>
1171
+ <span class="cline-any cline-yes">22x</span>
1172
+ <span class="cline-any cline-neutral">&nbsp;</span>
1173
+ <span class="cline-any cline-neutral">&nbsp;</span>
1174
+ <span class="cline-any cline-neutral">&nbsp;</span>
1175
+ <span class="cline-any cline-neutral">&nbsp;</span>
1176
+ <span class="cline-any cline-neutral">&nbsp;</span>
1177
+ <span class="cline-any cline-neutral">&nbsp;</span>
1178
+ <span class="cline-any cline-neutral">&nbsp;</span>
1179
+ <span class="cline-any cline-yes">23x</span>
1180
+ <span class="cline-any cline-yes">1x</span>
1181
+ <span class="cline-any cline-neutral">&nbsp;</span>
1182
+ <span class="cline-any cline-neutral">&nbsp;</span>
1183
+ <span class="cline-any cline-neutral">&nbsp;</span>
1184
+ <span class="cline-any cline-yes">22x</span>
1185
+ <span class="cline-any cline-neutral">&nbsp;</span>
1186
+ <span class="cline-any cline-yes">23x</span>
1187
+ <span class="cline-any cline-yes">23x</span>
1188
+ <span class="cline-any cline-neutral">&nbsp;</span>
1189
+ <span class="cline-any cline-neutral">&nbsp;</span>
1190
+ <span class="cline-any cline-yes">44x</span>
1191
+ <span class="cline-any cline-yes">23x</span>
1192
+ <span class="cline-any cline-yes">23x</span>
1193
+ <span class="cline-any cline-neutral">&nbsp;</span>
1194
+ <span class="cline-any cline-neutral">&nbsp;</span>
1195
+ <span class="cline-any cline-yes">44x</span>
1196
+ <span class="cline-any cline-yes">23x</span>
1197
+ <span class="cline-any cline-yes">23x</span>
1198
+ <span class="cline-any cline-yes">23x</span>
1199
+ <span class="cline-any cline-no">&nbsp;</span>
1200
+ <span class="cline-any cline-neutral">&nbsp;</span>
1201
+ <span class="cline-any cline-neutral">&nbsp;</span>
1202
+ <span class="cline-any cline-neutral">&nbsp;</span>
1203
+ <span class="cline-any cline-yes">44x</span>
1204
+ <span class="cline-any cline-yes">23x</span>
1205
+ <span class="cline-any cline-yes">23x</span>
1206
+ <span class="cline-any cline-yes">23x</span>
1207
+ <span class="cline-any cline-yes">23x</span>
1208
+ <span class="cline-any cline-yes">23x</span>
1209
+ <span class="cline-any cline-neutral">&nbsp;</span>
1210
+ <span class="cline-any cline-neutral">&nbsp;</span>
1211
+ <span class="cline-any cline-yes">44x</span>
1212
+ <span class="cline-any cline-no">&nbsp;</span>
1213
+ <span class="cline-any cline-no">&nbsp;</span>
1214
+ <span class="cline-any cline-no">&nbsp;</span>
1215
+ <span class="cline-any cline-neutral">&nbsp;</span>
1216
+ <span class="cline-any cline-neutral">&nbsp;</span>
1217
+ <span class="cline-any cline-neutral">&nbsp;</span>
1218
+ <span class="cline-any cline-no">&nbsp;</span>
1219
+ <span class="cline-any cline-neutral">&nbsp;</span>
1220
+ <span class="cline-any cline-neutral">&nbsp;</span>
1221
+ <span class="cline-any cline-no">&nbsp;</span>
1222
+ <span class="cline-any cline-no">&nbsp;</span>
1223
+ <span class="cline-any cline-no">&nbsp;</span>
1224
+ <span class="cline-any cline-neutral">&nbsp;</span>
1225
+ <span class="cline-any cline-neutral">&nbsp;</span>
1226
+ <span class="cline-any cline-neutral">&nbsp;</span>
1227
+ <span class="cline-any cline-no">&nbsp;</span>
1228
+ <span class="cline-any cline-neutral">&nbsp;</span>
1229
+ <span class="cline-any cline-no">&nbsp;</span>
1230
+ <span class="cline-any cline-neutral">&nbsp;</span>
1231
+ <span class="cline-any cline-no">&nbsp;</span>
1232
+ <span class="cline-any cline-no">&nbsp;</span>
1233
+ <span class="cline-any cline-no">&nbsp;</span>
1234
+ <span class="cline-any cline-neutral">&nbsp;</span>
1235
+ <span class="cline-any cline-neutral">&nbsp;</span>
1236
+ <span class="cline-any cline-no">&nbsp;</span>
1237
+ <span class="cline-any cline-no">&nbsp;</span>
1238
+ <span class="cline-any cline-neutral">&nbsp;</span>
1239
+ <span class="cline-any cline-neutral">&nbsp;</span>
1240
+ <span class="cline-any cline-no">&nbsp;</span>
1241
+ <span class="cline-any cline-neutral">&nbsp;</span>
1242
+ <span class="cline-any cline-neutral">&nbsp;</span>
1243
+ <span class="cline-any cline-no">&nbsp;</span>
1244
+ <span class="cline-any cline-neutral">&nbsp;</span>
1245
+ <span class="cline-any cline-neutral">&nbsp;</span>
1246
+ <span class="cline-any cline-neutral">&nbsp;</span>
1247
+ <span class="cline-any cline-neutral">&nbsp;</span>
1248
+ <span class="cline-any cline-no">&nbsp;</span>
1249
+ <span class="cline-any cline-no">&nbsp;</span>
1250
+ <span class="cline-any cline-neutral">&nbsp;</span>
1251
+ <span class="cline-any cline-no">&nbsp;</span>
1252
+ <span class="cline-any cline-neutral">&nbsp;</span>
1253
+ <span class="cline-any cline-no">&nbsp;</span>
1254
+ <span class="cline-any cline-neutral">&nbsp;</span>
1255
+ <span class="cline-any cline-neutral">&nbsp;</span>
1256
+ <span class="cline-any cline-neutral">&nbsp;</span>
1257
+ <span class="cline-any cline-no">&nbsp;</span>
1258
+ <span class="cline-any cline-neutral">&nbsp;</span>
1259
+ <span class="cline-any cline-no">&nbsp;</span>
1260
+ <span class="cline-any cline-no">&nbsp;</span>
1261
+ <span class="cline-any cline-neutral">&nbsp;</span>
1262
+ <span class="cline-any cline-no">&nbsp;</span>
1263
+ <span class="cline-any cline-neutral">&nbsp;</span>
1264
+ <span class="cline-any cline-neutral">&nbsp;</span>
1265
+ <span class="cline-any cline-neutral">&nbsp;</span>
1266
+ <span class="cline-any cline-neutral">&nbsp;</span>
1267
+ <span class="cline-any cline-neutral">&nbsp;</span>
1268
+ <span class="cline-any cline-yes">44x</span>
1269
+ <span class="cline-any cline-yes">6x</span>
1270
+ <span class="cline-any cline-yes">6x</span>
1271
+ <span class="cline-any cline-yes">6x</span>
1272
+ <span class="cline-any cline-neutral">&nbsp;</span>
1273
+ <span class="cline-any cline-yes">6x</span>
1274
+ <span class="cline-any cline-yes">6x</span>
1275
+ <span class="cline-any cline-yes">5x</span>
1276
+ <span class="cline-any cline-neutral">&nbsp;</span>
1277
+ <span class="cline-any cline-neutral">&nbsp;</span>
1278
+ <span class="cline-any cline-neutral">&nbsp;</span>
1279
+ <span class="cline-any cline-neutral">&nbsp;</span>
1280
+ <span class="cline-any cline-yes">6x</span>
1281
+ <span class="cline-any cline-neutral">&nbsp;</span>
1282
+ <span class="cline-any cline-yes">6x</span>
1283
+ <span class="cline-any cline-neutral">&nbsp;</span>
1284
+ <span class="cline-any cline-yes">6x</span>
1285
+ <span class="cline-any cline-yes">6x</span>
1286
+ <span class="cline-any cline-neutral">&nbsp;</span>
1287
+ <span class="cline-any cline-neutral">&nbsp;</span>
1288
+ <span class="cline-any cline-neutral">&nbsp;</span>
1289
+ <span class="cline-any cline-yes">44x</span>
1290
+ <span class="cline-any cline-yes">1x</span>
1291
+ <span class="cline-any cline-yes">1x</span>
1292
+ <span class="cline-any cline-yes">1x</span>
1293
+ <span class="cline-any cline-yes">1x</span>
1294
+ <span class="cline-any cline-neutral">&nbsp;</span>
1295
+ <span class="cline-any cline-neutral">&nbsp;</span>
1296
+ <span class="cline-any cline-yes">1x</span>
1297
+ <span class="cline-any cline-yes">1x</span>
1298
+ <span class="cline-any cline-no">&nbsp;</span>
1299
+ <span class="cline-any cline-neutral">&nbsp;</span>
1300
+ <span class="cline-any cline-yes">1x</span>
1301
+ <span class="cline-any cline-yes">1x</span>
1302
+ <span class="cline-any cline-yes">1x</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-neutral">&nbsp;</span>
1306
+ <span class="cline-any cline-neutral">&nbsp;</span>
1307
+ <span class="cline-any cline-neutral">&nbsp;</span>
1308
+ <span class="cline-any cline-yes">1x</span>
1309
+ <span class="cline-any cline-yes">1x</span>
1310
+ <span class="cline-any cline-yes">1x</span>
1311
+ <span class="cline-any cline-neutral">&nbsp;</span>
1312
+ <span class="cline-any cline-yes">1x</span>
1313
+ <span class="cline-any cline-yes">1x</span>
1314
+ <span class="cline-any cline-neutral">&nbsp;</span>
1315
+ <span class="cline-any cline-neutral">&nbsp;</span>
1316
+ <span class="cline-any cline-neutral">&nbsp;</span>
1317
+ <span class="cline-any cline-neutral">&nbsp;</span>
1318
+ <span class="cline-any cline-neutral">&nbsp;</span>
1319
+ <span class="cline-any cline-neutral">&nbsp;</span>
1320
+ <span class="cline-any cline-neutral">&nbsp;</span>
1321
+ <span class="cline-any cline-neutral">&nbsp;</span>
1322
+ <span class="cline-any cline-yes">1x</span>
1323
+ <span class="cline-any cline-yes">1x</span>
1324
+ <span class="cline-any cline-yes">1x</span>
1325
+ <span class="cline-any cline-yes">1x</span>
1326
+ <span class="cline-any cline-yes">1x</span>
1327
+ <span class="cline-any cline-yes">1x</span>
1328
+ <span class="cline-any cline-yes">1x</span>
1329
+ <span class="cline-any cline-yes">1x</span>
1330
+ <span class="cline-any cline-yes">1x</span>
1331
+ <span class="cline-any cline-yes">1x</span>
1332
+ <span class="cline-any cline-no">&nbsp;</span>
1333
+ <span class="cline-any cline-neutral">&nbsp;</span>
1334
+ <span class="cline-any cline-neutral">&nbsp;</span>
1335
+ <span class="cline-any cline-yes">1x</span>
1336
+ <span class="cline-any cline-neutral">&nbsp;</span>
1337
+ <span class="cline-any cline-no">&nbsp;</span>
1338
+ <span class="cline-any cline-neutral">&nbsp;</span>
1339
+ <span class="cline-any cline-neutral">&nbsp;</span>
1340
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import env from "../../environment"
1341
+ import packageJson from "../../../package.json"
1342
+ import {
1343
+ createLinkView,
1344
+ createRoutingView,
1345
+ createAllSearchIndex,
1346
+ } from "../../db/views/staticViews"
1347
+ import { createApp, deleteApp } from "../../utilities/fileSystem"
1348
+ import {
1349
+ generateAppID,
1350
+ getLayoutParams,
1351
+ getScreenParams,
1352
+ generateDevAppID,
1353
+ DocumentType,
1354
+ AppStatus,
1355
+ } from "../../db/utils"
1356
+ const {
1357
+ BUILTIN_ROLE_IDS,
1358
+ AccessController,
1359
+ } = require("@budibase/backend-core/roles")
1360
+ const { CacheKeys, bustCache } = require("@budibase/backend-core/cache")
1361
+ const {
1362
+ getAllApps,
1363
+ isDevAppID,
1364
+ getProdAppID,
1365
+ Replication,
1366
+ } = require("@budibase/backend-core/db")
1367
+ import { USERS_TABLE_SCHEMA } from "../../constants"
1368
+ import { removeAppFromUserRoles } from "../../utilities/workerRequests"
1369
+ import { clientLibraryPath, stringToReadStream } from "../../utilities"
1370
+ import { getLocksById } from "../../utilities/redis"
1371
+ import {
1372
+ updateClientLibrary,
1373
+ backupClientLibrary,
1374
+ revertClientLibrary,
1375
+ } from "../../utilities/fileSystem/clientLibrary"
1376
+ const { getTenantId, isMultiTenant } = require("@budibase/backend-core/tenancy")
1377
+ import { syncGlobalUsers } from "./user"
1378
+ const { app: appCache } = require("@budibase/backend-core/cache")
1379
+ import { cleanupAutomations } from "../../automations/utils"
1380
+ import { context } from "@budibase/backend-core"
1381
+ import { checkAppMetadata } from "../../automations/logging"
1382
+ import { getUniqueRows } from "../../utilities/usageQuota/rows"
1383
+ import { quotas, groups } from "@budibase/pro"
1384
+ import { errors, events, migrations } from "@budibase/backend-core"
1385
+ import { App, Layout, Screen, MigrationType } from "@budibase/types"
1386
+ import { BASE_LAYOUT_PROP_IDS } from "../../constants/layouts"
1387
+ import { enrichPluginURLs } from "../../utilities/plugins"
1388
+ import sdk from "../../sdk"
1389
+ &nbsp;
1390
+ const URL_REGEX_SLASH = /\/|\\/g
1391
+ &nbsp;
1392
+ // utility function, need to do away with this
1393
+ async function getLayouts() {
1394
+ const db = context.getAppDB()
1395
+ return (
1396
+ await db.allDocs(
1397
+ getLayoutParams(null, {
1398
+ include_docs: true,
1399
+ })
1400
+ )
1401
+ ).rows.map((row: any) =&gt; row.doc)
1402
+ }
1403
+ &nbsp;
1404
+ async function getScreens() {
1405
+ const db = context.getAppDB()
1406
+ return (
1407
+ await db.allDocs(
1408
+ getScreenParams(null, {
1409
+ include_docs: true,
1410
+ })
1411
+ )
1412
+ ).rows.map((row: any) =&gt; row.doc)
1413
+ }
1414
+ &nbsp;
1415
+ function getUserRoleId(ctx: any) {
1416
+ return !ctx.user.role || !ctx.user.role._id
1417
+ ? <span class="branch-0 cbranch-no" title="branch not covered" >BUILTIN_ROLE_IDS.PUBLIC</span>
1418
+ : ctx.user.role._id
1419
+ }
1420
+ &nbsp;
1421
+ export const getAppUrl = (ctx: any) =&gt; {
1422
+ // construct the url
1423
+ let url
1424
+ if (ctx.request.body.url) {
1425
+ // if the url is provided, use that
1426
+ url = encodeURI(ctx.request.body.url)
1427
+ } else if (ctx.request.body.name) {
1428
+ // otherwise use the name
1429
+ url = encodeURI(`${ctx.request.body.name}`)
1430
+ }
1431
+ if (url) {
1432
+ url = `/${url.replace(URL_REGEX_SLASH, "")}`.toLowerCase()
1433
+ }
1434
+ return url
1435
+ }
1436
+ &nbsp;
1437
+ const checkAppUrl = (ctx: any, apps: any, url: any, currentAppId?: string) =&gt; {
1438
+ if (currentAppId) {
1439
+ apps = apps.filter((app: any) =&gt; app.appId !== currentAppId)
1440
+ }
1441
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (apps.some((app: any) =&gt; app.url === url)) {
1442
+ <span class="cstat-no" title="statement not covered" > ctx.throw(400, "App URL is already in use.")</span>
1443
+ }
1444
+ }
1445
+ &nbsp;
1446
+ const checkAppName = (
1447
+ ctx: any,
1448
+ apps: any,
1449
+ name: any,
1450
+ currentAppId?: string
1451
+ ) =&gt; {
1452
+ // TODO: Replace with Joi
1453
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!name) {
1454
+ <span class="cstat-no" title="statement not covered" > ctx.throw(400, "Name is required")</span>
1455
+ }
1456
+ if (currentAppId) {
1457
+ apps = apps.filter((app: any) =&gt; app.appId !== currentAppId)
1458
+ }
1459
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (apps.some((app: any) =&gt; app.name === name)) {
1460
+ <span class="cstat-no" title="statement not covered" > ctx.throw(400, "App name is already in use.")</span>
1461
+ }
1462
+ }
1463
+ &nbsp;
1464
+ async function createInstance(template: any) {
1465
+ const tenantId = isMultiTenant() ? <span class="branch-0 cbranch-no" title="branch not covered" >getTenantId() </span>: null
1466
+ const baseAppId = generateAppID(tenantId)
1467
+ const appId = generateDevAppID(baseAppId)
1468
+ await context.updateAppId(appId)
1469
+ &nbsp;
1470
+ const db = context.getAppDB()
1471
+ await db.put({
1472
+ _id: "_design/database",
1473
+ // view collation information, read before writing any complex views:
1474
+ // https://docs.couchdb.org/en/master/ddocs/views/collation.html#collation-specification
1475
+ views: {},
1476
+ })
1477
+ &nbsp;
1478
+ // NOTE: indexes need to be created before any tables/templates
1479
+ // add view for linked rows
1480
+ await createLinkView()
1481
+ await createRoutingView()
1482
+ await createAllSearchIndex()
1483
+ &nbsp;
1484
+ // replicate the template data to the instance DB
1485
+ // this is currently very hard to test, downloading and importing template files
1486
+ if (template &amp;&amp; template.templateString) {
1487
+ const { ok } = await db.load(stringToReadStream(template.templateString))
1488
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!ok) {
1489
+ <span class="cstat-no" title="statement not covered" > throw "Error loading database dump from memory."</span>
1490
+ }
1491
+ } else if (template &amp;&amp; template.useTemplate === "true") {
1492
+ await sdk.backups.importApp(appId, db, template)
1493
+ } else {
1494
+ // create the users table
1495
+ await db.put(USERS_TABLE_SCHEMA)
1496
+ }
1497
+ &nbsp;
1498
+ return { _id: appId }
1499
+ }
1500
+ &nbsp;
1501
+ export const fetch = async (ctx: any) =&gt; {
1502
+ const dev = ctx.query &amp;&amp; ctx.query.status === AppStatus.DEV
1503
+ const all = ctx.query &amp;&amp; ctx.query.status === AppStatus.ALL
1504
+ const apps = await getAllApps({ dev, all })
1505
+ &nbsp;
1506
+ const appIds = apps
1507
+ .filter((app: any) =&gt; app.status === "development")
1508
+ .map((app: any) =&gt; app.appId)
1509
+ // get the locks for all the dev apps
1510
+ if (dev || <span class="branch-1 cbranch-no" title="branch not covered" >all)</span> {
1511
+ const locks = await getLocksById(appIds)
1512
+ for (let app of apps) {
1513
+ const lock = locks[app.appId]
1514
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (lock) {
1515
+ <span class="cstat-no" title="statement not covered" > app.lockedBy = lock</span>
1516
+ } else {
1517
+ // make sure its definitely not present
1518
+ delete app.lockedBy
1519
+ }
1520
+ }
1521
+ }
1522
+ &nbsp;
1523
+ ctx.body = await checkAppMetadata(apps)
1524
+ }
1525
+ &nbsp;
1526
+ export const fetchAppDefinition = async (ctx: any) =&gt; {
1527
+ const layouts = await getLayouts()
1528
+ const userRoleId = getUserRoleId(ctx)
1529
+ const accessController = new AccessController()
1530
+ const screens = await accessController.checkScreensAccess(
1531
+ await getScreens(),
1532
+ userRoleId
1533
+ )
1534
+ ctx.body = {
1535
+ layouts,
1536
+ screens,
1537
+ libraries: ["@budibase/standard-components"],
1538
+ }
1539
+ }
1540
+ &nbsp;
1541
+ export const fetchAppPackage = async (ctx: any) =&gt; {
1542
+ const db = context.getAppDB()
1543
+ let application = await db.get(DocumentType.APP_METADATA)
1544
+ const layouts = await getLayouts()
1545
+ let screens = await getScreens()
1546
+ &nbsp;
1547
+ // Enrich plugin URLs
1548
+ application.usedPlugins = enrichPluginURLs(application.usedPlugins)
1549
+ &nbsp;
1550
+ // Only filter screens if the user is not a builder
1551
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!(ctx.user.builder &amp;&amp; ctx.user.builder.global)) {
1552
+ const userRoleId = <span class="cstat-no" title="statement not covered" >getUserRoleId(ctx)</span>
1553
+ const accessController = <span class="cstat-no" title="statement not covered" >new AccessController()</span>
1554
+ <span class="cstat-no" title="statement not covered" > screens = await accessController.checkScreensAccess(screens, userRoleId)</span>
1555
+ }
1556
+ &nbsp;
1557
+ ctx.body = {
1558
+ application,
1559
+ screens,
1560
+ layouts,
1561
+ clientLibPath: clientLibraryPath(ctx.params.appId, application.version),
1562
+ }
1563
+ }
1564
+ &nbsp;
1565
+ const performAppCreate = async (ctx: any) =&gt; {
1566
+ const apps = await getAllApps({ dev: true })
1567
+ const name = ctx.request.body.name
1568
+ checkAppName(ctx, apps, name)
1569
+ const url = getAppUrl(ctx)
1570
+ checkAppUrl(ctx, apps, url)
1571
+ &nbsp;
1572
+ const { useTemplate, templateKey, templateString } = ctx.request.body
1573
+ const instanceConfig: any = {
1574
+ useTemplate,
1575
+ key: templateKey,
1576
+ templateString,
1577
+ }
1578
+ if (ctx.request.files &amp;&amp; ctx.request.files.templateFile) {
1579
+ instanceConfig.file = ctx.request.files.templateFile
1580
+ }
1581
+ const instance = await createInstance(instanceConfig)
1582
+ const appId = instance._id
1583
+ const db = context.getAppDB()
1584
+ &nbsp;
1585
+ let newApplication: App = {
1586
+ _id: DocumentType.APP_METADATA,
1587
+ _rev: undefined,
1588
+ appId,
1589
+ type: "app",
1590
+ version: packageJson.version,
1591
+ componentLibraries: ["@budibase/standard-components"],
1592
+ name: name,
1593
+ url: url,
1594
+ template: templateKey,
1595
+ instance,
1596
+ tenantId: getTenantId(),
1597
+ updatedAt: new Date().toISOString(),
1598
+ createdAt: new Date().toISOString(),
1599
+ status: AppStatus.DEV,
1600
+ navigation: {
1601
+ navigation: "Top",
1602
+ title: name,
1603
+ navWidth: "Large",
1604
+ navBackground: "var(--spectrum-global-color-gray-100)",
1605
+ links: [
1606
+ {
1607
+ url: "/home",
1608
+ text: "Home",
1609
+ },
1610
+ ],
1611
+ },
1612
+ theme: "spectrum--light",
1613
+ customTheme: {
1614
+ buttonBorderRadius: "16px",
1615
+ },
1616
+ }
1617
+ &nbsp;
1618
+ // If we used a template or imported an app there will be an existing doc.
1619
+ // Fetch and migrate some metadata from the existing app.
1620
+ try {
1621
+ const existing: App = await db.get(DocumentType.APP_METADATA)
1622
+ const keys: (keyof App)[] = [
1623
+ "_rev",
1624
+ "navigation",
1625
+ "theme",
1626
+ "customTheme",
1627
+ "icon",
1628
+ ]
1629
+ keys.forEach(key =&gt; {
1630
+ if (existing[key]) {
1631
+ // @ts-ignore
1632
+ newApplication[key] = existing[key]
1633
+ }
1634
+ })
1635
+ &nbsp;
1636
+ // Migrate navigation settings and screens if required
1637
+ if (existing) {
1638
+ const navigation = await migrateAppNavigation()
1639
+ if (navigation) {
1640
+ newApplication.navigation = navigation
1641
+ }
1642
+ }
1643
+ } catch (err) {
1644
+ // Nothing to do
1645
+ }
1646
+ &nbsp;
1647
+ const response = await db.put(newApplication, { force: true })
1648
+ newApplication._rev = response.rev
1649
+ &nbsp;
1650
+ /* istanbul ignore next */
1651
+ if (!env.isTest()) {
1652
+ await createApp(appId)
1653
+ }
1654
+ &nbsp;
1655
+ await appCache.invalidateAppMetadata(appId, newApplication)
1656
+ return newApplication
1657
+ }
1658
+ &nbsp;
1659
+ const creationEvents = async (request: any, app: App) =&gt; {
1660
+ let creationFns: ((app: App) =&gt; Promise&lt;void&gt;)[] = []
1661
+ &nbsp;
1662
+ const body = request.body
1663
+ if (body.useTemplate === "true") {
1664
+ // from template
1665
+ if (body.templateKey &amp;&amp; body.templateKey !== "undefined") {
1666
+ creationFns.push(a =&gt; events.app.templateImported(a, body.templateKey))
1667
+ }
1668
+ // from file
1669
+ else if (request.files<span class="branch-0 cbranch-no" title="branch not covered" >?.t</span>emplateFile) {
1670
+ creationFns.push(a =&gt; events.app.fileImported(a))
1671
+ }
1672
+ // unknown
1673
+ else <span class="missing-if-branch" title="else path not taken" >E</span>{
1674
+ <span class="cstat-no" title="statement not covered" > console.error("Could not determine template creation event")</span>
1675
+ }
1676
+ }
1677
+ creationFns.push(a =&gt; events.app.created(a))
1678
+ &nbsp;
1679
+ for (let fn of creationFns) {
1680
+ await fn(app)
1681
+ }
1682
+ }
1683
+ &nbsp;
1684
+ const appPostCreate = async (ctx: any, app: App) =&gt; {
1685
+ const tenantId = getTenantId()
1686
+ await migrations.backPopulateMigrations({
1687
+ type: MigrationType.APP,
1688
+ tenantId,
1689
+ appId: app.appId,
1690
+ })
1691
+ await creationEvents(ctx.request, app)
1692
+ // app import &amp; template creation
1693
+ if (ctx.request.body.useTemplate === "true") {
1694
+ const { rows } = await getUniqueRows([app.appId])
1695
+ const rowCount = rows ? rows.length : <span class="branch-1 cbranch-no" title="branch not covered" >0</span>
1696
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (rowCount) {
1697
+ <span class="cstat-no" title="statement not covered" > try {</span>
1698
+ <span class="cstat-no" title="statement not covered" > await quotas.addRows(rowCount)</span>
1699
+ } catch (err: any) {
1700
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (err.code &amp;&amp; err.code === errors.codes.USAGE_LIMIT_EXCEEDED) {</span>
1701
+ // this import resulted in row usage exceeding the quota
1702
+ // delete the app
1703
+ // skip pre and post steps as no rows have been added to quotas yet
1704
+ <span class="cstat-no" title="statement not covered" > ctx.params.appId = app.appId</span>
1705
+ <span class="cstat-no" title="statement not covered" > await destroyApp(ctx)</span>
1706
+ }
1707
+ <span class="cstat-no" title="statement not covered" > throw err</span>
1708
+ }
1709
+ }
1710
+ }
1711
+ }
1712
+ &nbsp;
1713
+ export const create = async (ctx: any) =&gt; {
1714
+ const newApplication = await quotas.addApp(() =&gt; performAppCreate(ctx))
1715
+ await appPostCreate(ctx, newApplication)
1716
+ await bustCache(CacheKeys.CHECKLIST)
1717
+ ctx.body = newApplication
1718
+ ctx.status = 200
1719
+ }
1720
+ &nbsp;
1721
+ // This endpoint currently operates as a PATCH rather than a PUT
1722
+ // Thus name and url fields are handled only if present
1723
+ export const update = async (ctx: any) =&gt; {
1724
+ const apps = await getAllApps({ dev: true })
1725
+ // validation
1726
+ const name = ctx.request.body.name
1727
+ if (name) {
1728
+ checkAppName(ctx, apps, name, ctx.params.appId)
1729
+ }
1730
+ const url = getAppUrl(ctx)
1731
+ if (url) {
1732
+ checkAppUrl(ctx, apps, url, ctx.params.appId)
1733
+ ctx.request.body.url = url
1734
+ }
1735
+ &nbsp;
1736
+ const app = await updateAppPackage(ctx.request.body, ctx.params.appId)
1737
+ await events.app.updated(app)
1738
+ ctx.status = 200
1739
+ ctx.body = app
1740
+ }
1741
+ &nbsp;
1742
+ export const updateClient = async (ctx: any) =&gt; {
1743
+ // Get current app version
1744
+ const db = context.getAppDB()
1745
+ const application = await db.get(DocumentType.APP_METADATA)
1746
+ const currentVersion = application.version
1747
+ &nbsp;
1748
+ // Update client library and manifest
1749
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!env.isTest()) {
1750
+ <span class="cstat-no" title="statement not covered" > await backupClientLibrary(ctx.params.appId)</span>
1751
+ <span class="cstat-no" title="statement not covered" > await updateClientLibrary(ctx.params.appId)</span>
1752
+ }
1753
+ &nbsp;
1754
+ // Update versions in app package
1755
+ const updatedToVersion = packageJson.version
1756
+ const appPackageUpdates = {
1757
+ version: updatedToVersion,
1758
+ revertableVersion: currentVersion,
1759
+ }
1760
+ const app = await updateAppPackage(appPackageUpdates, ctx.params.appId)
1761
+ await events.app.versionUpdated(app, currentVersion, updatedToVersion)
1762
+ ctx.status = 200
1763
+ ctx.body = app
1764
+ }
1765
+ &nbsp;
1766
+ export const revertClient = async (ctx: any) =&gt; {
1767
+ // Check app can be reverted
1768
+ const db = context.getAppDB()
1769
+ const application = await db.get(DocumentType.APP_METADATA)
1770
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!application.revertableVersion) {
1771
+ <span class="cstat-no" title="statement not covered" > ctx.throw(400, "There is no version to revert to")</span>
1772
+ }
1773
+ &nbsp;
1774
+ // Update client library and manifest
1775
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!env.isTest()) {
1776
+ <span class="cstat-no" title="statement not covered" > await revertClientLibrary(ctx.params.appId)</span>
1777
+ }
1778
+ &nbsp;
1779
+ // Update versions in app package
1780
+ const currentVersion = application.version
1781
+ const revertedToVersion = application.revertableVersion
1782
+ const appPackageUpdates = {
1783
+ version: revertedToVersion,
1784
+ revertableVersion: null,
1785
+ }
1786
+ const app = await updateAppPackage(appPackageUpdates, ctx.params.appId)
1787
+ await events.app.versionReverted(app, currentVersion, revertedToVersion)
1788
+ ctx.status = 200
1789
+ ctx.body = app
1790
+ }
1791
+ &nbsp;
1792
+ const destroyApp = async (ctx: any) =&gt; {
1793
+ let appId = ctx.params.appId
1794
+ let isUnpublish = ctx.query &amp;&amp; ctx.query.unpublish
1795
+ &nbsp;
1796
+ if (isUnpublish) {
1797
+ appId = getProdAppID(appId)
1798
+ }
1799
+ &nbsp;
1800
+ const db = isUnpublish ? context.getProdAppDB() : context.getAppDB()
1801
+ const app = await db.get(DocumentType.APP_METADATA)
1802
+ const result = await db.destroy()
1803
+ &nbsp;
1804
+ if (isUnpublish) {
1805
+ await events.app.unpublished(app)
1806
+ } else {
1807
+ await quotas.removeApp()
1808
+ await events.app.deleted(app)
1809
+ }
1810
+ &nbsp;
1811
+ /* istanbul ignore next */
1812
+ if (!env.isTest() &amp;&amp; !isUnpublish) {
1813
+ await deleteApp(appId)
1814
+ }
1815
+ // automations only in production
1816
+ if (isUnpublish) {
1817
+ await cleanupAutomations(appId)
1818
+ }
1819
+ // remove app role when the dev app is deleted (no trace of app anymore)
1820
+ else {
1821
+ await removeAppFromUserRoles(ctx, appId)
1822
+ }
1823
+ await appCache.invalidateAppMetadata(appId)
1824
+ return result
1825
+ }
1826
+ &nbsp;
1827
+ const preDestroyApp = async (ctx: any) =&gt; {
1828
+ const { rows } = await getUniqueRows([ctx.params.appId])
1829
+ ctx.rowCount = rows.length
1830
+ }
1831
+ &nbsp;
1832
+ const postDestroyApp = async (ctx: any) =&gt; {
1833
+ const rowCount = ctx.rowCount
1834
+ await groups.cleanupApp(ctx.params.appId)
1835
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (rowCount) {
1836
+ <span class="cstat-no" title="statement not covered" > await quotas.removeRows(rowCount)</span>
1837
+ }
1838
+ }
1839
+ &nbsp;
1840
+ export const destroy = async (ctx: any) =&gt; {
1841
+ await preDestroyApp(ctx)
1842
+ const result = await destroyApp(ctx)
1843
+ await postDestroyApp(ctx)
1844
+ ctx.status = 200
1845
+ ctx.body = result
1846
+ }
1847
+ &nbsp;
1848
+ export const sync = <span class="fstat-no" title="function not covered" >async (c</span>tx: any, next: any) =&gt;<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" > {</span></span>
1849
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (env.DISABLE_AUTO_PROD_APP_SYNC) {</span>
1850
+ <span class="cstat-no" title="statement not covered" > ctx.status = 200</span>
1851
+ <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
1852
+ message:
1853
+ "App sync disabled. You can reenable with the DISABLE_AUTO_PROD_APP_SYNC environment variable.",
1854
+ }
1855
+ <span class="cstat-no" title="statement not covered" > return next()</span>
1856
+ }
1857
+ &nbsp;
1858
+ const appId = <span class="cstat-no" title="statement not covered" >ctx.params.appId</span>
1859
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isDevAppID(appId)) {</span>
1860
+ <span class="cstat-no" title="statement not covered" > ctx.throw(400, "This action cannot be performed for production apps")</span>
1861
+ }
1862
+ &nbsp;
1863
+ // replicate prod to dev
1864
+ const prodAppId = <span class="cstat-no" title="statement not covered" >getProdAppID(appId)</span>
1865
+ &nbsp;
1866
+ <span class="cstat-no" title="statement not covered" > try {</span>
1867
+ // specific case, want to make sure setup is skipped
1868
+ const prodDb = <span class="cstat-no" title="statement not covered" >context.getProdAppDB({ skip_setup: true })</span>
1869
+ const info = <span class="cstat-no" title="statement not covered" >await prodDb.info()</span>
1870
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (info.error) <span class="cstat-no" title="statement not covered" >throw info.error</span></span>
1871
+ } catch (err) {
1872
+ // the database doesn't exist. Don't replicate
1873
+ <span class="cstat-no" title="statement not covered" > ctx.status = 200</span>
1874
+ <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
1875
+ message: "App sync not required, app not deployed.",
1876
+ }
1877
+ <span class="cstat-no" title="statement not covered" > return next()</span>
1878
+ }
1879
+ &nbsp;
1880
+ const replication = <span class="cstat-no" title="statement not covered" >new Replication({</span>
1881
+ source: prodAppId,
1882
+ target: appId,
1883
+ })
1884
+ let error
1885
+ <span class="cstat-no" title="statement not covered" > try {</span>
1886
+ <span class="cstat-no" title="statement not covered" > await replication.replicate(replication.appReplicateOpts())</span>
1887
+ } catch (err) {
1888
+ <span class="cstat-no" title="statement not covered" > error = err</span>
1889
+ } finally {
1890
+ <span class="cstat-no" title="statement not covered" > await replication.close()</span>
1891
+ }
1892
+ &nbsp;
1893
+ // sync the users
1894
+ <span class="cstat-no" title="statement not covered" > await syncGlobalUsers()</span>
1895
+ &nbsp;
1896
+ <span class="cstat-no" title="statement not covered" > if (error) {</span>
1897
+ <span class="cstat-no" title="statement not covered" > ctx.throw(400, error)</span>
1898
+ } else {
1899
+ <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
1900
+ message: "App sync completed successfully.",
1901
+ }
1902
+ }
1903
+ }
1904
+ &nbsp;
1905
+ export const updateAppPackage = async (appPackage: any, appId: any) =&gt; {
1906
+ return context.doInAppContext(appId, async () =&gt; {
1907
+ const db = context.getAppDB()
1908
+ const application = await db.get(DocumentType.APP_METADATA)
1909
+ &nbsp;
1910
+ const newAppPackage = { ...application, ...appPackage }
1911
+ if (appPackage._rev !== application._rev) {
1912
+ newAppPackage._rev = application._rev
1913
+ }
1914
+ &nbsp;
1915
+ // the locked by property is attached by server but generated from
1916
+ // Redis, shouldn't ever store it
1917
+ delete newAppPackage.lockedBy
1918
+ &nbsp;
1919
+ await db.put(newAppPackage)
1920
+ // remove any cached metadata, so that it will be updated
1921
+ await appCache.invalidateAppMetadata(appId)
1922
+ return newAppPackage
1923
+ })
1924
+ }
1925
+ &nbsp;
1926
+ const migrateAppNavigation = async () =&gt; {
1927
+ const db = context.getAppDB()
1928
+ const existing: App = await db.get(DocumentType.APP_METADATA)
1929
+ const layouts: Layout[] = await getLayouts()
1930
+ const screens: Screen[] = await getScreens()
1931
+ &nbsp;
1932
+ // Migrate all screens, removing custom layouts
1933
+ for (let screen of screens) {
1934
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!screen.layoutId) {
1935
+ <span class="cstat-no" title="statement not covered" > continue</span>
1936
+ }
1937
+ const layout = layouts.find(layout =&gt; layout._id === screen.layoutId)
1938
+ screen.layoutId = undefined
1939
+ screen.showNavigation = layout<span class="branch-0 cbranch-no" title="branch not covered" >?.p</span>rops.navigation !== "None"
1940
+ screen.width = layout<span class="branch-0 cbranch-no" title="branch not covered" >?.p</span>rops.width || <span class="branch-1 cbranch-no" title="branch not covered" >"Large"</span>
1941
+ await db.put(screen)
1942
+ }
1943
+ &nbsp;
1944
+ // Migrate layout navigation settings
1945
+ const { name, customTheme } = existing
1946
+ const layout = layouts<span class="branch-0 cbranch-no" title="branch not covered" >?.f</span>ind(
1947
+ (layout: Layout) =&gt; layout._id === BASE_LAYOUT_PROP_IDS.PRIVATE
1948
+ )
1949
+ if (layout &amp;&amp; !existing.navigation) {
1950
+ let navigationSettings: any = {
1951
+ navigation: "Top",
1952
+ title: name,
1953
+ navWidth: "Large",
1954
+ navBackground:
1955
+ customTheme<span class="branch-0 cbranch-no" title="branch not covered" >?.n</span>avBackground || <span class="branch-1 cbranch-no" title="branch not covered" >"var(--spectrum-global-color-gray-50)",</span>
1956
+ navTextColor:
1957
+ customTheme<span class="branch-0 cbranch-no" title="branch not covered" >?.n</span>avTextColor || <span class="branch-1 cbranch-no" title="branch not covered" >"var(--spectrum-global-color-gray-800)",</span>
1958
+ }
1959
+ if (layout) {
1960
+ navigationSettings.hideLogo = layout.props.hideLogo
1961
+ navigationSettings.hideTitle = layout.props.hideTitle
1962
+ navigationSettings.title = layout.props.title || <span class="branch-1 cbranch-no" title="branch not covered" >name</span>
1963
+ navigationSettings.logoUrl = layout.props.logoUrl
1964
+ navigationSettings.links = layout.props.links
1965
+ navigationSettings.navigation = layout.props.navigation || <span class="branch-1 cbranch-no" title="branch not covered" >"Top"</span>
1966
+ navigationSettings.sticky = layout.props.sticky
1967
+ navigationSettings.navWidth = layout.props.width || <span class="branch-1 cbranch-no" title="branch not covered" >"Large"</span>
1968
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (navigationSettings.navigation === "None") {
1969
+ <span class="cstat-no" title="statement not covered" > navigationSettings.navigation = "Top"</span>
1970
+ }
1971
+ }
1972
+ return navigationSettings
1973
+ } else <span class="missing-if-branch" title="else path not taken" >E</span>{
1974
+ <span class="cstat-no" title="statement not covered" > return null</span>
1975
+ }
1976
+ }
1977
+ &nbsp;</pre></td></tr></table></pre>
1978
+
1979
+ <div class='push'></div><!-- for sticky footer -->
1980
+ </div><!-- /wrapper -->
1981
+ <div class='footer quiet pad2 space-top1 center small'>
1982
+ Code coverage generated by
1983
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1984
+ at Tue Nov 15 2022 16:47:58 GMT+0000 (Coordinated Universal Time)
1985
+ </div>
1986
+ <script src="../../../prettify.js"></script>
1987
+ <script>
1988
+ window.onload = function () {
1989
+ prettyPrint();
1990
+ };
1991
+ </script>
1992
+ <script src="../../../sorter.js"></script>
1993
+ <script src="../../../block-navigation.js"></script>
1994
+ </body>
1995
+ </html>
1996
+