@sempdev/semp 0.4.3

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 (559) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/dist/brief/address.d.ts +77 -0
  4. package/dist/brief/address.d.ts.map +1 -0
  5. package/dist/brief/address.js +217 -0
  6. package/dist/brief/address.js.map +1 -0
  7. package/dist/brief/brief.d.ts +75 -0
  8. package/dist/brief/brief.d.ts.map +1 -0
  9. package/dist/brief/brief.js +56 -0
  10. package/dist/brief/brief.js.map +1 -0
  11. package/dist/brief/index.d.ts +11 -0
  12. package/dist/brief/index.d.ts.map +1 -0
  13. package/dist/brief/index.js +11 -0
  14. package/dist/brief/index.js.map +1 -0
  15. package/dist/canonical/index.d.ts +8 -0
  16. package/dist/canonical/index.d.ts.map +1 -0
  17. package/dist/canonical/index.js +8 -0
  18. package/dist/canonical/index.js.map +1 -0
  19. package/dist/canonical/marshal.d.ts +35 -0
  20. package/dist/canonical/marshal.d.ts.map +1 -0
  21. package/dist/canonical/marshal.js +107 -0
  22. package/dist/canonical/marshal.js.map +1 -0
  23. package/dist/clockskew/index.d.ts +52 -0
  24. package/dist/clockskew/index.d.ts.map +1 -0
  25. package/dist/clockskew/index.js +62 -0
  26. package/dist/clockskew/index.js.map +1 -0
  27. package/dist/closure/closure.d.ts +106 -0
  28. package/dist/closure/closure.d.ts.map +1 -0
  29. package/dist/closure/closure.js +152 -0
  30. package/dist/closure/closure.js.map +1 -0
  31. package/dist/closure/driver.d.ts +103 -0
  32. package/dist/closure/driver.d.ts.map +1 -0
  33. package/dist/closure/driver.js +126 -0
  34. package/dist/closure/driver.js.map +1 -0
  35. package/dist/closure/index.d.ts +13 -0
  36. package/dist/closure/index.d.ts.map +1 -0
  37. package/dist/closure/index.js +13 -0
  38. package/dist/closure/index.js.map +1 -0
  39. package/dist/closure/store.d.ts +80 -0
  40. package/dist/closure/store.d.ts.map +1 -0
  41. package/dist/closure/store.js +89 -0
  42. package/dist/closure/store.js.map +1 -0
  43. package/dist/crypto/aead.d.ts +29 -0
  44. package/dist/crypto/aead.d.ts.map +1 -0
  45. package/dist/crypto/aead.js +48 -0
  46. package/dist/crypto/aead.js.map +1 -0
  47. package/dist/crypto/argon2.d.ts +20 -0
  48. package/dist/crypto/argon2.d.ts.map +1 -0
  49. package/dist/crypto/argon2.js +28 -0
  50. package/dist/crypto/argon2.js.map +1 -0
  51. package/dist/crypto/index.d.ts +14 -0
  52. package/dist/crypto/index.d.ts.map +1 -0
  53. package/dist/crypto/index.js +14 -0
  54. package/dist/crypto/index.js.map +1 -0
  55. package/dist/crypto/kdf.d.ts +96 -0
  56. package/dist/crypto/kdf.d.ts.map +1 -0
  57. package/dist/crypto/kdf.js +122 -0
  58. package/dist/crypto/kdf.js.map +1 -0
  59. package/dist/crypto/kem.d.ts +85 -0
  60. package/dist/crypto/kem.d.ts.map +1 -0
  61. package/dist/crypto/kem.js +130 -0
  62. package/dist/crypto/kem.js.map +1 -0
  63. package/dist/crypto/mac.d.ts +19 -0
  64. package/dist/crypto/mac.d.ts.map +1 -0
  65. package/dist/crypto/mac.js +32 -0
  66. package/dist/crypto/mac.js.map +1 -0
  67. package/dist/delivery/ack.d.ts +125 -0
  68. package/dist/delivery/ack.d.ts.map +1 -0
  69. package/dist/delivery/ack.js +141 -0
  70. package/dist/delivery/ack.js.map +1 -0
  71. package/dist/delivery/blocklist.d.ts +87 -0
  72. package/dist/delivery/blocklist.d.ts.map +1 -0
  73. package/dist/delivery/blocklist.js +107 -0
  74. package/dist/delivery/blocklist.js.map +1 -0
  75. package/dist/delivery/cancel.d.ts +60 -0
  76. package/dist/delivery/cancel.d.ts.map +1 -0
  77. package/dist/delivery/cancel.js +43 -0
  78. package/dist/delivery/cancel.js.map +1 -0
  79. package/dist/delivery/disposition.d.ts +106 -0
  80. package/dist/delivery/disposition.d.ts.map +1 -0
  81. package/dist/delivery/disposition.js +105 -0
  82. package/dist/delivery/disposition.js.map +1 -0
  83. package/dist/delivery/fetch.d.ts +59 -0
  84. package/dist/delivery/fetch.d.ts.map +1 -0
  85. package/dist/delivery/fetch.js +47 -0
  86. package/dist/delivery/fetch.js.map +1 -0
  87. package/dist/delivery/forwarder.d.ts +106 -0
  88. package/dist/delivery/forwarder.d.ts.map +1 -0
  89. package/dist/delivery/forwarder.js +251 -0
  90. package/dist/delivery/forwarder.js.map +1 -0
  91. package/dist/delivery/inbox.d.ts +42 -0
  92. package/dist/delivery/inbox.d.ts.map +1 -0
  93. package/dist/delivery/inbox.js +68 -0
  94. package/dist/delivery/inbox.js.map +1 -0
  95. package/dist/delivery/index.d.ts +31 -0
  96. package/dist/delivery/index.d.ts.map +1 -0
  97. package/dist/delivery/index.js +31 -0
  98. package/dist/delivery/index.js.map +1 -0
  99. package/dist/delivery/internalroute.d.ts +50 -0
  100. package/dist/delivery/internalroute.d.ts.map +1 -0
  101. package/dist/delivery/internalroute.js +23 -0
  102. package/dist/delivery/internalroute.js.map +1 -0
  103. package/dist/delivery/pipeline.d.ts +153 -0
  104. package/dist/delivery/pipeline.d.ts.map +1 -0
  105. package/dist/delivery/pipeline.js +356 -0
  106. package/dist/delivery/pipeline.js.map +1 -0
  107. package/dist/delivery/policy_state.d.ts +105 -0
  108. package/dist/delivery/policy_state.d.ts.map +1 -0
  109. package/dist/delivery/policy_state.js +293 -0
  110. package/dist/delivery/policy_state.js.map +1 -0
  111. package/dist/delivery/queue.d.ts +47 -0
  112. package/dist/delivery/queue.d.ts.map +1 -0
  113. package/dist/delivery/queue.js +33 -0
  114. package/dist/delivery/queue.js.map +1 -0
  115. package/dist/delivery/receipt.d.ts +137 -0
  116. package/dist/delivery/receipt.d.ts.map +1 -0
  117. package/dist/delivery/receipt.js +181 -0
  118. package/dist/delivery/receipt.js.map +1 -0
  119. package/dist/delivery/receipt_store.d.ts +81 -0
  120. package/dist/delivery/receipt_store.d.ts.map +1 -0
  121. package/dist/delivery/receipt_store.js +74 -0
  122. package/dist/delivery/receipt_store.js.map +1 -0
  123. package/dist/delivery/retry.d.ts +78 -0
  124. package/dist/delivery/retry.d.ts.map +1 -0
  125. package/dist/delivery/retry.js +132 -0
  126. package/dist/delivery/retry.js.map +1 -0
  127. package/dist/delivery/scheduler.d.ts +156 -0
  128. package/dist/delivery/scheduler.d.ts.map +1 -0
  129. package/dist/delivery/scheduler.js +349 -0
  130. package/dist/delivery/scheduler.js.map +1 -0
  131. package/dist/delivery/stage_partition.d.ts +87 -0
  132. package/dist/delivery/stage_partition.d.ts.map +1 -0
  133. package/dist/delivery/stage_partition.js +122 -0
  134. package/dist/delivery/stage_partition.js.map +1 -0
  135. package/dist/delivery/staged_runner.d.ts +100 -0
  136. package/dist/delivery/staged_runner.d.ts.map +1 -0
  137. package/dist/delivery/staged_runner.js +277 -0
  138. package/dist/delivery/staged_runner.js.map +1 -0
  139. package/dist/delivery/submission.d.ts +72 -0
  140. package/dist/delivery/submission.d.ts.map +1 -0
  141. package/dist/delivery/submission.js +58 -0
  142. package/dist/delivery/submission.js.map +1 -0
  143. package/dist/delivery/sync.d.ts +68 -0
  144. package/dist/delivery/sync.d.ts.map +1 -0
  145. package/dist/delivery/sync.js +99 -0
  146. package/dist/delivery/sync.js.map +1 -0
  147. package/dist/delivery/user_policy.d.ts +74 -0
  148. package/dist/delivery/user_policy.d.ts.map +1 -0
  149. package/dist/delivery/user_policy.js +140 -0
  150. package/dist/delivery/user_policy.js.map +1 -0
  151. package/dist/discovery/cache.d.ts +37 -0
  152. package/dist/discovery/cache.d.ts.map +1 -0
  153. package/dist/discovery/cache.js +45 -0
  154. package/dist/discovery/cache.js.map +1 -0
  155. package/dist/discovery/configuration.d.ts +97 -0
  156. package/dist/discovery/configuration.d.ts.map +1 -0
  157. package/dist/discovery/configuration.js +146 -0
  158. package/dist/discovery/configuration.js.map +1 -0
  159. package/dist/discovery/dns.d.ts +56 -0
  160. package/dist/discovery/dns.d.ts.map +1 -0
  161. package/dist/discovery/dns.js +120 -0
  162. package/dist/discovery/dns.js.map +1 -0
  163. package/dist/discovery/domain_keys.d.ts +62 -0
  164. package/dist/discovery/domain_keys.d.ts.map +1 -0
  165. package/dist/discovery/domain_keys.js +89 -0
  166. package/dist/discovery/domain_keys.js.map +1 -0
  167. package/dist/discovery/index.d.ts +19 -0
  168. package/dist/discovery/index.d.ts.map +1 -0
  169. package/dist/discovery/index.js +19 -0
  170. package/dist/discovery/index.js.map +1 -0
  171. package/dist/discovery/lookup.d.ts +72 -0
  172. package/dist/discovery/lookup.d.ts.map +1 -0
  173. package/dist/discovery/lookup.js +121 -0
  174. package/dist/discovery/lookup.js.map +1 -0
  175. package/dist/discovery/onion.d.ts +34 -0
  176. package/dist/discovery/onion.d.ts.map +1 -0
  177. package/dist/discovery/onion.js +61 -0
  178. package/dist/discovery/onion.js.map +1 -0
  179. package/dist/discovery/partition.d.ts +96 -0
  180. package/dist/discovery/partition.d.ts.map +1 -0
  181. package/dist/discovery/partition.js +247 -0
  182. package/dist/discovery/partition.js.map +1 -0
  183. package/dist/discovery/resolver.d.ts +113 -0
  184. package/dist/discovery/resolver.d.ts.map +1 -0
  185. package/dist/discovery/resolver.js +176 -0
  186. package/dist/discovery/resolver.js.map +1 -0
  187. package/dist/discovery/txt.d.ts +39 -0
  188. package/dist/discovery/txt.d.ts.map +1 -0
  189. package/dist/discovery/txt.js +71 -0
  190. package/dist/discovery/txt.js.map +1 -0
  191. package/dist/enclosure/forwarding.d.ts +128 -0
  192. package/dist/enclosure/forwarding.d.ts.map +1 -0
  193. package/dist/enclosure/forwarding.js +119 -0
  194. package/dist/enclosure/forwarding.js.map +1 -0
  195. package/dist/enclosure/index.d.ts +11 -0
  196. package/dist/enclosure/index.d.ts.map +1 -0
  197. package/dist/enclosure/index.js +11 -0
  198. package/dist/enclosure/index.js.map +1 -0
  199. package/dist/envelope/buckets.d.ts +38 -0
  200. package/dist/envelope/buckets.d.ts.map +1 -0
  201. package/dist/envelope/buckets.js +73 -0
  202. package/dist/envelope/buckets.js.map +1 -0
  203. package/dist/envelope/canonical.d.ts +28 -0
  204. package/dist/envelope/canonical.d.ts.map +1 -0
  205. package/dist/envelope/canonical.js +54 -0
  206. package/dist/envelope/canonical.js.map +1 -0
  207. package/dist/envelope/compose.d.ts +171 -0
  208. package/dist/envelope/compose.d.ts.map +1 -0
  209. package/dist/envelope/compose.js +237 -0
  210. package/dist/envelope/compose.js.map +1 -0
  211. package/dist/envelope/encode.d.ts +41 -0
  212. package/dist/envelope/encode.d.ts.map +1 -0
  213. package/dist/envelope/encode.js +69 -0
  214. package/dist/envelope/encode.js.map +1 -0
  215. package/dist/envelope/index.d.ts +20 -0
  216. package/dist/envelope/index.d.ts.map +1 -0
  217. package/dist/envelope/index.js +20 -0
  218. package/dist/envelope/index.js.map +1 -0
  219. package/dist/envelope/open_any.d.ts +48 -0
  220. package/dist/envelope/open_any.d.ts.map +1 -0
  221. package/dist/envelope/open_any.js +81 -0
  222. package/dist/envelope/open_any.js.map +1 -0
  223. package/dist/envelope/open_verified.d.ts +59 -0
  224. package/dist/envelope/open_verified.d.ts.map +1 -0
  225. package/dist/envelope/open_verified.js +67 -0
  226. package/dist/envelope/open_verified.js.map +1 -0
  227. package/dist/envelope/padding.d.ts +55 -0
  228. package/dist/envelope/padding.d.ts.map +1 -0
  229. package/dist/envelope/padding.js +162 -0
  230. package/dist/envelope/padding.js.map +1 -0
  231. package/dist/envelope/rejection.d.ts +22 -0
  232. package/dist/envelope/rejection.d.ts.map +1 -0
  233. package/dist/envelope/rejection.js +30 -0
  234. package/dist/envelope/rejection.js.map +1 -0
  235. package/dist/envelope/sendtime.d.ts +49 -0
  236. package/dist/envelope/sendtime.d.ts.map +1 -0
  237. package/dist/envelope/sendtime.js +87 -0
  238. package/dist/envelope/sendtime.js.map +1 -0
  239. package/dist/envelope/verify.d.ts +29 -0
  240. package/dist/envelope/verify.d.ts.map +1 -0
  241. package/dist/envelope/verify.js +90 -0
  242. package/dist/envelope/verify.js.map +1 -0
  243. package/dist/extensions/index.d.ts +7 -0
  244. package/dist/extensions/index.d.ts.map +1 -0
  245. package/dist/extensions/index.js +7 -0
  246. package/dist/extensions/index.js.map +1 -0
  247. package/dist/extensions/limits.d.ts +101 -0
  248. package/dist/extensions/limits.d.ts.map +1 -0
  249. package/dist/extensions/limits.js +175 -0
  250. package/dist/extensions/limits.js.map +1 -0
  251. package/dist/handshake/abort.d.ts +49 -0
  252. package/dist/handshake/abort.d.ts.map +1 -0
  253. package/dist/handshake/abort.js +82 -0
  254. package/dist/handshake/abort.js.map +1 -0
  255. package/dist/handshake/capabilities.d.ts +46 -0
  256. package/dist/handshake/capabilities.d.ts.map +1 -0
  257. package/dist/handshake/capabilities.js +114 -0
  258. package/dist/handshake/capabilities.js.map +1 -0
  259. package/dist/handshake/client_state.d.ts +186 -0
  260. package/dist/handshake/client_state.d.ts.map +1 -0
  261. package/dist/handshake/client_state.js +520 -0
  262. package/dist/handshake/client_state.js.map +1 -0
  263. package/dist/handshake/confirm.d.ts +21 -0
  264. package/dist/handshake/confirm.d.ts.map +1 -0
  265. package/dist/handshake/confirm.js +27 -0
  266. package/dist/handshake/confirm.js.map +1 -0
  267. package/dist/handshake/driver.d.ts +126 -0
  268. package/dist/handshake/driver.d.ts.map +1 -0
  269. package/dist/handshake/driver.js +251 -0
  270. package/dist/handshake/driver.js.map +1 -0
  271. package/dist/handshake/federation.d.ts +365 -0
  272. package/dist/handshake/federation.d.ts.map +1 -0
  273. package/dist/handshake/federation.js +664 -0
  274. package/dist/handshake/federation.js.map +1 -0
  275. package/dist/handshake/first_contact.d.ts +57 -0
  276. package/dist/handshake/first_contact.d.ts.map +1 -0
  277. package/dist/handshake/first_contact.js +124 -0
  278. package/dist/handshake/first_contact.js.map +1 -0
  279. package/dist/handshake/identity.d.ts +101 -0
  280. package/dist/handshake/identity.d.ts.map +1 -0
  281. package/dist/handshake/identity.js +117 -0
  282. package/dist/handshake/identity.js.map +1 -0
  283. package/dist/handshake/index.d.ts +21 -0
  284. package/dist/handshake/index.d.ts.map +1 -0
  285. package/dist/handshake/index.js +21 -0
  286. package/dist/handshake/index.js.map +1 -0
  287. package/dist/handshake/messages.d.ts +176 -0
  288. package/dist/handshake/messages.d.ts.map +1 -0
  289. package/dist/handshake/messages.js +125 -0
  290. package/dist/handshake/messages.js.map +1 -0
  291. package/dist/handshake/pow.d.ts +53 -0
  292. package/dist/handshake/pow.d.ts.map +1 -0
  293. package/dist/handshake/pow.js +142 -0
  294. package/dist/handshake/pow.js.map +1 -0
  295. package/dist/handshake/resume_driver.d.ts +56 -0
  296. package/dist/handshake/resume_driver.d.ts.map +1 -0
  297. package/dist/handshake/resume_driver.js +75 -0
  298. package/dist/handshake/resume_driver.js.map +1 -0
  299. package/dist/handshake/server.d.ts +112 -0
  300. package/dist/handshake/server.d.ts.map +1 -0
  301. package/dist/handshake/server.js +247 -0
  302. package/dist/handshake/server.js.map +1 -0
  303. package/dist/handshake/server_state.d.ts +102 -0
  304. package/dist/handshake/server_state.d.ts.map +1 -0
  305. package/dist/handshake/server_state.js +278 -0
  306. package/dist/handshake/server_state.js.map +1 -0
  307. package/dist/index.d.ts +33 -0
  308. package/dist/index.d.ts.map +1 -0
  309. package/dist/index.js +33 -0
  310. package/dist/index.js.map +1 -0
  311. package/dist/keys/compromise.d.ts +118 -0
  312. package/dist/keys/compromise.d.ts.map +1 -0
  313. package/dist/keys/compromise.js +218 -0
  314. package/dist/keys/compromise.js.map +1 -0
  315. package/dist/keys/device_certificate.d.ts +166 -0
  316. package/dist/keys/device_certificate.d.ts.map +1 -0
  317. package/dist/keys/device_certificate.js +328 -0
  318. package/dist/keys/device_certificate.js.map +1 -0
  319. package/dist/keys/device_records.d.ts +175 -0
  320. package/dist/keys/device_records.d.ts.map +1 -0
  321. package/dist/keys/device_records.js +418 -0
  322. package/dist/keys/device_records.js.map +1 -0
  323. package/dist/keys/directory_cache.d.ts +64 -0
  324. package/dist/keys/directory_cache.d.ts.map +1 -0
  325. package/dist/keys/directory_cache.js +98 -0
  326. package/dist/keys/directory_cache.js.map +1 -0
  327. package/dist/keys/directory_state.d.ts +79 -0
  328. package/dist/keys/directory_state.d.ts.map +1 -0
  329. package/dist/keys/directory_state.js +155 -0
  330. package/dist/keys/directory_state.js.map +1 -0
  331. package/dist/keys/index.d.ts +18 -0
  332. package/dist/keys/index.d.ts.map +1 -0
  333. package/dist/keys/index.js +18 -0
  334. package/dist/keys/index.js.map +1 -0
  335. package/dist/keys/key_revocation.d.ts +61 -0
  336. package/dist/keys/key_revocation.d.ts.map +1 -0
  337. package/dist/keys/key_revocation.js +88 -0
  338. package/dist/keys/key_revocation.js.map +1 -0
  339. package/dist/keys/request.d.ts +124 -0
  340. package/dist/keys/request.d.ts.map +1 -0
  341. package/dist/keys/request.js +130 -0
  342. package/dist/keys/request.js.map +1 -0
  343. package/dist/keys/sign.d.ts +49 -0
  344. package/dist/keys/sign.d.ts.map +1 -0
  345. package/dist/keys/sign.js +80 -0
  346. package/dist/keys/sign.js.map +1 -0
  347. package/dist/keys/signed.d.ts +80 -0
  348. package/dist/keys/signed.d.ts.map +1 -0
  349. package/dist/keys/signed.js +138 -0
  350. package/dist/keys/signed.js.map +1 -0
  351. package/dist/keys/store.d.ts +138 -0
  352. package/dist/keys/store.d.ts.map +1 -0
  353. package/dist/keys/store.js +107 -0
  354. package/dist/keys/store.js.map +1 -0
  355. package/dist/largeattachment/crypto.d.ts +47 -0
  356. package/dist/largeattachment/crypto.d.ts.map +1 -0
  357. package/dist/largeattachment/crypto.js +235 -0
  358. package/dist/largeattachment/crypto.js.map +1 -0
  359. package/dist/largeattachment/enclosure.d.ts +48 -0
  360. package/dist/largeattachment/enclosure.d.ts.map +1 -0
  361. package/dist/largeattachment/enclosure.js +102 -0
  362. package/dist/largeattachment/enclosure.js.map +1 -0
  363. package/dist/largeattachment/index.d.ts +15 -0
  364. package/dist/largeattachment/index.d.ts.map +1 -0
  365. package/dist/largeattachment/index.js +15 -0
  366. package/dist/largeattachment/index.js.map +1 -0
  367. package/dist/largeattachment/store.d.ts +36 -0
  368. package/dist/largeattachment/store.d.ts.map +1 -0
  369. package/dist/largeattachment/store.js +37 -0
  370. package/dist/largeattachment/store.js.map +1 -0
  371. package/dist/largeattachment/types.d.ts +56 -0
  372. package/dist/largeattachment/types.d.ts.map +1 -0
  373. package/dist/largeattachment/types.js +31 -0
  374. package/dist/largeattachment/types.js.map +1 -0
  375. package/dist/largeattachment/upload.d.ts +62 -0
  376. package/dist/largeattachment/upload.d.ts.map +1 -0
  377. package/dist/largeattachment/upload.js +166 -0
  378. package/dist/largeattachment/upload.js.map +1 -0
  379. package/dist/migration/index.d.ts +17 -0
  380. package/dist/migration/index.d.ts.map +1 -0
  381. package/dist/migration/index.js +17 -0
  382. package/dist/migration/index.js.map +1 -0
  383. package/dist/migration/lockout.d.ts +48 -0
  384. package/dist/migration/lockout.d.ts.map +1 -0
  385. package/dist/migration/lockout.js +57 -0
  386. package/dist/migration/lockout.js.map +1 -0
  387. package/dist/migration/migration.d.ts +48 -0
  388. package/dist/migration/migration.d.ts.map +1 -0
  389. package/dist/migration/migration.js +58 -0
  390. package/dist/migration/migration.js.map +1 -0
  391. package/dist/migration/notice.d.ts +33 -0
  392. package/dist/migration/notice.d.ts.map +1 -0
  393. package/dist/migration/notice.js +85 -0
  394. package/dist/migration/notice.js.map +1 -0
  395. package/dist/migration/orchestrate.d.ts +109 -0
  396. package/dist/migration/orchestrate.d.ts.map +1 -0
  397. package/dist/migration/orchestrate.js +212 -0
  398. package/dist/migration/orchestrate.js.map +1 -0
  399. package/dist/migration/publication_store.d.ts +34 -0
  400. package/dist/migration/publication_store.d.ts.map +1 -0
  401. package/dist/migration/publication_store.js +44 -0
  402. package/dist/migration/publication_store.js.map +1 -0
  403. package/dist/migration/sign.d.ts +65 -0
  404. package/dist/migration/sign.d.ts.map +1 -0
  405. package/dist/migration/sign.js +331 -0
  406. package/dist/migration/sign.js.map +1 -0
  407. package/dist/migration/types.d.ts +92 -0
  408. package/dist/migration/types.d.ts.map +1 -0
  409. package/dist/migration/types.js +26 -0
  410. package/dist/migration/types.js.map +1 -0
  411. package/dist/reasoncodes.d.ts +42 -0
  412. package/dist/reasoncodes.d.ts.map +1 -0
  413. package/dist/reasoncodes.js +80 -0
  414. package/dist/reasoncodes.js.map +1 -0
  415. package/dist/recovery/bundle.d.ts +34 -0
  416. package/dist/recovery/bundle.d.ts.map +1 -0
  417. package/dist/recovery/bundle.js +144 -0
  418. package/dist/recovery/bundle.js.map +1 -0
  419. package/dist/recovery/bundle_crypto.d.ts +60 -0
  420. package/dist/recovery/bundle_crypto.d.ts.map +1 -0
  421. package/dist/recovery/bundle_crypto.js +179 -0
  422. package/dist/recovery/bundle_crypto.js.map +1 -0
  423. package/dist/recovery/bundle_store.d.ts +57 -0
  424. package/dist/recovery/bundle_store.d.ts.map +1 -0
  425. package/dist/recovery/bundle_store.js +104 -0
  426. package/dist/recovery/bundle_store.js.map +1 -0
  427. package/dist/recovery/index.d.ts +19 -0
  428. package/dist/recovery/index.d.ts.map +1 -0
  429. package/dist/recovery/index.js +19 -0
  430. package/dist/recovery/index.js.map +1 -0
  431. package/dist/recovery/manifest_crosscheck.d.ts +59 -0
  432. package/dist/recovery/manifest_crosscheck.d.ts.map +1 -0
  433. package/dist/recovery/manifest_crosscheck.js +59 -0
  434. package/dist/recovery/manifest_crosscheck.js.map +1 -0
  435. package/dist/recovery/shamir.d.ts +51 -0
  436. package/dist/recovery/shamir.d.ts.map +1 -0
  437. package/dist/recovery/shamir.js +181 -0
  438. package/dist/recovery/shamir.js.map +1 -0
  439. package/dist/recovery/sign.d.ts +61 -0
  440. package/dist/recovery/sign.d.ts.map +1 -0
  441. package/dist/recovery/sign.js +359 -0
  442. package/dist/recovery/sign.js.map +1 -0
  443. package/dist/recovery/types.d.ts +180 -0
  444. package/dist/recovery/types.d.ts.map +1 -0
  445. package/dist/recovery/types.js +31 -0
  446. package/dist/recovery/types.js.map +1 -0
  447. package/dist/reputation/abuse_report.d.ts +62 -0
  448. package/dist/reputation/abuse_report.d.ts.map +1 -0
  449. package/dist/reputation/abuse_report.js +111 -0
  450. package/dist/reputation/abuse_report.js.map +1 -0
  451. package/dist/reputation/bucketize.d.ts +31 -0
  452. package/dist/reputation/bucketize.d.ts.map +1 -0
  453. package/dist/reputation/bucketize.js +77 -0
  454. package/dist/reputation/bucketize.js.map +1 -0
  455. package/dist/reputation/gossip.d.ts +24 -0
  456. package/dist/reputation/gossip.d.ts.map +1 -0
  457. package/dist/reputation/gossip.js +64 -0
  458. package/dist/reputation/gossip.js.map +1 -0
  459. package/dist/reputation/gossip_fetch.d.ts +64 -0
  460. package/dist/reputation/gossip_fetch.d.ts.map +1 -0
  461. package/dist/reputation/gossip_fetch.js +114 -0
  462. package/dist/reputation/gossip_fetch.js.map +1 -0
  463. package/dist/reputation/index.d.ts +20 -0
  464. package/dist/reputation/index.d.ts.map +1 -0
  465. package/dist/reputation/index.js +20 -0
  466. package/dist/reputation/index.js.map +1 -0
  467. package/dist/reputation/observation_store.d.ts +67 -0
  468. package/dist/reputation/observation_store.d.ts.map +1 -0
  469. package/dist/reputation/observation_store.js +171 -0
  470. package/dist/reputation/observation_store.js.map +1 -0
  471. package/dist/reputation/pow.d.ts +91 -0
  472. package/dist/reputation/pow.d.ts.map +1 -0
  473. package/dist/reputation/pow.js +209 -0
  474. package/dist/reputation/pow.js.map +1 -0
  475. package/dist/reputation/sign.d.ts +40 -0
  476. package/dist/reputation/sign.d.ts.map +1 -0
  477. package/dist/reputation/sign.js +202 -0
  478. package/dist/reputation/sign.js.map +1 -0
  479. package/dist/reputation/types.d.ts +133 -0
  480. package/dist/reputation/types.d.ts.map +1 -0
  481. package/dist/reputation/types.js +33 -0
  482. package/dist/reputation/types.js.map +1 -0
  483. package/dist/reputation/whois.d.ts +25 -0
  484. package/dist/reputation/whois.d.ts.map +1 -0
  485. package/dist/reputation/whois.js +20 -0
  486. package/dist/reputation/whois.js.map +1 -0
  487. package/dist/seal/index.d.ts +8 -0
  488. package/dist/seal/index.d.ts.map +1 -0
  489. package/dist/seal/index.js +8 -0
  490. package/dist/seal/index.js.map +1 -0
  491. package/dist/seal/wrap.d.ts +74 -0
  492. package/dist/seal/wrap.d.ts.map +1 -0
  493. package/dist/seal/wrap.js +213 -0
  494. package/dist/seal/wrap.js.map +1 -0
  495. package/dist/session/dispatcher.d.ts +65 -0
  496. package/dist/session/dispatcher.d.ts.map +1 -0
  497. package/dist/session/dispatcher.js +96 -0
  498. package/dist/session/dispatcher.js.map +1 -0
  499. package/dist/session/index.d.ts +15 -0
  500. package/dist/session/index.d.ts.map +1 -0
  501. package/dist/session/index.js +15 -0
  502. package/dist/session/index.js.map +1 -0
  503. package/dist/session/rekey.d.ts +108 -0
  504. package/dist/session/rekey.d.ts.map +1 -0
  505. package/dist/session/rekey.js +207 -0
  506. package/dist/session/rekey.js.map +1 -0
  507. package/dist/session/rekey_seal.d.ts +66 -0
  508. package/dist/session/rekey_seal.d.ts.map +1 -0
  509. package/dist/session/rekey_seal.js +153 -0
  510. package/dist/session/rekey_seal.js.map +1 -0
  511. package/dist/session/resume.d.ts +125 -0
  512. package/dist/session/resume.d.ts.map +1 -0
  513. package/dist/session/resume.js +263 -0
  514. package/dist/session/resume.js.map +1 -0
  515. package/dist/session/session.d.ts +136 -0
  516. package/dist/session/session.d.ts.map +1 -0
  517. package/dist/session/session.js +188 -0
  518. package/dist/session/session.js.map +1 -0
  519. package/dist/transparency/index.d.ts +13 -0
  520. package/dist/transparency/index.d.ts.map +1 -0
  521. package/dist/transparency/index.js +13 -0
  522. package/dist/transparency/index.js.map +1 -0
  523. package/dist/transparency/log.d.ts +61 -0
  524. package/dist/transparency/log.d.ts.map +1 -0
  525. package/dist/transparency/log.js +133 -0
  526. package/dist/transparency/log.js.map +1 -0
  527. package/dist/transparency/merkle.d.ts +59 -0
  528. package/dist/transparency/merkle.d.ts.map +1 -0
  529. package/dist/transparency/merkle.js +314 -0
  530. package/dist/transparency/merkle.js.map +1 -0
  531. package/dist/transparency/sign.d.ts +48 -0
  532. package/dist/transparency/sign.d.ts.map +1 -0
  533. package/dist/transparency/sign.js +140 -0
  534. package/dist/transparency/sign.js.map +1 -0
  535. package/dist/transparency/types.d.ts +97 -0
  536. package/dist/transparency/types.d.ts.map +1 -0
  537. package/dist/transparency/types.js +25 -0
  538. package/dist/transparency/types.js.map +1 -0
  539. package/dist/transport/h2.d.ts +163 -0
  540. package/dist/transport/h2.d.ts.map +1 -0
  541. package/dist/transport/h2.js +397 -0
  542. package/dist/transport/h2.js.map +1 -0
  543. package/dist/transport/index.d.ts +15 -0
  544. package/dist/transport/index.d.ts.map +1 -0
  545. package/dist/transport/index.js +15 -0
  546. package/dist/transport/index.js.map +1 -0
  547. package/dist/transport/memory.d.ts +21 -0
  548. package/dist/transport/memory.d.ts.map +1 -0
  549. package/dist/transport/memory.js +112 -0
  550. package/dist/transport/memory.js.map +1 -0
  551. package/dist/transport/transport.d.ts +54 -0
  552. package/dist/transport/transport.d.ts.map +1 -0
  553. package/dist/transport/transport.js +20 -0
  554. package/dist/transport/transport.js.map +1 -0
  555. package/dist/transport/ws.d.ts +40 -0
  556. package/dist/transport/ws.d.ts.map +1 -0
  557. package/dist/transport/ws.js +204 -0
  558. package/dist/transport/ws.js.map +1 -0
  559. package/package.json +147 -0
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Persistence interfaces and reference in-memory implementation for
3
+ * SEMP key records per KEY.md §4 / §8 / §9.
4
+ *
5
+ * The `KeyStore` interface is the layer-1 contract: it holds public
6
+ * key records (domain + user) and revocation state. `PrivateKeyStore`
7
+ * adds access to the user's own private key material in
8
+ * encrypted-at-rest form per KEY.md §9.1.
9
+ *
10
+ * Server implementations and client implementations have different
11
+ * storage needs but expose the same interfaces so handshake,
12
+ * envelope, and delivery code can be written once.
13
+ *
14
+ * The reference {@link InMemoryKeyStore} is intended for tests,
15
+ * single-process demos, and reference-implementation builds. It is
16
+ * NOT a production storage layer:
17
+ *
18
+ * - Private keys are held in memory in plaintext (no encryption at
19
+ * rest, no KDF, no hardware backing). This violates KEY.md §9.1.
20
+ * - There is no persistence: process restart loses everything.
21
+ *
22
+ * @module
23
+ */
24
+ /**
25
+ * Reference in-memory {@link KeyStore} + {@link PrivateKeyStore}.
26
+ * Tests, demos, and the reference build only.
27
+ */
28
+ export class InMemoryKeyStore {
29
+ domainKeys = new Map();
30
+ userKeys = new Map();
31
+ privateKeys = new Map();
32
+ deviceCerts = new Map();
33
+ /** Persist a domain record under `domain`. */
34
+ putDomainRecord(domain, rec) {
35
+ this.domainKeys.set(domain, rec);
36
+ }
37
+ lookupDomainKey(domain) {
38
+ return this.domainKeys.get(domain) ?? null;
39
+ }
40
+ lookupUserKeys(address, keyTypes) {
41
+ const all = this.userKeys.get(address) ?? [];
42
+ if (keyTypes === undefined || keyTypes.length === 0) {
43
+ return all.slice();
44
+ }
45
+ const want = new Set(keyTypes);
46
+ return all.filter((r) => want.has(r.key_type));
47
+ }
48
+ putRecord(rec) {
49
+ if (rec.key_type === "domain") {
50
+ // Domain records are addressed by domain; callers should use
51
+ // putDomainRecord directly. No-op here to match the semp-go
52
+ // reference shape.
53
+ return;
54
+ }
55
+ if (rec.address === undefined || rec.address === "") {
56
+ throw new Error("keys: putRecord on user key requires address");
57
+ }
58
+ const list = this.userKeys.get(rec.address);
59
+ if (list === undefined) {
60
+ this.userKeys.set(rec.address, [rec]);
61
+ }
62
+ else {
63
+ list.push(rec);
64
+ }
65
+ }
66
+ putRevocation(keyId, rev) {
67
+ for (const list of this.userKeys.values()) {
68
+ for (const r of list) {
69
+ if (r.key_id === keyId) {
70
+ r.revocation = rev;
71
+ }
72
+ }
73
+ }
74
+ for (const r of this.domainKeys.values()) {
75
+ if (r.key_id === keyId) {
76
+ r.revocation = rev;
77
+ }
78
+ }
79
+ }
80
+ lookupDeviceCertificate(deviceKeyId) {
81
+ return this.deviceCerts.get(deviceKeyId) ?? null;
82
+ }
83
+ putDeviceCertificate(cert) {
84
+ // Stored under the delegated device's public-key fingerprint —
85
+ // matches the LookupDeviceCertificate(fp) parameter shape used
86
+ // by the scope-enforcement path. Callers compute the fingerprint
87
+ // from cert.device_public_key.
88
+ if (cert.device_id === "") {
89
+ throw new Error("keys: putDeviceCertificate certificate missing device_id");
90
+ }
91
+ this.deviceCerts.set(cert.device_id, cert);
92
+ }
93
+ loadPrivateKey(keyId) {
94
+ const k = this.privateKeys.get(keyId);
95
+ if (k === undefined) {
96
+ throw new Error(`keys: private key ${JSON.stringify(keyId)} not found`);
97
+ }
98
+ return k.slice();
99
+ }
100
+ storePrivateKey(keyId, privateKey) {
101
+ if (keyId === "") {
102
+ throw new Error("keys: storePrivateKey empty keyId");
103
+ }
104
+ this.privateKeys.set(keyId, privateKey.slice());
105
+ }
106
+ }
107
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/keys/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAsGH;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IACnB,UAAU,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC/C,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IAC/C,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC5C,WAAW,GAAG,IAAI,GAAG,EAA6B,CAAC;IAE3D,8CAA8C;IAC9C,eAAe,CAAC,MAAc,EAAE,GAAmB;QACjD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,eAAe,CAAC,MAAc;QAC5B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IAC7C,CAAC;IAED,cAAc,CAAC,OAAe,EAAE,QAAoB;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC7C,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO,GAAG,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,SAAS,CAAC,GAAmB;QAC3B,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC9B,6DAA6D;YAC7D,4DAA4D;YAC5D,mBAAmB;YACnB,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,aAAa,CAAC,KAAa,EAAE,GAAe;QAC1C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;oBACvB,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBACvB,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,uBAAuB,CAAC,WAAmB;QACzC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACnD,CAAC;IAED,oBAAoB,CAAC,IAAuB;QAC1C,+DAA+D;QAC/D,+DAA+D;QAC/D,iEAAiE;QACjE,+BAA+B;QAC/B,IAAI,IAAI,CAAC,SAAS,KAAK,EAAE,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,cAAc,CAAC,KAAa;QAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;IAED,eAAe,CAAC,KAAa,EAAE,UAAsB;QACnD,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IAClD,CAAC;CACF"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Per-attachment key derivation, AAD construction, ciphertext hash,
3
+ * URL/item validation per ATTACHMENTS.md §2.3, §3.1, §3.2, §4.1.
4
+ *
5
+ * @module
6
+ */
7
+ import { type Item } from "./types.js";
8
+ /**
9
+ * Derive K_attachment from K_enclosure per §3.1: `HKDF-Expand(PRK =
10
+ * K_enclosure, info = "semp-attachment:" || attachment_id, L)`.
11
+ *
12
+ * `kEnclosure` is used directly as the PRK (no Extract step). This
13
+ * runs the RFC 5869 §2.3 expansion loop manually because @noble's
14
+ * strict `expand` rejects PRK shorter than HashLen, while §3.1
15
+ * passes a 32-byte K_enclosure as the PRK to a SHA-512-based HKDF.
16
+ *
17
+ * `outputLen` MUST equal the AEAD's key length for the negotiated
18
+ * suite (32 bytes for both ChaCha20-Poly1305 and XChaCha20-Poly1305).
19
+ */
20
+ export declare function deriveAttachmentKey(kEnclosure: Uint8Array, attachmentId: string, outputLen: number): Uint8Array;
21
+ /**
22
+ * AEAD additional-data input bound into each attachment's
23
+ * ciphertext per §3.2: canonical UTF-8 JSON of the item with
24
+ * `ciphertext_hash`, `aead_nonce`, and `extensions` set to empty
25
+ * values (`""`, `""`, `{}` — but `extensions` is dropped by the
26
+ * canonicalizer when it's the optional `extensions` field).
27
+ *
28
+ * Binding the metadata into AAD prevents an attacker from swapping
29
+ * `filename` or `mime_type` while leaving the ciphertext intact.
30
+ */
31
+ export declare function additionalData(item: Item): Uint8Array;
32
+ /** §2.3 ciphertext_hash for `ciphertext`, in `sha256:hex` form. */
33
+ export declare function ciphertextHash(ciphertext: Uint8Array): string;
34
+ /**
35
+ * Report whether `item.ciphertext_hash` matches the SHA-256 of
36
+ * `ciphertext` per §6 step 3c. Returns true on match.
37
+ */
38
+ export declare function verifyCiphertextHash(item: Item, ciphertext: Uint8Array): boolean;
39
+ /**
40
+ * Apply the §4.1 URL rules: scheme MUST be `https`; host MUST be a
41
+ * fully qualified domain name or an IPv6 literal in brackets; bare
42
+ * IPv4 literals MUST NOT be used. Throws on the first violation.
43
+ */
44
+ export declare function validateUrl(raw: string): void;
45
+ /** Structural validation per §2.3 + §4.1. Throws on first violation. */
46
+ export declare function validateItem(item: Item): void;
47
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/largeattachment/crypto.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,EACL,KAAK,IAAI,EAGV,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,UAAU,CAYZ;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,CASrD;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAG7D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,UAAU,GACrB,OAAO,CAqBT;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAqC7C;AAED,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CA8B7C"}
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Per-attachment key derivation, AAD construction, ciphertext hash,
3
+ * URL/item validation per ATTACHMENTS.md §2.3, §3.1, §3.2, §4.1.
4
+ *
5
+ * @module
6
+ */
7
+ import { hmac } from "@noble/hashes/hmac.js";
8
+ import { sha256, sha512 } from "@noble/hashes/sha2.js";
9
+ import { marshal as canonicalMarshal } from "../canonical/index.js";
10
+ import { HKDFInfoPrefix, HashAlgorithmSHA256, } from "./types.js";
11
+ /**
12
+ * Derive K_attachment from K_enclosure per §3.1: `HKDF-Expand(PRK =
13
+ * K_enclosure, info = "semp-attachment:" || attachment_id, L)`.
14
+ *
15
+ * `kEnclosure` is used directly as the PRK (no Extract step). This
16
+ * runs the RFC 5869 §2.3 expansion loop manually because @noble's
17
+ * strict `expand` rejects PRK shorter than HashLen, while §3.1
18
+ * passes a 32-byte K_enclosure as the PRK to a SHA-512-based HKDF.
19
+ *
20
+ * `outputLen` MUST equal the AEAD's key length for the negotiated
21
+ * suite (32 bytes for both ChaCha20-Poly1305 and XChaCha20-Poly1305).
22
+ */
23
+ export function deriveAttachmentKey(kEnclosure, attachmentId, outputLen) {
24
+ if (kEnclosure.length === 0) {
25
+ throw new Error("largeattachment: empty K_enclosure");
26
+ }
27
+ if (attachmentId === "") {
28
+ throw new Error("largeattachment: empty attachment_id");
29
+ }
30
+ if (!Number.isInteger(outputLen) || outputLen <= 0) {
31
+ throw new Error(`largeattachment: invalid output length ${outputLen}`);
32
+ }
33
+ const info = new TextEncoder().encode(HKDFInfoPrefix + attachmentId);
34
+ return hkdfExpandSHA512(kEnclosure, info, outputLen);
35
+ }
36
+ /**
37
+ * AEAD additional-data input bound into each attachment's
38
+ * ciphertext per §3.2: canonical UTF-8 JSON of the item with
39
+ * `ciphertext_hash`, `aead_nonce`, and `extensions` set to empty
40
+ * values (`""`, `""`, `{}` — but `extensions` is dropped by the
41
+ * canonicalizer when it's the optional `extensions` field).
42
+ *
43
+ * Binding the metadata into AAD prevents an attacker from swapping
44
+ * `filename` or `mime_type` while leaving the ciphertext intact.
45
+ */
46
+ export function additionalData(item) {
47
+ const clone = { ...item };
48
+ clone.ciphertext_hash = "";
49
+ clone.aead_nonce = "";
50
+ // Per §3.2 the AAD form has extensions zeroed. Drop the optional
51
+ // field entirely so omission and an empty object produce identical
52
+ // canonical bytes.
53
+ delete clone.extensions;
54
+ return canonicalMarshal(clone);
55
+ }
56
+ /** §2.3 ciphertext_hash for `ciphertext`, in `sha256:hex` form. */
57
+ export function ciphertextHash(ciphertext) {
58
+ const sum = sha256(ciphertext);
59
+ return HashAlgorithmSHA256 + ":" + bytesToHex(sum);
60
+ }
61
+ /**
62
+ * Report whether `item.ciphertext_hash` matches the SHA-256 of
63
+ * `ciphertext` per §6 step 3c. Returns true on match.
64
+ */
65
+ export function verifyCiphertextHash(item, ciphertext) {
66
+ if (item.ciphertext_hash === "") {
67
+ return false;
68
+ }
69
+ const colon = item.ciphertext_hash.indexOf(":");
70
+ if (colon < 0) {
71
+ return false;
72
+ }
73
+ const algo = item.ciphertext_hash.slice(0, colon);
74
+ const hex = item.ciphertext_hash.slice(colon + 1);
75
+ if (algo !== HashAlgorithmSHA256) {
76
+ return false;
77
+ }
78
+ let want;
79
+ try {
80
+ want = hexToBytes(hex);
81
+ }
82
+ catch {
83
+ return false;
84
+ }
85
+ const got = sha256(ciphertext);
86
+ return bytesEqual(want, got);
87
+ }
88
+ /**
89
+ * Apply the §4.1 URL rules: scheme MUST be `https`; host MUST be a
90
+ * fully qualified domain name or an IPv6 literal in brackets; bare
91
+ * IPv4 literals MUST NOT be used. Throws on the first violation.
92
+ */
93
+ export function validateUrl(raw) {
94
+ if (raw === "") {
95
+ throw new Error("largeattachment: empty url");
96
+ }
97
+ let u;
98
+ try {
99
+ u = new URL(raw);
100
+ }
101
+ catch (err) {
102
+ throw new Error(`largeattachment: parse url: ${err instanceof Error ? err.message : String(err)}`);
103
+ }
104
+ if (u.protocol !== "https:") {
105
+ throw new Error(`largeattachment: url scheme ${JSON.stringify(u.protocol.replace(/:$/, ""))}, want https`);
106
+ }
107
+ const host = u.hostname;
108
+ if (host === "") {
109
+ throw new Error("largeattachment: url has no host");
110
+ }
111
+ // u.hostname strips brackets from IPv6 literals; the original raw
112
+ // URL may still reveal them. We accept IPv6 if it parses as an IP
113
+ // and contains ':'.
114
+ if (looksLikeIPv6(host)) {
115
+ return; // IPv6 literal — accepted
116
+ }
117
+ if (looksLikeIPv4(host)) {
118
+ throw new Error(`largeattachment: url host ${JSON.stringify(host)} is a bare IPv4 literal; FQDN required`);
119
+ }
120
+ if (!host.includes(".")) {
121
+ throw new Error(`largeattachment: url host ${JSON.stringify(host)} is not a fully qualified domain name`);
122
+ }
123
+ }
124
+ /** Structural validation per §2.3 + §4.1. Throws on first violation. */
125
+ export function validateItem(item) {
126
+ if (typeof item.id !== "string" || item.id === "") {
127
+ throw new Error("largeattachment: item missing id");
128
+ }
129
+ if (typeof item.filename !== "string" || item.filename === "") {
130
+ throw new Error("largeattachment: item missing filename");
131
+ }
132
+ if (item.filename.includes("/") || item.filename.includes("\\")) {
133
+ throw new Error(`largeattachment: filename ${JSON.stringify(item.filename)} contains path separator`);
134
+ }
135
+ if (typeof item.mime_type !== "string" || item.mime_type === "") {
136
+ throw new Error("largeattachment: item missing mime_type");
137
+ }
138
+ if (!Number.isInteger(item.plaintext_size) || item.plaintext_size < 0) {
139
+ throw new Error(`largeattachment: plaintext_size ${item.plaintext_size} MUST be >= 0`);
140
+ }
141
+ validateUrl(item.url);
142
+ if (typeof item.ciphertext_hash !== "string" || item.ciphertext_hash === "") {
143
+ throw new Error("largeattachment: item missing ciphertext_hash");
144
+ }
145
+ if (typeof item.aead_algorithm !== "string" || item.aead_algorithm === "") {
146
+ throw new Error("largeattachment: item missing aead_algorithm");
147
+ }
148
+ if (typeof item.aead_nonce !== "string" || item.aead_nonce === "") {
149
+ throw new Error("largeattachment: item missing aead_nonce");
150
+ }
151
+ }
152
+ // ---------------------------------------------------------------------------
153
+ // Internal helpers
154
+ function looksLikeIPv6(host) {
155
+ // u.hostname for `https://[::1]/` returns `::1` (no brackets).
156
+ return host.includes(":");
157
+ }
158
+ function looksLikeIPv4(host) {
159
+ // Strict dotted-quad: 4 numeric octets in [0, 255].
160
+ const parts = host.split(".");
161
+ if (parts.length !== 4) {
162
+ return false;
163
+ }
164
+ for (const p of parts) {
165
+ if (p === "" || /[^\d]/.test(p)) {
166
+ return false;
167
+ }
168
+ const n = Number.parseInt(p, 10);
169
+ if (!Number.isFinite(n) || n < 0 || n > 255) {
170
+ return false;
171
+ }
172
+ }
173
+ return true;
174
+ }
175
+ /**
176
+ * RFC 5869 HKDF-Expand with HMAC-SHA-512. Permits PRK shorter than
177
+ * HashLen (matches §3.1's "PRK = K_enclosure" semantics).
178
+ */
179
+ function hkdfExpandSHA512(prk, info, length) {
180
+ const hashLen = 64;
181
+ const N = Math.ceil(length / hashLen);
182
+ if (N > 255) {
183
+ throw new Error("largeattachment: HKDF-Expand requested length too large");
184
+ }
185
+ let prev = new Uint8Array(0);
186
+ const out = new Uint8Array(length);
187
+ let written = 0;
188
+ for (let i = 1; i <= N; i++) {
189
+ const buf = new Uint8Array(prev.length + info.length + 1);
190
+ buf.set(prev, 0);
191
+ buf.set(info, prev.length);
192
+ buf[prev.length + info.length] = i;
193
+ const t = hmac(sha512, prk, buf);
194
+ const take = Math.min(hashLen, length - written);
195
+ out.set(t.slice(0, take), written);
196
+ written += take;
197
+ prev = t;
198
+ }
199
+ return out;
200
+ }
201
+ function bytesEqual(a, b) {
202
+ if (a.length !== b.length) {
203
+ return false;
204
+ }
205
+ let diff = 0;
206
+ for (let i = 0; i < a.length; i++) {
207
+ diff |= (a[i] ?? 0) ^ (b[i] ?? 0);
208
+ }
209
+ return diff === 0;
210
+ }
211
+ function bytesToHex(b) {
212
+ if (typeof Buffer !== "undefined") {
213
+ return Buffer.from(b).toString("hex");
214
+ }
215
+ let out = "";
216
+ for (let i = 0; i < b.length; i++) {
217
+ out += (b[i] ?? 0).toString(16).padStart(2, "0");
218
+ }
219
+ return out;
220
+ }
221
+ function hexToBytes(hex) {
222
+ if (hex.length % 2 !== 0) {
223
+ throw new Error("hex: odd length");
224
+ }
225
+ const out = new Uint8Array(hex.length / 2);
226
+ for (let i = 0; i < out.length; i++) {
227
+ const byte = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
228
+ if (Number.isNaN(byte)) {
229
+ throw new Error("hex: invalid character");
230
+ }
231
+ out[i] = byte;
232
+ }
233
+ return out;
234
+ }
235
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/largeattachment/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Helpers for placing / reading large-attachment items inside an
3
+ * enclosure's `extensions` map per ATTACHMENTS.md §2.1.
4
+ *
5
+ * The wire shape under the enclosure is:
6
+ *
7
+ * ```json
8
+ * {
9
+ * "extensions": {
10
+ * "semp.dev/large-attachment": { "data": { "items": [ ... ] } }
11
+ * }
12
+ * }
13
+ * ```
14
+ *
15
+ * @module
16
+ */
17
+ import { type Item } from "./types.js";
18
+ /**
19
+ * Read the array of items from the extensions map. Returns an
20
+ * empty array when the extension is absent. Throws when the
21
+ * entry is present but malformed.
22
+ */
23
+ export declare function readFromExtensions(extensions: Record<string, unknown> | undefined): Item[];
24
+ /**
25
+ * Append `newItems` to the existing items list under the
26
+ * `semp.dev/large-attachment` extension. Returns a NEW extensions
27
+ * map (input not mutated). Use when the caller may already have
28
+ * other items in the list.
29
+ */
30
+ export declare function appendToExtensions(extensions: Record<string, unknown> | undefined, newItems: Item[]): Record<string, unknown>;
31
+ /**
32
+ * Replace the entire items list under the
33
+ * `semp.dev/large-attachment` extension. Returns a NEW extensions
34
+ * map (input not mutated). When `items` is empty, removes the
35
+ * extension entirely.
36
+ */
37
+ export declare function setOnExtensions(extensions: Record<string, unknown> | undefined, items: Item[]): Record<string, unknown>;
38
+ /**
39
+ * Remove the `semp.dev/large-attachment` extension entry, if any.
40
+ * Returns a NEW extensions map (input not mutated).
41
+ */
42
+ export declare function removeFromExtensions(extensions: Record<string, unknown> | undefined): Record<string, unknown>;
43
+ /**
44
+ * Look up an item by its `id`. Returns the item or `null` when not
45
+ * found. Throws if the extension entry is structurally malformed.
46
+ */
47
+ export declare function findById(extensions: Record<string, unknown> | undefined, id: string): Item | null;
48
+ //# sourceMappingURL=enclosure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enclosure.d.ts","sourceRoot":"","sources":["../../src/largeattachment/enclosure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAsB,KAAK,IAAI,EAAgB,MAAM,YAAY,CAAC;AAEzE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC9C,IAAI,EAAE,CAiCR;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC/C,QAAQ,EAAE,IAAI,EAAE,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGzB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC/C,KAAK,EAAE,IAAI,EAAE,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC9C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIzB;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC/C,EAAE,EAAE,MAAM,GACT,IAAI,GAAG,IAAI,CAOb"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Helpers for placing / reading large-attachment items inside an
3
+ * enclosure's `extensions` map per ATTACHMENTS.md §2.1.
4
+ *
5
+ * The wire shape under the enclosure is:
6
+ *
7
+ * ```json
8
+ * {
9
+ * "extensions": {
10
+ * "semp.dev/large-attachment": { "data": { "items": [ ... ] } }
11
+ * }
12
+ * }
13
+ * ```
14
+ *
15
+ * @module
16
+ */
17
+ import { ExtensionKey } from "./types.js";
18
+ /**
19
+ * Read the array of items from the extensions map. Returns an
20
+ * empty array when the extension is absent. Throws when the
21
+ * entry is present but malformed.
22
+ */
23
+ export function readFromExtensions(extensions) {
24
+ if (extensions === undefined) {
25
+ return [];
26
+ }
27
+ const entry = extensions[ExtensionKey];
28
+ if (entry === undefined) {
29
+ return [];
30
+ }
31
+ if (typeof entry !== "object" || entry === null || Array.isArray(entry)) {
32
+ throw new Error(`largeattachment: extensions[${JSON.stringify(ExtensionKey)}] is not an object`);
33
+ }
34
+ const data = entry.data;
35
+ if (data === undefined) {
36
+ return [];
37
+ }
38
+ if (typeof data !== "object" || data === null || Array.isArray(data)) {
39
+ throw new Error("largeattachment: extension data is not an object");
40
+ }
41
+ const items = data.items;
42
+ if (items === undefined) {
43
+ return [];
44
+ }
45
+ if (!Array.isArray(items)) {
46
+ throw new Error("largeattachment: extension data.items is not an array");
47
+ }
48
+ for (let i = 0; i < items.length; i++) {
49
+ if (typeof items[i] !== "object" || items[i] === null || Array.isArray(items[i])) {
50
+ throw new Error(`largeattachment: extension data.items[${i}] is not an object`);
51
+ }
52
+ }
53
+ return items;
54
+ }
55
+ /**
56
+ * Append `newItems` to the existing items list under the
57
+ * `semp.dev/large-attachment` extension. Returns a NEW extensions
58
+ * map (input not mutated). Use when the caller may already have
59
+ * other items in the list.
60
+ */
61
+ export function appendToExtensions(extensions, newItems) {
62
+ const existing = readFromExtensions(extensions);
63
+ return setOnExtensions(extensions, [...existing, ...newItems]);
64
+ }
65
+ /**
66
+ * Replace the entire items list under the
67
+ * `semp.dev/large-attachment` extension. Returns a NEW extensions
68
+ * map (input not mutated). When `items` is empty, removes the
69
+ * extension entirely.
70
+ */
71
+ export function setOnExtensions(extensions, items) {
72
+ const out = { ...(extensions ?? {}) };
73
+ if (items.length === 0) {
74
+ delete out[ExtensionKey];
75
+ return out;
76
+ }
77
+ const data = { items };
78
+ out[ExtensionKey] = { data };
79
+ return out;
80
+ }
81
+ /**
82
+ * Remove the `semp.dev/large-attachment` extension entry, if any.
83
+ * Returns a NEW extensions map (input not mutated).
84
+ */
85
+ export function removeFromExtensions(extensions) {
86
+ const out = { ...(extensions ?? {}) };
87
+ delete out[ExtensionKey];
88
+ return out;
89
+ }
90
+ /**
91
+ * Look up an item by its `id`. Returns the item or `null` when not
92
+ * found. Throws if the extension entry is structurally malformed.
93
+ */
94
+ export function findById(extensions, id) {
95
+ for (const item of readFromExtensions(extensions)) {
96
+ if (item.id === id) {
97
+ return item;
98
+ }
99
+ }
100
+ return null;
101
+ }
102
+ //# sourceMappingURL=enclosure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enclosure.js","sourceRoot":"","sources":["../../src/largeattachment/enclosure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Large attachments per ATTACHMENTS.md.
3
+ *
4
+ * Sender-side encrypt + recipient-side decrypt flow, per-attachment
5
+ * key derivation, AAD construction, ciphertext-hash binding,
6
+ * extension-map helpers, plus a reference in-memory blob store.
7
+ *
8
+ * @module
9
+ */
10
+ export { type ExtensionData, type Item, AEADChaCha20Poly1305, AEADXChaCha20Poly1305, ExtensionKey, HKDFInfoPrefix, HashAlgorithmSHA256, } from "./types.js";
11
+ export { additionalData, ciphertextHash, deriveAttachmentKey, validateItem, validateUrl, verifyCiphertextHash, } from "./crypto.js";
12
+ export { type AttachmentSuite, type EncryptAttachmentInput, type EncryptAttachmentResult, CiphertextHashMismatchError, decryptAttachment, encryptAttachment, } from "./upload.js";
13
+ export { appendToExtensions, findById, readFromExtensions, removeFromExtensions, setOnExtensions, } from "./enclosure.js";
14
+ export { type AttachmentStore, InMemoryAttachmentStore, } from "./store.js";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/largeattachment/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,IAAI,EACT,oBAAoB,EACpB,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACd,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACX,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,2BAA2B,EAC3B,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,QAAQ,EACR,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,KAAK,eAAe,EACpB,uBAAuB,GACxB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Large attachments per ATTACHMENTS.md.
3
+ *
4
+ * Sender-side encrypt + recipient-side decrypt flow, per-attachment
5
+ * key derivation, AAD construction, ciphertext-hash binding,
6
+ * extension-map helpers, plus a reference in-memory blob store.
7
+ *
8
+ * @module
9
+ */
10
+ export { AEADChaCha20Poly1305, AEADXChaCha20Poly1305, ExtensionKey, HKDFInfoPrefix, HashAlgorithmSHA256, } from "./types.js";
11
+ export { additionalData, ciphertextHash, deriveAttachmentKey, validateItem, validateUrl, verifyCiphertextHash, } from "./crypto.js";
12
+ export { CiphertextHashMismatchError, decryptAttachment, encryptAttachment, } from "./upload.js";
13
+ export { appendToExtensions, findById, readFromExtensions, removeFromExtensions, setOnExtensions, } from "./enclosure.js";
14
+ export { InMemoryAttachmentStore, } from "./store.js";
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/largeattachment/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAGL,oBAAoB,EACpB,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACd,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACX,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EAIL,2BAA2B,EAC3B,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,QAAQ,EACR,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAEL,uBAAuB,GACxB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Operator-side store interface for large-attachment ciphertext
3
+ * blobs per ATTACHMENTS.md §4.2 + §4.3.
4
+ *
5
+ * The store holds the encrypted blobs that envelopes reference by
6
+ * URL. Production deployments wrap S3, GCS, a CDN, etc.; this
7
+ * module ships an in-memory reference for tests + demos.
8
+ *
9
+ * @module
10
+ */
11
+ /**
12
+ * Minimal storage interface: `put` an attachment by id;
13
+ * `get` retrieves the bytes; `stat` returns size + presence; `del`
14
+ * removes.
15
+ */
16
+ export interface AttachmentStore {
17
+ put(id: string, ciphertext: Uint8Array): Promise<void>;
18
+ get(id: string): Promise<Uint8Array | null>;
19
+ stat(id: string): Promise<{
20
+ size: number;
21
+ present: boolean;
22
+ }>;
23
+ del(id: string): Promise<void>;
24
+ }
25
+ /** Reference in-memory store. Single-process only. */
26
+ export declare class InMemoryAttachmentStore implements AttachmentStore {
27
+ private readonly blobs;
28
+ put(id: string, ciphertext: Uint8Array): Promise<void>;
29
+ get(id: string): Promise<Uint8Array | null>;
30
+ stat(id: string): Promise<{
31
+ size: number;
32
+ present: boolean;
33
+ }>;
34
+ del(id: string): Promise<void>;
35
+ }
36
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/largeattachment/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC9D,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,sDAAsD;AACtD,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IAEjD,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAUtD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAI3C,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAQ7D,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGrC"}