@mailwoman/resolver-wof-sqlite 9.4.0 → 10.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (548) hide show
  1. package/README.md +8 -8
  2. package/lib/address/{point-interpolation.ts → point/interpolation.ts} +40 -38
  3. package/lib/address/point/schema.ts +132 -0
  4. package/lib/address/point.ts +68 -81
  5. package/lib/{address/index.ts → address.ts} +2 -2
  6. package/lib/ancestry/backfill.ts +24 -88
  7. package/lib/{ancestry/index.ts → ancestry.ts} +19 -15
  8. package/lib/build/candidate.ts +608 -0
  9. package/lib/build/population-corrections.ts +64 -0
  10. package/lib/build/slim.ts +338 -0
  11. package/lib/candidate/alias-bags.ts +74 -14
  12. package/lib/candidate/ancestors/schema.ts +211 -0
  13. package/lib/candidate/{ancestors-sidecar.ts → ancestors/sidecar.ts} +17 -24
  14. package/lib/candidate/country-display-names.ts +6 -20
  15. package/lib/candidate/extract-fold.ts +12 -57
  16. package/lib/candidate/fts.ts +28 -0
  17. package/lib/candidate/importance.ts +221 -0
  18. package/lib/candidate/lookup.ts +669 -0
  19. package/lib/candidate/name-roles.ts +16 -34
  20. package/lib/candidate/own-name.ts +34 -31
  21. package/lib/candidate/place-attrs.ts +20 -13
  22. package/lib/candidate/schema.ts +211 -0
  23. package/lib/candidate/scoring.ts +222 -0
  24. package/lib/capital-schema.ts +21 -17
  25. package/lib/capitals.ts +26 -24
  26. package/lib/coincident-roles.ts +74 -55
  27. package/lib/convention/schema.ts +13 -7
  28. package/lib/convention.ts +144 -0
  29. package/lib/coverage-manifest-schema.ts +34 -39
  30. package/lib/currency-backfill.ts +24 -69
  31. package/lib/env.ts +1 -1
  32. package/lib/exact-match.ts +31 -20
  33. package/lib/extracts.ts +96 -73
  34. package/lib/fst/autocomplete.ts +52 -35
  35. package/lib/fst/builder.ts +30 -36
  36. package/lib/fst/deserialize-web.ts +8 -9
  37. package/lib/fst/format.ts +41 -23
  38. package/lib/fst/freshness.ts +17 -95
  39. package/lib/fst/matcher.ts +2 -2
  40. package/lib/fst/serialize.ts +45 -60
  41. package/lib/fst/types.ts +71 -59
  42. package/lib/fts/query.ts +5 -36
  43. package/lib/fts.ts +280 -0
  44. package/lib/geonames/aliases.ts +72 -149
  45. package/lib/geonames/postal.ts +162 -77
  46. package/lib/index.ts +20 -27
  47. package/lib/interpolation.ts +43 -96
  48. package/lib/lookup.ts +137 -257
  49. package/lib/name-score.ts +9 -7
  50. package/lib/nsul/lookup.ts +36 -53
  51. package/lib/nsul/schema.ts +16 -43
  52. package/lib/paths.ts +159 -0
  53. package/lib/place-importance-schema.ts +57 -164
  54. package/lib/poi/lookup.ts +100 -109
  55. package/lib/poi/schema.ts +42 -26
  56. package/lib/polygon-schema.ts +10 -6
  57. package/lib/postal/city/alias/lookup.ts +79 -0
  58. package/lib/postal/{city-alias-schema.ts → city/alias/schema.ts} +14 -10
  59. package/lib/postal/{city-candidate-schema.ts → city/candidate-schema.ts} +26 -20
  60. package/lib/postal.ts +9 -0
  61. package/lib/postcode-point-lookup.ts +9 -19
  62. package/lib/primary-preference.ts +45 -125
  63. package/lib/proximity-rerank.ts +43 -32
  64. package/lib/ranking-weights.ts +98 -76
  65. package/lib/region-keys.ts +68 -40
  66. package/lib/reverse.ts +108 -72
  67. package/lib/schema.ts +74 -42
  68. package/lib/search-fetch.ts +90 -68
  69. package/lib/sqlite/convention-source.ts +57 -0
  70. package/lib/sqlite/utils.ts +79 -0
  71. package/lib/street/centroid/schema.ts +149 -0
  72. package/lib/street/centroid.ts +16 -25
  73. package/lib/street/{morphology-fst-builder.ts → morphology/fst/builder.ts} +56 -41
  74. package/lib/street/{morphology-fst-loader.ts → morphology/fst/loader.ts} +36 -29
  75. package/lib/street/name-lookup.ts +43 -35
  76. package/lib/street/normalize.ts +85 -216
  77. package/lib/street/segment-schema.ts +116 -43
  78. package/lib/{street/index.ts → street.ts} +3 -3
  79. package/lib/types.ts +94 -140
  80. package/lib/unified-schema.ts +29 -29
  81. package/lib/uprn/existence.ts +30 -19
  82. package/lib/uprn/lookup.ts +28 -67
  83. package/lib/uprn/schema.ts +18 -40
  84. package/lib/weights-overlay-linker.ts +204 -232
  85. package/out/address/point/interpolation.d.ts +45 -0
  86. package/out/address/point/interpolation.d.ts.map +1 -0
  87. package/out/address/{point-interpolation.js → point/interpolation.js} +38 -38
  88. package/out/address/point/interpolation.js.map +1 -0
  89. package/out/address/point/schema.d.ts +74 -0
  90. package/out/address/point/schema.d.ts.map +1 -0
  91. package/out/address/{point-schema.js → point/schema.js} +4 -20
  92. package/out/address/point/schema.js.map +1 -0
  93. package/out/address/point.d.ts +24 -21
  94. package/out/address/point.d.ts.map +1 -1
  95. package/out/address/point.js +60 -77
  96. package/out/address/point.js.map +1 -1
  97. package/out/{address/index.js → address.d.ts} +3 -3
  98. package/out/address.d.ts.map +1 -0
  99. package/out/{address/index.d.ts → address.js} +3 -3
  100. package/out/address.js.map +1 -0
  101. package/out/ancestry/backfill.d.ts +11 -64
  102. package/out/ancestry/backfill.d.ts.map +1 -1
  103. package/out/ancestry/backfill.js +18 -76
  104. package/out/ancestry/backfill.js.map +1 -1
  105. package/out/ancestry.d.ts +49 -0
  106. package/out/ancestry.d.ts.map +1 -0
  107. package/out/ancestry.js +59 -0
  108. package/out/ancestry.js.map +1 -0
  109. package/out/build/candidate.d.ts +170 -0
  110. package/out/build/candidate.d.ts.map +1 -0
  111. package/out/{build-candidate.js → build/candidate.js} +33 -102
  112. package/out/build/candidate.js.map +1 -0
  113. package/out/build/population-corrections.d.ts +52 -0
  114. package/out/build/population-corrections.d.ts.map +1 -0
  115. package/out/build/population-corrections.js +40 -0
  116. package/out/build/population-corrections.js.map +1 -0
  117. package/out/build/slim.d.ts +44 -0
  118. package/out/build/slim.d.ts.map +1 -0
  119. package/out/{build-slim.js → build/slim.js} +33 -94
  120. package/out/build/slim.js.map +1 -0
  121. package/out/candidate/alias-bags.d.ts +13 -5
  122. package/out/candidate/alias-bags.d.ts.map +1 -1
  123. package/out/candidate/alias-bags.js +55 -12
  124. package/out/candidate/alias-bags.js.map +1 -1
  125. package/out/candidate/ancestors/schema.d.ts +166 -0
  126. package/out/candidate/ancestors/schema.d.ts.map +1 -0
  127. package/out/candidate/ancestors/schema.js +131 -0
  128. package/out/candidate/ancestors/schema.js.map +1 -0
  129. package/out/candidate/ancestors/sidecar.d.ts +27 -0
  130. package/out/candidate/ancestors/sidecar.d.ts.map +1 -0
  131. package/out/candidate/{ancestors-sidecar.js → ancestors/sidecar.js} +17 -24
  132. package/out/candidate/ancestors/sidecar.js.map +1 -0
  133. package/out/candidate/country-display-names.d.ts +5 -15
  134. package/out/candidate/country-display-names.d.ts.map +1 -1
  135. package/out/candidate/country-display-names.js +6 -20
  136. package/out/candidate/country-display-names.js.map +1 -1
  137. package/out/candidate/extract-fold.d.ts +8 -16
  138. package/out/candidate/extract-fold.d.ts.map +1 -1
  139. package/out/candidate/extract-fold.js +6 -48
  140. package/out/candidate/extract-fold.js.map +1 -1
  141. package/out/candidate/fts.d.ts +19 -0
  142. package/out/candidate/fts.d.ts.map +1 -0
  143. package/out/candidate/fts.js +22 -0
  144. package/out/candidate/fts.js.map +1 -0
  145. package/out/candidate/importance.d.ts +127 -0
  146. package/out/candidate/importance.d.ts.map +1 -0
  147. package/out/candidate/importance.js +162 -0
  148. package/out/candidate/importance.js.map +1 -0
  149. package/out/candidate/lookup.d.ts +36 -0
  150. package/out/candidate/lookup.d.ts.map +1 -0
  151. package/out/candidate/lookup.js +456 -0
  152. package/out/candidate/lookup.js.map +1 -0
  153. package/out/candidate/name-roles.d.ts +10 -22
  154. package/out/candidate/name-roles.d.ts.map +1 -1
  155. package/out/candidate/name-roles.js +15 -33
  156. package/out/candidate/name-roles.js.map +1 -1
  157. package/out/candidate/own-name.d.ts +23 -25
  158. package/out/candidate/own-name.d.ts.map +1 -1
  159. package/out/candidate/own-name.js +34 -31
  160. package/out/candidate/own-name.js.map +1 -1
  161. package/out/candidate/place-attrs.d.ts +20 -13
  162. package/out/candidate/place-attrs.d.ts.map +1 -1
  163. package/out/candidate/place-attrs.js +4 -5
  164. package/out/candidate/place-attrs.js.map +1 -1
  165. package/out/candidate/schema.d.ts +120 -0
  166. package/out/candidate/schema.d.ts.map +1 -0
  167. package/out/{candidate-schema.js → candidate/schema.js} +11 -23
  168. package/out/candidate/schema.js.map +1 -0
  169. package/out/{candidate-scoring.d.ts → candidate/scoring.d.ts} +8 -9
  170. package/out/candidate/scoring.d.ts.map +1 -0
  171. package/out/candidate/scoring.js +157 -0
  172. package/out/candidate/scoring.js.map +1 -0
  173. package/out/capital-schema.d.ts +21 -17
  174. package/out/capital-schema.d.ts.map +1 -1
  175. package/out/capital-schema.js +17 -15
  176. package/out/capital-schema.js.map +1 -1
  177. package/out/capitals.d.ts +26 -24
  178. package/out/capitals.d.ts.map +1 -1
  179. package/out/capitals.js +23 -21
  180. package/out/capitals.js.map +1 -1
  181. package/out/coincident-roles.d.ts +60 -43
  182. package/out/coincident-roles.d.ts.map +1 -1
  183. package/out/coincident-roles.js +61 -50
  184. package/out/coincident-roles.js.map +1 -1
  185. package/out/convention/schema.d.ts +12 -6
  186. package/out/convention/schema.d.ts.map +1 -1
  187. package/out/convention/schema.js +6 -4
  188. package/out/convention/schema.js.map +1 -1
  189. package/out/convention.d.ts +97 -0
  190. package/out/convention.d.ts.map +1 -0
  191. package/out/convention.js +81 -0
  192. package/out/convention.js.map +1 -0
  193. package/out/coverage-manifest-schema.d.ts +33 -38
  194. package/out/coverage-manifest-schema.d.ts.map +1 -1
  195. package/out/coverage-manifest-schema.js +20 -29
  196. package/out/coverage-manifest-schema.js.map +1 -1
  197. package/out/currency-backfill.d.ts +13 -35
  198. package/out/currency-backfill.d.ts.map +1 -1
  199. package/out/currency-backfill.js +12 -39
  200. package/out/currency-backfill.js.map +1 -1
  201. package/out/env.d.ts +2 -2
  202. package/out/env.js +1 -1
  203. package/out/exact-match.d.ts +19 -10
  204. package/out/exact-match.d.ts.map +1 -1
  205. package/out/exact-match.js +31 -20
  206. package/out/exact-match.js.map +1 -1
  207. package/out/extracts.d.ts +65 -54
  208. package/out/extracts.d.ts.map +1 -1
  209. package/out/extracts.js +63 -55
  210. package/out/extracts.js.map +1 -1
  211. package/out/fst/autocomplete.d.ts +28 -20
  212. package/out/fst/autocomplete.d.ts.map +1 -1
  213. package/out/fst/autocomplete.js +38 -27
  214. package/out/fst/autocomplete.js.map +1 -1
  215. package/out/fst/builder.d.ts.map +1 -1
  216. package/out/fst/builder.js +30 -36
  217. package/out/fst/builder.js.map +1 -1
  218. package/out/fst/deserialize-web.d.ts +3 -3
  219. package/out/fst/deserialize-web.d.ts.map +1 -1
  220. package/out/fst/deserialize-web.js +8 -9
  221. package/out/fst/deserialize-web.js.map +1 -1
  222. package/out/fst/format.d.ts +41 -23
  223. package/out/fst/format.d.ts.map +1 -1
  224. package/out/fst/format.js +41 -23
  225. package/out/fst/format.js.map +1 -1
  226. package/out/fst/freshness.d.ts +11 -73
  227. package/out/fst/freshness.d.ts.map +1 -1
  228. package/out/fst/freshness.js +12 -76
  229. package/out/fst/freshness.js.map +1 -1
  230. package/out/fst/matcher.d.ts +1 -1
  231. package/out/fst/matcher.d.ts.map +1 -1
  232. package/out/fst/matcher.js +2 -2
  233. package/out/fst/matcher.js.map +1 -1
  234. package/out/fst/serialize.d.ts +30 -26
  235. package/out/fst/serialize.d.ts.map +1 -1
  236. package/out/fst/serialize.js +44 -58
  237. package/out/fst/serialize.js.map +1 -1
  238. package/out/fst/types.d.ts +71 -59
  239. package/out/fst/types.d.ts.map +1 -1
  240. package/out/fst/types.js +1 -4
  241. package/out/fst/types.js.map +1 -1
  242. package/out/{fst/index.js → fst.d.ts} +1 -1
  243. package/out/fst.d.ts.map +1 -0
  244. package/out/{fst/index.d.ts → fst.js} +1 -1
  245. package/out/fst.js.map +1 -0
  246. package/out/fts/query.d.ts +2 -27
  247. package/out/fts/query.d.ts.map +1 -1
  248. package/out/fts/query.js +5 -36
  249. package/out/fts/query.js.map +1 -1
  250. package/out/fts.d.ts +126 -0
  251. package/out/fts.d.ts.map +1 -0
  252. package/out/fts.js +188 -0
  253. package/out/fts.js.map +1 -0
  254. package/out/geonames/aliases.d.ts +26 -67
  255. package/out/geonames/aliases.d.ts.map +1 -1
  256. package/out/geonames/aliases.js +44 -121
  257. package/out/geonames/aliases.js.map +1 -1
  258. package/out/geonames/postal.d.ts +84 -50
  259. package/out/geonames/postal.d.ts.map +1 -1
  260. package/out/geonames/postal.js +115 -78
  261. package/out/geonames/postal.js.map +1 -1
  262. package/out/{geonames/index.js → geonames.d.ts} +1 -1
  263. package/out/geonames.d.ts.map +1 -0
  264. package/out/{geonames/index.d.ts → geonames.js} +1 -1
  265. package/out/geonames.js.map +1 -0
  266. package/out/index.d.ts +20 -21
  267. package/out/index.d.ts.map +1 -1
  268. package/out/index.js +14 -15
  269. package/out/index.js.map +1 -1
  270. package/out/interpolation.d.ts +15 -52
  271. package/out/interpolation.d.ts.map +1 -1
  272. package/out/interpolation.js +25 -68
  273. package/out/interpolation.js.map +1 -1
  274. package/out/lookup.d.ts +24 -53
  275. package/out/lookup.d.ts.map +1 -1
  276. package/out/lookup.js +117 -223
  277. package/out/lookup.js.map +1 -1
  278. package/out/name-score.d.ts +2 -2
  279. package/out/name-score.d.ts.map +1 -1
  280. package/out/name-score.js +9 -7
  281. package/out/name-score.js.map +1 -1
  282. package/out/nsul/lookup.d.ts +33 -34
  283. package/out/nsul/lookup.d.ts.map +1 -1
  284. package/out/nsul/lookup.js +26 -40
  285. package/out/nsul/lookup.js.map +1 -1
  286. package/out/nsul/schema.d.ts +16 -43
  287. package/out/nsul/schema.d.ts.map +1 -1
  288. package/out/nsul/schema.js +9 -35
  289. package/out/nsul/schema.js.map +1 -1
  290. package/out/{nsul/index.d.ts → nsul.d.ts} +1 -1
  291. package/out/nsul.d.ts.map +1 -0
  292. package/out/{nsul/index.js → nsul.js} +1 -1
  293. package/out/nsul.js.map +1 -0
  294. package/out/paths.d.ts +124 -0
  295. package/out/paths.d.ts.map +1 -0
  296. package/out/paths.js +104 -0
  297. package/out/paths.js.map +1 -0
  298. package/out/place-importance-schema.d.ts +49 -141
  299. package/out/place-importance-schema.d.ts.map +1 -1
  300. package/out/place-importance-schema.js +25 -140
  301. package/out/place-importance-schema.js.map +1 -1
  302. package/out/poi/lookup.d.ts +38 -42
  303. package/out/poi/lookup.d.ts.map +1 -1
  304. package/out/poi/lookup.js +67 -90
  305. package/out/poi/lookup.js.map +1 -1
  306. package/out/poi/schema.d.ts +41 -25
  307. package/out/poi/schema.d.ts.map +1 -1
  308. package/out/poi/schema.js +25 -17
  309. package/out/poi/schema.js.map +1 -1
  310. package/out/{poi/index.js → poi.d.ts} +1 -1
  311. package/out/poi.d.ts.map +1 -0
  312. package/out/{poi/index.d.ts → poi.js} +1 -1
  313. package/out/poi.js.map +1 -0
  314. package/out/polygon-schema.d.ts +10 -6
  315. package/out/polygon-schema.d.ts.map +1 -1
  316. package/out/polygon-schema.js +2 -2
  317. package/out/polygon-schema.js.map +1 -1
  318. package/out/postal/{city-alias-lookup.d.ts → city/alias/lookup.d.ts} +22 -25
  319. package/out/postal/city/alias/lookup.d.ts.map +1 -0
  320. package/out/postal/city/alias/lookup.js +49 -0
  321. package/out/postal/city/alias/lookup.js.map +1 -0
  322. package/out/postal/{city-alias-schema.d.ts → city/alias/schema.d.ts} +15 -11
  323. package/out/postal/city/alias/schema.d.ts.map +1 -0
  324. package/out/postal/{city-alias-schema.js → city/alias/schema.js} +11 -9
  325. package/out/postal/city/alias/schema.js.map +1 -0
  326. package/out/postal/city/candidate-schema.d.ts +72 -0
  327. package/out/postal/city/candidate-schema.d.ts.map +1 -0
  328. package/out/postal/city/candidate-schema.js +60 -0
  329. package/out/postal/city/candidate-schema.js.map +1 -0
  330. package/out/postal.d.ts +9 -0
  331. package/out/postal.d.ts.map +1 -0
  332. package/out/postal.js +9 -0
  333. package/out/postal.js.map +1 -0
  334. package/out/postcode-point-lookup.d.ts +9 -19
  335. package/out/postcode-point-lookup.d.ts.map +1 -1
  336. package/out/postcode-point-lookup.js +5 -17
  337. package/out/postcode-point-lookup.js.map +1 -1
  338. package/out/primary-preference.d.ts +39 -93
  339. package/out/primary-preference.d.ts.map +1 -1
  340. package/out/primary-preference.js +13 -97
  341. package/out/primary-preference.js.map +1 -1
  342. package/out/proximity-rerank.d.ts +40 -29
  343. package/out/proximity-rerank.d.ts.map +1 -1
  344. package/out/proximity-rerank.js +38 -29
  345. package/out/proximity-rerank.js.map +1 -1
  346. package/out/ranking-weights.d.ts +91 -62
  347. package/out/ranking-weights.d.ts.map +1 -1
  348. package/out/ranking-weights.js +26 -25
  349. package/out/ranking-weights.js.map +1 -1
  350. package/out/region-keys.d.ts +48 -29
  351. package/out/region-keys.d.ts.map +1 -1
  352. package/out/region-keys.js +68 -40
  353. package/out/region-keys.js.map +1 -1
  354. package/out/reverse.d.ts +75 -50
  355. package/out/reverse.d.ts.map +1 -1
  356. package/out/reverse.js +61 -49
  357. package/out/reverse.js.map +1 -1
  358. package/out/schema.d.ts +74 -42
  359. package/out/schema.d.ts.map +1 -1
  360. package/out/schema.js +4 -5
  361. package/out/schema.js.map +1 -1
  362. package/out/search-fetch.d.ts +16 -12
  363. package/out/search-fetch.d.ts.map +1 -1
  364. package/out/search-fetch.js +83 -63
  365. package/out/search-fetch.js.map +1 -1
  366. package/out/sqlite/convention-source.d.ts +25 -0
  367. package/out/sqlite/convention-source.d.ts.map +1 -0
  368. package/out/sqlite/convention-source.js +48 -0
  369. package/out/sqlite/convention-source.js.map +1 -0
  370. package/out/sqlite/utils.d.ts +45 -0
  371. package/out/sqlite/utils.d.ts.map +1 -0
  372. package/out/sqlite/utils.js +56 -0
  373. package/out/sqlite/utils.js.map +1 -0
  374. package/out/street/centroid/schema.d.ts +100 -0
  375. package/out/street/centroid/schema.d.ts.map +1 -0
  376. package/out/street/centroid/schema.js +66 -0
  377. package/out/street/centroid/schema.js.map +1 -0
  378. package/out/street/centroid.d.ts +9 -19
  379. package/out/street/centroid.d.ts.map +1 -1
  380. package/out/street/centroid.js +11 -22
  381. package/out/street/centroid.js.map +1 -1
  382. package/out/street/{morphology-fst-builder.d.ts → morphology/fst/builder.d.ts} +21 -11
  383. package/out/street/morphology/fst/builder.d.ts.map +1 -0
  384. package/out/street/{morphology-fst-builder.js → morphology/fst/builder.js} +40 -34
  385. package/out/street/morphology/fst/builder.js.map +1 -0
  386. package/out/street/morphology/fst/loader.d.ts +74 -0
  387. package/out/street/morphology/fst/loader.d.ts.map +1 -0
  388. package/out/street/{morphology-fst-loader.js → morphology/fst/loader.js} +21 -21
  389. package/out/street/morphology/fst/loader.js.map +1 -0
  390. package/out/street/name-lookup.d.ts +24 -18
  391. package/out/street/name-lookup.d.ts.map +1 -1
  392. package/out/street/name-lookup.js +32 -31
  393. package/out/street/name-lookup.js.map +1 -1
  394. package/out/street/normalize.d.ts +35 -136
  395. package/out/street/normalize.d.ts.map +1 -1
  396. package/out/street/normalize.js +74 -191
  397. package/out/street/normalize.js.map +1 -1
  398. package/out/street/segment-schema.d.ts +79 -39
  399. package/out/street/segment-schema.d.ts.map +1 -1
  400. package/out/street/segment-schema.js +71 -21
  401. package/out/street/segment-schema.js.map +1 -1
  402. package/out/{street/index.d.ts → street.d.ts} +4 -4
  403. package/out/street.d.ts.map +1 -0
  404. package/out/{street/index.js → street.js} +4 -4
  405. package/out/street.js.map +1 -0
  406. package/out/types.d.ts +69 -138
  407. package/out/types.d.ts.map +1 -1
  408. package/out/types.js +0 -6
  409. package/out/types.js.map +1 -1
  410. package/out/unified-schema.d.ts +8 -12
  411. package/out/unified-schema.d.ts.map +1 -1
  412. package/out/unified-schema.js +29 -29
  413. package/out/unified-schema.js.map +1 -1
  414. package/out/uprn/existence.d.ts +28 -17
  415. package/out/uprn/existence.d.ts.map +1 -1
  416. package/out/uprn/existence.js +26 -16
  417. package/out/uprn/existence.js.map +1 -1
  418. package/out/uprn/lookup.d.ts +14 -44
  419. package/out/uprn/lookup.d.ts.map +1 -1
  420. package/out/uprn/lookup.js +20 -56
  421. package/out/uprn/lookup.js.map +1 -1
  422. package/out/uprn/schema.d.ts +18 -40
  423. package/out/uprn/schema.d.ts.map +1 -1
  424. package/out/uprn/schema.js +10 -32
  425. package/out/uprn/schema.js.map +1 -1
  426. package/out/{uprn/index.d.ts → uprn.d.ts} +1 -1
  427. package/out/uprn.d.ts.map +1 -0
  428. package/out/{uprn/index.js → uprn.js} +1 -1
  429. package/out/uprn.js.map +1 -0
  430. package/out/weights-overlay-linker.d.ts +132 -141
  431. package/out/weights-overlay-linker.d.ts.map +1 -1
  432. package/out/weights-overlay-linker.js +86 -154
  433. package/out/weights-overlay-linker.js.map +1 -1
  434. package/package.json +94 -599
  435. package/lib/address/point-schema.ts +0 -155
  436. package/lib/build-candidate.ts +0 -632
  437. package/lib/build-slim.ts +0 -408
  438. package/lib/candidate-ancestors-schema.ts +0 -195
  439. package/lib/candidate-fts.ts +0 -46
  440. package/lib/candidate-importance.ts +0 -224
  441. package/lib/candidate-lookup.ts +0 -977
  442. package/lib/candidate-schema.ts +0 -247
  443. package/lib/candidate-scoring.ts +0 -261
  444. package/lib/convention/index.ts +0 -154
  445. package/lib/fts/index.ts +0 -361
  446. package/lib/postal/city-alias-lookup.ts +0 -97
  447. package/lib/postal/index.ts +0 -9
  448. package/lib/sqlite-convention-source.ts +0 -65
  449. package/lib/sqlite-utils.ts +0 -82
  450. package/lib/street/centroid-schema.ts +0 -154
  451. package/out/address/index.d.ts.map +0 -1
  452. package/out/address/index.js.map +0 -1
  453. package/out/address/point-interpolation.d.ts +0 -49
  454. package/out/address/point-interpolation.d.ts.map +0 -1
  455. package/out/address/point-interpolation.js.map +0 -1
  456. package/out/address/point-schema.d.ts +0 -97
  457. package/out/address/point-schema.d.ts.map +0 -1
  458. package/out/address/point-schema.js.map +0 -1
  459. package/out/ancestry/index.d.ts +0 -45
  460. package/out/ancestry/index.d.ts.map +0 -1
  461. package/out/ancestry/index.js +0 -55
  462. package/out/ancestry/index.js.map +0 -1
  463. package/out/build-candidate.d.ts +0 -184
  464. package/out/build-candidate.d.ts.map +0 -1
  465. package/out/build-candidate.js.map +0 -1
  466. package/out/build-slim.d.ts +0 -80
  467. package/out/build-slim.d.ts.map +0 -1
  468. package/out/build-slim.js.map +0 -1
  469. package/out/candidate/ancestors-sidecar.d.ts +0 -32
  470. package/out/candidate/ancestors-sidecar.d.ts.map +0 -1
  471. package/out/candidate/ancestors-sidecar.js.map +0 -1
  472. package/out/candidate-ancestors-schema.d.ts +0 -150
  473. package/out/candidate-ancestors-schema.d.ts.map +0 -1
  474. package/out/candidate-ancestors-schema.js +0 -123
  475. package/out/candidate-ancestors-schema.js.map +0 -1
  476. package/out/candidate-fts.d.ts +0 -37
  477. package/out/candidate-fts.d.ts.map +0 -1
  478. package/out/candidate-fts.js +0 -40
  479. package/out/candidate-fts.js.map +0 -1
  480. package/out/candidate-importance.d.ts +0 -132
  481. package/out/candidate-importance.d.ts.map +0 -1
  482. package/out/candidate-importance.js +0 -169
  483. package/out/candidate-importance.js.map +0 -1
  484. package/out/candidate-lookup.d.ts +0 -76
  485. package/out/candidate-lookup.d.ts.map +0 -1
  486. package/out/candidate-lookup.js +0 -768
  487. package/out/candidate-lookup.js.map +0 -1
  488. package/out/candidate-schema.d.ts +0 -155
  489. package/out/candidate-schema.d.ts.map +0 -1
  490. package/out/candidate-schema.js.map +0 -1
  491. package/out/candidate-scoring.d.ts.map +0 -1
  492. package/out/candidate-scoring.js +0 -196
  493. package/out/candidate-scoring.js.map +0 -1
  494. package/out/convention/index.d.ts +0 -106
  495. package/out/convention/index.d.ts.map +0 -1
  496. package/out/convention/index.js +0 -93
  497. package/out/convention/index.js.map +0 -1
  498. package/out/fst/index.d.ts.map +0 -1
  499. package/out/fst/index.js.map +0 -1
  500. package/out/fts/index.d.ts +0 -184
  501. package/out/fts/index.d.ts.map +0 -1
  502. package/out/fts/index.js +0 -277
  503. package/out/fts/index.js.map +0 -1
  504. package/out/geonames/index.d.ts.map +0 -1
  505. package/out/geonames/index.js.map +0 -1
  506. package/out/nsul/index.d.ts.map +0 -1
  507. package/out/nsul/index.js.map +0 -1
  508. package/out/poi/index.d.ts.map +0 -1
  509. package/out/poi/index.js.map +0 -1
  510. package/out/postal/city-alias-lookup.d.ts.map +0 -1
  511. package/out/postal/city-alias-lookup.js +0 -62
  512. package/out/postal/city-alias-lookup.js.map +0 -1
  513. package/out/postal/city-alias-schema.d.ts.map +0 -1
  514. package/out/postal/city-alias-schema.js.map +0 -1
  515. package/out/postal/city-candidate-schema.d.ts +0 -66
  516. package/out/postal/city-candidate-schema.d.ts.map +0 -1
  517. package/out/postal/city-candidate-schema.js +0 -56
  518. package/out/postal/city-candidate-schema.js.map +0 -1
  519. package/out/postal/index.d.ts +0 -9
  520. package/out/postal/index.d.ts.map +0 -1
  521. package/out/postal/index.js +0 -9
  522. package/out/postal/index.js.map +0 -1
  523. package/out/sqlite-convention-source.d.ts +0 -29
  524. package/out/sqlite-convention-source.d.ts.map +0 -1
  525. package/out/sqlite-convention-source.js +0 -57
  526. package/out/sqlite-convention-source.js.map +0 -1
  527. package/out/sqlite-utils.d.ts +0 -45
  528. package/out/sqlite-utils.d.ts.map +0 -1
  529. package/out/sqlite-utils.js +0 -57
  530. package/out/sqlite-utils.js.map +0 -1
  531. package/out/street/centroid-schema.d.ts +0 -105
  532. package/out/street/centroid-schema.d.ts.map +0 -1
  533. package/out/street/centroid-schema.js +0 -78
  534. package/out/street/centroid-schema.js.map +0 -1
  535. package/out/street/index.d.ts.map +0 -1
  536. package/out/street/index.js.map +0 -1
  537. package/out/street/morphology-fst-builder.d.ts.map +0 -1
  538. package/out/street/morphology-fst-builder.js.map +0 -1
  539. package/out/street/morphology-fst-loader.d.ts +0 -67
  540. package/out/street/morphology-fst-loader.d.ts.map +0 -1
  541. package/out/street/morphology-fst-loader.js.map +0 -1
  542. package/out/uprn/index.d.ts.map +0 -1
  543. package/out/uprn/index.js.map +0 -1
  544. /package/lib/{fst/index.ts → fst.ts} +0 -0
  545. /package/lib/{geonames/index.ts → geonames.ts} +0 -0
  546. /package/lib/{nsul/index.ts → nsul.ts} +0 -0
  547. /package/lib/{poi/index.ts → poi.ts} +0 -0
  548. /package/lib/{uprn/index.ts → uprn.ts} +0 -0
package/out/fts/query.js CHANGED
@@ -3,9 +3,7 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * Query shaping for the FTS5 lookup: placetype normalization and the MATCH-expression sanitizer.
7
- * Both turn a caller's loose input into something SQLite's FTS5 parser accepts without throwing —
8
- * an unescaped quote or a bare `*` is a syntax error, not an empty result.
6
+ * Query shaping for the FTS5 lookup: placetype normalization and the match-expression sanitizer.
9
7
  */
10
8
  export function normalizePlacetypes(p) {
11
9
  if (!p)
@@ -13,30 +11,7 @@ export function normalizePlacetypes(p) {
13
11
  return Array.isArray(p) ? p : [p];
14
12
  }
15
13
  /**
16
- * Make an arbitrary user-typed string safe for FTS5 MATCH.
17
- *
18
- * FTS5 has its own query syntax (`"phrase"`, `term1 OR term2`, `prefix*`, NEAR/N, etc.). Letting raw user input through
19
- * means a user typing `Paris's` or `St. (Petersburg)` causes a syntax error.
20
- *
21
- * Per-token rules:
22
- *
23
- * - Strip all punctuation except trailing `*` from each whitespace-separated token.
24
- * - **Trailing `*`** is preserved as FTS5 **prefix syntax** — `627*` becomes the literal `627*` (unquoted). The caller
25
- * signaled they want a prefix; respect that.
26
- * - All other tokens are wrapped in `"..."` as a single-word phrase. Conservative — handles apostrophes, parens, accented
27
- * input, etc. safely.
28
- * - Multiple tokens join with implicit AND.
29
- *
30
- * Examples:
31
- *
32
- * - `"Paris"` → `"Paris"` (phrase)
33
- * - `"627*"` → `627*` (prefix)
34
- * - `"St. (Petersburg)"` → `"St" "Petersburg"` (two phrases, AND-joined)
35
- * - `"Thiron-Gardais"` → `"Thiron" "Gardais"` (intra-token punctuation SPLITS — #945; fusing to `ThironGardais` matched
36
- * nothing because the FTS doc tokenizes the hyphenated name as two terms)
37
- * - `"110 00"` with `fuseTokens` (postcode-typed) → `"110" "00"` per-token fused — the #920 name law
38
- * - `"Pari* TX"` → `Pari* "TX"` (mixed prefix + phrase)
39
- * - `"*"` alone → `""` (no body → drop)
14
+ * Make an arbitrary user-typed string safe for FTS5 match.
40
15
  */
41
16
  export function sanitizeFTSQuery(text, opts) {
42
17
  const out = [];
@@ -45,8 +20,7 @@ export function sanitizeFTSQuery(text, opts) {
45
20
  if (!trimmed)
46
21
  continue;
47
22
  const hasPrefixStar = trimmed.endsWith("*");
48
- // #920 name law (postcode-typed queries ONLY): delete intra-token punctuation and FUSE the
49
- // remainder — postal names are stored in this collapsed shape ("SW1A" stays one term).
23
+ // Fused mode deletes intra-token punctuation because postal names are stored in that collapsed shape.
50
24
  if (opts?.fuseTokens) {
51
25
  const body = trimmed.replaceAll(/[^\p{L}\p{N}]/gu, "");
52
26
  if (!body)
@@ -54,19 +28,14 @@ export function sanitizeFTSQuery(text, opts) {
54
28
  out.push(hasPrefixStar ? `${body}*` : `"${body.replaceAll('"', '""')}"`);
55
29
  continue;
56
30
  }
57
- // Everything else SPLITS on intra-token punctuation — the behavior the docstring always
58
- // promised ("St. (Petersburg)" → two phrases). The old code DELETED punctuation instead,
59
- // fusing "Thiron-Gardais" into the unmatchable single term `ThironGardais` while the FTS
60
- // doc holds two terms (#945 — the entire hyphenated-name class missed at the raw lookup;
61
- // masked for years because pre-splice tokenizers never emitted hyphen-preserved values).
62
- const parts = trimmed.split(/[^\p{L}\p{N}]+/u).filter((part) => part.length > 0);
31
+ const parts = trimmed.split(/[^\p{L}\p{N}]+/u).filter((part) => part.length);
63
32
  if (!parts.length)
64
33
  continue;
65
34
  for (let i = 0; i < parts.length; i++) {
66
35
  const body = parts[i].replaceAll("*", "");
67
36
  if (!body)
68
37
  continue;
69
- // The caller's trailing `*` applies to the FINAL part ("Thiron-Gard*" → "Thiron" Gard*).
38
+ // The caller's trailing `*` applies only to the final part.
70
39
  out.push(hasPrefixStar && i === parts.length - 1 ? `${body}*` : `"${body.replaceAll('"', '""')}"`);
71
40
  }
72
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../lib/fts/query.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,UAAU,mBAAmB,CAAC,CAA8B;IACjE,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IAEnB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAClC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAA+B;IAC7E,MAAM,GAAG,GAAa,EAAE,CAAA;IAExB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;QAE/B,IAAI,CAAC,OAAO;YAAE,SAAQ;QACtB,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QAE3C,2FAA2F;QAC3F,uFAAuF;QACvF,IAAI,IAAI,EAAE,UAAU,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAA;YAEtD,IAAI,CAAC,IAAI;gBAAE,SAAQ;YACnB,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;YAExE,SAAQ;QACT,CAAC;QAED,wFAAwF;QACxF,yFAAyF;QACzF,yFAAyF;QACzF,yFAAyF;QACzF,yFAAyF;QACzF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAEhF,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,SAAQ;QAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YAE1C,IAAI,CAAC,IAAI;gBAAE,SAAQ;YACnB,yFAAyF;YACzF,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;QACnG,CAAC;IACF,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACrB,CAAC"}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../lib/fts/query.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,UAAU,mBAAmB,CAAC,CAA8B;IACjE,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IAEnB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAA+B;IAC7E,MAAM,GAAG,GAAa,EAAE,CAAA;IAExB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;QAE/B,IAAI,CAAC,OAAO;YAAE,SAAQ;QACtB,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QAE3C,sGAAsG;QACtG,IAAI,IAAI,EAAE,UAAU,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAA;YAEtD,IAAI,CAAC,IAAI;gBAAE,SAAQ;YACnB,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;YAExE,SAAQ;QACT,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAE5E,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,SAAQ;QAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YAE1C,IAAI,CAAC,IAAI;gBAAE,SAAQ;YACnB,4DAA4D;YAC5D,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;QACnG,CAAC;IACF,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACrB,CAAC"}
package/out/fts.d.ts ADDED
@@ -0,0 +1,126 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import type { DatabaseClient } from "@mailwoman/sqlite/client";
7
+ /**
8
+ * The name of the FTS5 virtual table that indexes WOF place names for `match` queries.
9
+ */
10
+ export declare const PLACE_SEARCH_TABLE = "place_search";
11
+ /**
12
+ * The separator between aliases in the `alt_names` bag.
13
+ * It stops a phrase query from matching across two aliases.
14
+ *
15
+ * FTS5 assigns positions only to tokens.
16
+ * Spaces and punctuation are not tokens and would leave the aliases adjacent,
17
+ * but unicode61 indexes the Private Use Area codepoint U+E000 as a token.
18
+ *
19
+ * Query sanitizers strip this character, so no user query can match the separator.
20
+ */
21
+ export declare const ALIAS_SEPARATOR = "\uE000";
22
+ /**
23
+ * Folds a query or name for exact-tier comparison by lowercasing, trimming
24
+ * and collapsing internal whitespace.
25
+ *
26
+ * Every exact-tier consumer uses this function, so its output compares equal to
27
+ * the aliases that {@link aliasBagExactMatch} parses.
28
+ */
29
+ export declare function foldQueryText(input: string): string;
30
+ /**
31
+ * Returns whether any alias in an `alt_names` bag exactly equals the folded query.
32
+ *
33
+ * A bag without {@link ALIAS_SEPARATOR} is a legacy space-joined bag without alias boundaries.
34
+ * For such a bag, the function checks word-bounded containment only when no candidate matched strictly.
35
+ *
36
+ * Containment by itself would promote fragments such as "York" inside "New York City".
37
+ *
38
+ * @param altNames The `alt_names` bag from `place_search`, or null when the row has no aliases.
39
+ * @param normalizedQuery The query folded by {@link foldQueryText}.
40
+ * @param anyStrictExact Whether any candidate already matched on its canonical name or region abbreviation.
41
+ * Only legacy bags use it.
42
+ */
43
+ export declare function aliasBagExactMatch(altNames: string | null, normalizedQuery: string, anyStrictExact: boolean): boolean;
44
+ /**
45
+ * The name of the R*Tree virtual table that indexes WOF place bounding boxes for bbox and proximity lookups.
46
+ */
47
+ export declare const PLACE_BBOX_TABLE = "place_bbox";
48
+ /**
49
+ * The name of the sparse table that stores `wof:population` per place.
50
+ *
51
+ * The lookup uses this value to apply the population ranking boost.
52
+ *
53
+ * A place without a row gets no boost and no penalty.
54
+ */
55
+ export declare const PLACE_POPULATION_TABLE = "place_population";
56
+ /**
57
+ * The name of the table of per-place `referential` and `encyclopedic` scores,
58
+ * built by `mailwoman gazetteer importance`.
59
+ *
60
+ * The lookup copies `encyclopedic` onto results without ranking by it.
61
+ * It refuses to read an older table with a single `importance` column.
62
+ */
63
+ export declare const PLACE_IMPORTANCE_TABLE = "place_importance";
64
+ /**
65
+ * The indexes a {@link buildPlaceSearchFTS} run built and their row counts.
66
+ */
67
+ export interface BuildPlaceSearchFTSResult {
68
+ /**
69
+ * Whether this call built the FTS5 index.
70
+ * It is false when an existing index was kept.
71
+ */
72
+ created: boolean;
73
+ /**
74
+ * The row count of the `place_search` table after the call.
75
+ */
76
+ indexedRows: number;
77
+ /**
78
+ * Whether this call built the R*Tree bbox index.
79
+ * It is false when an existing index was kept.
80
+ */
81
+ bboxCreated: boolean;
82
+ /**
83
+ * The row count of the `place_bbox` R*Tree after the call.
84
+ */
85
+ bboxIndexedRows: number;
86
+ /**
87
+ * The wall-clock duration of the whole build in milliseconds.
88
+ */
89
+ durationMs: number;
90
+ }
91
+ /**
92
+ * Options for {@link buildPlaceSearchFTS}.
93
+ */
94
+ export interface BuildPlaceSearchFTSOpts {
95
+ /**
96
+ * Whether to drop and rebuild existing `place_search` and `place_bbox` tables,
97
+ * such as after an `spr` or `names` update.
98
+ * By default an existing index is kept.
99
+ */
100
+ drop?: boolean;
101
+ /**
102
+ * Receives each build phase as it begins.
103
+ * A planet-scale build takes minutes to populate.
104
+ */
105
+ onProgress?: (phase: "checking" | "dropping" | "creating" | "populating" | "creating-bbox" | "populating-bbox" | "done", detail?: string) => void;
106
+ }
107
+ /**
108
+ * Builds the `place_search` FTS5 table and the `place_bbox` R*Tree from a WOF
109
+ * database's `spr` and `names` tables.
110
+ *
111
+ * Without `drop: true`, an existing index is kept.
112
+ */
113
+ export declare function buildPlaceSearchFTS<DB>(db: DatabaseClient<DB>, opts?: BuildPlaceSearchFTSOpts): BuildPlaceSearchFTSResult;
114
+ /**
115
+ * Returns whether the connected database has the `place_search` FTS table.
116
+ */
117
+ export declare function placeSearchFTSExists<DB>(db: DatabaseClient<DB>): boolean;
118
+ /**
119
+ * Returns whether the connected database has the `place_bbox` R*Tree table.
120
+ */
121
+ export declare function placeBboxExists<DB>(db: DatabaseClient<DB>): boolean;
122
+ /**
123
+ * Returns whether the connected database has the `place_population` table.
124
+ */
125
+ export declare function placePopulationExists<DB>(db: DatabaseClient<DB>): boolean;
126
+ //# sourceMappingURL=fts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fts.d.ts","sourceRoot":"","sources":["../lib/fts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAG9D;;GAEG;AACH,eAAO,MAAM,kBAAkB,iBAAiB,CAAA;AAEhD;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,WAAW,CAAA;AAIvC;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG,OAAO,CAUrH;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,eAAe,CAAA;AAE5C;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,qBAAqB,CAAA;AAExD;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,qBAAqB,CAAA;AAExD;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACzC;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAA;IAEhB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IAEnB;;;OAGG;IACH,WAAW,EAAE,OAAO,CAAA;IAEpB;;OAEG;IACH,eAAe,EAAE,MAAM,CAAA;IAEvB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACvC;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd;;;OAGG;IACH,UAAU,CAAC,EAAE,CACZ,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,eAAe,GAAG,iBAAiB,GAAG,MAAM,EACzG,MAAM,CAAC,EAAE,MAAM,KACX,IAAI,CAAA;CACT;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EACrC,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,EACtB,IAAI,GAAE,uBAA4B,GAChC,yBAAyB,CA6G3B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,OAAO,CAExE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,OAAO,CAEnE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,OAAO,CAEzE"}
package/out/fts.js ADDED
@@ -0,0 +1,188 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { tableExists } from "@mailwoman/sqlite/introspection";
7
+ /**
8
+ * The name of the FTS5 virtual table that indexes WOF place names for `match` queries.
9
+ */
10
+ export const PLACE_SEARCH_TABLE = "place_search";
11
+ /**
12
+ * The separator between aliases in the `alt_names` bag.
13
+ * It stops a phrase query from matching across two aliases.
14
+ *
15
+ * FTS5 assigns positions only to tokens.
16
+ * Spaces and punctuation are not tokens and would leave the aliases adjacent,
17
+ * but unicode61 indexes the Private Use Area codepoint U+E000 as a token.
18
+ *
19
+ * Query sanitizers strip this character, so no user query can match the separator.
20
+ */
21
+ export const ALIAS_SEPARATOR = "\uE000";
22
+ const ALIAS_SEPARATOR_CODEPOINT = ALIAS_SEPARATOR.codePointAt(0);
23
+ /**
24
+ * Folds a query or name for exact-tier comparison by lowercasing, trimming
25
+ * and collapsing internal whitespace.
26
+ *
27
+ * Every exact-tier consumer uses this function, so its output compares equal to
28
+ * the aliases that {@link aliasBagExactMatch} parses.
29
+ */
30
+ export function foldQueryText(input) {
31
+ return input.toLowerCase().trim().replaceAll(/\s+/g, " ");
32
+ }
33
+ /**
34
+ * Returns whether any alias in an `alt_names` bag exactly equals the folded query.
35
+ *
36
+ * A bag without {@link ALIAS_SEPARATOR} is a legacy space-joined bag without alias boundaries.
37
+ * For such a bag, the function checks word-bounded containment only when no candidate matched strictly.
38
+ *
39
+ * Containment by itself would promote fragments such as "York" inside "New York City".
40
+ *
41
+ * @param altNames The `alt_names` bag from `place_search`, or null when the row has no aliases.
42
+ * @param normalizedQuery The query folded by {@link foldQueryText}.
43
+ * @param anyStrictExact Whether any candidate already matched on its canonical name or region abbreviation.
44
+ * Only legacy bags use it.
45
+ */
46
+ export function aliasBagExactMatch(altNames, normalizedQuery, anyStrictExact) {
47
+ if (altNames === null || altNames === "" || !normalizedQuery)
48
+ return false;
49
+ if (altNames.includes(ALIAS_SEPARATOR)) {
50
+ return altNames.split(ALIAS_SEPARATOR).some((alias) => foldQueryText(alias) === normalizedQuery);
51
+ }
52
+ if (anyStrictExact)
53
+ return false;
54
+ return ` ${foldQueryText(altNames)} `.includes(` ${normalizedQuery} `);
55
+ }
56
+ /**
57
+ * The name of the R*Tree virtual table that indexes WOF place bounding boxes for bbox and proximity lookups.
58
+ */
59
+ export const PLACE_BBOX_TABLE = "place_bbox";
60
+ /**
61
+ * The name of the sparse table that stores `wof:population` per place.
62
+ *
63
+ * The lookup uses this value to apply the population ranking boost.
64
+ *
65
+ * A place without a row gets no boost and no penalty.
66
+ */
67
+ export const PLACE_POPULATION_TABLE = "place_population";
68
+ /**
69
+ * The name of the table of per-place `referential` and `encyclopedic` scores,
70
+ * built by `mailwoman gazetteer importance`.
71
+ *
72
+ * The lookup copies `encyclopedic` onto results without ranking by it.
73
+ * It refuses to read an older table with a single `importance` column.
74
+ */
75
+ export const PLACE_IMPORTANCE_TABLE = "place_importance";
76
+ /**
77
+ * Builds the `place_search` FTS5 table and the `place_bbox` R*Tree from a WOF
78
+ * database's `spr` and `names` tables.
79
+ *
80
+ * Without `drop: true`, an existing index is kept.
81
+ */
82
+ export function buildPlaceSearchFTS(db, opts = {}) {
83
+ const start = Date.now();
84
+ const onProgress = opts.onProgress ?? (() => { });
85
+ onProgress("checking");
86
+ const ftsExisting = tableExists(db, PLACE_SEARCH_TABLE);
87
+ const bboxExisting = tableExists(db, PLACE_BBOX_TABLE);
88
+ let ftsCreated = false;
89
+ if (ftsExisting && opts.drop) {
90
+ onProgress("dropping", PLACE_SEARCH_TABLE);
91
+ db.exec(`DROP TABLE ${PLACE_SEARCH_TABLE}`);
92
+ }
93
+ if (!ftsExisting || opts.drop) {
94
+ onProgress("creating");
95
+ db.exec(`
96
+ CREATE VIRTUAL TABLE ${PLACE_SEARCH_TABLE} USING fts5(
97
+ wof_id UNINDEXED,
98
+ name,
99
+ alt_names,
100
+ tokenize = 'unicode61 remove_diacritics 2'
101
+ );
102
+ `);
103
+ onProgress("populating");
104
+ db.exec(`
105
+ INSERT INTO ${PLACE_SEARCH_TABLE} (wof_id, name, alt_names)
106
+ SELECT
107
+ spr.id,
108
+ spr.name,
109
+ COALESCE((
110
+ SELECT GROUP_CONCAT(
111
+ REPLACE(name, char(${ALIAS_SEPARATOR_CODEPOINT}), ' '),
112
+ ' ' || char(${ALIAS_SEPARATOR_CODEPOINT}) || ' '
113
+ ) || ' ' || char(${ALIAS_SEPARATOR_CODEPOINT})
114
+ FROM names WHERE names.id = spr.id
115
+ ), '')
116
+ FROM spr
117
+ WHERE spr.is_current != 0
118
+ AND spr.is_deprecated = 0
119
+ AND spr.name IS NOT NULL;
120
+ `);
121
+ ftsCreated = true;
122
+ }
123
+ const ftsCountRow = db.prepare(`SELECT COUNT(*) AS n FROM ${PLACE_SEARCH_TABLE}`).get();
124
+ let bboxCreated = false;
125
+ if (bboxExisting && opts.drop) {
126
+ onProgress("dropping", PLACE_BBOX_TABLE);
127
+ db.exec(`DROP TABLE ${PLACE_BBOX_TABLE}`);
128
+ }
129
+ if (!bboxExisting || opts.drop) {
130
+ onProgress("creating-bbox");
131
+ db.exec(`
132
+ CREATE VIRTUAL TABLE ${PLACE_BBOX_TABLE} USING rtree(
133
+ id,
134
+ min_lat, max_lat,
135
+ min_lon, max_lon
136
+ );
137
+ `);
138
+ onProgress("populating-bbox");
139
+ db.exec(`
140
+ INSERT INTO ${PLACE_BBOX_TABLE} (id, min_lat, max_lat, min_lon, max_lon)
141
+ SELECT
142
+ spr.id,
143
+ spr.min_latitude,
144
+ spr.max_latitude,
145
+ spr.min_longitude,
146
+ spr.max_longitude
147
+ FROM spr
148
+ WHERE spr.is_current != 0
149
+ AND spr.is_deprecated = 0
150
+ AND spr.min_latitude IS NOT NULL
151
+ AND spr.max_latitude IS NOT NULL
152
+ AND spr.min_longitude IS NOT NULL
153
+ AND spr.max_longitude IS NOT NULL
154
+ AND NOT (spr.min_latitude = 0 AND spr.max_latitude = 0
155
+ AND spr.min_longitude = 0 AND spr.max_longitude = 0);
156
+ `);
157
+ bboxCreated = true;
158
+ }
159
+ const bboxCountRow = db.prepare(`SELECT COUNT(*) AS n FROM ${PLACE_BBOX_TABLE}`).get();
160
+ onProgress("done", `${ftsCountRow.n} FTS rows + ${bboxCountRow.n} bbox rows ` +
161
+ `(${ftsCreated ? "built" : "preexisting"} / ${bboxCreated ? "built" : "preexisting"})`);
162
+ return {
163
+ created: ftsCreated,
164
+ indexedRows: ftsCountRow.n,
165
+ bboxCreated,
166
+ bboxIndexedRows: bboxCountRow.n,
167
+ durationMs: Date.now() - start,
168
+ };
169
+ }
170
+ /**
171
+ * Returns whether the connected database has the `place_search` FTS table.
172
+ */
173
+ export function placeSearchFTSExists(db) {
174
+ return tableExists(db, PLACE_SEARCH_TABLE);
175
+ }
176
+ /**
177
+ * Returns whether the connected database has the `place_bbox` R*Tree table.
178
+ */
179
+ export function placeBboxExists(db) {
180
+ return tableExists(db, PLACE_BBOX_TABLE);
181
+ }
182
+ /**
183
+ * Returns whether the connected database has the `place_population` table.
184
+ */
185
+ export function placePopulationExists(db) {
186
+ return tableExists(db, PLACE_POPULATION_TABLE);
187
+ }
188
+ //# sourceMappingURL=fts.js.map
package/out/fts.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fts.js","sourceRoot":"","sources":["../lib/fts.ts"],"names":[],"mappings":"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"}
@@ -2,99 +2,58 @@
2
2
  * @copyright Sister Software
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
- *
6
- * #743/#193 — fold GeoNames bilingual / alt-language place-names into a WOF/unified admin DB as
7
- * first-class places. The hard-filter recall gap on bilingual countries (the address says
8
- * "Karjaa" but the table holds the Swedish "Karis") is missing alt-LANGUAGE names, not missing
9
- * places: the WOF/Overture `names` carried only the primary, so the candidate build's Latin-alias
10
- * explode (build-candidate pass 2) had nothing to widen. GeoNames' per-country dump carries the
11
- * variants inline (the Karis row's `alternatenames` includes "Karjaa").
12
- *
13
- * For each POPULATED place (feature class `P`) this writes an `spr` row + `names` rows (primary +
14
- * Latin alt-names) + population into the SAME tables the WOF/Overture paths use — synthetic ids
15
- * based at {@link GEONAMES_ID_BASE} so the three sources never collide. The caller then rebuilds
16
- * `place_search` ({@link buildPlaceSearchFTS} with `drop: true`) so the candidate build carries
17
- * Karjaa↔Karis. Proven (FI hard-resolve 69.5 → 85.8 %, coverage 74.4 → 94.0 %); duplicating a
18
- * place already held under another source is benign — the rows share name_key+coord and the
19
- * candidate ranking dedupes by score.
20
- *
21
- * This is the package home so the canonical `build-unified-wof --geonames-countries`, the
22
- * pipeline fold (`gazetteer-pipeline/admin/fold-geonames`), AND the `mailwoman gazetteer` commands all share
23
- * ONE implementation. GeoNames dump = `download.geonames.org/export/dump/<CC>.zip` → `<CC>.txt`
24
- * (TSV).
25
5
  */
26
6
  import type { DatabaseClient } from "@mailwoman/sqlite/client";
27
7
  import { type PathBuilderLike } from "path-ts";
28
8
  import type { WOFDatabase } from "#schema";
29
9
  /**
30
- * Synthetic id base for GeoNames-sourced rows (#743/#193) — above Overture's 8e12 so the three sources (WOF real ids,
31
- * Overture, GeoNames) never collide in a combined DB.
32
- */
33
- export declare const GEONAMES_ID_BASE = 9000000000000;
34
- /**
35
- * Clear everything the alias fold owns — `[GEONAMES_ID_BASE, GEONAMES_POSTAL_ID_BASE)` across {@link
36
- * FOLD_OWNED_TABLES}
37
- * — so a fold's output is a function of its country list and dumps ALONE, never of what the DB happened to hold first.
38
- * Returns the rows removed per table.
39
- *
40
- * This exists because the synthetic id is a POSITION (`GEONAMES_ID_BASE + n`, counted across the country list in
41
- * order), not a derivation from the geonameid: change the list, its order, or a dump's contents and every subsequent id
42
- * shifts. Without the purge, a second fold overwrote the `spr` PREFIX it reached (`INSERT OR REPLACE`) while its
43
- * `names`/`ancestors` rows merely appended (bare `INSERT`) and `place_population` skipped unpopulated places entirely —
44
- * so the previous run's names, ancestry and populations stayed bound to ids now describing other places.
10
+ * Deletes every row the GeoNames alias fold owns, with ids in
11
+ * `[GEONAMES_ID_BASE, GEONAMES_POSTAL_ID_BASE)`, and returns the count removed per table.
45
12
  *
46
- * Measured on the live 2026-08-05 artifact: a 14-country re-fold over the 161-country fold baked into
47
- * `admin-global-priority.db` put 522,184 of 2,110,096 name rows in the range (24.7 %) on a place from a different
48
- * country. Gaborone/BW at id 9000000121151 became Aichegg/AT and kept all 26 of its names; Kinshasa's 16,000,000
49
- * population landed on a Lithuanian hamlet.
50
- *
51
- * The upper bound is NOT the end of the id space. Each later extract owns a range above this one — GeoNames-postal @
52
- * 9.5e12, NL-PC6 @ 9.6e12, Code-Point @ 9.7e12, NI @ 9.8e12 — and a purge that ran past {@link GEONAMES_POSTAL_ID_BASE}
53
- * would delete them.
13
+ * Fold ids are assigned sequentially, so a re-fold without this purge would attach
14
+ * stale names, ancestors and populations to other places.
15
+ * The upper bound leaves the postal and postcode id ranges above it untouched.
54
16
  */
55
17
  export declare function purgeGeonamesAliasRange<DB>(db: DatabaseClient<DB>): Record<string, number>;
56
18
  /**
57
- * Per-country progress for the ingest — one event per country dump processed (or skipped).
19
+ * One progress event per country dump that the ingest processed or skipped.
58
20
  */
59
21
  export interface GeonamesIngestProgress {
60
22
  /**
61
- * ISO 3166-1 alpha-2 code.
23
+ * The ISO 3166-1 alpha-2 country code.
62
24
  */
63
25
  country: string;
64
26
  /**
65
- * Populated places ingested from this country's dump (0 when skipped).
27
+ * The number of populated places ingested from this country's dump, or 0 when it was skipped.
66
28
  */
67
29
  places: number;
68
30
  /**
69
- * True when the country's `<CC>.txt` dump was missing — the country is skipped, not fatal.
31
+ * Whether the country's `<CC>.txt` dump was missing.
32
+ *
33
+ * A missing dump skips the country without failing the ingest.
70
34
  */
71
35
  skipped: boolean;
36
+ /**
37
+ * The number of alternate names that the alias filter rejected.
38
+ *
39
+ * It distinguishes a sparse source from aliases that the fold discarded.
40
+ */
41
+ aliasesRefused?: number;
72
42
  }
73
43
  /**
74
- * Fold the GeoNames `P`-class places (+ their Latin alt-names) for `countries` into `db`'s `spr` / `names` /
75
- * `place_population` tables. Returns the total places ingested.
44
+ * Formats a GeoNames fold progress event as one log line.
45
+ */
46
+ export declare function formatGeonamesIngestProgress(event: GeonamesIngestProgress, missingFile?: PathBuilderLike): string;
47
+ /**
48
+ * Purges the fold's id range, then adds GeoNames `P`-class places and their
49
+ * alternate names for `countries` to `db`.
50
+ * It returns the number of places ingested.
76
51
  *
77
- * `onProgress` receives one event per country (default: a stderr line, matching the build scripts' legacy output). The
78
- * caller MUST rebuild `place_search` afterward (`buildPlaceSearchFTS(db, { drop: true })`) for the new names to reach
79
- * the candidate build's alias pass.
52
+ * The caller must then rebuild `place_search` with `buildPlaceSearchFTS(db, { drop: true })`
53
+ * to make the new names searchable.
80
54
  */
81
55
  export declare function ingestGeonamesAliases(db: DatabaseClient<WOFDatabase>, countries: string[], geonamesDir: PathBuilderLike, onProgress?: (event: GeonamesIngestProgress) => void, opts?: {
82
- /**
83
- * #267: the countries for which to ALSO fold the GeoNames A-class admin (PCLI country + ADM1 regions) and link each
84
- * locality's `parent_id` + ancestry chain (locality → region → country). PER-COUNTRY because a country that already
85
- * carries WOF admin would double up — pass only the ZERO-COVERAGE gap countries (the coverage-expansion targets),
86
- * never the EU alias set. Without admin, a gap country's localities are orphans (`parent_id=-1`, no ancestors), so
87
- * `parentID` scoping and adminCoherence can't reach them and "Tbilisi, GE" can't resolve.
88
- */
89
56
  adminForCountries?: ReadonlySet<string>;
90
- /**
91
- * #936: directory of per-country alternateNamesV2 dumps
92
- * (`download.geonames.org/export/dump/alternatenames/<CC>.zip` → `<CC>.txt`). When a country's file is present,
93
- * alias rows gain their language tag, `privateuse` ("preferred" from `isPreferredName`), and the `official` bit
94
- * (language is CLDR-official for the country, colloquial/historic excluded — the rule the #936 risk probe measured
95
- * at 7 new name-exact collisions globally). The main dump's bare `alternatenames` list still decides WHICH rows
96
- * exist; V2 only decorates them. Missing file = the pre-#936 untagged behavior, not an error.
97
- */
98
57
  alternateDir?: PathBuilderLike;
99
58
  }): Promise<number>;
100
59
  //# sourceMappingURL=aliases.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../../lib/geonames/aliases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAQ,KAAK,eAAe,EAAE,MAAM,SAAS,CAAA;AAIpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C;;;GAGG;AACH,eAAO,MAAM,gBAAgB,gBAAoB,CAAA;AAQjD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAY1F;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,OAAO,EAAE,OAAO,CAAA;CAChB;AAqFD;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAC1C,EAAE,EAAE,cAAc,CAAC,WAAW,CAAC,EAC/B,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,eAAe,EAC5B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,EACpD,IAAI,CAAC,EAAE;IACN;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACvC;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,eAAe,CAAA;CAC9B,GACC,OAAO,CAAC,MAAM,CAAC,CA8MjB"}
1
+ {"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../../lib/geonames/aliases.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,SAAS,CAAA;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAI1C;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAY1F;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IAEd;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAA;IAEhB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,sBAAsB,EAAE,WAAW,CAAC,EAAE,eAAe,GAAG,MAAM,CAMjH;AAgED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAC1C,EAAE,EAAE,cAAc,CAAC,WAAW,CAAC,EAC/B,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,eAAe,EAC5B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,EACpD,IAAI,CAAC,EAAE;IACN,iBAAiB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAEvC,YAAY,CAAC,EAAE,eAAe,CAAA;CAC9B,GACC,OAAO,CAAC,MAAM,CAAC,CAyLjB"}